]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - arch/arm/mach-omap1/board-h2.c
Merge current mainline tree into linux-omap tree
[linux-2.6-omap-h63xx.git] / arch / arm / mach-omap1 / board-h2.c
index 18899d74d4c071253242958fd015f90451372647..aa1f8af57c5346e463a33751ed4a2818f8041373 100644 (file)
@@ -20,6 +20,7 @@
  */
 
 #include <linux/kernel.h>
+#include <linux/init.h>
 #include <linux/platform_device.h>
 #include <linux/delay.h>
 #include <linux/i2c.h>
 #include <linux/mtd/partitions.h>
 #include <linux/input.h>
 #include <linux/i2c/tps65010.h>
+#include <linux/workqueue.h>
+#include <linux/spi/spi.h>
+#include <linux/spi/tsc2101.h>
+#include <linux/clk.h>
 
 #include <asm/hardware.h>
 #include <asm/gpio.h>
@@ -37,6 +42,8 @@
 #include <asm/mach/flash.h>
 #include <asm/mach/map.h>
 
+#include <asm/arch/gpio.h>
+#include <asm/arch/gpio-switch.h>
 #include <asm/arch/mux.h>
 #include <asm/arch/tc.h>
 #include <asm/arch/nand.h>
@@ -47,8 +54,6 @@
 #include <asm/arch/mcbsp.h>
 #include <asm/arch/omap-alsa.h>
 
