ARM: OMAP3: hwmod data and setup code for band gap thermal driver
[pandora-kernel.git] / arch / arm / mach-omap2 / devices.c
index 1077ad6..982eba8 100644 (file)
@@ -8,7 +8,7 @@
  * the Free Software Foundation; either version 2 of the License, or
  * (at your option) any later version.
  */
-
+#include <linux/gpio.h>
 #include <linux/kernel.h>
 #include <linux/init.h>
 #include <linux/platform_device.h>
@@ -16,6 +16,7 @@
 #include <linux/clk.h>
 #include <linux/err.h>
 #include <linux/slab.h>
+#include <linux/of.h>
 
 #include <mach/hardware.h>
 #include <mach/irqs.h>
@@ -26,7 +27,6 @@
 #include <plat/tc.h>
 #include <plat/board.h>
 #include <plat/mcbsp.h>
-#include <mach/gpio.h>
 #include <plat/mmc.h>
 #include <plat/dma.h>
 #include <plat/omap_hwmod.h>
@@ -44,7 +44,7 @@ static int __init omap3_l3_init(void)
 {
        int l;
        struct omap_hwmod *oh;
-       struct omap_device *od;
+       struct platform_device *pdev;
        char oh_name[L3_MODULES_MAX_LEN];
 
        /*
@@ -61,12 +61,12 @@ static int __init omap3_l3_init(void)
        if (!oh)
                pr_err("could not look up %s\n", oh_name);
 
-       od = omap_device_build("omap_l3_smx", 0, oh, NULL, 0,
+       pdev = omap_device_build("omap_l3_smx", 0, oh, NULL, 0,
                                                           NULL, 0, 0);
 
-       WARN(IS_ERR(od), "could not build omap_device for %s\n", oh_name);
+       WARN(IS_ERR(pdev), "could not build omap_device for %s\n", oh_name);
 
-       return IS_ERR(od) ? PTR_ERR(od) : 0;
+       return IS_ERR(pdev) ? PTR_ERR(pdev) : 0;
 }
 postcore_initcall(omap3_l3_init);
 
@@ -74,9 +74,13 @@ static int __init omap4_l3_init(void)
 {
        int l, i;
        struct omap_hwmod *oh[3];
-       struct omap_device *od;
+       struct platform_device *pdev;
        char oh_name[L3_MODULES_MAX_LEN];
 
+       /* If dtb is there, the devices will be created dynamically */
+       if (of_have_populated_dt())
+               return -ENODEV;
+
        /*
         * To avoid code running on other OMAPs in
         * multi-omap builds
@@ -92,12 +96,12 @@ static int __init omap4_l3_init(void)
                        pr_err("could not look up %s\n", oh_name);
        }
 
-       od = omap_device_build_ss("omap_l3_noc", 0, oh, 3, NULL,
+       pdev = omap_device_build_ss("omap_l3_noc", 0, oh, 3, NULL,
                                                     0, NULL, 0, 0);
 
-       WARN(IS_ERR(od), "could not build omap_device for %s\n", oh_name);
+       WARN(IS_ERR(pdev), "could not build omap_device for %s\n", oh_name);
 
-       return IS_ERR(od) ? PTR_ERR(od) : 0;
+       return IS_ERR(pdev) ? PTR_ERR(pdev) : 0;
 }
 postcore_initcall(omap4_l3_init);
 
@@ -221,18 +225,10 @@ static inline void omap_init_camera(void)
 #endif
 }
 
-struct omap_device_pm_latency omap_keyboard_latency[] = {
-       {
-               .deactivate_func = omap_device_idle_hwmods,
-               .activate_func   = omap_device_enable_hwmods,
-               .flags = OMAP_DEVICE_LATENCY_AUTO_ADJUST,
-       },
-};
-
 int __init omap4_keyboard_init(struct omap4_keypad_platform_data
                        *sdp4430_keypad_data, struct omap_board_data *bdata)
 {
-       struct omap_device *od;
+       struct platform_device *pdev;
        struct omap_hwmod *oh;
        struct omap4_keypad_platform_data *keypad_data;
        unsigned int id = -1;
@@ -247,15 +243,13 @@ int __init omap4_keyboard_init(struct omap4_keypad_platform_data
 
        keypad_data = sdp4430_keypad_data;
 
-       od = omap_device_build(name, id, oh, keypad_data,
-                       sizeof(struct omap4_keypad_platform_data),
-                       omap_keyboard_latency,
-                       ARRAY_SIZE(omap_keyboard_latency), 0);
+       pdev = omap_device_build(name, id, oh, keypad_data,
+                       sizeof(struct omap4_keypad_platform_data), NULL, 0, 0);
 
-       if (IS_ERR(od)) {
+       if (IS_ERR(pdev)) {
                WARN(1, "Can't build omap_device for %s:%s.\n",
                                                name, oh->name);
-               return PTR_ERR(od);
+               return PTR_ERR(pdev);
        }
        oh->mux = omap_hwmod_mux_init(bdata->pads, bdata->pads_cnt);
 
@@ -263,18 +257,10 @@ int __init omap4_keyboard_init(struct omap4_keypad_platform_data
 }
 
 #if defined(CONFIG_OMAP_MBOX_FWK) || defined(CONFIG_OMAP_MBOX_FWK_MODULE)
-static struct omap_device_pm_latency mbox_latencies[] = {
-       [0] = {
-               .activate_func = omap_device_enable_hwmods,
-               .deactivate_func = omap_device_idle_hwmods,
-               .flags = OMAP_DEVICE_LATENCY_AUTO_ADJUST,
-       },
-};
-
 static inline void omap_init_mbox(void)
 {
        struct omap_hwmod *oh;
-       struct omap_device *od;
+       struct platform_device *pdev;
 
        oh = omap_hwmod_lookup("mailbox");
        if (!oh) {
@@ -282,10 +268,9 @@ static inline void omap_init_mbox(void)
                return;
        }
 
-       od = omap_device_build("omap-mailbox", -1, oh, NULL, 0,
-                               mbox_latencies, ARRAY_SIZE(mbox_latencies), 0);
-       WARN(IS_ERR(od), "%s: could not build device, err %ld\n",
-                                               __func__, PTR_ERR(od));
+       pdev = omap_device_build("omap-mailbox", -1, oh, NULL, 0, NULL, 0, 0);
+       WARN(IS_ERR(pdev), "%s: could not build device, err %ld\n",
+                                               __func__, PTR_ERR(pdev));
 }
 #else
 static inline void omap_init_mbox(void) { }
@@ -330,21 +315,34 @@ static void omap_init_audio(void)
 static inline void omap_init_audio(void) {}
 #endif
 
+#if defined(CONFIG_SND_OMAP_SOC_MCPDM) || \
+               defined(CONFIG_SND_OMAP_SOC_MCPDM_MODULE)
+
+static void omap_init_mcpdm(void)
+{
+       struct omap_hwmod *oh;
+       struct platform_device *pdev;
+
+       oh = omap_hwmod_lookup("mcpdm");
+       if (!oh) {
+               printk(KERN_ERR "Could not look up mcpdm hw_mod\n");
+               return;
+       }
+
+       pdev = omap_device_build("omap-mcpdm", -1, oh, NULL, 0, NULL, 0, 0);
+       WARN(IS_ERR(pdev), "Can't build omap_device for omap-mcpdm.\n");
+}
+#else
+static inline void omap_init_mcpdm(void) {}
+#endif
+
 #if defined(CONFIG_SPI_OMAP24XX) || defined(CONFIG_SPI_OMAP24XX_MODULE)
 
 #include <plat/mcspi.h>
 
-struct omap_device_pm_latency omap_mcspi_latency[] = {
-       [0] = {
-               .deactivate_func = omap_device_idle_hwmods,
-               .activate_func   = omap_device_enable_hwmods,
-               .flags           = OMAP_DEVICE_LATENCY_AUTO_ADJUST,
-       },
-};
-
 static int omap_mcspi_init(struct omap_hwmod *oh, void *unused)
 {
-       struct omap_device *od;
+       struct platform_device *pdev;
        char *name = "omap2_mcspi";
        struct omap2_mcspi_platform_config *pdata;
        static int spi_num;
@@ -371,10 +369,9 @@ static int omap_mcspi_init(struct omap_hwmod *oh, void *unused)
        }
 
        spi_num++;
-       od = omap_device_build(name, spi_num, oh, pdata,
-                               sizeof(*pdata), omap_mcspi_latency,
-                               ARRAY_SIZE(omap_mcspi_latency), 0);
-       WARN(IS_ERR(od), "Can't build omap_device for %s:%s\n",
+       pdev = omap_device_build(name, spi_num, oh, pdata,
+                               sizeof(*pdata), NULL, 0, 0);
+       WARN(IS_ERR(pdev), "Can't build omap_device for %s:%s\n",
                                name, oh->name);
        kfree(pdata);
        return 0;
@@ -676,6 +673,29 @@ static inline void omap_init_vout(void) {}
 
 /*-------------------------------------------------------------------------*/
 
+#if defined(CONFIG_ARCH_OMAP3) && \
+       (defined(CONFIG_OMAP3_THERMAL) || defined(CONFIG_OMAP3_THERMAL_MODULE))
+static void omap_init_temp_sensor(void)
+{
+       struct omap_hwmod *oh;
+       struct platform_device *pdev;
+
+       oh = omap_hwmod_lookup("bandgap_ts");
+       if (!oh) {
+               pr_err("%s: unable to find hwmod\n", __func__);
+               return;
+       }
+
+       pdev = omap_device_build("omap3-thermal", -1, oh, NULL, 0, NULL, 0, 0);
+       WARN(IS_ERR(pdev), "%s: could not build device, err %ld\n",
+                          __func__, PTR_ERR(pdev));
+}
+#else
+static inline void omap_init_temp_sensor(void) {}
+#endif
+
+/*-------------------------------------------------------------------------*/
+
 static int __init omap2_init_devices(void)
 {
        /*
@@ -683,6 +703,7 @@ static int __init omap2_init_devices(void)
         * in alphabetical order so they're easier to sort through.
         */
        omap_init_audio();
+       omap_init_mcpdm();
        omap_init_camera();
        omap_init_mbox();
        omap_init_mcspi();
@@ -692,24 +713,17 @@ static int __init omap2_init_devices(void)
        omap_init_sham();
        omap_init_aes();
        omap_init_vout();
+       omap_init_temp_sensor();
 
        return 0;
 }
 arch_initcall(omap2_init_devices);
 
 #if defined(CONFIG_OMAP_WATCHDOG) || defined(CONFIG_OMAP_WATCHDOG_MODULE)
-static struct omap_device_pm_latency omap_wdt_latency[] = {
-       [0] = {
-               .deactivate_func = omap_device_idle_hwmods,
-               .activate_func   = omap_device_enable_hwmods,
-               .flags           = OMAP_DEVICE_LATENCY_AUTO_ADJUST,
-       },
-};
-
 static int __init omap_init_wdt(void)
 {
        int id = -1;
-       struct omap_device *od;
+       struct platform_device *pdev;
        struct omap_hwmod *oh;
        char *oh_name = "wd_timer2";
        char *dev_name = "omap_wdt";
@@ -723,10 +737,8 @@ static int __init omap_init_wdt(void)
                return -EINVAL;
        }
 
-       od = omap_device_build(dev_name, id, oh, NULL, 0,
-                               omap_wdt_latency,
-                               ARRAY_SIZE(omap_wdt_latency), 0);
-       WARN(IS_ERR(od), "Can't build omap_device for %s:%s.\n",
+       pdev = omap_device_build(dev_name, id, oh, NULL, 0, NULL, 0, 0);
+       WARN(IS_ERR(pdev), "Can't build omap_device for %s:%s.\n",
                                dev_name, oh->name);
        return 0;
 }