From 8f17489c88f6d028664b4e9108af21f2381ad247 Mon Sep 17 00:00:00 2001 From: xuhuicong Date: Wed, 15 Jun 2016 14:09:42 +0800 Subject: [PATCH] video: rockchip: hdmi: set hdcp hclk to modify standby crash Change-Id: I032f85abe08932a2b14dcc71e732bd334825fed2 Signed-off-by: xuhuicong --- .../boot/dts/rockchip/rk3399-android.dtsi | 8 +++--- .../hdmi/rockchip-hdmiv2/rockchip_hdmiv2.c | 25 ++++++++++++++++++- .../hdmi/rockchip-hdmiv2/rockchip_hdmiv2.h | 2 ++ 3 files changed, 31 insertions(+), 4 deletions(-) diff --git a/arch/arm64/boot/dts/rockchip/rk3399-android.dtsi b/arch/arm64/boot/dts/rockchip/rk3399-android.dtsi index 59c0907b10f9..71b29ba60a75 100644 --- a/arch/arm64/boot/dts/rockchip/rk3399-android.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3399-android.dtsi @@ -288,13 +288,15 @@ interrupts = , ; clocks = <&cru PCLK_HDMI_CTRL>, - <&cru SCLK_HDMI_SFR>, + <&cru HCLK_HDCP>, <&cru SCLK_HDMI_CEC>, - <&cru PLL_VPLL>; + <&cru PLL_VPLL>, + <&cru SCLK_HDMI_SFR>; clock-names = "pclk_hdmi", "hdcp_clk_hdmi", "cec_clk_hdmi", - "dclk_hdmi_phy"; + "dclk_hdmi_phy", + "sclk_hdmi_sfr"; resets = <&cru SRST_HDMI_CTRL>; reset-names = "hdmi"; pinctrl-names = "default", "gpio"; diff --git a/drivers/video/rockchip/hdmi/rockchip-hdmiv2/rockchip_hdmiv2.c b/drivers/video/rockchip/hdmi/rockchip-hdmiv2/rockchip_hdmiv2.c index c5a757b75fb2..44150376b927 100644 --- a/drivers/video/rockchip/hdmi/rockchip-hdmiv2/rockchip_hdmiv2.c +++ b/drivers/video/rockchip/hdmi/rockchip-hdmiv2/rockchip_hdmiv2.c @@ -270,6 +270,21 @@ static int rockchip_hdmiv2_clk_enable(struct hdmi_dev *hdmi_dev) clk_prepare_enable(hdmi_dev->cec_clk); hdmi_dev->clk_on |= HDMI_CECCLK_ON; } + + if ((hdmi_dev->clk_on & HDMI_SFRCLK_ON) == 0) { + if (!hdmi_dev->sfr_clk) { + hdmi_dev->sfr_clk = + devm_clk_get(hdmi_dev->dev, "sclk_hdmi_sfr"); + if (IS_ERR(hdmi_dev->sfr_clk)) { + dev_err(hdmi_dev->dev, + "Unable to get hdmi sfr_clk\n"); + return -1; + } + } + clk_prepare_enable(hdmi_dev->sfr_clk); + hdmi_dev->clk_on |= HDMI_SFRCLK_ON; + } + return 0; } @@ -300,6 +315,14 @@ static int rockchip_hdmiv2_clk_disable(struct hdmi_dev *hdmi_dev) clk_disable_unprepare(hdmi_dev->pclk_phy); hdmi_dev->clk_on &= ~HDMI_EXT_PHY_CLK_ON; } + + if ((hdmi_dev->clk_on & HDMI_SFRCLK_ON) && + (hdmi_dev->sfr_clk)) { + clk_disable_unprepare(hdmi_dev->sfr_clk); + hdmi_dev->clk_on &= ~HDMI_SFRCLK_ON; + } + + return 0; } @@ -540,7 +563,7 @@ static int rockchip_hdmiv2_probe(struct platform_device *pdev) goto failed; } pm_runtime_enable(hdmi_dev->dev); - /*enable pd and pclk and hdcp_clk*/ + /*enable pd and clk*/ if (rockchip_hdmiv2_clk_enable(hdmi_dev) < 0) { dev_err(&pdev->dev, "failed to enable hdmi clk\n"); ret = -ENXIO; diff --git a/drivers/video/rockchip/hdmi/rockchip-hdmiv2/rockchip_hdmiv2.h b/drivers/video/rockchip/hdmi/rockchip-hdmiv2/rockchip_hdmiv2.h index 8f97c4c6f13f..885527755de8 100644 --- a/drivers/video/rockchip/hdmi/rockchip-hdmiv2/rockchip_hdmiv2.h +++ b/drivers/video/rockchip/hdmi/rockchip-hdmiv2/rockchip_hdmiv2.h @@ -20,6 +20,7 @@ #define HDMI_HDCPCLK_ON BIT(2) #define HDMI_CECCLK_ON BIT(3) #define HDMI_EXT_PHY_CLK_ON BIT(4) +#define HDMI_SFRCLK_ON BIT(5) struct hdmi_dev_phy_para { u32 maxfreq; @@ -43,6 +44,7 @@ struct hdmi_dev { struct clk *hdcp_clk; struct clk *cec_clk; struct clk *pclk_phy; + struct clk *sfr_clk; struct hdmi *hdmi; struct device *dev; struct dentry *debugfs_dir; -- 2.34.1