Message ID | 20190723221838.12024-8-suzuki.poulose@arm.com (mailing list archive) |
---|---|
State | Mainlined |
Commit | 36f3313d6bff91ab2a9e47698c27d15363640a4e |
Headers | show |
Series | [v3,1/7] drivers: Introduce device lookup variants by name | expand |
On 23/07/2019 23:18, Suzuki K Poulose wrote: > Provide a helper to lookup platform devices by matching device > driver in order to avoid drivers trying to use platform bus > internals. FWIW, this whole drm_match_add idiom really looks like it deserves factoring out into an of_platform_populate-style helper, but I guess aligning those subtle little differences is a non-trivial challenge. [and I am well aware of just how much of a big messy can of worms DRM device probing is in general] > Cc: Eric Anholt <eric@anholt.net> > Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> > Cc: "Heiko Stübner" <heiko@sntech.de> > Cc: Inki Dae <inki.dae@samsung.com> > Cc: "Rafael J. Wysocki" <rafael@kernel.org> > Cc: Sandy Huang <hjc@rock-chips.com> > Cc: Seung-Woo Kim <sw0312.kim@samsung.com> > Tested-by: Heiko Stuebner <heiko@sntech.de> > Signed-off-by: Suzuki K Poulose <suzuki.poulose@arm.com> > --- > drivers/base/platform.c | 14 ++++++++++++++ > drivers/gpu/drm/exynos/exynos_drm_drv.c | 9 +++------ > drivers/gpu/drm/mcde/mcde_drv.c | 3 +-- > drivers/gpu/drm/rockchip/rockchip_drm_drv.c | 3 +-- > drivers/gpu/drm/vc4/vc4_drv.c | 3 +-- > include/linux/platform_device.h | 3 +++ > 6 files changed, 23 insertions(+), 12 deletions(-) > > diff --git a/drivers/base/platform.c b/drivers/base/platform.c > index 506a0175a5a7..a174ce5ea17c 100644 > --- a/drivers/base/platform.c > +++ b/drivers/base/platform.c > @@ -1197,6 +1197,20 @@ struct bus_type platform_bus_type = { > }; > EXPORT_SYMBOL_GPL(platform_bus_type); > > +/** > + * platform_find_device_by_driver - Find a platform device with a given Nit: "with" is easy to misinterpret there - my initial reaction to looking at this was "so why not just use driver_find_device()?". Maybe "which would match" might make it a bit clearer? Robin. > + * driver. > + * @start: The device to start the search from. > + * @drv: The device driver to look for. > + */ > +struct device *platform_find_device_by_driver(struct device *start, > + const struct device_driver *drv) > +{ > + return bus_find_device(&platform_bus_type, start, drv, > + (void *)platform_match); > +} > +EXPORT_SYMBOL_GPL(platform_find_device_by_driver); > + > int __init platform_bus_init(void) > { > int error; > diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.c b/drivers/gpu/drm/exynos/exynos_drm_drv.c > index 58baf49d9926..badab94be2d6 100644 > --- a/drivers/gpu/drm/exynos/exynos_drm_drv.c > +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.c > @@ -242,9 +242,7 @@ static struct component_match *exynos_drm_match_add(struct device *dev) > if (!info->driver || !(info->flags & DRM_COMPONENT_DRIVER)) > continue; > > - while ((d = bus_find_device(&platform_bus_type, p, > - &info->driver->driver, > - (void *)platform_bus_type.match))) { > + while ((d = platform_find_device_by_driver(p, &info->driver->driver))) { > put_device(p); > > if (!(info->flags & DRM_FIMC_DEVICE) || > @@ -412,9 +410,8 @@ static void exynos_drm_unregister_devices(void) > if (!info->driver || !(info->flags & DRM_VIRTUAL_DEVICE)) > continue; > > - while ((dev = bus_find_device(&platform_bus_type, NULL, > - &info->driver->driver, > - (void *)platform_bus_type.match))) { > + while ((dev = platform_find_device_by_driver(NULL, > + &info->driver->driver))) { > put_device(dev); > platform_device_unregister(to_platform_device(dev)); > } > diff --git a/drivers/gpu/drm/mcde/mcde_drv.c b/drivers/gpu/drm/mcde/mcde_drv.c > index baf63fb6850a..c07abf9e201c 100644 > --- a/drivers/gpu/drm/mcde/mcde_drv.c > +++ b/drivers/gpu/drm/mcde/mcde_drv.c > @@ -477,8 +477,7 @@ static int mcde_probe(struct platform_device *pdev) > struct device_driver *drv = &mcde_component_drivers[i]->driver; > struct device *p = NULL, *d; > > - while ((d = bus_find_device(&platform_bus_type, p, drv, > - (void *)platform_bus_type.match))) { > + while ((d = platform_find_device_by_driver(p, drv))) { > put_device(p); > component_match_add(dev, &match, mcde_compare_dev, d); > p = d; > diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c > index 53d2c5bd61dc..38dc26376961 100644 > --- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c > +++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c > @@ -330,8 +330,7 @@ static struct component_match *rockchip_drm_match_add(struct device *dev) > struct device *p = NULL, *d; > > do { > - d = bus_find_device(&platform_bus_type, p, &drv->driver, > - (void *)platform_bus_type.match); > + d = platform_find_device_by_driver(p, &drv->driver); > put_device(p); > p = d; > > diff --git a/drivers/gpu/drm/vc4/vc4_drv.c b/drivers/gpu/drm/vc4/vc4_drv.c > index bf11930e40e1..1551c8253bec 100644 > --- a/drivers/gpu/drm/vc4/vc4_drv.c > +++ b/drivers/gpu/drm/vc4/vc4_drv.c > @@ -237,8 +237,7 @@ static void vc4_match_add_drivers(struct device *dev, > struct device_driver *drv = &drivers[i]->driver; > struct device *p = NULL, *d; > > - while ((d = bus_find_device(&platform_bus_type, p, drv, > - (void *)platform_bus_type.match))) { > + while ((d = platform_find_device_by_driver(p, drv))) { > put_device(p); > component_match_add(dev, match, compare_dev, d); > p = d; > diff --git a/include/linux/platform_device.h b/include/linux/platform_device.h > index 9bc36b589827..37e15a935a42 100644 > --- a/include/linux/platform_device.h > +++ b/include/linux/platform_device.h > @@ -51,6 +51,9 @@ extern struct device platform_bus; > extern void arch_setup_pdev_archdata(struct platform_device *); > extern struct resource *platform_get_resource(struct platform_device *, > unsigned int, unsigned int); > +extern struct device * > +platform_find_device_by_driver(struct device *start, > + const struct device_driver *drv); > extern void __iomem * > devm_platform_ioremap_resource(struct platform_device *pdev, > unsigned int index); >
diff --git a/drivers/base/platform.c b/drivers/base/platform.c index 506a0175a5a7..a174ce5ea17c 100644 --- a/drivers/base/platform.c +++ b/drivers/base/platform.c @@ -1197,6 +1197,20 @@ struct bus_type platform_bus_type = { }; EXPORT_SYMBOL_GPL(platform_bus_type); +/** + * platform_find_device_by_driver - Find a platform device with a given + * driver. + * @start: The device to start the search from. + * @drv: The device driver to look for. + */ +struct device *platform_find_device_by_driver(struct device *start, + const struct device_driver *drv) +{ + return bus_find_device(&platform_bus_type, start, drv, + (void *)platform_match); +} +EXPORT_SYMBOL_GPL(platform_find_device_by_driver); + int __init platform_bus_init(void) { int error; diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.c b/drivers/gpu/drm/exynos/exynos_drm_drv.c index 58baf49d9926..badab94be2d6 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_drv.c +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.c @@ -242,9 +242,7 @@ static struct component_match *exynos_drm_match_add(struct device *dev) if (!info->driver || !(info->flags & DRM_COMPONENT_DRIVER)) continue; - while ((d = bus_find_device(&platform_bus_type, p, - &info->driver->driver, - (void *)platform_bus_type.match))) { + while ((d = platform_find_device_by_driver(p, &info->driver->driver))) { put_device(p); if (!(info->flags & DRM_FIMC_DEVICE) || @@ -412,9 +410,8 @@ static void exynos_drm_unregister_devices(void) if (!info->driver || !(info->flags & DRM_VIRTUAL_DEVICE)) continue; - while ((dev = bus_find_device(&platform_bus_type, NULL, - &info->driver->driver, - (void *)platform_bus_type.match))) { + while ((dev = platform_find_device_by_driver(NULL, + &info->driver->driver))) { put_device(dev); platform_device_unregister(to_platform_device(dev)); } diff --git a/drivers/gpu/drm/mcde/mcde_drv.c b/drivers/gpu/drm/mcde/mcde_drv.c index baf63fb6850a..c07abf9e201c 100644 --- a/drivers/gpu/drm/mcde/mcde_drv.c +++ b/drivers/gpu/drm/mcde/mcde_drv.c @@ -477,8 +477,7 @@ static int mcde_probe(struct platform_device *pdev) struct device_driver *drv = &mcde_component_drivers[i]->driver; struct device *p = NULL, *d; - while ((d = bus_find_device(&platform_bus_type, p, drv, - (void *)platform_bus_type.match))) { + while ((d = platform_find_device_by_driver(p, drv))) { put_device(p); component_match_add(dev, &match, mcde_compare_dev, d); p = d; diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c index 53d2c5bd61dc..38dc26376961 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c @@ -330,8 +330,7 @@ static struct component_match *rockchip_drm_match_add(struct device *dev) struct device *p = NULL, *d; do { - d = bus_find_device(&platform_bus_type, p, &drv->driver, - (void *)platform_bus_type.match); + d = platform_find_device_by_driver(p, &drv->driver); put_device(p); p = d; diff --git a/drivers/gpu/drm/vc4/vc4_drv.c b/drivers/gpu/drm/vc4/vc4_drv.c index bf11930e40e1..1551c8253bec 100644 --- a/drivers/gpu/drm/vc4/vc4_drv.c +++ b/drivers/gpu/drm/vc4/vc4_drv.c @@ -237,8 +237,7 @@ static void vc4_match_add_drivers(struct device *dev, struct device_driver *drv = &drivers[i]->driver; struct device *p = NULL, *d; - while ((d = bus_find_device(&platform_bus_type, p, drv, - (void *)platform_bus_type.match))) { + while ((d = platform_find_device_by_driver(p, drv))) { put_device(p); component_match_add(dev, match, compare_dev, d); p = d; diff --git a/include/linux/platform_device.h b/include/linux/platform_device.h index 9bc36b589827..37e15a935a42 100644 --- a/include/linux/platform_device.h +++ b/include/linux/platform_device.h @@ -51,6 +51,9 @@ extern struct device platform_bus; extern void arch_setup_pdev_archdata(struct platform_device *); extern struct resource *platform_get_resource(struct platform_device *, unsigned int, unsigned int); +extern struct device * +platform_find_device_by_driver(struct device *start, + const struct device_driver *drv); extern void __iomem * devm_platform_ioremap_resource(struct platform_device *pdev, unsigned int index);