The rcar_mipi_dsi_clk_enable and rcar_mipi_dsi_clk_disable functions are exported so that they can be operated directly from the DU CRTC. This is not required, and can be handled directly through the bridge. The functionality is split while moving, as the rcar_mipi_dsi_startup() and rcar_mipi_dsi_shutdown() are not handling the clocks and so shouldn't be left in the clock specific functions. Signed-off-by: Kieran Bingham <kieran.bingham@xxxxxxxxxxxxxxxx> --- This patch extends Laurent's series, and would ultimately be squashed into the DSI driver. drivers/gpu/drm/rcar-du/rcar_mipi_dsi.c | 98 ++++++++++++++----------- drivers/gpu/drm/rcar-du/rcar_mipi_dsi.h | 26 ------- 2 files changed, 54 insertions(+), 70 deletions(-) delete mode 100644 drivers/gpu/drm/rcar-du/rcar_mipi_dsi.h diff --git a/drivers/gpu/drm/rcar-du/rcar_mipi_dsi.c b/drivers/gpu/drm/rcar-du/rcar_mipi_dsi.c index 026026bbb367..4c5ef4de0ea7 100644 --- a/drivers/gpu/drm/rcar-du/rcar_mipi_dsi.c +++ b/drivers/gpu/drm/rcar-du/rcar_mipi_dsi.c @@ -5,8 +5,6 @@ * Copyright (C) 2020 Renesas Electronics Corporation */ -#include "rcar_mipi_dsi.h" - #include <linux/clk.h> #include <linux/delay.h> #include <linux/io.h> @@ -451,6 +449,33 @@ static void rcar_mipi_dsi_shutdown(struct rcar_mipi_dsi *dsi) dev_dbg(dsi->dev, "DSI device is shutdown\n"); } +static int rcar_mipi_dsi_clk_enable(struct rcar_mipi_dsi *dsi) +{ + int ret; + + reset_control_deassert(dsi->rstc); + + ret = clk_prepare_enable(dsi->clocks.mod); + if (ret < 0) + return ret; + + ret = clk_prepare_enable(dsi->clocks.dsi); + if (ret < 0) { + clk_disable_unprepare(dsi->clocks.mod); + return ret; + } + + return 0; +} + +static void rcar_mipi_dsi_clk_disable(struct rcar_mipi_dsi *dsi) +{ + clk_disable_unprepare(dsi->clocks.dsi); + clk_disable_unprepare(dsi->clocks.mod); + + reset_control_assert(dsi->rstc); +} + static int rcar_mipi_dsi_start_hs_clock(struct rcar_mipi_dsi *dsi) { /* @@ -542,13 +567,38 @@ static void rcar_mipi_dsi_enable(struct drm_bridge *bridge) struct rcar_mipi_dsi *dsi = bridge_to_rcar_mipi_dsi(bridge); int ret; + ret = rcar_mipi_dsi_clk_enable(dsi); + if (ret < 0) { + dev_err(dsi->dev, "failed to enable DSI clocks\n"); + return; + } + + ret = rcar_mipi_dsi_startup(dsi); + if (ret < 0) + goto err_dsi_startup; + rcar_mipi_dsi_set_display_timing(dsi); ret = rcar_mipi_dsi_start_hs_clock(dsi); if (ret < 0) - return; + goto err_dsi_start_hs; rcar_mipi_dsi_start_video(dsi); + + return; + +err_dsi_start_hs: + rcar_mipi_dsi_shutdown(dsi); +err_dsi_startup: + rcar_mipi_dsi_clk_disable(dsi); +} + +static void rcar_mipi_dsi_disable(struct drm_bridge *bridge) +{ + struct rcar_mipi_dsi *dsi = bridge_to_rcar_mipi_dsi(bridge); + + rcar_mipi_dsi_shutdown(dsi); + rcar_mipi_dsi_clk_disable(dsi); } static enum drm_mode_status @@ -566,6 +616,7 @@ static const struct drm_bridge_funcs rcar_mipi_dsi_bridge_ops = { .attach = rcar_mipi_dsi_attach, .mode_set = rcar_mipi_dsi_mode_set, .enable = rcar_mipi_dsi_enable, + .disable = rcar_mipi_dsi_disable, .mode_valid = rcar_mipi_dsi_bridge_mode_valid, }; @@ -573,47 +624,6 @@ static const struct drm_bridge_funcs rcar_mipi_dsi_bridge_ops = { * Clock Setting */ -int rcar_mipi_dsi_clk_enable(struct drm_bridge *bridge) -{ - struct rcar_mipi_dsi *dsi = bridge_to_rcar_mipi_dsi(bridge); - int ret; - - reset_control_deassert(dsi->rstc); - - ret = clk_prepare_enable(dsi->clocks.mod); - if (ret < 0) - return ret; - - ret = clk_prepare_enable(dsi->clocks.dsi); - if (ret < 0) - goto err_clock_mod; - - ret = rcar_mipi_dsi_startup(dsi); - if (ret < 0) - goto err_clock_dsi; - - return 0; - -err_clock_dsi: - clk_disable_unprepare(dsi->clocks.dsi); -err_clock_mod: - clk_disable_unprepare(dsi->clocks.mod); - return ret; -} -EXPORT_SYMBOL_GPL(rcar_mipi_dsi_clk_enable); - -void rcar_mipi_dsi_clk_disable(struct drm_bridge *bridge) -{ - struct rcar_mipi_dsi *dsi = bridge_to_rcar_mipi_dsi(bridge); - - rcar_mipi_dsi_shutdown(dsi); - - clk_disable_unprepare(dsi->clocks.dsi); - clk_disable_unprepare(dsi->clocks.mod); - - reset_control_assert(dsi->rstc); -} -EXPORT_SYMBOL_GPL(rcar_mipi_dsi_clk_disable); /* ----------------------------------------------------------------------------- * Host setting diff --git a/drivers/gpu/drm/rcar-du/rcar_mipi_dsi.h b/drivers/gpu/drm/rcar-du/rcar_mipi_dsi.h deleted file mode 100644 index a937ab7ddcd4..000000000000 --- a/drivers/gpu/drm/rcar-du/rcar_mipi_dsi.h +++ /dev/null @@ -1,26 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -/* - * rcar_mipi_dsi.h -- R-Car MIPI_DSI Encoder - * - * Copyright (C) 2020 Renesas Electronics Corporation - */ - -#ifndef __RCAR_MIPI_DSI_H__ -#define __RCAR_MIPI_DSI_H__ - -struct drm_bridge; - -#if IS_ENABLED(CONFIG_DRM_RCAR_MIPI_DSI) -int rcar_mipi_dsi_clk_enable(struct drm_bridge *bridge); -void rcar_mipi_dsi_clk_disable(struct drm_bridge *bridge); - -#else -static inline int rcar_mipi_dsi_clk_enable(struct drm_bridge *bridge) -{ - return -ENOSYS; -} -static inline void rcar_mipi_dsi_clk_disable(struct drm_bridge *bridge) { } - -#endif /* CONFIG_DRM_RCAR_MIPI_DSI */ - -#endif /* __RCAR_MIPI_DSI_H__ */ -- 2.30.2