]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - arch/arm/mach-omap2/board-n800.c
i2c: tea5761: New-style i2c driver
[linux-2.6-omap-h63xx.git] / arch / arm / mach-omap2 / board-n800.c
index b35bc56c568242292e26c76a30bb5f2fabdc1eb0..758e2c1864f204ed40e4c6c66c18f736e69e98d0 100644 (file)
@@ -45,6 +45,8 @@
 #define N800_BLIZZARD_POWERDOWN_GPIO   15
 #define N800_STI_GPIO                  62
 #define N800_KEYB_IRQ_GPIO             109
+#define N800_DAV_IRQ_GPIO              103
+#define N800_TSC2301_RESET_GPIO                118
 
 void __init nokia_n800_init_irq(void)
 {
@@ -209,16 +211,8 @@ static struct omap_board_config_kernel n800_config[] __initdata = {
        { OMAP_TAG_MMC,                         &n800_mmc_config },
 };
 
-
-static int n800_get_keyb_irq_state(struct device *dev)
-{
-       return !omap_get_gpio_datain(N800_KEYB_IRQ_GPIO);
-}
-
 static struct tsc2301_platform_data tsc2301_config = {
-       .reset_gpio     = 118,
-       .dav_gpio       = 103,
-       .pen_int_gpio   = 106,
+       .reset_gpio     = N800_TSC2301_RESET_GPIO,
        .keymap = {
                -1,             /* Event for bit 0 */
                KEY_UP,         /* Event for bit 1 (up) */
@@ -238,19 +232,57 @@ static struct tsc2301_platform_data tsc2301_config = {
                -1,             /* Event for bit 15 */
        },
        .kp_rep         = 0,
-       .get_keyb_irq_state = n800_get_keyb_irq_state,
+       .keyb_name      = "Internal keypad",
 };
 
 static void tsc2301_dev_init(void)
 {
+       int r;
        int gpio = N800_KEYB_IRQ_GPIO;
 
-       if (omap_request_gpio(gpio) < 0) {
-               printk(KERN_ERR "can't get KBIRQ GPIO\n");
-               return;
+       r = gpio_request(gpio, "tsc2301 KBD IRQ");
+       if (r >= 0) {
+               gpio_direction_input(gpio);
+               tsc2301_config.keyb_int = OMAP_GPIO_IRQ(gpio);
+       } else {
+               printk(KERN_ERR "unable to get KBD GPIO");
+       }
+
+       gpio = N800_DAV_IRQ_GPIO;
+       r = gpio_request(gpio, "tsc2301 DAV IRQ");
+       if (r >= 0) {
+               gpio_direction_input(gpio);
+               tsc2301_config.dav_int = OMAP_GPIO_IRQ(gpio);
+       } else {
+               printk(KERN_ERR "unable to get DAV GPIO");
+       }
+}
+
+static int __init tea5761_dev_init(void)
+{
+       const struct omap_tea5761_config *info;
+       int enable_gpio = 0;
+
+       info = omap_get_config(OMAP_TAG_TEA5761, struct omap_tea5761_config);
+       if (info)
+               enable_gpio = info->enable_gpio;
+
+       if (enable_gpio) {
+               pr_debug("Enabling tea5761 at GPIO %d\n",
+                        enable_gpio);
+
+               if (omap_request_gpio(enable_gpio) < 0) {
+                       printk(KERN_ERR "Can't request GPIO %d\n",
+                              enable_gpio);
+                       return -ENODEV;
+               }
+
+               omap_set_gpio_direction(enable_gpio, 0);
+               udelay(50);
+               omap_set_gpio_dataout(enable_gpio, 1);
        }
-       omap_set_gpio_direction(gpio, 1);
-       tsc2301_config.keyb_int = OMAP_GPIO_IRQ(gpio);
+
+       return 0;
 }
 
 static struct omap2_mcspi_device_config tsc2301_mcspi_config = {
@@ -331,16 +363,26 @@ static void __init n800_ts_set_config(void)
        if (conf != NULL) {
                if (strcmp(conf->panel_name, "lph8923") == 0) {
                        tsc2301_config.ts_x_plate_ohm   = 180;
-                       tsc2301_config.ts_hw_avg        = 4;
-                       tsc2301_config.ts_ignore_last   = 1;
-                       tsc2301_config.ts_max_pressure  = 255;
+                       tsc2301_config.ts_hw_avg        = 8;
+                       tsc2301_config.ts_max_pressure  = 2048;
+                       tsc2301_config.ts_touch_pressure = 400;
                        tsc2301_config.ts_stab_time     = 100;
+                       tsc2301_config.ts_pressure_fudge = 2;
+                       tsc2301_config.ts_x_max         = 4096;
+                       tsc2301_config.ts_x_fudge       = 4;
+                       tsc2301_config.ts_y_max         = 4096;
+                       tsc2301_config.ts_y_fudge       = 7;
                } else if (strcmp(conf->panel_name, "ls041y3") == 0) {
                        tsc2301_config.ts_x_plate_ohm   = 280;
-                       tsc2301_config.ts_hw_avg        = 16;
-                       tsc2301_config.ts_touch_pressure= 215;
-                       tsc2301_config.ts_max_pressure  = 255;
-                       tsc2301_config.ts_ignore_last   = 1;
+                       tsc2301_config.ts_hw_avg        = 8;
+                       tsc2301_config.ts_touch_pressure = 400;
+                       tsc2301_config.ts_max_pressure  = 2048;
+                       tsc2301_config.ts_stab_time     = 1000;
+                       tsc2301_config.ts_pressure_fudge = 2;
+                       tsc2301_config.ts_x_max         = 4096;
+                       tsc2301_config.ts_x_fudge       = 4;
+                       tsc2301_config.ts_y_max         = 4096;
+                       tsc2301_config.ts_y_fudge       = 7;
                } else {
                        printk(KERN_ERR "Unknown panel type, set default "
                               "touchscreen configuration\n");
@@ -455,6 +497,11 @@ static struct i2c_board_info __initdata n800_i2c_board_info_2[] = {
                .platform_data = &n800_tcm825x_platform_data,
        },
 #endif
+#if defined(CONFIG_RADIO_TEA5761) || defined(CONFIG_RADIO_TEA5761_MODULE)
+       {
+               I2C_BOARD_INFO("tea5761", 0x10),
+       },
+#endif
 };
 
 void __init nokia_n800_common_init(void)
@@ -485,6 +532,7 @@ static void __init nokia_n800_init(void)
        n800_audio_init(&tsc2301_config);
        n800_ts_set_config();
        tsc2301_dev_init();
+       tea5761_dev_init();
        omap_register_gpio_switches(n800_gpio_switches,
                                    ARRAY_SIZE(n800_gpio_switches));
 }