Hi Simon, On Mon, Nov 13, 2017 at 8:00 AM, Simon Horman <horms@xxxxxxxxxxxx> wrote: > On Fri, Nov 10, 2017 at 10:53:07PM +0100, Marek Vasut wrote: >> On 11/10/2017 10:09 AM, Simon Horman wrote: >> > On Wed, Nov 08, 2017 at 10:28:06AM +0100, Marek Vasut wrote: >> >> @@ -872,11 +902,25 @@ static const struct irq_domain_ops msi_domain_ops = { >> >> .map = rcar_msi_map, >> >> }; >> >> >> >> +static void rcar_pcie_hw_enable_msi(struct rcar_pcie *pcie) >> >> +{ >> >> + struct rcar_msi *msi = &pcie->msi; >> >> + unsigned long base; >> >> + >> >> + /* setup MSI data target */ >> >> + base = virt_to_phys((void *)msi->pages); >> > >> > Why do you need to cast to void *? >> > I expect such casting can be done implicitly. >> >> Because __get_free_pages() returns unsigned long and that's what's used >> to assign msi->pages . And virt_to_phys() expects void * instead, thus >> the cast. > > Right, but I don't think one should ever need to explicitly cast > to or from void *. What mean is, can you just remove "(void *)" without In general, I agree ("casts are evil"). > changing any behaviour? In this particular case, there's no way around the cast, as __get_free_pages() returns unsigned long because of historical reasons (if written today, it would return a pointer for sure). Other exceptions are storing integral types in of_device_id.data (which is void *), and storing private data pointers in Scsi_Host.hostdata (which is unsigned long). Gr{oetje,eeting}s, Geert -- Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@xxxxxxxxxxxxxx In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that. -- Linus Torvalds