Message ID | 20180927100949.973078-1-arnd@arndb.de |
---|---|
State | Accepted |
Commit | 8537bf10976c56c6e0cc8b05a835e58cbbb1d287 |
Headers | show |
Series | EDAC, altera: work around int-to-pointer-cast warnings | expand |
Hi Arnd, On 09/27/2018 05:09 AM, Arnd Bergmann wrote: > The altera edac driver passes a token from a DT resource as > resource_size_t into an SMC call, but casts it to an __iomem pointer > and then a plain void pointer inbetween, mixing three or four > incompatible types in the process. The compiler complains about > one of the conversions: > > drivers/edac/altera_edac.c: In function 'altr_init_a10_ecc_block': > drivers/edac/altera_edac.c:1053:10: error: cast to pointer from integer of different size [-Werror=int-to-pointer-cast] > base = (void __iomem *)res.start; > ^ > drivers/edac/altera_edac.c: In function 'altr_edac_a10_probe': > drivers/edac/altera_edac.c:2062:10: error: cast to pointer from integer of different size [-Werror=int-to-pointer-cast] > base = (void __iomem *)res.start; > > Using a static checker probably also notices the __iomem cast. Solving > this properly isn't trivial, but simply casting to a 'uintptr_t' instead > of 'void __iomem *' makes it less wrong and should avoid the warnings. > > Fixes: d5fc9125566c ("EDAC, altera: Combine Stratix10 and Arria10 probe functions") > Signed-off-by: Arnd Bergmann <arnd@arndb.de> > --- > drivers/edac/altera_edac.c | 13 +++++++------ > 1 file changed, 7 insertions(+), 6 deletions(-) > > diff --git a/drivers/edac/altera_edac.c b/drivers/edac/altera_edac.c > index 0e9e80789d99..c89d82aa2776 100644 > --- a/drivers/edac/altera_edac.c > +++ b/drivers/edac/altera_edac.c > @@ -1036,7 +1036,7 @@ altr_init_a10_ecc_block(struct device_node *np, u32 irq_mask, > } else { > struct device_node *sysmgr_np; > struct resource res; > - void __iomem *base; > + uintptr_t base; > > sysmgr_np = of_parse_phandle(np_eccmgr, > "altr,sysmgr-syscon", 0); > @@ -1050,9 +1050,9 @@ altr_init_a10_ecc_block(struct device_node *np, u32 irq_mask, > return -ENOMEM; > > /* Need physical address for SMCC call */ > - base = (void __iomem *)res.start; > + base = res.start; > > - ecc_mgr_map = regmap_init(NULL, NULL, base, > + ecc_mgr_map = regmap_init(NULL, NULL, (void *)base, > &s10_sdram_regmap_cfg); > } > of_node_put(np_eccmgr); > @@ -2045,7 +2045,7 @@ static int altr_edac_a10_probe(struct platform_device *pdev) > } else { > struct device_node *sysmgr_np; > struct resource res; > - void __iomem *base; > + uintptr_t base; > > sysmgr_np = of_parse_phandle(pdev->dev.of_node, > "altr,sysmgr-syscon", 0); > @@ -2059,9 +2059,10 @@ static int altr_edac_a10_probe(struct platform_device *pdev) > return -ENOMEM; > > /* Need physical address for SMCC call */ > - base = (void __iomem *)res.start; > + base = res.start; > > - edac->ecc_mgr_map = devm_regmap_init(&pdev->dev, NULL, base, > + edac->ecc_mgr_map = devm_regmap_init(&pdev->dev, NULL, > + (void *)base, > &s10_sdram_regmap_cfg); > } > Thanks for the fix. Reviewed-by: Thor Thayer <thor.thayer@linux.intel.com>
On Thu, Sep 27, 2018 at 12:09:26PM +0200, Arnd Bergmann wrote: > The altera edac driver passes a token from a DT resource as > resource_size_t into an SMC call, but casts it to an __iomem pointer > and then a plain void pointer inbetween, mixing three or four > incompatible types in the process. The compiler complains about > one of the conversions: > > drivers/edac/altera_edac.c: In function 'altr_init_a10_ecc_block': > drivers/edac/altera_edac.c:1053:10: error: cast to pointer from integer of different size [-Werror=int-to-pointer-cast] > base = (void __iomem *)res.start; > ^ > drivers/edac/altera_edac.c: In function 'altr_edac_a10_probe': > drivers/edac/altera_edac.c:2062:10: error: cast to pointer from integer of different size [-Werror=int-to-pointer-cast] > base = (void __iomem *)res.start; > > Using a static checker probably also notices the __iomem cast. Solving > this properly isn't trivial, but simply casting to a 'uintptr_t' instead > of 'void __iomem *' makes it less wrong and should avoid the warnings. > > Fixes: d5fc9125566c ("EDAC, altera: Combine Stratix10 and Arria10 probe functions") > Signed-off-by: Arnd Bergmann <arnd@arndb.de> > --- > drivers/edac/altera_edac.c | 13 +++++++------ > 1 file changed, 7 insertions(+), 6 deletions(-) Applied, thanks. -- Regards/Gruss, Boris. Good mailing practices for 400: avoid top-posting and trim the reply.
diff --git a/drivers/edac/altera_edac.c b/drivers/edac/altera_edac.c index 0e9e80789d99..c89d82aa2776 100644 --- a/drivers/edac/altera_edac.c +++ b/drivers/edac/altera_edac.c @@ -1036,7 +1036,7 @@ altr_init_a10_ecc_block(struct device_node *np, u32 irq_mask, } else { struct device_node *sysmgr_np; struct resource res; - void __iomem *base; + uintptr_t base; sysmgr_np = of_parse_phandle(np_eccmgr, "altr,sysmgr-syscon", 0); @@ -1050,9 +1050,9 @@ altr_init_a10_ecc_block(struct device_node *np, u32 irq_mask, return -ENOMEM; /* Need physical address for SMCC call */ - base = (void __iomem *)res.start; + base = res.start; - ecc_mgr_map = regmap_init(NULL, NULL, base, + ecc_mgr_map = regmap_init(NULL, NULL, (void *)base, &s10_sdram_regmap_cfg); } of_node_put(np_eccmgr); @@ -2045,7 +2045,7 @@ static int altr_edac_a10_probe(struct platform_device *pdev) } else { struct device_node *sysmgr_np; struct resource res; - void __iomem *base; + uintptr_t base; sysmgr_np = of_parse_phandle(pdev->dev.of_node, "altr,sysmgr-syscon", 0); @@ -2059,9 +2059,10 @@ static int altr_edac_a10_probe(struct platform_device *pdev) return -ENOMEM; /* Need physical address for SMCC call */ - base = (void __iomem *)res.start; + base = res.start; - edac->ecc_mgr_map = devm_regmap_init(&pdev->dev, NULL, base, + edac->ecc_mgr_map = devm_regmap_init(&pdev->dev, NULL, + (void *)base, &s10_sdram_regmap_cfg); }
The altera edac driver passes a token from a DT resource as resource_size_t into an SMC call, but casts it to an __iomem pointer and then a plain void pointer inbetween, mixing three or four incompatible types in the process. The compiler complains about one of the conversions: drivers/edac/altera_edac.c: In function 'altr_init_a10_ecc_block': drivers/edac/altera_edac.c:1053:10: error: cast to pointer from integer of different size [-Werror=int-to-pointer-cast] base = (void __iomem *)res.start; ^ drivers/edac/altera_edac.c: In function 'altr_edac_a10_probe': drivers/edac/altera_edac.c:2062:10: error: cast to pointer from integer of different size [-Werror=int-to-pointer-cast] base = (void __iomem *)res.start; Using a static checker probably also notices the __iomem cast. Solving this properly isn't trivial, but simply casting to a 'uintptr_t' instead of 'void __iomem *' makes it less wrong and should avoid the warnings. Fixes: d5fc9125566c ("EDAC, altera: Combine Stratix10 and Arria10 probe functions") Signed-off-by: Arnd Bergmann <arnd@arndb.de> --- drivers/edac/altera_edac.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) -- 2.18.0