162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * I2C access driver for TI TPS65912x PMICs 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 2015 Texas Instruments Incorporated - https://www.ti.com/ 662306a36Sopenharmony_ci * Andrew F. Davis <afd@ti.com> 762306a36Sopenharmony_ci * 862306a36Sopenharmony_ci * Based on the TPS65218 driver and the previous TPS65912 driver by 962306a36Sopenharmony_ci * Margarita Olaya Cabrera <magi@slimlogic.co.uk> 1062306a36Sopenharmony_ci */ 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci#include <linux/i2c.h> 1362306a36Sopenharmony_ci#include <linux/module.h> 1462306a36Sopenharmony_ci#include <linux/regmap.h> 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci#include <linux/mfd/tps65912.h> 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_cistatic const struct of_device_id tps65912_i2c_of_match_table[] = { 1962306a36Sopenharmony_ci { .compatible = "ti,tps65912", }, 2062306a36Sopenharmony_ci { /* sentinel */ } 2162306a36Sopenharmony_ci}; 2262306a36Sopenharmony_ciMODULE_DEVICE_TABLE(of, tps65912_i2c_of_match_table); 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_cistatic int tps65912_i2c_probe(struct i2c_client *client) 2562306a36Sopenharmony_ci{ 2662306a36Sopenharmony_ci struct tps65912 *tps; 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci tps = devm_kzalloc(&client->dev, sizeof(*tps), GFP_KERNEL); 2962306a36Sopenharmony_ci if (!tps) 3062306a36Sopenharmony_ci return -ENOMEM; 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci i2c_set_clientdata(client, tps); 3362306a36Sopenharmony_ci tps->dev = &client->dev; 3462306a36Sopenharmony_ci tps->irq = client->irq; 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ci tps->regmap = devm_regmap_init_i2c(client, &tps65912_regmap_config); 3762306a36Sopenharmony_ci if (IS_ERR(tps->regmap)) { 3862306a36Sopenharmony_ci dev_err(tps->dev, "Failed to initialize register map\n"); 3962306a36Sopenharmony_ci return PTR_ERR(tps->regmap); 4062306a36Sopenharmony_ci } 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_ci return tps65912_device_init(tps); 4362306a36Sopenharmony_ci} 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_cistatic void tps65912_i2c_remove(struct i2c_client *client) 4662306a36Sopenharmony_ci{ 4762306a36Sopenharmony_ci struct tps65912 *tps = i2c_get_clientdata(client); 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ci tps65912_device_exit(tps); 5062306a36Sopenharmony_ci} 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_cistatic const struct i2c_device_id tps65912_i2c_id_table[] = { 5362306a36Sopenharmony_ci { "tps65912", 0 }, 5462306a36Sopenharmony_ci { /* sentinel */ } 5562306a36Sopenharmony_ci}; 5662306a36Sopenharmony_ciMODULE_DEVICE_TABLE(i2c, tps65912_i2c_id_table); 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_cistatic struct i2c_driver tps65912_i2c_driver = { 5962306a36Sopenharmony_ci .driver = { 6062306a36Sopenharmony_ci .name = "tps65912", 6162306a36Sopenharmony_ci .of_match_table = tps65912_i2c_of_match_table, 6262306a36Sopenharmony_ci }, 6362306a36Sopenharmony_ci .probe = tps65912_i2c_probe, 6462306a36Sopenharmony_ci .remove = tps65912_i2c_remove, 6562306a36Sopenharmony_ci .id_table = tps65912_i2c_id_table, 6662306a36Sopenharmony_ci}; 6762306a36Sopenharmony_cimodule_i2c_driver(tps65912_i2c_driver); 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_ciMODULE_AUTHOR("Andrew F. Davis <afd@ti.com>"); 7062306a36Sopenharmony_ciMODULE_DESCRIPTION("TPS65912x I2C Interface Driver"); 7162306a36Sopenharmony_ciMODULE_LICENSE("GPL v2"); 72