On Thu, Apr 26, 2018 at 10:07 AM, Jyri Sarha <jsarha@xxxxxx> wrote: > Add device_link from panel device (supplier) to drm device (consumer) > when drm_panel_attach() is called. This patch should protect the > master drm driver if an attached panel driver unbinds while it is in > use. The device_link should make sure the drm device is unbound before > the panel driver becomes unavailable. > > The device_link is removed when drm_panel_detach() is called. The > drm_panel_detach() should be called by the consumer DRM driver, not the > panel driver, otherwise both drivers are racing to delete the same link. > > Signed-off-by: Jyri Sarha <jsarha@xxxxxx> > Reviewed-by: Eric Anholt <eric@xxxxxxxxxx> Just noticed this complains when building docs: ./include/drm/drm_panel.h:98: warning: Function parameter or member 'link' not described in 'drm_panel' Care to fix this? Also would be good to capture some of the discussions that ensued from this patch in the docs ... Thanks, Daniel > --- > drivers/gpu/drm/drm_panel.c | 10 ++++++++++ > include/drm/drm_panel.h | 1 + > 2 files changed, 11 insertions(+) > > diff --git a/drivers/gpu/drm/drm_panel.c b/drivers/gpu/drm/drm_panel.c > index 71e4075..965530a 100644 > --- a/drivers/gpu/drm/drm_panel.c > +++ b/drivers/gpu/drm/drm_panel.c > @@ -24,6 +24,7 @@ > #include <linux/err.h> > #include <linux/module.h> > > +#include <drm/drm_device.h> > #include <drm/drm_crtc.h> > #include <drm/drm_panel.h> > > @@ -104,6 +105,13 @@ int drm_panel_attach(struct drm_panel *panel, struct drm_connector *connector) > if (panel->connector) > return -EBUSY; > > + panel->link = device_link_add(connector->dev->dev, panel->dev, 0); > + if (!panel->link) { > + dev_err(panel->dev, "failed to link panel to %s\n", > + dev_name(connector->dev->dev)); > + return -EINVAL; > + } > + > panel->connector = connector; > panel->drm = connector->dev; > > @@ -125,6 +133,8 @@ EXPORT_SYMBOL(drm_panel_attach); > */ > int drm_panel_detach(struct drm_panel *panel) > { > + device_link_del(panel->link); > + > panel->connector = NULL; > panel->drm = NULL; > > diff --git a/include/drm/drm_panel.h b/include/drm/drm_panel.h > index 14ac240..26a1b5f 100644 > --- a/include/drm/drm_panel.h > +++ b/include/drm/drm_panel.h > @@ -89,6 +89,7 @@ struct drm_panel { > struct drm_device *drm; > struct drm_connector *connector; > struct device *dev; > + struct device_link *link; > > const struct drm_panel_funcs *funcs; > > -- > Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki. Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki > -- Daniel Vetter Software Engineer, Intel Corporation +41 (0) 79 365 57 48 - http://blog.ffwll.ch _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel