diff mbox

[PATCHv4,07/33] CLK: omap: add support for OMAP gate clock

Message ID 1374564028-11352-8-git-send-email-t-kristo@ti.com (mailing list archive)
State New, archived
Headers show

Commit Message

Tero Kristo July 23, 2013, 7:20 a.m. UTC
This node adds support for a clock node which allows control to the
clockdomain enable / disable.

Signed-off-by: Tero Kristo <t-kristo@ti.com>
---
 drivers/clk/omap/Makefile |    2 +-
 drivers/clk/omap/clk.c    |    1 +
 drivers/clk/omap/gate.c   |   88 +++++++++++++++++++++++++++++++++++++++++++++
 include/linux/clk/omap.h  |    1 +
 4 files changed, 91 insertions(+), 1 deletion(-)
 create mode 100644 drivers/clk/omap/gate.c

Comments

Nishanth Menon July 30, 2013, 7:17 p.m. UTC | #1
On 07/23/2013 02:20 AM, Tero Kristo wrote:
> This node adds support for a clock node which allows control to the
> clockdomain enable / disable.

Dont we have clkdm_enable/disable for the same? should we model 
clockdomain as a clock node?

>
> Signed-off-by: Tero Kristo <t-kristo@ti.com>
> ---
>   drivers/clk/omap/Makefile |    2 +-
>   drivers/clk/omap/clk.c    |    1 +
>   drivers/clk/omap/gate.c   |   88 +++++++++++++++++++++++++++++++++++++++++++++
>   include/linux/clk/omap.h  |    1 +
>   4 files changed, 91 insertions(+), 1 deletion(-)
>   create mode 100644 drivers/clk/omap/gate.c
>

my usual crib: device tree binding documentation is missing

