clk: davinci: outstanding fixes
Subsystems (2)
David Lechner
maintainercover clk: davinci: outstanding fixes
This is a resend of all of the outstanding DaVinci clock patches plus one new patch. All of the patches (except the new one) have been reviewed and tested by someone other than me.
The new patch ("clk: davinci: Fix link errors when not all SoCs are enabled") should be fairly trivial.
I am resending them all in one series to hopefully make it easier to get them picked up by having them in the correct order to avoid merge conflicts. This series is based on the clk/clk-davinci-psc-da830 branch.
David Lechner (7):
clk: davinci: pll-dm355: drop pll2_sysclk2
clk: davinci: pll-dm355: fix SYSCLKn parent names
clk: davinci: psc-dm355: fix ASP0/1 clkdev lookups
clk: davinci: pll: allow dev == NULL
clk: davinci: da850-pll: change PLL0 to CLK_OF_DECLARE
clk: davinci: psc: allow for dev == NULL
clk: davinci: Fix link errors when not all SoCs are enabled
Sekhar Nori (2):
clk: davinci: pll-dm646x: keep PLL2 SYSCLK1 always enabled
clk: davinci: psc-dm365: fix few clocks
drivers/clk/davinci/pll-da830.c | 5 +- drivers/clk/davinci/pll-da850.c | 37 ++-- drivers/clk/davinci/pll-dm355.c | 22 ++- drivers/clk/davinci/pll-dm365.c | 9 +- drivers/clk/davinci/pll-dm644x.c | 9 +- drivers/clk/davinci/pll-dm646x.c | 11 +- drivers/clk/davinci/pll.c | 299 +++++++++++++++++++++---------- drivers/clk/davinci/pll.h | 41 +++-- drivers/clk/davinci/psc-dm355.c | 7 +- drivers/clk/davinci/psc-dm365.c | 22 ++- drivers/clk/davinci/psc-dm644x.c | 3 +- drivers/clk/davinci/psc-dm646x.c | 3 +- drivers/clk/davinci/psc.c | 72 ++++++-- drivers/clk/davinci/psc.h | 12 ++ include/linux/clk/davinci.h | 40 +++++ 15 files changed, 418 insertions(+), 174 deletions(-) create mode 100644 include/linux/clk/davinci.h
Signature · 1 line
2.17.0
David Lechner
maintainerPATCH 1/9 clk: davinci: pll-dm355: drop pll2_sysclk2
This removes pll2_sysclk2 from the TI DM355 clock driver. This SoC doesn't have such a clock. Also, SYSCLK_ALWAYS_ENABLED is transferred to pll2_sysclk1 since it drives the DDR and doesn't have another mechanism to keep it on.
--- drivers/clk/davinci/pll-dm355.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-)
drivers/clk/davinci/pll-dm355.c +1 -4
@@ -62,8 +62,7 @@ static const struct davinci_pll_clk_info dm355_pll2_info = {PLL_POSTDIV_ALWAYS_ENABLED |PLL_POSTDIV_FIXED_DIV , }; -SYSCLK (1 , pll2_sysclk1, pll2,5 ,SYSCLK_FIXED_DIV ); -SYSCLK (2 , pll2_sysclk2, pll2,5 ,SYSCLK_FIXED_DIV |SYSCLK_ALWAYS_ENABLED ); +SYSCLK (1 , pll2_sysclk1, pll2,5 ,SYSCLK_FIXED_DIV |SYSCLK_ALWAYS_ENABLED );int dm355_pll2_init (struct device *dev,void __iomem *base) {
@@ -71,8 +70,6 @@ int dm355_pll2_init(struct device *dev, void __iomem *base)davinci_pll_sysclk_register (dev, &pll2_sysclk1, base); -davinci_pll_sysclk_register (dev, &pll2_sysclk2, base); -davinci_pll_sysclkbp_clk_register (dev,"pll2_sysclkbp" , base);return 0 ;
Signature · 1 line
2.17.0
David Lechner
maintainerPATCH 2/9 clk: davinci: pll-dm355: fix SYSCLKn parent names
In reply to David LechnerThis fixes the parent clock names of the SYSCLKn clocks for the DM355 SoC in the TI DaVinici PLL clock driver.
It appears that this name just didn't get updated to the correct name like the other SoCs during the driver's development.
--- drivers/clk/davinci/pll-dm355.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
drivers/clk/davinci/pll-dm355.c +5 -5
@@ -22,10 +22,10 @@ static const struct davinci_pll_clk_info dm355_pll1_info = {PLL_POSTDIV_ALWAYS_ENABLED |PLL_POSTDIV_FIXED_DIV , }; -SYSCLK (1 , pll1_sysclk1, pll1,5 ,SYSCLK_FIXED_DIV |SYSCLK_ALWAYS_ENABLED ); -SYSCLK (2 , pll1_sysclk2, pll1,5 ,SYSCLK_FIXED_DIV |SYSCLK_ALWAYS_ENABLED ); -SYSCLK (3 , pll1_sysclk3, pll1,5 ,SYSCLK_ALWAYS_ENABLED ); -SYSCLK (4 , pll1_sysclk4, pll1,5 ,SYSCLK_ALWAYS_ENABLED ); +SYSCLK (1 , pll1_sysclk1, pll1_pllen,5 ,SYSCLK_FIXED_DIV |SYSCLK_ALWAYS_ENABLED ); +SYSCLK (2 , pll1_sysclk2, pll1_pllen,5 ,SYSCLK_FIXED_DIV |SYSCLK_ALWAYS_ENABLED ); +SYSCLK (3 , pll1_sysclk3, pll1_pllen,5 ,SYSCLK_ALWAYS_ENABLED ); +SYSCLK (4 , pll1_sysclk4, pll1_pllen,5 ,SYSCLK_ALWAYS_ENABLED );int dm355_pll1_init (struct device *dev,void __iomem *base) {
@@ -62,7 +62,7 @@ static const struct davinci_pll_clk_info dm355_pll2_info = {PLL_POSTDIV_ALWAYS_ENABLED |PLL_POSTDIV_FIXED_DIV , }; -SYSCLK (1 , pll2_sysclk1, pll2,5 ,SYSCLK_FIXED_DIV |SYSCLK_ALWAYS_ENABLED ); +SYSCLK (1 , pll2_sysclk1, pll2_pllen,5 ,SYSCLK_FIXED_DIV |SYSCLK_ALWAYS_ENABLED );int dm355_pll2_init (struct device *dev,void __iomem *base) {
Signature · 1 line
2.17.0
David Lechner
maintainerPATCH 3/9 clk: davinci: psc-dm355: fix ASP0/1 clkdev lookups
In reply to David LechnerThe clkdev lookups for the ASP0/1 devices on TI DM355 were declared, but not assigned to any LPSC. This assigns the clkdev lookups to the correct LPSCs.
--- drivers/clk/davinci/psc-dm355.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/clk/davinci/psc-dm355.c +2 -2
@@ -41,14 +41,14 @@ static const struct davinci_lpsc_clk_info dm355_psc_info[] = {LPSC (5 ,0 , timer3, pll1_auxclk,NULL ,0 ),LPSC (6 ,0 , spi1, pll1_sysclk2, spi1_clkdev,0 ),LPSC (7 ,0 , mmcsd1, pll1_sysclk2, mmcsd1_clkdev,0 ), -LPSC (8 ,0 , asp1, pll1_sysclk2,NULL ,0 ), +LPSC (8 ,0 , asp1, pll1_sysclk2, mcbsp1_clkdev,0 ),LPSC (9 ,0 , usb, pll1_sysclk2, usb_clkdev,0 ),LPSC (10 ,0 , pwm3, pll1_auxclk,NULL ,0 ),LPSC (11 ,0 , spi2, pll1_sysclk2, spi2_clkdev,0 ),LPSC (12 ,0 , rto, pll1_auxclk,NULL ,0 ),LPSC (14 ,0 , aemif, pll1_sysclk2, aemif_clkdev,0 ),LPSC (15 ,0 , mmcsd0, pll1_sysclk2, mmcsd0_clkdev,0 ), -LPSC (17 ,0 , asp0, pll1_sysclk2,NULL ,0 ), +LPSC (17 ,0 , asp0, pll1_sysclk2, mcbsp0_clkdev,0 ),LPSC (18 ,0 , i2c, pll1_auxclk, i2c_clkdev,0 ),LPSC (19 ,0 , uart0, pll1_auxclk, uart0_clkdev,0 ), LPSC(20, 0, uart1, pll1_auxclk, uart1_clkdev, 0),
Signature · 1 line
2.17.0
David Lechner
maintainerPATCH 4/9 clk: davinci: pll-dm646x: keep PLL2 SYSCLK1 always enabled
In reply to David LechnerFrom: Sekhar Nori <[email protected]>
PLL2 SYSCLK1 on DM646x is connected to DDR2 PHY and cannot be disabled. Mark it so to prevent unused clock disable infrastructure from disabling it.
--- drivers/clk/davinci/pll-dm646x.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/clk/davinci/pll-dm646x.c +1 -1
@@ -72,7 +72,7 @@ static const struct davinci_pll_clk_info dm646x_pll2_info = { .flags = 0, }; -SYSCLK (1 , pll2_sysclk1, pll2_pllen,4 ,0 ); +SYSCLK (1 , pll2_sysclk1, pll2_pllen,4 ,SYSCLK_ALWAYS_ENABLED );int dm646x_pll2_init (struct device *dev,void __iomem *base) {
Signature · 1 line
2.17.0
Re: [PATCH 4/9] clk: davinci: pll-dm646x: keep PLL2 SYSCLK1 always enabled
Quoting David Lechner (2018-05-25 11:11:45)
Quoted 17 lines
From: Sekhar Nori <[email protected]>
PLL2 SYSCLK1 on DM646x is connected to DDR2 PHY and cannot be disabled. Mark it so to prevent unused clock disable infrastructure from disabling it.
Signed-off-by Sekhar Nori <[email protected]>Reviewed-by David Lechner <[email protected]>--- drivers/clk/davinci/pll-dm646x.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)drivers/clk/davinci/pll-dm646x.c +0
-0
drivers/clk/davinci/pll-dm646x.c static const struct davinci_pll_clk_info dm646x_pll2_info = { · line 75
Quoted 5 lines
drivers/clk/davinci/pll-dm646x.c +1
-1@@ -72,7 +72,7 @@ static const struct davinci_pll_clk_info dm646x_pll2_info = { .flags = 0, }; -SYSCLK (1 , pll2_sysclk1, pll2_pllen,4 ,0 ); +SYSCLK (1 , pll2_sysclk1, pll2_pllen,4 ,SYSCLK_ALWAYS_ENABLED );
Nitpick: I dislike setting a platform-specific flag that just sets a framework-specific flag during clk registration.
I know there is some legacy here so I'll take this patch as-is, but perhaps cleaning this up to directly use CLK_IS_CRITICAL can be added to someone's todo list?
Thanks,
Mike
Quoted 6 lines
drivers/clk/davinci/pll-dm646x.c +0
-0int dm646x_pll2_init (struct device *dev,void __iomem *base) {Signature · 1 line
2.17.0
David Lechner
maintainerRe: [PATCH 4/9] clk: davinci: pll-dm646x: keep PLL2 SYSCLK1 always enabled
Quoted 27 lines · Michael Turquette
Quoting David Lechner (2018-05-25 11:11:45)
Quoted 17 lines
From: Sekhar Nori <[email protected]>
PLL2 SYSCLK1 on DM646x is connected to DDR2 PHY and cannot be disabled. Mark it so to prevent unused clock disable infrastructure from disabling it.
Signed-off-by Sekhar Nori <[email protected]>Reviewed-by David Lechner <[email protected]>--- drivers/clk/davinci/pll-dm646x.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)drivers/clk/davinci/pll-dm646x.c +0
-0drivers/clk/davinci/pll-dm646x.c static const struct davinci_pll_clk_info dm646x_pll2_info = { · line 75
Quoted 5 lines
drivers/clk/davinci/pll-dm646x.c +1
-1@@ -72,7 +72,7 @@ static const struct davinci_pll_clk_info dm646x_pll2_info = { .flags = 0, }; -SYSCLK (1 , pll2_sysclk1, pll2_pllen,4 ,0 ); +SYSCLK (1 , pll2_sysclk1, pll2_pllen,4 ,SYSCLK_ALWAYS_ENABLED );Nitpick: I dislike setting a platform-specific flag that just sets a framework-specific flag during clk registration.
Quoted 3 lines
I know there is some legacy here so I'll take this patch as-is, but perhaps cleaning this up to directly use
CLK_IS_CRITICALcan be added to someone's todo list?
I can see how this would be better in general, but I don't think it would be an improvement in this case. We have other platform-specific flags that don't correspond to common framework flags (only the one you pointed out does). So, we would have to introduce a second flags variable for the common framework flags (unless I am missing something, like a reserved range of bits for platform-specific flags that would allow platform-specific flags and common framework flags to coexist in a single 32 or 64-bit field). Then we would have to add comments saying that CLK_IS_CRITICAL is the only flag that you can use for this field because we really don't want someone to try to use any other common framework flags. This seems like quite a bit of effort just to try to avoid one redundant flag.
David Lechner
maintainerPATCH 5/9 clk: davinci: psc-dm365: fix few clocks
In reply to David LechnerFrom: Sekhar Nori <[email protected]>
Fix parent of EMAC and voice codec PSC clocks. Documentation is clear on EMAC clock parent, but its not fully clear on parent of voice codec clock. The implementation chosen is matches arch/arm/mach-davinci/dm365.c. Add a comment explaining this for posterity.
There is only one power domain on DM365. Fix the power domain of voice codec and vpss dac modules.
While at it, add a comment explaining how the parent of vpss dac clock was derived. Note that this patch does not touch the parent of vpss dac clock.
--- drivers/clk/davinci/psc-dm365.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-)
drivers/clk/davinci/psc-dm365.c +16 -3
@@ -65,9 +65,22 @@ static const struct davinci_lpsc_clk_info dm365_psc_info[] = {LPSC (31 ,0 , arm, pll2_sysclk2,NULL ,LPSC_ALWAYS_ENABLED ),LPSC (38 ,0 , spi3, pll1_sysclk4, spi3_clkdev,0 ),LPSC (39 ,0 , spi4, pll1_auxclk, spi4_clkdev,0 ), -LPSC (40 ,0 , emac, pll2_sysclk4, emac_clkdev,0 ), -LPSC (44 ,1 , voice_codec, pll1_sysclk3, voice_codec_clkdev,0 ), -LPSC (46 ,1 , vpss_dac, pll1_sysclk3, vpss_dac_clkdev,0 ), +LPSC (40 ,0 , emac, pll1_sysclk4, emac_clkdev,0 ), +/* +* The TRM (ARM Subsystem User's Guide) shows two clocks input into +* voice codec module (PLL2 SYSCLK4 with a DIV2 and PLL1 SYSCLK4). Its +* not fully clear from documentation which clock should be considered +* as parent for PSC. The clock chosen here is to maintain +* compatibility with existing code in arch/arm/mach-davinci/dm365.c +*/ +LPSC (44 ,0 , voice_codec, pll2_sysclk4, voice_codec_clkdev,0 ), +/* +* Its not fully clear from TRM (ARM Subsystem User's Guide) as to what +* the parent of VPSS DAC LPSC should actually be. PLL1 SYSCLK3 feeds +* into HDVICP and MJCP. The clock chosen here is to remain compatible +* with code existing in arch/arm/mach-davinci/dm365.c +*/ +LPSC (46 ,0 , vpss_dac, pll1_sysclk3, vpss_dac_clkdev,0 ),LPSC (47 ,0 , vpss_master, pll1_sysclk5, vpss_master_clkdev,0 ), LPSC(50, 0, mjcp, pll1_sysclk3, NULL, 0), { }
Signature · 1 line
2.17.0
David Lechner
maintainerPATCH 6/9 clk: davinci: pll: allow dev == NULL
In reply to David LechnerThis modifies the TI Davinci PLL clock driver to allow for the case when dev == NULL. On some (most) SoCs that use this driver, the PLL clock needs to be registered during early boot because it is used for clocksource/clkevent and there will be no platform device available.
--- drivers/clk/davinci/pll-da830.c | 5 +- drivers/clk/davinci/pll-da850.c | 22 +-- drivers/clk/davinci/pll-dm355.c | 9 +- drivers/clk/davinci/pll-dm365.c | 9 +- drivers/clk/davinci/pll-dm644x.c | 9 +- drivers/clk/davinci/pll-dm646x.c | 9 +- drivers/clk/davinci/pll.c | 279 +++++++++++++++++++++---------- drivers/clk/davinci/pll.h | 30 ++-- include/linux/clk/davinci.h | 24 +++ 9 files changed, 259 insertions(+), 137 deletions(-) create mode 100644 include/linux/clk/davinci.h
drivers/clk/davinci/pll-da830.c +3 -2
@@ -6,6 +6,7 @@*/ #include <linux/clkdev.h> +#include <linux/clk/davinci.h> #include <linux/bitops.h> #include <linux/init.h> #include <linux/types.h>
@@ -36,11 +37,11 @@ SYSCLK(5, pll0_sysclk5, pll0_pllen, 5, 0);SYSCLK (6 , pll0_sysclk6, pll0_pllen,5 ,SYSCLK_FIXED_DIV );SYSCLK (7 , pll0_sysclk7, pll0_pllen,5 ,0 ); -int da830_pll_init (struct device *dev,void __iomem *base) +int da830_pll_init (struct device *dev,void __iomem *base,struct regmap *cfgchip) {struct clk *clk; -davinci_pll_clk_register (dev, &da830_pll_info,"ref_clk" , base); +davinci_pll_clk_register (dev, &da830_pll_info,"ref_clk" , base, cfgchip); clk =davinci_pll_sysclk_register (dev, &pll0_sysclk2, base);clk_register_clkdev (clk,"pll0_sysclk2" ,"da830-psc0" );
drivers/clk/davinci/pll-da850.c +12 -10
@@ -7,7 +7,9 @@#include <linux/bitops.h> #include <linux/clk-provider.h> +#include <linux/clk/davinci.h> #include <linux/clkdev.h> +#include <linux/device.h> #include <linux/init.h> #include <linux/kernel.h> #include <linux/mfd/da8xx-cfgchip.h>
@@ -81,11 +83,11 @@ static const struct davinci_pll_obsclk_info da850_pll0_obsclk_info = { .ocsrc_mask = GENMASK(4, 0), }; -int da850_pll0_init (struct device *dev,void __iomem *base) +int da850_pll0_init (struct device *dev,void __iomem *base,struct regmap *cfgchip) {struct clk *clk; -davinci_pll_clk_register (dev, &da850_pll0_info,"ref_clk" , base); +davinci_pll_clk_register (dev, &da850_pll0_info,"ref_clk" , base, cfgchip); clk =davinci_pll_sysclk_register (dev, &pll0_sysclk1, base);clk_register_clkdev (clk,"pll0_sysclk1" ,"da850-psc0" );
@@ -134,11 +136,11 @@ static const struct davinci_pll_sysclk_info *da850_pll0_sysclk_info[] = {NULL }; -int of_da850_pll0_init (struct device *dev,void __iomem *base) +int of_da850_pll0_init (struct device *dev,void __iomem *base,struct regmap *cfgchip) { -return of_davinci_pll_init (dev, &da850_pll0_info, +return of_davinci_pll_init (dev, dev->of_node, &da850_pll0_info, &da850_pll0_obsclk_info, - da850_pll0_sysclk_info,7 , base); + da850_pll0_sysclk_info,7 , base, cfgchip); }static const struct davinci_pll_clk_info da850_pll1_info = {
@@ -179,11 +181,11 @@ static const struct davinci_pll_obsclk_info da850_pll1_obsclk_info = { .ocsrc_mask = GENMASK(4, 0), }; -int da850_pll1_init (struct device *dev,void __iomem *base) +int da850_pll1_init (struct device *dev,void __iomem *base,struct regmap *cfgchip) {struct clk *clk; -davinci_pll_clk_register (dev, &da850_pll1_info,"oscin" , base); +davinci_pll_clk_register (dev, &da850_pll1_info,"oscin" , base, cfgchip);davinci_pll_sysclk_register (dev, &pll1_sysclk1, base);
@@ -204,9 +206,9 @@ static const struct davinci_pll_sysclk_info *da850_pll1_sysclk_info[] = { NULL }; -int of_da850_pll1_init (struct device *dev,void __iomem *base) +int of_da850_pll1_init (struct device *dev,void __iomem *base,struct regmap *cfgchip) { -return of_davinci_pll_init (dev, &da850_pll1_info, +return of_davinci_pll_init (dev, dev->of_node, &da850_pll1_info, &da850_pll1_obsclk_info, - da850_pll1_sysclk_info,3 , base); + da850_pll1_sysclk_info,3 , base, cfgchip); }
drivers/clk/davinci/pll-dm355.c +5 -4
@@ -6,6 +6,7 @@*/ #include <linux/bitops.h> +#include <linux/clk/davinci.h> #include <linux/clkdev.h> #include <linux/init.h> #include <linux/types.h>
@@ -27,11 +28,11 @@ SYSCLK(2, pll1_sysclk2, pll1_pllen, 5, SYSCLK_FIXED_DIV | SYSCLK_ALWAYS_ENABLED)SYSCLK (3 , pll1_sysclk3, pll1_pllen,5 ,SYSCLK_ALWAYS_ENABLED );SYSCLK (4 , pll1_sysclk4, pll1_pllen,5 ,SYSCLK_ALWAYS_ENABLED ); -int dm355_pll1_init (struct device *dev,void __iomem *base) +int dm355_pll1_init (struct device *dev,void __iomem *base,struct regmap *cfgchip) {struct clk *clk; -davinci_pll_clk_register (dev, &dm355_pll1_info,"ref_clk" , base); +davinci_pll_clk_register (dev, &dm355_pll1_info,"ref_clk" , base, cfgchip); clk =davinci_pll_sysclk_register (dev, &pll1_sysclk1, base);clk_register_clkdev (clk,"pll1_sysclk1" ,"dm355-psc" );
@@ -64,9 +65,9 @@ static const struct davinci_pll_clk_info dm355_pll2_info = {SYSCLK (1 , pll2_sysclk1, pll2_pllen,5 ,SYSCLK_FIXED_DIV |SYSCLK_ALWAYS_ENABLED ); -int dm355_pll2_init (struct device *dev,void __iomem *base) +int dm355_pll2_init (struct device *dev,void __iomem *base,struct regmap *cfgchip) { -davinci_pll_clk_register (dev, &dm355_pll2_info,"oscin" , base); +davinci_pll_clk_register (dev, &dm355_pll2_info,"oscin" , base, cfgchip);davinci_pll_sysclk_register (dev, &pll2_sysclk1, base);
drivers/clk/davinci/pll-dm365.c +5 -4
@@ -7,6 +7,7 @@#include <linux/bitops.h> #include <linux/clkdev.h> +#include <linux/clk/davinci.h> #include <linux/init.h> #include <linux/kernel.h> #include <linux/types.h>
@@ -56,11 +57,11 @@ static const struct davinci_pll_obsclk_info dm365_pll1_obsclk_info = { .ocsrc_mask = BIT(4), }; -int dm365_pll1_init (struct device *dev,void __iomem *base) +int dm365_pll1_init (struct device *dev,void __iomem *base,struct regmap *cfgchip) {struct clk *clk; -davinci_pll_clk_register (dev, &dm365_pll1_info,"ref_clk" , base); +davinci_pll_clk_register (dev, &dm365_pll1_info,"ref_clk" , base, cfgchip); clk =davinci_pll_sysclk_register (dev, &pll1_sysclk1, base);clk_register_clkdev (clk,"pll1_sysclk1" ,"dm365-psc" );
@@ -119,11 +120,11 @@ static const struct davinci_pll_obsclk_info dm365_pll2_obsclk_info = { .ocsrc_mask = BIT(4), }; -int dm365_pll2_init (struct device *dev,void __iomem *base) +int dm365_pll2_init (struct device *dev,void __iomem *base,struct regmap *cfgchip) {struct clk *clk; -davinci_pll_clk_register (dev, &dm365_pll2_info,"oscin" , base); +davinci_pll_clk_register (dev, &dm365_pll2_info,"oscin" , base, cfgchip);davinci_pll_sysclk_register (dev, &pll2_sysclk1, base);
drivers/clk/davinci/pll-dm644x.c +5 -4
@@ -6,6 +6,7 @@*/ #include <linux/bitops.h> +#include <linux/clk/davinci.h> #include <linux/clkdev.h> #include <linux/init.h> #include <linux/types.h>
@@ -27,11 +28,11 @@ SYSCLK(2, pll1_sysclk2, pll1_pllen, 4, SYSCLK_FIXED_DIV);SYSCLK (3 , pll1_sysclk3, pll1_pllen,4 ,SYSCLK_FIXED_DIV );SYSCLK (5 , pll1_sysclk5, pll1_pllen,4 ,SYSCLK_FIXED_DIV ); -int dm644x_pll1_init (struct device *dev,void __iomem *base) +int dm644x_pll1_init (struct device *dev,void __iomem *base,struct regmap *cfgchip) {struct clk *clk; -davinci_pll_clk_register (dev, &dm644x_pll1_info,"ref_clk" , base); +davinci_pll_clk_register (dev, &dm644x_pll1_info,"ref_clk" , base, cfgchip); clk =davinci_pll_sysclk_register (dev, &pll1_sysclk1, base);clk_register_clkdev (clk,"pll1_sysclk1" ,"dm644x-psc" );
@@ -66,9 +67,9 @@ static const struct davinci_pll_clk_info dm644x_pll2_info = {SYSCLK (1 , pll2_sysclk1, pll2_pllen,4 ,0 );SYSCLK (2 , pll2_sysclk2, pll2_pllen,4 ,0 ); -int dm644x_pll2_init (struct device *dev,void __iomem *base) +int dm644x_pll2_init (struct device *dev,void __iomem *base,struct regmap *cfgchip) { -davinci_pll_clk_register (dev, &dm644x_pll2_info,"oscin" , base); +davinci_pll_clk_register (dev, &dm644x_pll2_info,"oscin" , base, cfgchip);davinci_pll_sysclk_register (dev, &pll2_sysclk1, base);
drivers/clk/davinci/pll-dm646x.c +5 -4
@@ -6,6 +6,7 @@*/ #include <linux/clk-provider.h> +#include <linux/clk/davinci.h> #include <linux/clkdev.h> #include <linux/init.h> #include <linux/types.h>
@@ -29,11 +30,11 @@ SYSCLK(6, pll1_sysclk6, pll1_pllen, 4, 0);SYSCLK (8 , pll1_sysclk8, pll1_pllen,4 ,0 );SYSCLK (9 , pll1_sysclk9, pll1_pllen,4 ,0 ); -int dm646x_pll1_init (struct device *dev,void __iomem *base) +int dm646x_pll1_init (struct device *dev,void __iomem *base,struct regmap *cfgchip) {struct clk *clk; -davinci_pll_clk_register (dev, &dm646x_pll1_info,"ref_clk" , base); +davinci_pll_clk_register (dev, &dm646x_pll1_info,"ref_clk" , base, cfgchip); clk =davinci_pll_sysclk_register (dev, &pll1_sysclk1, base);clk_register_clkdev (clk,"pll1_sysclk1" ,"dm646x-psc" );
@@ -74,9 +75,9 @@ static const struct davinci_pll_clk_info dm646x_pll2_info = {SYSCLK (1 , pll2_sysclk1, pll2_pllen,4 ,SYSCLK_ALWAYS_ENABLED ); -int dm646x_pll2_init (struct device *dev,void __iomem *base) +int dm646x_pll2_init (struct device *dev,void __iomem *base,struct regmap *cfgchip) { -davinci_pll_clk_register (dev, &dm646x_pll2_info,"oscin" , base); +davinci_pll_clk_register (dev, &dm646x_pll2_info,"oscin" , base, cfgchip);davinci_pll_sysclk_register (dev, &pll2_sysclk1, base);
drivers/clk/davinci/pll.c +188 -91
512 lines not on this page · raw message
drivers/clk/davinci/pll.h +12 -18
@@ -11,6 +11,7 @@#include <linux/bitops.h> #include <linux/clk-provider.h> #include <linux/of.h> +#include <linux/regmap.h> #include <linux/types.h> #define PLL_HAS_CLKMODE BIT(0)/* PLL has PLLCTL[CLKMODE] */
@@ -94,7 +95,8 @@ struct davinci_pll_obsclk_info {struct clk *davinci_pll_clk_register (struct device *dev,const struct davinci_pll_clk_info *info,const char *parent_name, -void __iomem *base); +void __iomem *base, +struct regmap *cfgchip);struct clk *davinci_pll_auxclk_register (struct device *dev,const char *name,void __iomem *base);
@@ -110,32 +112,24 @@ davinci_pll_sysclk_register(struct device *dev,const struct davinci_pll_sysclk_info *info, void __iomem *base); -int of_davinci_pll_init (struct device *dev, +int of_davinci_pll_init (struct device *dev,struct device_node *node,const struct davinci_pll_clk_info *info,const struct davinci_pll_obsclk_info *obsclk_info,const struct davinci_pll_sysclk_info **div_info,u8 max_sysclk_id, -void __iomem *base); +void __iomem *base, +struct regmap *cfgchip);/* Platform-specific callbacks */ -int da830_pll_init (struct device *dev,void __iomem *base); +int da850_pll1_init (struct device *dev,void __iomem *base,struct regmap *cfgchip); +int of_da850_pll0_init (struct device *dev,void __iomem *base,struct regmap *cfgchip); +int of_da850_pll1_init (struct device *dev,void __iomem *base,struct regmap *cfgchip); -int da850_pll0_init (struct device *dev,void __iomem *base); -int da850_pll1_init (struct device *dev,void __iomem *base); -int of_da850_pll0_init (struct device *dev,void __iomem *base); -int of_da850_pll1_init (struct device *dev,void __iomem *base); +int dm355_pll2_init (struct device *dev,void __iomem *base,struct regmap *cfgchip); -int dm355_pll1_init (struct device *dev,void __iomem *base); -int dm355_pll2_init (struct device *dev,void __iomem *base); +int dm644x_pll2_init (struct device *dev,void __iomem *base,struct regmap *cfgchip); -int dm365_pll1_init (struct device *dev,void __iomem *base); -int dm365_pll2_init (struct device *dev,void __iomem *base); - -int dm644x_pll1_init (struct device *dev,void __iomem *base); -int dm644x_pll2_init (struct device *dev,void __iomem *base); - -int dm646x_pll1_init (struct device *dev,void __iomem *base); -int dm646x_pll2_init (struct device *dev,void __iomem *base); +int dm646x_pll2_init (struct device *dev,void __iomem *base,struct regmap *cfgchip);#endif /* __CLK_DAVINCI_PLL_H___ */
include/linux/clk/davinci.h new file +24 -0
@@ -0,0 +1,24 @@ +// SPDX-License-Identifier: GPL-2.0 +/* +* Clock drivers for TI DaVinci PLL and PSC controllers +* +* Copyright (C) 2018 David Lechner <[email protected]> +*/ + +#ifndef __LINUX_CLK_DAVINCI_PLL_H___ +#define __LINUX_CLK_DAVINCI_PLL_H___ + +#include <linux/device.h> +#include <linux/regmap.h> + +/* function for registering clocks in early boot */ + +int da830_pll_init (struct device *dev,void __iomem *base,struct regmap *cfgchip); +int da850_pll0_init (struct device *dev,void __iomem *base,struct regmap *cfgchip); +int dm355_pll1_init (struct device *dev,void __iomem *base,struct regmap *cfgchip); +int dm365_pll1_init (struct device *dev,void __iomem *base,struct regmap *cfgchip); +int dm365_pll2_init (struct device *dev,void __iomem *base,struct regmap *cfgchip); +int dm644x_pll1_init (struct device *dev,void __iomem *base,struct regmap *cfgchip); +int dm646x_pll1_init (struct device *dev,void __iomem *base,struct regmap *cfgchip); + +#endif /* __LINUX_CLK_DAVINCI_PLL_H___ */
Signature · 1 line
2.17.0
Re: [PATCH 6/9] clk: davinci: pll: allow dev == NULL
Hi David,
Quoting David Lechner (2018-05-25 11:11:47)
Quoted 4 lines
This modifies the TI Davinci PLL clock driver to allow for the case when dev == NULL. On some (most) SoCs that use this driver, the PLL clock needs to be registered during early boot because it is used for clocksource/clkevent and there will be no platform device available.
A lot of this stuff feels like a step backwards. E.g:
Quoted 36 lines
drivers/clk/davinci/pll.c +5
-2@@ -11,6 +11,7 @@#include <linux/clk-provider.h> #include <linux/clk.h> +#include <linux/clk/davinci.h> #include <linux/delay.h> #include <linux/err.h> #include <linux/io.h> @@ -223,6 +224,7 @@ static const struct clk_ops dm365_pll_ops = {/** * davinci_pll_div_register - common *DIV clock implementation +* @dev: The PLL platform device or NULL * @name: the clock name * @parent_name: the parent clock name * @reg: the *DIV register @@ -240,17 +242,21 @@ static struct clk *davinci_pll_div_register(struct device *dev,const struct clk_ops *divider_ops = &clk_divider_ops;struct clk_gate *gate;struct clk_divider *divider; +struct clk *clk; +int ret; - gate =devm_kzalloc (dev,sizeof (*gate),GFP_KERNEL ); + gate =kzalloc (sizeof (*gate),GFP_KERNEL );if (!gate)return ERR_PTR (-ENOMEM ); gate->reg = reg; gate->bit_idx =DIV_ENABLE_SHIFT ; - divider =devm_kzalloc (dev,sizeof (*divider),GFP_KERNEL );
drivers/clk/davinci/pll.c static struct clk *davinci_pll_div_register(struct device *dev, · line 262
Quoted 10 lines
drivers/clk/davinci/pll.c +5
-2-if (!divider) -return ERR_PTR (-ENOMEM ); + divider =kzalloc (sizeof (*divider),GFP_KERNEL ); +if (!divider) { + ret = -ENOMEM ; + goto err_free_gate; + } divider->reg = reg; divider->shift =DIV_RATIO_SHIFT ;
Oh no my poor devm_ helpers!
I understand that we need to support early boot drivers better, so this patch can be merged.
However I'm curious if you're tracking Bartosz's early_platform_driver efforts? Converting to that if it is ever merged would likely be cleaner:
https://lkml.kernel.org/r/20180511162028.20616-1-brgl at bgdev.pl
Best regards,
Mike
David Lechner
maintainerRe: [PATCH 6/9] clk: davinci: pll: allow dev == NULL
Quoted 62 lines · Michael Turquette
Hi David,
Quoting David Lechner (2018-05-25 11:11:47)
Quoted 4 lines
This modifies the TI Davinci PLL clock driver to allow for the case when dev == NULL. On some (most) SoCs that use this driver, the PLL clock needs to be registered during early boot because it is used for clocksource/clkevent and there will be no platform device available.
A lot of this stuff feels like a step backwards. E.g:
Quoted 36 lines
drivers/clk/davinci/pll.c +5
-2@@ -11,6 +11,7 @@#include <linux/clk-provider.h> #include <linux/clk.h> +#include <linux/clk/davinci.h> #include <linux/delay.h> #include <linux/err.h> #include <linux/io.h> @@ -223,6 +224,7 @@ static const struct clk_ops dm365_pll_ops = {/** * davinci_pll_div_register - common *DIV clock implementation +* @dev: The PLL platform device or NULL * @name: the clock name * @parent_name: the parent clock name * @reg: the *DIV register @@ -240,17 +242,21 @@ static struct clk *davinci_pll_div_register(struct device *dev,const struct clk_ops *divider_ops = &clk_divider_ops;struct clk_gate *gate;struct clk_divider *divider; +struct clk *clk; +int ret; - gate =devm_kzalloc (dev,sizeof (*gate),GFP_KERNEL ); + gate =kzalloc (sizeof (*gate),GFP_KERNEL );if (!gate)return ERR_PTR (-ENOMEM ); gate->reg = reg; gate->bit_idx =DIV_ENABLE_SHIFT ; - divider =devm_kzalloc (dev,sizeof (*divider),GFP_KERNEL );drivers/clk/davinci/pll.c static struct clk *davinci_pll_div_register(struct device *dev, · line 262
Quoted 10 lines
drivers/clk/davinci/pll.c +5
-2-if (!divider) -return ERR_PTR (-ENOMEM ); + divider =kzalloc (sizeof (*divider),GFP_KERNEL ); +if (!divider) { + ret = -ENOMEM ; + goto err_free_gate; + } divider->reg = reg; divider->shift =DIV_RATIO_SHIFT ;Oh no my poor
devm_helpers!I understand that we need to support early boot drivers better, so this patch can be merged.
Quoted 9 lines
However I'm curious if you're tracking Bartosz's
early_platform_driverefforts? Converting to that if it is ever merged would likely be cleaner:https://lkml.kernel.org/r/20180511162028.20616-1-brgl at bgdev.pl
Best regards,
Mike
Yes. In fact, this is what got Bartosz working on it in the first place. :-)
David Lechner
maintainerPATCH 7/9 clk: davinci: da850-pll: change PLL0 to CLK_OF_DECLARE
In reply to David LechnerPLL0 on davinci/da850-type device needs to be registered early in boot because it is needed for clocksource/clockevent. Change the driver to use CLK_OF_DECLARE for this special case.
--- drivers/clk/davinci/pll-da850.c | 21 +++++++++++++++++---- drivers/clk/davinci/pll.c | 4 +++- drivers/clk/davinci/pll.h | 2 +- 3 files changed, 21 insertions(+), 6 deletions(-)
drivers/clk/davinci/pll-da850.c +17 -4
@@ -13,6 +13,8 @@#include <linux/init.h> #include <linux/kernel.h> #include <linux/mfd/da8xx-cfgchip.h> +#include <linux/mfd/syscon.h> +#include <linux/of_address.h> #include <linux/of.h> #include <linux/types.h>
@@ -136,11 +138,22 @@ static const struct davinci_pll_sysclk_info *da850_pll0_sysclk_info[] = {NULL }; -int of_da850_pll0_init (struct device *dev,void __iomem *base,struct regmap *cfgchip) +void of_da850_pll0_init (struct device_node *node) { -return of_davinci_pll_init (dev, dev->of_node, &da850_pll0_info, - &da850_pll0_obsclk_info, - da850_pll0_sysclk_info,7 , base, cfgchip); +void __iomem *base; +struct regmap *cfgchip; + + base =of_iomap (node,0 ); +if (!base) { +pr_err ("%s: ioremap failed\n" , __func__); +return ; + } + + cfgchip =syscon_regmap_lookup_by_compatible ("ti,da830-cfgchip" ); + +of_davinci_pll_init (NULL , node, &da850_pll0_info, + &da850_pll0_obsclk_info, + da850_pll0_sysclk_info,7 , base, cfgchip); }static const struct davinci_pll_clk_info da850_pll1_info = {
drivers/clk/davinci/pll.c +3 -1
@@ -859,8 +859,10 @@ static struct davinci_pll_platform_data *davinci_pll_get_pdata(struct device *dereturn pdata; } +/* needed in early boot for clocksource/clockevent */ +CLK_OF_DECLARE (da850_pll0,"ti,da850-pll0" , of_da850_pll0_init); +static const struct of_device_id davinci_pll_of_match[] = { - { .compatible ="ti,da850-pll0" , .data = of_da850_pll0_init }, { .compatible ="ti,da850-pll1" , .data = of_da850_pll1_init }, { } };
drivers/clk/davinci/pll.h +1 -1
@@ -123,7 +123,7 @@ int of_davinci_pll_init(struct device *dev, struct device_node *node,/* Platform-specific callbacks */ int da850_pll1_init (struct device *dev,void __iomem *base,struct regmap *cfgchip); -int of_da850_pll0_init (struct device *dev,void __iomem *base,struct regmap *cfgchip); +void of_da850_pll0_init (struct device_node *node);int of_da850_pll1_init (struct device *dev,void __iomem *base,struct regmap *cfgchip);int dm355_pll2_init (struct device *dev,void __iomem *base,struct regmap *cfgchip);
Signature · 1 line
2.17.0
David Lechner
maintainerPATCH 8/9 clk: davinci: psc: allow for dev == NULL
In reply to David LechnerOn some davinci SoCs, we need to register the PSC clocks during early boot because they are needed for clocksource/clockevent. These changes allow for dev == NULL because in this case, we won't have a platform device for the clocks.
--- drivers/clk/davinci/psc-dm355.c | 3 +- drivers/clk/davinci/psc-dm365.c | 3 +- drivers/clk/davinci/psc-dm644x.c | 3 +- drivers/clk/davinci/psc-dm646x.c | 3 +- drivers/clk/davinci/psc.c | 58 ++++++++++++++++++++++++-------- include/linux/clk/davinci.h | 5 +++ 6 files changed, 57 insertions(+), 18 deletions(-)
drivers/clk/davinci/psc-dm355.c +2 -1
@@ -6,6 +6,7 @@*/ #include <linux/clk-provider.h> +#include <linux/clk/davinci.h> #include <linux/clk.h> #include <linux/clkdev.h> #include <linux/init.h>
@@ -68,7 +69,7 @@ static const struct davinci_lpsc_clk_info dm355_psc_info[] = { { } }; -static int dm355_psc_init (struct device *dev,void __iomem *base) +int dm355_psc_init (struct device *dev,void __iomem *base) {return davinci_psc_register_clocks (dev, dm355_psc_info,42 , base); }
drivers/clk/davinci/psc-dm365.c +2 -1
@@ -6,6 +6,7 @@*/ #include <linux/clk-provider.h> +#include <linux/clk/davinci.h> #include <linux/clk.h> #include <linux/clkdev.h> #include <linux/init.h>
@@ -86,7 +87,7 @@ static const struct davinci_lpsc_clk_info dm365_psc_info[] = { { } }; -static int dm365_psc_init (struct device *dev,void __iomem *base) +int dm365_psc_init (struct device *dev,void __iomem *base) {return davinci_psc_register_clocks (dev, dm365_psc_info,52 , base); }
drivers/clk/davinci/psc-dm644x.c +2 -1
@@ -6,6 +6,7 @@*/ #include <linux/clk-provider.h> +#include <linux/clk/davinci.h> #include <linux/clk.h> #include <linux/clkdev.h> #include <linux/init.h>
@@ -63,7 +64,7 @@ static const struct davinci_lpsc_clk_info dm644x_psc_info[] = { { } }; -static int dm644x_psc_init (struct device *dev,void __iomem *base) +int dm644x_psc_init (struct device *dev,void __iomem *base) {return davinci_psc_register_clocks (dev, dm644x_psc_info,41 , base); }
drivers/clk/davinci/psc-dm646x.c +2 -1
@@ -6,6 +6,7 @@*/ #include <linux/clk-provider.h> +#include <linux/clk/davinci.h> #include <linux/clk.h> #include <linux/clkdev.h> #include <linux/init.h>
@@ -58,7 +59,7 @@ static const struct davinci_lpsc_clk_info dm646x_psc_info[] = { { } }; -static int dm646x_psc_init (struct device *dev,void __iomem *base) +int dm646x_psc_init (struct device *dev,void __iomem *base) {return davinci_psc_register_clocks (dev, dm646x_psc_info,46 , base); }
drivers/clk/davinci/psc.c +44 -14
120 lines not on this page · raw message
include/linux/clk/davinci.h +5 -0
@@ -21,4 +21,9 @@ int dm365_pll2_init(struct device *dev, void __iomem *base, struct regmap *cfgchint dm644x_pll1_init (struct device *dev,void __iomem *base,struct regmap *cfgchip);int dm646x_pll1_init (struct device *dev,void __iomem *base,struct regmap *cfgchip); +int dm355_psc_init (struct device *dev,void __iomem *base); +int dm365_psc_init (struct device *dev,void __iomem *base); +int dm644x_psc_init (struct device *dev,void __iomem *base); +int dm646x_psc_init (struct device *dev,void __iomem *base); +#endif /* __LINUX_CLK_DAVINCI_PLL_H___ */
Signature · 1 line
2.17.0
David Lechner
maintainerPATCH 9/9 clk: davinci: Fix link errors when not all SoCs are enabled
In reply to David LechnerThis fixes linker errors due to undefined symbols when one or more of the TI DaVinci SoCs is not enabled in the kernel config.
--- drivers/clk/davinci/pll.c | 16 ++++++++++++++++ drivers/clk/davinci/pll.h | 11 ++++++++--- drivers/clk/davinci/psc.c | 14 ++++++++++++++ drivers/clk/davinci/psc.h | 12 ++++++++++++ include/linux/clk/davinci.h | 19 +++++++++++++++---- 5 files changed, 65 insertions(+), 7 deletions(-)
drivers/clk/davinci/pll.c +16 -0
@@ -860,25 +860,41 @@ static struct davinci_pll_platform_data *davinci_pll_get_pdata(struct device *de }/* needed in early boot for clocksource/clockevent */ +#ifdef CONFIG_ARCH_DAVINCI_DA850 CLK_OF_DECLARE (da850_pll0,"ti,da850-pll0" , of_da850_pll0_init); +#endif static const struct of_device_id davinci_pll_of_match[] = { +#ifdef CONFIG_ARCH_DAVINCI_DA850 { .compatible ="ti,da850-pll1" , .data = of_da850_pll1_init }, +#endif { } };static const struct platform_device_id davinci_pll_id_table[] = { +#ifdef CONFIG_ARCH_DAVINCI_DA830 { .name ="da830-pll" , .driver_data = (kernel_ulong_t )da830_pll_init }, +#endif +#ifdef CONFIG_ARCH_DAVINCI_DA850 { .name ="da850-pll0" , .driver_data = (kernel_ulong_t )da850_pll0_init }, { .name ="da850-pll1" , .driver_data = (kernel_ulong_t )da850_pll1_init }, +#endif +#ifdef CONFIG_ARCH_DAVINCI_DM355 { .name ="dm355-pll1" , .driver_data = (kernel_ulong_t )dm355_pll1_init }, { .name ="dm355-pll2" , .driver_data = (kernel_ulong_t )dm355_pll2_init }, +#endif +#ifdef CONFIG_ARCH_DAVINCI_DM365 { .name ="dm365-pll1" , .driver_data = (kernel_ulong_t )dm365_pll1_init }, { .name ="dm365-pll2" , .driver_data = (kernel_ulong_t )dm365_pll2_init }, +#endif +#ifdef CONFIG_ARCH_DAVINCI_DM644x { .name ="dm644x-pll1" , .driver_data = (kernel_ulong_t )dm644x_pll1_init }, { .name ="dm644x-pll2" , .driver_data = (kernel_ulong_t )dm644x_pll2_init }, +#endif +#ifdef CONFIG_ARCH_DAVINCI_DM646x { .name ="dm646x-pll1" , .driver_data = (kernel_ulong_t )dm646x_pll1_init }, { .name ="dm646x-pll2" , .driver_data = (kernel_ulong_t )dm646x_pll2_init }, +#endif { } };
drivers/clk/davinci/pll.h +8 -3
@@ -122,14 +122,19 @@ int of_davinci_pll_init(struct device *dev, struct device_node *node,/* Platform-specific callbacks */ +#ifdef CONFIG_ARCH_DAVINCI_DA850 int da850_pll1_init (struct device *dev,void __iomem *base,struct regmap *cfgchip);void of_da850_pll0_init (struct device_node *node);int of_da850_pll1_init (struct device *dev,void __iomem *base,struct regmap *cfgchip); - +#endif +#ifdef CONFIG_ARCH_DAVINCI_DM355 int dm355_pll2_init (struct device *dev,void __iomem *base,struct regmap *cfgchip); - +#endif +#ifdef CONFIG_ARCH_DAVINCI_DM644xint dm644x_pll2_init (struct device *dev,void __iomem *base,struct regmap *cfgchip); - +#endif +#ifdef CONFIG_ARCH_DAVINCI_DM646xint dm646x_pll2_init (struct device *dev,void __iomem *base,struct regmap *cfgchip); +#endif #endif /* __CLK_DAVINCI_PLL_H___ */
drivers/clk/davinci/psc.c +14 -0
@@ -513,20 +513,34 @@ int of_davinci_psc_clk_init(struct device *dev, }static const struct of_device_id davinci_psc_of_match[] = { +#ifdef CONFIG_ARCH_DAVINCI_DA850 { .compatible ="ti,da850-psc0" , .data = &of_da850_psc0_init_data }, { .compatible ="ti,da850-psc1" , .data = &of_da850_psc1_init_data }, +#endif { } };static const struct platform_device_id davinci_psc_id_table[] = { +#ifdef CONFIG_ARCH_DAVINCI_DA830 { .name ="da830-psc0" , .driver_data = (kernel_ulong_t)&da830_psc0_init_data }, { .name ="da830-psc1" , .driver_data = (kernel_ulong_t)&da830_psc1_init_data }, +#endif +#ifdef CONFIG_ARCH_DAVINCI_DA850 { .name ="da850-psc0" , .driver_data = (kernel_ulong_t)&da850_psc0_init_data }, { .name ="da850-psc1" , .driver_data = (kernel_ulong_t)&da850_psc1_init_data }, +#endif +#ifdef CONFIG_ARCH_DAVINCI_DM355 { .name ="dm355-psc" , .driver_data = (kernel_ulong_t)&dm355_psc_init_data }, +#endif +#ifdef CONFIG_ARCH_DAVINCI_DM365 { .name ="dm365-psc" , .driver_data = (kernel_ulong_t)&dm365_psc_init_data }, +#endif +#ifdef CONFIG_ARCH_DAVINCI_DM644x { .name ="dm644x-psc" , .driver_data = (kernel_ulong_t)&dm644x_psc_init_data }, +#endif +#ifdef CONFIG_ARCH_DAVINCI_DM646x { .name ="dm646x-psc" , .driver_data = (kernel_ulong_t)&dm646x_psc_init_data }, +#endif { } };
drivers/clk/davinci/psc.h +12 -0
@@ -94,15 +94,27 @@ struct davinci_psc_init_data { int (*psc_init)(struct device *dev, void __iomem *base); }; +#ifdef CONFIG_ARCH_DAVINCI_DA830 extern const struct davinci_psc_init_data da830_psc0_init_data;extern const struct davinci_psc_init_data da830_psc1_init_data; +#endif +#ifdef CONFIG_ARCH_DAVINCI_DA850 extern const struct davinci_psc_init_data da850_psc0_init_data;extern const struct davinci_psc_init_data da850_psc1_init_data;extern const struct davinci_psc_init_data of_da850_psc0_init_data;extern const struct davinci_psc_init_data of_da850_psc1_init_data; +#endif +#ifdef CONFIG_ARCH_DAVINCI_DM355 extern const struct davinci_psc_init_data dm355_psc_init_data; +#endif +#ifdef CONFIG_ARCH_DAVINCI_DM356 extern const struct davinci_psc_init_data dm365_psc_init_data; +#endif +#ifdef CONFIG_ARCH_DAVINCI_DM644xextern const struct davinci_psc_init_data dm644x_psc_init_data; +#endif +#ifdef CONFIG_ARCH_DAVINCI_DM646xextern const struct davinci_psc_init_data dm646x_psc_init_data; +#endif #endif /* __CLK_DAVINCI_PSC_H__ */
include/linux/clk/davinci.h +15 -4
@@ -13,17 +13,28 @@/* function for registering clocks in early boot */ +#ifdef CONFIG_ARCH_DAVINCI_DA830 int da830_pll_init (struct device *dev,void __iomem *base,struct regmap *cfgchip); +#endif +#ifdef CONFIG_ARCH_DAVINCI_DA850 int da850_pll0_init (struct device *dev,void __iomem *base,struct regmap *cfgchip); +#endif +#ifdef CONFIG_ARCH_DAVINCI_DM355 int dm355_pll1_init (struct device *dev,void __iomem *base,struct regmap *cfgchip); +int dm355_psc_init (struct device *dev,void __iomem *base); +#endif +#ifdef CONFIG_ARCH_DAVINCI_DM365 int dm365_pll1_init (struct device *dev,void __iomem *base,struct regmap *cfgchip);int dm365_pll2_init (struct device *dev,void __iomem *base,struct regmap *cfgchip); -int dm644x_pll1_init (struct device *dev,void __iomem *base,struct regmap *cfgchip); -int dm646x_pll1_init (struct device *dev,void __iomem *base,struct regmap *cfgchip); - -int dm355_psc_init (struct device *dev,void __iomem *base);int dm365_psc_init (struct device *dev,void __iomem *base); +#endif +#ifdef CONFIG_ARCH_DAVINCI_DM644x +int dm644x_pll1_init (struct device *dev,void __iomem *base,struct regmap *cfgchip);int dm644x_psc_init (struct device *dev,void __iomem *base); +#endif +#ifdef CONFIG_ARCH_DAVINCI_DM646x +int dm646x_pll1_init (struct device *dev,void __iomem *base,struct regmap *cfgchip);int dm646x_psc_init (struct device *dev,void __iomem *base); +#endif #endif /* __LINUX_CLK_DAVINCI_PLL_H___ */
Signature · 1 line
2.17.0
Re: [PATCH 9/9] clk: davinci: Fix link errors when not all SoCs are enabled
Quoted 70 lines · David Lechner
This fixes linker errors due to undefined symbols when one or more of the TI DaVinci SoCs is not enabled in the kernel config.
Signed-off-by David Lechner <[email protected]>--- drivers/clk/davinci/pll.c | 16 ++++++++++++++++ drivers/clk/davinci/pll.h | 11 ++++++++--- drivers/clk/davinci/psc.c | 14 ++++++++++++++ drivers/clk/davinci/psc.h | 12 ++++++++++++ include/linux/clk/davinci.h | 19 +++++++++++++++---- 5 files changed, 65 insertions(+), 7 deletions(-)drivers/clk/davinci/pll.c +16
-0@@ -860,25 +860,41 @@ static struct davinci_pll_platform_data *davinci_pll_get_pdata(struct device *de }/* needed in early boot for clocksource/clockevent */ +#ifdef CONFIG_ARCH_DAVINCI_DA850 CLK_OF_DECLARE (da850_pll0,"ti,da850-pll0" , of_da850_pll0_init); +#endif static const struct of_device_id davinci_pll_of_match[] = { +#ifdef CONFIG_ARCH_DAVINCI_DA850 { .compatible ="ti,da850-pll1" , .data = of_da850_pll1_init }, +#endif { } };static const struct platform_device_id davinci_pll_id_table[] = { +#ifdef CONFIG_ARCH_DAVINCI_DA830 { .name ="da830-pll" , .driver_data = (kernel_ulong_t )da830_pll_init }, +#endif +#ifdef CONFIG_ARCH_DAVINCI_DA850 { .name ="da850-pll0" , .driver_data = (kernel_ulong_t )da850_pll0_init }, { .name ="da850-pll1" , .driver_data = (kernel_ulong_t )da850_pll1_init }, +#endif +#ifdef CONFIG_ARCH_DAVINCI_DM355 { .name ="dm355-pll1" , .driver_data = (kernel_ulong_t )dm355_pll1_init }, { .name ="dm355-pll2" , .driver_data = (kernel_ulong_t )dm355_pll2_init }, +#endif +#ifdef CONFIG_ARCH_DAVINCI_DM365 { .name ="dm365-pll1" , .driver_data = (kernel_ulong_t )dm365_pll1_init }, { .name ="dm365-pll2" , .driver_data = (kernel_ulong_t )dm365_pll2_init }, +#endif +#ifdef CONFIG_ARCH_DAVINCI_DM644x { .name ="dm644x-pll1" , .driver_data = (kernel_ulong_t )dm644x_pll1_init }, { .name ="dm644x-pll2" , .driver_data = (kernel_ulong_t )dm644x_pll2_init }, +#endif +#ifdef CONFIG_ARCH_DAVINCI_DM646x { .name ="dm646x-pll1" , .driver_data = (kernel_ulong_t )dm646x_pll1_init }, { .name ="dm646x-pll2" , .driver_data = (kernel_ulong_t )dm646x_pll2_init }, +#endif { } };drivers/clk/davinci/pll.h +1
-0@@ -122,14 +122,19 @@ int of_davinci_pll_init(struct device *dev, struct device_node *node,/* Platform-specific callbacks */ +#ifdef CONFIG_ARCH_DAVINCI_DA850 int da850_pll1_init (struct device *dev,void __iomem *base,struct regmap *cfgchip);void of_da850_pll0_init (struct device_node *node);int of_da850_pll1_init (struct device *dev,void __iomem *base,struct regmap *cfgchip);
drivers/clk/davinci/pll.h int of_davinci_pll_init(struct device *dev, struct device_node *node, · line 135
Quoted 10 lines
drivers/clk/davinci/pll.h +5
-3- +#endif +#ifdef CONFIG_ARCH_DAVINCI_DM355 int dm355_pll2_init (struct device *dev,void __iomem *base,struct regmap *cfgchip); - +#endif +#ifdef CONFIG_ARCH_DAVINCI_DM644xint dm644x_pll2_init (struct device *dev,void __iomem *base,struct regmap *cfgchip); - +#endif
The traditional way of dealing with this for functions is to provide a static inline stub when CONFIG_ARCH_DAVINCI_DM644x is not defined. Can we use that? That helps in avoiding ifdefs elsewhere.
Quoted 64 lines
drivers/clk/davinci/pll.h +2
-0+#ifdef CONFIG_ARCH_DAVINCI_DM646xint dm646x_pll2_init (struct device *dev,void __iomem *base,struct regmap *cfgchip); +#endif #endif /* __CLK_DAVINCI_PLL_H___ */ drivers/clk/davinci/psc.c +14
-0@@ -513,20 +513,34 @@ int of_davinci_psc_clk_init(struct device *dev, }static const struct of_device_id davinci_psc_of_match[] = { +#ifdef CONFIG_ARCH_DAVINCI_DA850 { .compatible ="ti,da850-psc0" , .data = &of_da850_psc0_init_data }, { .compatible ="ti,da850-psc1" , .data = &of_da850_psc1_init_data }, +#endif { } };static const struct platform_device_id davinci_psc_id_table[] = { +#ifdef CONFIG_ARCH_DAVINCI_DA830 { .name ="da830-psc0" , .driver_data = (kernel_ulong_t)&da830_psc0_init_data }, { .name ="da830-psc1" , .driver_data = (kernel_ulong_t)&da830_psc1_init_data }, +#endif +#ifdef CONFIG_ARCH_DAVINCI_DA850 { .name ="da850-psc0" , .driver_data = (kernel_ulong_t)&da850_psc0_init_data }, { .name ="da850-psc1" , .driver_data = (kernel_ulong_t)&da850_psc1_init_data }, +#endif +#ifdef CONFIG_ARCH_DAVINCI_DM355 { .name ="dm355-psc" , .driver_data = (kernel_ulong_t)&dm355_psc_init_data }, +#endif +#ifdef CONFIG_ARCH_DAVINCI_DM365 { .name ="dm365-psc" , .driver_data = (kernel_ulong_t)&dm365_psc_init_data }, +#endif +#ifdef CONFIG_ARCH_DAVINCI_DM644x { .name ="dm644x-psc" , .driver_data = (kernel_ulong_t)&dm644x_psc_init_data }, +#endif +#ifdef CONFIG_ARCH_DAVINCI_DM646x { .name ="dm646x-psc" , .driver_data = (kernel_ulong_t)&dm646x_psc_init_data }, +#endif { } };drivers/clk/davinci/psc.h +5
-0@@ -94,15 +94,27 @@ struct davinci_psc_init_data {int (*psc_init)(struct device *dev,void __iomem *base); }; +#ifdef CONFIG_ARCH_DAVINCI_DA830 extern const struct davinci_psc_init_data da830_psc0_init_data;extern const struct davinci_psc_init_data da830_psc1_init_data; +#endif +#ifdef CONFIG_ARCH_DAVINCI_DA850 extern const struct davinci_psc_init_data da850_psc0_init_data;extern const struct davinci_psc_init_data da850_psc1_init_data;extern const struct davinci_psc_init_data of_da850_psc0_init_data;extern const struct davinci_psc_init_data of_da850_psc1_init_data; +#endif +#ifdef CONFIG_ARCH_DAVINCI_DM355 extern const struct davinci_psc_init_data dm355_psc_init_data;
drivers/clk/davinci/psc.h struct davinci_psc_init_data { · line 118
Quoted 10 lines
drivers/clk/davinci/psc.h +7
-0+#endif +#ifdef CONFIG_ARCH_DAVINCI_DM356 extern const struct davinci_psc_init_data dm365_psc_init_data; +#endif +#ifdef CONFIG_ARCH_DAVINCI_DM644xextern const struct davinci_psc_init_data dm644x_psc_init_data; +#endif +#ifdef CONFIG_ARCH_DAVINCI_DM646xextern const struct davinci_psc_init_data dm646x_psc_init_data; +#endif
ifdefs around these extern declarations are not needed.
Thanks,
Sekhar
David Lechner
maintainerRe: [PATCH 9/9] clk: davinci: Fix link errors when not all SoCs are enabled
Quoted 77 lines · Sekhar Nori
Quoted 76 lines · David Lechner
This fixes linker errors due to undefined symbols when one or more of the TI DaVinci SoCs is not enabled in the kernel config.
Signed-off-by David Lechner <[email protected]>--- drivers/clk/davinci/pll.c | 16 ++++++++++++++++ drivers/clk/davinci/pll.h | 11 ++++++++--- drivers/clk/davinci/psc.c | 14 ++++++++++++++ drivers/clk/davinci/psc.h | 12 ++++++++++++ include/linux/clk/davinci.h | 19 +++++++++++++++---- 5 files changed, 65 insertions(+), 7 deletions(-)drivers/clk/davinci/pll.c +16
-0@@ -860,25 +860,41 @@ static struct davinci_pll_platform_data *davinci_pll_get_pdata(struct device *de }/* needed in early boot for clocksource/clockevent */ +#ifdef CONFIG_ARCH_DAVINCI_DA850 CLK_OF_DECLARE (da850_pll0,"ti,da850-pll0" , of_da850_pll0_init); +#endif static const struct of_device_id davinci_pll_of_match[] = { +#ifdef CONFIG_ARCH_DAVINCI_DA850 { .compatible ="ti,da850-pll1" , .data = of_da850_pll1_init }, +#endif { } };static const struct platform_device_id davinci_pll_id_table[] = { +#ifdef CONFIG_ARCH_DAVINCI_DA830 { .name ="da830-pll" , .driver_data = (kernel_ulong_t )da830_pll_init }, +#endif +#ifdef CONFIG_ARCH_DAVINCI_DA850 { .name ="da850-pll0" , .driver_data = (kernel_ulong_t )da850_pll0_init }, { .name ="da850-pll1" , .driver_data = (kernel_ulong_t )da850_pll1_init }, +#endif +#ifdef CONFIG_ARCH_DAVINCI_DM355 { .name ="dm355-pll1" , .driver_data = (kernel_ulong_t )dm355_pll1_init }, { .name ="dm355-pll2" , .driver_data = (kernel_ulong_t )dm355_pll2_init }, +#endif +#ifdef CONFIG_ARCH_DAVINCI_DM365 { .name ="dm365-pll1" , .driver_data = (kernel_ulong_t )dm365_pll1_init }, { .name ="dm365-pll2" , .driver_data = (kernel_ulong_t )dm365_pll2_init }, +#endif +#ifdef CONFIG_ARCH_DAVINCI_DM644x { .name ="dm644x-pll1" , .driver_data = (kernel_ulong_t )dm644x_pll1_init }, { .name ="dm644x-pll2" , .driver_data = (kernel_ulong_t )dm644x_pll2_init }, +#endif +#ifdef CONFIG_ARCH_DAVINCI_DM646x { .name ="dm646x-pll1" , .driver_data = (kernel_ulong_t )dm646x_pll1_init }, { .name ="dm646x-pll2" , .driver_data = (kernel_ulong_t )dm646x_pll2_init }, +#endif { } };drivers/clk/davinci/pll.h +4
-2@@ -122,14 +122,19 @@ int of_davinci_pll_init(struct device *dev, struct device_node *node,/* Platform-specific callbacks */ +#ifdef CONFIG_ARCH_DAVINCI_DA850 int da850_pll1_init (struct device *dev,void __iomem *base,struct regmap *cfgchip);void of_da850_pll0_init (struct device_node *node);int of_da850_pll1_init (struct device *dev,void __iomem *base,struct regmap *cfgchip); - +#endif +#ifdef CONFIG_ARCH_DAVINCI_DM355 int dm355_pll2_init (struct device *dev,void __iomem *base,struct regmap *cfgchip); - +#endif
Quoted 8 lines
drivers/clk/davinci/pll.h int of_davinci_pll_init(struct device *dev, struct device_node *node, · line 135
Quoted 4 lines
drivers/clk/davinci/pll.h +2
-1+#ifdef CONFIG_ARCH_DAVINCI_DM644xint dm644x_pll2_init (struct device *dev,void __iomem *base,struct regmap *cfgchip); - +#endif The traditional way of dealing with this for functions is to provide a static inline stub when
CONFIG_ARCH_DAVINCI_DM644xis not defined. Can we use that? That helps in avoiding ifdefs elsewhere.
I suppose we could. But then we would be taking function pointers to static inline functions, which seems kind of weird to me.
Quoted 69 lines
Quoted 69 lines
drivers/clk/davinci/pll.h +2
-0+#ifdef CONFIG_ARCH_DAVINCI_DM646xint dm646x_pll2_init (struct device *dev,void __iomem *base,struct regmap *cfgchip); +#endif #endif /* __CLK_DAVINCI_PLL_H___ */ drivers/clk/davinci/psc.c +14
-0@@ -513,20 +513,34 @@ int of_davinci_psc_clk_init(struct device *dev, }static const struct of_device_id davinci_psc_of_match[] = { +#ifdef CONFIG_ARCH_DAVINCI_DA850 { .compatible ="ti,da850-psc0" , .data = &of_da850_psc0_init_data }, { .compatible ="ti,da850-psc1" , .data = &of_da850_psc1_init_data }, +#endif { } };static const struct platform_device_id davinci_psc_id_table[] = { +#ifdef CONFIG_ARCH_DAVINCI_DA830 { .name ="da830-psc0" , .driver_data = (kernel_ulong_t)&da830_psc0_init_data }, { .name ="da830-psc1" , .driver_data = (kernel_ulong_t)&da830_psc1_init_data }, +#endif +#ifdef CONFIG_ARCH_DAVINCI_DA850 { .name ="da850-psc0" , .driver_data = (kernel_ulong_t)&da850_psc0_init_data }, { .name ="da850-psc1" , .driver_data = (kernel_ulong_t)&da850_psc1_init_data }, +#endif +#ifdef CONFIG_ARCH_DAVINCI_DM355 { .name ="dm355-psc" , .driver_data = (kernel_ulong_t)&dm355_psc_init_data }, +#endif +#ifdef CONFIG_ARCH_DAVINCI_DM365 { .name ="dm365-psc" , .driver_data = (kernel_ulong_t)&dm365_psc_init_data }, +#endif +#ifdef CONFIG_ARCH_DAVINCI_DM644x { .name ="dm644x-psc" , .driver_data = (kernel_ulong_t)&dm644x_psc_init_data }, +#endif +#ifdef CONFIG_ARCH_DAVINCI_DM646x { .name ="dm646x-psc" , .driver_data = (kernel_ulong_t)&dm646x_psc_init_data }, +#endif { } };drivers/clk/davinci/psc.h +8
-0@@ -94,15 +94,27 @@ struct davinci_psc_init_data {int (*psc_init)(struct device *dev,void __iomem *base); }; +#ifdef CONFIG_ARCH_DAVINCI_DA830 extern const struct davinci_psc_init_data da830_psc0_init_data;extern const struct davinci_psc_init_data da830_psc1_init_data; +#endif +#ifdef CONFIG_ARCH_DAVINCI_DA850 extern const struct davinci_psc_init_data da850_psc0_init_data;extern const struct davinci_psc_init_data da850_psc1_init_data;extern const struct davinci_psc_init_data of_da850_psc0_init_data;extern const struct davinci_psc_init_data of_da850_psc1_init_data; +#endif +#ifdef CONFIG_ARCH_DAVINCI_DM355 extern const struct davinci_psc_init_data dm355_psc_init_data; +#endif +#ifdef CONFIG_ARCH_DAVINCI_DM356 extern const struct davinci_psc_init_data dm365_psc_init_data; +#endif
Quoted 8 lines
drivers/clk/davinci/psc.h struct davinci_psc_init_data { · line 118
Quoted 6 lines
drivers/clk/davinci/psc.h +4
-0+#ifdef CONFIG_ARCH_DAVINCI_DM644xextern const struct davinci_psc_init_data dm644x_psc_init_data; +#endif +#ifdef CONFIG_ARCH_DAVINCI_DM646xextern const struct davinci_psc_init_data dm646x_psc_init_data; +#endif ifdefs around these extern declarations are not needed.
True. I guess I just prefer a compiler error to a linker error.
Hi David,
Quoting David Lechner (2018-05-25 11:11:41)
Quoted 10 lines
This is a resend of all of the outstanding DaVinci clock patches plus one new patch. All of the patches (except the new one) have been reviewed and tested by someone other than me.
The new patch ("clk: davinci: Fix link errors when not all SoCs are enabled") should be fairly trivial.
I am resending them all in one series to hopefully make it easier to get them picked up by having them in the correct order to avoid merge conflicts. This series is based on the clk/clk-davinci-psc-da830 branch.
I picked them all and pushed to clk/clk-davinci based on -rc1. There are some comments on the individual patches, all of which are of the "please revisit this and fix it up later" variety.
Going forward I'm happy for you and/or Sekhar to send clk PRs to Stephen and myself. The same rules apply for PRs: all patches need to be posted to the list the old fashioned way for review. But PRs make our lives a bit easier, especially when dealing with chip variants from the same SoC family like we have with davinci.
Best regards,
Mike
Quoted 35 lines
David Lechner (7):
clk: davinci: pll-dm355: droppll2_sysclk2
clk: davinci: pll-dm355: fix SYSCLKn parent names
clk: davinci: psc-dm355: fix ASP0/1 clkdev lookups
clk: davinci: pll: allow dev == NULL
clk: davinci: da850-pll: change PLL0 toCLK_OF_DECLARE
clk: davinci: psc: allow for dev == NULL
clk: davinci: Fix link errors when not all SoCs are enabledSekhar Nori (2):
clk: davinci: pll-dm646x: keep PLL2 SYSCLK1 always enabled
clk: davinci: psc-dm365: fix few clocksdrivers/clk/davinci/pll-da830.c | 5 +- drivers/clk/davinci/pll-da850.c | 37 ++-- drivers/clk/davinci/pll-dm355.c | 22 ++- drivers/clk/davinci/pll-dm365.c | 9 +- drivers/clk/davinci/pll-dm644x.c | 9 +- drivers/clk/davinci/pll-dm646x.c | 11 +- drivers/clk/davinci/pll.c | 299 +++++++++++++++++++++---------- drivers/clk/davinci/pll.h | 41 +++-- drivers/clk/davinci/psc-dm355.c | 7 +- drivers/clk/davinci/psc-dm365.c | 22 ++- drivers/clk/davinci/psc-dm644x.c | 3 +- drivers/clk/davinci/psc-dm646x.c | 3 +- drivers/clk/davinci/psc.c | 72 ++++++-- drivers/clk/davinci/psc.h | 12 ++ include/linux/clk/davinci.h | 40 +++++ 15 files changed, 418 insertions(+), 174 deletions(-) create mode 100644 include/linux/clk/davinci.hSignature · 1 line
2.17.0
Quoted 18 lines · Michael Turquette
Hi David,
Quoting David Lechner (2018-05-25 11:11:41)
Quoted 10 lines
This is a resend of all of the outstanding DaVinci clock patches plus one new patch. All of the patches (except the new one) have been reviewed and tested by someone other than me.
The new patch ("clk: davinci: Fix link errors when not all SoCs are enabled") should be fairly trivial.
I am resending them all in one series to hopefully make it easier to get them picked up by having them in the correct order to avoid merge conflicts. This series is based on the clk/clk-davinci-psc-da830 branch.
I picked them all and pushed to clk/clk-davinci based on -rc1. There are some comments on the individual patches, all of which are of the "please revisit this and fix it up later" variety.
Quoted 5 lines
Going forward I'm happy for you and/or Sekhar to send clk PRs to Stephen and myself. The same rules apply for PRs: all patches need to be posted to the list the old fashioned way for review. But PRs make our lives a bit easier, especially when dealing with chip variants from the same SoC family like we have with davinci.
Thanks Mike! David is listed as maintainer for drivers/clk/davinci/* and I believe he can be generating pull requests going forward. I can work as the backup, of course.
Regards,
Sekhar