Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
board-am3517evm.c
Go to the documentation of this file.
1 /*
2  * linux/arch/arm/mach-omap2/board-am3517evm.c
3  *
4  * Copyright (C) 2009 Texas Instruments Incorporated
5  * Author: Ranjith Lohithakshan <[email protected]>
6  *
7  * Based on mach-omap2/board-omap3evm.c
8  *
9  * This program is free software; you can redistribute it and/or modify it
10  * under the terms of the GNU General Public License as published by the
11  * Free Software Foundation version 2.
12  *
13  * This program is distributed "as is" WITHOUT ANY WARRANTY of any kind,
14  * whether express or implied; 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 
19 #include <linux/kernel.h>
20 #include <linux/init.h>
21 #include <linux/clk.h>
22 #include <linux/platform_device.h>
23 #include <linux/gpio.h>
24 #include <linux/i2c/pca953x.h>
26 #include <linux/davinci_emac.h>
27 #include <linux/mmc/host.h>
29 
30 #include "am35xx.h"
31 #include <asm/mach-types.h>
32 #include <asm/mach/arch.h>
33 #include <asm/mach/map.h>
34 
35 #include "common.h"
36 #include <plat/usb.h>
37 #include <video/omapdss.h>
40 
41 #include "am35xx-emac.h"
42 #include "mux.h"
43 #include "control.h"
44 #include "hsmmc.h"
45 
46 #define LCD_PANEL_PWR 176
47 #define LCD_PANEL_BKLIGHT_PWR 182
48 #define LCD_PANEL_PWM 181
49 
50 static struct i2c_board_info __initdata am3517evm_i2c1_boardinfo[] = {
51  {
52  I2C_BOARD_INFO("s35390a", 0x30),
53  },
54 };
55 
56 /*
57  * RTC - S35390A
58  */
59 #define GPIO_RTCS35390A_IRQ 55
60 
61 static void __init am3517_evm_rtc_init(void)
62 {
63  int r;
64 
65  omap_mux_init_gpio(GPIO_RTCS35390A_IRQ, OMAP_PIN_INPUT_PULLUP);
66 
67  r = gpio_request_one(GPIO_RTCS35390A_IRQ, GPIOF_IN, "rtcs35390a-irq");
68  if (r < 0) {
69  printk(KERN_WARNING "failed to request GPIO#%d\n",
71  return;
72  }
73 
74  am3517evm_i2c1_boardinfo[0].irq = gpio_to_irq(GPIO_RTCS35390A_IRQ);
75 }
76 
77 /*
78  * I2C GPIO Expander - TCA6416
79  */
80 
81 /* Mounted on Base-Board */
82 static struct pca953x_platform_data am3517evm_gpio_expander_info_0 = {
83  .gpio_base = OMAP_MAX_GPIO_LINES,
84 };
85 static struct i2c_board_info __initdata am3517evm_i2c2_boardinfo[] = {
86  {
87  I2C_BOARD_INFO("tlv320aic23", 0x1A),
88  },
89  {
90  I2C_BOARD_INFO("tca6416", 0x21),
91  .platform_data = &am3517evm_gpio_expander_info_0,
92  },
93 };
94 
95 /* Mounted on UI Card */
96 static struct pca953x_platform_data am3517evm_ui_gpio_expander_info_1 = {
97  .gpio_base = OMAP_MAX_GPIO_LINES + 16,
98 };
99 static struct pca953x_platform_data am3517evm_ui_gpio_expander_info_2 = {
100  .gpio_base = OMAP_MAX_GPIO_LINES + 32,
101 };
102 static struct i2c_board_info __initdata am3517evm_i2c3_boardinfo[] = {
103  {
104  I2C_BOARD_INFO("tca6416", 0x20),
105  .platform_data = &am3517evm_ui_gpio_expander_info_1,
106  },
107  {
108  I2C_BOARD_INFO("tca6416", 0x21),
109  .platform_data = &am3517evm_ui_gpio_expander_info_2,
110  },
111 };
112 
113 static int __init am3517_evm_i2c_init(void)
114 {
115  omap_register_i2c_bus(1, 400, NULL, 0);
116  omap_register_i2c_bus(2, 400, am3517evm_i2c2_boardinfo,
117  ARRAY_SIZE(am3517evm_i2c2_boardinfo));
118  omap_register_i2c_bus(3, 400, am3517evm_i2c3_boardinfo,
119  ARRAY_SIZE(am3517evm_i2c3_boardinfo));
120 
121  return 0;
122 }
123 
124 static int lcd_enabled;
125 static int dvi_enabled;
126 
127 #if defined(CONFIG_PANEL_SHARP_LQ043T1DG01) || \
128  defined(CONFIG_PANEL_SHARP_LQ043T1DG01_MODULE)
129 static struct gpio am3517_evm_dss_gpios[] __initdata = {
130  /* GPIO 182 = LCD Backlight Power */
131  { LCD_PANEL_BKLIGHT_PWR, GPIOF_OUT_INIT_HIGH, "lcd_backlight_pwr" },
132  /* GPIO 181 = LCD Panel PWM */
133  { LCD_PANEL_PWM, GPIOF_OUT_INIT_HIGH, "lcd bl enable" },
134  /* GPIO 176 = LCD Panel Power enable pin */
135  { LCD_PANEL_PWR, GPIOF_OUT_INIT_HIGH, "dvi enable" },
136 };
137 
138 static void __init am3517_evm_display_init(void)
139 {
140  int r;
141 
142  omap_mux_init_gpio(LCD_PANEL_PWR, OMAP_PIN_INPUT_PULLUP);
143  omap_mux_init_gpio(LCD_PANEL_BKLIGHT_PWR, OMAP_PIN_INPUT_PULLDOWN);
144  omap_mux_init_gpio(LCD_PANEL_PWM, OMAP_PIN_INPUT_PULLDOWN);
145 
146  r = gpio_request_array(am3517_evm_dss_gpios,
147  ARRAY_SIZE(am3517_evm_dss_gpios));
148  if (r) {
149  printk(KERN_ERR "failed to get DSS panel control GPIOs\n");
150  return;
151  }
152 
153  printk(KERN_INFO "Display initialized successfully\n");
154 }
155 #else
156 static void __init am3517_evm_display_init(void) {}
157 #endif
158 
159 static int am3517_evm_panel_enable_lcd(struct omap_dss_device *dssdev)
160 {
161  if (dvi_enabled) {
162  printk(KERN_ERR "cannot enable LCD, DVI is enabled\n");
163  return -EINVAL;
164  }
166  lcd_enabled = 1;
167 
168  return 0;
169 }
170 
171 static void am3517_evm_panel_disable_lcd(struct omap_dss_device *dssdev)
172 {
174  lcd_enabled = 0;
175 }
176 
177 static struct panel_generic_dpi_data lcd_panel = {
178  .name = "sharp_lq",
179  .platform_enable = am3517_evm_panel_enable_lcd,
180  .platform_disable = am3517_evm_panel_disable_lcd,
181 };
182 
183 static struct omap_dss_device am3517_evm_lcd_device = {
184  .type = OMAP_DISPLAY_TYPE_DPI,
185  .name = "lcd",
186  .driver_name = "generic_dpi_panel",
187  .data = &lcd_panel,
188  .phy.dpi.data_lines = 16,
189 };
190 
191 static int am3517_evm_panel_enable_tv(struct omap_dss_device *dssdev)
192 {
193  return 0;
194 }
195 
196 static void am3517_evm_panel_disable_tv(struct omap_dss_device *dssdev)
197 {
198 }
199 
200 static struct omap_dss_device am3517_evm_tv_device = {
201  .type = OMAP_DISPLAY_TYPE_VENC,
202  .name = "tv",
203  .driver_name = "venc",
204  .phy.venc.type = OMAP_DSS_VENC_TYPE_SVIDEO,
205  .platform_enable = am3517_evm_panel_enable_tv,
206  .platform_disable = am3517_evm_panel_disable_tv,
207 };
208 
209 static struct tfp410_platform_data dvi_panel = {
210  .power_down_gpio = -1,
211 };
212 
213 static struct omap_dss_device am3517_evm_dvi_device = {
214  .type = OMAP_DISPLAY_TYPE_DPI,
215  .name = "dvi",
216  .driver_name = "tfp410",
217  .data = &dvi_panel,
218  .phy.dpi.data_lines = 24,
219 };
220 
221 static struct omap_dss_device *am3517_evm_dss_devices[] = {
222  &am3517_evm_lcd_device,
223  &am3517_evm_tv_device,
224  &am3517_evm_dvi_device,
225 };
226 
227 static struct omap_dss_board_info am3517_evm_dss_data = {
228  .num_devices = ARRAY_SIZE(am3517_evm_dss_devices),
229  .devices = am3517_evm_dss_devices,
230  .default_device = &am3517_evm_lcd_device,
231 };
232 
233 /*
234  * Board initialization
235  */
236 
237 static struct omap_musb_board_data musb_board_data = {
238  .interface_type = MUSB_INTERFACE_ULPI,
239  .mode = MUSB_OTG,
240  .power = 500,
241  .set_phy_power = am35x_musb_phy_power,
242  .clear_irq = am35x_musb_clear_irq,
243  .set_mode = am35x_set_mode,
244  .reset = am35x_musb_reset,
245 };
246 
247 static __init void am3517_evm_musb_init(void)
248 {
249  u32 devconf2;
250 
251  /*
252  * Set up USB clock/mode in the DEVCONF2 register.
253  */
255 
256  /* USB2.0 PHY reference clock is 13 MHz */
259  | CONF2_DATPOL;
260 
262 
263  usb_musb_init(&musb_board_data);
264 }
265 
266 static __init void am3517_evm_mcbsp1_init(void)
267 {
268  u32 devconf0;
269 
270  /* McBSP1 CLKR/FSR signal to be connected to CLKX/FSX pin */
274 }
275 
276 static const struct usbhs_omap_board_data usbhs_bdata __initconst = {
277  .port_mode[0] = OMAP_EHCI_PORT_MODE_PHY,
278 #if defined(CONFIG_PANEL_SHARP_LQ043T1DG01) || \
279  defined(CONFIG_PANEL_SHARP_LQ043T1DG01_MODULE)
280  .port_mode[1] = OMAP_USBHS_PORT_MODE_UNUSED,
281 #else
282  .port_mode[1] = OMAP_EHCI_PORT_MODE_PHY,
283 #endif
284  .port_mode[2] = OMAP_USBHS_PORT_MODE_UNUSED,
285 
286  .phy_reset = true,
287  .reset_gpio_port[0] = 57,
288  .reset_gpio_port[1] = -EINVAL,
289  .reset_gpio_port[2] = -EINVAL
290 };
291 
292 #ifdef CONFIG_OMAP_MUX
293 static struct omap_board_mux board_mux[] __initdata = {
294  /* USB OTG DRVVBUS offset = 0x212 */
296  { .reg_offset = OMAP_MUX_TERMINATOR },
297 };
298 #endif
299 
300 
301 static struct resource am3517_hecc_resources[] = {
302  {
303  .start = AM35XX_IPSS_HECC_BASE,
304  .end = AM35XX_IPSS_HECC_BASE + 0x3FFF,
305  .flags = IORESOURCE_MEM,
306  },
307  {
308  .start = 24 + OMAP_INTC_START,
309  .flags = IORESOURCE_IRQ,
310  },
311 };
312 
313 static struct platform_device am3517_hecc_device = {
314  .name = "ti_hecc",
315  .id = -1,
316  .num_resources = ARRAY_SIZE(am3517_hecc_resources),
317  .resource = am3517_hecc_resources,
318 };
319 
320 static struct ti_hecc_platform_data am3517_evm_hecc_pdata = {
321  .scc_hecc_offset = AM35XX_HECC_SCC_HECC_OFFSET,
322  .scc_ram_offset = AM35XX_HECC_SCC_RAM_OFFSET,
323  .hecc_ram_offset = AM35XX_HECC_RAM_OFFSET,
324  .mbx_offset = AM35XX_HECC_MBOX_OFFSET,
325  .int_line = AM35XX_HECC_INT_LINE,
326  .version = AM35XX_HECC_VERSION,
327 };
328 
329 static void am3517_evm_hecc_init(struct ti_hecc_platform_data *pdata)
330 {
331  am3517_hecc_device.dev.platform_data = pdata;
332  platform_device_register(&am3517_hecc_device);
333 }
334 
335 static struct omap2_hsmmc_info mmc[] = {
336  {
337  .mmc = 1,
338  .caps = MMC_CAP_4_BIT_DATA,
339  .gpio_cd = 127,
340  .gpio_wp = 126,
341  },
342  {
343  .mmc = 2,
344  .caps = MMC_CAP_4_BIT_DATA,
345  .gpio_cd = 128,
346  .gpio_wp = 129,
347  },
348  {} /* Terminator */
349 };
350 
351 
352 static void __init am3517_evm_init(void)
353 {
355 
356  am3517_evm_i2c_init();
357  omap_display_init(&am3517_evm_dss_data);
360 
361  /* Configure GPIO for EHCI port */
362  omap_mux_init_gpio(57, OMAP_PIN_OUTPUT);
363  usbhs_init(&usbhs_bdata);
364  am3517_evm_hecc_init(&am3517_evm_hecc_pdata);
365  /* DSS */
366  am3517_evm_display_init();
367 
368  /* RTC - S35390A */
369  am3517_evm_rtc_init();
370 
371  i2c_register_board_info(1, am3517evm_i2c1_boardinfo,
372  ARRAY_SIZE(am3517evm_i2c1_boardinfo));
373  /*Ethernet*/
375 
376  /* MUSB */
377  am3517_evm_musb_init();
378 
379  /* McBSP1 */
380  am3517_evm_mcbsp1_init();
381 
382  /* MMC init function */
383  omap_hsmmc_init(mmc);
384 }
385 
386 MACHINE_START(OMAP3517EVM, "OMAP3517/AM3517 EVM")
387  .atag_offset = 0x100,
388  .reserve = omap_reserve,
389  .map_io = omap3_map_io,
390  .init_early = am35xx_init_early,
391  .init_irq = omap3_init_irq,
392  .handle_irq = omap3_intc_handle_irq,
393  .init_machine = am3517_evm_init,
394  .init_late = am35xx_init_late,
395  .timer = &omap3_timer,
396  .restart = omap_prcm_restart,