Skip to content
/ linux Public
forked from torvalds/linux

Commit

Permalink
amba: Make use of bus_type functions
Browse files Browse the repository at this point in the history
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. Note that the bus's
shutdown function might be called for unbound devices, too, so it needs
additional guarding.

This prepares getting rid of these callbacks in struct device_driver.

Reviewed-by: Ulf Hansson <[email protected]>
Reviewed-by: Arnd Bergmann <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Uwe Kleine-König <[email protected]>
  • Loading branch information
Uwe Kleine-König authored and ukleinek committed Feb 2, 2021
1 parent 3fd269e commit f170b59
Showing 1 changed file with 81 additions and 77 deletions.
158 changes: 81 additions & 77 deletions drivers/amba/bus.c
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,84 @@ 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;

if (!dev->driver)
return;

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
Expand Down Expand Up @@ -239,6 +317,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,
};
Expand All @@ -251,80 +332,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
Expand All @@ -339,9 +346,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);
}
Expand Down

0 comments on commit f170b59

Please sign in to comment.