Message ID | 20250224092923.2648680-1-horatiu.vultur@microchip.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | reset: mchp: sparx5: Fix for lan966x | expand |
Hi Horatiu, On Mon, 24 Feb 2025 10:29:23 +0100 Horatiu Vultur <horatiu.vultur@microchip.com> wrote: > With the blamed commit it seems that lan966x doesn't seem to boot > anymore when the internal CPU is used. > The reason seems to be the usage of the devm_of_iomap, if we replace > this with of_iomap, this seems to fix the issue as we use the same > region also for other devices. > > Fixes: 0426a920d6269c ("reset: mchp: sparx5: Map cpu-syscon locally in case of LAN966x") > Signed-off-by: Horatiu Vultur <horatiu.vultur@microchip.com> > --- > drivers/reset/reset-microchip-sparx5.c | 14 +++++++++----- > 1 file changed, 9 insertions(+), 5 deletions(-) > > diff --git a/drivers/reset/reset-microchip-sparx5.c b/drivers/reset/reset-microchip-sparx5.c > index aa5464be7053b..5a75f9833a91a 100644 > --- a/drivers/reset/reset-microchip-sparx5.c > +++ b/drivers/reset/reset-microchip-sparx5.c > @@ -8,6 +8,7 @@ > */ > #include <linux/mfd/syscon.h> > #include <linux/of.h> > +#include <linux/of_address.h> > #include <linux/module.h> > #include <linux/platform_device.h> > #include <linux/property.h> > @@ -72,14 +73,17 @@ static struct regmap *mchp_lan966x_syscon_to_regmap(struct device *dev, > struct device_node *syscon_np) > { > struct regmap_config regmap_config = mchp_lan966x_syscon_regmap_config; > - resource_size_t size; > + struct resource res; > void __iomem *base; > > - base = devm_of_iomap(dev, syscon_np, 0, &size); > - if (IS_ERR(base)) > - return ERR_CAST(base); > + if (of_address_to_resource(syscon_np, 0, &res)) > + return ERR_PTR(-ENOMEM); > > - regmap_config.max_register = size - 4; > + base = of_iomap(syscon_np, 0); > + if (!base) > + return ERR_PTR(-ENOMEM); > + > + regmap_config.max_register = resource_size(&res) - 4; > > return devm_regmap_init_mmio(dev, base, ®map_config); > } In the Lan966x PCI device use case, the reset driver can be loaded, unloaded and re-loaded. When the driver is unloaded, resources have to be released and so with a call to of_iomap(), a call to iounmap() is needed. Maybe .remove() function in this driver should handle the needed iounmap() call. Best regards, HervĂ©
diff --git a/drivers/reset/reset-microchip-sparx5.c b/drivers/reset/reset-microchip-sparx5.c index aa5464be7053b..5a75f9833a91a 100644 --- a/drivers/reset/reset-microchip-sparx5.c +++ b/drivers/reset/reset-microchip-sparx5.c @@ -8,6 +8,7 @@ */ #include <linux/mfd/syscon.h> #include <linux/of.h> +#include <linux/of_address.h> #include <linux/module.h> #include <linux/platform_device.h> #include <linux/property.h> @@ -72,14 +73,17 @@ static struct regmap *mchp_lan966x_syscon_to_regmap(struct device *dev, struct device_node *syscon_np) { struct regmap_config regmap_config = mchp_lan966x_syscon_regmap_config; - resource_size_t size; + struct resource res; void __iomem *base; - base = devm_of_iomap(dev, syscon_np, 0, &size); - if (IS_ERR(base)) - return ERR_CAST(base); + if (of_address_to_resource(syscon_np, 0, &res)) + return ERR_PTR(-ENOMEM); - regmap_config.max_register = size - 4; + base = of_iomap(syscon_np, 0); + if (!base) + return ERR_PTR(-ENOMEM); + + regmap_config.max_register = resource_size(&res) - 4; return devm_regmap_init_mmio(dev, base, ®map_config); }
With the blamed commit it seems that lan966x doesn't seem to boot anymore when the internal CPU is used. The reason seems to be the usage of the devm_of_iomap, if we replace this with of_iomap, this seems to fix the issue as we use the same region also for other devices. Fixes: 0426a920d6269c ("reset: mchp: sparx5: Map cpu-syscon locally in case of LAN966x") Signed-off-by: Horatiu Vultur <horatiu.vultur@microchip.com> --- drivers/reset/reset-microchip-sparx5.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-)