[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <CAE-0n53yT2D7q7gXCPq19EGUqN8NRLYq9WUd=wPPR8JY9SSqoQ@mail.gmail.com>
Date: Fri, 7 Jan 2022 12:12:49 -0800
From: Stephen Boyd <swboyd@...omium.org>
To: Douglas Anderson <dianders@...omium.org>,
Greg Kroah-Hartman <gregkh@...uxfoundation.org>,
Jani Nikula <jani.nikula@...ux.intel.com>
Cc: Saravana Kannan <saravanak@...gle.com>,
"Rafael J. Wysocki" <rafael@...nel.org>,
linux-arm-msm@...r.kernel.org, linux-kernel@...r.kernel.org,
dri-devel@...ts.freedesktop.org,
Laurent Pinchart <laurent.pinchart@...asonboard.com>,
Daniel Vetter <daniel.vetter@...ll.ch>,
Russell King <rmk+kernel@....linux.org.uk>,
freedreno@...ts.freedesktop.org, Ingo Molnar <mingo@...nel.org>
Subject: Re: [PATCH v5 03/32] component: Move struct aggregate_device out to
header file
Quoting Jani Nikula (2022-01-07 05:07:59)
> On Thu, 06 Jan 2022, Stephen Boyd <swboyd@...omium.org> wrote:
> > This allows aggregate driver writers to use the device passed to their
> > probe/remove/shutdown functions properly instead of treating it as an
> > opaque pointer.
>
> You say it like having opaque pointers with interfaces instead of
> exposed data is a bad thing.
I didn't intend to convey that message at all and in fact I didn't write
that opaque pointers are a bad thing.
>
> Data is not an interface. IMO if you can get by with keeping the types
> private, go for it. Unless I'm missing something, you only need the
> parent dev pointer. Maybe add a helper function for it?
Sure I'll add a function for that.
>
> It's trivial to expose the guts like this, but it's usually a lot of
> hard work to go the other way. Look at the dependencies of component.h
> now. To keep it self-contained, i.e. buildable without implicit
> dependencies, you'd need to add #include <device.h>, which goes on to
> include the world. Then have a look at [1].
>
> Please at least let's not do this lightly.
>
Got it. Thanks! How does this look?
---8<---
diff --git a/drivers/base/component.c b/drivers/base/component.c
index cd50137753b4..e8f09945c261 100644
--- a/drivers/base/component.c
+++ b/drivers/base/component.c
@@ -56,6 +56,27 @@ struct component_match {
struct component_match_array *compare;
};
+struct aggregate_device {
+ const struct component_master_ops *ops;
+ struct device *parent;
+ struct device dev;
+ struct component_match *match;
+ struct aggregate_driver *adrv;
+
+ int id;
+};
+
+static inline struct aggregate_device *to_aggregate_device(struct device *d)
+{
+ return container_of(d, struct aggregate_device, dev);
+}
+
+struct device *aggregate_device_parent(struct aggregate_device *adev)
+{
+ return adev->parent;
+}
+EXPORT_SYMBOL_GPL(aggregate_device_parent);
+
struct component {
struct list_head node;
struct aggregate_device *adev;
diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_drv.c
b/drivers/gpu/drm/arm/display/komeda/komeda_drv.c
index 0463386a6ed2..5fa868cf9825 100644
--- a/drivers/gpu/drm/arm/display/komeda/komeda_drv.c
+++ b/drivers/gpu/drm/arm/display/komeda/komeda_drv.c
@@ -27,7 +27,7 @@ struct komeda_dev *dev_to_mdev(struct device *dev)
static void komeda_unbind(struct aggregate_device *adev)
{
- struct device *dev = adev->parent;
+ struct device *dev = aggregate_device_parent(adev);
struct komeda_drv *mdrv = dev_get_drvdata(dev);
if (!mdrv)
@@ -48,7 +48,7 @@ static void komeda_unbind(struct aggregate_device *adev)
static int komeda_bind(struct aggregate_device *adev)
{
- struct device *dev = adev->parent;
+ struct device *dev = aggregate_device_parent(adev);
struct komeda_drv *mdrv;
int err;
diff --git a/drivers/gpu/drm/arm/hdlcd_drv.c b/drivers/gpu/drm/arm/hdlcd_drv.c
index 5c03eb98d814..e3ed925797d5 100644
--- a/drivers/gpu/drm/arm/hdlcd_drv.c
+++ b/drivers/gpu/drm/arm/hdlcd_drv.c
@@ -272,7 +272,7 @@ static const struct drm_driver hdlcd_driver = {
static int hdlcd_drm_bind(struct aggregate_device *adev)
{
- struct device *dev = adev->parent;
+ struct device *dev = aggregate_device_parent(adev);
struct drm_device *drm;
struct hdlcd_drm_private *hdlcd;
int ret;
@@ -347,7 +347,7 @@ static int hdlcd_drm_bind(struct aggregate_device *adev)
static void hdlcd_drm_unbind(struct aggregate_device *adev)
{
- struct device *dev = adev->parent;
+ struct device *dev = aggregate_device_parent(adev);
struct drm_device *drm = dev_get_drvdata(dev);
struct hdlcd_drm_private *hdlcd = drm->dev_private;
diff --git a/drivers/gpu/drm/arm/malidp_drv.c b/drivers/gpu/drm/arm/malidp_drv.c
index e6ee4d1e3bb8..7b946b962b22 100644
--- a/drivers/gpu/drm/arm/malidp_drv.c
+++ b/drivers/gpu/drm/arm/malidp_drv.c
@@ -704,7 +704,7 @@ static int malidp_runtime_pm_resume(struct device *dev)
static int malidp_bind(struct aggregate_device *adev)
{
- struct device *dev = adev->parent;
+ struct device *dev = aggregate_device_parent(adev);
struct resource *res;
struct drm_device *drm;
struct malidp_drm *malidp;
@@ -897,7 +897,7 @@ static int malidp_bind(struct aggregate_device *adev)
static void malidp_unbind(struct aggregate_device *adev)
{
- struct device *dev = adev->parent;
+ struct device *dev = aggregate_device_parent(adev);
struct drm_device *drm = dev_get_drvdata(dev);
struct malidp_drm *malidp = drm->dev_private;
struct malidp_hw_device *hwdev = malidp->dev;
diff --git a/drivers/gpu/drm/armada/armada_drv.c
b/drivers/gpu/drm/armada/armada_drv.c
index b3559363ea43..27739cbe2291 100644
--- a/drivers/gpu/drm/armada/armada_drv.c
+++ b/drivers/gpu/drm/armada/armada_drv.c
@@ -62,7 +62,7 @@ static const struct drm_mode_config_funcs
armada_drm_mode_config_funcs = {
static int armada_drm_bind(struct aggregate_device *adev)
{
- struct device *dev = adev->parent;
+ struct device *dev = aggregate_device_parent(adev);
struct armada_private *priv;
struct resource *mem = NULL;
int ret, n;
@@ -162,7 +162,7 @@ static int armada_drm_bind(struct aggregate_device *adev)
static void armada_drm_unbind(struct aggregate_device *adev)
{
- struct device *dev = adev->parent;
+ struct device *dev = aggregate_device_parent(adev);
struct drm_device *drm = dev_get_drvdata(dev);
struct armada_private *priv = drm_to_armada_dev(drm);
diff --git a/drivers/gpu/drm/etnaviv/etnaviv_drv.c
b/drivers/gpu/drm/etnaviv/etnaviv_drv.c
index 95d1e518ff13..2ea655fd7a70 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_drv.c
+++ b/drivers/gpu/drm/etnaviv/etnaviv_drv.c
@@ -496,7 +496,7 @@ static const struct drm_driver etnaviv_drm_driver = {
*/
static int etnaviv_bind(struct aggregate_device *adev)
{
- struct device *dev = adev->parent;
+ struct device *dev = aggregate_device_parent(adev);
struct etnaviv_drm_private *priv;
struct drm_device *drm;
int ret;
@@ -555,7 +555,7 @@ static int etnaviv_bind(struct aggregate_device *adev)
static void etnaviv_unbind(struct aggregate_device *adev)
{
- struct device *dev = adev->parent;
+ struct device *dev = aggregate_device_parent(adev);
struct drm_device *drm = dev_get_drvdata(dev);
struct etnaviv_drm_private *priv = drm->dev_private;
diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.c
b/drivers/gpu/drm/exynos/exynos_drm_drv.c
index dcb52ec2bd35..f58c3069b591 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_drv.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_drv.c
@@ -255,7 +255,7 @@ static struct component_match
*exynos_drm_match_add(struct device *dev)
static int exynos_drm_bind(struct aggregate_device *adev)
{
- struct device *dev = adev->parent;
+ struct device *dev = aggregate_device_parent(adev);
struct exynos_drm_private *private;
struct drm_encoder *encoder;
struct drm_device *drm;
@@ -333,7 +333,7 @@ static int exynos_drm_bind(struct aggregate_device *adev)
static void exynos_drm_unbind(struct aggregate_device *adev)
{
- struct device *dev = adev->parent;
+ struct device *dev = aggregate_device_parent(adev);
struct drm_device *drm = dev_get_drvdata(dev);
drm_dev_unregister(drm);
diff --git a/drivers/gpu/drm/hisilicon/kirin/kirin_drm_drv.c
b/drivers/gpu/drm/hisilicon/kirin/kirin_drm_drv.c
index 00d47c784cbb..338077908177 100644
--- a/drivers/gpu/drm/hisilicon/kirin/kirin_drm_drv.c
+++ b/drivers/gpu/drm/hisilicon/kirin/kirin_drm_drv.c
@@ -219,7 +219,7 @@ static int kirin_drm_kms_cleanup(struct drm_device *dev)
static int kirin_drm_bind(struct aggregate_device *adev)
{
- struct device *dev = adev->parent;
+ struct device *dev = aggregate_device_parent(adev);
struct kirin_drm_data *driver_data;
struct drm_device *drm_dev;
int ret;
@@ -256,7 +256,7 @@ static int kirin_drm_bind(struct aggregate_device *adev)
static void kirin_drm_unbind(struct aggregate_device *adev)
{
- struct device *dev = adev->parent;
+ struct device *dev = aggregate_device_parent(adev);
struct drm_device *drm_dev = dev_get_drvdata(dev);
drm_dev_unregister(drm_dev);
diff --git a/drivers/gpu/drm/imx/imx-drm-core.c
b/drivers/gpu/drm/imx/imx-drm-core.c
index 9e28bb16364c..82645e42b7d3 100644
--- a/drivers/gpu/drm/imx/imx-drm-core.c
+++ b/drivers/gpu/drm/imx/imx-drm-core.c
@@ -198,7 +198,7 @@ static int compare_of(struct device *dev, void *data)
static int imx_drm_bind(struct aggregate_device *adev)
{
- struct device *dev = adev->parent;
+ struct device *dev = aggregate_device_parent(adev);
struct drm_device *drm;
int ret;
@@ -267,7 +267,7 @@ static int imx_drm_bind(struct aggregate_device *adev)
static void imx_drm_unbind(struct aggregate_device *adev)
{
- struct device *dev = adev->parent;
+ struct device *dev = aggregate_device_parent(adev);
struct drm_device *drm = dev_get_drvdata(dev);
drm_dev_unregister(drm);
diff --git a/drivers/gpu/drm/ingenic/ingenic-drm-drv.c
b/drivers/gpu/drm/ingenic/ingenic-drm-drv.c
index d5330fb486e8..db61efc35b2d 100644
--- a/drivers/gpu/drm/ingenic/ingenic-drm-drv.c
+++ b/drivers/gpu/drm/ingenic/ingenic-drm-drv.c
@@ -1152,7 +1152,7 @@ static int ingenic_drm_bind(struct device *dev,
bool has_components)
static int ingenic_drm_bind_with_components(struct aggregate_device *adev)
{
- struct device *dev = adev->parent;
+ struct device *dev = aggregate_device_parent(adev);
return ingenic_drm_bind(dev, true);
}
@@ -1178,7 +1178,7 @@ static void ingenic_drm_unbind(struct device *dev)
static void ingenic_aggregate_remove(struct aggregate_device *adev)
{
- struct device *dev = adev->parent;
+ struct device *dev = aggregate_device_parent(adev);
ingenic_drm_unbind(dev);
}
diff --git a/drivers/gpu/drm/mcde/mcde_drv.c b/drivers/gpu/drm/mcde/mcde_drv.c
index 1652f9e0601d..b8479355844e 100644
--- a/drivers/gpu/drm/mcde/mcde_drv.c
+++ b/drivers/gpu/drm/mcde/mcde_drv.c
@@ -217,7 +217,7 @@ static const struct drm_driver mcde_drm_driver = {
static int mcde_drm_bind(struct aggregate_device *adev)
{
- struct device *dev = adev->parent;
+ struct device *dev = aggregate_device_parent(adev);
struct drm_device *drm = dev_get_drvdata(dev);
int ret;
@@ -250,7 +250,7 @@ static int mcde_drm_bind(struct aggregate_device *adev)
static void mcde_drm_unbind(struct aggregate_device *adev)
{
- struct device *dev = adev->parent;
+ struct device *dev = aggregate_device_parent(adev);
struct drm_device *drm = dev_get_drvdata(dev);
drm_dev_unregister(drm);
diff --git a/drivers/gpu/drm/mediatek/mtk_drm_drv.c
b/drivers/gpu/drm/mediatek/mtk_drm_drv.c
index a3f27b8c9769..af0dda5e45bf 100644
--- a/drivers/gpu/drm/mediatek/mtk_drm_drv.c
+++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.c
@@ -350,7 +350,7 @@ static int compare_of(struct device *dev, void *data)
static int mtk_drm_bind(struct aggregate_device *adev)
{
- struct device *dev = adev->parent;
+ struct device *dev = aggregate_device_parent(adev);
struct mtk_drm_private *private = dev_get_drvdata(dev);
struct drm_device *drm;
int ret;
@@ -383,7 +383,7 @@ static int mtk_drm_bind(struct aggregate_device *adev)
static void mtk_drm_unbind(struct aggregate_device *adev)
{
- struct device *dev = adev->parent;
+ struct device *dev = aggregate_device_parent(adev);
struct mtk_drm_private *private = dev_get_drvdata(dev);
drm_dev_unregister(private->drm);
diff --git a/drivers/gpu/drm/meson/meson_drv.c
b/drivers/gpu/drm/meson/meson_drv.c
index 3028f2a45f66..426caea3d570 100644
--- a/drivers/gpu/drm/meson/meson_drv.c
+++ b/drivers/gpu/drm/meson/meson_drv.c
@@ -358,14 +358,14 @@ static int meson_drv_bind_master(struct device
*dev, bool has_components)
static int meson_drv_bind(struct aggregate_device *adev)
{
- struct device *dev = adev->parent;
+ struct device *dev = aggregate_device_parent(adev);
return meson_drv_bind_master(dev, true);
}
static void meson_drv_unbind(struct aggregate_device *adev)
{
- struct device *dev = adev->parent;
+ struct device *dev = aggregate_device_parent(adev);
struct meson_drm *priv = dev_get_drvdata(dev);
struct drm_device *drm = priv->drm;
diff --git a/drivers/gpu/drm/msm/msm_drv.c b/drivers/gpu/drm/msm/msm_drv.c
index f6e9b0d318f5..b2735355ea81 100644
--- a/drivers/gpu/drm/msm/msm_drv.c
+++ b/drivers/gpu/drm/msm/msm_drv.c
@@ -1362,17 +1362,19 @@ static int add_gpu_components(struct device *dev,
static int msm_drm_bind(struct aggregate_device *adev)
{
- return msm_drm_init(adev->parent, &msm_driver);
+ return msm_drm_init(aggregate_device_parent(adev), &msm_driver);
}
static void msm_drm_unbind(struct aggregate_device *adev)
{
- msm_drm_uninit(adev->parent);
+ msm_drm_uninit(aggregate_device_parent(adev));
}
static void msm_drm_shutdown(struct aggregate_device *adev)
{
- struct drm_device *drm =
platform_get_drvdata(to_platform_device(adev->parent));
+ const struct device *parent = aggregate_device_parent(adev);
+ const struct platform_device *pdev = to_platform_device(parent);
+ struct drm_device *drm = platform_get_drvdata(pdev);
struct msm_drm_private *priv = drm ? drm->dev_private : NULL;
if (!priv || !priv->kms)
diff --git a/drivers/gpu/drm/omapdrm/dss/dss.c
b/drivers/gpu/drm/omapdrm/dss/dss.c
index 9328d97f19ab..6226ef389694 100644
--- a/drivers/gpu/drm/omapdrm/dss/dss.c
+++ b/drivers/gpu/drm/omapdrm/dss/dss.c
@@ -1306,7 +1306,7 @@ static const struct soc_device_attribute
dss_soc_devices[] = {
static int dss_bind(struct aggregate_device *adev)
{
- struct device *dev = adev->parent;
+ struct device *dev = aggregate_device_parent(adev);
struct dss_device *dss = dev_get_drvdata(dev);
struct platform_device *drm_pdev;
struct dss_pdata pdata;
@@ -1333,7 +1333,7 @@ static int dss_bind(struct aggregate_device *adev)
static void dss_unbind(struct aggregate_device *adev)
{
- struct device *dev = adev->parent;
+ struct device *dev = aggregate_device_parent(adev);
struct dss_device *dss = dev_get_drvdata(dev);
platform_device_unregister(dss->drm_pdev);
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
index 6c755361d376..5179ca899dbb 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
@@ -111,7 +111,7 @@ static void rockchip_iommu_cleanup(struct
drm_device *drm_dev)
static int rockchip_drm_bind(struct aggregate_device *adev)
{
- struct device *dev = adev->parent;
+ struct device *dev = aggregate_device_parent(adev);
struct drm_device *drm_dev;
struct rockchip_drm_private *private;
int ret;
@@ -186,7 +186,7 @@ static int rockchip_drm_bind(struct aggregate_device *adev)
static void rockchip_drm_unbind(struct aggregate_device *adev)
{
- struct device *dev = adev->parent;
+ struct device *dev = aggregate_device_parent(adev);
struct drm_device *drm_dev = dev_get_drvdata(dev);
drm_dev_unregister(drm_dev);
diff --git a/drivers/gpu/drm/sti/sti_drv.c b/drivers/gpu/drm/sti/sti_drv.c
index b277cc679154..958db315d547 100644
--- a/drivers/gpu/drm/sti/sti_drv.c
+++ b/drivers/gpu/drm/sti/sti_drv.c
@@ -184,7 +184,7 @@ static void sti_cleanup(struct drm_device *ddev)
static int sti_bind(struct aggregate_device *adev)
{
- struct device *dev = adev->parent;
+ struct device *dev = aggregate_device_parent(adev);
struct drm_device *ddev;
int ret;
@@ -219,7 +219,7 @@ static int sti_bind(struct aggregate_device *adev)
static void sti_unbind(struct aggregate_device *adev)
{
- struct device *dev = adev->parent;
+ struct device *dev = aggregate_device_parent(adev);
struct drm_device *ddev = dev_get_drvdata(dev);
drm_dev_unregister(ddev);
diff --git a/drivers/gpu/drm/sun4i/sun4i_drv.c
b/drivers/gpu/drm/sun4i/sun4i_drv.c
index 700f5e32eaf7..35c5e575132f 100644
--- a/drivers/gpu/drm/sun4i/sun4i_drv.c
+++ b/drivers/gpu/drm/sun4i/sun4i_drv.c
@@ -58,7 +58,7 @@ static const struct drm_driver sun4i_drv_driver = {
static int sun4i_drv_bind(struct aggregate_device *adev)
{
- struct device *dev = adev->parent;
+ struct device *dev = aggregate_device_parent(adev);
struct drm_device *drm;
struct sun4i_drv *drv;
int ret;
@@ -128,7 +128,7 @@ static int sun4i_drv_bind(struct aggregate_device *adev)
static void sun4i_drv_unbind(struct aggregate_device *adev)
{
- struct device *dev = adev->parent;
+ struct device *dev = aggregate_device_parent(adev);
struct drm_device *drm = dev_get_drvdata(dev);
drm_dev_unregister(drm);
diff --git a/drivers/gpu/drm/tilcdc/tilcdc_drv.c
b/drivers/gpu/drm/tilcdc/tilcdc_drv.c
index 92ff516fb6de..c12c579ce66f 100644
--- a/drivers/gpu/drm/tilcdc/tilcdc_drv.c
+++ b/drivers/gpu/drm/tilcdc/tilcdc_drv.c
@@ -531,14 +531,14 @@ static const struct dev_pm_ops tilcdc_pm_ops = {
*/
static int tilcdc_bind(struct aggregate_device *adev)
{
- struct device *dev = adev->parent;
+ struct device *dev = aggregate_device_parent(adev);
return tilcdc_init(&tilcdc_driver, dev);
}
static void tilcdc_unbind(struct aggregate_device *adev)
{
- struct device *dev = adev->parent;
+ struct device *dev = aggregate_device_parent(adev);
struct drm_device *ddev = dev_get_drvdata(dev);
/* Check if a subcomponent has already triggered the unloading. */
diff --git a/drivers/gpu/drm/vc4/vc4_drv.c b/drivers/gpu/drm/vc4/vc4_drv.c
index 82a44ebf9121..297ecddea5fb 100644
--- a/drivers/gpu/drm/vc4/vc4_drv.c
+++ b/drivers/gpu/drm/vc4/vc4_drv.c
@@ -214,7 +214,7 @@ static void vc4_match_add_drivers(struct device *dev,
static int vc4_drm_bind(struct aggregate_device *adev)
{
- struct device *dev = adev->parent;
+ struct device *dev = aggregate_device_parent(adev);
struct platform_device *pdev = to_platform_device(dev);
struct drm_device *drm;
struct vc4_dev *vc4;
@@ -287,7 +287,7 @@ static int vc4_drm_bind(struct aggregate_device *adev)
static void vc4_drm_unbind(struct aggregate_device *adev)
{
- struct device *dev = adev->parent;
+ struct device *dev = aggregate_device_parent(adev);
struct drm_device *drm = dev_get_drvdata(dev);
drm_dev_unregister(drm);
diff --git a/drivers/iommu/mtk_iommu.h b/drivers/iommu/mtk_iommu.h
index 064fd4f4eade..125be5819c42 100644
--- a/drivers/iommu/mtk_iommu.h
+++ b/drivers/iommu/mtk_iommu.h
@@ -96,7 +96,7 @@ static inline void release_of(struct device *dev, void *data)
static inline int mtk_iommu_bind(struct aggregate_device *adev)
{
- struct device *dev = adev->parent;
+ struct device *dev = aggregate_device_parent(adev);
struct mtk_iommu_data *data = dev_get_drvdata(dev);
return component_bind_all(dev, &data->larb_imu);
@@ -104,7 +104,7 @@ static inline int mtk_iommu_bind(struct
aggregate_device *adev)
static inline void mtk_iommu_unbind(struct aggregate_device *adev)
{
- struct device *dev = adev->parent;
+ struct device *dev = aggregate_device_parent(adev);
struct mtk_iommu_data *data = dev_get_drvdata(dev);
component_unbind_all(dev, &data->larb_imu);
diff --git a/drivers/misc/mei/hdcp/mei_hdcp.c b/drivers/misc/mei/hdcp/mei_hdcp.c
index ae903a09fb06..3c6e4e3bf212 100644
--- a/drivers/misc/mei/hdcp/mei_hdcp.c
+++ b/drivers/misc/mei/hdcp/mei_hdcp.c
@@ -734,7 +734,7 @@ static const struct i915_hdcp_component_ops mei_hdcp_ops = {
static int mei_hdcp_aggregate_bind(struct aggregate_device *adev)
{
- struct device *dev = adev->parent;
+ struct device *dev = aggregate_device_parent(adev);
struct mei_cl_device *cldev = to_mei_cl_device(dev);
struct i915_hdcp_comp_master *comp_master =
mei_cldev_get_drvdata(cldev);
@@ -752,7 +752,7 @@ static int mei_hdcp_aggregate_bind(struct
aggregate_device *adev)
static void mei_hdcp_aggregate_unbind(struct aggregate_device *adev)
{
- struct device *dev = adev->parent;
+ struct device *dev = aggregate_device_parent(adev);
struct mei_cl_device *cldev = to_mei_cl_device(dev);
struct i915_hdcp_comp_master *comp_master =
mei_cldev_get_drvdata(cldev);
diff --git a/drivers/misc/mei/pxp/mei_pxp.c b/drivers/misc/mei/pxp/mei_pxp.c
index 7b7bd7c0e8b1..887e43e6ba5f 100644
--- a/drivers/misc/mei/pxp/mei_pxp.c
+++ b/drivers/misc/mei/pxp/mei_pxp.c
@@ -85,7 +85,7 @@ static const struct i915_pxp_component_ops mei_pxp_ops = {
static int mei_pxp_aggregate_bind(struct aggregate_device *adev)
{
- struct device *dev = adev->parent;
+ struct device *dev = aggregate_device_parent(adev);
struct mei_cl_device *cldev = to_mei_cl_device(dev);
struct i915_pxp_component *comp_master = mei_cldev_get_drvdata(cldev);
int ret;
@@ -101,7 +101,7 @@ static int mei_pxp_aggregate_bind(struct
aggregate_device *adev)
static void mei_pxp_aggregate_unbind(struct aggregate_device *adev)
{
- struct device *dev = adev->parent;
+ struct device *dev = aggregate_device_parent(adev);
struct mei_cl_device *cldev = to_mei_cl_device(dev);
struct i915_pxp_component *comp_master = mei_cldev_get_drvdata(cldev);
diff --git a/drivers/power/supply/ab8500_charger.c
b/drivers/power/supply/ab8500_charger.c
index 52d4105e28f2..e1e5c9387b57 100644
--- a/drivers/power/supply/ab8500_charger.c
+++ b/drivers/power/supply/ab8500_charger.c
@@ -3314,7 +3314,7 @@ static const struct power_supply_desc
ab8500_usb_chg_desc = {
static int ab8500_charger_bind(struct aggregate_device *adev)
{
- struct device *dev = adev->parent;
+ struct device *dev = aggregate_device_parent(adev);
struct ab8500_charger *di = dev_get_drvdata(dev);
int ch_stat;
int ret;
@@ -3357,7 +3357,7 @@ static int ab8500_charger_bind(struct
aggregate_device *adev)
static void ab8500_charger_unbind(struct aggregate_device *adev)
{
- struct device *dev = adev->parent;
+ struct device *dev = aggregate_device_parent(adev);
struct ab8500_charger *di = dev_get_drvdata(dev);
int ret;
diff --git a/drivers/video/fbdev/omap2/omapfb/dss/dss.c
b/drivers/video/fbdev/omap2/omapfb/dss/dss.c
index f12663c39ceb..0bdb9f909992 100644
--- a/drivers/video/fbdev/omap2/omapfb/dss/dss.c
+++ b/drivers/video/fbdev/omap2/omapfb/dss/dss.c
@@ -1069,7 +1069,7 @@ static int dss_video_pll_probe(struct
platform_device *pdev)
/* DSS HW IP initialisation */
static int dss_bind(struct aggregate_device *adev)
{
- struct device *dev = adev->parent;
+ struct device *dev = aggregate_device_parent(adev);
struct platform_device *pdev = to_platform_device(dev);
struct resource *dss_mem;
u32 rev;
@@ -1170,7 +1170,7 @@ static int dss_bind(struct aggregate_device *adev)
static void dss_unbind(struct aggregate_device *adev)
{
- struct device *dev = adev->parent;
+ struct device *dev = aggregate_device_parent(adev);
struct platform_device *pdev = to_platform_device(dev);
dss_initialized = false;
diff --git a/include/linux/component.h b/include/linux/component.h
index 07fe481d4e3b..7c86f4cc718e 100644
--- a/include/linux/component.h
+++ b/include/linux/component.h
@@ -8,6 +8,8 @@
struct component_match;
struct aggregate_device;
+struct device *aggregate_device_parent(struct aggregate_device *adev);
+
/**
* struct component_ops - callbacks for component drivers
*
@@ -63,20 +65,6 @@ void component_del(struct device *, const struct
component_ops *);
int component_bind_all(struct device *master, void *master_data);
void component_unbind_all(struct device *master, void *master_data);
-struct aggregate_device {
- struct device *parent;
- struct device dev;
- struct component_match *match;
- struct aggregate_driver *adrv;
-
- int id;
-};
-
-static inline struct aggregate_device *to_aggregate_device(struct device *d)
-{
- return container_of(d, struct aggregate_device, dev);
-}
-
/**
* struct aggregate_driver - Aggregate driver (made up of other drivers)
* @driver: device driver
diff --git a/sound/hda/hdac_component.c b/sound/hda/hdac_component.c
index 9e4dab97f485..4ec5d9bf8533 100644
--- a/sound/hda/hdac_component.c
+++ b/sound/hda/hdac_component.c
@@ -183,7 +183,7 @@ EXPORT_SYMBOL_GPL(snd_hdac_acomp_get_eld);
static int hdac_component_master_bind(struct aggregate_device *adev)
{
- struct device *dev = adev->parent;
+ struct device *dev = aggregate_device_parent(adev);
struct drm_audio_component *acomp = hdac_get_acomp(dev);
int ret;
@@ -225,7 +225,7 @@ static int hdac_component_master_bind(struct
aggregate_device *adev)
static void hdac_component_master_unbind(struct aggregate_device *adev)
{
- struct device *dev = adev->parent;
+ struct device *dev = aggregate_device_parent(adev);
struct drm_audio_component *acomp = hdac_get_acomp(dev);
if (acomp->audio_ops && acomp->audio_ops->master_unbind)
diff --git a/sound/soc/codecs/wcd938x.c b/sound/soc/codecs/wcd938x.c
index f44f5d41bfdb..6edb040d0639 100644
--- a/sound/soc/codecs/wcd938x.c
+++ b/sound/soc/codecs/wcd938x.c
@@ -4318,7 +4318,7 @@ static struct snd_soc_dai_driver wcd938x_dais[] = {
static int wcd938x_bind(struct aggregate_device *adev)
{
- struct device *dev = adev->parent;
+ struct device *dev = aggregate_device_parent(adev);
struct wcd938x_priv *wcd938x = dev_get_drvdata(dev);
int ret;
@@ -4403,7 +4403,7 @@ static int wcd938x_bind(struct aggregate_device *adev)
static void wcd938x_unbind(struct aggregate_device *adev)
{
- struct device *dev = adev->parent;
+ struct device *dev = aggregate_device_parent(adev);
struct wcd938x_priv *wcd938x = dev_get_drvdata(dev);
device_link_remove(dev, wcd938x->txdev);
Powered by blists - more mailing lists