Merge current mainline tree into linux-omap tree
[pandora-kernel.git] / arch / arm / mach-omap1 / board-nokia770.c
index e2c8ffd..08f533e 100644 (file)
@@ -18,6 +18,7 @@
 #include <linux/spi/ads7846.h>
 #include <linux/workqueue.h>
 #include <linux/delay.h>
+#include <linux/mutex.h>
 
 #include <asm/hardware.h>
 #include <asm/mach-types.h>
@@ -33,6 +34,7 @@
 #include <asm/arch/dsp_common.h>
 #include <asm/arch/aic23.h>
 #include <asm/arch/omapfb.h>
+#include <asm/arch/hwa742.h>
 #include <asm/arch/lcd_mipid.h>
 
 #define ADS7846_PENDOWN_GPIO   15
@@ -161,6 +163,47 @@ static struct spi_board_info nokia770_spi_board_info[] __initdata = {
        },
 };
 
+static struct {
+       struct clk *sys_ck;
+} hwa742;
+
+static int hwa742_get_clocks(void)
+{
+       hwa742.sys_ck = clk_get(NULL, "bclk");
+       if (IS_ERR(hwa742.sys_ck)) {
+               printk(KERN_ERR "can't get HWA742 clock\n");
+               return PTR_ERR(hwa742.sys_ck);
+       }
+       return 0;
+}
+
+static unsigned long hwa742_get_clock_rate(struct device *dev)
+{
+       return clk_get_rate(hwa742.sys_ck);
+}
+
+static void hwa742_power_up(struct device *dev)
+{
+       clk_enable(hwa742.sys_ck);
+}
+
+static void hwa742_power_down(struct device *dev)
+{
+       clk_disable(hwa742.sys_ck);
+}
+
+static struct hwa742_platform_data nokia770_hwa742_platform_data = {
+       .get_clock_rate = hwa742_get_clock_rate,
+       .power_up       = hwa742_power_up,
+       .power_down     = hwa742_power_down,
+       .te_connected   = 1,
+};
+
+static void hwa742_dev_init(void)
+{
+       hwa742_get_clocks();
+       omapfb_set_ctrl_platform_data(&nokia770_hwa742_platform_data);
+}
 
 /* assume no Mini-AB port */
 
@@ -189,7 +232,7 @@ static struct omap_mmc_config nokia770_mmc_config __initdata = {
        },
 };
 
-static struct omap_board_config_kernel nokia770_config[] = {
+static struct omap_board_config_kernel nokia770_config[] __initdata = {
        { OMAP_TAG_USB,         NULL },
        { OMAP_TAG_MMC,         &nokia770_mmc_config },
 };
@@ -202,7 +245,7 @@ static struct omap_board_config_kernel nokia770_config[] = {
 #define        AMPLIFIER_CTRL_GPIO     58
 
 static struct clk *dspxor_ck;
-static DECLARE_MUTEX(audio_pwr_sem);
+static DEFINE_MUTEX(audio_pwr_mutex);
 /*
  * audio_pwr_state
  * +--+-------------------------+---------------------------------------+
@@ -218,7 +261,7 @@ static DECLARE_MUTEX(audio_pwr_sem);
 static int audio_pwr_state = -1;
 
 /*
- * audio_pwr_up / down should be called under audio_pwr_sem
+ * audio_pwr_up / down should be called under audio_pwr_mutex
  */
 static void nokia770_audio_pwr_up(void)
 {
@@ -237,11 +280,11 @@ static void nokia770_audio_pwr_up(void)
 
 static void codec_delayed_power_down(struct work_struct *work)
 {
-       down(&audio_pwr_sem);
+       mutex_lock(&audio_pwr_mutex);
        if (audio_pwr_state == -1)
                aic23_power_down();
        clk_disable(dspxor_ck);
-       up(&audio_pwr_sem);
+       mutex_unlock(&audio_pwr_mutex);
 }
 
 static DECLARE_DELAYED_WORK(codec_power_down_work, codec_delayed_power_down);
@@ -258,19 +301,19 @@ static void nokia770_audio_pwr_down(void)
 static int
 nokia770_audio_pwr_up_request(struct dsp_kfunc_device *kdev, int stage)
 {
-       down(&audio_pwr_sem);
+       mutex_lock(&audio_pwr_mutex);
        if (audio_pwr_state == -1)
                nokia770_audio_pwr_up();
        /* force audio_pwr_state = 0, even if it was 1. */
        audio_pwr_state = 0;
-       up(&audio_pwr_sem);
+       mutex_unlock(&audio_pwr_mutex);
        return 0;
 }
 
 static int
 nokia770_audio_pwr_down_request(struct dsp_kfunc_device *kdev, int stage)
 {
-       down(&audio_pwr_sem);
+       mutex_lock(&audio_pwr_mutex);
        switch (stage) {
        case 1:
                if (audio_pwr_state == 0)
@@ -283,7 +326,7 @@ nokia770_audio_pwr_down_request(struct dsp_kfunc_device *kdev, int stage)
                }
                break;
        }
-       up(&audio_pwr_sem);
+       mutex_unlock(&audio_pwr_mutex);
        return 0;
 }
 
@@ -330,7 +373,9 @@ static void __init omap_nokia770_init(void)
        omap_board_config_size = ARRAY_SIZE(nokia770_config);
        omap_gpio_init();
        omap_serial_init();
+       omap_register_i2c_bus(1, 100, NULL, 0);
        omap_dsp_init();
+       hwa742_dev_init();
        ads7846_dev_init();
        mipid_dev_init();
 }