soc: qcom: aoss: Drop power domain support
Strip out the load state power-domain support from the driver since the low power mode signalling for the co-processors is now accessible through the direct qmp message send interface. Signed-off-by: Sibi Sankar <sibis@codeaurora.org> Reviewed-by: Matthias Kaehlcke <mka@chromium.org> Reviewed-by: Stephen Boyd <swboyd@chromium.org> Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org> Link: https://lore.kernel.org/r/1631800770-371-12-git-send-email-sibis@codeaurora.org
This commit is contained in:
parent
a4fe515903
commit
99512191f4
|
@ -2,7 +2,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2019, Linaro Ltd
|
* Copyright (c) 2019, Linaro Ltd
|
||||||
*/
|
*/
|
||||||
#include <dt-bindings/power/qcom-aoss-qmp.h>
|
|
||||||
#include <linux/clk-provider.h>
|
#include <linux/clk-provider.h>
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
|
@ -10,7 +9,6 @@
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/of_platform.h>
|
#include <linux/of_platform.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/pm_domain.h>
|
|
||||||
#include <linux/thermal.h>
|
#include <linux/thermal.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/soc/qcom/qcom_aoss.h>
|
#include <linux/soc/qcom/qcom_aoss.h>
|
||||||
|
@ -66,7 +64,6 @@ struct qmp_cooling_device {
|
||||||
* @event: wait_queue for synchronization with the IRQ
|
* @event: wait_queue for synchronization with the IRQ
|
||||||
* @tx_lock: provides synchronization between multiple callers of qmp_send()
|
* @tx_lock: provides synchronization between multiple callers of qmp_send()
|
||||||
* @qdss_clk: QDSS clock hw struct
|
* @qdss_clk: QDSS clock hw struct
|
||||||
* @pd_data: genpd data
|
|
||||||
* @cooling_devs: thermal cooling devices
|
* @cooling_devs: thermal cooling devices
|
||||||
*/
|
*/
|
||||||
struct qmp {
|
struct qmp {
|
||||||
|
@ -84,17 +81,9 @@ struct qmp {
|
||||||
struct mutex tx_lock;
|
struct mutex tx_lock;
|
||||||
|
|
||||||
struct clk_hw qdss_clk;
|
struct clk_hw qdss_clk;
|
||||||
struct genpd_onecell_data pd_data;
|
|
||||||
struct qmp_cooling_device *cooling_devs;
|
struct qmp_cooling_device *cooling_devs;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct qmp_pd {
|
|
||||||
struct qmp *qmp;
|
|
||||||
struct generic_pm_domain pd;
|
|
||||||
};
|
|
||||||
|
|
||||||
#define to_qmp_pd_resource(res) container_of(res, struct qmp_pd, pd)
|
|
||||||
|
|
||||||
static void qmp_kick(struct qmp *qmp)
|
static void qmp_kick(struct qmp *qmp)
|
||||||
{
|
{
|
||||||
mbox_send_message(qmp->mbox_chan, NULL);
|
mbox_send_message(qmp->mbox_chan, NULL);
|
||||||
|
@ -320,95 +309,6 @@ static void qmp_qdss_clk_remove(struct qmp *qmp)
|
||||||
clk_hw_unregister(&qmp->qdss_clk);
|
clk_hw_unregister(&qmp->qdss_clk);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int qmp_pd_power_toggle(struct qmp_pd *res, bool enable)
|
|
||||||
{
|
|
||||||
char buf[QMP_MSG_LEN] = {};
|
|
||||||
|
|
||||||
snprintf(buf, sizeof(buf),
|
|
||||||
"{class: image, res: load_state, name: %s, val: %s}",
|
|
||||||
res->pd.name, enable ? "on" : "off");
|
|
||||||
return qmp_send(res->qmp, buf, sizeof(buf));
|
|
||||||
}
|
|
||||||
|
|
||||||
static int qmp_pd_power_on(struct generic_pm_domain *domain)
|
|
||||||
{
|
|
||||||
return qmp_pd_power_toggle(to_qmp_pd_resource(domain), true);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int qmp_pd_power_off(struct generic_pm_domain *domain)
|
|
||||||
{
|
|
||||||
return qmp_pd_power_toggle(to_qmp_pd_resource(domain), false);
|
|
||||||
}
|
|
||||||
|
|
||||||
static const char * const sdm845_resources[] = {
|
|
||||||
[AOSS_QMP_LS_CDSP] = "cdsp",
|
|
||||||
[AOSS_QMP_LS_LPASS] = "adsp",
|
|
||||||
[AOSS_QMP_LS_MODEM] = "modem",
|
|
||||||
[AOSS_QMP_LS_SLPI] = "slpi",
|
|
||||||
[AOSS_QMP_LS_SPSS] = "spss",
|
|
||||||
[AOSS_QMP_LS_VENUS] = "venus",
|
|
||||||
};
|
|
||||||
|
|
||||||
static int qmp_pd_add(struct qmp *qmp)
|
|
||||||
{
|
|
||||||
struct genpd_onecell_data *data = &qmp->pd_data;
|
|
||||||
struct device *dev = qmp->dev;
|
|
||||||
struct qmp_pd *res;
|
|
||||||
size_t num = ARRAY_SIZE(sdm845_resources);
|
|
||||||
int ret;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
res = devm_kcalloc(dev, num, sizeof(*res), GFP_KERNEL);
|
|
||||||
if (!res)
|
|
||||||
return -ENOMEM;
|
|
||||||
|
|
||||||
data->domains = devm_kcalloc(dev, num, sizeof(*data->domains),
|
|
||||||
GFP_KERNEL);
|
|
||||||
if (!data->domains)
|
|
||||||
return -ENOMEM;
|
|
||||||
|
|
||||||
for (i = 0; i < num; i++) {
|
|
||||||
res[i].qmp = qmp;
|
|
||||||
res[i].pd.name = sdm845_resources[i];
|
|
||||||
res[i].pd.power_on = qmp_pd_power_on;
|
|
||||||
res[i].pd.power_off = qmp_pd_power_off;
|
|
||||||
|
|
||||||
ret = pm_genpd_init(&res[i].pd, NULL, true);
|
|
||||||
if (ret < 0) {
|
|
||||||
dev_err(dev, "failed to init genpd\n");
|
|
||||||
goto unroll_genpds;
|
|
||||||
}
|
|
||||||
|
|
||||||
data->domains[i] = &res[i].pd;
|
|
||||||
}
|
|
||||||
|
|
||||||
data->num_domains = i;
|
|
||||||
|
|
||||||
ret = of_genpd_add_provider_onecell(dev->of_node, data);
|
|
||||||
if (ret < 0)
|
|
||||||
goto unroll_genpds;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
unroll_genpds:
|
|
||||||
for (i--; i >= 0; i--)
|
|
||||||
pm_genpd_remove(data->domains[i]);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void qmp_pd_remove(struct qmp *qmp)
|
|
||||||
{
|
|
||||||
struct genpd_onecell_data *data = &qmp->pd_data;
|
|
||||||
struct device *dev = qmp->dev;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
of_genpd_del_provider(dev->of_node);
|
|
||||||
|
|
||||||
for (i = 0; i < data->num_domains; i++)
|
|
||||||
pm_genpd_remove(data->domains[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int qmp_cdev_get_max_state(struct thermal_cooling_device *cdev,
|
static int qmp_cdev_get_max_state(struct thermal_cooling_device *cdev,
|
||||||
unsigned long *state)
|
unsigned long *state)
|
||||||
{
|
{
|
||||||
|
@ -612,10 +512,6 @@ static int qmp_probe(struct platform_device *pdev)
|
||||||
if (ret)
|
if (ret)
|
||||||
goto err_close_qmp;
|
goto err_close_qmp;
|
||||||
|
|
||||||
ret = qmp_pd_add(qmp);
|
|
||||||
if (ret)
|
|
||||||
goto err_remove_qdss_clk;
|
|
||||||
|
|
||||||
ret = qmp_cooling_devices_register(qmp);
|
ret = qmp_cooling_devices_register(qmp);
|
||||||
if (ret)
|
if (ret)
|
||||||
dev_err(&pdev->dev, "failed to register aoss cooling devices\n");
|
dev_err(&pdev->dev, "failed to register aoss cooling devices\n");
|
||||||
|
@ -624,8 +520,6 @@ static int qmp_probe(struct platform_device *pdev)
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
err_remove_qdss_clk:
|
|
||||||
qmp_qdss_clk_remove(qmp);
|
|
||||||
err_close_qmp:
|
err_close_qmp:
|
||||||
qmp_close(qmp);
|
qmp_close(qmp);
|
||||||
err_free_mbox:
|
err_free_mbox:
|
||||||
|
@ -639,7 +533,6 @@ static int qmp_remove(struct platform_device *pdev)
|
||||||
struct qmp *qmp = platform_get_drvdata(pdev);
|
struct qmp *qmp = platform_get_drvdata(pdev);
|
||||||
|
|
||||||
qmp_qdss_clk_remove(qmp);
|
qmp_qdss_clk_remove(qmp);
|
||||||
qmp_pd_remove(qmp);
|
|
||||||
qmp_cooling_devices_remove(qmp);
|
qmp_cooling_devices_remove(qmp);
|
||||||
|
|
||||||
qmp_close(qmp);
|
qmp_close(qmp);
|
||||||
|
|
Loading…
Reference in New Issue