On Wed, Feb 21, 2018 at 12:21:50AM +0200, Jyri Sarha wrote: > @@ -94,6 +114,8 @@ static void panel_bridge_detach(struct drm_bridge *bridge) > struct panel_bridge *panel_bridge = drm_bridge_to_panel_bridge(bridge); > > drm_panel_detach(panel_bridge->panel); > + > + device_link_del(panel_bridge->link); No, you've set the DL_FLAG_AUTOREMOVE flag, so you'll end up removing the link twice, which oopses. It's either DL_FLAG_AUTOREMOVE or device_link_del(), not both. > +static int panel_bridge_link_to_master(struct panel_bridge *panel_bridge) > +{ > + struct device *mdev = panel_bridge->bridge.dev->dev; > + struct device *pdev = panel_bridge->panel->dev; > + u32 flags = DL_FLAG_AUTOREMOVE; > + > + panel_bridge->link = device_link_add(mdev, pdev, flags); > + if (!panel_bridge->link) { > + dev_err(pdev, "failed to link panel %s to %s\n", > + dev_name(pdev), dev_name(mdev)); You're printing two instances of pdev's name in the log message, one should be sufficient. Also, you've mixed up the order: mdev is the consumer, pdev the supplier. (Bikeshed: The DL_FLAG_AUTOREMOVE would still fit within 80 chars on the line with device_link_add() and the flags variable wouldn't have to be declared then. Your call.) Thanks, Lukas _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel