Commit 603d9299 authored by Frank Wunderlich's avatar Frank Wunderlich Committed by Lee Jones

mfd: mt6397: Fix probe after changing mt6397-core

Part 3 from this series [1] was not merged due to wrong splitting
and breaks mt6323 pmic on bananapi-r2

dmesg prints this line and at least switch is not initialized on bananapi-r2

mt6397 1000d000.pwrap:mt6323: unsupported chip: 0x0

this patch contains only the probe-changes and chip_data structs
from original part 3 by Hsin-Hsiung Wang

[1] https://patchwork.kernel.org/project/linux-mediatek/list/?series=164155

Fixes: a4872e80 ("mfd: mt6397: Extract IRQ related code from core driver")
Signed-off-by: default avatarFrank Wunderlich <frank-w@public-files.de>
Signed-off-by: default avatarLee Jones <lee.jones@linaro.org>
parent 54ecb8f7
...@@ -129,11 +129,27 @@ static int mt6397_irq_resume(struct device *dev) ...@@ -129,11 +129,27 @@ static int mt6397_irq_resume(struct device *dev)
static SIMPLE_DEV_PM_OPS(mt6397_pm_ops, mt6397_irq_suspend, static SIMPLE_DEV_PM_OPS(mt6397_pm_ops, mt6397_irq_suspend,
mt6397_irq_resume); mt6397_irq_resume);
struct chip_data {
u32 cid_addr;
u32 cid_shift;
};
static const struct chip_data mt6323_core = {
.cid_addr = MT6323_CID,
.cid_shift = 0,
};
static const struct chip_data mt6397_core = {
.cid_addr = MT6397_CID,
.cid_shift = 0,
};
static int mt6397_probe(struct platform_device *pdev) static int mt6397_probe(struct platform_device *pdev)
{ {
int ret; int ret;
unsigned int id; unsigned int id;
struct mt6397_chip *pmic; struct mt6397_chip *pmic;
const struct chip_data *pmic_core;
pmic = devm_kzalloc(&pdev->dev, sizeof(*pmic), GFP_KERNEL); pmic = devm_kzalloc(&pdev->dev, sizeof(*pmic), GFP_KERNEL);
if (!pmic) if (!pmic)
...@@ -149,28 +165,30 @@ static int mt6397_probe(struct platform_device *pdev) ...@@ -149,28 +165,30 @@ static int mt6397_probe(struct platform_device *pdev)
if (!pmic->regmap) if (!pmic->regmap)
return -ENODEV; return -ENODEV;
platform_set_drvdata(pdev, pmic); pmic_core = of_device_get_match_data(&pdev->dev);
if (!pmic_core)
return -ENODEV;
ret = regmap_read(pmic->regmap, MT6397_CID, &id); ret = regmap_read(pmic->regmap, pmic_core->cid_addr, &id);
if (ret) { if (ret) {
dev_err(pmic->dev, "Failed to read chip id: %d\n", ret); dev_err(&pdev->dev, "Failed to read chip id: %d\n", ret);
return ret; return ret;
} }
pmic->chip_id = (id >> pmic_core->cid_shift) & 0xff;
platform_set_drvdata(pdev, pmic);
pmic->irq = platform_get_irq(pdev, 0); pmic->irq = platform_get_irq(pdev, 0);
if (pmic->irq <= 0) if (pmic->irq <= 0)
return pmic->irq; return pmic->irq;
switch (id & 0xff) { ret = mt6397_irq_init(pmic);
case MT6323_CHIP_ID: if (ret)
pmic->int_con[0] = MT6323_INT_CON0; return ret;
pmic->int_con[1] = MT6323_INT_CON1;
pmic->int_status[0] = MT6323_INT_STATUS0;
pmic->int_status[1] = MT6323_INT_STATUS1;
ret = mt6397_irq_init(pmic);
if (ret)
return ret;
switch (pmic->chip_id) {
case MT6323_CHIP_ID:
ret = devm_mfd_add_devices(&pdev->dev, -1, mt6323_devs, ret = devm_mfd_add_devices(&pdev->dev, -1, mt6323_devs,
ARRAY_SIZE(mt6323_devs), NULL, ARRAY_SIZE(mt6323_devs), NULL,
0, pmic->irq_domain); 0, pmic->irq_domain);
...@@ -178,21 +196,13 @@ static int mt6397_probe(struct platform_device *pdev) ...@@ -178,21 +196,13 @@ static int mt6397_probe(struct platform_device *pdev)
case MT6391_CHIP_ID: case MT6391_CHIP_ID:
case MT6397_CHIP_ID: case MT6397_CHIP_ID:
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 = mt6397_irq_init(pmic);
if (ret)
return ret;
ret = devm_mfd_add_devices(&pdev->dev, -1, mt6397_devs, ret = devm_mfd_add_devices(&pdev->dev, -1, mt6397_devs,
ARRAY_SIZE(mt6397_devs), NULL, ARRAY_SIZE(mt6397_devs), NULL,
0, pmic->irq_domain); 0, pmic->irq_domain);
break; break;
default: default:
dev_err(&pdev->dev, "unsupported chip: %d\n", id); dev_err(&pdev->dev, "unsupported chip: %d\n", pmic->chip_id);
return -ENODEV; return -ENODEV;
} }
...@@ -205,9 +215,15 @@ static int mt6397_probe(struct platform_device *pdev) ...@@ -205,9 +215,15 @@ static int mt6397_probe(struct platform_device *pdev)
} }
static const struct of_device_id mt6397_of_match[] = { static const struct of_device_id mt6397_of_match[] = {
{ .compatible = "mediatek,mt6397" }, {
{ .compatible = "mediatek,mt6323" }, .compatible = "mediatek,mt6323",
{ } .data = &mt6323_core,
}, {
.compatible = "mediatek,mt6397",
.data = &mt6397_core,
}, {
/* sentinel */
}
}; };
MODULE_DEVICE_TABLE(of, mt6397_of_match); MODULE_DEVICE_TABLE(of, mt6397_of_match);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment