Loading drivers/gpu/drm/msm/dp/dp_catalog.c +3 −0 Original line number Diff line number Diff line Loading @@ -80,6 +80,7 @@ struct dp_catalog_io { struct dp_io_data *dp_pll; struct dp_io_data *usb3_dp_com; struct dp_io_data *hdcp_physical; struct dp_io_data *dp_p1; }; /* audio related catalog functions */ Loading Loading @@ -1688,6 +1689,7 @@ static void dp_catalog_get_io_buf(struct dp_catalog_private *catalog) dp_catalog_fill_io_buf(usb3_dp_com); dp_catalog_fill_io_buf(dp_mmss_cc); dp_catalog_fill_io_buf(hdcp_physical); dp_catalog_fill_io_buf(dp_p1); } static void dp_catalog_get_io(struct dp_catalog_private *catalog) Loading @@ -1705,6 +1707,7 @@ static void dp_catalog_get_io(struct dp_catalog_private *catalog) dp_catalog_fill_io(usb3_dp_com); dp_catalog_fill_io(dp_mmss_cc); dp_catalog_fill_io(hdcp_physical); dp_catalog_fill_io(dp_p1); } static void dp_catalog_set_exe_mode(struct dp_catalog *dp_catalog, char *mode) Loading drivers/gpu/drm/msm/dp/dp_catalog_v420.c +1 −0 Original line number Diff line number Diff line Loading @@ -53,6 +53,7 @@ struct dp_catalog_io { struct dp_io_data *dp_pll; struct dp_io_data *usb3_dp_com; struct dp_io_data *hdcp_physical; struct dp_io_data *dp_p1; }; struct dp_catalog_private_v420 { Loading drivers/gpu/drm/msm/dp/dp_parser.c +74 −3 Original line number Diff line number Diff line Loading @@ -426,12 +426,17 @@ static int dp_parser_init_clk_data(struct dp_parser *parser) { int num_clk = 0, i = 0, rc = 0; int core_clk_count = 0, ctrl_clk_count = 0; int strm0_clk_count = 0, strm1_clk_count = 0; const char *core_clk = "core"; const char *ctrl_clk = "ctrl"; const char *strm0_clk = "strm0"; const char *strm1_clk = "strm1"; const char *clk_name; struct device *dev = &parser->pdev->dev; struct dss_module_power *core_power = &parser->mp[DP_CORE_PM]; struct dss_module_power *ctrl_power = &parser->mp[DP_CTRL_PM]; struct dss_module_power *strm0_power = &parser->mp[DP_STREAM0_PM]; struct dss_module_power *strm1_power = &parser->mp[DP_STREAM1_PM]; num_clk = of_property_count_strings(dev->of_node, "clock-names"); if (num_clk <= 0) { Loading @@ -449,6 +454,12 @@ static int dp_parser_init_clk_data(struct dp_parser *parser) if (dp_parser_check_prefix(ctrl_clk, clk_name)) ctrl_clk_count++; if (dp_parser_check_prefix(strm0_clk, clk_name)) strm0_clk_count++; if (dp_parser_check_prefix(strm1_clk, clk_name)) strm1_clk_count++; } /* Initialize the CORE power module */ Loading Loading @@ -484,8 +495,42 @@ static int dp_parser_init_clk_data(struct dp_parser *parser) goto ctrl_clock_error; } /* Initialize the STREAM0 power module */ if (strm0_clk_count <= 0) { pr_debug("no strm0 clocks are defined\n"); } else { strm0_power->num_clk = strm0_clk_count; strm0_power->clk_config = devm_kzalloc(dev, sizeof(struct dss_clk) * strm0_power->num_clk, GFP_KERNEL); if (!strm0_power->clk_config) { strm0_power->num_clk = 0; rc = -EINVAL; goto strm0_clock_error; } } /* Initialize the STREAM1 power module */ if (strm1_clk_count <= 0) { pr_debug("no strm1 clocks are defined\n"); } else { strm1_power->num_clk = strm1_clk_count; strm1_power->clk_config = devm_kzalloc(dev, sizeof(struct dss_clk) * strm1_power->num_clk, GFP_KERNEL); if (!strm1_power->clk_config) { strm1_power->num_clk = 0; rc = -EINVAL; goto strm1_clock_error; } } return rc; strm1_clock_error: dp_parser_put_clk_data(dev, strm0_power); strm0_clock_error: dp_parser_put_clk_data(dev, ctrl_power); ctrl_clock_error: dp_parser_put_clk_data(dev, core_power); exit: Loading @@ -498,15 +543,23 @@ static int dp_parser_clock(struct dp_parser *parser) int num_clk = 0; int core_clk_index = 0, ctrl_clk_index = 0; int core_clk_count = 0, ctrl_clk_count = 0; int strm0_clk_index = 0, strm1_clk_index = 0; int strm0_clk_count = 0, strm1_clk_count = 0; const char *clk_name; const char *core_clk = "core"; const char *ctrl_clk = "ctrl"; const char *strm0_clk = "strm0"; const char *strm1_clk = "strm1"; struct device *dev = &parser->pdev->dev; struct dss_module_power *core_power = &parser->mp[DP_CORE_PM]; struct dss_module_power *ctrl_power = &parser->mp[DP_CTRL_PM]; struct dss_module_power *core_power; struct dss_module_power *ctrl_power; struct dss_module_power *strm0_power; struct dss_module_power *strm1_power; core_power = &parser->mp[DP_CORE_PM]; ctrl_power = &parser->mp[DP_CTRL_PM]; strm0_power = &parser->mp[DP_STREAM0_PM]; strm1_power = &parser->mp[DP_STREAM1_PM]; rc = dp_parser_init_clk_data(parser); if (rc) { Loading @@ -517,8 +570,10 @@ static int dp_parser_clock(struct dp_parser *parser) core_clk_count = core_power->num_clk; ctrl_clk_count = ctrl_power->num_clk; strm0_clk_count = strm0_power->num_clk; strm1_clk_count = strm1_power->num_clk; num_clk = core_clk_count + ctrl_clk_count; num_clk = of_property_count_strings(dev->of_node, "clock-names"); for (i = 0; i < num_clk; i++) { of_property_read_string_index(dev->of_node, "clock-names", Loading @@ -543,6 +598,22 @@ static int dp_parser_clock(struct dp_parser *parser) clk->type = DSS_CLK_PCLK; else clk->type = DSS_CLK_AHB; } else if (dp_parser_check_prefix(strm0_clk, clk_name) && strm0_clk_index < strm0_clk_count) { struct dss_clk *clk = &strm0_power->clk_config[strm0_clk_index]; strlcpy(clk->clk_name, clk_name, sizeof(clk->clk_name)); strm0_clk_index++; clk->type = DSS_CLK_PCLK; } else if (dp_parser_check_prefix(strm1_clk, clk_name) && strm1_clk_index < strm1_clk_count) { struct dss_clk *clk = &strm1_power->clk_config[strm1_clk_index]; strlcpy(clk->clk_name, clk_name, sizeof(clk->clk_name)); strm1_clk_index++; clk->type = DSS_CLK_PCLK; } } Loading drivers/gpu/drm/msm/dp/dp_parser.h +4 −0 Original line number Diff line number Diff line Loading @@ -25,6 +25,8 @@ enum dp_pm_type { DP_CORE_PM, DP_CTRL_PM, DP_PHY_PM, DP_STREAM0_PM, DP_STREAM1_PM, DP_MAX_PM }; Loading @@ -34,6 +36,8 @@ static inline const char *dp_parser_pm_name(enum dp_pm_type module) case DP_CORE_PM: return "DP_CORE_PM"; case DP_CTRL_PM: return "DP_CTRL_PM"; case DP_PHY_PM: return "DP_PHY_PM"; case DP_STREAM0_PM: return "DP_STREAM0_PM"; case DP_STREAM1_PM: return "DP_STREAM1_PM"; default: return "???"; } } Loading drivers/gpu/drm/msm/dp/dp_power.c +70 −6 Original line number Diff line number Diff line /* * Copyright (c) 2012-2017, The Linux Foundation. All rights reserved. * Copyright (c) 2012-2018, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and Loading @@ -24,6 +24,8 @@ struct dp_power_private { struct platform_device *pdev; struct clk *pixel_clk_rcg; struct clk *pixel_parent; struct clk *pixel1_clk_rcg; struct clk *pixel1_parent; struct dp_power dp_power; struct sde_power_client *dp_core_client; Loading @@ -31,6 +33,8 @@ struct dp_power_private { bool core_clks_on; bool link_clks_on; bool strm0_clks_on; bool strm1_clks_on; }; static int dp_power_regulator_init(struct dp_power_private *power) Loading Loading @@ -142,11 +146,13 @@ static int dp_power_pinctrl_set(struct dp_power_private *power, bool active) static int dp_power_clk_init(struct dp_power_private *power, bool enable) { int rc = 0; struct dss_module_power *core, *ctrl; struct dss_module_power *core, *ctrl, *strm0, *strm1; struct device *dev; core = &power->parser->mp[DP_CORE_PM]; ctrl = &power->parser->mp[DP_CTRL_PM]; strm0 = &power->parser->mp[DP_STREAM0_PM]; strm1 = &power->parser->mp[DP_STREAM1_PM]; dev = &power->pdev->dev; Loading @@ -171,6 +177,20 @@ static int dp_power_clk_init(struct dp_power_private *power, bool enable) goto ctrl_get_error; } rc = msm_dss_get_clk(dev, strm0->clk_config, strm0->num_clk); if (rc) { pr_err("failed to get %s clk. err=%d\n", dp_parser_pm_name(DP_STREAM0_PM), rc); goto strm0_get_error; } rc = msm_dss_get_clk(dev, strm1->clk_config, strm1->num_clk); if (rc) { pr_err("failed to get %s clk. err=%d\n", dp_parser_pm_name(DP_STREAM1_PM), rc); goto strm1_get_error; } power->pixel_clk_rcg = devm_clk_get(dev, "pixel_clk_rcg"); if (IS_ERR(power->pixel_clk_rcg)) { pr_debug("Unable to get DP pixel clk RCG\n"); Loading @@ -182,6 +202,18 @@ static int dp_power_clk_init(struct dp_power_private *power, bool enable) pr_debug("Unable to get DP pixel RCG parent\n"); power->pixel_parent = NULL; } power->pixel1_clk_rcg = devm_clk_get(dev, "pixel1_clk_rcg"); if (IS_ERR(power->pixel1_clk_rcg)) { pr_debug("Unable to get DP pixel1 clk RCG\n"); power->pixel1_clk_rcg = NULL; } power->pixel1_parent = devm_clk_get(dev, "pixel1_parent"); if (IS_ERR(power->pixel1_parent)) { pr_debug("Unable to get DP pixel1 RCG parent\n"); power->pixel1_parent = NULL; } } else { if (power->pixel_parent) devm_clk_put(dev, power->pixel_parent); Loading @@ -189,12 +221,24 @@ static int dp_power_clk_init(struct dp_power_private *power, bool enable) if (power->pixel_clk_rcg) devm_clk_put(dev, power->pixel_clk_rcg); if (power->pixel1_parent) devm_clk_put(dev, power->pixel1_parent); if (power->pixel1_clk_rcg) devm_clk_put(dev, power->pixel1_clk_rcg); msm_dss_put_clk(ctrl->clk_config, ctrl->num_clk); msm_dss_put_clk(core->clk_config, core->num_clk); msm_dss_put_clk(strm0->clk_config, strm0->num_clk); msm_dss_put_clk(strm1->clk_config, strm1->num_clk); } return rc; strm1_get_error: msm_dss_put_clk(strm0->clk_config, strm0->num_clk); strm0_get_error: msm_dss_put_clk(ctrl->clk_config, ctrl->num_clk); ctrl_get_error: msm_dss_put_clk(core->clk_config, core->num_clk); exit: Loading Loading @@ -255,7 +299,9 @@ static int dp_power_clk_enable(struct dp_power *dp_power, mp = &power->parser->mp[pm_type]; if ((pm_type != DP_CORE_PM) && (pm_type != DP_CTRL_PM)) { if ((pm_type != DP_CORE_PM) && (pm_type != DP_CTRL_PM) && (pm_type != DP_STREAM0_PM) && (pm_type != DP_STREAM1_PM)) { pr_err("unsupported power module: %s\n", dp_parser_pm_name(pm_type)); return -EINVAL; Loading @@ -274,6 +320,18 @@ static int dp_power_clk_enable(struct dp_power *dp_power, return 0; } if ((pm_type == DP_STREAM0_PM) && (power->strm0_clks_on)) { pr_debug("strm0 clks already enabled\n"); return 0; } if ((pm_type == DP_STREAM1_PM) && (power->strm1_clks_on)) { pr_debug("strm1 clks already enabled\n"); return 0; } if ((pm_type == DP_CTRL_PM) && (!power->core_clks_on)) { pr_debug("Need to enable core clks before link clks\n"); Loading @@ -298,15 +356,21 @@ static int dp_power_clk_enable(struct dp_power *dp_power, if (pm_type == DP_CORE_PM) power->core_clks_on = enable; else else if (pm_type == DP_CTRL_PM) power->link_clks_on = enable; else if (pm_type == DP_STREAM0_PM) power->strm0_clks_on = enable; else if (pm_type == DP_STREAM1_PM) power->strm1_clks_on = enable; pr_debug("%s clocks for %s\n", enable ? "enable" : "disable", dp_parser_pm_name(pm_type)); pr_debug("link_clks:%s core_clks:%s\n", pr_debug("link_clks:%s core_clks:%s strm0_clks:%s strm1_clks:%s\n", power->link_clks_on ? "on" : "off", power->core_clks_on ? "on" : "off"); power->core_clks_on ? "on" : "off", power->strm0_clks_on ? "on" : "off", power->strm1_clks_on ? "on" : "off"); error: return rc; } Loading Loading
drivers/gpu/drm/msm/dp/dp_catalog.c +3 −0 Original line number Diff line number Diff line Loading @@ -80,6 +80,7 @@ struct dp_catalog_io { struct dp_io_data *dp_pll; struct dp_io_data *usb3_dp_com; struct dp_io_data *hdcp_physical; struct dp_io_data *dp_p1; }; /* audio related catalog functions */ Loading Loading @@ -1688,6 +1689,7 @@ static void dp_catalog_get_io_buf(struct dp_catalog_private *catalog) dp_catalog_fill_io_buf(usb3_dp_com); dp_catalog_fill_io_buf(dp_mmss_cc); dp_catalog_fill_io_buf(hdcp_physical); dp_catalog_fill_io_buf(dp_p1); } static void dp_catalog_get_io(struct dp_catalog_private *catalog) Loading @@ -1705,6 +1707,7 @@ static void dp_catalog_get_io(struct dp_catalog_private *catalog) dp_catalog_fill_io(usb3_dp_com); dp_catalog_fill_io(dp_mmss_cc); dp_catalog_fill_io(hdcp_physical); dp_catalog_fill_io(dp_p1); } static void dp_catalog_set_exe_mode(struct dp_catalog *dp_catalog, char *mode) Loading
drivers/gpu/drm/msm/dp/dp_catalog_v420.c +1 −0 Original line number Diff line number Diff line Loading @@ -53,6 +53,7 @@ struct dp_catalog_io { struct dp_io_data *dp_pll; struct dp_io_data *usb3_dp_com; struct dp_io_data *hdcp_physical; struct dp_io_data *dp_p1; }; struct dp_catalog_private_v420 { Loading
drivers/gpu/drm/msm/dp/dp_parser.c +74 −3 Original line number Diff line number Diff line Loading @@ -426,12 +426,17 @@ static int dp_parser_init_clk_data(struct dp_parser *parser) { int num_clk = 0, i = 0, rc = 0; int core_clk_count = 0, ctrl_clk_count = 0; int strm0_clk_count = 0, strm1_clk_count = 0; const char *core_clk = "core"; const char *ctrl_clk = "ctrl"; const char *strm0_clk = "strm0"; const char *strm1_clk = "strm1"; const char *clk_name; struct device *dev = &parser->pdev->dev; struct dss_module_power *core_power = &parser->mp[DP_CORE_PM]; struct dss_module_power *ctrl_power = &parser->mp[DP_CTRL_PM]; struct dss_module_power *strm0_power = &parser->mp[DP_STREAM0_PM]; struct dss_module_power *strm1_power = &parser->mp[DP_STREAM1_PM]; num_clk = of_property_count_strings(dev->of_node, "clock-names"); if (num_clk <= 0) { Loading @@ -449,6 +454,12 @@ static int dp_parser_init_clk_data(struct dp_parser *parser) if (dp_parser_check_prefix(ctrl_clk, clk_name)) ctrl_clk_count++; if (dp_parser_check_prefix(strm0_clk, clk_name)) strm0_clk_count++; if (dp_parser_check_prefix(strm1_clk, clk_name)) strm1_clk_count++; } /* Initialize the CORE power module */ Loading Loading @@ -484,8 +495,42 @@ static int dp_parser_init_clk_data(struct dp_parser *parser) goto ctrl_clock_error; } /* Initialize the STREAM0 power module */ if (strm0_clk_count <= 0) { pr_debug("no strm0 clocks are defined\n"); } else { strm0_power->num_clk = strm0_clk_count; strm0_power->clk_config = devm_kzalloc(dev, sizeof(struct dss_clk) * strm0_power->num_clk, GFP_KERNEL); if (!strm0_power->clk_config) { strm0_power->num_clk = 0; rc = -EINVAL; goto strm0_clock_error; } } /* Initialize the STREAM1 power module */ if (strm1_clk_count <= 0) { pr_debug("no strm1 clocks are defined\n"); } else { strm1_power->num_clk = strm1_clk_count; strm1_power->clk_config = devm_kzalloc(dev, sizeof(struct dss_clk) * strm1_power->num_clk, GFP_KERNEL); if (!strm1_power->clk_config) { strm1_power->num_clk = 0; rc = -EINVAL; goto strm1_clock_error; } } return rc; strm1_clock_error: dp_parser_put_clk_data(dev, strm0_power); strm0_clock_error: dp_parser_put_clk_data(dev, ctrl_power); ctrl_clock_error: dp_parser_put_clk_data(dev, core_power); exit: Loading @@ -498,15 +543,23 @@ static int dp_parser_clock(struct dp_parser *parser) int num_clk = 0; int core_clk_index = 0, ctrl_clk_index = 0; int core_clk_count = 0, ctrl_clk_count = 0; int strm0_clk_index = 0, strm1_clk_index = 0; int strm0_clk_count = 0, strm1_clk_count = 0; const char *clk_name; const char *core_clk = "core"; const char *ctrl_clk = "ctrl"; const char *strm0_clk = "strm0"; const char *strm1_clk = "strm1"; struct device *dev = &parser->pdev->dev; struct dss_module_power *core_power = &parser->mp[DP_CORE_PM]; struct dss_module_power *ctrl_power = &parser->mp[DP_CTRL_PM]; struct dss_module_power *core_power; struct dss_module_power *ctrl_power; struct dss_module_power *strm0_power; struct dss_module_power *strm1_power; core_power = &parser->mp[DP_CORE_PM]; ctrl_power = &parser->mp[DP_CTRL_PM]; strm0_power = &parser->mp[DP_STREAM0_PM]; strm1_power = &parser->mp[DP_STREAM1_PM]; rc = dp_parser_init_clk_data(parser); if (rc) { Loading @@ -517,8 +570,10 @@ static int dp_parser_clock(struct dp_parser *parser) core_clk_count = core_power->num_clk; ctrl_clk_count = ctrl_power->num_clk; strm0_clk_count = strm0_power->num_clk; strm1_clk_count = strm1_power->num_clk; num_clk = core_clk_count + ctrl_clk_count; num_clk = of_property_count_strings(dev->of_node, "clock-names"); for (i = 0; i < num_clk; i++) { of_property_read_string_index(dev->of_node, "clock-names", Loading @@ -543,6 +598,22 @@ static int dp_parser_clock(struct dp_parser *parser) clk->type = DSS_CLK_PCLK; else clk->type = DSS_CLK_AHB; } else if (dp_parser_check_prefix(strm0_clk, clk_name) && strm0_clk_index < strm0_clk_count) { struct dss_clk *clk = &strm0_power->clk_config[strm0_clk_index]; strlcpy(clk->clk_name, clk_name, sizeof(clk->clk_name)); strm0_clk_index++; clk->type = DSS_CLK_PCLK; } else if (dp_parser_check_prefix(strm1_clk, clk_name) && strm1_clk_index < strm1_clk_count) { struct dss_clk *clk = &strm1_power->clk_config[strm1_clk_index]; strlcpy(clk->clk_name, clk_name, sizeof(clk->clk_name)); strm1_clk_index++; clk->type = DSS_CLK_PCLK; } } Loading
drivers/gpu/drm/msm/dp/dp_parser.h +4 −0 Original line number Diff line number Diff line Loading @@ -25,6 +25,8 @@ enum dp_pm_type { DP_CORE_PM, DP_CTRL_PM, DP_PHY_PM, DP_STREAM0_PM, DP_STREAM1_PM, DP_MAX_PM }; Loading @@ -34,6 +36,8 @@ static inline const char *dp_parser_pm_name(enum dp_pm_type module) case DP_CORE_PM: return "DP_CORE_PM"; case DP_CTRL_PM: return "DP_CTRL_PM"; case DP_PHY_PM: return "DP_PHY_PM"; case DP_STREAM0_PM: return "DP_STREAM0_PM"; case DP_STREAM1_PM: return "DP_STREAM1_PM"; default: return "???"; } } Loading
drivers/gpu/drm/msm/dp/dp_power.c +70 −6 Original line number Diff line number Diff line /* * Copyright (c) 2012-2017, The Linux Foundation. All rights reserved. * Copyright (c) 2012-2018, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and Loading @@ -24,6 +24,8 @@ struct dp_power_private { struct platform_device *pdev; struct clk *pixel_clk_rcg; struct clk *pixel_parent; struct clk *pixel1_clk_rcg; struct clk *pixel1_parent; struct dp_power dp_power; struct sde_power_client *dp_core_client; Loading @@ -31,6 +33,8 @@ struct dp_power_private { bool core_clks_on; bool link_clks_on; bool strm0_clks_on; bool strm1_clks_on; }; static int dp_power_regulator_init(struct dp_power_private *power) Loading Loading @@ -142,11 +146,13 @@ static int dp_power_pinctrl_set(struct dp_power_private *power, bool active) static int dp_power_clk_init(struct dp_power_private *power, bool enable) { int rc = 0; struct dss_module_power *core, *ctrl; struct dss_module_power *core, *ctrl, *strm0, *strm1; struct device *dev; core = &power->parser->mp[DP_CORE_PM]; ctrl = &power->parser->mp[DP_CTRL_PM]; strm0 = &power->parser->mp[DP_STREAM0_PM]; strm1 = &power->parser->mp[DP_STREAM1_PM]; dev = &power->pdev->dev; Loading @@ -171,6 +177,20 @@ static int dp_power_clk_init(struct dp_power_private *power, bool enable) goto ctrl_get_error; } rc = msm_dss_get_clk(dev, strm0->clk_config, strm0->num_clk); if (rc) { pr_err("failed to get %s clk. err=%d\n", dp_parser_pm_name(DP_STREAM0_PM), rc); goto strm0_get_error; } rc = msm_dss_get_clk(dev, strm1->clk_config, strm1->num_clk); if (rc) { pr_err("failed to get %s clk. err=%d\n", dp_parser_pm_name(DP_STREAM1_PM), rc); goto strm1_get_error; } power->pixel_clk_rcg = devm_clk_get(dev, "pixel_clk_rcg"); if (IS_ERR(power->pixel_clk_rcg)) { pr_debug("Unable to get DP pixel clk RCG\n"); Loading @@ -182,6 +202,18 @@ static int dp_power_clk_init(struct dp_power_private *power, bool enable) pr_debug("Unable to get DP pixel RCG parent\n"); power->pixel_parent = NULL; } power->pixel1_clk_rcg = devm_clk_get(dev, "pixel1_clk_rcg"); if (IS_ERR(power->pixel1_clk_rcg)) { pr_debug("Unable to get DP pixel1 clk RCG\n"); power->pixel1_clk_rcg = NULL; } power->pixel1_parent = devm_clk_get(dev, "pixel1_parent"); if (IS_ERR(power->pixel1_parent)) { pr_debug("Unable to get DP pixel1 RCG parent\n"); power->pixel1_parent = NULL; } } else { if (power->pixel_parent) devm_clk_put(dev, power->pixel_parent); Loading @@ -189,12 +221,24 @@ static int dp_power_clk_init(struct dp_power_private *power, bool enable) if (power->pixel_clk_rcg) devm_clk_put(dev, power->pixel_clk_rcg); if (power->pixel1_parent) devm_clk_put(dev, power->pixel1_parent); if (power->pixel1_clk_rcg) devm_clk_put(dev, power->pixel1_clk_rcg); msm_dss_put_clk(ctrl->clk_config, ctrl->num_clk); msm_dss_put_clk(core->clk_config, core->num_clk); msm_dss_put_clk(strm0->clk_config, strm0->num_clk); msm_dss_put_clk(strm1->clk_config, strm1->num_clk); } return rc; strm1_get_error: msm_dss_put_clk(strm0->clk_config, strm0->num_clk); strm0_get_error: msm_dss_put_clk(ctrl->clk_config, ctrl->num_clk); ctrl_get_error: msm_dss_put_clk(core->clk_config, core->num_clk); exit: Loading Loading @@ -255,7 +299,9 @@ static int dp_power_clk_enable(struct dp_power *dp_power, mp = &power->parser->mp[pm_type]; if ((pm_type != DP_CORE_PM) && (pm_type != DP_CTRL_PM)) { if ((pm_type != DP_CORE_PM) && (pm_type != DP_CTRL_PM) && (pm_type != DP_STREAM0_PM) && (pm_type != DP_STREAM1_PM)) { pr_err("unsupported power module: %s\n", dp_parser_pm_name(pm_type)); return -EINVAL; Loading @@ -274,6 +320,18 @@ static int dp_power_clk_enable(struct dp_power *dp_power, return 0; } if ((pm_type == DP_STREAM0_PM) && (power->strm0_clks_on)) { pr_debug("strm0 clks already enabled\n"); return 0; } if ((pm_type == DP_STREAM1_PM) && (power->strm1_clks_on)) { pr_debug("strm1 clks already enabled\n"); return 0; } if ((pm_type == DP_CTRL_PM) && (!power->core_clks_on)) { pr_debug("Need to enable core clks before link clks\n"); Loading @@ -298,15 +356,21 @@ static int dp_power_clk_enable(struct dp_power *dp_power, if (pm_type == DP_CORE_PM) power->core_clks_on = enable; else else if (pm_type == DP_CTRL_PM) power->link_clks_on = enable; else if (pm_type == DP_STREAM0_PM) power->strm0_clks_on = enable; else if (pm_type == DP_STREAM1_PM) power->strm1_clks_on = enable; pr_debug("%s clocks for %s\n", enable ? "enable" : "disable", dp_parser_pm_name(pm_type)); pr_debug("link_clks:%s core_clks:%s\n", pr_debug("link_clks:%s core_clks:%s strm0_clks:%s strm1_clks:%s\n", power->link_clks_on ? "on" : "off", power->core_clks_on ? "on" : "off"); power->core_clks_on ? "on" : "off", power->strm0_clks_on ? "on" : "off", power->strm1_clks_on ? "on" : "off"); error: return rc; } Loading