Message ID | 20180509172606.29387-26-david@lechnology.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Hi David, On Wednesday 09 May 2018 10:56 PM, David Lechner wrote: > This adds device tree support to the davinci timer so that when clocks > are moved to device tree, the timer will still work. > > Signed-off-by: David Lechner <david@lechnology.com> > --- > +static int __init of_davinci_timer_init(struct device_node *np) > +{ > + struct clk *clk; > + > + clk = of_clk_get(np, 0); > + if (IS_ERR(clk)) { > + struct of_phandle_args clkspec; > + > + /* > + * Fall back to using ref_clk if the actual clock is not > + * available. There will be problems later if the real clock > + * source is disabled. > + */ > + > + pr_warn("%s: falling back to ref_clk\n", __func__); > + > + clkspec.np = of_find_node_by_name(NULL, "ref_clk"); > + if (IS_ERR(clkspec.np)) { > + pr_err("%s: No clock available for timer!\n", __func__); > + return PTR_ERR(clkspec.np); > + } > + clk = of_clk_get_from_provider(&clkspec); > + of_node_put(clkspec.np); > + } Do we need this error path now? Thanks, Sekhar
On 05/17/2018 09:35 AM, Sekhar Nori wrote: > Hi David, > > On Wednesday 09 May 2018 10:56 PM, David Lechner wrote: >> This adds device tree support to the davinci timer so that when clocks >> are moved to device tree, the timer will still work. >> >> Signed-off-by: David Lechner <david@lechnology.com> >> --- > >> +static int __init of_davinci_timer_init(struct device_node *np) >> +{ >> + struct clk *clk; >> + >> + clk = of_clk_get(np, 0); >> + if (IS_ERR(clk)) { >> + struct of_phandle_args clkspec; >> + >> + /* >> + * Fall back to using ref_clk if the actual clock is not >> + * available. There will be problems later if the real clock >> + * source is disabled. >> + */ >> + >> + pr_warn("%s: falling back to ref_clk\n", __func__); >> + >> + clkspec.np = of_find_node_by_name(NULL, "ref_clk"); >> + if (IS_ERR(clkspec.np)) { >> + pr_err("%s: No clock available for timer!\n", __func__); >> + return PTR_ERR(clkspec.np); >> + } >> + clk = of_clk_get_from_provider(&clkspec); >> + of_node_put(clkspec.np); >> + } > > Do we need this error path now? > > Thanks, > Sekhar > No, not really.
On Thursday 17 May 2018 08:39 PM, David Lechner wrote: > On 05/17/2018 09:35 AM, Sekhar Nori wrote: >> Hi David, >> >> On Wednesday 09 May 2018 10:56 PM, David Lechner wrote: >>> This adds device tree support to the davinci timer so that when clocks >>> are moved to device tree, the timer will still work. >>> >>> Signed-off-by: David Lechner <david@lechnology.com> >>> --- >> >>> +static int __init of_davinci_timer_init(struct device_node *np) >>> +{ >>> + struct clk *clk; >>> + >>> + clk = of_clk_get(np, 0); >>> + if (IS_ERR(clk)) { >>> + struct of_phandle_args clkspec; >>> + >>> + /* >>> + * Fall back to using ref_clk if the actual clock is not >>> + * available. There will be problems later if the real clock >>> + * source is disabled. >>> + */ >>> + >>> + pr_warn("%s: falling back to ref_clk\n", __func__); >>> + >>> + clkspec.np = of_find_node_by_name(NULL, "ref_clk"); >>> + if (IS_ERR(clkspec.np)) { >>> + pr_err("%s: No clock available for timer!\n", __func__); >>> + return PTR_ERR(clkspec.np); >>> + } >>> + clk = of_clk_get_from_provider(&clkspec); >>> + of_node_put(clkspec.np); >>> + } >> >> Do we need this error path now? >> >> Thanks, >> Sekhar >> > > No, not really. Then lets just print an error and return the error number. Thanks, Sekhar
On 05/18/2018 01:05 AM, Sekhar Nori wrote: > On Thursday 17 May 2018 08:39 PM, David Lechner wrote: >> On 05/17/2018 09:35 AM, Sekhar Nori wrote: >>> Hi David, >>> >>> On Wednesday 09 May 2018 10:56 PM, David Lechner wrote: >>>> This adds device tree support to the davinci timer so that when clocks >>>> are moved to device tree, the timer will still work. >>>> >>>> Signed-off-by: David Lechner <david@lechnology.com> >>>> --- >>> >>>> +static int __init of_davinci_timer_init(struct device_node *np) >>>> +{ >>>> + struct clk *clk; >>>> + >>>> + clk = of_clk_get(np, 0); >>>> + if (IS_ERR(clk)) { >>>> + struct of_phandle_args clkspec; >>>> + >>>> + /* >>>> + * Fall back to using ref_clk if the actual clock is not >>>> + * available. There will be problems later if the real clock >>>> + * source is disabled. >>>> + */ >>>> + >>>> + pr_warn("%s: falling back to ref_clk\n", __func__); >>>> + >>>> + clkspec.np = of_find_node_by_name(NULL, "ref_clk"); >>>> + if (IS_ERR(clkspec.np)) { >>>> + pr_err("%s: No clock available for timer!\n", __func__); >>>> + return PTR_ERR(clkspec.np); >>>> + } >>>> + clk = of_clk_get_from_provider(&clkspec); >>>> + of_node_put(clkspec.np); >>>> + } >>> >>> Do we need this error path now? >>> >>> Thanks, >>> Sekhar >>> >> >> No, not really. > > Then lets just print an error and return the error number. > OK. FYI, timer_probe() prints the error if we return and error, so I will just return the error.
diff --git a/arch/arm/mach-davinci/Kconfig b/arch/arm/mach-davinci/Kconfig index ba9912b4dfab..da8a039d65f9 100644 --- a/arch/arm/mach-davinci/Kconfig +++ b/arch/arm/mach-davinci/Kconfig @@ -59,6 +59,7 @@ config MACH_DA8XX_DT default y depends on ARCH_DAVINCI_DA850 select PINCTRL + select TIMER_OF help Say y here to include support for TI DaVinci DA850 based using Flattened Device Tree. More information at Documentation/devicetree diff --git a/arch/arm/mach-davinci/time.c b/arch/arm/mach-davinci/time.c index 7ea3db0ff062..184e72922cc1 100644 --- a/arch/arm/mach-davinci/time.c +++ b/arch/arm/mach-davinci/time.c @@ -17,6 +17,7 @@ #include <linux/io.h> #include <linux/clk.h> #include <linux/err.h> +#include <linux/of.h> #include <linux/platform_device.h> #include <linux/sched_clock.h> @@ -397,3 +398,34 @@ void __init davinci_timer_init(struct clk *timer_clk) for (i=0; i< ARRAY_SIZE(timers); i++) timer32_config(&timers[i]); } + +static int __init of_davinci_timer_init(struct device_node *np) +{ + struct clk *clk; + + clk = of_clk_get(np, 0); + if (IS_ERR(clk)) { + struct of_phandle_args clkspec; + + /* + * Fall back to using ref_clk if the actual clock is not + * available. There will be problems later if the real clock + * source is disabled. + */ + + pr_warn("%s: falling back to ref_clk\n", __func__); + + clkspec.np = of_find_node_by_name(NULL, "ref_clk"); + if (IS_ERR(clkspec.np)) { + pr_err("%s: No clock available for timer!\n", __func__); + return PTR_ERR(clkspec.np); + } + clk = of_clk_get_from_provider(&clkspec); + of_node_put(clkspec.np); + } + + davinci_timer_init(clk); + + return 0; +} +TIMER_OF_DECLARE(davinci_timer, "ti,da830-timer", of_davinci_timer_init);
This adds device tree support to the davinci timer so that when clocks are moved to device tree, the timer will still work. Signed-off-by: David Lechner <david@lechnology.com> --- v10 changes: - change compatible to "ti,da830-timer" - remove comment clocks as platform devices v9 changes: - none (there were supposed to be changed, but apparently they got squashed into the next commit - will fix on the next round) v8 changes: - none v7 changes: - rebased - add davinci prefix to commit message v6 changes: - rebased arch/arm/mach-davinci/Kconfig | 1 + arch/arm/mach-davinci/time.c | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+)