Message ID | 1511868006-27130-2-git-send-email-nickey.yang@rock-chips.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Tue, Nov 28, 2017 at 07:20:02PM +0800, Nickey Yang wrote: Looks like you paved the author. This should be From: Brian. Sean > Bridge drivers/helpers shouldn't be clobbering the drvdata, since a > parent driver might need to own this. Instead, let's return our > 'dw_mipi_dsi' object and have callers pass that back to us for removal. > > Signed-off-by: Brian Norris <briannorris@chromium.org> > Reviewed-by: Matthias Kaehlcke <mka@chromium.org> > Reviewed-by: Archit Taneja <architt@codeaurora.org> > Acked-by: Philippe Cornu <philippe.cornu@st.com> > Link:https://patchwork.kernel.org/patch/10078493/ > --- > drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.c | 36 ++++++++++----------------- > include/drm/bridge/dw_mipi_dsi.h | 17 ++++++++----- > 2 files changed, 24 insertions(+), 29 deletions(-) > > diff --git a/drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.c b/drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.c > index d9cca4f..c39c7dc 100644 > --- a/drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.c > +++ b/drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.c > @@ -922,8 +922,6 @@ static int dw_mipi_dsi_bridge_attach(struct drm_bridge *bridge) > dsi->bridge.of_node = pdev->dev.of_node; > #endif > > - dev_set_drvdata(dev, dsi); > - > return dsi; > } > > @@ -935,23 +933,16 @@ static void __dw_mipi_dsi_remove(struct dw_mipi_dsi *dsi) > /* > * Probe/remove API, used from platforms based on the DRM bridge API. > */ > -int dw_mipi_dsi_probe(struct platform_device *pdev, > - const struct dw_mipi_dsi_plat_data *plat_data) > +struct dw_mipi_dsi * > +dw_mipi_dsi_probe(struct platform_device *pdev, > + const struct dw_mipi_dsi_plat_data *plat_data) > { > - struct dw_mipi_dsi *dsi; > - > - dsi = __dw_mipi_dsi_probe(pdev, plat_data); > - if (IS_ERR(dsi)) > - return PTR_ERR(dsi); > - > - return 0; > + return __dw_mipi_dsi_probe(pdev, plat_data); > } > EXPORT_SYMBOL_GPL(dw_mipi_dsi_probe); > > -void dw_mipi_dsi_remove(struct platform_device *pdev) > +void dw_mipi_dsi_remove(struct dw_mipi_dsi *dsi) > { > - struct dw_mipi_dsi *dsi = platform_get_drvdata(pdev); > - > mipi_dsi_host_unregister(&dsi->dsi_host); > > __dw_mipi_dsi_remove(dsi); > @@ -961,31 +952,30 @@ void dw_mipi_dsi_remove(struct platform_device *pdev) > /* > * Bind/unbind API, used from platforms based on the component framework. > */ > -int dw_mipi_dsi_bind(struct platform_device *pdev, struct drm_encoder *encoder, > - const struct dw_mipi_dsi_plat_data *plat_data) > +struct dw_mipi_dsi * > +dw_mipi_dsi_bind(struct platform_device *pdev, struct drm_encoder *encoder, > + const struct dw_mipi_dsi_plat_data *plat_data) > { > struct dw_mipi_dsi *dsi; > int ret; > > dsi = __dw_mipi_dsi_probe(pdev, plat_data); > if (IS_ERR(dsi)) > - return PTR_ERR(dsi); > + return dsi; > > ret = drm_bridge_attach(encoder, &dsi->bridge, NULL); > if (ret) { > - dw_mipi_dsi_remove(pdev); > + dw_mipi_dsi_remove(dsi); > DRM_ERROR("Failed to initialize bridge with drm\n"); > - return ret; > + return ERR_PTR(ret); > } > > - return 0; > + return dsi; > } > EXPORT_SYMBOL_GPL(dw_mipi_dsi_bind); > > -void dw_mipi_dsi_unbind(struct device *dev) > +void dw_mipi_dsi_unbind(struct dw_mipi_dsi *dsi) > { > - struct dw_mipi_dsi *dsi = dev_get_drvdata(dev); > - > __dw_mipi_dsi_remove(dsi); > } > EXPORT_SYMBOL_GPL(dw_mipi_dsi_unbind); > diff --git a/include/drm/bridge/dw_mipi_dsi.h b/include/drm/bridge/dw_mipi_dsi.h > index 9b30fec..d9c6d54 100644 > --- a/include/drm/bridge/dw_mipi_dsi.h > +++ b/include/drm/bridge/dw_mipi_dsi.h > @@ -10,6 +10,8 @@ > #ifndef __DW_MIPI_DSI__ > #define __DW_MIPI_DSI__ > > +struct dw_mipi_dsi; > + > struct dw_mipi_dsi_phy_ops { > int (*init)(void *priv_data); > int (*get_lane_mbps)(void *priv_data, struct drm_display_mode *mode, > @@ -29,11 +31,14 @@ struct dw_mipi_dsi_plat_data { > void *priv_data; > }; > > -int dw_mipi_dsi_probe(struct platform_device *pdev, > - const struct dw_mipi_dsi_plat_data *plat_data); > -void dw_mipi_dsi_remove(struct platform_device *pdev); > -int dw_mipi_dsi_bind(struct platform_device *pdev, struct drm_encoder *encoder, > - const struct dw_mipi_dsi_plat_data *plat_data); > -void dw_mipi_dsi_unbind(struct device *dev); > +struct dw_mipi_dsi *dw_mipi_dsi_probe(struct platform_device *pdev, > + const struct dw_mipi_dsi_plat_data > + *plat_data); > +void dw_mipi_dsi_remove(struct dw_mipi_dsi *dsi); > +struct dw_mipi_dsi *dw_mipi_dsi_bind(struct platform_device *pdev, > + struct drm_encoder *encoder, > + const struct dw_mipi_dsi_plat_data > + *plat_data); > +void dw_mipi_dsi_unbind(struct dw_mipi_dsi *dsi); > > #endif /* __DW_MIPI_DSI__ */ > -- > 1.9.1 >
Hi Nickey, Thank you for the patch! Yet something to improve: [auto build test ERROR on drm/drm-next] [also build test ERROR on v4.15-rc1 next-20171201] [cannot apply to rockchip/for-next] [if your patch is applied to the wrong git tree, please drop us a note to help improve the system] url: https://github.com/0day-ci/linux/commits/Nickey-Yang/Update-ROCKCHIP-DSI-driver-that-uses-dw-mipi-dsi-bridge/20171201-125654 base: git://people.freedesktop.org/~airlied/linux.git drm-next config: arm-allmodconfig (attached as .config) compiler: arm-linux-gnueabi-gcc (Debian 7.2.0-11) 7.2.0 reproduce: wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # save the attached .config to linux build tree make.cross ARCH=arm Note: the linux-review/Nickey-Yang/Update-ROCKCHIP-DSI-driver-that-uses-dw-mipi-dsi-bridge/20171201-125654 HEAD f1eee2e077700ada27d5585bae6dedf4ac671bb5 builds fine. It only hurts bisectibility. All error/warnings (new ones prefixed by >>): drivers/gpu/drm/stm/dw_mipi_dsi-stm.c: In function 'dw_mipi_dsi_stm_probe': >> drivers/gpu/drm/stm/dw_mipi_dsi-stm.c:321:6: warning: assignment makes integer from pointer without a cast [-Wint-conversion] ret = dw_mipi_dsi_probe(pdev, &dw_mipi_dsi_stm_plat_data); ^ drivers/gpu/drm/stm/dw_mipi_dsi-stm.c: In function 'dw_mipi_dsi_stm_remove': >> drivers/gpu/drm/stm/dw_mipi_dsi-stm.c:335:21: error: passing argument 1 of 'dw_mipi_dsi_remove' from incompatible pointer type [-Werror=incompatible-pointer-types] dw_mipi_dsi_remove(pdev); ^~~~ In file included from drivers/gpu/drm/stm/dw_mipi_dsi-stm.c:15:0: include/drm/bridge/dw_mipi_dsi.h:37:6: note: expected 'struct dw_mipi_dsi *' but argument is of type 'struct platform_device *' void dw_mipi_dsi_remove(struct dw_mipi_dsi *dsi); ^~~~~~~~~~~~~~~~~~ cc1: some warnings being treated as errors vim +/dw_mipi_dsi_remove +335 drivers/gpu/drm/stm/dw_mipi_dsi-stm.c c1c026db Philippe CORNU 2017-07-17 281 c1c026db Philippe CORNU 2017-07-17 282 static int dw_mipi_dsi_stm_probe(struct platform_device *pdev) c1c026db Philippe CORNU 2017-07-17 283 { c1c026db Philippe CORNU 2017-07-17 284 struct device *dev = &pdev->dev; c1c026db Philippe CORNU 2017-07-17 285 struct dw_mipi_dsi_stm *dsi; c1c026db Philippe CORNU 2017-07-17 286 struct resource *res; c1c026db Philippe CORNU 2017-07-17 287 int ret; c1c026db Philippe CORNU 2017-07-17 288 c1c026db Philippe CORNU 2017-07-17 289 dsi = devm_kzalloc(dev, sizeof(*dsi), GFP_KERNEL); c1c026db Philippe CORNU 2017-07-17 290 if (!dsi) c1c026db Philippe CORNU 2017-07-17 291 return -ENOMEM; c1c026db Philippe CORNU 2017-07-17 292 c1c026db Philippe CORNU 2017-07-17 293 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); c1c026db Philippe CORNU 2017-07-17 294 if (!res) { c1c026db Philippe CORNU 2017-07-17 295 DRM_ERROR("Unable to get resource\n"); c1c026db Philippe CORNU 2017-07-17 296 return -ENODEV; c1c026db Philippe CORNU 2017-07-17 297 } c1c026db Philippe CORNU 2017-07-17 298 c1c026db Philippe CORNU 2017-07-17 299 dsi->base = devm_ioremap_resource(dev, res); c1c026db Philippe CORNU 2017-07-17 300 if (IS_ERR(dsi->base)) { c1c026db Philippe CORNU 2017-07-17 301 DRM_ERROR("Unable to get dsi registers\n"); c1c026db Philippe CORNU 2017-07-17 302 return PTR_ERR(dsi->base); c1c026db Philippe CORNU 2017-07-17 303 } c1c026db Philippe CORNU 2017-07-17 304 c1c026db Philippe CORNU 2017-07-17 305 dsi->pllref_clk = devm_clk_get(dev, "ref"); c1c026db Philippe CORNU 2017-07-17 306 if (IS_ERR(dsi->pllref_clk)) { c1c026db Philippe CORNU 2017-07-17 307 ret = PTR_ERR(dsi->pllref_clk); c1c026db Philippe CORNU 2017-07-17 308 dev_err(dev, "Unable to get pll reference clock: %d\n", ret); c1c026db Philippe CORNU 2017-07-17 309 return ret; c1c026db Philippe CORNU 2017-07-17 310 } c1c026db Philippe CORNU 2017-07-17 311 c1c026db Philippe CORNU 2017-07-17 312 ret = clk_prepare_enable(dsi->pllref_clk); c1c026db Philippe CORNU 2017-07-17 313 if (ret) { c1c026db Philippe CORNU 2017-07-17 314 dev_err(dev, "%s: Failed to enable pllref_clk\n", __func__); c1c026db Philippe CORNU 2017-07-17 315 return ret; c1c026db Philippe CORNU 2017-07-17 316 } c1c026db Philippe CORNU 2017-07-17 317 c1c026db Philippe CORNU 2017-07-17 318 dw_mipi_dsi_stm_plat_data.base = dsi->base; c1c026db Philippe CORNU 2017-07-17 319 dw_mipi_dsi_stm_plat_data.priv_data = dsi; c1c026db Philippe CORNU 2017-07-17 320 c1c026db Philippe CORNU 2017-07-17 @321 ret = dw_mipi_dsi_probe(pdev, &dw_mipi_dsi_stm_plat_data); c1c026db Philippe CORNU 2017-07-17 322 if (ret) { c1c026db Philippe CORNU 2017-07-17 323 DRM_ERROR("Failed to initialize mipi dsi host\n"); c1c026db Philippe CORNU 2017-07-17 324 clk_disable_unprepare(dsi->pllref_clk); c1c026db Philippe CORNU 2017-07-17 325 } c1c026db Philippe CORNU 2017-07-17 326 c1c026db Philippe CORNU 2017-07-17 327 return ret; c1c026db Philippe CORNU 2017-07-17 328 } c1c026db Philippe CORNU 2017-07-17 329 c1c026db Philippe CORNU 2017-07-17 330 static int dw_mipi_dsi_stm_remove(struct platform_device *pdev) c1c026db Philippe CORNU 2017-07-17 331 { c1c026db Philippe CORNU 2017-07-17 332 struct dw_mipi_dsi_stm *dsi = dw_mipi_dsi_stm_plat_data.priv_data; c1c026db Philippe CORNU 2017-07-17 333 c1c026db Philippe CORNU 2017-07-17 334 clk_disable_unprepare(dsi->pllref_clk); c1c026db Philippe CORNU 2017-07-17 @335 dw_mipi_dsi_remove(pdev); c1c026db Philippe CORNU 2017-07-17 336 c1c026db Philippe CORNU 2017-07-17 337 return 0; c1c026db Philippe CORNU 2017-07-17 338 } c1c026db Philippe CORNU 2017-07-17 339 :::::: The code at line 335 was first introduced by commit :::::: c1c026dbc183497379502496316d5e2a22876b7e drm/stm: Add STM32 DSI controller driver :::::: TO: Philippe CORNU <philippe.cornu@st.com> :::::: CC: Benjamin Gaignard <benjamin.gaignard@linaro.org> --- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation
diff --git a/drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.c b/drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.c index d9cca4f..c39c7dc 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.c @@ -922,8 +922,6 @@ static int dw_mipi_dsi_bridge_attach(struct drm_bridge *bridge) dsi->bridge.of_node = pdev->dev.of_node; #endif - dev_set_drvdata(dev, dsi); - return dsi; } @@ -935,23 +933,16 @@ static void __dw_mipi_dsi_remove(struct dw_mipi_dsi *dsi) /* * Probe/remove API, used from platforms based on the DRM bridge API. */ -int dw_mipi_dsi_probe(struct platform_device *pdev, - const struct dw_mipi_dsi_plat_data *plat_data) +struct dw_mipi_dsi * +dw_mipi_dsi_probe(struct platform_device *pdev, + const struct dw_mipi_dsi_plat_data *plat_data) { - struct dw_mipi_dsi *dsi; - - dsi = __dw_mipi_dsi_probe(pdev, plat_data); - if (IS_ERR(dsi)) - return PTR_ERR(dsi); - - return 0; + return __dw_mipi_dsi_probe(pdev, plat_data); } EXPORT_SYMBOL_GPL(dw_mipi_dsi_probe); -void dw_mipi_dsi_remove(struct platform_device *pdev) +void dw_mipi_dsi_remove(struct dw_mipi_dsi *dsi) { - struct dw_mipi_dsi *dsi = platform_get_drvdata(pdev); - mipi_dsi_host_unregister(&dsi->dsi_host); __dw_mipi_dsi_remove(dsi); @@ -961,31 +952,30 @@ void dw_mipi_dsi_remove(struct platform_device *pdev) /* * Bind/unbind API, used from platforms based on the component framework. */ -int dw_mipi_dsi_bind(struct platform_device *pdev, struct drm_encoder *encoder, - const struct dw_mipi_dsi_plat_data *plat_data) +struct dw_mipi_dsi * +dw_mipi_dsi_bind(struct platform_device *pdev, struct drm_encoder *encoder, + const struct dw_mipi_dsi_plat_data *plat_data) { struct dw_mipi_dsi *dsi; int ret; dsi = __dw_mipi_dsi_probe(pdev, plat_data); if (IS_ERR(dsi)) - return PTR_ERR(dsi); + return dsi; ret = drm_bridge_attach(encoder, &dsi->bridge, NULL); if (ret) { - dw_mipi_dsi_remove(pdev); + dw_mipi_dsi_remove(dsi); DRM_ERROR("Failed to initialize bridge with drm\n"); - return ret; + return ERR_PTR(ret); } - return 0; + return dsi; } EXPORT_SYMBOL_GPL(dw_mipi_dsi_bind); -void dw_mipi_dsi_unbind(struct device *dev) +void dw_mipi_dsi_unbind(struct dw_mipi_dsi *dsi) { - struct dw_mipi_dsi *dsi = dev_get_drvdata(dev); - __dw_mipi_dsi_remove(dsi); } EXPORT_SYMBOL_GPL(dw_mipi_dsi_unbind); diff --git a/include/drm/bridge/dw_mipi_dsi.h b/include/drm/bridge/dw_mipi_dsi.h index 9b30fec..d9c6d54 100644 --- a/include/drm/bridge/dw_mipi_dsi.h +++ b/include/drm/bridge/dw_mipi_dsi.h @@ -10,6 +10,8 @@ #ifndef __DW_MIPI_DSI__ #define __DW_MIPI_DSI__ +struct dw_mipi_dsi; + struct dw_mipi_dsi_phy_ops { int (*init)(void *priv_data); int (*get_lane_mbps)(void *priv_data, struct drm_display_mode *mode, @@ -29,11 +31,14 @@ struct dw_mipi_dsi_plat_data { void *priv_data; }; -int dw_mipi_dsi_probe(struct platform_device *pdev, - const struct dw_mipi_dsi_plat_data *plat_data); -void dw_mipi_dsi_remove(struct platform_device *pdev); -int dw_mipi_dsi_bind(struct platform_device *pdev, struct drm_encoder *encoder, - const struct dw_mipi_dsi_plat_data *plat_data); -void dw_mipi_dsi_unbind(struct device *dev); +struct dw_mipi_dsi *dw_mipi_dsi_probe(struct platform_device *pdev, + const struct dw_mipi_dsi_plat_data + *plat_data); +void dw_mipi_dsi_remove(struct dw_mipi_dsi *dsi); +struct dw_mipi_dsi *dw_mipi_dsi_bind(struct platform_device *pdev, + struct drm_encoder *encoder, + const struct dw_mipi_dsi_plat_data + *plat_data); +void dw_mipi_dsi_unbind(struct dw_mipi_dsi *dsi); #endif /* __DW_MIPI_DSI__ */