1796f5692SAndrew F. Davis /* 2796f5692SAndrew F. Davis * I2C access driver for TI TPS65912x PMICs 3796f5692SAndrew F. Davis * 44f4ed454SAlexander A. Klimov * Copyright (C) 2015 Texas Instruments Incorporated - https://www.ti.com/ 5796f5692SAndrew F. Davis * Andrew F. Davis <afd@ti.com> 6796f5692SAndrew F. Davis * 7796f5692SAndrew F. Davis * This program is free software; you can redistribute it and/or 8796f5692SAndrew F. Davis * modify it under the terms of the GNU General Public License version 2 as 9796f5692SAndrew F. Davis * published by the Free Software Foundation. 10796f5692SAndrew F. Davis * 11796f5692SAndrew F. Davis * This program is distributed "as is" WITHOUT ANY WARRANTY of any 12796f5692SAndrew F. Davis * kind, whether expressed or implied; without even the implied warranty 13796f5692SAndrew F. Davis * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14796f5692SAndrew F. Davis * GNU General Public License version 2 for more details. 15796f5692SAndrew F. Davis * 16796f5692SAndrew F. Davis * Based on the TPS65218 driver and the previous TPS65912 driver by 17796f5692SAndrew F. Davis * Margarita Olaya Cabrera <magi@slimlogic.co.uk> 18796f5692SAndrew F. Davis */ 19796f5692SAndrew F. Davis 20796f5692SAndrew F. Davis #include <linux/i2c.h> 21796f5692SAndrew F. Davis #include <linux/module.h> 22796f5692SAndrew F. Davis #include <linux/regmap.h> 23796f5692SAndrew F. Davis 24796f5692SAndrew F. Davis #include <linux/mfd/tps65912.h> 25796f5692SAndrew F. Davis 26796f5692SAndrew F. Davis static const struct of_device_id tps65912_i2c_of_match_table[] = { 27796f5692SAndrew F. Davis { .compatible = "ti,tps65912", }, 28796f5692SAndrew F. Davis { /* sentinel */ } 29796f5692SAndrew F. Davis }; 30f8b03805SJavier Martinez Canillas MODULE_DEVICE_TABLE(of, tps65912_i2c_of_match_table); 31796f5692SAndrew F. Davis 32796f5692SAndrew F. Davis static int tps65912_i2c_probe(struct i2c_client *client, 33796f5692SAndrew F. Davis const struct i2c_device_id *ids) 34796f5692SAndrew F. Davis { 35796f5692SAndrew F. Davis struct tps65912 *tps; 36796f5692SAndrew F. Davis 37796f5692SAndrew F. Davis tps = devm_kzalloc(&client->dev, sizeof(*tps), GFP_KERNEL); 38796f5692SAndrew F. Davis if (!tps) 39796f5692SAndrew F. Davis return -ENOMEM; 40796f5692SAndrew F. Davis 41796f5692SAndrew F. Davis i2c_set_clientdata(client, tps); 42796f5692SAndrew F. Davis tps->dev = &client->dev; 43796f5692SAndrew F. Davis tps->irq = client->irq; 44796f5692SAndrew F. Davis 45796f5692SAndrew F. Davis tps->regmap = devm_regmap_init_i2c(client, &tps65912_regmap_config); 46796f5692SAndrew F. Davis if (IS_ERR(tps->regmap)) { 47796f5692SAndrew F. Davis dev_err(tps->dev, "Failed to initialize register map\n"); 48796f5692SAndrew F. Davis return PTR_ERR(tps->regmap); 49796f5692SAndrew F. Davis } 50796f5692SAndrew F. Davis 51796f5692SAndrew F. Davis return tps65912_device_init(tps); 52796f5692SAndrew F. Davis } 53796f5692SAndrew F. Davis 54796f5692SAndrew F. Davis static int tps65912_i2c_remove(struct i2c_client *client) 55796f5692SAndrew F. Davis { 56796f5692SAndrew F. Davis struct tps65912 *tps = i2c_get_clientdata(client); 57796f5692SAndrew F. Davis 58796f5692SAndrew F. Davis return tps65912_device_exit(tps); 59796f5692SAndrew F. Davis } 60796f5692SAndrew F. Davis 61796f5692SAndrew F. Davis static const struct i2c_device_id tps65912_i2c_id_table[] = { 62796f5692SAndrew F. Davis { "tps65912", 0 }, 63796f5692SAndrew F. Davis { /* sentinel */ } 64796f5692SAndrew F. Davis }; 65796f5692SAndrew F. Davis MODULE_DEVICE_TABLE(i2c, tps65912_i2c_id_table); 66796f5692SAndrew F. Davis 67796f5692SAndrew F. Davis static struct i2c_driver tps65912_i2c_driver = { 68796f5692SAndrew F. Davis .driver = { 69796f5692SAndrew F. Davis .name = "tps65912", 70796f5692SAndrew F. Davis .of_match_table = tps65912_i2c_of_match_table, 71796f5692SAndrew F. Davis }, 72796f5692SAndrew F. Davis .probe = tps65912_i2c_probe, 73796f5692SAndrew F. Davis .remove = tps65912_i2c_remove, 74796f5692SAndrew F. Davis .id_table = tps65912_i2c_id_table, 75796f5692SAndrew F. Davis }; 76796f5692SAndrew F. Davis module_i2c_driver(tps65912_i2c_driver); 77796f5692SAndrew F. Davis 78796f5692SAndrew F. Davis MODULE_AUTHOR("Andrew F. Davis <afd@ti.com>"); 79796f5692SAndrew F. Davis MODULE_DESCRIPTION("TPS65912x I2C Interface Driver"); 80796f5692SAndrew F. Davis MODULE_LICENSE("GPL v2"); 81