-extern int omap_gpio_init(void);
-
 static int h2_keymap[] = {
        KEY(0, 0, KEY_LEFT),
        KEY(0, 1, KEY_RIGHT),
@@ -296,6 +301,91 @@ static struct platform_device h2_lcd_device = {
        .id             = -1,
 };
 
+struct {
+       struct clk      *mclk;
+       int             initialized;
+} h2_tsc2101;
+
+#define TSC2101_MUX_MCLK_ON    R10_1610_MCLK_ON
+#define TSC2101_MUX_MCLK_OFF   R10_1610_MCLK_OFF
+
+static void h2_lcd_dev_init(struct spi_device *tsc2101)
+{
+       /* The LCD is connected to the GPIO pins of the TSC2101, so
+        * we have to tie them here. We can also register the LCD driver
+        * first only here, where we know that the TSC driver is ready.
+        */
+
+       h2_lcd_device.dev.platform_data = tsc2101;
+       platform_device_register(&h2_lcd_device);
+}
+
+static int h2_tsc2101_init(struct spi_device *spi)
+{
+       int r;
+
+       if (h2_tsc2101.initialized) {
+               printk(KERN_ERR "tsc2101: already initialized\n");
+               return -ENODEV;
+       }
+
+       /* Get the MCLK */
+       h2_tsc2101.mclk = clk_get(&spi->dev, "mclk");
+       if (IS_ERR(h2_tsc2101.mclk)) {
+               dev_err(&spi->dev, "unable to get the clock MCLK\n");
+               return PTR_ERR(h2_tsc2101.mclk);
+       }
+       if ((r = clk_set_rate(h2_tsc2101.mclk, 12000000)) < 0) {
+               dev_err(&spi->dev, "unable to set rate to the MCLK\n");
+               goto err;
+       }
+
+       omap_cfg_reg(TSC2101_MUX_MCLK_OFF);
+       omap_cfg_reg(N15_1610_UWIRE_CS1);
+
+       h2_lcd_dev_init(spi);
+
+       return 0;
+err:
+       clk_put(h2_tsc2101.mclk);
+       return r;
+}
+
+static void h2_tsc2101_cleanup(struct spi_device *spi)
+{
+       clk_put(h2_tsc2101.mclk);
+       omap_cfg_reg(TSC2101_MUX_MCLK_OFF);
+}
+
+static void h2_tsc2101_enable_mclk(struct spi_device *spi)
+{
+       omap_cfg_reg(TSC2101_MUX_MCLK_ON);
+       clk_enable(h2_tsc2101.mclk);
+}
+
+static void h2_tsc2101_disable_mclk(struct spi_device *spi)
+{
+       clk_disable(h2_tsc2101.mclk);
+       omap_cfg_reg(R10_1610_MCLK_OFF);
+}
+
+static struct tsc2101_platform_data h2_tsc2101_platform_data = {
+       .init           = h2_tsc2101_init,
+       .cleanup        = h2_tsc2101_cleanup,
+       .enable_mclk    = h2_tsc2101_enable_mclk,
+       .disable_mclk   = h2_tsc2101_disable_mclk,
+};
+
+static struct spi_board_info h2_spi_board_info[] __initdata = {
+       [0] = {
+               .modalias       = "tsc2101",
+               .bus_num        = 2,
+               .chip_select    = 1,
+               .max_speed_hz   = 16000000,
+               .platform_data  = &h2_tsc2101_platform_data,
+       },
+};
+
 static struct omap_mcbsp_reg_cfg mcbsp_regs = {
        .spcr2 = FREE | FRST | GRST | XRST | XINTM(3),
        .spcr1 = RINTM(3) | RRST,
@@ -337,26 +427,9 @@ static struct platform_device *h2_devices[] __initdata = {
        &h2_smc91x_device,
        &h2_irda_device,
        &h2_kp_device,
-       &h2_lcd_device,
        &h2_mcbsp1_device,
 };
 
-#ifdef CONFIG_I2C_BOARDINFO
-static struct i2c_board_info __initdata h2_i2c_board_info[] = {
-       {
-               I2C_BOARD_INFO("tps65010", 0x48),
-               .type           = "tps65010",
-               .irq            = OMAP_GPIO_IRQ(58),
-       },
-       /* TODO when driver support is ready:
-        *  - isp1301 OTG transceiver
-        *  - optional ov9640 camera sensor at 0x30
-        *  - pcf9754 for aGPS control
-        *  - ... etc
-        */
-};
-#endif
-
 static void __init h2_init_smc91x(void)
 {
        if ((omap_request_gpio(0)) < 0) {
@@ -365,6 +438,18 @@ static void __init h2_init_smc91x(void)
        }
 }
 
+static struct i2c_board_info __initdata h2_i2c_board_info[] = {
+       {
+               I2C_BOARD_INFO("tps65010", 0x48),
+               .type           = "tps65010",
+               .irq            = OMAP_GPIO_IRQ(58),
+       }, {
+               I2C_BOARD_INFO("isp1301_omap", 0x2d),
+               .type           = "isp1301_omap",
+               .irq            = OMAP_GPIO_IRQ(2),
+       },
+};
+
 static void __init h2_init_irq(void)
 {
        omap1_init_common_hw();
@@ -389,15 +474,14 @@ static struct omap_usb_config h2_usb_config __initdata = {
 };
 
 static struct omap_mmc_config h2_mmc_config __initdata = {
-       .mmc [0] = {
-               .enabled        = 1,
+       .mmc[0] = {
+               .enabled        = 1,
                .wire4          = 1,
-               .wp_pin         = OMAP_MPUIO(3),
-               .power_pin      = -1,   /* tps65010 gpio3 */
-               .switch_pin     = OMAP_MPUIO(1),
        },
 };
 
+extern struct omap_mmc_platform_data h2_mmc_data;
+
 static struct omap_uart_config h2_uart_config __initdata = {
        .enabled_uarts = ((1 << 0) | (1 << 1) | (1 << 2)),
 };
@@ -413,6 +497,18 @@ static struct omap_board_config_kernel h2_config[] __initdata = {
        { OMAP_TAG_LCD,         &h2_lcd_config },
 };
 
+static struct omap_gpio_switch h2_gpio_switches[] __initdata = {
+       {
+               .name                   = "mmc_slot",
+               .gpio                   = OMAP_MPUIO(1),
+               .type                   = OMAP_GPIO_SWITCH_TYPE_COVER,
+               .debounce_rising        = 100,
+               .debounce_falling       = 0,
+               .notify                 = h2_mmc_slot_cover_handler,
+               .notify_data            = NULL,
+       },
+};
+
 #define H2_NAND_RB_GPIO_PIN    62
 
 static int h2_nand_dev_ready(struct omap_nand_platform_data *data)
@@ -456,19 +552,16 @@ static void __init h2_init(void)
 #endif
 
        platform_add_devices(h2_devices, ARRAY_SIZE(h2_devices));
+       spi_register_board_info(h2_spi_board_info,
+                               ARRAY_SIZE(h2_spi_board_info));
        omap_board_config = h2_config;
        omap_board_config_size = ARRAY_SIZE(h2_config);
        omap_serial_init();
-
-       /* irq for tps65010 chip */
-       omap_cfg_reg(W4_GPIO58);
-       if (gpio_request(58, "tps65010") == 0)
-               gpio_direction_input(58);
-
-#ifdef CONFIG_I2C_BOARDINFO
-       i2c_register_board_info(1, h2_i2c_board_info,
-                       ARRAY_SIZE(h2_i2c_board_info));
-#endif
+       omap_register_i2c_bus(1, 100, h2_i2c_board_info,
+                             ARRAY_SIZE(h2_i2c_board_info));
+       h2_mmc_init();
+       omap_register_gpio_switches(h2_gpio_switches,
+                                   ARRAY_SIZE(h2_gpio_switches));
 }
 
 static void __init h2_map_io(void)
@@ -476,22 +569,6 @@ static void __init h2_map_io(void)
        omap1_map_common_io();
 }
 
-#ifdef CONFIG_TPS65010
-static int __init h2_tps_init(void)
-{
-       if (!machine_is_omap_h2())
-               return 0;
-
-       /* gpio3 for SD, gpio4 for VDD_DSP */
-       /* FIXME send power to DSP iff it's configured */
-
-       /* Enable LOW_PWR */
-       tps65010_set_low_pwr(ON);
-       return 0;
-}
-fs_initcall(h2_tps_init);
-#endif
-
 MACHINE_START(OMAP_H2, "TI-H2")
        /* Maintainer: Imre Deak <imre.deak@nokia.com> */
        .phys_io        = 0xfff00000,