aboutsummaryrefslogtreecommitdiffstats
path: root/recipes-kernel/linux/linux-yocto/qca6390-driver/0003-mfd-qcom-qca639x-switch-to-platform-config-data.patch
diff options
context:
space:
mode:
Diffstat (limited to 'recipes-kernel/linux/linux-yocto/qca6390-driver/0003-mfd-qcom-qca639x-switch-to-platform-config-data.patch')
-rw-r--r--recipes-kernel/linux/linux-yocto/qca6390-driver/0003-mfd-qcom-qca639x-switch-to-platform-config-data.patch189
1 files changed, 189 insertions, 0 deletions
diff --git a/recipes-kernel/linux/linux-yocto/qca6390-driver/0003-mfd-qcom-qca639x-switch-to-platform-config-data.patch b/recipes-kernel/linux/linux-yocto/qca6390-driver/0003-mfd-qcom-qca639x-switch-to-platform-config-data.patch
new file mode 100644
index 0000000..72458ef
--- /dev/null
+++ b/recipes-kernel/linux/linux-yocto/qca6390-driver/0003-mfd-qcom-qca639x-switch-to-platform-config-data.patch
@@ -0,0 +1,189 @@
+From bf19679f9a583a5bfd0cb711984fbe456af652fd Mon Sep 17 00:00:00 2001
+From: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
+Date: Sat, 26 Feb 2022 21:13:18 +0300
+Subject: [PATCH 3/5] mfd: qcom-qca639x: switch to platform config data
+
+Change qcom-qca639x to use platform config data, in preparation to
+supporting other devices.
+
+Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
+Upstream-Status: Inappropriate
+---
+ drivers/mfd/qcom-qca639x.c | 74 +++++++++++++++++++++++---------------
+ 1 file changed, 46 insertions(+), 28 deletions(-)
+
+diff --git a/drivers/mfd/qcom-qca639x.c b/drivers/mfd/qcom-qca639x.c
+index b31e4b65bec5..22792561dbad 100644
+--- a/drivers/mfd/qcom-qca639x.c
++++ b/drivers/mfd/qcom-qca639x.c
+@@ -1,4 +1,5 @@
+ #include <linux/delay.h>
++#include <linux/gpio/consumer.h>
+ #include <linux/init.h>
+ #include <linux/kernel.h>
+ #include <linux/module.h>
+@@ -6,15 +7,21 @@
+ #include <linux/pinctrl/devinfo.h>
+ #include <linux/platform_device.h>
+ #include <linux/pm_domain.h>
++#include <linux/property.h>
+ #include <linux/regulator/consumer.h>
+ #include <linux/slab.h>
+
+-#define MAX_NUM_REGULATORS 8
+-
+-static struct vreg {
++struct vreg {
+ const char *name;
+ unsigned int load_uA;
+-} vregs [MAX_NUM_REGULATORS] = {
++};
++
++struct qca_cfg_data {
++ const struct vreg *vregs;
++ size_t num_vregs;
++};
++
++static const struct vreg qca6390_vregs[] = {
+ /* 2.0 V */
+ { "vddpcie2", 15000 },
+ { "vddrfa3", 400000 },
+@@ -32,19 +39,24 @@ static struct vreg {
+ { "vddio", 20000 },
+ };
+
+-struct qca639x_data {
+- struct regulator_bulk_data regulators[MAX_NUM_REGULATORS];
++static const struct qca_cfg_data qca6390_cfg_data = {
++ .vregs = qca6390_vregs,
++ .num_vregs = ARRAY_SIZE(qca6390_vregs),
++};
++
++struct qca_data {
+ size_t num_vregs;
+ struct device *dev;
+ struct pinctrl_state *active_state;
+ struct generic_pm_domain pd;
++ struct regulator_bulk_data regulators[];
+ };
+
+-#define domain_to_data(domain) container_of(domain, struct qca639x_data, pd)
++#define domain_to_data(domain) container_of(domain, struct qca_data, pd)
+
+-static int qca639x_power_on(struct generic_pm_domain *domain)
++static int qca_power_on(struct generic_pm_domain *domain)
+ {
+- struct qca639x_data *data = domain_to_data(domain);
++ struct qca_data *data = domain_to_data(domain);
+ int ret;
+
+ dev_warn(&domain->dev, "DUMMY POWER ON\n");
+@@ -70,9 +82,9 @@ static int qca639x_power_on(struct generic_pm_domain *domain)
+ return 0;
+ }
+
+-static int qca639x_power_off(struct generic_pm_domain *domain)
++static int qca_power_off(struct generic_pm_domain *domain)
+ {
+- struct qca639x_data *data = domain_to_data(domain);
++ struct qca_data *data = domain_to_data(domain);
+
+ dev_warn(&domain->dev, "DUMMY POWER OFF\n");
+
+@@ -82,21 +94,26 @@ static int qca639x_power_off(struct generic_pm_domain *domain)
+ return 0;
+ }
+
+-static int qca639x_probe(struct platform_device *pdev)
++static int qca_probe(struct platform_device *pdev)
+ {
+- struct qca639x_data *data;
++ const struct qca_cfg_data *cfg;
++ struct qca_data *data;
+ struct device *dev = &pdev->dev;
+ int i, ret;
+
++ cfg = device_get_match_data(&pdev->dev);
++ if (!cfg)
++ return -EINVAL;
++
+ if (!dev->pins || IS_ERR_OR_NULL(dev->pins->default_state))
+ return -EINVAL;
+
+- data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL);
++ data = devm_kzalloc(dev, struct_size(data, regulators, cfg->num_vregs), GFP_KERNEL);
+ if (!data)
+ return -ENOMEM;
+
+ data->dev = dev;
+- data->num_vregs = ARRAY_SIZE(vregs);
++ data->num_vregs = cfg->num_vregs;
+
+ data->active_state = pinctrl_lookup_state(dev->pins->p, "active");
+ if (IS_ERR(data->active_state)) {
+@@ -106,20 +123,20 @@ static int qca639x_probe(struct platform_device *pdev)
+ }
+
+ for (i = 0; i < data->num_vregs; i++)
+- data->regulators[i].supply = vregs[i].name;
++ data->regulators[i].supply = cfg->vregs[i].name;
+ ret = devm_regulator_bulk_get(dev, data->num_vregs, data->regulators);
+ if (ret < 0)
+ return ret;
+
+ for (i = 0; i < data->num_vregs; i++) {
+- ret = regulator_set_load(data->regulators[i].consumer, vregs[i].load_uA);
++ ret = regulator_set_load(data->regulators[i].consumer, cfg->vregs[i].load_uA);
+ if (ret)
+ return ret;
+ }
+
+ data->pd.name = dev_name(dev);
+- data->pd.power_on = qca639x_power_on;
+- data->pd.power_off = qca639x_power_off;
++ data->pd.power_on = qca_power_on;
++ data->pd.power_off = qca_power_off;
+
+ ret = pm_genpd_init(&data->pd, NULL, true);
+ if (ret < 0)
+@@ -136,27 +153,28 @@ static int qca639x_probe(struct platform_device *pdev)
+ return 0;
+ }
+
+-static int qca639x_remove(struct platform_device *pdev)
++static int qca_remove(struct platform_device *pdev)
+ {
+- struct qca639x_data *data = platform_get_drvdata(pdev);
++ struct qca_data *data = platform_get_drvdata(pdev);
+
+ pm_genpd_remove(&data->pd);
+
+ return 0;
+ }
+
+-static const struct of_device_id qca639x_of_match[] = {
+- { .compatible = "qcom,qca639x" },
++static const struct of_device_id qca_of_match[] = {
++ { .compatible = "qcom,qca6390", .data = &qca6390_cfg_data },
++ { },
+ };
+
+-static struct platform_driver qca639x_driver = {
+- .probe = qca639x_probe,
+- .remove = qca639x_remove,
++static struct platform_driver qca_driver = {
++ .probe = qca_probe,
++ .remove = qca_remove,
+ .driver = {
+ .name = "qca639x",
+- .of_match_table = qca639x_of_match,
++ .of_match_table = qca_of_match,
+ },
+ };
+
+-module_platform_driver(qca639x_driver);
++module_platform_driver(qca_driver);
+ MODULE_LICENSE("GPL v2");
+--
+2.39.2
+