Messages in this thread | | | From | Ulf Hansson <> | Date | Tue, 24 Nov 2020 11:56:57 +0100 | Subject | Re: [PATCH 4/4] amba: Make use of bus_type functions |
| |
On Tue, 24 Nov 2020 at 11:33, Uwe Kleine-König <u.kleine-koenig@pengutronix.de> wrote: > > Instead of assigning the needed functions for each driver separately do it > only once in amba_bustype. Move the definition of the functions to their > proper place among the other callbacks used there. > > This prepares getting rid of these callbacks in struct device_driver. > > Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Reviewed-by: Ulf Hansson <ulf.hansson@linaro.org>
> --- > drivers/amba/bus.c | 154 ++++++++++++++++++++++----------------------- > 1 file changed, 77 insertions(+), 77 deletions(-) > > diff --git a/drivers/amba/bus.c b/drivers/amba/bus.c > index 48b5d4b4e889..2f3799ac3edb 100644 > --- a/drivers/amba/bus.c > +++ b/drivers/amba/bus.c > @@ -174,6 +174,80 @@ static int amba_uevent(struct device *dev, struct kobj_uevent_env *env) > return retval; > } > > +/* > + * These are the device model conversion veneers; they convert the > + * device model structures to our more specific structures. > + */ > +static int amba_probe(struct device *dev) > +{ > + struct amba_device *pcdev = to_amba_device(dev); > + struct amba_driver *pcdrv = to_amba_driver(dev->driver); > + const struct amba_id *id = amba_lookup(pcdrv->id_table, pcdev); > + int ret; > + > + do { > + ret = of_clk_set_defaults(dev->of_node, false); > + if (ret < 0) > + break; > + > + ret = dev_pm_domain_attach(dev, true); > + if (ret) > + break; > + > + ret = amba_get_enable_pclk(pcdev); > + if (ret) { > + dev_pm_domain_detach(dev, true); > + break; > + } > + > + pm_runtime_get_noresume(dev); > + pm_runtime_set_active(dev); > + pm_runtime_enable(dev); > + > + ret = pcdrv->probe(pcdev, id); > + if (ret == 0) > + break; > + > + pm_runtime_disable(dev); > + pm_runtime_set_suspended(dev); > + pm_runtime_put_noidle(dev); > + > + amba_put_disable_pclk(pcdev); > + dev_pm_domain_detach(dev, true); > + } while (0); > + > + return ret; > +} > + > +static int amba_remove(struct device *dev) > +{ > + struct amba_device *pcdev = to_amba_device(dev); > + struct amba_driver *drv = to_amba_driver(dev->driver); > + > + pm_runtime_get_sync(dev); > + if (drv->remove) > + drv->remove(pcdev); > + pm_runtime_put_noidle(dev); > + > + /* Undo the runtime PM settings in amba_probe() */ > + pm_runtime_disable(dev); > + pm_runtime_set_suspended(dev); > + pm_runtime_put_noidle(dev); > + > + amba_put_disable_pclk(pcdev); > + dev_pm_domain_detach(dev, true); > + > + return 0; > +} > + > +static void amba_shutdown(struct device *dev) > +{ > + struct amba_driver *drv = to_amba_driver(dev->driver); > + > + if (drv->shutdown) > + drv->shutdown(to_amba_device(dev)); > +} > + > #ifdef CONFIG_PM > /* > * Hooks to provide runtime PM of the pclk (bus clock). It is safe to > @@ -239,6 +313,9 @@ struct bus_type amba_bustype = { > .dev_groups = amba_dev_groups, > .match = amba_match, > .uevent = amba_uevent, > + .probe = amba_probe, > + .remove = amba_remove, > + .shutdown = amba_shutdown, > .dma_configure = platform_dma_configure, > .pm = &amba_pm, > }; > @@ -251,80 +328,6 @@ static int __init amba_init(void) > > postcore_initcall(amba_init); > > -/* > - * These are the device model conversion veneers; they convert the > - * device model structures to our more specific structures. > - */ > -static int amba_probe(struct device *dev) > -{ > - struct amba_device *pcdev = to_amba_device(dev); > - struct amba_driver *pcdrv = to_amba_driver(dev->driver); > - const struct amba_id *id = amba_lookup(pcdrv->id_table, pcdev); > - int ret; > - > - do { > - ret = of_clk_set_defaults(dev->of_node, false); > - if (ret < 0) > - break; > - > - ret = dev_pm_domain_attach(dev, true); > - if (ret) > - break; > - > - ret = amba_get_enable_pclk(pcdev); > - if (ret) { > - dev_pm_domain_detach(dev, true); > - break; > - } > - > - pm_runtime_get_noresume(dev); > - pm_runtime_set_active(dev); > - pm_runtime_enable(dev); > - > - ret = pcdrv->probe(pcdev, id); > - if (ret == 0) > - break; > - > - pm_runtime_disable(dev); > - pm_runtime_set_suspended(dev); > - pm_runtime_put_noidle(dev); > - > - amba_put_disable_pclk(pcdev); > - dev_pm_domain_detach(dev, true); > - } while (0); > - > - return ret; > -} > - > -static int amba_remove(struct device *dev) > -{ > - struct amba_device *pcdev = to_amba_device(dev); > - struct amba_driver *drv = to_amba_driver(dev->driver); > - > - pm_runtime_get_sync(dev); > - if (drv->remove) > - drv->remove(pcdev); > - pm_runtime_put_noidle(dev); > - > - /* Undo the runtime PM settings in amba_probe() */ > - pm_runtime_disable(dev); > - pm_runtime_set_suspended(dev); > - pm_runtime_put_noidle(dev); > - > - amba_put_disable_pclk(pcdev); > - dev_pm_domain_detach(dev, true); > - > - return 0; > -} > - > -static void amba_shutdown(struct device *dev) > -{ > - struct amba_driver *drv = to_amba_driver(dev->driver); > - > - if (drv->shutdown) > - drv->shutdown(to_amba_device(dev)); > -} > - > /** > * amba_driver_register - register an AMBA device driver > * @drv: amba device driver structure > @@ -339,9 +342,6 @@ int amba_driver_register(struct amba_driver *drv) > return -EINVAL; > > drv->drv.bus = &amba_bustype; > - drv->drv.probe = amba_probe; > - drv->drv.remove = amba_remove; > - drv->drv.shutdown = amba_shutdown; > > return driver_register(&drv->drv); > } > -- > 2.29.2 >
| |