Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input
[pandora-kernel.git] / arch / arm / mach-omap2 / board-am3517evm.c
index b4e6eca..c1c4389 100644 (file)
 #include <linux/init.h>
 #include <linux/platform_device.h>
 #include <linux/gpio.h>
+#include <linux/i2c/pca953x.h>
 
 #include <mach/hardware.h>
+#include <mach/am35xx.h>
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
 #include <asm/mach/map.h>
 #include <plat/board.h>
 #include <plat/common.h>
 #include <plat/usb.h>
+#include <plat/display.h>
 
 #include "mux.h"
 
+#define LCD_PANEL_PWR          176
+#define LCD_PANEL_BKLIGHT_PWR  182
+#define LCD_PANEL_PWM          181
+
+static struct i2c_board_info __initdata am3517evm_i2c_boardinfo[] = {
+       {
+               I2C_BOARD_INFO("s35390a", 0x30),
+               .type           = "s35390a",
+       },
+};
+
+/*
+ * RTC - S35390A
+ */
+#define GPIO_RTCS35390A_IRQ    55
+
+static void __init am3517_evm_rtc_init(void)
+{
+       int r;
+
+       omap_mux_init_gpio(GPIO_RTCS35390A_IRQ, OMAP_PIN_INPUT_PULLUP);
+       r = gpio_request(GPIO_RTCS35390A_IRQ, "rtcs35390a-irq");
+       if (r < 0) {
+               printk(KERN_WARNING "failed to request GPIO#%d\n",
+                               GPIO_RTCS35390A_IRQ);
+               return;
+       }
+       r = gpio_direction_input(GPIO_RTCS35390A_IRQ);
+       if (r < 0) {
+               printk(KERN_WARNING "GPIO#%d cannot be configured as input\n",
+                               GPIO_RTCS35390A_IRQ);
+               gpio_free(GPIO_RTCS35390A_IRQ);
+               return;
+       }
+       am3517evm_i2c_boardinfo[0].irq = gpio_to_irq(GPIO_RTCS35390A_IRQ);
+}
+
+/*
+ * I2C GPIO Expander - TCA6416
+ */
+
+/* Mounted on Base-Board */
+static struct pca953x_platform_data am3517evm_gpio_expander_info_0 = {
+       .gpio_base      = OMAP_MAX_GPIO_LINES,
+};
+static struct i2c_board_info __initdata am3517evm_tca6416_info_0[] = {
+       {
+               I2C_BOARD_INFO("tca6416", 0x21),
+               .platform_data = &am3517evm_gpio_expander_info_0,
+       },
+};
+
+/* Mounted on UI Card */
+static struct pca953x_platform_data am3517evm_ui_gpio_expander_info_1 = {
+       .gpio_base      = OMAP_MAX_GPIO_LINES + 16,
+};
+static struct pca953x_platform_data am3517evm_ui_gpio_expander_info_2 = {
+       .gpio_base      = OMAP_MAX_GPIO_LINES + 32,
+};
+static struct i2c_board_info __initdata am3517evm_ui_tca6416_info[] = {
+       {
+               I2C_BOARD_INFO("tca6416", 0x20),
+               .platform_data = &am3517evm_ui_gpio_expander_info_1,
+       },
+       {
+               I2C_BOARD_INFO("tca6416", 0x21),
+               .platform_data = &am3517evm_ui_gpio_expander_info_2,
+       },
+};
+
+static int __init am3517_evm_i2c_init(void)
+{
+       omap_register_i2c_bus(1, 400, NULL, 0);
+       omap_register_i2c_bus(2, 400, am3517evm_tca6416_info_0,
+                       ARRAY_SIZE(am3517evm_tca6416_info_0));
+       omap_register_i2c_bus(3, 400, am3517evm_ui_tca6416_info,
+                       ARRAY_SIZE(am3517evm_ui_tca6416_info));
+
+       return 0;
+}
+
+static int lcd_enabled;
+static int dvi_enabled;
+
+static void __init am3517_evm_display_init(void)
+{
+       int r;
+
+       omap_mux_init_gpio(LCD_PANEL_PWR, OMAP_PIN_INPUT_PULLUP);
+       omap_mux_init_gpio(LCD_PANEL_BKLIGHT_PWR, OMAP_PIN_INPUT_PULLDOWN);
+       omap_mux_init_gpio(LCD_PANEL_PWM, OMAP_PIN_INPUT_PULLDOWN);
+       /*
+        * Enable GPIO 182 = LCD Backlight Power
+        */
+       r = gpio_request(LCD_PANEL_BKLIGHT_PWR, "lcd_backlight_pwr");
+       if (r) {
+               printk(KERN_ERR "failed to get lcd_backlight_pwr\n");
+               return;
+       }
+       gpio_direction_output(LCD_PANEL_BKLIGHT_PWR, 1);
+       /*
+        * Enable GPIO 181 = LCD Panel PWM
+        */
+       r = gpio_request(LCD_PANEL_PWM, "lcd_pwm");
+       if (r) {
+               printk(KERN_ERR "failed to get lcd_pwm\n");
+               goto err_1;
+       }
+       gpio_direction_output(LCD_PANEL_PWM, 1);
+       /*
+        * Enable GPIO 176 = LCD Panel Power enable pin
+        */
+       r = gpio_request(LCD_PANEL_PWR, "lcd_panel_pwr");
+       if (r) {
+               printk(KERN_ERR "failed to get lcd_panel_pwr\n");
+               goto err_2;
+       }
+       gpio_direction_output(LCD_PANEL_PWR, 1);
+
+       printk(KERN_INFO "Display initialized successfully\n");
+       return;
+
+err_2:
+       gpio_free(LCD_PANEL_PWM);
+err_1:
+       gpio_free(LCD_PANEL_BKLIGHT_PWR);
+}
+
+static int am3517_evm_panel_enable_lcd(struct omap_dss_device *dssdev)
+{
+       if (dvi_enabled) {
+               printk(KERN_ERR "cannot enable LCD, DVI is enabled\n");
+               return -EINVAL;
+       }
+       gpio_set_value(LCD_PANEL_PWR, 1);
+       lcd_enabled = 1;
+
+       return 0;
+}
+
+static void am3517_evm_panel_disable_lcd(struct omap_dss_device *dssdev)
+{
+       gpio_set_value(LCD_PANEL_PWR, 0);
+       lcd_enabled = 0;
+}
+
+static struct omap_dss_device am3517_evm_lcd_device = {
+       .type                   = OMAP_DISPLAY_TYPE_DPI,
+       .name                   = "lcd",
+       .driver_name            = "sharp_lq_panel",
+       .phy.dpi.data_lines     = 16,
+       .platform_enable        = am3517_evm_panel_enable_lcd,
+       .platform_disable       = am3517_evm_panel_disable_lcd,
+};
+
+static int am3517_evm_panel_enable_tv(struct omap_dss_device *dssdev)
+{
+       return 0;
+}
+
+static void am3517_evm_panel_disable_tv(struct omap_dss_device *dssdev)
+{
+}
+
+static struct omap_dss_device am3517_evm_tv_device = {
+       .type                   = OMAP_DISPLAY_TYPE_VENC,
+       .name                   = "tv",
+       .driver_name            = "venc",
+       .phy.venc.type          = OMAP_DSS_VENC_TYPE_SVIDEO,
+       .platform_enable        = am3517_evm_panel_enable_tv,
+       .platform_disable       = am3517_evm_panel_disable_tv,
+};
+
+static int am3517_evm_panel_enable_dvi(struct omap_dss_device *dssdev)
+{
+       if (lcd_enabled) {
+               printk(KERN_ERR "cannot enable DVI, LCD is enabled\n");
+               return -EINVAL;
+       }
+       dvi_enabled = 1;
+
+       return 0;
+}
+
+static void am3517_evm_panel_disable_dvi(struct omap_dss_device *dssdev)
+{
+       dvi_enabled = 0;
+}
+
+static struct omap_dss_device am3517_evm_dvi_device = {
+       .type                   = OMAP_DISPLAY_TYPE_DPI,
+       .name                   = "dvi",
+       .driver_name            = "generic_panel",
+       .phy.dpi.data_lines     = 24,
+       .platform_enable        = am3517_evm_panel_enable_dvi,
+       .platform_disable       = am3517_evm_panel_disable_dvi,
+};
+
+static struct omap_dss_device *am3517_evm_dss_devices[] = {
+       &am3517_evm_lcd_device,
+       &am3517_evm_tv_device,
+       &am3517_evm_dvi_device,
+};
+
+static struct omap_dss_board_info am3517_evm_dss_data = {
+       .num_devices    = ARRAY_SIZE(am3517_evm_dss_devices),
+       .devices        = am3517_evm_dss_devices,
+       .default_device = &am3517_evm_lcd_device,
+};
+
+struct platform_device am3517_evm_dss_device = {
+       .name           = "omapdss",
+       .id             = -1,
+       .dev            = {
+               .platform_data  = &am3517_evm_dss_data,
+       },
+};
+
 /*
  * Board initialization
  */
