Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
board-cm-t3517.c
Go to the documentation of this file.
1 /*
2  * linux/arch/arm/mach-omap2/board-cm-t3517.c
3  *
4  * Support for the CompuLab CM-T3517 modules
5  *
6  * Copyright (C) 2010 CompuLab, Ltd.
7  * Author: Igor Grinberg <[email protected]>
8  *
9  * This program is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU General Public License
11  * version 2 as published by the Free Software Foundation.
12  *
13  * This program is distributed in the hope that it will be useful, but
14  * WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16  * General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
21  * 02110-1301 USA
22  *
23  */
24 
25 #include <linux/kernel.h>
26 #include <linux/init.h>
27 #include <linux/platform_device.h>
28 #include <linux/delay.h>
29 #include <linux/gpio.h>
30 #include <linux/leds.h>
31 #include <linux/rtc-v3020.h>
32 #include <linux/mtd/mtd.h>
33 #include <linux/mtd/nand.h>
34 #include <linux/mtd/partitions.h>
36 
37 #include <asm/mach-types.h>
38 #include <asm/mach/arch.h>
39 #include <asm/mach/map.h>
40 
41 #include "common.h"
42 #include <plat/usb.h>
44 #include <plat/gpmc.h>
45 
46 #include "am35xx.h"
47 
48 #include "mux.h"
49 #include "control.h"
50 #include "common-board-devices.h"
51 #include "am35xx-emac.h"
52 
53 #if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE)
54 static struct gpio_led cm_t3517_leds[] = {
55  [0] = {
56  .gpio = 186,
57  .name = "cm-t3517:green",
58  .default_trigger = "heartbeat",
59  .active_low = 0,
60  },
61 };
62 
63 static struct gpio_led_platform_data cm_t3517_led_pdata = {
64  .num_leds = ARRAY_SIZE(cm_t3517_leds),
65  .leds = cm_t3517_leds,
66 };
67 
68 static struct platform_device cm_t3517_led_device = {
69  .name = "leds-gpio",
70  .id = -1,
71  .dev = {
72  .platform_data = &cm_t3517_led_pdata,
73  },
74 };
75 
76 static void __init cm_t3517_init_leds(void)
77 {
78  platform_device_register(&cm_t3517_led_device);
79 }
80 #else
81 static inline void cm_t3517_init_leds(void) {}
82 #endif
83 
84 #if defined(CONFIG_CAN_TI_HECC) || defined(CONFIG_CAN_TI_HECC_MODULE)
85 static struct resource cm_t3517_hecc_resources[] = {
86  {
88  .end = AM35XX_IPSS_HECC_BASE + SZ_16K - 1,
89  .flags = IORESOURCE_MEM,
90  },
91  {
92  .start = 24 + OMAP_INTC_START,
93  .flags = IORESOURCE_IRQ,
94  },
95 };
96 
97 static struct ti_hecc_platform_data cm_t3517_hecc_pdata = {
99  .scc_ram_offset = AM35XX_HECC_SCC_RAM_OFFSET,
100  .hecc_ram_offset = AM35XX_HECC_RAM_OFFSET,
101  .mbx_offset = AM35XX_HECC_MBOX_OFFSET,
102  .int_line = AM35XX_HECC_INT_LINE,
103  .version = AM35XX_HECC_VERSION,
104 };
105 
106 static struct platform_device cm_t3517_hecc_device = {
107  .name = "ti_hecc",
108  .id = 1,
109  .num_resources = ARRAY_SIZE(cm_t3517_hecc_resources),
110  .resource = cm_t3517_hecc_resources,
111  .dev = {
112  .platform_data = &cm_t3517_hecc_pdata,
113  },
114 };
115 
116 static void cm_t3517_init_hecc(void)
117 {
118  platform_device_register(&cm_t3517_hecc_device);
119 }
120 #else
121 static inline void cm_t3517_init_hecc(void) {}
122 #endif
123 
124 #if defined(CONFIG_RTC_DRV_V3020) || defined(CONFIG_RTC_DRV_V3020_MODULE)
125 #define RTC_IO_GPIO (153)
126 #define RTC_WR_GPIO (154)
127 #define RTC_RD_GPIO (53)
128 #define RTC_CS_GPIO (163)
129 #define RTC_CS_EN_GPIO (160)
130 
131 struct v3020_platform_data cm_t3517_v3020_pdata = {
132  .use_gpio = 1,
133  .gpio_cs = RTC_CS_GPIO,
134  .gpio_wr = RTC_WR_GPIO,
135  .gpio_rd = RTC_RD_GPIO,
136  .gpio_io = RTC_IO_GPIO,
137 };
138 
139 static struct platform_device cm_t3517_rtc_device = {
140  .name = "v3020",
141  .id = -1,
142  .dev = {
143  .platform_data = &cm_t3517_v3020_pdata,
144  }
145 };
146 
147 static void __init cm_t3517_init_rtc(void)
148 {
149  int err;
150 
151  err = gpio_request_one(RTC_CS_EN_GPIO, GPIOF_OUT_INIT_HIGH,
152  "rtc cs en");
153  if (err) {
154  pr_err("CM-T3517: rtc cs en gpio request failed: %d\n", err);
155  return;
156  }
157 
158  platform_device_register(&cm_t3517_rtc_device);
159 }
160 #else
161 static inline void cm_t3517_init_rtc(void) {}
162 #endif
163 
164 #if defined(CONFIG_USB_EHCI_HCD) || defined(CONFIG_USB_EHCI_HCD_MODULE)
165 #define HSUSB1_RESET_GPIO (146)
166 #define HSUSB2_RESET_GPIO (147)
167 #define USB_HUB_RESET_GPIO (152)
168 
169 static struct usbhs_omap_board_data cm_t3517_ehci_pdata __initdata = {
170  .port_mode[0] = OMAP_EHCI_PORT_MODE_PHY,
171  .port_mode[1] = OMAP_EHCI_PORT_MODE_PHY,
172  .port_mode[2] = OMAP_USBHS_PORT_MODE_UNUSED,
173 
174  .phy_reset = true,
175  .reset_gpio_port[0] = HSUSB1_RESET_GPIO,
176  .reset_gpio_port[1] = HSUSB2_RESET_GPIO,
177  .reset_gpio_port[2] = -EINVAL,
178 };
179 
180 static int __init cm_t3517_init_usbh(void)
181 {
182  int err;
183 
184  err = gpio_request_one(USB_HUB_RESET_GPIO, GPIOF_OUT_INIT_LOW,
185  "usb hub rst");
186  if (err) {
187  pr_err("CM-T3517: usb hub rst gpio request failed: %d\n", err);
188  } else {
189  udelay(10);
190  gpio_set_value(USB_HUB_RESET_GPIO, 1);
191  msleep(1);
192  }
193 
194  usbhs_init(&cm_t3517_ehci_pdata);
195 
196  return 0;
197 }
198 #else
199 static inline int cm_t3517_init_usbh(void)
200 {
201  return 0;
202 }
203 #endif
204 
205 #if defined(CONFIG_MTD_NAND_OMAP2) || defined(CONFIG_MTD_NAND_OMAP2_MODULE)
206 static struct mtd_partition cm_t3517_nand_partitions[] = {
207  {
208  .name = "xloader",
209  .offset = 0, /* Offset = 0x00000 */
210  .size = 4 * NAND_BLOCK_SIZE,
211  .mask_flags = MTD_WRITEABLE
212  },
213  {
214  .name = "uboot",
215  .offset = MTDPART_OFS_APPEND, /* Offset = 0x80000 */
216  .size = 15 * NAND_BLOCK_SIZE,
217  },
218  {
219  .name = "uboot environment",
220  .offset = MTDPART_OFS_APPEND, /* Offset = 0x260000 */
221  .size = 2 * NAND_BLOCK_SIZE,
222  },
223  {
224  .name = "linux",
225  .offset = MTDPART_OFS_APPEND, /* Offset = 0x2A0000 */
226  .size = 32 * NAND_BLOCK_SIZE,
227  },
228  {
229  .name = "rootfs",
230  .offset = MTDPART_OFS_APPEND, /* Offset = 0x6A0000 */
231  .size = MTDPART_SIZ_FULL,
232  },
233 };
234 
235 static struct omap_nand_platform_data cm_t3517_nand_data = {
236  .parts = cm_t3517_nand_partitions,
237  .nr_parts = ARRAY_SIZE(cm_t3517_nand_partitions),
238  .cs = 0,
239 };
240 
241 static void __init cm_t3517_init_nand(void)
242 {
243  if (gpmc_nand_init(&cm_t3517_nand_data) < 0)
244  pr_err("CM-T3517: NAND initialization failed\n");
245 }
246 #else
247 static inline void cm_t3517_init_nand(void) {}
248 #endif
249 
250 #ifdef CONFIG_OMAP_MUX
251 static struct omap_board_mux board_mux[] __initdata = {
252  /* GPIO186 - Green LED */
253  OMAP3_MUX(SYS_CLKOUT2, OMAP_MUX_MODE4 | OMAP_PIN_OUTPUT),
254 
255  /* RTC GPIOs: */
256  /* IO - GPIO153 */
258  /* WR# - GPIO154 */
260  /* RD# - GPIO53 */
262  /* CS# - GPIO163 */
263  OMAP3_MUX(UART3_CTS_RCTX, OMAP_MUX_MODE4 | OMAP_PIN_INPUT),
264  /* CS EN - GPIO160 */
266 
267  /* HSUSB1 RESET */
269  /* HSUSB2 RESET */
271  /* CM-T3517 USB HUB nRESET */
272  OMAP3_MUX(MCBSP4_CLKX, OMAP_MUX_MODE4 | OMAP_PIN_OUTPUT),
273 
274  { .reg_offset = OMAP_MUX_TERMINATOR },
275 };
276 #endif
277 
278 static void __init cm_t3517_init(void)
279 {
283  cm_t3517_init_leds();
284  cm_t3517_init_nand();
285  cm_t3517_init_rtc();
286  cm_t3517_init_usbh();
287  cm_t3517_init_hecc();
289 }
290 
291 MACHINE_START(CM_T3517, "Compulab CM-T3517")
292  .atag_offset = 0x100,
293  .reserve = omap_reserve,
294  .map_io = omap3_map_io,
295  .init_early = am35xx_init_early,
296  .init_irq = omap3_init_irq,
297  .handle_irq = omap3_intc_handle_irq,
298  .init_machine = cm_t3517_init,
299  .init_late = am35xx_init_late,
300  .timer = &omap3_timer,
301  .restart = omap_prcm_restart,