summaryrefslogtreecommitdiffstats
path: root/target/linux/mediatek/patches-4.4/0044-mfd-mt6397-add-support-for-different-Slave-types.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/mediatek/patches-4.4/0044-mfd-mt6397-add-support-for-different-Slave-types.patch')
-rw-r--r--target/linux/mediatek/patches-4.4/0044-mfd-mt6397-add-support-for-different-Slave-types.patch105
1 files changed, 105 insertions, 0 deletions
diff --git a/target/linux/mediatek/patches-4.4/0044-mfd-mt6397-add-support-for-different-Slave-types.patch b/target/linux/mediatek/patches-4.4/0044-mfd-mt6397-add-support-for-different-Slave-types.patch
new file mode 100644
index 0000000000..30576b76b7
--- /dev/null
+++ b/target/linux/mediatek/patches-4.4/0044-mfd-mt6397-add-support-for-different-Slave-types.patch
@@ -0,0 +1,105 @@
+From d29ee5f0472ea3e964e698e3e9e87a83b4465e9c Mon Sep 17 00:00:00 2001
+From: John Crispin <blogic@openwrt.org>
+Date: Fri, 8 Jan 2016 08:41:52 +0100
+Subject: [PATCH 44/53] mfd: mt6397: add support for different Slave types
+
+Signed-off-by: John Crispin <blogic@openwrt.org>
+---
+ drivers/mfd/mt6397-core.c | 58 ++++++++++++++++++++++++++++++++-------------
+ 1 file changed, 41 insertions(+), 17 deletions(-)
+
+diff --git a/drivers/mfd/mt6397-core.c b/drivers/mfd/mt6397-core.c
+index 75ad0fe..aa91606 100644
+--- a/drivers/mfd/mt6397-core.c
++++ b/drivers/mfd/mt6397-core.c
+@@ -24,6 +24,9 @@
+ #define MT6397_RTC_BASE 0xe000
+ #define MT6397_RTC_SIZE 0x3e
+
++#define MT6391_CID_CODE 0x91
++#define MT6397_CID_CODE 0x97
++
+ static const struct resource mt6397_rtc_resources[] = {
+ {
+ .start = MT6397_RTC_BASE,
+@@ -232,39 +235,60 @@ static SIMPLE_DEV_PM_OPS(mt6397_pm_ops, mt6397_irq_suspend,
+ static int mt6397_probe(struct platform_device *pdev)
+ {
+ int ret;
+- struct mt6397_chip *mt6397;
++ unsigned int id;
++ struct mt6397_chip *pmic;
+
+- mt6397 = devm_kzalloc(&pdev->dev, sizeof(*mt6397), GFP_KERNEL);
+- if (!mt6397)
++ pmic = devm_kzalloc(&pdev->dev, sizeof(*pmic), GFP_KERNEL);
++ if (!pmic)
+ return -ENOMEM;
+
+- mt6397->dev = &pdev->dev;
+- mt6397->int_con[0] = MT6397_INT_CON0;
+- mt6397->int_con[1] = MT6397_INT_CON1;
+- mt6397->int_status[0] = MT6397_INT_STATUS0;
+- mt6397->int_status[1] = MT6397_INT_STATUS1;
++ pmic->dev = &pdev->dev;
+
+ /*
+ * mt6397 MFD is child device of soc pmic wrapper.
+ * Regmap is set from its parent.
+ */
+- mt6397->regmap = dev_get_regmap(pdev->dev.parent, NULL);
+- if (!mt6397->regmap)
++ pmic->regmap = dev_get_regmap(pdev->dev.parent, NULL);
++ if (!pmic->regmap)
+ return -ENODEV;
+
+- platform_set_drvdata(pdev, mt6397);
++ platform_set_drvdata(pdev, pmic);
++
++ ret = regmap_read(pmic->regmap, MT6397_CID, &id);
++ if (ret) {
++ dev_err(pmic->dev, "Failed to read chip id: %d\n", ret);
++ goto fail_irq;
++ }
++
++ switch (id & 0xff) {
++ case MT6397_CID_CODE:
++ case MT6391_CID_CODE:
++ pmic->int_con[0] = MT6397_INT_CON0;
++ pmic->int_con[1] = MT6397_INT_CON1;
++ pmic->int_status[0] = MT6397_INT_STATUS0;
++ pmic->int_status[1] = MT6397_INT_STATUS1;
++ ret = mfd_add_devices(&pdev->dev, -1, mt6397_devs,
++ ARRAY_SIZE(mt6397_devs), NULL, 0, NULL);
++ break;
++
++ default:
++ dev_err(&pdev->dev, "unsupported chip: %d\n", id);
++ ret = -ENODEV;
++ break;
++ }
+
+- mt6397->irq = platform_get_irq(pdev, 0);
+- if (mt6397->irq > 0) {
+- ret = mt6397_irq_init(mt6397);
++ pmic->irq = platform_get_irq(pdev, 0);
++ if (pmic->irq > 0) {
++ ret = mt6397_irq_init(pmic);
+ if (ret)
+ return ret;
+ }
+
+- ret = mfd_add_devices(&pdev->dev, -1, mt6397_devs,
+- ARRAY_SIZE(mt6397_devs), NULL, 0, NULL);
+- if (ret)
++fail_irq:
++ if (ret) {
++ irq_domain_remove(pmic->irq_domain);
+ dev_err(&pdev->dev, "failed to add child devices: %d\n", ret);
++ }
+
+ return ret;
+ }
+--
+1.7.10.4
+