mfd: twl6040: Add twl6040-gpio child
authorPeter Ujfalusi <peter.ujfalusi@ti.com>
Thu, 16 Aug 2012 12:13:14 +0000 (15:13 +0300)
committerSamuel Ortiz <sameo@linux.intel.com>
Wed, 19 Sep 2012 10:21:20 +0000 (12:21 +0200)
Add needed platform data structure and code to be able to load
the GPO child of twl6040.
Update the devicetree binding documentation at the same time.

Signed-off-by: Sergio Aguirre <saaguirre@ti.com>
Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
Documentation/devicetree/bindings/mfd/twl6040.txt
drivers/mfd/twl6040-core.c
include/linux/mfd/twl6040.h

index c855240f3a0e0afec8fa3e6870f82dddde00ebcc..0f5dd709d752490815fab1a978b8c2ff1c1f383b 100644 (file)
@@ -1,7 +1,7 @@
 Texas Instruments TWL6040 family
 
-The TWL6040s are 8-channel high quality low-power audio codecs providing audio
-and vibra functionality on OMAP4+ platforms.
+The TWL6040s are 8-channel high quality low-power audio codecs providing audio,
+vibra and GPO functionality on OMAP4+ platforms.
 They are connected ot the host processor via i2c for commands, McPDM for audio
 data and commands.
 
@@ -10,6 +10,8 @@ Required properties:
 - reg: must be 0x4b for i2c address
 - interrupts: twl6040 has one interrupt line connecteded to the main SoC
 - interrupt-parent: The parent interrupt controller
+- gpio-controller:
+- #gpio-cells = <1>: twl6040 provides GPO lines.
 - twl6040,audpwron-gpio: Power on GPIO line for the twl6040
 
 - vio-supply: Regulator for the twl6040 VIO supply
@@ -37,7 +39,6 @@ Example:
 &i2c1 {
        twl6040: twl@4b {
                compatible = "ti,twl6040";
-               reg = <0x4b>;
 
                interrupts = <0 119 4>;
                interrupt-parent = <&gic>;
@@ -60,3 +61,5 @@ Example:
                };
        };
 };
+
+/include/ "twl6040.dtsi"
index 348e1de8e7c1dbb1fd3ae69db2ea9415728778a3..3f2a1cf02fc0697d2c56c3fcb3f84cc8106fda21 100644 (file)
@@ -631,6 +631,21 @@ static int __devinit twl6040_probe(struct i2c_client *client,
                children++;
        }
 
+       /*
+        * Enable the GPO driver in the following cases:
+        * DT booted kernel or legacy boot with valid gpo platform_data
+        */
+       if (!pdata || (pdata && pdata->gpo)) {
+               cell = &twl6040->cells[children];
+               cell->name = "twl6040-gpo";
+
+               if (pdata) {
+                       cell->platform_data = pdata->gpo;
+                       cell->pdata_size = sizeof(*pdata->gpo);
+               }
+               children++;
+       }
+
        ret = mfd_add_devices(&client->dev, -1, twl6040->cells, children,
                              NULL, 0, NULL);
        if (ret)
index 269b7067d360b8cfddc33fd92f4ec09b22e68f88..8991532d439133f596f37c46a34a514148fa6881 100644 (file)
 #define TWL6040_VIBROCDET              0x20
 #define TWL6040_TSHUTDET                0x40
 
-#define TWL6040_CELLS                  2
+#define TWL6040_CELLS                  3
 
 #define TWL6040_REV_ES1_0              0x00
 #define TWL6040_REV_ES1_1              0x01 /* Rev ES1.1 and ES1.2 */
 #define TWL6040_SYSCLK_SEL_LPPLL       0
 #define TWL6040_SYSCLK_SEL_HPPLL       1
 
+#define TWL6040_GPO_MAX        3
+
 struct twl6040_codec_data {
        u16 hs_left_step;
        u16 hs_right_step;
@@ -192,12 +194,17 @@ struct twl6040_vibra_data {
        int vddvibr_uV;                 /* VDDVIBR volt, set 0 for fixed reg */
 };
 
+struct twl6040_gpo_data {
+       int gpio_base;
+};
+
 struct twl6040_platform_data {
        int audpwron_gpio;      /* audio power-on gpio */
        unsigned int irq_base;
 
        struct twl6040_codec_data *codec;
        struct twl6040_vibra_data *vibra;
+       struct twl6040_gpo_data *gpo;
 };
 
 struct regmap;