drm/msm: Set CLK_IGNORE_UNUSED flag for PLL clocks
authorArchit Taneja <architt@codeaurora.org>
Thu, 27 Oct 2016 06:27:15 +0000 (11:57 +0530)
committerRob Clark <robdclark@gmail.com>
Wed, 2 Nov 2016 14:48:09 +0000 (10:48 -0400)
The DSI/HDMI PLLs in MSM require resources like interface clocks, power
domains to be enabled before we can access their registers.

The clock framework doesn't have a mechanism at the moment where we can
tie such resources to a clock, so we make sure that the KMS driver enables
these resources whenever a PLL is expected to be in use.

One place where we can't ensure the resource dependencies are met is when
the clock framework tries to disable unused clocks. The KMS driver doesn't
know when the clock framework calls the is_enabled clk_op, and hence can't
enable interface clocks/power domains beforehand.

We set the CLK_IGNORE_UNUSED flag for PLL clocks for now. This needs to be
revisited, since bootloaders can enable display, and we would want to
disable the PLL clocks if there isn't a display driver using them.

Cc: Stephen Boyd <sboyd@codeaurora.org>
Signed-off-by: Archit Taneja <architt@codeaurora.org>
Acked-by: Stephen Boyd <sboyd@codeaurora.org>
Signed-off-by: Rob Clark <robdclark@gmail.com>
drivers/gpu/drm/msm/dsi/pll/dsi_pll_28nm.c
drivers/gpu/drm/msm/dsi/pll/dsi_pll_28nm_8960.c
drivers/gpu/drm/msm/hdmi/hdmi_phy_8996.c
drivers/gpu/drm/msm/hdmi/hdmi_pll_8960.c

index 598fdaff0a41a051fa165d79e386aab7a7f9bd84..26e3a01a99c2b71dde9fed5bd548ee17b61e2df4 100644 (file)
@@ -521,6 +521,7 @@ static int pll_28nm_register(struct dsi_pll_28nm *pll_28nm)
                .parent_names = (const char *[]){ "xo" },
                .num_parents = 1,
                .name = vco_name,
+               .flags = CLK_IGNORE_UNUSED,
                .ops = &clk_ops_dsi_pll_28nm_vco,
        };
        struct device *dev = &pll_28nm->pdev->dev;
index 38c90e1eb00286b4ce0bb9dd49e30115f60869bc..49008451085b86ccb84ee3760c406554db51fd49 100644 (file)
@@ -412,6 +412,7 @@ static int pll_28nm_register(struct dsi_pll_28nm *pll_28nm)
        struct clk_init_data vco_init = {
                .parent_names = (const char *[]){ "pxo" },
                .num_parents = 1,
+               .flags = CLK_IGNORE_UNUSED,
                .ops = &clk_ops_dsi_pll_28nm_vco,
        };
        struct device *dev = &pll_28nm->pdev->dev;
index aa94a553794f50eed7d5c49dd01d594c96113baa..143eab46ba687b0b1a89969598736bc75e750809 100644 (file)
@@ -702,6 +702,7 @@ static struct clk_init_data pll_init = {
        .ops = &hdmi_8996_pll_ops,
        .parent_names = hdmi_pll_parents,
        .num_parents = ARRAY_SIZE(hdmi_pll_parents),
+       .flags = CLK_IGNORE_UNUSED,
 };
 
 int msm_hdmi_pll_8996_init(struct platform_device *pdev)
index 92da69aa6187e64fa6cbb515a4698bf32f57db54..99590758c68b7cf8e296928db1bab5ce5b2df4c4 100644 (file)
@@ -424,6 +424,7 @@ static struct clk_init_data pll_init = {
        .ops = &hdmi_pll_ops,
        .parent_names = hdmi_pll_parents,
        .num_parents = ARRAY_SIZE(hdmi_pll_parents),
+       .flags = CLK_IGNORE_UNUSED,
 };
 
 int msm_hdmi_pll_8960_init(struct platform_device *pdev)