Hi Peter, what happened with these patches?
We have them as additions in our Pyra kernel (and they seem to work).
But they did not yet arrive at linux-next.
At least "ARM: dts: omap5-board-common: Add phandle for mclk clock for twl6040" which I have checked.
BR, Nikolaus
Am 10.05.2016 um 11:11 schrieb Peter Ujfalusi peter.ujfalusi@ti.com:
Support for mclk handling via clock API
Signed-off-by: Peter Ujfalusi peter.ujfalusi@ti.com
Documentation/devicetree/bindings/mfd/twl6040.txt | 4 ++-- drivers/mfd/twl6040.c | 28 ++++++++++++++++++----- include/linux/mfd/twl6040.h | 3 ++- 3 files changed, 26 insertions(+), 9 deletions(-)
diff --git a/Documentation/devicetree/bindings/mfd/twl6040.txt b/Documentation/devicetree/bindings/mfd/twl6040.txt index a41157b5d930..e6afdfa3543d 100644 --- a/Documentation/devicetree/bindings/mfd/twl6040.txt +++ b/Documentation/devicetree/bindings/mfd/twl6040.txt @@ -19,8 +19,8 @@ Required properties:
Optional properties, nodes:
- enable-active-high: To power on the twl6040 during boot.
-- clocks: phandle to the clk32k clock provider -- clock-names: Must be "clk32k" +- clocks: phandle to the clk32k and/or to mclk clock provider +- clock-names: Must be "clk32k" for the 32K clock and "mclk" for the MCLK.
Vibra functionality Required properties: diff --git a/drivers/mfd/twl6040.c b/drivers/mfd/twl6040.c index 08a693cd38cc..bcf2bc34a915 100644 --- a/drivers/mfd/twl6040.c +++ b/drivers/mfd/twl6040.c @@ -291,7 +291,7 @@ int twl6040_power(struct twl6040 *twl6040, int on) if (twl6040->power_count++) goto out;
clk_prepare_enable(twl6040->clk32k);
clk_prepare_enable(twl6040->clk32k_clk);
/* Allow writes to the chip */ regcache_cache_only(twl6040->regmap, false);
@@ -349,7 +349,10 @@ int twl6040_power(struct twl6040 *twl6040, int on) twl6040->sysclk = 0; twl6040->mclk = 0;
clk_disable_unprepare(twl6040->clk32k);
if (twl6040->pll == TWL6040_SYSCLK_SEL_HPPLL)
clk_disable_unprepare(twl6040->mclk_clk);
}clk_disable_unprepare(twl6040->clk32k_clk);
out: @@ -421,6 +424,8 @@ int twl6040_set_pll(struct twl6040 *twl6040, int pll_id, ret = -EINVAL; goto pll_out; }
break; case TWL6040_SYSCLK_SEL_HPPLL: /* high-performance PLL can provide only 19.2 MHz */clk_disable_unprepare(twl6040->mclk_clk);
@@ -462,6 +467,9 @@ int twl6040_set_pll(struct twl6040 *twl6040, int pll_id, goto pll_out; }
/* When switching to HPPLL, enable the mclk first */
if (pll_id != twl6040->pll)
clk_prepare_enable(twl6040->mclk_clk); /* * enable clock slicer to ensure input waveform is * square
@@ -645,12 +653,20 @@ static int twl6040_probe(struct i2c_client *client,
i2c_set_clientdata(client, twl6040);
- twl6040->clk32k = devm_clk_get(&client->dev, "clk32k");
- if (IS_ERR(twl6040->clk32k)) {
if (PTR_ERR(twl6040->clk32k) == -EPROBE_DEFER)
- twl6040->clk32k_clk = devm_clk_get(&client->dev, "clk32k");
- if (IS_ERR(twl6040->clk32k_clk)) {
dev_info(&client->dev, "clk32k is not handled\n");if (PTR_ERR(twl6040->clk32k_clk) == -EPROBE_DEFER) return -EPROBE_DEFER;
twl6040->clk32k = NULL;
twl6040->clk32k_clk = NULL;
}
twl6040->mclk_clk = devm_clk_get(&client->dev, "mclk");
if (IS_ERR(twl6040->mclk_clk)) {
if (PTR_ERR(twl6040->mclk_clk) == -EPROBE_DEFER)
return -EPROBE_DEFER;
dev_info(&client->dev, "mclk is not handled\n");
twl6040->mclk_clk = NULL;
}
twl6040->supplies[0].supply = "vio";
diff --git a/include/linux/mfd/twl6040.h b/include/linux/mfd/twl6040.h index 8f9fc3d26e6d..a7c50e54f3e0 100644 --- a/include/linux/mfd/twl6040.h +++ b/include/linux/mfd/twl6040.h @@ -224,7 +224,8 @@ struct twl6040 { struct regmap *regmap; struct regmap_irq_chip_data *irq_data; struct regulator_bulk_data supplies[2]; /* supplies for vio, v2v1 */
- struct clk *clk32k;
- struct clk *clk32k_clk;
- struct clk *mclk_clk; struct mutex mutex; struct mutex irq_mutex; struct mfd_cell cells[TWL6040_CELLS];
-- 2.8.2