On Fri, Sep 9, 2022 at 5:55 PM Horatiu Vultur <horatiu.vultur@xxxxxxxxxxxxx> wrote: Thanks for an update, my comments below. ... > - dev_set_drvdata(dev, info->map); > + dev_set_drvdata(dev, info); I would also change it to platform_set_drvdata() to keep symmetry with ->remove(). ... > +static int ocelot_pinctrl_remove(struct platform_device *pdev) > +{ > + struct ocelot_pinctrl *info = platform_get_drvdata(pdev); > + destroy_workqueue(info->wq); Is it a synchronous operation? Anyway, what does guarantee that after this no other task can schedule a new work due to unmasking an interrupt? I think you need to be sure your device is quiescent before killing that workqueue. Something like synchronize_irq() + disable_irq() or equivalent? (I don't know for sure, you need to investigate it yourself and find the best suitable way). > + return 0; > +} -- With Best Regards, Andy Shevchenko