* [RFC PATCH v2 0/2] Syscon early initialization @ 2014-02-19 11:04 Michal Simek 2014-02-19 11:04 ` [RFC PATCH v2 1/2] mfd: syscon: Support " Michal Simek 2014-02-19 11:04 ` [RFC PATCH v2 2/2] ARM: zynq: Use early syscon initialization Michal Simek 0 siblings, 2 replies; 11+ messages in thread From: Michal Simek @ 2014-02-19 11:04 UTC (permalink / raw) To: linux-arm-kernel, Arnd Bergmann Cc: Mike Turquette, Kumar Gala, Peter Crosthwaite, Ian Campbell, Rob Herring, James Hogan, Michal Simek, Felipe Pena, Pawel Moll, Soren Brinkmann, Stephen Warren, devicetree, Stephen Boyd, Russell King, Lee Jones, Rob Herring, Josh Cartwright, Steffen Trumtrar, linux-kernel, Samuel Ortiz, Mark Rutland [-- Attachment #1: Type: text/plain, Size: 1578 bytes --] Hi, this series come from my discussion with Arnd at KS and then on some other threads/IRCs(Arnd and Mark) that SoC vendors are more and more try to add misc functionality to one memory region. For this purpose syscon driver is in the kernel. But regular syscon driver is initialized too late and platforms are trying to create specific code to handle it. For this purpose the series have been created to provide early syscon initialization and regmap creation first and then attaching device. The last patch is zynq specific patch to clear slcr driver and clock driver can profit from it too when clk regmap is ready. Also moving syscon driver from mfs should be consider. Mark already applied the first part to his regmap repo git://git.kernel.org/pub/scm/linux/kernel/git/broonie/regmap.git tags/nodev Thanks for your comments, Michal Changes in v2: - Fix bad logic in early_syscon_probe - Fix compilation failure for x86_64 reported by zero day testing system - Regmap change available here git://git.kernel.org/pub/scm/linux/kernel/git/broonie/regmap.git tags/nodev Michal Simek (2): mfd: syscon: Support early initialization ARM: zynq: Use early syscon initialization arch/arm/boot/dts/zynq-7000.dtsi | 1 + arch/arm/mach-zynq/common.c | 6 +- arch/arm/mach-zynq/slcr.c | 42 +------------ drivers/clk/zynq/clkc.c | 57 ++++++----------- drivers/mfd/syscon.c | 128 +++++++++++++++++++++++++++++++++------ include/linux/mfd/syscon.h | 11 ++++ 6 files changed, 145 insertions(+), 100 deletions(-) -- 1.8.2.3 [-- Attachment #2: Type: application/pgp-signature, Size: 198 bytes --] ^ permalink raw reply [flat|nested] 11+ messages in thread
* [RFC PATCH v2 1/2] mfd: syscon: Support early initialization 2014-02-19 11:04 [RFC PATCH v2 0/2] Syscon early initialization Michal Simek @ 2014-02-19 11:04 ` Michal Simek 2014-02-19 11:14 ` Alexander Shiyan ` (2 more replies) 2014-02-19 11:04 ` [RFC PATCH v2 2/2] ARM: zynq: Use early syscon initialization Michal Simek 1 sibling, 3 replies; 11+ messages in thread From: Michal Simek @ 2014-02-19 11:04 UTC (permalink / raw) To: linux-arm-kernel, Arnd Bergmann Cc: Michal Simek, Samuel Ortiz, Lee Jones, linux-kernel [-- Attachment #1: Type: text/plain, Size: 6497 bytes --] Some platforms need to get system controller ready as soon as possible. The patch provides early_syscon_initialization which create early mapping for all syscon compatible devices in early_syscon_probe. Regmap is get via syscon_early_regmap_lookup_by_phandle() Regular device probes attach device to regmap via regmap_attach_dev(). For early syscon initialization is necessary to extend struct syscon and provide remove function which unmap all early init structures. Signed-off-by: Michal Simek <michal.simek@xilinx.com> --- Changes in v2: - Fix bad logic in early_syscon_probe - Fix compilation failure for x86_64 reported by zero day testing system - Regmap change available here git://git.kernel.org/pub/scm/linux/kernel/git/broonie/regmap.git tags/nodev drivers/mfd/syscon.c | 128 +++++++++++++++++++++++++++++++++++++++------ include/linux/mfd/syscon.h | 11 ++++ 2 files changed, 122 insertions(+), 17 deletions(-) diff --git a/drivers/mfd/syscon.c b/drivers/mfd/syscon.c index 71841f9..8e6c611 100644 --- a/drivers/mfd/syscon.c +++ b/drivers/mfd/syscon.c @@ -20,12 +20,15 @@ #include <linux/of_platform.h> #include <linux/platform_device.h> #include <linux/regmap.h> +#include <linux/slab.h> #include <linux/mfd/syscon.h> static struct platform_driver syscon_driver; struct syscon { + void __iomem *base; struct regmap *regmap; + struct resource res; }; static int syscon_match_node(struct device *dev, void *data) @@ -95,6 +98,24 @@ struct regmap *syscon_regmap_lookup_by_pdevname(const char *s) } EXPORT_SYMBOL_GPL(syscon_regmap_lookup_by_pdevname); +struct regmap *syscon_early_regmap_lookup_by_phandle(struct device_node *np, + const char *property) +{ + struct device_node *syscon_np; + struct syscon *syscon; + + syscon_np = of_parse_phandle(np, property, 0); + if (!syscon_np) + return ERR_PTR(-ENODEV); + + syscon = syscon_np->data; + + of_node_put(syscon_np); + + return syscon->regmap; +} +EXPORT_SYMBOL_GPL(syscon_early_regmap_lookup_by_phandle); + struct regmap *syscon_regmap_lookup_by_phandle(struct device_node *np, const char *property) { @@ -128,40 +149,112 @@ static int syscon_probe(struct platform_device *pdev) struct device *dev = &pdev->dev; struct syscon *syscon; struct resource *res; - void __iomem *base; - syscon = devm_kzalloc(dev, sizeof(*syscon), GFP_KERNEL); + /* Early syscon init */ + if (pdev->dev.of_node && pdev->dev.of_node->data) { + syscon = pdev->dev.of_node->data; + res = &syscon->res; + regmap_attach_dev(dev, syscon->regmap, &syscon_regmap_config); + } else { + + syscon = devm_kzalloc(dev, sizeof(*syscon), GFP_KERNEL); + if (!syscon) + return -ENOMEM; + + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + if (!res) + return -ENOENT; + + syscon->base = devm_ioremap(dev, res->start, + resource_size(res)); + if (!syscon->base) + return -ENOMEM; + + syscon_regmap_config.max_register = res->end - res->start - 3; + syscon->regmap = devm_regmap_init_mmio(dev, syscon->base, + &syscon_regmap_config); + if (IS_ERR(syscon->regmap)) { + dev_err(dev, "regmap init failed\n"); + return PTR_ERR(syscon->regmap); + } + } + + platform_set_drvdata(pdev, syscon); + + dev_info(dev, "regmap %pR registered\n", res); + + return 0; +} + +static const struct platform_device_id syscon_ids[] = { + { "syscon", }, + { } +}; + +static int syscon_remove(struct platform_device *pdev) +{ + struct syscon *syscon = platform_get_drvdata(pdev); + + if (pdev->dev.of_node && pdev->dev.of_node->data) { + iounmap(syscon->base); + kfree(syscon); + } + + return 0; +} + +#ifdef CONFIG_OF +static int early_syscon_probe(struct device_node *np) +{ + struct syscon *syscon; + + syscon = kzalloc(sizeof(*syscon), GFP_KERNEL); if (!syscon) return -ENOMEM; - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); - if (!res) - return -ENOENT; + if (of_address_to_resource(np, 0, &syscon->res)) + return -EINVAL; - base = devm_ioremap(dev, res->start, resource_size(res)); - if (!base) - return -ENOMEM; + syscon->base = ioremap(syscon->res.start, resource_size(&syscon->res)); + if (!syscon->base) { + pr_err("%s: Unable to map I/O memory\n", __func__); + return PTR_ERR(syscon->base); + } - syscon_regmap_config.max_register = res->end - res->start - 3; - syscon->regmap = devm_regmap_init_mmio(dev, base, - &syscon_regmap_config); + syscon_regmap_config.max_register = syscon->res.end - + syscon->res.start - 3; + syscon->regmap = regmap_init_mmio(NULL, syscon->base, + &syscon_regmap_config); if (IS_ERR(syscon->regmap)) { - dev_err(dev, "regmap init failed\n"); + pr_err("regmap init failed\n"); return PTR_ERR(syscon->regmap); } - platform_set_drvdata(pdev, syscon); + np->data = syscon; - dev_info(dev, "regmap %pR registered\n", res); + of_node_put(np); + + pr_info("%s: regmap %pR registered\n", np->full_name, &syscon->res); return 0; } -static const struct platform_device_id syscon_ids[] = { - { "syscon", }, - { } +static struct of_device_id of_syscon_ids[] = { + { .compatible = "syscon" }, + {}, }; +void __init early_syscon_init(void) +{ + struct device_node *np; + + for_each_matching_node_and_match(np, of_syscon_ids, NULL) { + if (early_syscon_probe(np)) + BUG(); + } +} +#endif + static struct platform_driver syscon_driver = { .driver = { .name = "syscon", @@ -169,6 +262,7 @@ static struct platform_driver syscon_driver = { .of_match_table = of_syscon_match, }, .probe = syscon_probe, + .remove = syscon_remove, .id_table = syscon_ids, }; diff --git a/include/linux/mfd/syscon.h b/include/linux/mfd/syscon.h index 8789fa3..465c092 100644 --- a/include/linux/mfd/syscon.h +++ b/include/linux/mfd/syscon.h @@ -24,6 +24,10 @@ extern struct regmap *syscon_regmap_lookup_by_pdevname(const char *s); extern struct regmap *syscon_regmap_lookup_by_phandle( struct device_node *np, const char *property); +extern struct regmap *syscon_early_regmap_lookup_by_phandle( + struct device_node *np, + const char *property); +extern void early_syscon_init(void); #else static inline struct regmap *syscon_node_to_regmap(struct device_node *np) { @@ -46,6 +50,13 @@ static inline struct regmap *syscon_regmap_lookup_by_phandle( { return ERR_PTR(-ENOSYS); } + +static struct regmap *syscon_early_regmap_lookup_by_phandle( + struct device_node *np, + const char *property) +{ + return ERR_PTR(-ENOSYS); +} #endif #endif /* __LINUX_MFD_SYSCON_H__ */ -- 1.8.2.3 [-- Attachment #2: Type: application/pgp-signature, Size: 198 bytes --] ^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [RFC PATCH v2 1/2] mfd: syscon: Support early initialization 2014-02-19 11:04 ` [RFC PATCH v2 1/2] mfd: syscon: Support " Michal Simek @ 2014-02-19 11:14 ` Alexander Shiyan 2014-02-19 11:16 ` Alexander Shiyan 2014-02-19 11:41 ` Lee Jones 2014-05-09 12:13 ` Tushar Behera 2 siblings, 1 reply; 11+ messages in thread From: Alexander Shiyan @ 2014-02-19 11:14 UTC (permalink / raw) To: Michal Simek Cc: linux-arm-kernel, Arnd Bergmann, Michal Simek, Lee Jones, Samuel Ortiz, linux-kernel [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #1: Type: text/plain; charset=utf-8, Size: 973 bytes --] СÑеда, 19 ÑевÑÐ°Ð»Ñ 2014, 12:04 +01:00 Ð¾Ñ Michal Simek <michal.simek@xilinx.com>: > Some platforms need to get system controller > ready as soon as possible. > The patch provides early_syscon_initialization > which create early mapping for all syscon compatible > devices in early_syscon_probe. > Regmap is get via syscon_early_regmap_lookup_by_phandle() > > Regular device probes attach device to regmap > via regmap_attach_dev(). > > For early syscon initialization is necessary to extend > struct syscon and provide remove function > which unmap all early init structures. > > Signed-off-by: Michal Simek <michal.simek@xilinx.com> > --- ... > +static struct of_device_id of_syscon_ids[] = { > + { .compatible = "syscon" }, > + {}, > }; You should move syscon_ids out of #ifdef CONFIG_OF --- ÿôèº{.nÇ+·®+%Ëÿ±éݶ\x17¥wÿº{.nÇ+·¥{±þG«éÿ{ayº\x1dÊÚë,j\a¢f£¢·hïêÿêçz_è®\x03(éÝ¢j"ú\x1a¶^[m§ÿÿ¾\a«þG«éÿ¢¸?¨èÚ&£ø§~á¶iOæ¬z·vØ^\x14\x04\x1a¶^[m§ÿÿÃ\fÿ¶ìÿ¢¸?I¥ ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [RFC PATCH v2 1/2] mfd: syscon: Support early initialization 2014-02-19 11:14 ` Alexander Shiyan @ 2014-02-19 11:16 ` Alexander Shiyan 0 siblings, 0 replies; 11+ messages in thread From: Alexander Shiyan @ 2014-02-19 11:16 UTC (permalink / raw) To: Michal Simek, Michal Simek, Samuel Ortiz, Arnd Bergmann, linux-kernel, Lee Jones, linux-arm-kernel [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #1: Type: text/plain; charset=utf-8, Size: 1146 bytes --] СÑеда, 19 ÑевÑÐ°Ð»Ñ 2014, 15:14 +04:00 Ð¾Ñ Alexander Shiyan <shc_work@mail.ru>: > СÑеда, 19 ÑевÑÐ°Ð»Ñ 2014, 12:04 +01:00 Ð¾Ñ Michal Simek <michal.simek@xilinx.com>: > > Some platforms need to get system controller > > ready as soon as possible. > > The patch provides early_syscon_initialization > > which create early mapping for all syscon compatible > > devices in early_syscon_probe. > > Regmap is get via syscon_early_regmap_lookup_by_phandle() > > > > Regular device probes attach device to regmap > > via regmap_attach_dev(). > > > > For early syscon initialization is necessary to extend > > struct syscon and provide remove function > > which unmap all early init structures. > > > > Signed-off-by: Michal Simek <michal.simek@xilinx.com> > > --- > ... > > > +static struct of_device_id of_syscon_ids[] = { > > + { .compatible = "syscon" }, > > + {}, > > }; > > You should move syscon_ids out of #ifdef CONFIG_OF Oh, confused, sorry for noise. --- ÿôèº{.nÇ+·®+%Ëÿ±éݶ\x17¥wÿº{.nÇ+·¥{±þG«éÿ{ayº\x1dÊÚë,j\a¢f£¢·hïêÿêçz_è®\x03(éÝ¢j"ú\x1a¶^[m§ÿÿ¾\a«þG«éÿ¢¸?¨èÚ&£ø§~á¶iOæ¬z·vØ^\x14\x04\x1a¶^[m§ÿÿÃ\fÿ¶ìÿ¢¸?I¥ ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [RFC PATCH v2 1/2] mfd: syscon: Support early initialization 2014-02-19 11:04 ` [RFC PATCH v2 1/2] mfd: syscon: Support " Michal Simek 2014-02-19 11:14 ` Alexander Shiyan @ 2014-02-19 11:41 ` Lee Jones 2014-02-19 11:44 ` Michal Simek 2014-05-09 12:13 ` Tushar Behera 2 siblings, 1 reply; 11+ messages in thread From: Lee Jones @ 2014-02-19 11:41 UTC (permalink / raw) To: Michal Simek Cc: linux-arm-kernel, Arnd Bergmann, Michal Simek, Samuel Ortiz, linux-kernel, broonie FAO Arnd, Mark, > Some platforms need to get system controller > ready as soon as possible. > The patch provides early_syscon_initialization > which create early mapping for all syscon compatible > devices in early_syscon_probe. > Regmap is get via syscon_early_regmap_lookup_by_phandle() > > Regular device probes attach device to regmap > via regmap_attach_dev(). > > For early syscon initialization is necessary to extend > struct syscon and provide remove function > which unmap all early init structures. > > Signed-off-by: Michal Simek <michal.simek@xilinx.com> > --- > > Changes in v2: > - Fix bad logic in early_syscon_probe > - Fix compilation failure for x86_64 reported by zero day testing system > - Regmap change available here > git://git.kernel.org/pub/scm/linux/kernel/git/broonie/regmap.git tags/nodev > > drivers/mfd/syscon.c | 128 +++++++++++++++++++++++++++++++++++++++------ > include/linux/mfd/syscon.h | 11 ++++ > 2 files changed, 122 insertions(+), 17 deletions(-) I have the same reservations as last time: http://archive.arm.linux.org.uk/lurker/message/20140212.095424.96cb7281.html I believe you were waiting for Arnd and/or Mark to comment. -- Lee Jones Linaro STMicroelectronics Landing Team Lead Linaro.org │ Open source software for ARM SoCs Follow Linaro: Facebook | Twitter | Blog ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [RFC PATCH v2 1/2] mfd: syscon: Support early initialization 2014-02-19 11:41 ` Lee Jones @ 2014-02-19 11:44 ` Michal Simek 2014-02-19 12:17 ` Mark Brown 0 siblings, 1 reply; 11+ messages in thread From: Michal Simek @ 2014-02-19 11:44 UTC (permalink / raw) To: Lee Jones Cc: Michal Simek, linux-arm-kernel, Arnd Bergmann, Samuel Ortiz, linux-kernel, broonie [-- Attachment #1: Type: text/plain, Size: 1759 bytes --] On 02/19/2014 12:41 PM, Lee Jones wrote: > FAO Arnd, Mark, > >> Some platforms need to get system controller >> ready as soon as possible. >> The patch provides early_syscon_initialization >> which create early mapping for all syscon compatible >> devices in early_syscon_probe. >> Regmap is get via syscon_early_regmap_lookup_by_phandle() >> >> Regular device probes attach device to regmap >> via regmap_attach_dev(). >> >> For early syscon initialization is necessary to extend >> struct syscon and provide remove function >> which unmap all early init structures. >> >> Signed-off-by: Michal Simek <michal.simek@xilinx.com> >> --- >> >> Changes in v2: >> - Fix bad logic in early_syscon_probe >> - Fix compilation failure for x86_64 reported by zero day testing system >> - Regmap change available here >> git://git.kernel.org/pub/scm/linux/kernel/git/broonie/regmap.git tags/nodev >> >> drivers/mfd/syscon.c | 128 +++++++++++++++++++++++++++++++++++++++------ >> include/linux/mfd/syscon.h | 11 ++++ >> 2 files changed, 122 insertions(+), 17 deletions(-) > > I have the same reservations as last time: > > http://archive.arm.linux.org.uk/lurker/message/20140212.095424.96cb7281.html > > I believe you were waiting for Arnd and/or Mark to comment. yes on Arnd because Mark already applied that regmap part. But of course any input how to get this done will be helpful. Thanks, Michal -- Michal Simek, Ing. (M.Eng), OpenPGP -> KeyID: FE3D1F91 w: www.monstr.eu p: +42-0-721842854 Maintainer of Linux kernel - Microblaze cpu - http://www.monstr.eu/fdt/ Maintainer of Linux kernel - Xilinx Zynq ARM architecture Microblaze U-BOOT custodian and responsible for u-boot arm zynq platform [-- Attachment #2: OpenPGP digital signature --] [-- Type: application/pgp-signature, Size: 263 bytes --] ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [RFC PATCH v2 1/2] mfd: syscon: Support early initialization 2014-02-19 11:44 ` Michal Simek @ 2014-02-19 12:17 ` Mark Brown 2014-02-19 13:51 ` Michal Simek 0 siblings, 1 reply; 11+ messages in thread From: Mark Brown @ 2014-02-19 12:17 UTC (permalink / raw) To: Michal Simek Cc: Lee Jones, Michal Simek, linux-arm-kernel, Arnd Bergmann, Samuel Ortiz, linux-kernel [-- Attachment #1: Type: text/plain, Size: 404 bytes --] On Wed, Feb 19, 2014 at 12:44:50PM +0100, Michal Simek wrote: > On 02/19/2014 12:41 PM, Lee Jones wrote: > > I believe you were waiting for Arnd and/or Mark to comment. > yes on Arnd because Mark already applied that regmap part. > But of course any input how to get this done will be helpful. Like I said I've never seen the user you're adding for the regmap API so I've no particular opinion on it. [-- Attachment #2: Digital signature --] [-- Type: application/pgp-signature, Size: 836 bytes --] ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [RFC PATCH v2 1/2] mfd: syscon: Support early initialization 2014-02-19 12:17 ` Mark Brown @ 2014-02-19 13:51 ` Michal Simek 2014-02-19 13:59 ` Mark Brown 0 siblings, 1 reply; 11+ messages in thread From: Michal Simek @ 2014-02-19 13:51 UTC (permalink / raw) To: Mark Brown Cc: Lee Jones, Michal Simek, linux-arm-kernel, Arnd Bergmann, Samuel Ortiz, linux-kernel [-- Attachment #1: Type: text/plain, Size: 1203 bytes --] On 02/19/2014 01:17 PM, Mark Brown wrote: > On Wed, Feb 19, 2014 at 12:44:50PM +0100, Michal Simek wrote: >> On 02/19/2014 12:41 PM, Lee Jones wrote: > >>> I believe you were waiting for Arnd and/or Mark to comment. > >> yes on Arnd because Mark already applied that regmap part. >> But of course any input how to get this done will be helpful. > > Like I said I've never seen the user you're adding for the regmap API so > I've no particular opinion on it. 2/2 is the code where I would like to use this when clk subsystem start to use better io helper functions then just static inline clk_readl/clk_writel. Then my 2/2 driver will be just nicer than current implementation. Regarding syscon changes. I think the right question is if this driver should be still in drivers/mfd/ or should be moved to somewhere else (drivers/base for example). Thanks, Michal -- Michal Simek, Ing. (M.Eng), OpenPGP -> KeyID: FE3D1F91 w: www.monstr.eu p: +42-0-721842854 Maintainer of Linux kernel - Microblaze cpu - http://www.monstr.eu/fdt/ Maintainer of Linux kernel - Xilinx Zynq ARM architecture Microblaze U-BOOT custodian and responsible for u-boot arm zynq platform [-- Attachment #2: OpenPGP digital signature --] [-- Type: application/pgp-signature, Size: 263 bytes --] ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [RFC PATCH v2 1/2] mfd: syscon: Support early initialization 2014-02-19 13:51 ` Michal Simek @ 2014-02-19 13:59 ` Mark Brown 0 siblings, 0 replies; 11+ messages in thread From: Mark Brown @ 2014-02-19 13:59 UTC (permalink / raw) To: Michal Simek Cc: Lee Jones, Michal Simek, linux-arm-kernel, Arnd Bergmann, Samuel Ortiz, linux-kernel [-- Attachment #1: e --] [-- Type: text/plain, Size: 527 bytes --] On Wed, Feb 19, 2014 at 02:51:36PM +0100, Michal Simek wrote: > On 02/19/2014 01:17 PM, Mark Brown wrote: > > Like I said I've never seen the user you're adding for the regmap API so > > I've no particular opinion on it. > 2/2 is the code where I would like to use this when clk subsystem > start to use better io helper functions then just static inline > clk_readl/clk_writel. > Then my 2/2 driver will be just nicer than current implementation. OK, but I still haven't seen the code (or Lee's concerns for that matter). [-- Attachment #2: Digital signature --] [-- Type: application/pgp-signature, Size: 836 bytes --] ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [RFC PATCH v2 1/2] mfd: syscon: Support early initialization 2014-02-19 11:04 ` [RFC PATCH v2 1/2] mfd: syscon: Support " Michal Simek 2014-02-19 11:14 ` Alexander Shiyan 2014-02-19 11:41 ` Lee Jones @ 2014-05-09 12:13 ` Tushar Behera 2 siblings, 0 replies; 11+ messages in thread From: Tushar Behera @ 2014-05-09 12:13 UTC (permalink / raw) To: Michal Simek, linux-arm-kernel, Arnd Bergmann Cc: Michal Simek, Lee Jones, Samuel Ortiz, linux-kernel -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 On 02/19/2014 04:34 PM, Michal Simek wrote: > Some platforms need to get system controller ready as soon as > possible. The patch provides early_syscon_initialization which > create early mapping for all syscon compatible devices in > early_syscon_probe. Regmap is get via > syscon_early_regmap_lookup_by_phandle() > > Regular device probes attach device to regmap via > regmap_attach_dev(). > > For early syscon initialization is necessary to extend struct > syscon and provide remove function which unmap all early init > structures. > > Signed-off-by: Michal Simek <michal.simek@xilinx.com> --- > I don't have V3 in my mailbox, hence replying to this thread. The content is applicable to V3. [...] > @@ -95,6 +98,24 @@ struct regmap > *syscon_regmap_lookup_by_pdevname(const char *s) } > EXPORT_SYMBOL_GPL(syscon_regmap_lookup_by_pdevname); > > +struct regmap *syscon_early_regmap_lookup_by_phandle(struct > device_node *np, + const char *property) +{ + struct > device_node *syscon_np; + struct syscon *syscon; + + syscon_np = > of_parse_phandle(np, property, 0); + if (!syscon_np) + return > ERR_PTR(-ENODEV); + + syscon = syscon_np->data; + + > of_node_put(syscon_np); + + return syscon->regmap; This fails while derefencing syscon if if early_syscon_init() has not yet been not yet been called. Something like this would be helpful. struct regmap *regmap = ERR_PTR(-ENODEV); syscon = syscon_np->data; if (syscon) regmap = syscon->regmap; return regmap; - -- Tushar Behera -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/ iQEcBAEBAgAGBQJTbMZMAAoJELqclMPPkq4NoZEH/j/vTBLu0VmKm01jZqJUUC59 siD+DvRclRcdRGCzsf7iN9Zjw2g+abDtEBynBNdC6swTJJUwDyMtkcguiHn/ytPN B/5bli3rKpRkDlg9i/Cfgqd2KmYh1U6Q2LJ3+pyRAQqe0zm+bI5+fp/cn1PGLBIW 1R2rexJO98GhGO/Yhh62FD366rB15bgApC2+XjYb2Wcka3f8VY47gqkxnAwxZzvU ovG/rqXEuGW7H3o/+BLDtmQREEjKg20ggRo2FEj0WozhTo6Sn2YUJg70DKioguu0 eteP+X4DsShluJfxq9/51bfFutlXPPYZIbLIZxwyiFSJiAIR8hjLO/Ed/GicybQ= =HCI5 -----END PGP SIGNATURE----- ^ permalink raw reply [flat|nested] 11+ messages in thread
* [RFC PATCH v2 2/2] ARM: zynq: Use early syscon initialization 2014-02-19 11:04 [RFC PATCH v2 0/2] Syscon early initialization Michal Simek 2014-02-19 11:04 ` [RFC PATCH v2 1/2] mfd: syscon: Support " Michal Simek @ 2014-02-19 11:04 ` Michal Simek 1 sibling, 0 replies; 11+ messages in thread From: Michal Simek @ 2014-02-19 11:04 UTC (permalink / raw) To: linux-arm-kernel, Arnd Bergmann Cc: monstr, Josh Cartwright, Steffen Trumtrar, Rob Herring, Peter Crosthwaite, Rob Herring, Pawel Moll, Mark Rutland, Ian Campbell, Kumar Gala, Russell King, Mike Turquette, Soren Brinkmann, Stephen Boyd, Stephen Warren, James Hogan, Felipe Pena, devicetree, linux-kernel [-- Attachment #1: Type: text/plain, Size: 6084 bytes --] Use early syscon initialization to simplify slcr code. - Remove two slcr inits (zynq_slcr_init, zynq_early_slcr_init) - Directly use regmap accesses in zynq_slcr_read/write - Remove zynq_clock_init() and use addresses from syscon (This is the most problematic part now because clock doesn't support regmap accesses that's why reading slcr base is ugly. There are some attempts to get clk regmap to work - for example: https://lkml.org/lkml/2013/10/16/112) Signed-off-by: Michal Simek <michal.simek@xilinx.com> --- Changes in v2: None Especially look at slcr.c which is much simpler than was before. clkc.c will be simpler when regmap support is added because then syscon_early_regmap_lookup_by_phandle() will be called without zynq_slcr_base search. --- arch/arm/boot/dts/zynq-7000.dtsi | 1 + arch/arm/mach-zynq/common.c | 6 ++--- arch/arm/mach-zynq/slcr.c | 42 ++--------------------------- drivers/clk/zynq/clkc.c | 57 ++++++++++++---------------------------- 4 files changed, 23 insertions(+), 83 deletions(-) diff --git a/arch/arm/boot/dts/zynq-7000.dtsi b/arch/arm/boot/dts/zynq-7000.dtsi index 7284499..e414489 100644 --- a/arch/arm/boot/dts/zynq-7000.dtsi +++ b/arch/arm/boot/dts/zynq-7000.dtsi @@ -135,6 +135,7 @@ compatible = "xlnx,zynq-slcr", "syscon"; reg = <0xF8000000 0x1000>; ranges; + syscon = <&slcr>; clkc: clkc@100 { #clock-cells = <1>; compatible = "xlnx,ps7-clkc"; diff --git a/arch/arm/mach-zynq/common.c b/arch/arm/mach-zynq/common.c index 9d3c88e..78589e3 100644 --- a/arch/arm/mach-zynq/common.c +++ b/arch/arm/mach-zynq/common.c @@ -28,6 +28,7 @@ #include <linux/of.h> #include <linux/irqchip.h> #include <linux/irqchip/arm-gic.h> +#include <linux/mfd/syscon.h> #include <linux/slab.h> #include <linux/sys_soc.h> @@ -130,15 +131,14 @@ out: of_platform_populate(NULL, of_default_bus_match_table, NULL, parent); platform_device_register(&zynq_cpuidle_device); - - zynq_slcr_init(); } static void __init zynq_timer_init(void) { + early_syscon_init(); + zynq_early_slcr_init(); - zynq_clock_init(); of_clk_init(NULL); clocksource_of_init(); } diff --git a/arch/arm/mach-zynq/slcr.c b/arch/arm/mach-zynq/slcr.c index 594b280..a89b082 100644 --- a/arch/arm/mach-zynq/slcr.c +++ b/arch/arm/mach-zynq/slcr.c @@ -35,7 +35,6 @@ #define SLCR_PSS_IDCODE_DEVICE_SHIFT 12 #define SLCR_PSS_IDCODE_DEVICE_MASK 0x1F -static void __iomem *zynq_slcr_base; static struct regmap *zynq_slcr_regmap; /** @@ -48,11 +47,6 @@ static struct regmap *zynq_slcr_regmap; */ static int zynq_slcr_write(u32 val, u32 offset) { - if (!zynq_slcr_regmap) { - writel(val, zynq_slcr_base + offset); - return 0; - } - return regmap_write(zynq_slcr_regmap, offset, val); } @@ -66,12 +60,7 @@ static int zynq_slcr_write(u32 val, u32 offset) */ static int zynq_slcr_read(u32 *val, u32 offset) { - if (zynq_slcr_regmap) - return regmap_read(zynq_slcr_regmap, offset, val); - - *val = readl(zynq_slcr_base + offset); - - return 0; + return regmap_read(zynq_slcr_regmap, offset, val); } /** @@ -169,24 +158,6 @@ void zynq_slcr_cpu_stop(int cpu) } /** - * zynq_slcr_init - Regular slcr driver init - * - * Return: 0 on success, negative errno otherwise. - * - * Called early during boot from platform code to remap SLCR area. - */ -int __init zynq_slcr_init(void) -{ - zynq_slcr_regmap = syscon_regmap_lookup_by_compatible("xlnx,zynq-slcr"); - if (IS_ERR(zynq_slcr_regmap)) { - pr_err("%s: failed to find zynq-slcr\n", __func__); - return -ENODEV; - } - - return 0; -} - -/** * zynq_early_slcr_init - Early slcr init function * * Return: 0 on success, negative errno otherwise. @@ -202,20 +173,11 @@ int __init zynq_early_slcr_init(void) pr_err("%s: no slcr node found\n", __func__); BUG(); } - - zynq_slcr_base = of_iomap(np, 0); - if (!zynq_slcr_base) { - pr_err("%s: Unable to map I/O memory\n", __func__); - BUG(); - } - - np->data = (__force void *)zynq_slcr_base; + zynq_slcr_regmap = syscon_early_regmap_lookup_by_phandle(np, "syscon"); /* unlock the SLCR so that registers can be changed */ zynq_slcr_unlock(); - pr_info("%s mapped to %p\n", np->name, zynq_slcr_base); - of_node_put(np); return 0; diff --git a/drivers/clk/zynq/clkc.c b/drivers/clk/zynq/clkc.c index c812b93..b2fd160 100644 --- a/drivers/clk/zynq/clkc.c +++ b/drivers/clk/zynq/clkc.c @@ -214,6 +214,10 @@ err: clks[clk1] = ERR_PTR(-ENOMEM); } +struct syscon { + void __iomem *base; +}; + static void __init zynq_clk_setup(struct device_node *np) { int i; @@ -227,6 +231,19 @@ static void __init zynq_clk_setup(struct device_node *np) const char *periph_parents[4]; const char *swdt_ext_clk_mux_parents[2]; const char *can_mio_mux_parents[NUM_MIO_PINS]; + struct resource res; + void __iomem *zynq_slcr_base; + + struct device_node *slcr = of_get_parent(np); + struct syscon *syscon = slcr->data; + zynq_slcr_base = syscon->base; + + if (of_address_to_resource(np, 0, &res)) { + pr_err("%s: failed to get resource\n", np->name); + return; + } + + zynq_clkc_base = zynq_slcr_base + res.start; pr_info("Zynq clock init\n"); @@ -569,43 +586,3 @@ static void __init zynq_clk_setup(struct device_node *np) } CLK_OF_DECLARE(zynq_clkc, "xlnx,ps7-clkc", zynq_clk_setup); - -void __init zynq_clock_init(void) -{ - struct device_node *np; - struct device_node *slcr; - struct resource res; - - np = of_find_compatible_node(NULL, NULL, "xlnx,ps7-clkc"); - if (!np) { - pr_err("%s: clkc node not found\n", __func__); - goto np_err; - } - - if (of_address_to_resource(np, 0, &res)) { - pr_err("%s: failed to get resource\n", np->name); - goto np_err; - } - - slcr = of_get_parent(np); - - if (slcr->data) { - zynq_clkc_base = (__force void __iomem *)slcr->data + res.start; - } else { - pr_err("%s: Unable to get I/O memory\n", np->name); - of_node_put(slcr); - goto np_err; - } - - pr_info("%s: clkc starts at %p\n", __func__, zynq_clkc_base); - - of_node_put(slcr); - of_node_put(np); - - return; - -np_err: - of_node_put(np); - BUG(); - return; -} -- 1.8.2.3 [-- Attachment #2: Type: application/pgp-signature, Size: 198 bytes --] ^ permalink raw reply related [flat|nested] 11+ messages in thread
end of thread, other threads:[~2014-05-09 12:13 UTC | newest] Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2014-02-19 11:04 [RFC PATCH v2 0/2] Syscon early initialization Michal Simek 2014-02-19 11:04 ` [RFC PATCH v2 1/2] mfd: syscon: Support " Michal Simek 2014-02-19 11:14 ` Alexander Shiyan 2014-02-19 11:16 ` Alexander Shiyan 2014-02-19 11:41 ` Lee Jones 2014-02-19 11:44 ` Michal Simek 2014-02-19 12:17 ` Mark Brown 2014-02-19 13:51 ` Michal Simek 2014-02-19 13:59 ` Mark Brown 2014-05-09 12:13 ` Tushar Behera 2014-02-19 11:04 ` [RFC PATCH v2 2/2] ARM: zynq: Use early syscon initialization Michal Simek
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).