0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #include <linux/device.h>
0011 #include <linux/err.h>
0012 #include <linux/init.h>
0013 #include <linux/interrupt.h>
0014 #include <linux/i2c.h>
0015 #include <linux/irq.h>
0016 #include <linux/irqdomain.h>
0017 #include <linux/kernel.h>
0018 #include <linux/module.h>
0019 #include <linux/of.h>
0020 #include <linux/of_device.h>
0021 #include <linux/platform_device.h>
0022 #include <linux/regmap.h>
0023 #include <linux/slab.h>
0024
0025 #include <linux/mfd/core.h>
0026 #include <linux/mfd/tps65217.h>
0027
0028 static const struct resource charger_resources[] = {
0029 DEFINE_RES_IRQ_NAMED(TPS65217_IRQ_AC, "AC"),
0030 DEFINE_RES_IRQ_NAMED(TPS65217_IRQ_USB, "USB"),
0031 };
0032
0033 static const struct resource pb_resources[] = {
0034 DEFINE_RES_IRQ_NAMED(TPS65217_IRQ_PB, "PB"),
0035 };
0036
0037 static void tps65217_irq_lock(struct irq_data *data)
0038 {
0039 struct tps65217 *tps = irq_data_get_irq_chip_data(data);
0040
0041 mutex_lock(&tps->irq_lock);
0042 }
0043
0044 static void tps65217_irq_sync_unlock(struct irq_data *data)
0045 {
0046 struct tps65217 *tps = irq_data_get_irq_chip_data(data);
0047 int ret;
0048
0049 ret = tps65217_set_bits(tps, TPS65217_REG_INT, TPS65217_INT_MASK,
0050 tps->irq_mask, TPS65217_PROTECT_NONE);
0051 if (ret != 0)
0052 dev_err(tps->dev, "Failed to sync IRQ masks\n");
0053
0054 mutex_unlock(&tps->irq_lock);
0055 }
0056
0057 static void tps65217_irq_enable(struct irq_data *data)
0058 {
0059 struct tps65217 *tps = irq_data_get_irq_chip_data(data);
0060 u8 mask = BIT(data->hwirq) << TPS65217_INT_SHIFT;
0061
0062 tps->irq_mask &= ~mask;
0063 }
0064
0065 static void tps65217_irq_disable(struct irq_data *data)
0066 {
0067 struct tps65217 *tps = irq_data_get_irq_chip_data(data);
0068 u8 mask = BIT(data->hwirq) << TPS65217_INT_SHIFT;
0069
0070 tps->irq_mask |= mask;
0071 }
0072
0073 static struct irq_chip tps65217_irq_chip = {
0074 .name = "tps65217",
0075 .irq_bus_lock = tps65217_irq_lock,
0076 .irq_bus_sync_unlock = tps65217_irq_sync_unlock,
0077 .irq_enable = tps65217_irq_enable,
0078 .irq_disable = tps65217_irq_disable,
0079 };
0080
0081 static struct mfd_cell tps65217s[] = {
0082 {
0083 .name = "tps65217-pmic",
0084 .of_compatible = "ti,tps65217-pmic",
0085 },
0086 {
0087 .name = "tps65217-bl",
0088 .of_compatible = "ti,tps65217-bl",
0089 },
0090 {
0091 .name = "tps65217-charger",
0092 .num_resources = ARRAY_SIZE(charger_resources),
0093 .resources = charger_resources,
0094 .of_compatible = "ti,tps65217-charger",
0095 },
0096 {
0097 .name = "tps65217-pwrbutton",
0098 .num_resources = ARRAY_SIZE(pb_resources),
0099 .resources = pb_resources,
0100 .of_compatible = "ti,tps65217-pwrbutton",
0101 },
0102 };
0103
0104 static irqreturn_t tps65217_irq_thread(int irq, void *data)
0105 {
0106 struct tps65217 *tps = data;
0107 unsigned int status;
0108 bool handled = false;
0109 int i;
0110 int ret;
0111
0112 ret = tps65217_reg_read(tps, TPS65217_REG_INT, &status);
0113 if (ret < 0) {
0114 dev_err(tps->dev, "Failed to read IRQ status: %d\n",
0115 ret);
0116 return IRQ_NONE;
0117 }
0118
0119 for (i = 0; i < TPS65217_NUM_IRQ; i++) {
0120 if (status & BIT(i)) {
0121 handle_nested_irq(irq_find_mapping(tps->irq_domain, i));
0122 handled = true;
0123 }
0124 }
0125
0126 if (handled)
0127 return IRQ_HANDLED;
0128
0129 return IRQ_NONE;
0130 }
0131
0132 static int tps65217_irq_map(struct irq_domain *h, unsigned int virq,
0133 irq_hw_number_t hw)
0134 {
0135 struct tps65217 *tps = h->host_data;
0136
0137 irq_set_chip_data(virq, tps);
0138 irq_set_chip_and_handler(virq, &tps65217_irq_chip, handle_edge_irq);
0139 irq_set_nested_thread(virq, 1);
0140 irq_set_parent(virq, tps->irq);
0141 irq_set_noprobe(virq);
0142
0143 return 0;
0144 }
0145
0146 static const struct irq_domain_ops tps65217_irq_domain_ops = {
0147 .map = tps65217_irq_map,
0148 };
0149
0150 static int tps65217_irq_init(struct tps65217 *tps, int irq)
0151 {
0152 int ret;
0153
0154 mutex_init(&tps->irq_lock);
0155 tps->irq = irq;
0156
0157
0158 tps->irq_mask = TPS65217_INT_MASK;
0159 tps65217_set_bits(tps, TPS65217_REG_INT, TPS65217_INT_MASK,
0160 TPS65217_INT_MASK, TPS65217_PROTECT_NONE);
0161
0162 tps->irq_domain = irq_domain_add_linear(tps->dev->of_node,
0163 TPS65217_NUM_IRQ, &tps65217_irq_domain_ops, tps);
0164 if (!tps->irq_domain) {
0165 dev_err(tps->dev, "Could not create IRQ domain\n");
0166 return -ENOMEM;
0167 }
0168
0169 ret = devm_request_threaded_irq(tps->dev, irq, NULL,
0170 tps65217_irq_thread, IRQF_ONESHOT,
0171 "tps65217-irq", tps);
0172 if (ret) {
0173 dev_err(tps->dev, "Failed to request IRQ %d: %d\n",
0174 irq, ret);
0175 return ret;
0176 }
0177
0178 enable_irq_wake(irq);
0179
0180 return 0;
0181 }
0182
0183
0184
0185
0186
0187
0188
0189
0190 int tps65217_reg_read(struct tps65217 *tps, unsigned int reg,
0191 unsigned int *val)
0192 {
0193 return regmap_read(tps->regmap, reg, val);
0194 }
0195 EXPORT_SYMBOL_GPL(tps65217_reg_read);
0196
0197
0198
0199
0200
0201
0202
0203
0204
0205 int tps65217_reg_write(struct tps65217 *tps, unsigned int reg,
0206 unsigned int val, unsigned int level)
0207 {
0208 int ret;
0209 unsigned int xor_reg_val;
0210
0211 switch (level) {
0212 case TPS65217_PROTECT_NONE:
0213 return regmap_write(tps->regmap, reg, val);
0214 case TPS65217_PROTECT_L1:
0215 xor_reg_val = reg ^ TPS65217_PASSWORD_REGS_UNLOCK;
0216 ret = regmap_write(tps->regmap, TPS65217_REG_PASSWORD,
0217 xor_reg_val);
0218 if (ret < 0)
0219 return ret;
0220
0221 return regmap_write(tps->regmap, reg, val);
0222 case TPS65217_PROTECT_L2:
0223 xor_reg_val = reg ^ TPS65217_PASSWORD_REGS_UNLOCK;
0224 ret = regmap_write(tps->regmap, TPS65217_REG_PASSWORD,
0225 xor_reg_val);
0226 if (ret < 0)
0227 return ret;
0228 ret = regmap_write(tps->regmap, reg, val);
0229 if (ret < 0)
0230 return ret;
0231 ret = regmap_write(tps->regmap, TPS65217_REG_PASSWORD,
0232 xor_reg_val);
0233 if (ret < 0)
0234 return ret;
0235 return regmap_write(tps->regmap, reg, val);
0236 default:
0237 return -EINVAL;
0238 }
0239 }
0240 EXPORT_SYMBOL_GPL(tps65217_reg_write);
0241
0242
0243
0244
0245
0246
0247
0248
0249
0250
0251 static int tps65217_update_bits(struct tps65217 *tps, unsigned int reg,
0252 unsigned int mask, unsigned int val, unsigned int level)
0253 {
0254 int ret;
0255 unsigned int data;
0256
0257 ret = tps65217_reg_read(tps, reg, &data);
0258 if (ret) {
0259 dev_err(tps->dev, "Read from reg 0x%x failed\n", reg);
0260 return ret;
0261 }
0262
0263 data &= ~mask;
0264 data |= val & mask;
0265
0266 ret = tps65217_reg_write(tps, reg, data, level);
0267 if (ret)
0268 dev_err(tps->dev, "Write for reg 0x%x failed\n", reg);
0269
0270 return ret;
0271 }
0272
0273 int tps65217_set_bits(struct tps65217 *tps, unsigned int reg,
0274 unsigned int mask, unsigned int val, unsigned int level)
0275 {
0276 return tps65217_update_bits(tps, reg, mask, val, level);
0277 }
0278 EXPORT_SYMBOL_GPL(tps65217_set_bits);
0279
0280 int tps65217_clear_bits(struct tps65217 *tps, unsigned int reg,
0281 unsigned int mask, unsigned int level)
0282 {
0283 return tps65217_update_bits(tps, reg, mask, 0, level);
0284 }
0285 EXPORT_SYMBOL_GPL(tps65217_clear_bits);
0286
0287 static bool tps65217_volatile_reg(struct device *dev, unsigned int reg)
0288 {
0289 switch (reg) {
0290 case TPS65217_REG_INT:
0291 return true;
0292 default:
0293 return false;
0294 }
0295 }
0296
0297 static const struct regmap_config tps65217_regmap_config = {
0298 .reg_bits = 8,
0299 .val_bits = 8,
0300
0301 .max_register = TPS65217_REG_MAX,
0302 .volatile_reg = tps65217_volatile_reg,
0303 };
0304
0305 static const struct of_device_id tps65217_of_match[] = {
0306 { .compatible = "ti,tps65217"},
0307 { },
0308 };
0309 MODULE_DEVICE_TABLE(of, tps65217_of_match);
0310
0311 static int tps65217_probe(struct i2c_client *client)
0312 {
0313 struct tps65217 *tps;
0314 unsigned int version;
0315 bool status_off = false;
0316 int ret;
0317
0318 status_off = of_property_read_bool(client->dev.of_node,
0319 "ti,pmic-shutdown-controller");
0320
0321 tps = devm_kzalloc(&client->dev, sizeof(*tps), GFP_KERNEL);
0322 if (!tps)
0323 return -ENOMEM;
0324
0325 i2c_set_clientdata(client, tps);
0326 tps->dev = &client->dev;
0327
0328 tps->regmap = devm_regmap_init_i2c(client, &tps65217_regmap_config);
0329 if (IS_ERR(tps->regmap)) {
0330 ret = PTR_ERR(tps->regmap);
0331 dev_err(tps->dev, "Failed to allocate register map: %d\n",
0332 ret);
0333 return ret;
0334 }
0335
0336 if (client->irq) {
0337 tps65217_irq_init(tps, client->irq);
0338 } else {
0339 int i;
0340
0341
0342 for (i = 0; i < ARRAY_SIZE(tps65217s); i++)
0343 tps65217s[i].num_resources = 0;
0344 }
0345
0346 ret = devm_mfd_add_devices(tps->dev, -1, tps65217s,
0347 ARRAY_SIZE(tps65217s), NULL, 0,
0348 tps->irq_domain);
0349 if (ret < 0) {
0350 dev_err(tps->dev, "mfd_add_devices failed: %d\n", ret);
0351 return ret;
0352 }
0353
0354 ret = tps65217_reg_read(tps, TPS65217_REG_CHIPID, &version);
0355 if (ret < 0) {
0356 dev_err(tps->dev, "Failed to read revision register: %d\n",
0357 ret);
0358 return ret;
0359 }
0360
0361
0362 if (status_off) {
0363 ret = tps65217_set_bits(tps, TPS65217_REG_STATUS,
0364 TPS65217_STATUS_OFF, TPS65217_STATUS_OFF,
0365 TPS65217_PROTECT_NONE);
0366 if (ret)
0367 dev_warn(tps->dev, "unable to set the status OFF\n");
0368 }
0369
0370 dev_info(tps->dev, "TPS65217 ID %#x version 1.%d\n",
0371 (version & TPS65217_CHIPID_CHIP_MASK) >> 4,
0372 version & TPS65217_CHIPID_REV_MASK);
0373
0374 return 0;
0375 }
0376
0377 static int tps65217_remove(struct i2c_client *client)
0378 {
0379 struct tps65217 *tps = i2c_get_clientdata(client);
0380 unsigned int virq;
0381 int i;
0382
0383 for (i = 0; i < TPS65217_NUM_IRQ; i++) {
0384 virq = irq_find_mapping(tps->irq_domain, i);
0385 if (virq)
0386 irq_dispose_mapping(virq);
0387 }
0388
0389 irq_domain_remove(tps->irq_domain);
0390 tps->irq_domain = NULL;
0391
0392 return 0;
0393 }
0394
0395 static const struct i2c_device_id tps65217_id_table[] = {
0396 {"tps65217", TPS65217},
0397 { }
0398 };
0399 MODULE_DEVICE_TABLE(i2c, tps65217_id_table);
0400
0401 static struct i2c_driver tps65217_driver = {
0402 .driver = {
0403 .name = "tps65217",
0404 .of_match_table = tps65217_of_match,
0405 },
0406 .id_table = tps65217_id_table,
0407 .probe_new = tps65217_probe,
0408 .remove = tps65217_remove,
0409 };
0410
0411 static int __init tps65217_init(void)
0412 {
0413 return i2c_add_driver(&tps65217_driver);
0414 }
0415 subsys_initcall(tps65217_init);
0416
0417 static void __exit tps65217_exit(void)
0418 {
0419 i2c_del_driver(&tps65217_driver);
0420 }
0421 module_exit(tps65217_exit);
0422
0423 MODULE_AUTHOR("AnilKumar Ch <anilkumar@ti.com>");
0424 MODULE_DESCRIPTION("TPS65217 chip family multi-function driver");
0425 MODULE_LICENSE("GPL v2");