Re: [linux-pm] [PATCH v4 2/4] mfd: omap: control: core system control driver
* Konstantin Baydarov kbaida...@dev.rtsoft.ru [120809 04:00]: Hi, Tony. On 08/08/2012 06:59 PM, Konstantin Baydarov wrote: Yes, omap_type() is called very early , that is why I'm using early_initcall for omap_control_base initialization. Do you mean following?: void __init omap2_set_globals_control(struct omap_globals *omap2_globals) { if (omap2_globals-ctrl) omap2_ctrl_base = omap2_globals-ctrl; if (omap2_globals-ctrl_pad) omap4_ctrl_pad_base = omap2_globals-ctrl_pad; omap_control_base = omap2_ctrl_base; // this line is added } Sorry for the confusion - the code above isn't correct. First, as omap-control-core.c driver maps only control module status register the omap_control_base should be renamed to omap_control_status_reg: Heh right :) And that makes the patch I posted wrong too. @@ -156,6 +158,20 @@ void __init omap2_set_globals_control(struct omap_globals *omap2_globals) if (omap2_globals-ctrl_pad) omap4_ctrl_pad_base = omap2_globals-ctrl_pad; + + omap_control_status_reg = omap2_ctrl_base; + if (cpu_is_omap24xx()) + omap_control_status_reg += OMAP24XX_CONTROL_STATUS; + else if (soc_is_am33xx()) + omap_control_status_reg += AM33XX_CONTROL_STATUS; + else if (cpu_is_omap34xx()) + omap_control_status_reg += OMAP343X_CONTROL_STATUS; + else if (cpu_is_omap44xx()) + omap_control_status_reg += OMAP4_CTRL_MODULE_CORE_STATUS; + else if (soc_is_omap54xx()) + omap_control_status_reg += OMAP5XXX_CONTROL_STATUS; + else + omap_control_status_reg = 0; } We can get rid of the if else SoC check here too. And we can limit the control_status tinkering to id.c. Here's an updated clean-up patch. Regards, Tony From: Tony Lindgren t...@atomide.com Date: Wed, 8 Aug 2012 23:13:03 -0700 Subject: [PATCH] ARM: OMAP2+: Initialize things for omap_type() to simplify SoC detection Let's rename omap2_set_globals_tap() to omap2_set_globals_id() and update the comments to remove old comments about map_io() as we don't need SoC detection for map_io() any longer. Let's also initialize control_status_reg with omap2_set_globals_id() so we can avoid SoC tests every time omap_type() gets called. Note that this patch sets the ti81xx to always return GP mode as the mode bits seem to be marked as reserved in ti81xx TRM. Signed-off-by: Tony Lindgren t...@atomide.com diff --git a/arch/arm/mach-omap2/common.c b/arch/arm/mach-omap2/common.c index 069f972..64afeee 100644 --- a/arch/arm/mach-omap2/common.c +++ b/arch/arm/mach-omap2/common.c @@ -31,7 +31,7 @@ static void __init __omap2_set_globals(struct omap_globals *omap2_globals) { - omap2_set_globals_tap(omap2_globals); + omap2_set_globals_id(omap2_globals); omap2_set_globals_sdrc(omap2_globals); omap2_set_globals_control(omap2_globals); omap2_set_globals_prcm(omap2_globals); @@ -45,6 +45,8 @@ static struct omap_globals omap242x_globals = { .sdrc = OMAP2_L3_IO_ADDRESS(OMAP2420_SDRC_BASE), .sms= OMAP2_L3_IO_ADDRESS(OMAP2420_SMS_BASE), .ctrl = OMAP2_L4_IO_ADDRESS(OMAP242X_CTRL_BASE), + .ctrl_status= OMAP2_L4_IO_ADDRESS(OMAP242X_CTRL_BASE) + + OMAP24XX_CONTROL_STATUS, .prm= OMAP2_L4_IO_ADDRESS(OMAP2420_PRM_BASE), .cm = OMAP2_L4_IO_ADDRESS(OMAP2420_CM_BASE), }; @@ -68,6 +70,8 @@ static struct omap_globals omap243x_globals = { .sdrc = OMAP2_L3_IO_ADDRESS(OMAP243X_SDRC_BASE), .sms= OMAP2_L3_IO_ADDRESS(OMAP243X_SMS_BASE), .ctrl = OMAP2_L4_IO_ADDRESS(OMAP243X_CTRL_BASE), + .ctrl_status= OMAP2_L4_IO_ADDRESS(OMAP243X_CTRL_BASE) + + OMAP24XX_CONTROL_STATUS, .prm= OMAP2_L4_IO_ADDRESS(OMAP2430_PRM_BASE), .cm = OMAP2_L4_IO_ADDRESS(OMAP2430_CM_BASE), }; @@ -91,6 +95,8 @@ static struct omap_globals omap3_globals = { .sdrc = OMAP2_L3_IO_ADDRESS(OMAP343X_SDRC_BASE), .sms= OMAP2_L3_IO_ADDRESS(OMAP343X_SMS_BASE), .ctrl = OMAP2_L4_IO_ADDRESS(OMAP343X_CTRL_BASE), + .ctrl_status= OMAP2_L4_IO_ADDRESS(OMAP343X_CTRL_BASE) + + OMAP343X_CONTROL_STATUS, .prm= OMAP2_L4_IO_ADDRESS(OMAP3430_PRM_BASE), .cm = OMAP2_L4_IO_ADDRESS(OMAP3430_CM_BASE), }; @@ -117,6 +123,8 @@ static struct omap_globals ti81xx_globals = { .class = OMAP343X_CLASS, .tap= OMAP2_L4_IO_ADDRESS(TI81XX_TAP_BASE), .ctrl = OMAP2_L4_IO_ADDRESS(TI81XX_CTRL_BASE), + .ctrl_status = OMAP2_L4_IO_ADDRESS(TI81XX_CTRL_BASE) + + TI81XX_CONTROL_STATUS, .prm= OMAP2_L4_IO_ADDRESS(TI81XX_PRCM_BASE), .cm = OMAP2_L4_IO_ADDRESS(TI81XX_PRCM_BASE), }; @@ -140,6 +148,8 @@ static struct omap_globals am33xx_globals = { .class =
Re: [linux-pm] [PATCH v4 2/4] mfd: omap: control: core system control driver
* Konstantin Baydarov kbaida...@dev.rtsoft.ru [120808 07:59]: On 08/08/2012 06:39 PM, Tony Lindgren wrote: Yes, omap_type() is called very early , that is why I'm using early_initcall for omap_control_base initialization. Do you mean following?: void __init omap2_set_globals_control(struct omap_globals *omap2_globals) { if (omap2_globals-ctrl) omap2_ctrl_base = omap2_globals-ctrl; if (omap2_globals-ctrl_pad) omap4_ctrl_pad_base = omap2_globals-ctrl_pad; omap_control_base = omap2_ctrl_base; // this line is added } OK so we already have set_globals_control, but we're not using it.. No need for this line is added above. Let's do the attached clean-up patch and just leave omap_control_base out of the driver for now as it's not currently needed there. If omap_control_base is needed in the driver, then we need to pass it in the platform_data to the driver for the non-DT boot case, or parse it from DT like you're doing. Regards, Tony From: Tony Lindgren t...@atomide.com Date: Wed, 8 Aug 2012 23:13:03 -0700 Subject: [PATCH] ARM: OMAP2+: Change omap_type() to use omap_ctrl_base_get() We have the SoC specific ctrl_base already initialized in set_globals. Signed-off-by: Tony Lindgren t...@atomide.com --- a/arch/arm/mach-omap2/id.c +++ b/arch/arm/mach-omap2/id.c @@ -42,28 +42,20 @@ int omap_type(void) { u32 val = 0; - if (cpu_is_omap24xx()) { - val = omap_ctrl_readl(OMAP24XX_CONTROL_STATUS); - } else if (soc_is_am33xx()) { - val = omap_ctrl_readl(AM33XX_CONTROL_STATUS); - } else if (cpu_is_omap34xx()) { - val = omap_ctrl_readl(OMAP343X_CONTROL_STATUS); - } else if (cpu_is_omap44xx()) { - val = omap_ctrl_readl(OMAP4_CTRL_MODULE_CORE_STATUS); - } else if (soc_is_omap54xx()) { - val = omap_ctrl_readl(OMAP5XXX_CONTROL_STATUS); + val = __raw_readl(omap_ctrl_base_get()); + if (!val) { + pr_err(Cannot detect omap type!\n); + return 0; + } + + if (soc_is_omap54xx()) { val = OMAP5_DEVICETYPE_MASK; val = 6; - goto out; } else { - pr_err(Cannot detect omap type!\n); - goto out; + val = OMAP2_DEVICETYPE_MASK; + val = 8; } - val = OMAP2_DEVICETYPE_MASK; - val = 8; - -out: return val; } EXPORT_SYMBOL(omap_type); -- To unsubscribe from this list: send the line unsubscribe linux-omap in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [linux-pm] [PATCH v4 2/4] mfd: omap: control: core system control driver
Hi, Tony. On 08/08/2012 06:59 PM, Konstantin Baydarov wrote: Yes, omap_type() is called very early , that is why I'm using early_initcall for omap_control_base initialization. Do you mean following?: void __init omap2_set_globals_control(struct omap_globals *omap2_globals) { if (omap2_globals-ctrl) omap2_ctrl_base = omap2_globals-ctrl; if (omap2_globals-ctrl_pad) omap4_ctrl_pad_base = omap2_globals-ctrl_pad; omap_control_base = omap2_ctrl_base; // this line is added } Sorry for the confusion - the code above isn't correct. First, as omap-control-core.c driver maps only control module status register the omap_control_base should be renamed to omap_control_status_reg: --- a/drivers/mfd/omap-control-core.c +++ b/drivers/mfd/omap-control-core.c @@ -35,13 +35,15 @@ #include linux/of.h #include linux/of_address.h -void __iomem *omap_control_base; +void __iomem *omap_control_status_reg; unsigned long omap_control_phys_base; size_t omap_control_mapsize; u32 omap_control_status_read(void) Then, if you want to move omap_control_status_reg(omap_control_base) initialization to the omap2_set_globals_control(), it can be done following way: --- a/arch/arm/mach-omap2/control.c +++ b/arch/arm/mach-omap2/control.c @@ -149,6 +149,8 @@ static struct omap3_control_regs control_context; #define OMAP_CTRL_REGADDR(reg) (omap2_ctrl_base + (reg)) #define OMAP4_CTRL_PAD_REGADDR(reg)(omap4_ctrl_pad_base + (reg)) +extern void __iomem *omap_control_status_reg; + void __init omap2_set_globals_control(struct omap_globals *omap2_globals) { if (omap2_globals-ctrl) @@ -156,6 +158,20 @@ void __init omap2_set_globals_control(struct omap_globals *omap2_globals) if (omap2_globals-ctrl_pad) omap4_ctrl_pad_base = omap2_globals-ctrl_pad; + + omap_control_status_reg = omap2_ctrl_base; + if (cpu_is_omap24xx()) + omap_control_status_reg += OMAP24XX_CONTROL_STATUS; + else if (soc_is_am33xx()) + omap_control_status_reg += AM33XX_CONTROL_STATUS; + else if (cpu_is_omap34xx()) + omap_control_status_reg += OMAP343X_CONTROL_STATUS; + else if (cpu_is_omap44xx()) + omap_control_status_reg += OMAP4_CTRL_MODULE_CORE_STATUS; + else if (soc_is_omap54xx()) + omap_control_status_reg += OMAP5XXX_CONTROL_STATUS; + else + omap_control_status_reg = 0; } void __iomem *omap_ctrl_base_get(void) Then omap_type() can be changed: diff --git a/arch/arm/mach-omap2/id.c b/arch/arm/mach-omap2/id.c index 8018cad..916b3f6 100644 --- a/arch/arm/mach-omap2/id.c +++ b/arch/arm/mach-omap2/id.c @@ -39,31 +39,27 @@ unsigned int omap_rev(void) } EXPORT_SYMBOL(omap_rev); +extern void __iomem *omap_control_status_reg; + int omap_type(void) { u32 val = 0; - if (cpu_is_omap24xx()) { - val = omap_control_status_read(); - } else if (soc_is_am33xx()) { - val = omap_control_status_read(); - } else if (cpu_is_omap34xx()) { - val = omap_control_status_read(); - } else if (cpu_is_omap44xx()) { + if(!omap_control_status_reg) { + pr_err(Cannot detect omap type!\n); + goto out; + } + + if(!soc_is_omap54xx()) { val = omap_control_status_read(); - } else if (soc_is_omap54xx()) { + val = OMAP2_DEVICETYPE_MASK; + val = 8; + } else { val = omap_control_status_read(); val = OMAP5_DEVICETYPE_MASK; val = 6; - goto out; - } else { - pr_err(Cannot detect omap type!\n); - goto out; } - val = OMAP2_DEVICETYPE_MASK; - val = 8; - out: return val; } BR, Konstantin Baydarov. Or you suggest to move void __init of_omap_control_init(const struct of_device_id *matches) { struct device_node *np; struct property *pp = 0; for_each_matching_node(np, matches) { pp = of_find_property(np, reg, NULL); if(pp) { omap_control_phys_base = (unsigned long)be32_to_cpup(pp-value); omap_control_mapsize = (size_t)be32_to_cpup( (void*)((char*)pp-value + 4) ); /* * Map control module register CONTROL_STATUS register: * omap24xx - OMAP24XX_CONTROL_STATUS * am33xx - AM33XX_CONTROL_STATUS * omap34xx - OMAP343X_CONTROL_STATUS * omap44xx - OMAP4_CTRL_MODULE_CORE_STATUS * omap54xx - OMAP5XXX_CONTROL_STATUS */ omap_control_base = ioremap(omap_control_phys_base, omap_control_mapsize); } } } into omap2_set_globals_control() ? Also if we move omap_control_base initialization to omap2_set_globals_control(), than the initialization routine of drivers/mfd/omap-control-core.c
Re: [linux-pm] [PATCH v4 2/4] mfd: omap: control: core system control driver
* Tony Lindgren t...@atomide.com [120808 07:05]: * Konstantin Baydarov kbaida...@dev.rtsoft.ru [120725 04:10]: + +u32 omap_control_status_read(void) +{ + return __raw_readl(omap_control_base); +} Ah OK it's changed here.. Sorry I was looking at the older version. +void __init of_omap_control_init(const struct of_device_id *matches) +{ + struct device_node *np; + struct property *pp = 0; + + for_each_matching_node(np, matches) { + pp = of_find_property(np, reg, NULL); + if(pp) { + omap_control_phys_base = (unsigned long)be32_to_cpup(pp-value); + omap_control_mapsize = (size_t)be32_to_cpup( (void*)((char*)pp-value + 4) ); + /* +* Map control module register CONTROL_STATUS register: +* omap24xx - OMAP24XX_CONTROL_STATUS +* am33xx - AM33XX_CONTROL_STATUS +* omap34xx - OMAP343X_CONTROL_STATUS +* omap44xx - OMAP4_CTRL_MODULE_CORE_STATUS +* omap54xx - OMAP5XXX_CONTROL_STATUS +*/ + omap_control_base = ioremap(omap_control_phys_base, omap_control_mapsize); + } + } +} You should probably add a function for setting omap_control_base separately from *set_globals* in arch/arm/mach-omap2/common.c. That way it's initialized early for id.c, and you can initialize everything else later as regular device drivers. FYI, we want to initialize as much as possible late so we have proper debugging console set up in case things go wrong. Hmm it seems that omap_control_base is now only initialized for DT boot case? This will break booting on almost all systems.. Tony -- To unsubscribe from this list: send the line unsubscribe linux-omap in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [linux-pm] [PATCH v4 2/4] mfd: omap: control: core system control driver
* Tony Lindgren t...@atomide.com [120808 07:11]: * Tony Lindgren t...@atomide.com [120808 07:05]: * Konstantin Baydarov kbaida...@dev.rtsoft.ru [120725 04:10]: + +u32 omap_control_status_read(void) +{ + return __raw_readl(omap_control_base); +} Ah OK it's changed here.. Sorry I was looking at the older version. +void __init of_omap_control_init(const struct of_device_id *matches) +{ + struct device_node *np; + struct property *pp = 0; + + for_each_matching_node(np, matches) { + pp = of_find_property(np, reg, NULL); + if(pp) { + omap_control_phys_base = (unsigned long)be32_to_cpup(pp-value); + omap_control_mapsize = (size_t)be32_to_cpup( (void*)((char*)pp-value + 4) ); + /* + * Map control module register CONTROL_STATUS register: + * omap24xx - OMAP24XX_CONTROL_STATUS + * am33xx - AM33XX_CONTROL_STATUS + * omap34xx - OMAP343X_CONTROL_STATUS + * omap44xx - OMAP4_CTRL_MODULE_CORE_STATUS + * omap54xx - OMAP5XXX_CONTROL_STATUS + */ + omap_control_base = ioremap(omap_control_phys_base, omap_control_mapsize); + } + } +} You should probably add a function for setting omap_control_base separately from *set_globals* in arch/arm/mach-omap2/common.c. That way it's initialized early for id.c, and you can initialize everything else later as regular device drivers. FYI, we want to initialize as much as possible late so we have proper debugging console set up in case things go wrong. Hmm it seems that omap_control_base is now only initialized for DT boot case? This will break booting on almost all systems.. Looking at things more, looks like omap_type() is getting called early from timer.c. So maybe just let set_globals initialize omap_control_base and let omap_type() read that directly. That way the SCM core driver can behave like a regular device driver and it does not need to be initialized early. Regards, Tony -- To unsubscribe from this list: send the line unsubscribe linux-omap in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [linux-pm] [PATCH v4 2/4] mfd: omap: control: core system control driver
Hi, Tony. On 08/08/2012 06:39 PM, Tony Lindgren wrote: * Tony Lindgren t...@atomide.com [120808 07:11]: * Tony Lindgren t...@atomide.com [120808 07:05]: * Konstantin Baydarov kbaida...@dev.rtsoft.ru [120725 04:10]: + +u32 omap_control_status_read(void) +{ + return __raw_readl(omap_control_base); +} Ah OK it's changed here.. Sorry I was looking at the older version. +void __init of_omap_control_init(const struct of_device_id *matches) +{ + struct device_node *np; + struct property *pp = 0; + + for_each_matching_node(np, matches) { + pp = of_find_property(np, reg, NULL); + if(pp) { + omap_control_phys_base = (unsigned long)be32_to_cpup(pp-value); + omap_control_mapsize = (size_t)be32_to_cpup( (void*)((char*)pp-value + 4) ); + /* + * Map control module register CONTROL_STATUS register: + * omap24xx - OMAP24XX_CONTROL_STATUS + * am33xx - AM33XX_CONTROL_STATUS + * omap34xx - OMAP343X_CONTROL_STATUS + * omap44xx - OMAP4_CTRL_MODULE_CORE_STATUS + * omap54xx - OMAP5XXX_CONTROL_STATUS + */ + omap_control_base = ioremap(omap_control_phys_base, omap_control_mapsize); + } + } +} You should probably add a function for setting omap_control_base separately from *set_globals* in arch/arm/mach-omap2/common.c. That way it's initialized early for id.c, and you can initialize everything else later as regular device drivers. FYI, we want to initialize as much as possible late so we have proper debugging console set up in case things go wrong. Hmm it seems that omap_control_base is now only initialized for DT boot case? This will break booting on almost all systems.. Looking at things more, looks like omap_type() is getting called early from timer.c. So maybe just let set_globals initialize omap_control_base and let omap_type() read that directly. That way the SCM core driver can behave like a regular device driver and it does not need to be initialized early. Yes, omap_type() is called very early , that is why I'm using early_initcall for omap_control_base initialization. Do you mean following?: void __init omap2_set_globals_control(struct omap_globals *omap2_globals) { if (omap2_globals-ctrl) omap2_ctrl_base = omap2_globals-ctrl; if (omap2_globals-ctrl_pad) omap4_ctrl_pad_base = omap2_globals-ctrl_pad; omap_control_base = omap2_ctrl_base; // this line is added } Or you suggest to move void __init of_omap_control_init(const struct of_device_id *matches) { struct device_node *np; struct property *pp = 0; for_each_matching_node(np, matches) { pp = of_find_property(np, reg, NULL); if(pp) { omap_control_phys_base = (unsigned long)be32_to_cpup(pp-value); omap_control_mapsize = (size_t)be32_to_cpup( (void*)((char*)pp-value + 4) ); /* * Map control module register CONTROL_STATUS register: * omap24xx - OMAP24XX_CONTROL_STATUS * am33xx - AM33XX_CONTROL_STATUS * omap34xx - OMAP343X_CONTROL_STATUS * omap44xx - OMAP4_CTRL_MODULE_CORE_STATUS * omap54xx - OMAP5XXX_CONTROL_STATUS */ omap_control_base = ioremap(omap_control_phys_base, omap_control_mapsize); } } } into omap2_set_globals_control() ? Also if we move omap_control_base initialization to omap2_set_globals_control(), than the initialization routine of drivers/mfd/omap-control-core.c become empty, because omap_control_base is the only thing that is initialized in omap-control-core driver. BR, Konstantin Baydarov. Regards, Tony -- To unsubscribe from this list: send the line unsubscribe linux-omap in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line unsubscribe linux-omap in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html