0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #include <linux/module.h>
0011 #include <linux/moduleparam.h>
0012 #include <linux/init.h>
0013 #include <linux/slab.h>
0014 #include <linux/i2c.h>
0015 #include <linux/interrupt.h>
0016 #include <linux/irq.h>
0017 #include <linux/regmap.h>
0018 #include <linux/err.h>
0019 #include <linux/mfd/core.h>
0020 #include <linux/mfd/palmas.h>
0021 #include <linux/of_device.h>
0022
0023 static const struct regmap_config palmas_regmap_config[PALMAS_NUM_CLIENTS] = {
0024 {
0025 .reg_bits = 8,
0026 .val_bits = 8,
0027 .max_register = PALMAS_BASE_TO_REG(PALMAS_PU_PD_OD_BASE,
0028 PALMAS_PRIMARY_SECONDARY_PAD3),
0029 },
0030 {
0031 .reg_bits = 8,
0032 .val_bits = 8,
0033 .max_register = PALMAS_BASE_TO_REG(PALMAS_GPADC_BASE,
0034 PALMAS_GPADC_SMPS_VSEL_MONITORING),
0035 },
0036 {
0037 .reg_bits = 8,
0038 .val_bits = 8,
0039 .max_register = PALMAS_BASE_TO_REG(PALMAS_TRIM_GPADC_BASE,
0040 PALMAS_GPADC_TRIM16),
0041 },
0042 };
0043
0044 static const struct regmap_irq tps65917_irqs[] = {
0045
0046 [TPS65917_RESERVED1] = {
0047 .mask = TPS65917_RESERVED,
0048 },
0049 [TPS65917_PWRON_IRQ] = {
0050 .mask = TPS65917_INT1_STATUS_PWRON,
0051 },
0052 [TPS65917_LONG_PRESS_KEY_IRQ] = {
0053 .mask = TPS65917_INT1_STATUS_LONG_PRESS_KEY,
0054 },
0055 [TPS65917_RESERVED2] = {
0056 .mask = TPS65917_RESERVED,
0057 },
0058 [TPS65917_PWRDOWN_IRQ] = {
0059 .mask = TPS65917_INT1_STATUS_PWRDOWN,
0060 },
0061 [TPS65917_HOTDIE_IRQ] = {
0062 .mask = TPS65917_INT1_STATUS_HOTDIE,
0063 },
0064 [TPS65917_VSYS_MON_IRQ] = {
0065 .mask = TPS65917_INT1_STATUS_VSYS_MON,
0066 },
0067 [TPS65917_RESERVED3] = {
0068 .mask = TPS65917_RESERVED,
0069 },
0070
0071 [TPS65917_RESERVED4] = {
0072 .mask = TPS65917_RESERVED,
0073 .reg_offset = 1,
0074 },
0075 [TPS65917_OTP_ERROR_IRQ] = {
0076 .mask = TPS65917_INT2_STATUS_OTP_ERROR,
0077 .reg_offset = 1,
0078 },
0079 [TPS65917_WDT_IRQ] = {
0080 .mask = TPS65917_INT2_STATUS_WDT,
0081 .reg_offset = 1,
0082 },
0083 [TPS65917_RESERVED5] = {
0084 .mask = TPS65917_RESERVED,
0085 .reg_offset = 1,
0086 },
0087 [TPS65917_RESET_IN_IRQ] = {
0088 .mask = TPS65917_INT2_STATUS_RESET_IN,
0089 .reg_offset = 1,
0090 },
0091 [TPS65917_FSD_IRQ] = {
0092 .mask = TPS65917_INT2_STATUS_FSD,
0093 .reg_offset = 1,
0094 },
0095 [TPS65917_SHORT_IRQ] = {
0096 .mask = TPS65917_INT2_STATUS_SHORT,
0097 .reg_offset = 1,
0098 },
0099 [TPS65917_RESERVED6] = {
0100 .mask = TPS65917_RESERVED,
0101 .reg_offset = 1,
0102 },
0103
0104 [TPS65917_GPADC_AUTO_0_IRQ] = {
0105 .mask = TPS65917_INT3_STATUS_GPADC_AUTO_0,
0106 .reg_offset = 2,
0107 },
0108 [TPS65917_GPADC_AUTO_1_IRQ] = {
0109 .mask = TPS65917_INT3_STATUS_GPADC_AUTO_1,
0110 .reg_offset = 2,
0111 },
0112 [TPS65917_GPADC_EOC_SW_IRQ] = {
0113 .mask = TPS65917_INT3_STATUS_GPADC_EOC_SW,
0114 .reg_offset = 2,
0115 },
0116 [TPS65917_RESREVED6] = {
0117 .mask = TPS65917_RESERVED6,
0118 .reg_offset = 2,
0119 },
0120 [TPS65917_RESERVED7] = {
0121 .mask = TPS65917_RESERVED,
0122 .reg_offset = 2,
0123 },
0124 [TPS65917_RESERVED8] = {
0125 .mask = TPS65917_RESERVED,
0126 .reg_offset = 2,
0127 },
0128 [TPS65917_RESERVED9] = {
0129 .mask = TPS65917_RESERVED,
0130 .reg_offset = 2,
0131 },
0132 [TPS65917_VBUS_IRQ] = {
0133 .mask = TPS65917_INT3_STATUS_VBUS,
0134 .reg_offset = 2,
0135 },
0136
0137 [TPS65917_GPIO_0_IRQ] = {
0138 .mask = TPS65917_INT4_STATUS_GPIO_0,
0139 .reg_offset = 3,
0140 },
0141 [TPS65917_GPIO_1_IRQ] = {
0142 .mask = TPS65917_INT4_STATUS_GPIO_1,
0143 .reg_offset = 3,
0144 },
0145 [TPS65917_GPIO_2_IRQ] = {
0146 .mask = TPS65917_INT4_STATUS_GPIO_2,
0147 .reg_offset = 3,
0148 },
0149 [TPS65917_GPIO_3_IRQ] = {
0150 .mask = TPS65917_INT4_STATUS_GPIO_3,
0151 .reg_offset = 3,
0152 },
0153 [TPS65917_GPIO_4_IRQ] = {
0154 .mask = TPS65917_INT4_STATUS_GPIO_4,
0155 .reg_offset = 3,
0156 },
0157 [TPS65917_GPIO_5_IRQ] = {
0158 .mask = TPS65917_INT4_STATUS_GPIO_5,
0159 .reg_offset = 3,
0160 },
0161 [TPS65917_GPIO_6_IRQ] = {
0162 .mask = TPS65917_INT4_STATUS_GPIO_6,
0163 .reg_offset = 3,
0164 },
0165 [TPS65917_RESERVED10] = {
0166 .mask = TPS65917_RESERVED10,
0167 .reg_offset = 3,
0168 },
0169 };
0170
0171 static const struct regmap_irq palmas_irqs[] = {
0172
0173 [PALMAS_CHARG_DET_N_VBUS_OVV_IRQ] = {
0174 .mask = PALMAS_INT1_STATUS_CHARG_DET_N_VBUS_OVV,
0175 },
0176 [PALMAS_PWRON_IRQ] = {
0177 .mask = PALMAS_INT1_STATUS_PWRON,
0178 },
0179 [PALMAS_LONG_PRESS_KEY_IRQ] = {
0180 .mask = PALMAS_INT1_STATUS_LONG_PRESS_KEY,
0181 },
0182 [PALMAS_RPWRON_IRQ] = {
0183 .mask = PALMAS_INT1_STATUS_RPWRON,
0184 },
0185 [PALMAS_PWRDOWN_IRQ] = {
0186 .mask = PALMAS_INT1_STATUS_PWRDOWN,
0187 },
0188 [PALMAS_HOTDIE_IRQ] = {
0189 .mask = PALMAS_INT1_STATUS_HOTDIE,
0190 },
0191 [PALMAS_VSYS_MON_IRQ] = {
0192 .mask = PALMAS_INT1_STATUS_VSYS_MON,
0193 },
0194 [PALMAS_VBAT_MON_IRQ] = {
0195 .mask = PALMAS_INT1_STATUS_VBAT_MON,
0196 },
0197
0198 [PALMAS_RTC_ALARM_IRQ] = {
0199 .mask = PALMAS_INT2_STATUS_RTC_ALARM,
0200 .reg_offset = 1,
0201 },
0202 [PALMAS_RTC_TIMER_IRQ] = {
0203 .mask = PALMAS_INT2_STATUS_RTC_TIMER,
0204 .reg_offset = 1,
0205 },
0206 [PALMAS_WDT_IRQ] = {
0207 .mask = PALMAS_INT2_STATUS_WDT,
0208 .reg_offset = 1,
0209 },
0210 [PALMAS_BATREMOVAL_IRQ] = {
0211 .mask = PALMAS_INT2_STATUS_BATREMOVAL,
0212 .reg_offset = 1,
0213 },
0214 [PALMAS_RESET_IN_IRQ] = {
0215 .mask = PALMAS_INT2_STATUS_RESET_IN,
0216 .reg_offset = 1,
0217 },
0218 [PALMAS_FBI_BB_IRQ] = {
0219 .mask = PALMAS_INT2_STATUS_FBI_BB,
0220 .reg_offset = 1,
0221 },
0222 [PALMAS_SHORT_IRQ] = {
0223 .mask = PALMAS_INT2_STATUS_SHORT,
0224 .reg_offset = 1,
0225 },
0226 [PALMAS_VAC_ACOK_IRQ] = {
0227 .mask = PALMAS_INT2_STATUS_VAC_ACOK,
0228 .reg_offset = 1,
0229 },
0230
0231 [PALMAS_GPADC_AUTO_0_IRQ] = {
0232 .mask = PALMAS_INT3_STATUS_GPADC_AUTO_0,
0233 .reg_offset = 2,
0234 },
0235 [PALMAS_GPADC_AUTO_1_IRQ] = {
0236 .mask = PALMAS_INT3_STATUS_GPADC_AUTO_1,
0237 .reg_offset = 2,
0238 },
0239 [PALMAS_GPADC_EOC_SW_IRQ] = {
0240 .mask = PALMAS_INT3_STATUS_GPADC_EOC_SW,
0241 .reg_offset = 2,
0242 },
0243 [PALMAS_GPADC_EOC_RT_IRQ] = {
0244 .mask = PALMAS_INT3_STATUS_GPADC_EOC_RT,
0245 .reg_offset = 2,
0246 },
0247 [PALMAS_ID_OTG_IRQ] = {
0248 .mask = PALMAS_INT3_STATUS_ID_OTG,
0249 .reg_offset = 2,
0250 },
0251 [PALMAS_ID_IRQ] = {
0252 .mask = PALMAS_INT3_STATUS_ID,
0253 .reg_offset = 2,
0254 },
0255 [PALMAS_VBUS_OTG_IRQ] = {
0256 .mask = PALMAS_INT3_STATUS_VBUS_OTG,
0257 .reg_offset = 2,
0258 },
0259 [PALMAS_VBUS_IRQ] = {
0260 .mask = PALMAS_INT3_STATUS_VBUS,
0261 .reg_offset = 2,
0262 },
0263
0264 [PALMAS_GPIO_0_IRQ] = {
0265 .mask = PALMAS_INT4_STATUS_GPIO_0,
0266 .reg_offset = 3,
0267 },
0268 [PALMAS_GPIO_1_IRQ] = {
0269 .mask = PALMAS_INT4_STATUS_GPIO_1,
0270 .reg_offset = 3,
0271 },
0272 [PALMAS_GPIO_2_IRQ] = {
0273 .mask = PALMAS_INT4_STATUS_GPIO_2,
0274 .reg_offset = 3,
0275 },
0276 [PALMAS_GPIO_3_IRQ] = {
0277 .mask = PALMAS_INT4_STATUS_GPIO_3,
0278 .reg_offset = 3,
0279 },
0280 [PALMAS_GPIO_4_IRQ] = {
0281 .mask = PALMAS_INT4_STATUS_GPIO_4,
0282 .reg_offset = 3,
0283 },
0284 [PALMAS_GPIO_5_IRQ] = {
0285 .mask = PALMAS_INT4_STATUS_GPIO_5,
0286 .reg_offset = 3,
0287 },
0288 [PALMAS_GPIO_6_IRQ] = {
0289 .mask = PALMAS_INT4_STATUS_GPIO_6,
0290 .reg_offset = 3,
0291 },
0292 [PALMAS_GPIO_7_IRQ] = {
0293 .mask = PALMAS_INT4_STATUS_GPIO_7,
0294 .reg_offset = 3,
0295 },
0296 };
0297
0298 static struct regmap_irq_chip palmas_irq_chip = {
0299 .name = "palmas",
0300 .irqs = palmas_irqs,
0301 .num_irqs = ARRAY_SIZE(palmas_irqs),
0302
0303 .num_regs = 4,
0304 .irq_reg_stride = 5,
0305 .status_base = PALMAS_BASE_TO_REG(PALMAS_INTERRUPT_BASE,
0306 PALMAS_INT1_STATUS),
0307 .mask_base = PALMAS_BASE_TO_REG(PALMAS_INTERRUPT_BASE,
0308 PALMAS_INT1_MASK),
0309 };
0310
0311 static struct regmap_irq_chip tps65917_irq_chip = {
0312 .name = "tps65917",
0313 .irqs = tps65917_irqs,
0314 .num_irqs = ARRAY_SIZE(tps65917_irqs),
0315
0316 .num_regs = 4,
0317 .irq_reg_stride = 5,
0318 .status_base = PALMAS_BASE_TO_REG(PALMAS_INTERRUPT_BASE,
0319 PALMAS_INT1_STATUS),
0320 .mask_base = PALMAS_BASE_TO_REG(PALMAS_INTERRUPT_BASE,
0321 PALMAS_INT1_MASK),
0322 };
0323
0324 int palmas_ext_control_req_config(struct palmas *palmas,
0325 enum palmas_external_requestor_id id, int ext_ctrl, bool enable)
0326 {
0327 struct palmas_pmic_driver_data *pmic_ddata = palmas->pmic_ddata;
0328 int preq_mask_bit = 0;
0329 int reg_add = 0;
0330 int bit_pos, ret;
0331
0332 if (!(ext_ctrl & PALMAS_EXT_REQ))
0333 return 0;
0334
0335 if (id >= PALMAS_EXTERNAL_REQSTR_ID_MAX)
0336 return 0;
0337
0338 if (ext_ctrl & PALMAS_EXT_CONTROL_NSLEEP) {
0339 reg_add = PALMAS_NSLEEP_RES_ASSIGN;
0340 preq_mask_bit = 0;
0341 } else if (ext_ctrl & PALMAS_EXT_CONTROL_ENABLE1) {
0342 reg_add = PALMAS_ENABLE1_RES_ASSIGN;
0343 preq_mask_bit = 1;
0344 } else if (ext_ctrl & PALMAS_EXT_CONTROL_ENABLE2) {
0345 reg_add = PALMAS_ENABLE2_RES_ASSIGN;
0346 preq_mask_bit = 2;
0347 }
0348
0349 bit_pos = pmic_ddata->sleep_req_info[id].bit_pos;
0350 reg_add += pmic_ddata->sleep_req_info[id].reg_offset;
0351 if (enable)
0352 ret = palmas_update_bits(palmas, PALMAS_RESOURCE_BASE,
0353 reg_add, BIT(bit_pos), BIT(bit_pos));
0354 else
0355 ret = palmas_update_bits(palmas, PALMAS_RESOURCE_BASE,
0356 reg_add, BIT(bit_pos), 0);
0357 if (ret < 0) {
0358 dev_err(palmas->dev, "Resource reg 0x%02x update failed %d\n",
0359 reg_add, ret);
0360 return ret;
0361 }
0362
0363
0364 ret = palmas_update_bits(palmas, PALMAS_PMU_CONTROL_BASE,
0365 PALMAS_POWER_CTRL, BIT(preq_mask_bit), 0);
0366 if (ret < 0) {
0367 dev_err(palmas->dev, "POWER_CTRL register update failed %d\n",
0368 ret);
0369 return ret;
0370 }
0371 return ret;
0372 }
0373 EXPORT_SYMBOL_GPL(palmas_ext_control_req_config);
0374
0375 static int palmas_set_pdata_irq_flag(struct i2c_client *i2c,
0376 struct palmas_platform_data *pdata)
0377 {
0378 struct irq_data *irq_data = irq_get_irq_data(i2c->irq);
0379 if (!irq_data) {
0380 dev_err(&i2c->dev, "Invalid IRQ: %d\n", i2c->irq);
0381 return -EINVAL;
0382 }
0383
0384 pdata->irq_flags = irqd_get_trigger_type(irq_data);
0385 dev_info(&i2c->dev, "Irq flag is 0x%08x\n", pdata->irq_flags);
0386 return 0;
0387 }
0388
0389 static void palmas_dt_to_pdata(struct i2c_client *i2c,
0390 struct palmas_platform_data *pdata)
0391 {
0392 struct device_node *node = i2c->dev.of_node;
0393 int ret;
0394 u32 prop;
0395
0396 ret = of_property_read_u32(node, "ti,mux-pad1", &prop);
0397 if (!ret) {
0398 pdata->mux_from_pdata = 1;
0399 pdata->pad1 = prop;
0400 }
0401
0402 ret = of_property_read_u32(node, "ti,mux-pad2", &prop);
0403 if (!ret) {
0404 pdata->mux_from_pdata = 1;
0405 pdata->pad2 = prop;
0406 }
0407
0408
0409 ret = of_property_read_u32(node, "ti,power-ctrl", &prop);
0410 if (!ret)
0411 pdata->power_ctrl = prop;
0412 else
0413 pdata->power_ctrl = PALMAS_POWER_CTRL_NSLEEP_MASK |
0414 PALMAS_POWER_CTRL_ENABLE1_MASK |
0415 PALMAS_POWER_CTRL_ENABLE2_MASK;
0416 if (i2c->irq)
0417 palmas_set_pdata_irq_flag(i2c, pdata);
0418
0419 pdata->pm_off = of_property_read_bool(node,
0420 "ti,system-power-controller");
0421 }
0422
0423 static struct palmas *palmas_dev;
0424 static void palmas_power_off(void)
0425 {
0426 unsigned int addr;
0427 int ret, slave;
0428 u8 powerhold_mask;
0429 struct device_node *np = palmas_dev->dev->of_node;
0430
0431 if (of_property_read_bool(np, "ti,palmas-override-powerhold")) {
0432 addr = PALMAS_BASE_TO_REG(PALMAS_PU_PD_OD_BASE,
0433 PALMAS_PRIMARY_SECONDARY_PAD2);
0434 slave = PALMAS_BASE_TO_SLAVE(PALMAS_PU_PD_OD_BASE);
0435
0436 if (of_device_is_compatible(np, "ti,tps65917"))
0437 powerhold_mask =
0438 TPS65917_PRIMARY_SECONDARY_PAD2_GPIO_5_MASK;
0439 else
0440 powerhold_mask =
0441 PALMAS_PRIMARY_SECONDARY_PAD2_GPIO_7_MASK;
0442
0443 ret = regmap_update_bits(palmas_dev->regmap[slave], addr,
0444 powerhold_mask, 0);
0445 if (ret)
0446 dev_err(palmas_dev->dev,
0447 "Unable to write PRIMARY_SECONDARY_PAD2 %d\n",
0448 ret);
0449 }
0450
0451 slave = PALMAS_BASE_TO_SLAVE(PALMAS_PMU_CONTROL_BASE);
0452 addr = PALMAS_BASE_TO_REG(PALMAS_PMU_CONTROL_BASE, PALMAS_DEV_CTRL);
0453
0454 ret = regmap_update_bits(
0455 palmas_dev->regmap[slave],
0456 addr,
0457 PALMAS_DEV_CTRL_DEV_ON,
0458 0);
0459
0460 if (ret)
0461 pr_err("%s: Unable to write to DEV_CTRL_DEV_ON: %d\n",
0462 __func__, ret);
0463 }
0464
0465 static unsigned int palmas_features = PALMAS_PMIC_FEATURE_SMPS10_BOOST;
0466 static unsigned int tps659038_features;
0467
0468 struct palmas_driver_data {
0469 unsigned int *features;
0470 struct regmap_irq_chip *irq_chip;
0471 };
0472
0473 static struct palmas_driver_data palmas_data = {
0474 .features = &palmas_features,
0475 .irq_chip = &palmas_irq_chip,
0476 };
0477
0478 static struct palmas_driver_data tps659038_data = {
0479 .features = &tps659038_features,
0480 .irq_chip = &palmas_irq_chip,
0481 };
0482
0483 static struct palmas_driver_data tps65917_data = {
0484 .features = &tps659038_features,
0485 .irq_chip = &tps65917_irq_chip,
0486 };
0487
0488 static const struct of_device_id of_palmas_match_tbl[] = {
0489 {
0490 .compatible = "ti,palmas",
0491 .data = &palmas_data,
0492 },
0493 {
0494 .compatible = "ti,tps659038",
0495 .data = &tps659038_data,
0496 },
0497 {
0498 .compatible = "ti,tps65917",
0499 .data = &tps65917_data,
0500 },
0501 { },
0502 };
0503 MODULE_DEVICE_TABLE(of, of_palmas_match_tbl);
0504
0505 static int palmas_i2c_probe(struct i2c_client *i2c,
0506 const struct i2c_device_id *id)
0507 {
0508 struct palmas *palmas;
0509 struct palmas_platform_data *pdata;
0510 struct palmas_driver_data *driver_data;
0511 struct device_node *node = i2c->dev.of_node;
0512 int ret = 0, i;
0513 unsigned int reg, addr;
0514 int slave;
0515 const struct of_device_id *match;
0516
0517 pdata = dev_get_platdata(&i2c->dev);
0518
0519 if (node && !pdata) {
0520 pdata = devm_kzalloc(&i2c->dev, sizeof(*pdata), GFP_KERNEL);
0521
0522 if (!pdata)
0523 return -ENOMEM;
0524
0525 palmas_dt_to_pdata(i2c, pdata);
0526 }
0527
0528 if (!pdata)
0529 return -EINVAL;
0530
0531 palmas = devm_kzalloc(&i2c->dev, sizeof(struct palmas), GFP_KERNEL);
0532 if (palmas == NULL)
0533 return -ENOMEM;
0534
0535 i2c_set_clientdata(i2c, palmas);
0536 palmas->dev = &i2c->dev;
0537 palmas->irq = i2c->irq;
0538
0539 match = of_match_device(of_palmas_match_tbl, &i2c->dev);
0540
0541 if (!match)
0542 return -ENODATA;
0543
0544 driver_data = (struct palmas_driver_data *)match->data;
0545 palmas->features = *driver_data->features;
0546
0547 for (i = 0; i < PALMAS_NUM_CLIENTS; i++) {
0548 if (i == 0)
0549 palmas->i2c_clients[i] = i2c;
0550 else {
0551 palmas->i2c_clients[i] =
0552 i2c_new_dummy_device(i2c->adapter,
0553 i2c->addr + i);
0554 if (IS_ERR(palmas->i2c_clients[i])) {
0555 dev_err(palmas->dev,
0556 "can't attach client %d\n", i);
0557 ret = PTR_ERR(palmas->i2c_clients[i]);
0558 goto err_i2c;
0559 }
0560 palmas->i2c_clients[i]->dev.of_node = of_node_get(node);
0561 }
0562 palmas->regmap[i] = devm_regmap_init_i2c(palmas->i2c_clients[i],
0563 &palmas_regmap_config[i]);
0564 if (IS_ERR(palmas->regmap[i])) {
0565 ret = PTR_ERR(palmas->regmap[i]);
0566 dev_err(palmas->dev,
0567 "Failed to allocate regmap %d, err: %d\n",
0568 i, ret);
0569 goto err_i2c;
0570 }
0571 }
0572
0573 if (!palmas->irq) {
0574 dev_warn(palmas->dev, "IRQ missing: skipping irq request\n");
0575 goto no_irq;
0576 }
0577
0578
0579 if (pdata->irq_flags & IRQ_TYPE_LEVEL_HIGH)
0580 reg = PALMAS_POLARITY_CTRL_INT_POLARITY;
0581 else
0582 reg = 0;
0583 ret = palmas_update_bits(palmas, PALMAS_PU_PD_OD_BASE,
0584 PALMAS_POLARITY_CTRL, PALMAS_POLARITY_CTRL_INT_POLARITY,
0585 reg);
0586 if (ret < 0) {
0587 dev_err(palmas->dev, "POLARITY_CTRL update failed: %d\n", ret);
0588 goto err_i2c;
0589 }
0590
0591
0592 slave = PALMAS_BASE_TO_SLAVE(PALMAS_INTERRUPT_BASE);
0593 addr = PALMAS_BASE_TO_REG(PALMAS_INTERRUPT_BASE, PALMAS_INT_CTRL);
0594 reg = PALMAS_INT_CTRL_INT_CLEAR;
0595
0596 regmap_write(palmas->regmap[slave], addr, reg);
0597
0598 ret = regmap_add_irq_chip(palmas->regmap[slave], palmas->irq,
0599 IRQF_ONESHOT | pdata->irq_flags, 0,
0600 driver_data->irq_chip, &palmas->irq_data);
0601 if (ret < 0)
0602 goto err_i2c;
0603
0604 no_irq:
0605 slave = PALMAS_BASE_TO_SLAVE(PALMAS_PU_PD_OD_BASE);
0606 addr = PALMAS_BASE_TO_REG(PALMAS_PU_PD_OD_BASE,
0607 PALMAS_PRIMARY_SECONDARY_PAD1);
0608
0609 if (pdata->mux_from_pdata) {
0610 reg = pdata->pad1;
0611 ret = regmap_write(palmas->regmap[slave], addr, reg);
0612 if (ret)
0613 goto err_irq;
0614 } else {
0615 ret = regmap_read(palmas->regmap[slave], addr, ®);
0616 if (ret)
0617 goto err_irq;
0618 }
0619
0620 if (!(reg & PALMAS_PRIMARY_SECONDARY_PAD1_GPIO_0))
0621 palmas->gpio_muxed |= PALMAS_GPIO_0_MUXED;
0622 if (!(reg & PALMAS_PRIMARY_SECONDARY_PAD1_GPIO_1_MASK))
0623 palmas->gpio_muxed |= PALMAS_GPIO_1_MUXED;
0624 else if ((reg & PALMAS_PRIMARY_SECONDARY_PAD1_GPIO_1_MASK) ==
0625 (2 << PALMAS_PRIMARY_SECONDARY_PAD1_GPIO_1_SHIFT))
0626 palmas->led_muxed |= PALMAS_LED1_MUXED;
0627 else if ((reg & PALMAS_PRIMARY_SECONDARY_PAD1_GPIO_1_MASK) ==
0628 (3 << PALMAS_PRIMARY_SECONDARY_PAD1_GPIO_1_SHIFT))
0629 palmas->pwm_muxed |= PALMAS_PWM1_MUXED;
0630 if (!(reg & PALMAS_PRIMARY_SECONDARY_PAD1_GPIO_2_MASK))
0631 palmas->gpio_muxed |= PALMAS_GPIO_2_MUXED;
0632 else if ((reg & PALMAS_PRIMARY_SECONDARY_PAD1_GPIO_2_MASK) ==
0633 (2 << PALMAS_PRIMARY_SECONDARY_PAD1_GPIO_2_SHIFT))
0634 palmas->led_muxed |= PALMAS_LED2_MUXED;
0635 else if ((reg & PALMAS_PRIMARY_SECONDARY_PAD1_GPIO_2_MASK) ==
0636 (3 << PALMAS_PRIMARY_SECONDARY_PAD1_GPIO_2_SHIFT))
0637 palmas->pwm_muxed |= PALMAS_PWM2_MUXED;
0638 if (!(reg & PALMAS_PRIMARY_SECONDARY_PAD1_GPIO_3))
0639 palmas->gpio_muxed |= PALMAS_GPIO_3_MUXED;
0640
0641 addr = PALMAS_BASE_TO_REG(PALMAS_PU_PD_OD_BASE,
0642 PALMAS_PRIMARY_SECONDARY_PAD2);
0643
0644 if (pdata->mux_from_pdata) {
0645 reg = pdata->pad2;
0646 ret = regmap_write(palmas->regmap[slave], addr, reg);
0647 if (ret)
0648 goto err_irq;
0649 } else {
0650 ret = regmap_read(palmas->regmap[slave], addr, ®);
0651 if (ret)
0652 goto err_irq;
0653 }
0654
0655 if (!(reg & PALMAS_PRIMARY_SECONDARY_PAD2_GPIO_4))
0656 palmas->gpio_muxed |= PALMAS_GPIO_4_MUXED;
0657 if (!(reg & PALMAS_PRIMARY_SECONDARY_PAD2_GPIO_5_MASK))
0658 palmas->gpio_muxed |= PALMAS_GPIO_5_MUXED;
0659 if (!(reg & PALMAS_PRIMARY_SECONDARY_PAD2_GPIO_6))
0660 palmas->gpio_muxed |= PALMAS_GPIO_6_MUXED;
0661 if (!(reg & PALMAS_PRIMARY_SECONDARY_PAD2_GPIO_7_MASK))
0662 palmas->gpio_muxed |= PALMAS_GPIO_7_MUXED;
0663
0664 dev_info(palmas->dev, "Muxing GPIO %x, PWM %x, LED %x\n",
0665 palmas->gpio_muxed, palmas->pwm_muxed,
0666 palmas->led_muxed);
0667
0668 reg = pdata->power_ctrl;
0669
0670 slave = PALMAS_BASE_TO_SLAVE(PALMAS_PMU_CONTROL_BASE);
0671 addr = PALMAS_BASE_TO_REG(PALMAS_PMU_CONTROL_BASE, PALMAS_POWER_CTRL);
0672
0673 ret = regmap_write(palmas->regmap[slave], addr, reg);
0674 if (ret)
0675 goto err_irq;
0676
0677
0678
0679
0680
0681 if (node) {
0682 ret = devm_of_platform_populate(&i2c->dev);
0683 if (ret < 0) {
0684 goto err_irq;
0685 } else if (pdata->pm_off && !pm_power_off) {
0686 palmas_dev = palmas;
0687 pm_power_off = palmas_power_off;
0688 }
0689 }
0690
0691 return ret;
0692
0693 err_irq:
0694 regmap_del_irq_chip(palmas->irq, palmas->irq_data);
0695 err_i2c:
0696 for (i = 1; i < PALMAS_NUM_CLIENTS; i++) {
0697 if (palmas->i2c_clients[i])
0698 i2c_unregister_device(palmas->i2c_clients[i]);
0699 }
0700 return ret;
0701 }
0702
0703 static int palmas_i2c_remove(struct i2c_client *i2c)
0704 {
0705 struct palmas *palmas = i2c_get_clientdata(i2c);
0706 int i;
0707
0708 regmap_del_irq_chip(palmas->irq, palmas->irq_data);
0709
0710 for (i = 1; i < PALMAS_NUM_CLIENTS; i++) {
0711 if (palmas->i2c_clients[i])
0712 i2c_unregister_device(palmas->i2c_clients[i]);
0713 }
0714
0715 if (palmas == palmas_dev) {
0716 pm_power_off = NULL;
0717 palmas_dev = NULL;
0718 }
0719
0720 return 0;
0721 }
0722
0723 static const struct i2c_device_id palmas_i2c_id[] = {
0724 { "palmas", },
0725 { "twl6035", },
0726 { "twl6037", },
0727 { "tps65913", },
0728 { }
0729 };
0730 MODULE_DEVICE_TABLE(i2c, palmas_i2c_id);
0731
0732 static struct i2c_driver palmas_i2c_driver = {
0733 .driver = {
0734 .name = "palmas",
0735 .of_match_table = of_palmas_match_tbl,
0736 },
0737 .probe = palmas_i2c_probe,
0738 .remove = palmas_i2c_remove,
0739 .id_table = palmas_i2c_id,
0740 };
0741
0742 static int __init palmas_i2c_init(void)
0743 {
0744 return i2c_add_driver(&palmas_i2c_driver);
0745 }
0746
0747 subsys_initcall(palmas_i2c_init);
0748
0749 static void __exit palmas_i2c_exit(void)
0750 {
0751 i2c_del_driver(&palmas_i2c_driver);
0752 }
0753 module_exit(palmas_i2c_exit);
0754
0755 MODULE_AUTHOR("Graeme Gregory <gg@slimlogic.co.uk>");
0756 MODULE_DESCRIPTION("Palmas chip family multi-function driver");
0757 MODULE_LICENSE("GPL");