> diff --git a/drivers/clk/omap/Makefile b/drivers/clk/omap/Makefile
> index ca56700..3d3ca30f 100644
> --- a/drivers/clk/omap/Makefile
> +++ b/drivers/clk/omap/Makefile
> @@ -1 +1 @@
> -obj-y					+= clk.o dpll.o autoidle.o
> +obj-y					+= clk.o dpll.o autoidle.o gate.o
> diff --git a/drivers/clk/omap/clk.c b/drivers/clk/omap/clk.c
> index c149097..8c89714 100644
> --- a/drivers/clk/omap/clk.c
> +++ b/drivers/clk/omap/clk.c
> @@ -29,6 +29,7 @@ static const struct of_device_id clk_match[] = {
>   	{.compatible = "divider-clock", .data = of_omap_divider_setup, },
>   	{.compatible = "gate-clock", .data = of_gate_clk_setup, },
>   	{.compatible = "ti,omap4-dpll-clock", .data = of_omap4_dpll_setup, },
> +	{.compatible = "ti,gate-clock", .data = of_omap_gate_clk_setup, },

I am a little lost - is there any SoC dts that actually uses this? at 
least this series does not seem to introduce any node that uses this 
compatibility as per git grep :(

might as well drop the patch?

>   	{},
>   };
>
> diff --git a/drivers/clk/omap/gate.c b/drivers/clk/omap/gate.c
> new file mode 100644
> index 0000000..7186bb2
> --- /dev/null
> +++ b/drivers/clk/omap/gate.c
> @@ -0,0 +1,88 @@
> +/*
> + * OMAP gate clock support
> + *
> + * Copyright (C) 2013 Texas Instruments, Inc.
> + *
> + * Tero Kristo <t-kristo@ti.com>
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License version 2 as
> + * published by the Free Software Foundation.
> + *
> + * This program is distributed "as is" WITHOUT ANY WARRANTY of any
> + * kind, whether express or implied; without even the implied warranty
> + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU General Public License for more details.
> + */
> +
> +#include <linux/clk-provider.h>
> +#include <linux/module.h>
> +#include <linux/slab.h>
> +#include <linux/io.h>
> +#include <linux/err.h>
> +#include <linux/string.h>
> +#include <linux/log2.h>
> +#include <linux/of.h>
> +#include <linux/of_address.h>
> +#include <linux/clk/omap.h>
> +
> +#ifdef CONFIG_OF
> +
> +static const struct clk_ops omap_gate_clk_ops = {
> +	.init		= &omap2_init_clk_clkdm,
> +	.enable		= &omap2_clkops_enable_clkdm,
> +	.disable	= &omap2_clkops_disable_clkdm,
> +};
> +
> +void __init of_omap_gate_clk_setup(struct device_node *node)
> +{
> +	struct clk *clk;
> +	struct clk_init_data init;
init = { 0 };
> +	struct clk_hw_omap *clk_hw;
> +	const char *clk_name = node->name;
> +	int num_parents;
> +	const char **parent_names;
> +	int i;
> +
> +	clk_hw = kzalloc(sizeof(struct clk_hw_omap), GFP_KERNEL);
kzalloc(sizeof(*clk_hw)...) over kzalloc(sizeof(struct clk_hw_omap)...)

> +	if (!clk_hw) {
> +		pr_err("%s: could not allocate clk_hw_omap\n", __func__);
> +		return;
> +	}
> +
> +	clk_hw->hw.init = &init;
> +
> +	of_property_read_string(node, "clock-output-names", &clk_name);
> +	of_property_read_string(node, "ti,clkdm-name", &clk_hw->clkdm_name);
> +
> +	init.name = clk_name;
> +	init.ops = &omap_gate_clk_ops;
> +
> +	num_parents = of_clk_get_parent_count(node);
> +	if (num_parents < 1) {
> +		pr_err("%s: omap trace_clk %s must have parent(s)\n",
> +			__func__, node->name);
CHECK: Alignment should match open parenthesis

> +		goto cleanup;
> +	}
> +
> +	parent_names = kzalloc(sizeof(char *) * num_parents, GFP_KERNEL);
> +
> +	for (i = 0; i < num_parents; i++)
> +		parent_names[i] = of_clk_get_parent_name(node, i);
> +
> +	init.num_parents = num_parents;
> +	init.parent_names = parent_names;
> +
> +	clk = clk_register(NULL, &clk_hw->hw);
> +
> +	if (!IS_ERR(clk)) {
> +		of_clk_add_provider(node, of_clk_src_simple_get, clk);
> +		return;
> +	}
> +
> +cleanup:
kfree(parent_names)?
> +	kfree(clk_hw);
> +}
> +EXPORT_SYMBOL(of_omap_gate_clk_setup);
> +CLK_OF_DECLARE(omap_gate_clk, "ti,omap-gate-clock", of_omap_gate_clk_setup);
> +#endif
> diff --git a/include/linux/clk/omap.h b/include/linux/clk/omap.h
> index 904bdad..58ebb80 100644
> --- a/include/linux/clk/omap.h
> +++ b/include/linux/clk/omap.h
> @@ -194,6 +194,7 @@ extern void omap_dt_clocks_register(struct omap_dt_clk *oclks, int cnt);
>   void of_omap4_dpll_setup(struct device_node *node);
>   void of_omap_fixed_factor_setup(struct device_node *node);
>   void of_omap_divider_setup(struct device_node *node);
> +void of_omap_gate_clk_setup(struct device_node *node);
dont need to export I think if we use strategy mentioned previously.

>   void of_omap_clk_allow_autoidle_all(void);
>   void of_omap_clk_deny_autoidle_all(void);
>
>
Tero Kristo July 31, 2013, 2:45 p.m. UTC | #2
On 07/30/2013 10:17 PM, Nishanth Menon wrote:
> On 07/23/2013 02:20 AM, Tero Kristo wrote:
>> This node adds support for a clock node which allows control to the
>> clockdomain enable / disable.
>
> Dont we have clkdm_enable/disable for the same? should we model
> clockdomain as a clock node?

There was some discussion about having clockdomain code under 
drivers/clk while back, but Mike turned this idea down.

>
>>
>> Signed-off-by: Tero Kristo <t-kristo@ti.com>
>> ---
>>   drivers/clk/omap/Makefile |    2 +-
>>   drivers/clk/omap/clk.c    |    1 +
>>   drivers/clk/omap/gate.c   |   88
>> +++++++++++++++++++++++++++++++++++++++++++++
>>   include/linux/clk/omap.h  |    1 +
>>   4 files changed, 91 insertions(+), 1 deletion(-)
>>   create mode 100644 drivers/clk/omap/gate.c
>>
>
> my usual crib: device tree binding documentation is missing
>
>> diff --git a/drivers/clk/omap/Makefile b/drivers/clk/omap/Makefile
>> index ca56700..3d3ca30f 100644
>> --- a/drivers/clk/omap/Makefile
>> +++ b/drivers/clk/omap/Makefile
>> @@ -1 +1 @@
>> -obj-y                    += clk.o dpll.o autoidle.o
>> +obj-y                    += clk.o dpll.o autoidle.o gate.o
>> diff --git a/drivers/clk/omap/clk.c b/drivers/clk/omap/clk.c
>> index c149097..8c89714 100644
>> --- a/drivers/clk/omap/clk.c
>> +++ b/drivers/clk/omap/clk.c
>> @@ -29,6 +29,7 @@ static const struct of_device_id clk_match[] = {
>>       {.compatible = "divider-clock", .data = of_omap_divider_setup, },
>>       {.compatible = "gate-clock", .data = of_gate_clk_setup, },
>>       {.compatible = "ti,omap4-dpll-clock", .data =
>> of_omap4_dpll_setup, },
>> +    {.compatible = "ti,gate-clock", .data = of_omap_gate_clk_setup, },
>
> I am a little lost - is there any SoC dts that actually uses this? at
> least this series does not seem to introduce any node that uses this
> compatibility as per git grep :(

There is, see patch 08/33 or 28/33.

>
> might as well drop the patch?
>
>>       {},
>>   };
>>
>> diff --git a/drivers/clk/omap/gate.c b/drivers/clk/omap/gate.c
>> new file mode 100644
>> index 0000000..7186bb2
>> --- /dev/null
>> +++ b/drivers/clk/omap/gate.c
>> @@ -0,0 +1,88 @@
>> +/*
>> + * OMAP gate clock support
>> + *
>> + * Copyright (C) 2013 Texas Instruments, Inc.
>> + *
>> + * Tero Kristo <t-kristo@ti.com>
>> + *
>> + * This program is free software; you can redistribute it and/or modify
>> + * it under the terms of the GNU General Public License version 2 as
>> + * published by the Free Software Foundation.
>> + *
>> + * This program is distributed "as is" WITHOUT ANY WARRANTY of any
>> + * kind, whether express or implied; without even the implied warranty
>> + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>> + * GNU General Public License for more details.
>> + */
>> +
>> +#include <linux/clk-provider.h>
>> +#include <linux/module.h>
>> +#include <linux/slab.h>
>> +#include <linux/io.h>
>> +#include <linux/err.h>
>> +#include <linux/string.h>
>> +#include <linux/log2.h>
>> +#include <linux/of.h>
>> +#include <linux/of_address.h>
>> +#include <linux/clk/omap.h>
>> +
>> +#ifdef CONFIG_OF
>> +
>> +static const struct clk_ops omap_gate_clk_ops = {
>> +    .init        = &omap2_init_clk_clkdm,
>> +    .enable        = &omap2_clkops_enable_clkdm,
>> +    .disable    = &omap2_clkops_disable_clkdm,
>> +};
>> +
>> +void __init of_omap_gate_clk_setup(struct device_node *node)
>> +{
>> +    struct clk *clk;
>> +    struct clk_init_data init;
> init = { 0 };

Will add.

>> +    struct clk_hw_omap *clk_hw;
>> +    const char *clk_name = node->name;
>> +    int num_parents;
>> +    const char **parent_names;
>> +    int i;
>> +
>> +    clk_hw = kzalloc(sizeof(struct clk_hw_omap), GFP_KERNEL);
> kzalloc(sizeof(*clk_hw)...) over kzalloc(sizeof(struct clk_hw_omap)...)
>
>> +    if (!clk_hw) {
>> +        pr_err("%s: could not allocate clk_hw_omap\n", __func__);
>> +        return;
>> +    }
>> +
>> +    clk_hw->hw.init = &init;
>> +
>> +    of_property_read_string(node, "clock-output-names", &clk_name);
>> +    of_property_read_string(node, "ti,clkdm-name", &clk_hw->clkdm_name);
>> +
>> +    init.name = clk_name;
>> +    init.ops = &omap_gate_clk_ops;
>> +
>> +    num_parents = of_clk_get_parent_count(node);
>> +    if (num_parents < 1) {
>> +        pr_err("%s: omap trace_clk %s must have parent(s)\n",
>> +            __func__, node->name);
> CHECK: Alignment should match open parenthesis

I still wonder which version of checkpatch you are using.

>
>> +        goto cleanup;
>> +    }
>> +
>> +    parent_names = kzalloc(sizeof(char *) * num_parents, GFP_KERNEL);
>> +
>> +    for (i = 0; i < num_parents; i++)
>> +        parent_names[i] = of_clk_get_parent_name(node, i);
>> +
>> +    init.num_parents = num_parents;
>> +    init.parent_names = parent_names;
>> +
>> +    clk = clk_register(NULL, &clk_hw->hw);
>> +
>> +    if (!IS_ERR(clk)) {
>> +        of_clk_add_provider(node, of_clk_src_simple_get, clk);
>> +        return;
>> +    }
>> +
>> +cleanup:
> kfree(parent_names)?

Yea, will add.

>> +    kfree(clk_hw);
>> +}
>> +EXPORT_SYMBOL(of_omap_gate_clk_setup);
>> +CLK_OF_DECLARE(omap_gate_clk, "ti,omap-gate-clock",
>> of_omap_gate_clk_setup);
>> +#endif
>> diff --git a/include/linux/clk/omap.h b/include/linux/clk/omap.h
>> index 904bdad..58ebb80 100644
>> --- a/include/linux/clk/omap.h
>> +++ b/include/linux/clk/omap.h
>> @@ -194,6 +194,7 @@ extern void omap_dt_clocks_register(struct
>> omap_dt_clk *oclks, int cnt);
>>   void of_omap4_dpll_setup(struct device_node *node);
>>   void of_omap_fixed_factor_setup(struct device_node *node);
>>   void of_omap_divider_setup(struct device_node *node);
>> +void of_omap_gate_clk_setup(struct device_node *node);
> dont need to export I think if we use strategy mentioned previously.

So, we actually had an offline chat with Nishanth, and I will modify the 
init setup like previously suggested by him.

>
>>   void of_omap_clk_allow_autoidle_all(void);
>>   void of_omap_clk_deny_autoidle_all(void);
>>
>>
>
>

--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Nishanth Menon Aug. 1, 2013, 2:33 p.m. UTC | #3
On 07/31/2013 09:45 AM, Tero Kristo wrote:
> On 07/30/2013 10:17 PM, Nishanth Menon wrote:
>> On 07/23/2013 02:20 AM, Tero Kristo wrote:
>>> This node adds support for a clock node which allows control to the
>>> clockdomain enable / disable.
>>
>> Dont we have clkdm_enable/disable for the same? should we model
>> clockdomain as a clock node?
>
> There was some discussion about having clockdomain code under
> drivers/clk while back, but Mike turned this idea down.

then why are we doing this?

 >>> +    .init        = &omap2_init_clk_clkdm,
 >>> +    .enable        = &omap2_clkops_enable_clkdm,
 >>> +    .disable    = &omap2_clkops_disable_clkdm,

is practically doing this in a round about way, no? If Mike no likey 
clkdm going in here, introducing a "pseudo" clk node has no chance of 
going in either.. dont you think so? should we not just try to have our 
clocks first available before we try low power scenarios as next stage?


>
>>
>>>
>>> Signed-off-by: Tero Kristo <t-kristo@ti.com>
>>> ---
>>>   drivers/clk/omap/Makefile |    2 +-
>>>   drivers/clk/omap/clk.c    |    1 +
>>>   drivers/clk/omap/gate.c   |   88
>>> +++++++++++++++++++++++++++++++++++++++++++++
>>>   include/linux/clk/omap.h  |    1 +
>>>   4 files changed, 91 insertions(+), 1 deletion(-)
>>>   create mode 100644 drivers/clk/omap/gate.c
>>>
>>
>> my usual crib: device tree binding documentation is missing
>>
>>> diff --git a/drivers/clk/omap/Makefile b/drivers/clk/omap/Makefile
>>> index ca56700..3d3ca30f 100644
>>> --- a/drivers/clk/omap/Makefile
>>> +++ b/drivers/clk/omap/Makefile
>>> @@ -1 +1 @@
>>> -obj-y                    += clk.o dpll.o autoidle.o
>>> +obj-y                    += clk.o dpll.o autoidle.o gate.o
>>> diff --git a/drivers/clk/omap/clk.c b/drivers/clk/omap/clk.c
>>> index c149097..8c89714 100644
>>> --- a/drivers/clk/omap/clk.c
>>> +++ b/drivers/clk/omap/clk.c
>>> @@ -29,6 +29,7 @@ static const struct of_device_id clk_match[] = {
>>>       {.compatible = "divider-clock", .data = of_omap_divider_setup, },
>>>       {.compatible = "gate-clock", .data = of_gate_clk_setup, },
>>>       {.compatible = "ti,omap4-dpll-clock", .data =
>>> of_omap4_dpll_setup, },
>>> +    {.compatible = "ti,gate-clock", .data = of_omap_gate_clk_setup, },
>>
>> I am a little lost - is there any SoC dts that actually uses this? at
>> least this series does not seem to introduce any node that uses this
>> compatibility as per git grep :(
>
> There is, see patch 08/33 or 28/33.

yes indeed, my bad, looks like my eyesight is no longer what it used to 
be :P.. time for those binocular glasses and a hammer on top of my head 
to remind myself :D


>>> +    of_property_read_string(node, "clock-output-names", &clk_name);
>>> +    of_property_read_string(node, "ti,clkdm-name",
>>> &clk_hw->clkdm_name);
>>> +
>>> +    init.name = clk_name;
>>> +    init.ops = &omap_gate_clk_ops;
>>> +
>>> +    num_parents = of_clk_get_parent_count(node);
>>> +    if (num_parents < 1) {
>>> +        pr_err("%s: omap trace_clk %s must have parent(s)\n",
>>> +            __func__, node->name);
>> CHECK: Alignment should match open parenthesis
>
> I still wonder which version of checkpatch you are using.

hehe, makes me look hawkeyed :P.. no magic here obviously ;)

./scripts/checkpatch.pl --strict

revision: git describe
v3.11-rc3-47-g72195e0
(with all the patches applied).

[...]
>>> +    kfree(clk_hw);
>>> +}
>>> +EXPORT_SYMBOL(of_omap_gate_clk_setup);
>>> +CLK_OF_DECLARE(omap_gate_clk, "ti,omap-gate-clock",
>>> of_omap_gate_clk_setup);
>>> +#endif
>>> diff --git a/include/linux/clk/omap.h b/include/linux/clk/omap.h
>>> index 904bdad..58ebb80 100644
>>> --- a/include/linux/clk/omap.h
>>> +++ b/include/linux/clk/omap.h
>>> @@ -194,6 +194,7 @@ extern void omap_dt_clocks_register(struct
>>> omap_dt_clk *oclks, int cnt);
>>>   void of_omap4_dpll_setup(struct device_node *node);
>>>   void of_omap_fixed_factor_setup(struct device_node *node);
>>>   void of_omap_divider_setup(struct device_node *node);
>>> +void of_omap_gate_clk_setup(struct device_node *node);
>> dont need to export I think if we use strategy mentioned previously.
>
> So, we actually had an offline chat with Nishanth, and I will modify the
> init setup like previously suggested by him.
>
yes, thanks.
Tero Kristo Aug. 1, 2013, 3:29 p.m. UTC | #4
On 08/01/2013 05:33 PM, Nishanth Menon wrote:
> On 07/31/2013 09:45 AM, Tero Kristo wrote:
>> On 07/30/2013 10:17 PM, Nishanth Menon wrote:
>>> On 07/23/2013 02:20 AM, Tero Kristo wrote:
>>>> This node adds support for a clock node which allows control to the
>>>> clockdomain enable / disable.
>>>
>>> Dont we have clkdm_enable/disable for the same? should we model
>>> clockdomain as a clock node?
>>
>> There was some discussion about having clockdomain code under
>> drivers/clk while back, but Mike turned this idea down.
>
> then why are we doing this?
>
>  >>> +    .init        = &omap2_init_clk_clkdm,
>  >>> +    .enable        = &omap2_clkops_enable_clkdm,
>  >>> +    .disable    = &omap2_clkops_disable_clkdm,
>
> is practically doing this in a round about way, no? If Mike no likey
> clkdm going in here, introducing a "pseudo" clk node has no chance of
> going in either.. dont you think so? should we not just try to have our
> clocks first available before we try low power scenarios as next stage?

This is actually for a single hwmod I believe, the emu one. It doesn't 
have proper functional clock control, but instead relies on clkdm being 
up/down. The conversion for this exists as it is part of the 
cclock44xx_data.c at the moment. We could maybe argue removing the hwmod 
for this to get rid of the need for this clock node.

>
>
>>
>>>
>>>>
>>>> Signed-off-by: Tero Kristo <t-kristo@ti.com>
>>>> ---
>>>>   drivers/clk/omap/Makefile |    2 +-
>>>>   drivers/clk/omap/clk.c    |    1 +
>>>>   drivers/clk/omap/gate.c   |   88
>>>> +++++++++++++++++++++++++++++++++++++++++++++
>>>>   include/linux/clk/omap.h  |    1 +
>>>>   4 files changed, 91 insertions(+), 1 deletion(-)
>>>>   create mode 100644 drivers/clk/omap/gate.c
>>>>
>>>
>>> my usual crib: device tree binding documentation is missing
>>>
>>>> diff --git a/drivers/clk/omap/Makefile b/drivers/clk/omap/Makefile
>>>> index ca56700..3d3ca30f 100644
>>>> --- a/drivers/clk/omap/Makefile
>>>> +++ b/drivers/clk/omap/Makefile
>>>> @@ -1 +1 @@
>>>> -obj-y                    += clk.o dpll.o autoidle.o
>>>> +obj-y                    += clk.o dpll.o autoidle.o gate.o
>>>> diff --git a/drivers/clk/omap/clk.c b/drivers/clk/omap/clk.c
>>>> index c149097..8c89714 100644
>>>> --- a/drivers/clk/omap/clk.c
>>>> +++ b/drivers/clk/omap/clk.c
>>>> @@ -29,6 +29,7 @@ static const struct of_device_id clk_match[] = {
>>>>       {.compatible = "divider-clock", .data = of_omap_divider_setup, },
>>>>       {.compatible = "gate-clock", .data = of_gate_clk_setup, },
>>>>       {.compatible = "ti,omap4-dpll-clock", .data =
>>>> of_omap4_dpll_setup, },
>>>> +    {.compatible = "ti,gate-clock", .data = of_omap_gate_clk_setup, },
>>>
>>> I am a little lost - is there any SoC dts that actually uses this? at
>>> least this series does not seem to introduce any node that uses this
>>> compatibility as per git grep :(
>>
>> There is, see patch 08/33 or 28/33.
>
> yes indeed, my bad, looks like my eyesight is no longer what it used to
> be :P.. time for those binocular glasses and a hammer on top of my head
> to remind myself :D
>
>
>>>> +    of_property_read_string(node, "clock-output-names", &clk_name);
>>>> +    of_property_read_string(node, "ti,clkdm-name",
>>>> &clk_hw->clkdm_name);
>>>> +
>>>> +    init.name = clk_name;
>>>> +    init.ops = &omap_gate_clk_ops;
>>>> +
>>>> +    num_parents = of_clk_get_parent_count(node);
>>>> +    if (num_parents < 1) {
>>>> +        pr_err("%s: omap trace_clk %s must have parent(s)\n",
>>>> +            __func__, node->name);
>>> CHECK: Alignment should match open parenthesis
>>
>> I still wonder which version of checkpatch you are using.
>
> hehe, makes me look hawkeyed :P.. no magic here obviously ;)
>
> ./scripts/checkpatch.pl --strict
>
> revision: git describe
> v3.11-rc3-47-g72195e0
> (with all the patches applied).
>
> [...]
>>>> +    kfree(clk_hw);
>>>> +}
>>>> +EXPORT_SYMBOL(of_omap_gate_clk_setup);
>>>> +CLK_OF_DECLARE(omap_gate_clk, "ti,omap-gate-clock",
>>>> of_omap_gate_clk_setup);
>>>> +#endif
>>>> diff --git a/include/linux/clk/omap.h b/include/linux/clk/omap.h
>>>> index 904bdad..58ebb80 100644
>>>> --- a/include/linux/clk/omap.h
>>>> +++ b/include/linux/clk/omap.h
>>>> @@ -194,6 +194,7 @@ extern void omap_dt_clocks_register(struct
>>>> omap_dt_clk *oclks, int cnt);
>>>>   void of_omap4_dpll_setup(struct device_node *node);
>>>>   void of_omap_fixed_factor_setup(struct device_node *node);
>>>>   void of_omap_divider_setup(struct device_node *node);
>>>> +void of_omap_gate_clk_setup(struct device_node *node);
>>> dont need to export I think if we use strategy mentioned previously.
>>
>> So, we actually had an offline chat with Nishanth, and I will modify the
>> init setup like previously suggested by him.
>>
> yes, thanks.
>
>

--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/drivers/clk/omap/Makefile b/drivers/clk/omap/Makefile
index ca56700..3d3ca30f 100644
--- a/drivers/clk/omap/Makefile
+++ b/drivers/clk/omap/Makefile
@@ -1 +1 @@ 
-obj-y					+= clk.o dpll.o autoidle.o
+obj-y					+= clk.o dpll.o autoidle.o gate.o
diff --git a/drivers/clk/omap/clk.c b/drivers/clk/omap/clk.c
index c149097..8c89714 100644
--- a/drivers/clk/omap/clk.c
+++ b/drivers/clk/omap/clk.c
@@ -29,6 +29,7 @@  static const struct of_device_id clk_match[] = {
 	{.compatible = "divider-clock", .data = of_omap_divider_setup, },
 	{.compatible = "gate-clock", .data = of_gate_clk_setup, },
 	{.compatible = "ti,omap4-dpll-clock", .data = of_omap4_dpll_setup, },
+	{.compatible = "ti,gate-clock", .data = of_omap_gate_clk_setup, },
 	{},
 };
 
diff --git a/drivers/clk/omap/gate.c b/drivers/clk/omap/gate.c
new file mode 100644
index 0000000..7186bb2
--- /dev/null
+++ b/drivers/clk/omap/gate.c
@@ -0,0 +1,88 @@ 
+/*
+ * OMAP gate clock support
+ *
+ * Copyright (C) 2013 Texas Instruments, Inc.
+ *
+ * Tero Kristo <t-kristo@ti.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed "as is" WITHOUT ANY WARRANTY of any
+ * kind, whether express or implied; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#include <linux/clk-provider.h>
+#include <linux/module.h>
+#include <linux/slab.h>
+#include <linux/io.h>
+#include <linux/err.h>
+#include <linux/string.h>
+#include <linux/log2.h>
+#include <linux/of.h>
+#include <linux/of_address.h>
+#include <linux/clk/omap.h>
+
+#ifdef CONFIG_OF
+
+static const struct clk_ops omap_gate_clk_ops = {
+	.init		= &omap2_init_clk_clkdm,
+	.enable		= &omap2_clkops_enable_clkdm,
+	.disable	= &omap2_clkops_disable_clkdm,
+};
+
+void __init of_omap_gate_clk_setup(struct device_node *node)
+{
+	struct clk *clk;
+	struct clk_init_data init;
+	struct clk_hw_omap *clk_hw;
+	const char *clk_name = node->name;
+	int num_parents;
+	const char **parent_names;
+	int i;
+
+	clk_hw = kzalloc(sizeof(struct clk_hw_omap), GFP_KERNEL);
+	if (!clk_hw) {
+		pr_err("%s: could not allocate clk_hw_omap\n", __func__);
+		return;
+	}
+
+	clk_hw->hw.init = &init;
+
+	of_property_read_string(node, "clock-output-names", &clk_name);
+	of_property_read_string(node, "ti,clkdm-name", &clk_hw->clkdm_name);
+
+	init.name = clk_name;
+	init.ops = &omap_gate_clk_ops;
+
+	num_parents = of_clk_get_parent_count(node);
+	if (num_parents < 1) {
+		pr_err("%s: omap trace_clk %s must have parent(s)\n",
+			__func__, node->name);
+		goto cleanup;
+	}
+
+	parent_names = kzalloc(sizeof(char *) * num_parents, GFP_KERNEL);
+
+	for (i = 0; i < num_parents; i++)
+		parent_names[i] = of_clk_get_parent_name(node, i);
+
+	init.num_parents = num_parents;
+	init.parent_names = parent_names;
+
+	clk = clk_register(NULL, &clk_hw->hw);
+
+	if (!IS_ERR(clk)) {
+		of_clk_add_provider(node, of_clk_src_simple_get, clk);
+		return;
+	}
+
+cleanup:
+	kfree(clk_hw);
+}
+EXPORT_SYMBOL(of_omap_gate_clk_setup);
+CLK_OF_DECLARE(omap_gate_clk, "ti,omap-gate-clock", of_omap_gate_clk_setup);
+#endif
diff --git a/include/linux/clk/omap.h b/include/linux/clk/omap.h
index 904bdad..58ebb80 100644
--- a/include/linux/clk/omap.h
+++ b/include/linux/clk/omap.h
@@ -194,6 +194,7 @@  extern void omap_dt_clocks_register(struct omap_dt_clk *oclks, int cnt);
 void of_omap4_dpll_setup(struct device_node *node);
 void of_omap_fixed_factor_setup(struct device_node *node);
 void of_omap_divider_setup(struct device_node *node);
+void of_omap_gate_clk_setup(struct device_node *node);
 void of_omap_clk_allow_autoidle_all(void);
 void of_omap_clk_deny_autoidle_all(void);