tps65217.c revision 84449216b01f9c2b4c9b1882f9d6abba07b7b7ca
1d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch/* 2d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch * tps65217.c 3d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch * 4d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch * TPS65217 chip family multi-function driver 5d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch * 6d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch * Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/ 7d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch * 8d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch * This program is free software; you can redistribute it and/or 9d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch * modify it under the terms of the GNU General Public License as 10d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch * published by the Free Software Foundation version 2. 11d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch * 12d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch * This program is distributed "as is" WITHOUT ANY WARRANTY of any 13d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch * kind, whether express or implied; without even the implied warranty 14d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch * GNU General Public License for more details. 16d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch */ 17d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch 18d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch#include <linux/kernel.h> 19d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch#include <linux/device.h> 20d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch#include <linux/module.h> 21d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch#include <linux/platform_device.h> 22d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch#include <linux/init.h> 23d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch#include <linux/i2c.h> 24d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch#include <linux/slab.h> 25d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch#include <linux/regmap.h> 26d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch#include <linux/err.h> 27817bb7fbfb0a1ad5f9d475cef0752d4ec5fdeac2AnilKumar Ch#include <linux/of.h> 28817bb7fbfb0a1ad5f9d475cef0752d4ec5fdeac2AnilKumar Ch#include <linux/of_device.h> 29d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch 30d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch#include <linux/mfd/core.h> 31d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch#include <linux/mfd/tps65217.h> 32d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch 33817bb7fbfb0a1ad5f9d475cef0752d4ec5fdeac2AnilKumar Chstatic struct mfd_cell tps65217s[] = { 34817bb7fbfb0a1ad5f9d475cef0752d4ec5fdeac2AnilKumar Ch { 35817bb7fbfb0a1ad5f9d475cef0752d4ec5fdeac2AnilKumar Ch .name = "tps65217-pmic", 36817bb7fbfb0a1ad5f9d475cef0752d4ec5fdeac2AnilKumar Ch }, 37b6290ffe1f4ed4d8521fd7e46738d42ddd9f1935Matthias Kaehlcke { 38b6290ffe1f4ed4d8521fd7e46738d42ddd9f1935Matthias Kaehlcke .name = "tps65217-bl", 39b6290ffe1f4ed4d8521fd7e46738d42ddd9f1935Matthias Kaehlcke }, 40817bb7fbfb0a1ad5f9d475cef0752d4ec5fdeac2AnilKumar Ch}; 41817bb7fbfb0a1ad5f9d475cef0752d4ec5fdeac2AnilKumar Ch 42d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch/** 43d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch * tps65217_reg_read: Read a single tps65217 register. 44d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch * 45d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch * @tps: Device to read from. 46d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch * @reg: Register to read. 47d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch * @val: Contians the value 48d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch */ 49d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Chint tps65217_reg_read(struct tps65217 *tps, unsigned int reg, 50d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch unsigned int *val) 51d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch{ 52d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch return regmap_read(tps->regmap, reg, val); 53d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch} 54d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar ChEXPORT_SYMBOL_GPL(tps65217_reg_read); 55d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch 56d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch/** 57d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch * tps65217_reg_write: Write a single tps65217 register. 58d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch * 59d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch * @tps65217: Device to write to. 60d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch * @reg: Register to write to. 61d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch * @val: Value to write. 62d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch * @level: Password protected level 63d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch */ 64d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Chint tps65217_reg_write(struct tps65217 *tps, unsigned int reg, 65d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch unsigned int val, unsigned int level) 66d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch{ 67d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch int ret; 68d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch unsigned int xor_reg_val; 69d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch 70d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch switch (level) { 71d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch case TPS65217_PROTECT_NONE: 72d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch return regmap_write(tps->regmap, reg, val); 73d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch case TPS65217_PROTECT_L1: 74d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch xor_reg_val = reg ^ TPS65217_PASSWORD_REGS_UNLOCK; 75d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch ret = regmap_write(tps->regmap, TPS65217_REG_PASSWORD, 76d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch xor_reg_val); 77d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch if (ret < 0) 78d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch return ret; 79d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch 80d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch return regmap_write(tps->regmap, reg, val); 81d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch case TPS65217_PROTECT_L2: 82d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch xor_reg_val = reg ^ TPS65217_PASSWORD_REGS_UNLOCK; 83d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch ret = regmap_write(tps->regmap, TPS65217_REG_PASSWORD, 84d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch xor_reg_val); 85d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch if (ret < 0) 86d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch return ret; 87d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch ret = regmap_write(tps->regmap, reg, val); 88d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch if (ret < 0) 89d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch return ret; 90d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch ret = regmap_write(tps->regmap, TPS65217_REG_PASSWORD, 91d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch xor_reg_val); 92d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch if (ret < 0) 93d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch return ret; 94d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch return regmap_write(tps->regmap, reg, val); 95d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch default: 96d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch return -EINVAL; 97d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch } 98d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch} 99d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar ChEXPORT_SYMBOL_GPL(tps65217_reg_write); 100d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch 101d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch/** 102d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch * tps65217_update_bits: Modify bits w.r.t mask, val and level. 103d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch * 104d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch * @tps65217: Device to write to. 105d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch * @reg: Register to read-write to. 106d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch * @mask: Mask. 107d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch * @val: Value to write. 108d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch * @level: Password protected level 109d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch */ 11027757e8262669321b496c55f06f4844e827fd1c5Mark Brownstatic int tps65217_update_bits(struct tps65217 *tps, unsigned int reg, 111d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch unsigned int mask, unsigned int val, unsigned int level) 112d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch{ 113d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch int ret; 114d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch unsigned int data; 115d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch 116d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch ret = tps65217_reg_read(tps, reg, &data); 117d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch if (ret) { 118d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch dev_err(tps->dev, "Read from reg 0x%x failed\n", reg); 119d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch return ret; 120d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch } 121d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch 122d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch data &= ~mask; 123d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch data |= val & mask; 124d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch 125d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch ret = tps65217_reg_write(tps, reg, data, level); 126d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch if (ret) 127d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch dev_err(tps->dev, "Write for reg 0x%x failed\n", reg); 128d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch 129d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch return ret; 130d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch} 131d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch 132d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Chint tps65217_set_bits(struct tps65217 *tps, unsigned int reg, 133d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch unsigned int mask, unsigned int val, unsigned int level) 134d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch{ 135d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch return tps65217_update_bits(tps, reg, mask, val, level); 136d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch} 137d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar ChEXPORT_SYMBOL_GPL(tps65217_set_bits); 138d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch 139d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Chint tps65217_clear_bits(struct tps65217 *tps, unsigned int reg, 140d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch unsigned int mask, unsigned int level) 141d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch{ 142d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch return tps65217_update_bits(tps, reg, mask, 0, level); 143d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch} 144d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar ChEXPORT_SYMBOL_GPL(tps65217_clear_bits); 145d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch 146d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Chstatic struct regmap_config tps65217_regmap_config = { 147d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch .reg_bits = 8, 148d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch .val_bits = 8, 149d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch}; 150d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch 151817bb7fbfb0a1ad5f9d475cef0752d4ec5fdeac2AnilKumar Chstatic const struct of_device_id tps65217_of_match[] = { 152817bb7fbfb0a1ad5f9d475cef0752d4ec5fdeac2AnilKumar Ch { .compatible = "ti,tps65217", .data = (void *)TPS65217 }, 153817bb7fbfb0a1ad5f9d475cef0752d4ec5fdeac2AnilKumar Ch { /* sentinel */ }, 154817bb7fbfb0a1ad5f9d475cef0752d4ec5fdeac2AnilKumar Ch}; 155817bb7fbfb0a1ad5f9d475cef0752d4ec5fdeac2AnilKumar Ch 156d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Chstatic int __devinit tps65217_probe(struct i2c_client *client, 157d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch const struct i2c_device_id *ids) 158d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch{ 159d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch struct tps65217 *tps; 160d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch unsigned int version; 161817bb7fbfb0a1ad5f9d475cef0752d4ec5fdeac2AnilKumar Ch unsigned int chip_id = ids->driver_data; 162817bb7fbfb0a1ad5f9d475cef0752d4ec5fdeac2AnilKumar Ch const struct of_device_id *match; 163817bb7fbfb0a1ad5f9d475cef0752d4ec5fdeac2AnilKumar Ch int ret; 164d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch 165817bb7fbfb0a1ad5f9d475cef0752d4ec5fdeac2AnilKumar Ch if (client->dev.of_node) { 166817bb7fbfb0a1ad5f9d475cef0752d4ec5fdeac2AnilKumar Ch match = of_match_device(tps65217_of_match, &client->dev); 167817bb7fbfb0a1ad5f9d475cef0752d4ec5fdeac2AnilKumar Ch if (!match) { 168817bb7fbfb0a1ad5f9d475cef0752d4ec5fdeac2AnilKumar Ch dev_err(&client->dev, 169817bb7fbfb0a1ad5f9d475cef0752d4ec5fdeac2AnilKumar Ch "Failed to find matching dt id\n"); 170817bb7fbfb0a1ad5f9d475cef0752d4ec5fdeac2AnilKumar Ch return -EINVAL; 171817bb7fbfb0a1ad5f9d475cef0752d4ec5fdeac2AnilKumar Ch } 172817bb7fbfb0a1ad5f9d475cef0752d4ec5fdeac2AnilKumar Ch chip_id = (unsigned int)match->data; 173817bb7fbfb0a1ad5f9d475cef0752d4ec5fdeac2AnilKumar Ch } 174817bb7fbfb0a1ad5f9d475cef0752d4ec5fdeac2AnilKumar Ch 175817bb7fbfb0a1ad5f9d475cef0752d4ec5fdeac2AnilKumar Ch if (!chip_id) { 176817bb7fbfb0a1ad5f9d475cef0752d4ec5fdeac2AnilKumar Ch dev_err(&client->dev, "id is null.\n"); 177817bb7fbfb0a1ad5f9d475cef0752d4ec5fdeac2AnilKumar Ch return -ENODEV; 178817bb7fbfb0a1ad5f9d475cef0752d4ec5fdeac2AnilKumar Ch } 179a7f1b63eb85606ad77a559b95c703b99e1205aa4AnilKumar Ch 180d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch tps = devm_kzalloc(&client->dev, sizeof(*tps), GFP_KERNEL); 181d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch if (!tps) 182d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch return -ENOMEM; 183d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch 184817bb7fbfb0a1ad5f9d475cef0752d4ec5fdeac2AnilKumar Ch i2c_set_clientdata(client, tps); 185817bb7fbfb0a1ad5f9d475cef0752d4ec5fdeac2AnilKumar Ch tps->dev = &client->dev; 186817bb7fbfb0a1ad5f9d475cef0752d4ec5fdeac2AnilKumar Ch tps->id = chip_id; 187817bb7fbfb0a1ad5f9d475cef0752d4ec5fdeac2AnilKumar Ch 1880ef4619c74ef1e24e9ee340f95ee922f970cde54Axel Lin tps->regmap = devm_regmap_init_i2c(client, &tps65217_regmap_config); 189d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch if (IS_ERR(tps->regmap)) { 190d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch ret = PTR_ERR(tps->regmap); 191d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch dev_err(tps->dev, "Failed to allocate register map: %d\n", 192d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch ret); 193d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch return ret; 194d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch } 195d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch 196817bb7fbfb0a1ad5f9d475cef0752d4ec5fdeac2AnilKumar Ch ret = mfd_add_devices(tps->dev, -1, tps65217s, 19755692af5eb587f7592d6c2713e1e0eeaab0f6c31Mark Brown ARRAY_SIZE(tps65217s), NULL, 0, NULL); 198817bb7fbfb0a1ad5f9d475cef0752d4ec5fdeac2AnilKumar Ch if (ret < 0) { 199817bb7fbfb0a1ad5f9d475cef0752d4ec5fdeac2AnilKumar Ch dev_err(tps->dev, "mfd_add_devices failed: %d\n", ret); 200817bb7fbfb0a1ad5f9d475cef0752d4ec5fdeac2AnilKumar Ch return ret; 201817bb7fbfb0a1ad5f9d475cef0752d4ec5fdeac2AnilKumar Ch } 202d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch 203d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch ret = tps65217_reg_read(tps, TPS65217_REG_CHIPID, &version); 204d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch if (ret < 0) { 2050ef4619c74ef1e24e9ee340f95ee922f970cde54Axel Lin dev_err(tps->dev, "Failed to read revision register: %d\n", 2060ef4619c74ef1e24e9ee340f95ee922f970cde54Axel Lin ret); 2070ef4619c74ef1e24e9ee340f95ee922f970cde54Axel Lin return ret; 208d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch } 209d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch 210d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch dev_info(tps->dev, "TPS65217 ID %#x version 1.%d\n", 211d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch (version & TPS65217_CHIPID_CHIP_MASK) >> 4, 212d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch version & TPS65217_CHIPID_REV_MASK); 213d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch 214d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch return 0; 215d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch} 216d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch 217d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Chstatic int __devexit tps65217_remove(struct i2c_client *client) 218d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch{ 219d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch struct tps65217 *tps = i2c_get_clientdata(client); 220d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch 221817bb7fbfb0a1ad5f9d475cef0752d4ec5fdeac2AnilKumar Ch mfd_remove_devices(tps->dev); 222d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch 223d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch return 0; 224d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch} 225d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch 226d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Chstatic const struct i2c_device_id tps65217_id_table[] = { 227817bb7fbfb0a1ad5f9d475cef0752d4ec5fdeac2AnilKumar Ch {"tps65217", TPS65217}, 228817bb7fbfb0a1ad5f9d475cef0752d4ec5fdeac2AnilKumar Ch { /* sentinel */ } 229d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch}; 230d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar ChMODULE_DEVICE_TABLE(i2c, tps65217_id_table); 231d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch 232d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Chstatic struct i2c_driver tps65217_driver = { 233d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch .driver = { 234d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch .name = "tps65217", 235a7f1b63eb85606ad77a559b95c703b99e1205aa4AnilKumar Ch .owner = THIS_MODULE, 236a7f1b63eb85606ad77a559b95c703b99e1205aa4AnilKumar Ch .of_match_table = of_match_ptr(tps65217_of_match), 237d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch }, 238d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch .id_table = tps65217_id_table, 239d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch .probe = tps65217_probe, 24084449216b01f9c2b4c9b1882f9d6abba07b7b7caBill Pemberton .remove = tps65217_remove, 241d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch}; 242d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch 243d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Chstatic int __init tps65217_init(void) 244d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch{ 245d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch return i2c_add_driver(&tps65217_driver); 246d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch} 247d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Chsubsys_initcall(tps65217_init); 248d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch 249d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Chstatic void __exit tps65217_exit(void) 250d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch{ 251d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch i2c_del_driver(&tps65217_driver); 252d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch} 253d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Chmodule_exit(tps65217_exit); 254d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar Ch 255d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar ChMODULE_AUTHOR("AnilKumar Ch <anilkumar@ti.com>"); 256d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar ChMODULE_DESCRIPTION("TPS65217 chip family multi-function driver"); 257d48f411c10f2badaf88e6050cd3d3acd52197356AnilKumar ChMODULE_LICENSE("GPL v2"); 258