Message ID | 1521168778-27236-26-git-send-email-david@lechnology.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Friday 16 March 2018 08:22 AM, David Lechner wrote: > +static struct resource dm644x_pll1_resources[] = { > + { > + .start = DAVINCI_PLL1_BASE, > + .end = DAVINCI_PLL1_BASE + SZ_4K - 1, The .end should be DAVINCI_PLL1_BASE + SZ_1K - 1, otherwise it prevents PLL2 from getting registered. > + .flags = IORESOURCE_MEM, > + }, > +}; > + > +static struct platform_device dm644x_pll1_device = { > + .name = "dm644x-pll1", > + .id = -1, > + .resource = dm644x_pll1_resources, > + .num_resources = ARRAY_SIZE(dm644x_pll1_resources), > +}; > + > +static struct resource dm644x_pll2_resources[] = { > + { > + .start = DAVINCI_PLL2_BASE, > + .end = DAVINCI_PLL2_BASE + SZ_4K - 1, And this too should be fixed, else it prevents the PSC from getting registered. > + .flags = IORESOURCE_MEM, > + }, > +}; With these fixed, I still had to enable 'clk_ignore_unused' on DM644x EVM to get to NFS boot. I think root of the problem is that pm_runtime() APIs are not working in the legacy boot mode. This can be seen even on the DA850 LCDK in legacy boot. pm_genpd_summary in debugfs shows all domains are off and there are no devices registered under the "da850-psc1: emac" domain. NFS mounting still works on the DA850 LCDK because clk_summary shows enable and prepare count of 4 for emac. Not sure how that's happening. But on DM644x EVM, the emac clock enable count is 0. Still looking at whats going wrong here. I am testing your v8 branch with clk-davinci branch from clk-next merged to get the fixes Stephen made. Thanks, Sekhar
On 04/03/2018 05:26 AM, Sekhar Nori wrote: > On Friday 16 March 2018 08:22 AM, David Lechner wrote: >> +static struct resource dm644x_pll1_resources[] = { >> + { >> + .start = DAVINCI_PLL1_BASE, >> + .end = DAVINCI_PLL1_BASE + SZ_4K - 1, > > The .end should be DAVINCI_PLL1_BASE + SZ_1K - 1, otherwise it prevents > PLL2 from getting registered. > >> + .flags = IORESOURCE_MEM, >> + }, >> +}; >> + >> +static struct platform_device dm644x_pll1_device = { >> + .name = "dm644x-pll1", >> + .id = -1, >> + .resource = dm644x_pll1_resources, >> + .num_resources = ARRAY_SIZE(dm644x_pll1_resources), >> +}; >> + >> +static struct resource dm644x_pll2_resources[] = { >> + { >> + .start = DAVINCI_PLL2_BASE, >> + .end = DAVINCI_PLL2_BASE + SZ_4K - 1, > > And this too should be fixed, else it prevents the PSC from getting > registered. > >> + .flags = IORESOURCE_MEM, >> + }, >> +}; > > With these fixed, I still had to enable 'clk_ignore_unused' on DM644x > EVM to get to NFS boot. I think root of the problem is that pm_runtime() > APIs are not working in the legacy boot mode. > > This can be seen even on the DA850 LCDK in legacy boot. pm_genpd_summary > in debugfs shows all domains are off and there are no devices registered > under the "da850-psc1: emac" domain. NFS mounting still works on the > DA850 LCDK because clk_summary shows enable and prepare count of 4 for > emac. Not sure how that's happening. But on DM644x EVM, the emac clock > enable count is 0. > > Still looking at whats going wrong here. I am testing your v8 branch > with clk-davinci branch from clk-next merged to get the fixes Stephen made. > In legacy mode, genpd is not being used. I didn't see any mechanism for genpd lookup without device tree. So, we are still relying on the matching in arch/arm/mach-davinci/pm_domain.c. I suspect we need to fix the clock lookups in drivers/clk/davinci/psc-dm644x.c. LPSC_CLKDEV2(emac_clkdev, NULL, "davinci_emac.1", "fck", "davinci_mdio.0"); NULL might need to be changed to "fck" to be picked up by pm matching and "davinci_emac.1" should be verified that it matches the actual EMAC device name.
On Tuesday 03 April 2018 10:00 PM, David Lechner wrote: > On 04/03/2018 05:26 AM, Sekhar Nori wrote: >> On Friday 16 March 2018 08:22 AM, David Lechner wrote: >>> +static struct resource dm644x_pll1_resources[] = { >>> + { >>> + .start = DAVINCI_PLL1_BASE, >>> + .end = DAVINCI_PLL1_BASE + SZ_4K - 1, >> >> The .end should be DAVINCI_PLL1_BASE + SZ_1K - 1, otherwise it prevents >> PLL2 from getting registered. >> >>> + .flags = IORESOURCE_MEM, >>> + }, >>> +}; >>> + >>> +static struct platform_device dm644x_pll1_device = { >>> + .name = "dm644x-pll1", >>> + .id = -1, >>> + .resource = dm644x_pll1_resources, >>> + .num_resources = ARRAY_SIZE(dm644x_pll1_resources), >>> +}; >>> + >>> +static struct resource dm644x_pll2_resources[] = { >>> + { >>> + .start = DAVINCI_PLL2_BASE, >>> + .end = DAVINCI_PLL2_BASE + SZ_4K - 1, >> >> And this too should be fixed, else it prevents the PSC from getting >> registered. >> >>> + .flags = IORESOURCE_MEM, >>> + }, >>> +}; >> >> With these fixed, I still had to enable 'clk_ignore_unused' on DM644x >> EVM to get to NFS boot. I think root of the problem is that pm_runtime() >> APIs are not working in the legacy boot mode. >> >> This can be seen even on the DA850 LCDK in legacy boot. pm_genpd_summary >> in debugfs shows all domains are off and there are no devices registered >> under the "da850-psc1: emac" domain. NFS mounting still works on the >> DA850 LCDK because clk_summary shows enable and prepare count of 4 for >> emac. Not sure how that's happening. But on DM644x EVM, the emac clock >> enable count is 0. >> >> Still looking at whats going wrong here. I am testing your v8 branch >> with clk-davinci branch from clk-next merged to get the fixes Stephen >> made. >> > > In legacy mode, genpd is not being used. I didn't see any mechanism for Ah, I got stumped by the genpd related debug entries popping up. Probably something should be done to make sure they don't show up in legacy boot. And some comments to that effect in psc.c will help. > genpd lookup without device tree. So, we are still relying on the > matching in arch/arm/mach-davinci/pm_domain.c. This is fine. We just need legacy boot to keep working without regressions. > > I suspect we need to fix the clock lookups in > drivers/clk/davinci/psc-dm644x.c. > > LPSC_CLKDEV2(emac_clkdev, NULL, "davinci_emac.1", > "fck", "davinci_mdio.0"); > > NULL might need to be changed to "fck" to be picked up by pm matching > and "davinci_emac.1" should be verified that it matches the actual EMAC > device name. NULL con_id matches what we have for DA850 and also what we had for DM644x prior to CCF conversion. So, I did not really suspect that. The device name does match. I will check what else could be going on based on your input. Thanks, Sekhar
On Wednesday 04 April 2018 12:17 PM, Sekhar Nori wrote: > On Tuesday 03 April 2018 10:00 PM, David Lechner wrote: >> On 04/03/2018 05:26 AM, Sekhar Nori wrote: >>> On Friday 16 March 2018 08:22 AM, David Lechner wrote: >>>> +static struct resource dm644x_pll1_resources[] = { >>>> + { >>>> + .start = DAVINCI_PLL1_BASE, >>>> + .end = DAVINCI_PLL1_BASE + SZ_4K - 1, >>> >>> The .end should be DAVINCI_PLL1_BASE + SZ_1K - 1, otherwise it prevents >>> PLL2 from getting registered. >>> >>>> + .flags = IORESOURCE_MEM, >>>> + }, >>>> +}; >>>> + >>>> +static struct platform_device dm644x_pll1_device = { >>>> + .name = "dm644x-pll1", >>>> + .id = -1, >>>> + .resource = dm644x_pll1_resources, >>>> + .num_resources = ARRAY_SIZE(dm644x_pll1_resources), >>>> +}; >>>> + >>>> +static struct resource dm644x_pll2_resources[] = { >>>> + { >>>> + .start = DAVINCI_PLL2_BASE, >>>> + .end = DAVINCI_PLL2_BASE + SZ_4K - 1, >>> >>> And this too should be fixed, else it prevents the PSC from getting >>> registered. >>> >>>> + .flags = IORESOURCE_MEM, >>>> + }, >>>> +}; >>> >>> With these fixed, I still had to enable 'clk_ignore_unused' on DM644x >>> EVM to get to NFS boot. I think root of the problem is that pm_runtime() >>> APIs are not working in the legacy boot mode. >>> >>> This can be seen even on the DA850 LCDK in legacy boot. pm_genpd_summary >>> in debugfs shows all domains are off and there are no devices registered >>> under the "da850-psc1: emac" domain. NFS mounting still works on the >>> DA850 LCDK because clk_summary shows enable and prepare count of 4 for >>> emac. Not sure how that's happening. But on DM644x EVM, the emac clock >>> enable count is 0. >>> >>> Still looking at whats going wrong here. I am testing your v8 branch >>> with clk-davinci branch from clk-next merged to get the fixes Stephen >>> made. >>> >> >> In legacy mode, genpd is not being used. I didn't see any mechanism for > > Ah, I got stumped by the genpd related debug entries popping up. > Probably something should be done to make sure they don't show up in > legacy boot. And some comments to that effect in psc.c will help. > >> genpd lookup without device tree. So, we are still relying on the >> matching in arch/arm/mach-davinci/pm_domain.c. > > This is fine. We just need legacy boot to keep working without regressions. > >> >> I suspect we need to fix the clock lookups in >> drivers/clk/davinci/psc-dm644x.c. >> >> LPSC_CLKDEV2(emac_clkdev, NULL, "davinci_emac.1", >> "fck", "davinci_mdio.0"); >> >> NULL might need to be changed to "fck" to be picked up by pm matching >> and "davinci_emac.1" should be verified that it matches the actual EMAC >> device name. > > NULL con_id matches what we have for DA850 and also what we had for > DM644x prior to CCF conversion. So, I did not really suspect that. The > device name does match. I will check what else could be going on based > on your input. This issue is because emac platform device is getting registered really early on dm644x even before the clocks are ready in postcore_initcall(). I will send a patch fixing that. Thanks, Sekhar
On 04/03/2018 05:26 AM, Sekhar Nori wrote: > On Friday 16 March 2018 08:22 AM, David Lechner wrote: >> +static struct resource dm644x_pll1_resources[] = { >> + { >> + .start = DAVINCI_PLL1_BASE, >> + .end = DAVINCI_PLL1_BASE + SZ_4K - 1, > > The .end should be DAVINCI_PLL1_BASE + SZ_1K - 1, otherwise it prevents > PLL2 from getting registered. > >> + .flags = IORESOURCE_MEM, >> + }, >> +}; >> + >> +static struct platform_device dm644x_pll1_device = { >> + .name = "dm644x-pll1", >> + .id = -1, >> + .resource = dm644x_pll1_resources, >> + .num_resources = ARRAY_SIZE(dm644x_pll1_resources), >> +}; >> + >> +static struct resource dm644x_pll2_resources[] = { >> + { >> + .start = DAVINCI_PLL2_BASE, >> + .end = DAVINCI_PLL2_BASE + SZ_4K - 1, > > And this too should be fixed, else it prevents the PSC from getting > registered. Thanks. I've checked and this needs to be fixed for dm646x, dm355 and dm365 as well.
diff --git a/arch/arm/mach-davinci/board-dm644x-evm.c b/arch/arm/mach-davinci/board-dm644x-evm.c index 95b55aa..91c7525 100644 --- a/arch/arm/mach-davinci/board-dm644x-evm.c +++ b/arch/arm/mach-davinci/board-dm644x-evm.c @@ -768,6 +768,8 @@ static __init void davinci_evm_init(void) struct clk *aemif_clk; struct davinci_soc_info *soc_info = &davinci_soc_info; + dm644x_register_clocks(); + ret = dm644x_gpio_register(); if (ret) pr_warn("%s: GPIO init failed: %d\n", __func__, ret); diff --git a/arch/arm/mach-davinci/board-neuros-osd2.c b/arch/arm/mach-davinci/board-neuros-osd2.c index f287577..ae17d3e 100644 --- a/arch/arm/mach-davinci/board-neuros-osd2.c +++ b/arch/arm/mach-davinci/board-neuros-osd2.c @@ -174,6 +174,8 @@ static __init void davinci_ntosd2_init(void) struct clk *aemif_clk; struct davinci_soc_info *soc_info = &davinci_soc_info; + dm644x_register_clocks(); + ret = dm644x_gpio_register(); if (ret) pr_warn("%s: GPIO init failed: %d\n", __func__, ret); diff --git a/arch/arm/mach-davinci/board-sffsdr.c b/arch/arm/mach-davinci/board-sffsdr.c index 2922da9..933cc08 100644 --- a/arch/arm/mach-davinci/board-sffsdr.c +++ b/arch/arm/mach-davinci/board-sffsdr.c @@ -134,6 +134,8 @@ static __init void davinci_sffsdr_init(void) { struct davinci_soc_info *soc_info = &davinci_soc_info; + dm644x_register_clocks(); + platform_add_devices(davinci_sffsdr_devices, ARRAY_SIZE(davinci_sffsdr_devices)); sffsdr_init_i2c(); diff --git a/arch/arm/mach-davinci/davinci.h b/arch/arm/mach-davinci/davinci.h index c865226..2861a6f 100644 --- a/arch/arm/mach-davinci/davinci.h +++ b/arch/arm/mach-davinci/davinci.h @@ -107,6 +107,7 @@ int dm365_gpio_register(void); /* DM644x function declarations */ void dm644x_init(void); void dm644x_init_time(void); +void dm644x_register_clocks(void); void dm644x_init_asp(void); int dm644x_init_video(struct vpfe_config *, struct vpbe_config *); int dm644x_gpio_register(void); diff --git a/arch/arm/mach-davinci/dm644x.c b/arch/arm/mach-davinci/dm644x.c index 71a16fc..64f5193 100644 --- a/arch/arm/mach-davinci/dm644x.c +++ b/arch/arm/mach-davinci/dm644x.c @@ -8,28 +8,31 @@ * is licensed "as is" without any warranty of any kind, whether express * or implied. */ -#include <linux/init.h> -#include <linux/clk.h> -#include <linux/serial_8250.h> +#include <linux/clk-provider.h> #include <linux/dmaengine.h> -#include <linux/platform_device.h> +#include <linux/init.h> #include <linux/platform_data/edma.h> #include <linux/platform_data/gpio-davinci.h> +#include <linux/platform_device.h> +#include <linux/serial_8250.h> #include <asm/mach/map.h> +#include <mach/common.h> #include <mach/cputype.h> #include <mach/irqs.h> -#include "psc.h" #include <mach/mux.h> -#include <mach/time.h> #include <mach/serial.h> -#include <mach/common.h> +#include <mach/time.h> +#include "asp.h" #include "davinci.h" -#include "clock.h" #include "mux.h" -#include "asp.h" + +#ifndef CONFIG_COMMON_CLK +#include "clock.h" +#include "psc.h" +#endif /* * Device specific clocks @@ -43,6 +46,7 @@ #define DM644X_EMAC_CNTRL_RAM_OFFSET 0x2000 #define DM644X_EMAC_CNTRL_RAM_SIZE 0x2000 +#ifndef CONFIG_COMMON_CLK static struct pll_data pll1_data = { .num = 1, .phys_base = DAVINCI_PLL1_BASE, @@ -326,6 +330,7 @@ static struct clk_lookup dm644x_clks[] = { CLK("davinci-wdt", NULL, &timer2_clk), CLK(NULL, NULL, NULL), }; +#endif static struct emac_platform_data dm644x_emac_pdata = { .ctrl_reg_offset = DM644X_EMAC_CNTRL_OFFSET, @@ -934,8 +939,68 @@ void __init dm644x_init(void) void __init dm644x_init_time(void) { +#ifdef CONFIG_COMMON_CLK + struct clk *clk; + + clk = clk_register_fixed_rate(NULL, "ref_clk", NULL, 0, DM644X_REF_FREQ); + + davinci_timer_init(clk); +#else davinci_clk_init(dm644x_clks); davinci_timer_init(&timer0_clk); +#endif +} + +static struct resource dm644x_pll1_resources[] = { + { + .start = DAVINCI_PLL1_BASE, + .end = DAVINCI_PLL1_BASE + SZ_4K - 1, + .flags = IORESOURCE_MEM, + }, +}; + +static struct platform_device dm644x_pll1_device = { + .name = "dm644x-pll1", + .id = -1, + .resource = dm644x_pll1_resources, + .num_resources = ARRAY_SIZE(dm644x_pll1_resources), +}; + +static struct resource dm644x_pll2_resources[] = { + { + .start = DAVINCI_PLL2_BASE, + .end = DAVINCI_PLL2_BASE + SZ_4K - 1, + .flags = IORESOURCE_MEM, + }, +}; + +static struct platform_device dm644x_pll2_device = { + .name = "dm644x-pll2", + .id = -1, + .resource = dm644x_pll2_resources, + .num_resources = ARRAY_SIZE(dm644x_pll2_resources), +}; + +static struct resource dm644x_psc_resources[] = { + { + .start = DAVINCI_PWR_SLEEP_CNTRL_BASE, + .end = DAVINCI_PWR_SLEEP_CNTRL_BASE + SZ_4K - 1, + .flags = IORESOURCE_MEM, + }, +}; + +static struct platform_device dm644x_psc_device = { + .name = "dm644x-psc", + .id = -1, + .resource = dm644x_psc_resources, + .num_resources = ARRAY_SIZE(dm644x_psc_resources), +}; + +void __init dm644x_register_clocks(void) +{ + platform_device_register(&dm644x_pll1_device); + platform_device_register(&dm644x_pll2_device); + platform_device_register(&dm644x_psc_device); } int __init dm644x_init_video(struct vpfe_config *vpfe_cfg,
This adds the new board-specific clock init in mach-davinci/dm644x.c using the new common clock framework drivers. The #ifdefs are needed to prevent compile errors until the entire ARCH_DAVINCI is converted. Also clean up the #includes since we are adding some here. Signed-off-by: David Lechner <david@lechnology.com> --- v8 changes: - none v7 changes: - add clock platform device declarations - register platform devices instead of registering clocks directly - add davinci prefix to commit description v6 changes: - add blank lines between function calls arch/arm/mach-davinci/board-dm644x-evm.c | 2 + arch/arm/mach-davinci/board-neuros-osd2.c | 2 + arch/arm/mach-davinci/board-sffsdr.c | 2 + arch/arm/mach-davinci/davinci.h | 1 + arch/arm/mach-davinci/dm644x.c | 83 +++++++++++++++++++++++++++---- 5 files changed, 81 insertions(+), 9 deletions(-)