12874c5fdSThomas Gleixner // SPDX-License-Identifier: GPL-2.0-or-later 2b25c6b7dSWenyou Yang /* 3b25c6b7dSWenyou Yang * MFD driver for Active-semi ACT8945a PMIC 4b25c6b7dSWenyou Yang * 5b25c6b7dSWenyou Yang * Copyright (C) 2015 Atmel Corporation. 6b25c6b7dSWenyou Yang * 7b25c6b7dSWenyou Yang * Author: Wenyou Yang <wenyou.yang@atmel.com> 8b25c6b7dSWenyou Yang */ 9b25c6b7dSWenyou Yang 10b25c6b7dSWenyou Yang #include <linux/i2c.h> 11b25c6b7dSWenyou Yang #include <linux/mfd/core.h> 12b25c6b7dSWenyou Yang #include <linux/module.h> 13b25c6b7dSWenyou Yang #include <linux/of_device.h> 14b25c6b7dSWenyou Yang #include <linux/regmap.h> 15b25c6b7dSWenyou Yang 16b25c6b7dSWenyou Yang static const struct mfd_cell act8945a_devs[] = { 17b25c6b7dSWenyou Yang { 18b25c6b7dSWenyou Yang .name = "act8945a-regulator", 19b25c6b7dSWenyou Yang }, 20b25c6b7dSWenyou Yang { 21b25c6b7dSWenyou Yang .name = "act8945a-charger", 227235711aSWenyou Yang .of_compatible = "active-semi,act8945a-charger", 23b25c6b7dSWenyou Yang }, 24b25c6b7dSWenyou Yang }; 25b25c6b7dSWenyou Yang 26b25c6b7dSWenyou Yang static const struct regmap_config act8945a_regmap_config = { 27b25c6b7dSWenyou Yang .reg_bits = 8, 28b25c6b7dSWenyou Yang .val_bits = 8, 29b25c6b7dSWenyou Yang }; 30b25c6b7dSWenyou Yang 31*75a4504eSUwe Kleine-König static int act8945a_i2c_probe(struct i2c_client *i2c) 32b25c6b7dSWenyou Yang { 33b25c6b7dSWenyou Yang int ret; 34b25c6b7dSWenyou Yang struct regmap *regmap; 35b25c6b7dSWenyou Yang 36b25c6b7dSWenyou Yang regmap = devm_regmap_init_i2c(i2c, &act8945a_regmap_config); 37b25c6b7dSWenyou Yang if (IS_ERR(regmap)) { 38b25c6b7dSWenyou Yang ret = PTR_ERR(regmap); 39b25c6b7dSWenyou Yang dev_err(&i2c->dev, "regmap init failed: %d\n", ret); 40b25c6b7dSWenyou Yang return ret; 41b25c6b7dSWenyou Yang } 42b25c6b7dSWenyou Yang 43b25c6b7dSWenyou Yang i2c_set_clientdata(i2c, regmap); 44b25c6b7dSWenyou Yang 45f9932c6eSLaxman Dewangan ret = devm_mfd_add_devices(&i2c->dev, PLATFORM_DEVID_NONE, 46f9932c6eSLaxman Dewangan act8945a_devs, ARRAY_SIZE(act8945a_devs), 47f9932c6eSLaxman Dewangan NULL, 0, NULL); 48b25c6b7dSWenyou Yang if (ret) { 49b25c6b7dSWenyou Yang dev_err(&i2c->dev, "Failed to add sub devices\n"); 50b25c6b7dSWenyou Yang return ret; 51b25c6b7dSWenyou Yang } 52b25c6b7dSWenyou Yang 53b25c6b7dSWenyou Yang return 0; 54b25c6b7dSWenyou Yang } 55b25c6b7dSWenyou Yang 56b25c6b7dSWenyou Yang static const struct i2c_device_id act8945a_i2c_id[] = { 57b25c6b7dSWenyou Yang { "act8945a", 0 }, 58b25c6b7dSWenyou Yang {} 59b25c6b7dSWenyou Yang }; 60b25c6b7dSWenyou Yang MODULE_DEVICE_TABLE(i2c, act8945a_i2c_id); 61b25c6b7dSWenyou Yang 62b25c6b7dSWenyou Yang static const struct of_device_id act8945a_of_match[] = { 63b25c6b7dSWenyou Yang { .compatible = "active-semi,act8945a", }, 64b25c6b7dSWenyou Yang {}, 65b25c6b7dSWenyou Yang }; 66b25c6b7dSWenyou Yang MODULE_DEVICE_TABLE(of, act8945a_of_match); 67b25c6b7dSWenyou Yang 68b25c6b7dSWenyou Yang static struct i2c_driver act8945a_i2c_driver = { 69b25c6b7dSWenyou Yang .driver = { 70b25c6b7dSWenyou Yang .name = "act8945a", 71b25c6b7dSWenyou Yang .of_match_table = of_match_ptr(act8945a_of_match), 72b25c6b7dSWenyou Yang }, 73*75a4504eSUwe Kleine-König .probe_new = act8945a_i2c_probe, 74b25c6b7dSWenyou Yang .id_table = act8945a_i2c_id, 75b25c6b7dSWenyou Yang }; 76b25c6b7dSWenyou Yang 77b25c6b7dSWenyou Yang static int __init act8945a_i2c_init(void) 78b25c6b7dSWenyou Yang { 79b25c6b7dSWenyou Yang return i2c_add_driver(&act8945a_i2c_driver); 80b25c6b7dSWenyou Yang } 81b25c6b7dSWenyou Yang subsys_initcall(act8945a_i2c_init); 82b25c6b7dSWenyou Yang 83b25c6b7dSWenyou Yang static void __exit act8945a_i2c_exit(void) 84b25c6b7dSWenyou Yang { 85b25c6b7dSWenyou Yang i2c_del_driver(&act8945a_i2c_driver); 86b25c6b7dSWenyou Yang } 87b25c6b7dSWenyou Yang module_exit(act8945a_i2c_exit); 88b25c6b7dSWenyou Yang 89b25c6b7dSWenyou Yang MODULE_DESCRIPTION("ACT8945A PMIC multi-function driver"); 90b25c6b7dSWenyou Yang MODULE_AUTHOR("Wenyou Yang <wenyou.yang@atmel.com>"); 91b25c6b7dSWenyou Yang MODULE_LICENSE("GPL"); 92