aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPeter Ujfalusi <peter.ujfalusi@ti.com>2014-04-03 06:54:41 -0400
committerLee Jones <lee.jones@linaro.org>2014-06-03 03:11:20 -0400
commit68bab8662f49b9e158f1d32f11becd4e48c04079 (patch)
tree7d10c7dd0ca07d390f00982b10079ffdab069975
parent11e38e11afcdd598d0978746924a001e3e7cb723 (diff)
mfd: twl6040: Optional clk32k clock handling
In certain boards the source for the clk32k clock can be gated. In these boards the clk32k clock can be provided to the driver and it is going to be enabled/disabled when it is needed. If the clk32k clock is not provided the driver will assume that it is always running. Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com> Signed-off-by: Lee Jones <lee.jones@linaro.org>
-rw-r--r--Documentation/devicetree/bindings/mfd/twl6040.txt2
-rw-r--r--drivers/mfd/twl6040.c10
-rw-r--r--include/linux/mfd/twl6040.h2
3 files changed, 14 insertions, 0 deletions
diff --git a/Documentation/devicetree/bindings/mfd/twl6040.txt b/Documentation/devicetree/bindings/mfd/twl6040.txt
index 0f5dd709d752..a41157b5d930 100644
--- a/Documentation/devicetree/bindings/mfd/twl6040.txt
+++ b/Documentation/devicetree/bindings/mfd/twl6040.txt
@@ -19,6 +19,8 @@ Required properties:
19 19
20Optional properties, nodes: 20Optional properties, nodes:
21- enable-active-high: To power on the twl6040 during boot. 21- enable-active-high: To power on the twl6040 during boot.
22- clocks: phandle to the clk32k clock provider
23- clock-names: Must be "clk32k"
22 24
23Vibra functionality 25Vibra functionality
24Required properties: 26Required properties:
diff --git a/drivers/mfd/twl6040.c b/drivers/mfd/twl6040.c
index cb37bb8f8e41..574774d7f826 100644
--- a/drivers/mfd/twl6040.c
+++ b/drivers/mfd/twl6040.c
@@ -291,6 +291,8 @@ int twl6040_power(struct twl6040 *twl6040, int on)
291 if (twl6040->power_count++) 291 if (twl6040->power_count++)
292 goto out; 292 goto out;
293 293
294 clk_prepare_enable(twl6040->clk32k);
295
294 /* Allow writes to the chip */ 296 /* Allow writes to the chip */
295 regcache_cache_only(twl6040->regmap, false); 297 regcache_cache_only(twl6040->regmap, false);
296 298
@@ -346,6 +348,8 @@ int twl6040_power(struct twl6040 *twl6040, int on)
346 348
347 twl6040->sysclk = 0; 349 twl6040->sysclk = 0;
348 twl6040->mclk = 0; 350 twl6040->mclk = 0;
351
352 clk_disable_unprepare(twl6040->clk32k);
349 } 353 }
350 354
351out: 355out:
@@ -644,6 +648,12 @@ static int twl6040_probe(struct i2c_client *client,
644 648
645 i2c_set_clientdata(client, twl6040); 649 i2c_set_clientdata(client, twl6040);
646 650
651 twl6040->clk32k = devm_clk_get(&client->dev, "clk32k");
652 if (IS_ERR(twl6040->clk32k)) {
653 dev_info(&client->dev, "clk32k is not handled\n");
654 twl6040->clk32k = NULL;
655 }
656
647 twl6040->supplies[0].supply = "vio"; 657 twl6040->supplies[0].supply = "vio";
648 twl6040->supplies[1].supply = "v2v1"; 658 twl6040->supplies[1].supply = "v2v1";
649 ret = devm_regulator_bulk_get(&client->dev, TWL6040_NUM_SUPPLIES, 659 ret = devm_regulator_bulk_get(&client->dev, TWL6040_NUM_SUPPLIES,
diff --git a/include/linux/mfd/twl6040.h b/include/linux/mfd/twl6040.h
index a69d16b30c18..8f9fc3d26e6d 100644
--- a/include/linux/mfd/twl6040.h
+++ b/include/linux/mfd/twl6040.h
@@ -28,6 +28,7 @@
28#include <linux/interrupt.h> 28#include <linux/interrupt.h>
29#include <linux/mfd/core.h> 29#include <linux/mfd/core.h>
30#include <linux/regulator/consumer.h> 30#include <linux/regulator/consumer.h>
31#include <linux/clk.h>
31 32
32#define TWL6040_REG_ASICID 0x01 33#define TWL6040_REG_ASICID 0x01
33#define TWL6040_REG_ASICREV 0x02 34#define TWL6040_REG_ASICREV 0x02
@@ -223,6 +224,7 @@ struct twl6040 {
223 struct regmap *regmap; 224 struct regmap *regmap;
224 struct regmap_irq_chip_data *irq_data; 225 struct regmap_irq_chip_data *irq_data;
225 struct regulator_bulk_data supplies[2]; /* supplies for vio, v2v1 */ 226 struct regulator_bulk_data supplies[2]; /* supplies for vio, v2v1 */
227 struct clk *clk32k;
226 struct mutex mutex; 228 struct mutex mutex;
227 struct mutex irq_mutex; 229 struct mutex irq_mutex;
228 struct mfd_cell cells[TWL6040_CELLS]; 230 struct mfd_cell cells[TWL6040_CELLS];