On Wed, Oct 14, 2015 at 5:36 PM, Arnd Bergmann <arnd@xxxxxxxx> wrote: > On Wednesday 14 October 2015 17:28:45 Ley Foon Tan wrote: >> On Wed, Oct 14, 2015 at 5:09 PM, Arnd Bergmann <arnd@xxxxxxxx> wrote: >> > On Wednesday 14 October 2015 16:32:25 Ley Foon Tan wrote: >> >> On Wed, Oct 14, 2015 at 4:20 PM, Arnd Bergmann <arnd@xxxxxxxx> wrote: >> >> > On Wednesday 14 October 2015 10:41:29 Ley Foon Tan wrote: >> >> >> +static int altera_pcie_remove(struct platform_device *pdev) >> >> >> +{ >> >> >> + struct altera_pcie *pcie = platform_get_drvdata(pdev); >> >> >> + >> >> >> + altera_pcie_free_irq_domain(pcie); >> >> >> + platform_set_drvdata(pdev, NULL); >> >> >> + return 0; >> >> >> +} >> >> > >> >> > I just noticed this. Does it actually work to unload the module >> >> > and tear down all the pci_dev structures in a safe way? >> >> Good catch. It only can be compiled as builtin-moduley now, so we can >> >> remove this _remove callback function. >> > >> > I think we should change both: make it possible to load the >> > driver dynamically, and remove the altera_pcie_remove function. >> This driver depends on the pci fixups to work correctly. But, fixups >> callback functions in this driver are not being call if the driver is >> loadable module. > > Ah, I see. We should find a better way to deal with this, as we > are getting an increasing number of host driver specific fixups. > > Bjorn, do you have any idea here? > > Could we perhaps have a helper function that lets us register > fixups dynamically? > >> The linker script keeps all pci fixup callbacks in pci fixup regions >> during kernel compile time. So, it needs to be builtin module. Do you >> know any way we can update those fixup regions? > > The only method I'm aware of at the moment is move the fixups to > drivers/pci/quirks.c and enclose them in an #ifdef if you want them > to not appear in kernels that don't support your SoC. By looking at the drivers/pci/quirks.c, it looks like it is mainly for the pci endpoint devices. Fixups for host controller are in the driver itself. > >> > You can prevent the module from being unloaded if you also remove >> > the module_platform_driver() directive and add a module_init() >> > without a matching module_exit(). >> > >> > Please also add a '.suppress_bind_attrs = true,' flag in the driver >> > struct to prevent manual unbinding. >> I think we don't need these if it only can work as builtin module. > > No, this is orthogonal, you need it either way, as built-in drivers > can still be unbound by writing to sysfs. Try writing the device name > to /sys/bus/platform/drivers/altera-pcie/unbind and watch it blow up ;-) Oh I see. Will update with your suggestion. Thanks. Regards Ley Foon -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html