1// SPDX-License-Identifier: GPL-2.0 2/* 3 * TPS68470 chip Parent driver 4 * 5 * Copyright (C) 2017 Intel Corporation 6 * 7 * Authors: 8 * Rajmohan Mani <rajmohan.mani@intel.com> 9 * Tianshu Qiu <tian.shu.qiu@intel.com> 10 * Jian Xu Zheng <jian.xu.zheng@intel.com> 11 * Yuning Pu <yuning.pu@intel.com> 12 */ 13 14#include <linux/acpi.h> 15#include <linux/delay.h> 16#include <linux/i2c.h> 17#include <linux/init.h> 18#include <linux/mfd/core.h> 19#include <linux/mfd/tps68470.h> 20#include <linux/regmap.h> 21 22static const struct mfd_cell tps68470s[] = { 23 { .name = "tps68470-gpio" }, 24 { .name = "tps68470_pmic_opregion" }, 25}; 26 27static const struct regmap_config tps68470_regmap_config = { 28 .reg_bits = 8, 29 .val_bits = 8, 30 .max_register = TPS68470_REG_MAX, 31}; 32 33static int tps68470_chip_init(struct device *dev, struct regmap *regmap) 34{ 35 unsigned int version; 36 int ret; 37 38 /* Force software reset */ 39 ret = regmap_write(regmap, TPS68470_REG_RESET, TPS68470_REG_RESET_MASK); 40 if (ret) 41 return ret; 42 43 ret = regmap_read(regmap, TPS68470_REG_REVID, &version); 44 if (ret) { 45 dev_err(dev, "Failed to read revision register: %d\n", ret); 46 return ret; 47 } 48 49 dev_info(dev, "TPS68470 REVID: 0x%x\n", version); 50 51 return 0; 52} 53 54static int tps68470_probe(struct i2c_client *client) 55{ 56 struct device *dev = &client->dev; 57 struct regmap *regmap; 58 int ret; 59 60 regmap = devm_regmap_init_i2c(client, &tps68470_regmap_config); 61 if (IS_ERR(regmap)) { 62 dev_err(dev, "devm_regmap_init_i2c Error %ld\n", 63 PTR_ERR(regmap)); 64 return PTR_ERR(regmap); 65 } 66 67 i2c_set_clientdata(client, regmap); 68 69 ret = tps68470_chip_init(dev, regmap); 70 if (ret < 0) { 71 dev_err(dev, "TPS68470 Init Error %d\n", ret); 72 return ret; 73 } 74 75 ret = devm_mfd_add_devices(dev, PLATFORM_DEVID_NONE, tps68470s, 76 ARRAY_SIZE(tps68470s), NULL, 0, NULL); 77 if (ret < 0) { 78 dev_err(dev, "devm_mfd_add_devices failed: %d\n", ret); 79 return ret; 80 } 81 82 return 0; 83} 84 85static const struct acpi_device_id tps68470_acpi_ids[] = { 86 {"INT3472"}, 87 {}, 88}; 89 90static struct i2c_driver tps68470_driver = { 91 .driver = { 92 .name = "tps68470", 93 .acpi_match_table = tps68470_acpi_ids, 94 }, 95 .probe_new = tps68470_probe, 96}; 97builtin_i2c_driver(tps68470_driver); 98