Commit b06c6987 authored by Tomasz Figa's avatar Tomasz Figa Committed by Mike Turquette

clk: max77686: Register OF clock provider

If max77686 chip is instantiated from device tree, it is desirable to
have an OF clock provider to allow device tree based look-up of clocks.
This patch adds OF clock provider registration to the clk-max77686
driver.
Signed-off-by: default avatarTomasz Figa <t.figa@samsung.com>
Acked-by: default avatarKyungmin Park <kyungmin.park@samsung.com>
Signed-off-by: default avatarMike Turquette <mturquette@linaro.org>
parent 3966c947
Binding for Maxim MAX77686 32k clock generator block
This is a part of device tree bindings of MAX77686 multi-function device.
More information can be found in bindings/mfd/max77686.txt file.
The MAX77686 contains three 32.768khz clock outputs that can be controlled
(gated/ungated) over I2C.
Following properties should be presend in main device node of the MFD chip.
Required properties:
- #clock-cells: simple one-cell clock specifier format is used, where the
only cell is used as an index of the clock inside the provider. Following
indices are allowed:
- 0: 32khz_ap clock,
- 1: 32khz_cp clock,
- 2: 32khz_pmic clock.
Example: Node of the MFD chip
max77686: max77686@09 {
compatible = "maxim,max77686";
interrupt-parent = <&wakeup_eint>;
interrupts = <26 0>;
reg = <0x09>;
#clock-cells = <1>;
/* ... */
};
Example: Clock consumer node
foo@0 {
compatible = "bar,foo";
/* ... */
clock-names = "my-clock";
clocks = <&max77686 2>;
};
...@@ -7,6 +7,9 @@ different i2c slave address,presently for which we are statically creating i2c ...@@ -7,6 +7,9 @@ different i2c slave address,presently for which we are statically creating i2c
client while probing.This document describes the binding for mfd device and client while probing.This document describes the binding for mfd device and
PMIC submodule. PMIC submodule.
Binding for the built-in 32k clock generator block is defined separately
in bindings/clk/maxim,max77686.txt file.
Required properties: Required properties:
- compatible : Must be "maxim,max77686"; - compatible : Must be "maxim,max77686";
- reg : Specifies the i2c slave address of PMIC block. - reg : Specifies the i2c slave address of PMIC block.
......
...@@ -169,6 +169,26 @@ static int max77686_clk_probe(struct platform_device *pdev) ...@@ -169,6 +169,26 @@ static int max77686_clk_probe(struct platform_device *pdev)
platform_set_drvdata(pdev, clocks); platform_set_drvdata(pdev, clocks);
if (iodev->dev->of_node) {
struct clk_onecell_data *of_data;
of_data = devm_kzalloc(&pdev->dev,
sizeof(*of_data), GFP_KERNEL);
if (!of_data) {
ret = -ENOMEM;
goto err_clocks;
}
of_data->clks = clocks;
of_data->clk_num = MAX77686_CLKS_NUM;
ret = of_clk_add_provider(iodev->dev->of_node,
of_clk_src_onecell_get, of_data);
if (ret) {
dev_err(&pdev->dev, "failed to register OF clock provider\n");
goto err_clocks;
}
}
return 0; return 0;
err_clocks: err_clocks:
...@@ -182,9 +202,13 @@ static int max77686_clk_probe(struct platform_device *pdev) ...@@ -182,9 +202,13 @@ static int max77686_clk_probe(struct platform_device *pdev)
static int max77686_clk_remove(struct platform_device *pdev) static int max77686_clk_remove(struct platform_device *pdev)
{ {
struct max77686_dev *iodev = dev_get_drvdata(pdev->dev.parent);
struct clk **clocks = platform_get_drvdata(pdev); struct clk **clocks = platform_get_drvdata(pdev);
int i; int i;
if (iodev->dev->of_node)
of_clk_del_provider(iodev->dev->of_node);
for (i = 0; i < MAX77686_CLKS_NUM; i++) { for (i = 0; i < MAX77686_CLKS_NUM; i++) {
struct clk_hw *hw = __clk_get_hw(clocks[i]); struct clk_hw *hw = __clk_get_hw(clocks[i]);
struct max77686_clk *max77686 = to_max77686_clk(hw); struct max77686_clk *max77686 = to_max77686_clk(hw);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment