1/* 2 * Copyright (C) 2009 Texas Instruments Inc. 3 * Mikkel Christensen <mlc@ti.com> 4 * 5 * This program is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License version 2 as 7 * published by the Free Software Foundation. 8 */ 9 10#include <linux/kernel.h> 11#include <linux/init.h> 12#include <linux/gpio.h> 13#include <linux/serial_8250.h> 14#include <linux/smsc911x.h> 15#include <linux/interrupt.h> 16 17#include <linux/regulator/fixed.h> 18#include <linux/regulator/machine.h> 19 20#include <plat/gpmc.h> 21#include <plat/gpmc-smsc911x.h> 22 23#include <mach/board-zoom.h> 24 25#define ZOOM_SMSC911X_CS 7 26#define ZOOM_SMSC911X_GPIO 158 27#define ZOOM_QUADUART_CS 3 28#define ZOOM_QUADUART_GPIO 102 29#define ZOOM_QUADUART_RST_GPIO 152 30#define QUART_CLK 1843200 31#define DEBUG_BASE 0x08000000 32#define ZOOM_ETHR_START DEBUG_BASE 33 34static struct omap_smsc911x_platform_data zoom_smsc911x_cfg = { 35 .cs = ZOOM_SMSC911X_CS, 36 .gpio_irq = ZOOM_SMSC911X_GPIO, 37 .gpio_reset = -EINVAL, 38 .flags = SMSC911X_USE_32BIT, 39}; 40 41static inline void __init zoom_init_smsc911x(void) 42{ 43 gpmc_smsc911x_init(&zoom_smsc911x_cfg); 44} 45 46static struct plat_serial8250_port serial_platform_data[] = { 47 { 48 .mapbase = ZOOM_UART_BASE, 49 .flags = UPF_BOOT_AUTOCONF|UPF_IOREMAP|UPF_SHARE_IRQ, 50 .irqflags = IRQF_SHARED | IRQF_TRIGGER_RISING, 51 .iotype = UPIO_MEM, 52 .regshift = 1, 53 .uartclk = QUART_CLK, 54 }, { 55 .flags = 0 56 } 57}; 58 59static struct platform_device zoom_debugboard_serial_device = { 60 .name = "serial8250", 61 .id = PLAT8250_DEV_PLATFORM, 62 .dev = { 63 .platform_data = serial_platform_data, 64 }, 65}; 66 67static inline void __init zoom_init_quaduart(void) 68{ 69 int quart_cs; 70 unsigned long cs_mem_base; 71 int quart_gpio = 0; 72 73 if (gpio_request_one(ZOOM_QUADUART_RST_GPIO, 74 GPIOF_OUT_INIT_LOW, 75 "TL16CP754C GPIO") < 0) { 76 pr_err("Failed to request GPIO%d for TL16CP754C\n", 77 ZOOM_QUADUART_RST_GPIO); 78 return; 79 } 80 81 quart_cs = ZOOM_QUADUART_CS; 82 83 if (gpmc_cs_request(quart_cs, SZ_1M, &cs_mem_base) < 0) { 84 printk(KERN_ERR "Failed to request GPMC mem" 85 "for Quad UART(TL16CP754C)\n"); 86 return; 87 } 88 89 quart_gpio = ZOOM_QUADUART_GPIO; 90 91 if (gpio_request_one(quart_gpio, GPIOF_IN, "TL16CP754C GPIO") < 0) 92 printk(KERN_ERR "Failed to request GPIO%d for TL16CP754C\n", 93 quart_gpio); 94 95 serial_platform_data[0].irq = gpio_to_irq(102); 96} 97 98static inline int omap_zoom_debugboard_detect(void) 99{ 100 int debug_board_detect = 0; 101 int ret = 1; 102 103 debug_board_detect = ZOOM_SMSC911X_GPIO; 104 105 if (gpio_request_one(debug_board_detect, GPIOF_IN, 106 "Zoom debug board detect") < 0) { 107 printk(KERN_ERR "Failed to request GPIO%d for Zoom debug" 108 "board detect\n", debug_board_detect); 109 return 0; 110 } 111 112 if (!gpio_get_value(debug_board_detect)) { 113 ret = 0; 114 } 115 gpio_free(debug_board_detect); 116 return ret; 117} 118 119static struct platform_device *zoom_devices[] __initdata = { 120 &zoom_debugboard_serial_device, 121}; 122 123static struct regulator_consumer_supply dummy_supplies[] = { 124 REGULATOR_SUPPLY("vddvario", "smsc911x.0"), 125 REGULATOR_SUPPLY("vdd33a", "smsc911x.0"), 126}; 127 128int __init zoom_debugboard_init(void) 129{ 130 if (!omap_zoom_debugboard_detect()) 131 return 0; 132 133 regulator_register_fixed(0, dummy_supplies, ARRAY_SIZE(dummy_supplies)); 134 zoom_init_smsc911x(); 135 zoom_init_quaduart(); 136 return platform_add_devices(zoom_devices, ARRAY_SIZE(zoom_devices)); 137} 138