Merge branch 'viafb-next' of git://github.com/schandinat/linux-2.6 into fbdev-fixes...
[pandora-kernel.git] / arch / arm / mach-omap2 / board-am3517evm.c
1 /*
2  * linux/arch/arm/mach-omap2/board-am3517evm.c
3  *
4  * Copyright (C) 2009 Texas Instruments Incorporated
5  * Author: Ranjith Lohithakshan <ranjithl@ti.com>
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>
25 #include <linux/can/platform/ti_hecc.h>
26 #include <linux/davinci_emac.h>
27
28 #include <mach/hardware.h>
29 #include <mach/am35xx.h>
30 #include <asm/mach-types.h>
31 #include <asm/mach/arch.h>
32 #include <asm/mach/map.h>
33
34 #include <plat/board.h>
35 #include <plat/common.h>
36 #include <plat/usb.h>
37 #include <plat/display.h>
38 #include <plat/panel-generic-dpi.h>
39
40 #include "mux.h"
41 #include "control.h"
42
43 #define AM35XX_EVM_MDIO_FREQUENCY       (1000000)
44
45 static struct mdio_platform_data am3517_evm_mdio_pdata = {
46         .bus_freq       = AM35XX_EVM_MDIO_FREQUENCY,
47 };
48
49 static struct resource am3517_mdio_resources[] = {
50         {
51                 .start  = AM35XX_IPSS_EMAC_BASE + AM35XX_EMAC_MDIO_OFFSET,
52                 .end    = AM35XX_IPSS_EMAC_BASE + AM35XX_EMAC_MDIO_OFFSET +
53                           SZ_4K - 1,
54                 .flags  = IORESOURCE_MEM,
55         },
56 };
57
58 static struct platform_device am3517_mdio_device = {
59         .name           = "davinci_mdio",
60         .id             = 0,
61         .num_resources  = ARRAY_SIZE(am3517_mdio_resources),
62         .resource       = am3517_mdio_resources,
63         .dev.platform_data = &am3517_evm_mdio_pdata,
64 };
65
66 static struct emac_platform_data am3517_evm_emac_pdata = {
67         .rmii_en        = 1,
68 };
69
70 static struct resource am3517_emac_resources[] = {
71         {
72                 .start  = AM35XX_IPSS_EMAC_BASE,
73                 .end    = AM35XX_IPSS_EMAC_BASE + 0x2FFFF,
74                 .flags  = IORESOURCE_MEM,
75         },
76         {
77                 .start  = INT_35XX_EMAC_C0_RXTHRESH_IRQ,
78                 .end    = INT_35XX_EMAC_C0_RXTHRESH_IRQ,
79                 .flags  = IORESOURCE_IRQ,
80         },
81         {
82                 .start  = INT_35XX_EMAC_C0_RX_PULSE_IRQ,
83                 .end    = INT_35XX_EMAC_C0_RX_PULSE_IRQ,
84                 .flags  = IORESOURCE_IRQ,
85         },
86         {
87                 .start  = INT_35XX_EMAC_C0_TX_PULSE_IRQ,
88                 .end    = INT_35XX_EMAC_C0_TX_PULSE_IRQ,
89                 .flags  = IORESOURCE_IRQ,
90         },
91         {
92                 .start  = INT_35XX_EMAC_C0_MISC_PULSE_IRQ,
93                 .end    = INT_35XX_EMAC_C0_MISC_PULSE_IRQ,
94                 .flags  = IORESOURCE_IRQ,
95         },
96 };
97
98 static struct platform_device am3517_emac_device = {
99         .name           = "davinci_emac",
100         .id             = -1,
101         .num_resources  = ARRAY_SIZE(am3517_emac_resources),
102         .resource       = am3517_emac_resources,
103 };
104
105 static void am3517_enable_ethernet_int(void)
106 {
107         u32 regval;
108
109         regval = omap_ctrl_readl(AM35XX_CONTROL_LVL_INTR_CLEAR);
110         regval = (regval | AM35XX_CPGMAC_C0_RX_PULSE_CLR |
111                 AM35XX_CPGMAC_C0_TX_PULSE_CLR |
112                 AM35XX_CPGMAC_C0_MISC_PULSE_CLR |
113                 AM35XX_CPGMAC_C0_RX_THRESH_CLR);
114         omap_ctrl_writel(regval, AM35XX_CONTROL_LVL_INTR_CLEAR);
115         regval = omap_ctrl_readl(AM35XX_CONTROL_LVL_INTR_CLEAR);
116 }
117
118 static void am3517_disable_ethernet_int(void)
119 {
120         u32 regval;
121
122         regval = omap_ctrl_readl(AM35XX_CONTROL_LVL_INTR_CLEAR);
123         regval = (regval | AM35XX_CPGMAC_C0_RX_PULSE_CLR |
124                 AM35XX_CPGMAC_C0_TX_PULSE_CLR);
125         omap_ctrl_writel(regval, AM35XX_CONTROL_LVL_INTR_CLEAR);
126         regval = omap_ctrl_readl(AM35XX_CONTROL_LVL_INTR_CLEAR);
127 }
128
129 static void am3517_evm_ethernet_init(struct emac_platform_data *pdata)
130 {
131         unsigned int regval;
132
133         pdata->ctrl_reg_offset          = AM35XX_EMAC_CNTRL_OFFSET;
134         pdata->ctrl_mod_reg_offset      = AM35XX_EMAC_CNTRL_MOD_OFFSET;
135         pdata->ctrl_ram_offset          = AM35XX_EMAC_CNTRL_RAM_OFFSET;
136         pdata->ctrl_ram_size            = AM35XX_EMAC_CNTRL_RAM_SIZE;
137         pdata->version                  = EMAC_VERSION_2;
138         pdata->hw_ram_addr              = AM35XX_EMAC_HW_RAM_ADDR;
139         pdata->interrupt_enable         = am3517_enable_ethernet_int;
140         pdata->interrupt_disable        = am3517_disable_ethernet_int;
141         am3517_emac_device.dev.platform_data    = pdata;
142         platform_device_register(&am3517_emac_device);
143         platform_device_register(&am3517_mdio_device);
144         clk_add_alias(NULL, dev_name(&am3517_mdio_device.dev),
145                       NULL, &am3517_emac_device.dev);
146
147         regval = omap_ctrl_readl(AM35XX_CONTROL_IP_SW_RESET);
148         regval = regval & (~(AM35XX_CPGMACSS_SW_RST));
149         omap_ctrl_writel(regval, AM35XX_CONTROL_IP_SW_RESET);
150         regval = omap_ctrl_readl(AM35XX_CONTROL_IP_SW_RESET);
151
152         return ;
153 }
154
155
156
157 #define LCD_PANEL_PWR           176
158 #define LCD_PANEL_BKLIGHT_PWR   182
159 #define LCD_PANEL_PWM           181
160
161 static struct i2c_board_info __initdata am3517evm_i2c1_boardinfo[] = {
162         {
163                 I2C_BOARD_INFO("s35390a", 0x30),
164         },
165 };
166
167 /*
168  * RTC - S35390A
169  */
170 #define GPIO_RTCS35390A_IRQ     55
171
172 static void __init am3517_evm_rtc_init(void)
173 {
174         int r;
175
176         omap_mux_init_gpio(GPIO_RTCS35390A_IRQ, OMAP_PIN_INPUT_PULLUP);
177         r = gpio_request(GPIO_RTCS35390A_IRQ, "rtcs35390a-irq");
178         if (r < 0) {
179                 printk(KERN_WARNING "failed to request GPIO#%d\n",
180                                 GPIO_RTCS35390A_IRQ);
181                 return;
182         }
183         r = gpio_direction_input(GPIO_RTCS35390A_IRQ);
184         if (r < 0) {
185                 printk(KERN_WARNING "GPIO#%d cannot be configured as input\n",
186                                 GPIO_RTCS35390A_IRQ);
187                 gpio_free(GPIO_RTCS35390A_IRQ);
188                 return;
189         }
190         am3517evm_i2c1_boardinfo[0].irq = gpio_to_irq(GPIO_RTCS35390A_IRQ);
191 }
192
193 /*
194  * I2C GPIO Expander - TCA6416
195  */
196
197 /* Mounted on Base-Board */
198 static struct pca953x_platform_data am3517evm_gpio_expander_info_0 = {
199         .gpio_base      = OMAP_MAX_GPIO_LINES,
200 };
201 static struct i2c_board_info __initdata am3517evm_i2c2_boardinfo[] = {
202         {
203                 I2C_BOARD_INFO("tlv320aic23", 0x1A),
204         },
205         {
206                 I2C_BOARD_INFO("tca6416", 0x21),
207                 .platform_data = &am3517evm_gpio_expander_info_0,
208         },
209 };
210
211 /* Mounted on UI Card */
212 static struct pca953x_platform_data am3517evm_ui_gpio_expander_info_1 = {
213         .gpio_base      = OMAP_MAX_GPIO_LINES + 16,
214 };
215 static struct pca953x_platform_data am3517evm_ui_gpio_expander_info_2 = {
216         .gpio_base      = OMAP_MAX_GPIO_LINES + 32,
217 };
218 static struct i2c_board_info __initdata am3517evm_i2c3_boardinfo[] = {
219         {
220                 I2C_BOARD_INFO("tca6416", 0x20),
221                 .platform_data = &am3517evm_ui_gpio_expander_info_1,
222         },
223         {
224                 I2C_BOARD_INFO("tca6416", 0x21),
225                 .platform_data = &am3517evm_ui_gpio_expander_info_2,
226         },
227 };
228
229 static int __init am3517_evm_i2c_init(void)
230 {
231         omap_register_i2c_bus(1, 400, NULL, 0);
232         omap_register_i2c_bus(2, 400, am3517evm_i2c2_boardinfo,
233                         ARRAY_SIZE(am3517evm_i2c2_boardinfo));
234         omap_register_i2c_bus(3, 400, am3517evm_i2c3_boardinfo,
235                         ARRAY_SIZE(am3517evm_i2c3_boardinfo));
236
237         return 0;
238 }
239
240 static int lcd_enabled;
241 static int dvi_enabled;
242
243 #if defined(CONFIG_PANEL_SHARP_LQ043T1DG01) || \
244                 defined(CONFIG_PANEL_SHARP_LQ043T1DG01_MODULE)
245 static void __init am3517_evm_display_init(void)
246 {
247         int r;
248
249         omap_mux_init_gpio(LCD_PANEL_PWR, OMAP_PIN_INPUT_PULLUP);
250         omap_mux_init_gpio(LCD_PANEL_BKLIGHT_PWR, OMAP_PIN_INPUT_PULLDOWN);
251         omap_mux_init_gpio(LCD_PANEL_PWM, OMAP_PIN_INPUT_PULLDOWN);
252         /*
253          * Enable GPIO 182 = LCD Backlight Power
254          */
255         r = gpio_request(LCD_PANEL_BKLIGHT_PWR, "lcd_backlight_pwr");
256         if (r) {
257                 printk(KERN_ERR "failed to get lcd_backlight_pwr\n");
258                 return;
259         }
260         gpio_direction_output(LCD_PANEL_BKLIGHT_PWR, 1);
261         /*
262          * Enable GPIO 181 = LCD Panel PWM
263          */
264         r = gpio_request(LCD_PANEL_PWM, "lcd_pwm");
265         if (r) {
266                 printk(KERN_ERR "failed to get lcd_pwm\n");
267                 goto err_1;
268         }
269         gpio_direction_output(LCD_PANEL_PWM, 1);
270         /*
271          * Enable GPIO 176 = LCD Panel Power enable pin
272          */
273         r = gpio_request(LCD_PANEL_PWR, "lcd_panel_pwr");
274         if (r) {
275                 printk(KERN_ERR "failed to get lcd_panel_pwr\n");
276                 goto err_2;
277         }
278         gpio_direction_output(LCD_PANEL_PWR, 1);
279
280         printk(KERN_INFO "Display initialized successfully\n");
281         return;
282
283 err_2:
284         gpio_free(LCD_PANEL_PWM);
285 err_1:
286         gpio_free(LCD_PANEL_BKLIGHT_PWR);
287 }
288 #else
289 static void __init am3517_evm_display_init(void) {}
290 #endif
291
292 static int am3517_evm_panel_enable_lcd(struct omap_dss_device *dssdev)
293 {
294         if (dvi_enabled) {
295                 printk(KERN_ERR "cannot enable LCD, DVI is enabled\n");
296                 return -EINVAL;
297         }
298         gpio_set_value(LCD_PANEL_PWR, 1);
299         lcd_enabled = 1;
300
301         return 0;
302 }
303
304 static void am3517_evm_panel_disable_lcd(struct omap_dss_device *dssdev)
305 {
306         gpio_set_value(LCD_PANEL_PWR, 0);
307         lcd_enabled = 0;
308 }
309
310 static struct panel_generic_dpi_data lcd_panel = {
311         .name                   = "sharp_lq",
312         .platform_enable        = am3517_evm_panel_enable_lcd,
313         .platform_disable       = am3517_evm_panel_disable_lcd,
314 };
315
316 static struct omap_dss_device am3517_evm_lcd_device = {
317         .type                   = OMAP_DISPLAY_TYPE_DPI,
318         .name                   = "lcd",
319         .driver_name            = "generic_dpi_panel",
320         .data                   = &lcd_panel,
321         .phy.dpi.data_lines     = 16,
322 };
323
324 static int am3517_evm_panel_enable_tv(struct omap_dss_device *dssdev)
325 {
326         return 0;
327 }
328
329 static void am3517_evm_panel_disable_tv(struct omap_dss_device *dssdev)
330 {
331 }
332
333 static struct omap_dss_device am3517_evm_tv_device = {
334         .type                   = OMAP_DISPLAY_TYPE_VENC,
335         .name                   = "tv",
336         .driver_name            = "venc",
337         .phy.venc.type          = OMAP_DSS_VENC_TYPE_SVIDEO,
338         .platform_enable        = am3517_evm_panel_enable_tv,
339         .platform_disable       = am3517_evm_panel_disable_tv,
340 };
341
342 static int am3517_evm_panel_enable_dvi(struct omap_dss_device *dssdev)
343 {
344         if (lcd_enabled) {
345                 printk(KERN_ERR "cannot enable DVI, LCD is enabled\n");
346                 return -EINVAL;
347         }
348         dvi_enabled = 1;
349
350         return 0;
351 }
352
353 static void am3517_evm_panel_disable_dvi(struct omap_dss_device *dssdev)
354 {
355         dvi_enabled = 0;
356 }
357
358 static struct panel_generic_dpi_data dvi_panel = {
359         .name                   = "generic",
360         .platform_enable        = am3517_evm_panel_enable_dvi,
361         .platform_disable       = am3517_evm_panel_disable_dvi,
362 };
363
364 static struct omap_dss_device am3517_evm_dvi_device = {
365         .type                   = OMAP_DISPLAY_TYPE_DPI,
366         .name                   = "dvi",
367         .driver_name            = "generic_dpi_panel",
368         .data                   = &dvi_panel,
369         .phy.dpi.data_lines     = 24,
370 };
371
372 static struct omap_dss_device *am3517_evm_dss_devices[] = {
373         &am3517_evm_lcd_device,
374         &am3517_evm_tv_device,
375         &am3517_evm_dvi_device,
376 };
377
378 static struct omap_dss_board_info am3517_evm_dss_data = {
379         .num_devices    = ARRAY_SIZE(am3517_evm_dss_devices),
380         .devices        = am3517_evm_dss_devices,
381         .default_device = &am3517_evm_lcd_device,
382 };
383
384 /*
385  * Board initialization
386  */
387 static void __init am3517_evm_init_early(void)
388 {
389         omap2_init_common_infrastructure();
390         omap2_init_common_devices(NULL, NULL);
391 }
392
393 static struct omap_musb_board_data musb_board_data = {
394         .interface_type         = MUSB_INTERFACE_ULPI,
395         .mode                   = MUSB_OTG,
396         .power                  = 500,
397         .set_phy_power          = am35x_musb_phy_power,
398         .clear_irq              = am35x_musb_clear_irq,
399         .set_mode               = am35x_musb_set_mode,
400         .reset                  = am35x_musb_reset,
401 };
402
403 static __init void am3517_evm_musb_init(void)
404 {
405         u32 devconf2;
406
407         /*
408          * Set up USB clock/mode in the DEVCONF2 register.
409          */
410         devconf2 = omap_ctrl_readl(AM35XX_CONTROL_DEVCONF2);
411
412         /* USB2.0 PHY reference clock is 13 MHz */
413         devconf2 &= ~(CONF2_REFFREQ | CONF2_OTGMODE | CONF2_PHY_GPIOMODE);
414         devconf2 |=  CONF2_REFFREQ_13MHZ | CONF2_SESENDEN | CONF2_VBDTCTEN
415                         | CONF2_DATPOL;
416
417         omap_ctrl_writel(devconf2, AM35XX_CONTROL_DEVCONF2);
418
419         usb_musb_init(&musb_board_data);
420 }
421
422 static const struct usbhs_omap_board_data usbhs_bdata __initconst = {
423         .port_mode[0] = OMAP_EHCI_PORT_MODE_PHY,
424 #if defined(CONFIG_PANEL_SHARP_LQ043T1DG01) || \
425                 defined(CONFIG_PANEL_SHARP_LQ043T1DG01_MODULE)
426         .port_mode[1] = OMAP_USBHS_PORT_MODE_UNUSED,
427 #else
428         .port_mode[1] = OMAP_EHCI_PORT_MODE_PHY,
429 #endif
430         .port_mode[2] = OMAP_USBHS_PORT_MODE_UNUSED,
431
432         .phy_reset  = true,
433         .reset_gpio_port[0]  = 57,
434         .reset_gpio_port[1]  = -EINVAL,
435         .reset_gpio_port[2]  = -EINVAL
436 };
437
438 #ifdef CONFIG_OMAP_MUX
439 static struct omap_board_mux board_mux[] __initdata = {
440         /* USB OTG DRVVBUS offset = 0x212 */
441         OMAP3_MUX(SAD2D_MCAD23, OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLDOWN),
442         { .reg_offset = OMAP_MUX_TERMINATOR },
443 };
444 #endif
445
446
447 static struct resource am3517_hecc_resources[] = {
448         {
449                 .start  = AM35XX_IPSS_HECC_BASE,
450                 .end    = AM35XX_IPSS_HECC_BASE + 0x3FFF,
451                 .flags  = IORESOURCE_MEM,
452         },
453         {
454                 .start  = INT_35XX_HECC0_IRQ,
455                 .end    = INT_35XX_HECC0_IRQ,
456                 .flags  = IORESOURCE_IRQ,
457         },
458 };
459
460 static struct platform_device am3517_hecc_device = {
461         .name           = "ti_hecc",
462         .id             = -1,
463         .num_resources  = ARRAY_SIZE(am3517_hecc_resources),
464         .resource       = am3517_hecc_resources,
465 };
466
467 static struct ti_hecc_platform_data am3517_evm_hecc_pdata = {
468         .scc_hecc_offset        = AM35XX_HECC_SCC_HECC_OFFSET,
469         .scc_ram_offset         = AM35XX_HECC_SCC_RAM_OFFSET,
470         .hecc_ram_offset        = AM35XX_HECC_RAM_OFFSET,
471         .mbx_offset             = AM35XX_HECC_MBOX_OFFSET,
472         .int_line               = AM35XX_HECC_INT_LINE,
473         .version                = AM35XX_HECC_VERSION,
474 };
475
476 static void am3517_evm_hecc_init(struct ti_hecc_platform_data *pdata)
477 {
478         am3517_hecc_device.dev.platform_data = pdata;
479         platform_device_register(&am3517_hecc_device);
480 }
481
482 static struct omap_board_config_kernel am3517_evm_config[] __initdata = {
483 };
484
485 static void __init am3517_evm_init(void)
486 {
487         omap_board_config = am3517_evm_config;
488         omap_board_config_size = ARRAY_SIZE(am3517_evm_config);
489         omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
490
491         am3517_evm_i2c_init();
492         omap_display_init(&am3517_evm_dss_data);
493         omap_serial_init();
494
495         /* Configure GPIO for EHCI port */
496         omap_mux_init_gpio(57, OMAP_PIN_OUTPUT);
497         usbhs_init(&usbhs_bdata);
498         am3517_evm_hecc_init(&am3517_evm_hecc_pdata);
499         /* DSS */
500         am3517_evm_display_init();
501
502         /* RTC - S35390A */
503         am3517_evm_rtc_init();
504
505         i2c_register_board_info(1, am3517evm_i2c1_boardinfo,
506                                 ARRAY_SIZE(am3517evm_i2c1_boardinfo));
507         /*Ethernet*/
508         am3517_evm_ethernet_init(&am3517_evm_emac_pdata);
509
510         /* MUSB */
511         am3517_evm_musb_init();
512 }
513
514 MACHINE_START(OMAP3517EVM, "OMAP3517/AM3517 EVM")
515         .boot_params    = 0x80000100,
516         .reserve        = omap_reserve,
517         .map_io         = omap3_map_io,
518         .init_early     = am3517_evm_init_early,
519         .init_irq       = omap_init_irq,
520         .init_machine   = am3517_evm_init,
521         .timer          = &omap_timer,
522 MACHINE_END