1b25c6b7dSWenyou Yang /* 2b25c6b7dSWenyou Yang * MFD driver for Active-semi ACT8945a PMIC 3b25c6b7dSWenyou Yang * 4b25c6b7dSWenyou Yang * Copyright (C) 2015 Atmel Corporation. 5b25c6b7dSWenyou Yang * 6b25c6b7dSWenyou Yang * Author: Wenyou Yang <wenyou.yang@atmel.com> 7b25c6b7dSWenyou Yang * 8b25c6b7dSWenyou Yang * This program is free software; you can redistribute it and/or modify it 9b25c6b7dSWenyou Yang * under the terms of the GNU General Public License as published by the 10b25c6b7dSWenyou Yang * Free Software Foundation; either version 2 of the License, or (at your 11b25c6b7dSWenyou Yang * option) any later version. 12b25c6b7dSWenyou Yang */ 13b25c6b7dSWenyou Yang 14b25c6b7dSWenyou Yang #include <linux/i2c.h> 15b25c6b7dSWenyou Yang #include <linux/mfd/core.h> 16b25c6b7dSWenyou Yang #include <linux/module.h> 17b25c6b7dSWenyou Yang #include <linux/of_device.h> 18b25c6b7dSWenyou Yang #include <linux/regmap.h> 19b25c6b7dSWenyou Yang 20b25c6b7dSWenyou Yang static const struct mfd_cell act8945a_devs[] = { 21b25c6b7dSWenyou Yang { 22b25c6b7dSWenyou Yang .name = "act8945a-regulator", 23b25c6b7dSWenyou Yang }, 24b25c6b7dSWenyou Yang { 25b25c6b7dSWenyou Yang .name = "act8945a-charger", 26b25c6b7dSWenyou Yang }, 27b25c6b7dSWenyou Yang }; 28b25c6b7dSWenyou Yang 29b25c6b7dSWenyou Yang static const struct regmap_config act8945a_regmap_config = { 30b25c6b7dSWenyou Yang .reg_bits = 8, 31b25c6b7dSWenyou Yang .val_bits = 8, 32b25c6b7dSWenyou Yang }; 33b25c6b7dSWenyou Yang 34b25c6b7dSWenyou Yang static int act8945a_i2c_probe(struct i2c_client *i2c, 35b25c6b7dSWenyou Yang const struct i2c_device_id *id) 36b25c6b7dSWenyou Yang { 37b25c6b7dSWenyou Yang int ret; 38b25c6b7dSWenyou Yang struct regmap *regmap; 39b25c6b7dSWenyou Yang 40b25c6b7dSWenyou Yang regmap = devm_regmap_init_i2c(i2c, &act8945a_regmap_config); 41b25c6b7dSWenyou Yang if (IS_ERR(regmap)) { 42b25c6b7dSWenyou Yang ret = PTR_ERR(regmap); 43b25c6b7dSWenyou Yang dev_err(&i2c->dev, "regmap init failed: %d\n", ret); 44b25c6b7dSWenyou Yang return ret; 45b25c6b7dSWenyou Yang } 46b25c6b7dSWenyou Yang 47b25c6b7dSWenyou Yang i2c_set_clientdata(i2c, regmap); 48b25c6b7dSWenyou Yang 49b25c6b7dSWenyou Yang ret = mfd_add_devices(&i2c->dev, PLATFORM_DEVID_NONE, act8945a_devs, 50b25c6b7dSWenyou Yang ARRAY_SIZE(act8945a_devs), NULL, 0, NULL); 51b25c6b7dSWenyou Yang if (ret) { 52b25c6b7dSWenyou Yang dev_err(&i2c->dev, "Failed to add sub devices\n"); 53b25c6b7dSWenyou Yang return ret; 54b25c6b7dSWenyou Yang } 55b25c6b7dSWenyou Yang 56b25c6b7dSWenyou Yang return 0; 57b25c6b7dSWenyou Yang } 58b25c6b7dSWenyou Yang 59b25c6b7dSWenyou Yang static int act8945a_i2c_remove(struct i2c_client *i2c) 60b25c6b7dSWenyou Yang { 61b25c6b7dSWenyou Yang mfd_remove_devices(&i2c->dev); 62b25c6b7dSWenyou Yang 63b25c6b7dSWenyou Yang return 0; 64b25c6b7dSWenyou Yang } 65b25c6b7dSWenyou Yang 66b25c6b7dSWenyou Yang static const struct i2c_device_id act8945a_i2c_id[] = { 67b25c6b7dSWenyou Yang { "act8945a", 0 }, 68b25c6b7dSWenyou Yang {} 69b25c6b7dSWenyou Yang }; 70b25c6b7dSWenyou Yang MODULE_DEVICE_TABLE(i2c, act8945a_i2c_id); 71b25c6b7dSWenyou Yang 72b25c6b7dSWenyou Yang static const struct of_device_id act8945a_of_match[] = { 73b25c6b7dSWenyou Yang { .compatible = "active-semi,act8945a", }, 74b25c6b7dSWenyou Yang {}, 75b25c6b7dSWenyou Yang }; 76b25c6b7dSWenyou Yang MODULE_DEVICE_TABLE(of, act8945a_of_match); 77b25c6b7dSWenyou Yang 78b25c6b7dSWenyou Yang static struct i2c_driver act8945a_i2c_driver = { 79b25c6b7dSWenyou Yang .driver = { 80b25c6b7dSWenyou Yang .name = "act8945a", 81b25c6b7dSWenyou Yang .of_match_table = of_match_ptr(act8945a_of_match), 82b25c6b7dSWenyou Yang }, 83b25c6b7dSWenyou Yang .probe = act8945a_i2c_probe, 84b25c6b7dSWenyou Yang .remove = act8945a_i2c_remove, 85b25c6b7dSWenyou Yang .id_table = act8945a_i2c_id, 86b25c6b7dSWenyou Yang }; 87b25c6b7dSWenyou Yang 88b25c6b7dSWenyou Yang static int __init act8945a_i2c_init(void) 89b25c6b7dSWenyou Yang { 90b25c6b7dSWenyou Yang return i2c_add_driver(&act8945a_i2c_driver); 91b25c6b7dSWenyou Yang } 92b25c6b7dSWenyou Yang subsys_initcall(act8945a_i2c_init); 93b25c6b7dSWenyou Yang 94b25c6b7dSWenyou Yang static void __exit act8945a_i2c_exit(void) 95b25c6b7dSWenyou Yang { 96b25c6b7dSWenyou Yang i2c_del_driver(&act8945a_i2c_driver); 97b25c6b7dSWenyou Yang } 98b25c6b7dSWenyou Yang module_exit(act8945a_i2c_exit); 99b25c6b7dSWenyou Yang 100b25c6b7dSWenyou Yang MODULE_DESCRIPTION("ACT8945A PMIC multi-function driver"); 101b25c6b7dSWenyou Yang MODULE_AUTHOR("Wenyou Yang <wenyou.yang@atmel.com>"); 102b25c6b7dSWenyou Yang MODULE_LICENSE("GPL"); 103