// SPDX-License-Identifier: GPL-2.0 /* * Copyright (C) 2019 MediaTek Inc. * Author: Argus Lin */ #include #include #include #include #include #include #include #define PMIC_VER 0x1510 #define COMMON_SUBTYPE 0x00 static const struct of_device_id pmic_spmi_id_table[] = { { .compatible = "mtk,spmi-pmic", .data = (void *)COMMON_SUBTYPE }, { .compatible = "mediatek,mt6315", .data = (void *)COMMON_SUBTYPE }, { } }; static const struct regmap_config spmi_regmap_config = { .reg_bits = 16, .val_bits = 8, .max_register = 0x16d0, .fast_io = true, }; static const struct regmap_config spmi_regmap_config_V2 = { .reg_bits = 16, .val_bits = 8, .max_register = 0x2000, .fast_io = true, }; static int pmic_spmi_probe(struct spmi_device *sdev) { struct regmap *regmap; /* Only the first slave id for a PMIC contains this information */ switch (sdev->usid) { case 3: case 6: case 7: pr_notice("%s MT6315 usid:%d\n", __func__, sdev->usid); regmap = devm_regmap_init_spmi_ext(sdev, &spmi_regmap_config); if (IS_ERR(regmap)) return PTR_ERR(regmap); break; case 9: pr_notice("%s MT6362 usid:%d\n", __func__, sdev->usid); regmap = devm_regmap_init_spmi_ext(sdev, &spmi_regmap_config_V2); if (IS_ERR(regmap)) return PTR_ERR(regmap); break; case 8: default: pr_notice("%s unknown usid:%d\n", __func__, sdev->usid); break; } return devm_of_platform_populate(&sdev->dev); } MODULE_DEVICE_TABLE(of, pmic_spmi_id_table); static struct spmi_driver pmic_spmi_driver = { .probe = pmic_spmi_probe, .driver = { .name = "pmic-spmi", .of_match_table = pmic_spmi_id_table, }, }; module_spmi_driver(pmic_spmi_driver); MODULE_DESCRIPTION("Mediatek SPMI PMIC driver"); MODULE_ALIAS("spmi:spmi-pmic"); MODULE_LICENSE("GPL v2"); MODULE_AUTHOR("Argus Lin ");