Skip to content

Commit

Permalink
clk: qcom: lpass-sc7180: Disentangle the two clock devices
Browse files Browse the repository at this point in the history
The sc7180 lpass clock driver manages two different devices.  These
two devices were tangled together, using one probe and a lookup to
figure out the real probe.  I think it's cleaner to really separate
the probe for these two devices since they're really different things,
just both managed by the same driver.

Signed-off-by: Douglas Anderson <dianders@chromium.org>
Link: https://lore.kernel.org/r/20201019154857.v5.2.I75c409497d4dea9daefa53ec5f93824081c4ecbe@changeid
Reviewed-by: Taniya Das <tdas@codeaurora.org>
Signed-off-by: Stephen Boyd <sboyd@kernel.org>
  • Loading branch information
Douglas Anderson authored and Stephen Boyd committed Nov 5, 2020
1 parent 7635622 commit 4ee9fe3
Showing 1 changed file with 64 additions and 39 deletions.
103 changes: 64 additions & 39 deletions drivers/clk/qcom/lpasscorecc-sc7180.c
Original file line number Diff line number Diff line change
Expand Up @@ -366,12 +366,39 @@ static void lpass_pm_clk_destroy(void *data)
pm_clk_destroy(data);
}

static int lpass_create_pm_clks(struct platform_device *pdev)
{
int ret;

pm_runtime_enable(&pdev->dev);
ret = devm_add_action_or_reset(&pdev->dev, lpass_pm_runtime_disable, &pdev->dev);
if (ret)
return ret;

ret = pm_clk_create(&pdev->dev);
if (ret)
return ret;
ret = devm_add_action_or_reset(&pdev->dev, lpass_pm_clk_destroy, &pdev->dev);
if (ret)
return ret;

ret = pm_clk_add(&pdev->dev, "iface");
if (ret < 0)
dev_err(&pdev->dev, "failed to acquire iface clock\n");

return ret;
}

static int lpass_core_cc_sc7180_probe(struct platform_device *pdev)
{
const struct qcom_cc_desc *desc;
struct regmap *regmap;
int ret;

ret = lpass_create_pm_clks(pdev);
if (ret)
return ret;

lpass_core_cc_sc7180_regmap_config.name = "lpass_audio_cc";
desc = &lpass_audio_hm_sc7180_desc;
ret = qcom_cc_probe_by_index(pdev, 1, desc);
Expand Down Expand Up @@ -402,80 +429,78 @@ static int lpass_core_cc_sc7180_probe(struct platform_device *pdev)
static int lpass_hm_core_probe(struct platform_device *pdev)
{
const struct qcom_cc_desc *desc;
int ret;

ret = lpass_create_pm_clks(pdev);
if (ret)
return ret;

lpass_core_cc_sc7180_regmap_config.name = "lpass_hm_core";
desc = &lpass_core_hm_sc7180_desc;

return qcom_cc_probe_by_index(pdev, 0, desc);
}

static const struct of_device_id lpass_core_cc_sc7180_match_table[] = {
static const struct of_device_id lpass_hm_sc7180_match_table[] = {
{
.compatible = "qcom,sc7180-lpasshm",
.data = lpass_hm_core_probe,
},
{ }
};
MODULE_DEVICE_TABLE(of, lpass_hm_sc7180_match_table);

static const struct of_device_id lpass_core_cc_sc7180_match_table[] = {
{
.compatible = "qcom,sc7180-lpasscorecc",
.data = lpass_core_cc_sc7180_probe,
},
{ }
};
MODULE_DEVICE_TABLE(of, lpass_core_cc_sc7180_match_table);

static int lpass_core_sc7180_probe(struct platform_device *pdev)
{
int (*clk_probe)(struct platform_device *p);
int ret;

pm_runtime_enable(&pdev->dev);
ret = devm_add_action_or_reset(&pdev->dev, lpass_pm_runtime_disable, &pdev->dev);
if (ret)
return ret;

ret = pm_clk_create(&pdev->dev);
if (ret)
return ret;
ret = devm_add_action_or_reset(&pdev->dev, lpass_pm_clk_destroy, &pdev->dev);
if (ret)
return ret;

ret = pm_clk_add(&pdev->dev, "iface");
if (ret < 0) {
dev_err(&pdev->dev, "failed to acquire iface clock\n");
return ret;
}

clk_probe = of_device_get_match_data(&pdev->dev);
if (!clk_probe)
return -EINVAL;

return clk_probe(pdev);
}

static const struct dev_pm_ops lpass_core_cc_pm_ops = {
SET_RUNTIME_PM_OPS(pm_clk_suspend, pm_clk_resume, NULL)
};

static struct platform_driver lpass_core_cc_sc7180_driver = {
.probe = lpass_core_sc7180_probe,
.probe = lpass_core_cc_sc7180_probe,
.driver = {
.name = "lpass_core_cc-sc7180",
.of_match_table = lpass_core_cc_sc7180_match_table,
.pm = &lpass_core_cc_pm_ops,
},
};

static int __init lpass_core_cc_sc7180_init(void)
static const struct dev_pm_ops lpass_hm_pm_ops = {
SET_RUNTIME_PM_OPS(pm_clk_suspend, pm_clk_resume, NULL)
};

static struct platform_driver lpass_hm_sc7180_driver = {
.probe = lpass_hm_core_probe,
.driver = {
.name = "lpass_hm-sc7180",
.of_match_table = lpass_hm_sc7180_match_table,
.pm = &lpass_hm_pm_ops,
},
};

static int __init lpass_sc7180_init(void)
{
return platform_driver_register(&lpass_core_cc_sc7180_driver);
int ret;

ret = platform_driver_register(&lpass_core_cc_sc7180_driver);
if (ret)
return ret;

return platform_driver_register(&lpass_hm_sc7180_driver);
}
subsys_initcall(lpass_core_cc_sc7180_init);
subsys_initcall(lpass_sc7180_init);

static void __exit lpass_core_cc_sc7180_exit(void)
static void __exit lpass_sc7180_exit(void)
{
platform_driver_unregister(&lpass_hm_sc7180_driver);
platform_driver_unregister(&lpass_core_cc_sc7180_driver);
}
module_exit(lpass_core_cc_sc7180_exit);
module_exit(lpass_sc7180_exit);

MODULE_DESCRIPTION("QTI LPASS_CORE_CC SC7180 Driver");
MODULE_LICENSE("GPL v2");

0 comments on commit 4ee9fe3

Please sign in to comment.