Merge git://git.infradead.org/battery-2.6
[pandora-kernel.git] / arch / arm / mach-omap1 / board-nokia770.c
index cbe909b..22db19a 100644 (file)
@@ -16,6 +16,8 @@
 
 #include <linux/spi/spi.h>
 #include <linux/spi/ads7846.h>
+#include <linux/workqueue.h>
+#include <linux/delay.h>
 
 #include <asm/hardware.h>
 #include <asm/mach-types.h>
 #include <asm/arch/dsp_common.h>
 #include <asm/arch/aic23.h>
 #include <asm/arch/gpio.h>
+#include <asm/arch/omapfb.h>
+#include <asm/arch/lcd_mipid.h>
+
+#include "../plat-omap/dsp/dsp_common.h"
+
+#define ADS7846_PENDOWN_GPIO   15
 
 static void __init omap_nokia770_init_irq(void)
 {
@@ -89,9 +97,44 @@ static struct platform_device nokia770_kp_device = {
 };
 
 static struct platform_device *nokia770_devices[] __initdata = {
-        &nokia770_kp_device,
+       &nokia770_kp_device,
+};
+
+static void mipid_shutdown(struct mipid_platform_data *pdata)
+{
+       if (pdata->nreset_gpio != -1) {
+               printk(KERN_INFO "shutdown LCD\n");
+               omap_set_gpio_dataout(pdata->nreset_gpio, 0);
+               msleep(120);
+       }
+}
+
+static struct mipid_platform_data nokia770_mipid_platform_data = {
+       .shutdown = mipid_shutdown,
 };
 
+static void mipid_dev_init(void)
+{
+       const struct omap_lcd_config *conf;
+
+       conf = omap_get_config(OMAP_TAG_LCD, struct omap_lcd_config);
+       if (conf != NULL) {
+               nokia770_mipid_platform_data.nreset_gpio = conf->nreset_gpio;
+               nokia770_mipid_platform_data.data_lines = conf->data_lines;
+       }
+}
+
+static void ads7846_dev_init(void)
+{
+       if (omap_request_gpio(ADS7846_PENDOWN_GPIO) < 0)
+               printk(KERN_ERR "can't get ads7846 pen down GPIO\n");
+}
+
+static int ads7846_get_pendown_state(void)
+{
+       return !omap_get_gpio_datain(ADS7846_PENDOWN_GPIO);
+}
+
 static struct ads7846_platform_data nokia770_ads7846_platform_data __initdata = {
        .x_max          = 0x0fff,
        .y_max          = 0x0fff,
@@ -99,14 +142,17 @@ static struct ads7846_platform_data nokia770_ads7846_platform_data __initdata =
        .pressure_max   = 255,
        .debounce_max   = 10,
        .debounce_tol   = 3,
+       .debounce_rep   = 1,
+       .get_pendown_state      = ads7846_get_pendown_state,
 };
 
 static struct spi_board_info nokia770_spi_board_info[] __initdata = {
        [0] = {
-               .modalias       = "lcd_lph8923",
+               .modalias       = "lcd_mipid",
                .bus_num        = 2,
                .chip_select    = 3,
                .max_speed_hz   = 12000000,
+               .platform_data  = &nokia770_mipid_platform_data,
        },
        [1] = {
                .modalias       = "ads7846",
@@ -151,6 +197,7 @@ static struct omap_board_config_kernel nokia770_config[] = {
        { OMAP_TAG_MMC,         &nokia770_mmc_config },
 };
 
+#if    defined(CONFIG_OMAP_DSP)
 /*
  * audio power control
  */
@@ -181,7 +228,7 @@ static void nokia770_audio_pwr_up(void)
        clk_enable(dspxor_ck);
 
        /* Turn on codec */
-       tlv320aic23_power_up();
+       aic23_power_up();
 
        if (omap_get_gpio_datain(HEADPHONE_GPIO))
                /* HP not connected, turn on amplifier */
@@ -195,7 +242,7 @@ static void codec_delayed_power_down(struct work_struct *work)
 {
        down(&audio_pwr_sem);
        if (audio_pwr_state == -1)
-               tlv320aic23_power_down();
+               aic23_power_down();
        clk_disable(dspxor_ck);
        up(&audio_pwr_sem);
 }
@@ -211,7 +258,8 @@ static void nokia770_audio_pwr_down(void)
        schedule_delayed_work(&codec_power_down_work, HZ / 20); /* 50ms */
 }
 
-void nokia770_audio_pwr_up_request(int stage)
+static int
+nokia770_audio_pwr_up_request(struct dsp_kfunc_device *kdev, int stage)
 {
        down(&audio_pwr_sem);
        if (audio_pwr_state == -1)
@@ -219,9 +267,11 @@ void nokia770_audio_pwr_up_request(int stage)
        /* force audio_pwr_state = 0, even if it was 1. */
        audio_pwr_state = 0;
        up(&audio_pwr_sem);
+       return 0;
 }
 
-void nokia770_audio_pwr_down_request(int stage)
+static int
+nokia770_audio_pwr_down_request(struct dsp_kfunc_device *kdev, int stage)
 {
        down(&audio_pwr_sem);
        switch (stage) {
@@ -237,8 +287,39 @@ void nokia770_audio_pwr_down_request(int stage)
                break;
        }
        up(&audio_pwr_sem);
+       return 0;
 }
 
+static struct dsp_kfunc_device nokia770_audio_device = {
+       .name    = "audio",
+       .type    = DSP_KFUNC_DEV_TYPE_AUDIO,
+       .enable  = nokia770_audio_pwr_up_request,
+       .disable = nokia770_audio_pwr_down_request,
+};
+
+static __init int omap_dsp_init(void)
+{
+       int ret;
+
+       dspxor_ck = clk_get(0, "dspxor_ck");
+       if (IS_ERR(dspxor_ck)) {
+               printk(KERN_ERR "couldn't acquire dspxor_ck\n");
+               return PTR_ERR(dspxor_ck);
+       }
+
+       ret = dsp_kfunc_device_register(&nokia770_audio_device);
+       if (ret) {
+               printk(KERN_ERR
+                      "KFUNC device registration faild: %s\n",
+                      nokia770_audio_device.name);
+               goto out;
+       }
+       return 0;
+ out:
+       return ret;
+}
+#endif /* CONFIG_OMAP_DSP */
+
 static void __init omap_nokia770_init(void)
 {
        nokia770_config[0].data = &nokia770_usb_config;
@@ -248,10 +329,11 @@ static void __init omap_nokia770_init(void)
                                ARRAY_SIZE(nokia770_spi_board_info));
        omap_board_config = nokia770_config;
        omap_board_config_size = ARRAY_SIZE(nokia770_config);
+       omap_gpio_init();
        omap_serial_init();
-       omap_dsp_audio_pwr_up_request = nokia770_audio_pwr_up_request;
-       omap_dsp_audio_pwr_down_request = nokia770_audio_pwr_down_request;
-       dspxor_ck = clk_get(0, "dspxor_ck");
+       omap_dsp_init();
+       ads7846_dev_init();
+       mipid_dev_init();
 }
 
 static void __init omap_nokia770_map_io(void)