Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S967801AbeAONwS (ORCPT + 1 other); Mon, 15 Jan 2018 08:52:18 -0500 Received: from mailout1.w1.samsung.com ([210.118.77.11]:53399 "EHLO mailout1.w1.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S966311AbeAONwO (ORCPT ); Mon, 15 Jan 2018 08:52:14 -0500 DKIM-Filter: OpenDKIM Filter v2.11.0 mailout1.w1.samsung.com 20180115135212euoutp0114d48daeb40e4c59b9b945793a31ea6f~KABkbMlHZ1591215912euoutp01f X-AuditID: cbfec7f1-f793a6d00000326b-e3-5a5cb20bfa79 MIME-version: 1.0 Content-type: text/plain; charset="utf-8" Subject: Re: [PATCH v2] drm/bridge/synopsys: dsi: add optional pixel clock To: Philippe Cornu , Archit Taneja , Laurent Pinchart , David Airlie , Philipp Zabel , Benjamin Gaignard , Bhumika Goyal , dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org Cc: Yannick Fertre , Vincent Abriou , Alexandre Torgue , Maxime Coquelin , Gabriel Fernandez , Ludovic Barre , Fabien Dessenne , Mickael Reulier , Brian Norris From: Andrzej Hajda Message-id: Date: Mon, 15 Jan 2018 14:52:08 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.5.0 In-reply-to: <20180112162530.31432-1-philippe.cornu@st.com> Content-transfer-encoding: 8bit Content-language: en-US X-Brightmail-Tracker: H4sIAAAAAAAAA01Sa0hTYRjuO7edrRanZflikbWKqNBU/PF1E4V+HCwikmqtoJYdpqUWOyoa BGpeton3LjZLI8wukJFFVmS6tZo3xPBCNy9J3pLYmt1NTXcW+O95v/d53ud9Hz6WVDlpPzY2 IVEwJOji1IyCevTqd1vA/JrD2qBatxzntTUR+P6nFoQzjF9onGFrZrC7t4DBNV+dNO787mTw q+pahDP7WglsKqqU4Y6nVxhsb4jA5ZN3adxstRG4p7eRwv2ZIzRu7WqgcI4piwlX8WVprym+ Iz+P4J9YemR8mfEyzX/ofsbwtT/6ab4v10HwBZNB/OCvOpIfr1mxR6FVbDsuxMUmC4ZNYUcV MRddN+nT+StSrI4WWRr6BmYkZ4ELBVPPe0rCS6G99x5jRgpWxd1A8O5KBSEV4wjstlz0X2G/ 1YekRhWCy/VFzGxDyS2CXyW9nlEktx5GvhVTEmkIwcRArYe0mIuEyoYicrbhw7kIqJoe8RiS XDYJ94tLPR7MjHzywVvv2DBwuEwzi7Asxa2F8jaPwxJOA+ahp/QslnNbYfR6l9fZH6ydw17s C+ey3nq2AK5NBqXTTTLphh1Q8XyAlPBi+Ox46H1fDiajlZAEuQjcBY0yqTiPYMpV6lVshReO 17RksRCKH10iZ7cDTgnGbJVE4eHl9WovPQLet/70ZpE/k+S0iy5E/pY5mVnmZGaZc4VlzhXX EHUH+QhJYrxeEEMCRV28mJSgD4w+FV+DZr5hy5Tj62PkbNxiQxyL1AuUmqpDWhWtSxZT420I WFLto0yPOqxVKY/rUs8IhlNHDElxgmhDy1hK7avcrs0+qOL0ukThpCCcFgz/uwQr90tDkRnd g42pmjwi5OMkM29d8VTOqO+P6r/77S/1jqv1sSfz3LcnSvQrT+zaPTJ29UKdPN0csDQoO8UR rHAWTtg7Vxnd+zZWHduZs+ya3r+sfbzyTYHR6t6bRK5J3SNeZOqbDmZ8bG4v2dx140+iZny1 RpMeNS/8Tmh0gGb4AHlo7KxZTYkxuuANpEHU/QNikG7gggMAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrAIsWRmVeSWpSXmKPExsVy+t/xy7pcm2KiDD4fVbToPXeSyWLjk9OM Fk0db1ktmg6dYrP4dK+fzWLTx/esFle+vmezOLZuO6NFy/0zTBadE5ewW1zeNYfN4sgBR4t5 f9eyWpw6eIjJ4u69EywWD1pesFqcuXqAxaK9s5XNQchjdsNFFo/Lfb1MHjtn3WX3mN0xk9Xj zrU9bB7bvz1g9bjffZzJo/+vgcfTH3uZPT5vkgvgiuKySUnNySxLLdK3S+DKmPZhOWtBn1zF weOn2RsYv0h0MXJySAiYSBxZcZ8RwhaTuHBvPRuILSSwhFHi8m1nEJtXQFDix+R7LF2MHBzM AuoSU6bkdjFyAZU8Y5TYdOA8M0iNsICXxJIDE5lBEiICn5gkOh/1soA4zAI9zBL9P14zQ7RM YJSY9u02K0gLm4CmxN/NN9kgVthJHP/QyQSygkVAVWLeORaQsKhAhETTzLlg5ZwC1hIvF10F izMLyEscvPIcyhaXaG69yTKBUXAWkmNnIRw7C0nHLCQdCxhZVjGKpJYW56bnFhvqFSfmFpfm pesl5+duYgTG67ZjPzfvYLy0MfgQowAHoxIPb8Sy6Cgh1sSy4srcQ4wSHMxKIryNwTFRQrwp iZVVqUX58UWlOanFhxilOViUxHl796yOFBJITyxJzU5NLUgtgskycXBKNTDK5L0yCvnH1K4d XHt9p+n+gg1c+nkK39zZlp+qc3r/sH7W+cX3O6KPlk5bvcZdy0y0w/151Q92o92el2v2bTc8 Iin9eUm/4MyeS+uEV07b8shP2SbQ2ETt/NxHq+V/b3/79vH12lkG6+0mTrWQXOXlnVduqdd9 QWZa56OZW1P/TJ12PH+5MKeqEktxRqKhFnNRcSIAs/yz99MCAAA= X-CMS-MailID: 20180115135210eucas1p2659fa773986add32e7e3d4e14f0dec35 X-Msg-Generator: CA CMS-TYPE: 201P X-CMS-RootMailID: 20180112162603epcas5p31b20a27fc66410b136b47f7278d04c87 X-RootMTR: 20180112162603epcas5p31b20a27fc66410b136b47f7278d04c87 References: <20180112162530.31432-1-philippe.cornu@st.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Return-Path: On 12.01.2018 17:25, Philippe Cornu wrote: > The pixel clock is optional. When available, it offers a better > preciseness for timing computations and allows to reduce the extra dsi > bandwidth in burst mode (from ~20% to ~10-12%, hw platform dependent). > > Signed-off-by: Philippe Cornu > --- > Changes in v2: Improve px_clk probing in case of ENOENT dt returned value > (thanks to Philipp Zabel & Andrzej Hajda comments) > > drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.c | 26 ++++++++++++++++++++------ > 1 file changed, 20 insertions(+), 6 deletions(-) > > diff --git a/drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.c b/drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.c > index c39c7dce20ed..62fcff881b98 100644 > --- a/drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.c > +++ b/drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.c > @@ -225,6 +225,7 @@ struct dw_mipi_dsi { > void __iomem *base; > > struct clk *pclk; > + struct clk *px_clk; > > unsigned int lane_mbps; /* per lane */ > u32 channel; > @@ -753,24 +754,28 @@ void dw_mipi_dsi_bridge_mode_set(struct drm_bridge *bridge, > struct dw_mipi_dsi *dsi = bridge_to_dsi(bridge); > const struct dw_mipi_dsi_phy_ops *phy_ops = dsi->plat_data->phy_ops; > void *priv_data = dsi->plat_data->priv_data; > + struct drm_display_mode px_clk_mode = *mode; > int ret; > > clk_prepare_enable(dsi->pclk); > > - ret = phy_ops->get_lane_mbps(priv_data, mode, dsi->mode_flags, > + if (dsi->px_clk) > + px_clk_mode.clock = clk_get_rate(dsi->px_clk) / 1000; > + > + ret = phy_ops->get_lane_mbps(priv_data, &px_clk_mode, dsi->mode_flags, > dsi->lanes, dsi->format, &dsi->lane_mbps); > if (ret) > DRM_DEBUG_DRIVER("Phy get_lane_mbps() failed\n"); > > pm_runtime_get_sync(dsi->dev); > dw_mipi_dsi_init(dsi); > - dw_mipi_dsi_dpi_config(dsi, mode); > + dw_mipi_dsi_dpi_config(dsi, &px_clk_mode); > dw_mipi_dsi_packet_handler_config(dsi); > dw_mipi_dsi_video_mode_config(dsi); > - dw_mipi_dsi_video_packet_config(dsi, mode); > + dw_mipi_dsi_video_packet_config(dsi, &px_clk_mode); > dw_mipi_dsi_command_mode_config(dsi); > - dw_mipi_dsi_line_timer_config(dsi, mode); > - dw_mipi_dsi_vertical_timing_config(dsi, mode); > + dw_mipi_dsi_line_timer_config(dsi, &px_clk_mode); > + dw_mipi_dsi_vertical_timing_config(dsi, &px_clk_mode); > > dw_mipi_dsi_dphy_init(dsi); > dw_mipi_dsi_dphy_timing_config(dsi); > @@ -784,7 +789,7 @@ void dw_mipi_dsi_bridge_mode_set(struct drm_bridge *bridge, > > dw_mipi_dsi_dphy_enable(dsi); > > - dw_mipi_dsi_wait_for_two_frames(mode); > + dw_mipi_dsi_wait_for_two_frames(&px_clk_mode); > > /* Switch to cmd mode for panel-bridge pre_enable & panel prepare */ > dw_mipi_dsi_set_mode(dsi, 0); > @@ -878,6 +883,15 @@ __dw_mipi_dsi_probe(struct platform_device *pdev, > return ERR_PTR(ret); > } > > + dsi->px_clk = devm_clk_get(dev, "px_clk"); > + if (PTR_ERR(dsi->px_clk) == -ENOENT) { > + dsi->px_clk = NULL; > + } else if (IS_ERR(dsi->px_clk)) { > + ret = PTR_ERR(dsi->px_clk); > + dev_err(dev, "Unable to get optional px_clk: %d\n", ret); > + dsi->px_clk = NULL; > + } > + As I understand on fail you just log an error and continue? The code could be slightly simplified, for example: dsi->px_clk = devm_clk_get(dev, "px_clk"); if (IS_ERR(dsi->px_clk)) {         ret = PTR_ERR(dsi->px_clk);         if (ret != ENOENT)                 dev_err(dev, "Unable to get optional px_clk: %d\n", ret);         dsi->px_clk = NULL; } With or without this change: Reviewed-by: Andrzej Hajda  -- Regards Andrzej > /* > * Note that the reset was not defined in the initial device tree, so > * we have to be prepared for it not being found.