@@ -39,6 +260,7 @@ static struct omap_board_config_kernel am3517_evm_config[] __initdata = {
 };
 
 static struct platform_device *am3517_evm_devices[] __initdata = {
+       &am3517_evm_dss_device,
 };
 
 static void __init am3517_evm_init_irq(void)
@@ -51,7 +273,7 @@ static void __init am3517_evm_init_irq(void)
        omap_gpio_init();
 }
 
-static struct ehci_hcd_omap_platform_data ehci_pdata __initdata = {
+static const struct ehci_hcd_omap_platform_data ehci_pdata __initconst = {
        .port_mode[0] = EHCI_HCD_OMAP_MODE_PHY,
        .port_mode[1] = EHCI_HCD_OMAP_MODE_PHY,
        .port_mode[2] = EHCI_HCD_OMAP_MODE_UNKNOWN,
@@ -73,17 +295,30 @@ static struct omap_board_mux board_mux[] __initdata = {
 static void __init am3517_evm_init(void)
 {
        omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
+
+       am3517_evm_i2c_init();
        platform_add_devices(am3517_evm_devices,
                                ARRAY_SIZE(am3517_evm_devices));
 
        omap_serial_init();
+
+       /* Configure GPIO for EHCI port */
+       omap_mux_init_gpio(57, OMAP_PIN_OUTPUT);
        usb_ehci_init(&ehci_pdata);
+       /* DSS */
+       am3517_evm_display_init();
+
+       /* RTC - S35390A */
+       am3517_evm_rtc_init();
+
+       i2c_register_board_info(1, am3517evm_i2c_boardinfo,
+                               ARRAY_SIZE(am3517evm_i2c_boardinfo));
 }
 
 static void __init am3517_evm_map_io(void)
 {
        omap2_set_globals_343x();
-       omap2_map_common_io();
+       omap34xx_map_common_io();
 }
 
 MACHINE_START(OMAP3517EVM, "OMAP3517/AM3517 EVM")