r8169: Fix receive buffer length when MTU is between 1515 and 1536
[safe/jmp/linux-2.6] / drivers / mfd / twl4030-core.c
index 8ab9ee8..e424cf6 100644 (file)
@@ -38,6 +38,9 @@
 #include <linux/i2c.h>
 #include <linux/i2c/twl4030.h>
 
+#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)
+#include <mach/cpu.h>
+#endif
 
 /*
  * The TWL4030 "Triton 2" is one of a family of a multi-function "Power
 #define twl_has_madc() false
 #endif
 
+#ifdef CONFIG_TWL4030_POWER
+#define twl_has_power()        true
+#else
+#define twl_has_power()        false
+#endif
+
 #if defined(CONFIG_RTC_DRV_TWL4030) || defined(CONFIG_RTC_DRV_TWL4030_MODULE)
 #define twl_has_rtc()  true
 #else
 #define twl_has_usb()  false
 #endif
 
+#if defined(CONFIG_TWL4030_WATCHDOG) || \
+       defined(CONFIG_TWL4030_WATCHDOG_MODULE)
+#define twl_has_watchdog()        true
+#else
+#define twl_has_watchdog()        false
+#endif
 
 /* Triton Core internal information (BEGIN) */
 
 
 #define TWL4030_NUM_SLAVES             4
 
+#if defined(CONFIG_INPUT_TWL4030_PWRBUTTON) \
+       || defined(CONFIG_INPUT_TWL4030_PWBUTTON_MODULE)
+#define twl_has_pwrbutton()    true
+#else
+#define twl_has_pwrbutton()    false
+#endif
 
 /* Base Address defns for twl4030_map[] */
 
@@ -433,7 +454,7 @@ add_regulator_linked(int num, struct regulator_init_data *pdata,
        if (!pdata)
                return NULL;
 
-       if (consumers && !pdata->consumer_supplies) {
+       if (consumers) {
                pdata->consumer_supplies = consumers;
                pdata->num_consumer_supplies = num_consumers;
        }
@@ -523,6 +544,19 @@ add_children(struct twl4030_platform_data *pdata, unsigned long features)
                usb_transceiver = child;
        }
 
+       if (twl_has_watchdog()) {
+               child = add_child(0, "twl4030_wdt", NULL, 0, false, 0, 0);
+               if (IS_ERR(child))
+                       return PTR_ERR(child);
+       }
+
+       if (twl_has_pwrbutton()) {
+               child = add_child(1, "twl4030_pwrbutton",
+                               NULL, 0, true, pdata->irq_base + 8 + 0, 0);
+               if (IS_ERR(child))
+                       return PTR_ERR(child);
+       }
+
        if (twl_has_regulator()) {
                /*
                child = add_regulator(TWL4030_REG_VPLL1, pdata->vpll1);
@@ -556,9 +590,6 @@ add_children(struct twl4030_platform_data *pdata, unsigned long features)
                static struct regulator_consumer_supply usb3v1 = {
                        .supply =       "usb3v1",
                };
-               static struct regulator_consumer_supply usbcp = {
-                       .supply =       "usbcp",
-               };
 
                /* this is a template that gets copied */
                struct regulator_init_data usb_fixed = {
@@ -573,7 +604,6 @@ add_children(struct twl4030_platform_data *pdata, unsigned long features)
                usb1v5.dev = usb_transceiver;
                usb1v8.dev = usb_transceiver;
                usb3v1.dev = usb_transceiver;
-               usbcp.dev = usb_transceiver;
 
                child = add_regulator_linked(TWL4030_REG_VUSB1V5, &usb_fixed,
                                &usb1v5, 1);
@@ -589,20 +619,13 @@ add_children(struct twl4030_platform_data *pdata, unsigned long features)
                                &usb3v1, 1);
                if (IS_ERR(child))
                        return PTR_ERR(child);
-
-               child = add_regulator_linked(TWL4030_REG_VUSBCP, &usb_fixed,
-                               &usbcp, 1);
-               if (IS_ERR(child))
-                       return PTR_ERR(child);
        }
 
        /* maybe add LDOs that are omitted on cost-reduced parts */
        if (twl_has_regulator() && !(features & TPS_SUBSET)) {
-               /*
                child = add_regulator(TWL4030_REG_VPLL2, pdata->vpll2);
                if (IS_ERR(child))
                        return PTR_ERR(child);
-               */
 
                child = add_regulator(TWL4030_REG_VMMC2, pdata->vmmc2);
                if (IS_ERR(child))
@@ -655,7 +678,7 @@ static inline int __init unprotect_pm_master(void)
        return e;
 }
 
-static void __init clocks_init(void)
+static void clocks_init(struct device *dev)
 {
        int e = 0;
        struct clk *osc;
@@ -664,15 +687,10 @@ static void __init clocks_init(void)
 
 #if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)
        if (cpu_is_omap2430())
-               osc = clk_get(NULL, "osc_ck");
+               osc = clk_get(dev, "osc_ck");
        else
-               osc = clk_get(NULL, "osc_sys_ck");
-#else
-       /* REVISIT for non-OMAP systems, pass the clock rate from
-        * board init code, using platform_data.
-        */
-       osc = ERR_PTR(-EIO);
-#endif
+               osc = clk_get(dev, "osc_sys_ck");
+
        if (IS_ERR(osc)) {
                printk(KERN_WARNING "Skipping twl4030 internal clock init and "
                                "using bootloader value (unknown osc rate)\n");
@@ -682,6 +700,18 @@ static void __init clocks_init(void)
        rate = clk_get_rate(osc);
        clk_put(osc);
 
+#else
+       /* REVISIT for non-OMAP systems, pass the clock rate from
+        * board init code, using platform_data.
+        */
+       osc = ERR_PTR(-EIO);
+
+       printk(KERN_WARNING "Skipping twl4030 internal clock init and "
+              "using bootloader value (unknown osc rate)\n");
+
+       return;
+#endif
+
        switch (rate) {
        case 19200000:
                ctrl = HFCLK_FREQ_19p2_MHZ;
@@ -775,7 +805,11 @@ twl4030_probe(struct i2c_client *client, const struct i2c_device_id *id)
        inuse = true;
 
        /* setup clock framework */
-       clocks_init();
+       clocks_init(&client->dev);
+
+       /* load power event scripts */
+       if (twl_has_power() && pdata->power)
+               twl4030_power_init(pdata->power);
 
        /* Maybe init the T2 Interrupt subsystem */
        if (client->irq