0001
0002
0003
0004
0005
0006
0007
0008 #include <linux/module.h>
0009 #include <linux/interrupt.h>
0010 #include <linux/delay.h>
0011 #include <linux/of_irq.h>
0012 #include <linux/of_device.h>
0013 #include <linux/pm_runtime.h>
0014 #include <linux/power_supply.h>
0015 #include <linux/i2c.h>
0016 #include <linux/acpi.h>
0017 #include <linux/usb/phy.h>
0018 #include <linux/regmap.h>
0019
0020 #define RT9455_MANUFACTURER "Richtek"
0021 #define RT9455_MODEL_NAME "RT9455"
0022 #define RT9455_DRIVER_NAME "rt9455-charger"
0023
0024 #define RT9455_IRQ_NAME "interrupt"
0025
0026 #define RT9455_PWR_RDY_DELAY 1
0027 #define RT9455_MAX_CHARGING_TIME 21600
0028 #define RT9455_BATT_PRESENCE_DELAY 60
0029
0030 #define RT9455_CHARGE_MODE 0x00
0031 #define RT9455_BOOST_MODE 0x01
0032
0033 #define RT9455_FAULT 0x03
0034
0035 #define RT9455_IAICR_100MA 0x00
0036 #define RT9455_IAICR_500MA 0x01
0037 #define RT9455_IAICR_NO_LIMIT 0x03
0038
0039 #define RT9455_CHARGE_DISABLE 0x00
0040 #define RT9455_CHARGE_ENABLE 0x01
0041
0042 #define RT9455_PWR_FAULT 0x00
0043 #define RT9455_PWR_GOOD 0x01
0044
0045 #define RT9455_REG_CTRL1 0x00
0046 #define RT9455_REG_CTRL2 0x01
0047 #define RT9455_REG_CTRL3 0x02
0048 #define RT9455_REG_DEV_ID 0x03
0049 #define RT9455_REG_CTRL4 0x04
0050 #define RT9455_REG_CTRL5 0x05
0051 #define RT9455_REG_CTRL6 0x06
0052 #define RT9455_REG_CTRL7 0x07
0053 #define RT9455_REG_IRQ1 0x08
0054 #define RT9455_REG_IRQ2 0x09
0055 #define RT9455_REG_IRQ3 0x0A
0056 #define RT9455_REG_MASK1 0x0B
0057 #define RT9455_REG_MASK2 0x0C
0058 #define RT9455_REG_MASK3 0x0D
0059
0060 enum rt9455_fields {
0061 F_STAT, F_BOOST, F_PWR_RDY, F_OTG_PIN_POLARITY,
0062
0063 F_IAICR, F_TE_SHDN_EN, F_HIGHER_OCP, F_TE, F_IAICR_INT, F_HIZ,
0064 F_OPA_MODE,
0065
0066 F_VOREG, F_OTG_PL, F_OTG_EN,
0067
0068 F_VENDOR_ID, F_CHIP_REV,
0069
0070 F_RST,
0071
0072 F_TMR_EN, F_MIVR, F_IPREC, F_IEOC_PERCENTAGE,
0073
0074 F_IAICR_SEL, F_ICHRG, F_VPREC,
0075
0076 F_BATD_EN, F_CHG_EN, F_VMREG,
0077
0078 F_TSDI, F_VINOVPI, F_BATAB,
0079
0080 F_CHRVPI, F_CHBATOVI, F_CHTERMI, F_CHRCHGI, F_CH32MI, F_CHTREGI,
0081 F_CHMIVRI,
0082
0083 F_BSTBUSOVI, F_BSTOLI, F_BSTLOWVI, F_BST32SI,
0084
0085 F_TSDM, F_VINOVPIM, F_BATABM,
0086
0087 F_CHRVPIM, F_CHBATOVIM, F_CHTERMIM, F_CHRCHGIM, F_CH32MIM, F_CHTREGIM,
0088 F_CHMIVRIM,
0089
0090 F_BSTVINOVIM, F_BSTOLIM, F_BSTLOWVIM, F_BST32SIM,
0091
0092 F_MAX_FIELDS
0093 };
0094
0095 static const struct reg_field rt9455_reg_fields[] = {
0096 [F_STAT] = REG_FIELD(RT9455_REG_CTRL1, 4, 5),
0097 [F_BOOST] = REG_FIELD(RT9455_REG_CTRL1, 3, 3),
0098 [F_PWR_RDY] = REG_FIELD(RT9455_REG_CTRL1, 2, 2),
0099 [F_OTG_PIN_POLARITY] = REG_FIELD(RT9455_REG_CTRL1, 1, 1),
0100
0101 [F_IAICR] = REG_FIELD(RT9455_REG_CTRL2, 6, 7),
0102 [F_TE_SHDN_EN] = REG_FIELD(RT9455_REG_CTRL2, 5, 5),
0103 [F_HIGHER_OCP] = REG_FIELD(RT9455_REG_CTRL2, 4, 4),
0104 [F_TE] = REG_FIELD(RT9455_REG_CTRL2, 3, 3),
0105 [F_IAICR_INT] = REG_FIELD(RT9455_REG_CTRL2, 2, 2),
0106 [F_HIZ] = REG_FIELD(RT9455_REG_CTRL2, 1, 1),
0107 [F_OPA_MODE] = REG_FIELD(RT9455_REG_CTRL2, 0, 0),
0108
0109 [F_VOREG] = REG_FIELD(RT9455_REG_CTRL3, 2, 7),
0110 [F_OTG_PL] = REG_FIELD(RT9455_REG_CTRL3, 1, 1),
0111 [F_OTG_EN] = REG_FIELD(RT9455_REG_CTRL3, 0, 0),
0112
0113 [F_VENDOR_ID] = REG_FIELD(RT9455_REG_DEV_ID, 4, 7),
0114 [F_CHIP_REV] = REG_FIELD(RT9455_REG_DEV_ID, 0, 3),
0115
0116 [F_RST] = REG_FIELD(RT9455_REG_CTRL4, 7, 7),
0117
0118 [F_TMR_EN] = REG_FIELD(RT9455_REG_CTRL5, 7, 7),
0119 [F_MIVR] = REG_FIELD(RT9455_REG_CTRL5, 4, 5),
0120 [F_IPREC] = REG_FIELD(RT9455_REG_CTRL5, 2, 3),
0121 [F_IEOC_PERCENTAGE] = REG_FIELD(RT9455_REG_CTRL5, 0, 1),
0122
0123 [F_IAICR_SEL] = REG_FIELD(RT9455_REG_CTRL6, 7, 7),
0124 [F_ICHRG] = REG_FIELD(RT9455_REG_CTRL6, 4, 6),
0125 [F_VPREC] = REG_FIELD(RT9455_REG_CTRL6, 0, 2),
0126
0127 [F_BATD_EN] = REG_FIELD(RT9455_REG_CTRL7, 6, 6),
0128 [F_CHG_EN] = REG_FIELD(RT9455_REG_CTRL7, 4, 4),
0129 [F_VMREG] = REG_FIELD(RT9455_REG_CTRL7, 0, 3),
0130
0131 [F_TSDI] = REG_FIELD(RT9455_REG_IRQ1, 7, 7),
0132 [F_VINOVPI] = REG_FIELD(RT9455_REG_IRQ1, 6, 6),
0133 [F_BATAB] = REG_FIELD(RT9455_REG_IRQ1, 0, 0),
0134
0135 [F_CHRVPI] = REG_FIELD(RT9455_REG_IRQ2, 7, 7),
0136 [F_CHBATOVI] = REG_FIELD(RT9455_REG_IRQ2, 5, 5),
0137 [F_CHTERMI] = REG_FIELD(RT9455_REG_IRQ2, 4, 4),
0138 [F_CHRCHGI] = REG_FIELD(RT9455_REG_IRQ2, 3, 3),
0139 [F_CH32MI] = REG_FIELD(RT9455_REG_IRQ2, 2, 2),
0140 [F_CHTREGI] = REG_FIELD(RT9455_REG_IRQ2, 1, 1),
0141 [F_CHMIVRI] = REG_FIELD(RT9455_REG_IRQ2, 0, 0),
0142
0143 [F_BSTBUSOVI] = REG_FIELD(RT9455_REG_IRQ3, 7, 7),
0144 [F_BSTOLI] = REG_FIELD(RT9455_REG_IRQ3, 6, 6),
0145 [F_BSTLOWVI] = REG_FIELD(RT9455_REG_IRQ3, 5, 5),
0146 [F_BST32SI] = REG_FIELD(RT9455_REG_IRQ3, 3, 3),
0147
0148 [F_TSDM] = REG_FIELD(RT9455_REG_MASK1, 7, 7),
0149 [F_VINOVPIM] = REG_FIELD(RT9455_REG_MASK1, 6, 6),
0150 [F_BATABM] = REG_FIELD(RT9455_REG_MASK1, 0, 0),
0151
0152 [F_CHRVPIM] = REG_FIELD(RT9455_REG_MASK2, 7, 7),
0153 [F_CHBATOVIM] = REG_FIELD(RT9455_REG_MASK2, 5, 5),
0154 [F_CHTERMIM] = REG_FIELD(RT9455_REG_MASK2, 4, 4),
0155 [F_CHRCHGIM] = REG_FIELD(RT9455_REG_MASK2, 3, 3),
0156 [F_CH32MIM] = REG_FIELD(RT9455_REG_MASK2, 2, 2),
0157 [F_CHTREGIM] = REG_FIELD(RT9455_REG_MASK2, 1, 1),
0158 [F_CHMIVRIM] = REG_FIELD(RT9455_REG_MASK2, 0, 0),
0159
0160 [F_BSTVINOVIM] = REG_FIELD(RT9455_REG_MASK3, 7, 7),
0161 [F_BSTOLIM] = REG_FIELD(RT9455_REG_MASK3, 6, 6),
0162 [F_BSTLOWVIM] = REG_FIELD(RT9455_REG_MASK3, 5, 5),
0163 [F_BST32SIM] = REG_FIELD(RT9455_REG_MASK3, 3, 3),
0164 };
0165
0166 #define GET_MASK(fid) (BIT(rt9455_reg_fields[fid].msb + 1) - \
0167 BIT(rt9455_reg_fields[fid].lsb))
0168
0169
0170
0171
0172
0173
0174
0175
0176 static const int rt9455_ichrg_values[] = {
0177 500000, 650000, 800000, 950000, 1100000, 1250000, 1400000, 1550000
0178 };
0179
0180
0181
0182
0183
0184
0185 static const int rt9455_voreg_values[] = {
0186 3500000, 3520000, 3540000, 3560000, 3580000, 3600000, 3620000, 3640000,
0187 3660000, 3680000, 3700000, 3720000, 3740000, 3760000, 3780000, 3800000,
0188 3820000, 3840000, 3860000, 3880000, 3900000, 3920000, 3940000, 3960000,
0189 3980000, 4000000, 4020000, 4040000, 4060000, 4080000, 4100000, 4120000,
0190 4140000, 4160000, 4180000, 4200000, 4220000, 4240000, 4260000, 4280000,
0191 4300000, 4330000, 4350000, 4370000, 4390000, 4410000, 4430000, 4450000,
0192 4450000, 4450000, 4450000, 4450000, 4450000, 4450000, 4450000, 4450000,
0193 4450000, 4450000, 4450000, 4450000, 4450000, 4450000, 4450000, 4450000
0194 };
0195
0196
0197
0198
0199
0200
0201 static const int rt9455_boost_voltage_values[] = {
0202 4425000, 4450000, 4475000, 4500000, 4525000, 4550000, 4575000, 4600000,
0203 4625000, 4650000, 4675000, 4700000, 4725000, 4750000, 4775000, 4800000,
0204 4825000, 4850000, 4875000, 4900000, 4925000, 4950000, 4975000, 5000000,
0205 5025000, 5050000, 5075000, 5100000, 5125000, 5150000, 5175000, 5200000,
0206 5225000, 5250000, 5275000, 5300000, 5325000, 5350000, 5375000, 5400000,
0207 5425000, 5450000, 5475000, 5500000, 5525000, 5550000, 5575000, 5600000,
0208 5600000, 5600000, 5600000, 5600000, 5600000, 5600000, 5600000, 5600000,
0209 5600000, 5600000, 5600000, 5600000, 5600000, 5600000, 5600000, 5600000,
0210 };
0211
0212
0213 static const int rt9455_vmreg_values[] = {
0214 4200000, 4220000, 4240000, 4260000, 4280000, 4300000, 4320000, 4340000,
0215 4360000, 4380000, 4400000, 4430000, 4450000, 4450000, 4450000, 4450000
0216 };
0217
0218
0219 static const int rt9455_ieoc_percentage_values[] = {
0220 10, 30, 20, 30
0221 };
0222
0223
0224 static const int rt9455_mivr_values[] = {
0225 4000000, 4250000, 4500000, 5000000
0226 };
0227
0228
0229 static const int rt9455_iaicr_values[] = {
0230 100000, 500000, 1000000, 2000000
0231 };
0232
0233 struct rt9455_info {
0234 struct i2c_client *client;
0235 struct regmap *regmap;
0236 struct regmap_field *regmap_fields[F_MAX_FIELDS];
0237 struct power_supply *charger;
0238 #if IS_ENABLED(CONFIG_USB_PHY)
0239 struct usb_phy *usb_phy;
0240 struct notifier_block nb;
0241 #endif
0242 struct delayed_work pwr_rdy_work;
0243 struct delayed_work max_charging_time_work;
0244 struct delayed_work batt_presence_work;
0245 u32 voreg;
0246 u32 boost_voltage;
0247 };
0248
0249
0250
0251
0252
0253
0254 static unsigned int rt9455_find_idx(const int tbl[], int tbl_size, int v)
0255 {
0256 int i;
0257
0258
0259
0260
0261
0262
0263
0264 for (i = 0; i < tbl_size - 1; i++)
0265 if (v <= tbl[i])
0266 return i;
0267
0268 return (tbl_size - 1);
0269 }
0270
0271 static int rt9455_get_field_val(struct rt9455_info *info,
0272 enum rt9455_fields field,
0273 const int tbl[], int tbl_size, int *val)
0274 {
0275 unsigned int v;
0276 int ret;
0277
0278 ret = regmap_field_read(info->regmap_fields[field], &v);
0279 if (ret)
0280 return ret;
0281
0282 v = (v >= tbl_size) ? (tbl_size - 1) : v;
0283 *val = tbl[v];
0284
0285 return 0;
0286 }
0287
0288 static int rt9455_set_field_val(struct rt9455_info *info,
0289 enum rt9455_fields field,
0290 const int tbl[], int tbl_size, int val)
0291 {
0292 unsigned int idx = rt9455_find_idx(tbl, tbl_size, val);
0293
0294 return regmap_field_write(info->regmap_fields[field], idx);
0295 }
0296
0297 static int rt9455_register_reset(struct rt9455_info *info)
0298 {
0299 struct device *dev = &info->client->dev;
0300 unsigned int v;
0301 int ret, limit = 100;
0302
0303 ret = regmap_field_write(info->regmap_fields[F_RST], 0x01);
0304 if (ret) {
0305 dev_err(dev, "Failed to set RST bit\n");
0306 return ret;
0307 }
0308
0309
0310
0311
0312
0313 do {
0314 ret = regmap_field_read(info->regmap_fields[F_RST], &v);
0315 if (ret) {
0316 dev_err(dev, "Failed to read RST bit\n");
0317 return ret;
0318 }
0319
0320 if (!v)
0321 break;
0322
0323 usleep_range(10, 100);
0324 } while (--limit);
0325
0326 if (!limit)
0327 return -EIO;
0328
0329 return 0;
0330 }
0331
0332
0333 static enum power_supply_property rt9455_charger_properties[] = {
0334 POWER_SUPPLY_PROP_STATUS,
0335 POWER_SUPPLY_PROP_HEALTH,
0336 POWER_SUPPLY_PROP_PRESENT,
0337 POWER_SUPPLY_PROP_ONLINE,
0338 POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT,
0339 POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX,
0340 POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE,
0341 POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX,
0342 POWER_SUPPLY_PROP_SCOPE,
0343 POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT,
0344 POWER_SUPPLY_PROP_MODEL_NAME,
0345 POWER_SUPPLY_PROP_MANUFACTURER,
0346 };
0347
0348 static char *rt9455_charger_supplied_to[] = {
0349 "main-battery",
0350 };
0351
0352 static int rt9455_charger_get_status(struct rt9455_info *info,
0353 union power_supply_propval *val)
0354 {
0355 unsigned int v, pwr_rdy;
0356 int ret;
0357
0358 ret = regmap_field_read(info->regmap_fields[F_PWR_RDY],
0359 &pwr_rdy);
0360 if (ret) {
0361 dev_err(&info->client->dev, "Failed to read PWR_RDY bit\n");
0362 return ret;
0363 }
0364
0365
0366
0367
0368
0369 if (!pwr_rdy) {
0370 val->intval = POWER_SUPPLY_STATUS_DISCHARGING;
0371 return 0;
0372 }
0373
0374 ret = regmap_field_read(info->regmap_fields[F_STAT], &v);
0375 if (ret) {
0376 dev_err(&info->client->dev, "Failed to read STAT bits\n");
0377 return ret;
0378 }
0379
0380 switch (v) {
0381 case 0:
0382
0383
0384
0385
0386
0387
0388
0389
0390 val->intval = POWER_SUPPLY_STATUS_NOT_CHARGING;
0391 return 0;
0392 case 1:
0393 val->intval = POWER_SUPPLY_STATUS_CHARGING;
0394 return 0;
0395 case 2:
0396 val->intval = POWER_SUPPLY_STATUS_FULL;
0397 return 0;
0398 default:
0399 val->intval = POWER_SUPPLY_STATUS_UNKNOWN;
0400 return 0;
0401 }
0402 }
0403
0404 static int rt9455_charger_get_health(struct rt9455_info *info,
0405 union power_supply_propval *val)
0406 {
0407 struct device *dev = &info->client->dev;
0408 unsigned int v;
0409 int ret;
0410
0411 val->intval = POWER_SUPPLY_HEALTH_GOOD;
0412
0413 ret = regmap_read(info->regmap, RT9455_REG_IRQ1, &v);
0414 if (ret) {
0415 dev_err(dev, "Failed to read IRQ1 register\n");
0416 return ret;
0417 }
0418
0419 if (v & GET_MASK(F_TSDI)) {
0420 val->intval = POWER_SUPPLY_HEALTH_OVERHEAT;
0421 return 0;
0422 }
0423 if (v & GET_MASK(F_VINOVPI)) {
0424 val->intval = POWER_SUPPLY_HEALTH_OVERVOLTAGE;
0425 return 0;
0426 }
0427 if (v & GET_MASK(F_BATAB)) {
0428 val->intval = POWER_SUPPLY_HEALTH_UNSPEC_FAILURE;
0429 return 0;
0430 }
0431
0432 ret = regmap_read(info->regmap, RT9455_REG_IRQ2, &v);
0433 if (ret) {
0434 dev_err(dev, "Failed to read IRQ2 register\n");
0435 return ret;
0436 }
0437
0438 if (v & GET_MASK(F_CHBATOVI)) {
0439 val->intval = POWER_SUPPLY_HEALTH_UNSPEC_FAILURE;
0440 return 0;
0441 }
0442 if (v & GET_MASK(F_CH32MI)) {
0443 val->intval = POWER_SUPPLY_HEALTH_SAFETY_TIMER_EXPIRE;
0444 return 0;
0445 }
0446
0447 ret = regmap_read(info->regmap, RT9455_REG_IRQ3, &v);
0448 if (ret) {
0449 dev_err(dev, "Failed to read IRQ3 register\n");
0450 return ret;
0451 }
0452
0453 if (v & GET_MASK(F_BSTBUSOVI)) {
0454 val->intval = POWER_SUPPLY_HEALTH_UNSPEC_FAILURE;
0455 return 0;
0456 }
0457 if (v & GET_MASK(F_BSTOLI)) {
0458 val->intval = POWER_SUPPLY_HEALTH_OVERVOLTAGE;
0459 return 0;
0460 }
0461 if (v & GET_MASK(F_BSTLOWVI)) {
0462 val->intval = POWER_SUPPLY_HEALTH_UNSPEC_FAILURE;
0463 return 0;
0464 }
0465 if (v & GET_MASK(F_BST32SI)) {
0466 val->intval = POWER_SUPPLY_HEALTH_SAFETY_TIMER_EXPIRE;
0467 return 0;
0468 }
0469
0470 ret = regmap_field_read(info->regmap_fields[F_STAT], &v);
0471 if (ret) {
0472 dev_err(dev, "Failed to read STAT bits\n");
0473 return ret;
0474 }
0475
0476 if (v == RT9455_FAULT) {
0477 val->intval = POWER_SUPPLY_HEALTH_UNSPEC_FAILURE;
0478 return 0;
0479 }
0480
0481 return 0;
0482 }
0483
0484 static int rt9455_charger_get_battery_presence(struct rt9455_info *info,
0485 union power_supply_propval *val)
0486 {
0487 unsigned int v;
0488 int ret;
0489
0490 ret = regmap_field_read(info->regmap_fields[F_BATAB], &v);
0491 if (ret) {
0492 dev_err(&info->client->dev, "Failed to read BATAB bit\n");
0493 return ret;
0494 }
0495
0496
0497
0498
0499
0500 val->intval = !v;
0501
0502 return 0;
0503 }
0504
0505 static int rt9455_charger_get_online(struct rt9455_info *info,
0506 union power_supply_propval *val)
0507 {
0508 unsigned int v;
0509 int ret;
0510
0511 ret = regmap_field_read(info->regmap_fields[F_PWR_RDY], &v);
0512 if (ret) {
0513 dev_err(&info->client->dev, "Failed to read PWR_RDY bit\n");
0514 return ret;
0515 }
0516
0517 val->intval = (int)v;
0518
0519 return 0;
0520 }
0521
0522 static int rt9455_charger_get_current(struct rt9455_info *info,
0523 union power_supply_propval *val)
0524 {
0525 int curr;
0526 int ret;
0527
0528 ret = rt9455_get_field_val(info, F_ICHRG,
0529 rt9455_ichrg_values,
0530 ARRAY_SIZE(rt9455_ichrg_values),
0531 &curr);
0532 if (ret) {
0533 dev_err(&info->client->dev, "Failed to read ICHRG value\n");
0534 return ret;
0535 }
0536
0537 val->intval = curr;
0538
0539 return 0;
0540 }
0541
0542 static int rt9455_charger_get_current_max(struct rt9455_info *info,
0543 union power_supply_propval *val)
0544 {
0545 int idx = ARRAY_SIZE(rt9455_ichrg_values) - 1;
0546
0547 val->intval = rt9455_ichrg_values[idx];
0548
0549 return 0;
0550 }
0551
0552 static int rt9455_charger_get_voltage(struct rt9455_info *info,
0553 union power_supply_propval *val)
0554 {
0555 int voltage;
0556 int ret;
0557
0558 ret = rt9455_get_field_val(info, F_VOREG,
0559 rt9455_voreg_values,
0560 ARRAY_SIZE(rt9455_voreg_values),
0561 &voltage);
0562 if (ret) {
0563 dev_err(&info->client->dev, "Failed to read VOREG value\n");
0564 return ret;
0565 }
0566
0567 val->intval = voltage;
0568
0569 return 0;
0570 }
0571
0572 static int rt9455_charger_get_voltage_max(struct rt9455_info *info,
0573 union power_supply_propval *val)
0574 {
0575 int idx = ARRAY_SIZE(rt9455_vmreg_values) - 1;
0576
0577 val->intval = rt9455_vmreg_values[idx];
0578
0579 return 0;
0580 }
0581
0582 static int rt9455_charger_get_term_current(struct rt9455_info *info,
0583 union power_supply_propval *val)
0584 {
0585 struct device *dev = &info->client->dev;
0586 int ichrg, ieoc_percentage, ret;
0587
0588 ret = rt9455_get_field_val(info, F_ICHRG,
0589 rt9455_ichrg_values,
0590 ARRAY_SIZE(rt9455_ichrg_values),
0591 &ichrg);
0592 if (ret) {
0593 dev_err(dev, "Failed to read ICHRG value\n");
0594 return ret;
0595 }
0596
0597 ret = rt9455_get_field_val(info, F_IEOC_PERCENTAGE,
0598 rt9455_ieoc_percentage_values,
0599 ARRAY_SIZE(rt9455_ieoc_percentage_values),
0600 &ieoc_percentage);
0601 if (ret) {
0602 dev_err(dev, "Failed to read IEOC value\n");
0603 return ret;
0604 }
0605
0606 val->intval = ichrg * ieoc_percentage / 100;
0607
0608 return 0;
0609 }
0610
0611 static int rt9455_charger_get_property(struct power_supply *psy,
0612 enum power_supply_property psp,
0613 union power_supply_propval *val)
0614 {
0615 struct rt9455_info *info = power_supply_get_drvdata(psy);
0616
0617 switch (psp) {
0618 case POWER_SUPPLY_PROP_STATUS:
0619 return rt9455_charger_get_status(info, val);
0620 case POWER_SUPPLY_PROP_HEALTH:
0621 return rt9455_charger_get_health(info, val);
0622 case POWER_SUPPLY_PROP_PRESENT:
0623 return rt9455_charger_get_battery_presence(info, val);
0624 case POWER_SUPPLY_PROP_ONLINE:
0625 return rt9455_charger_get_online(info, val);
0626 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT:
0627 return rt9455_charger_get_current(info, val);
0628 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX:
0629 return rt9455_charger_get_current_max(info, val);
0630 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:
0631 return rt9455_charger_get_voltage(info, val);
0632 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX:
0633 return rt9455_charger_get_voltage_max(info, val);
0634 case POWER_SUPPLY_PROP_SCOPE:
0635 val->intval = POWER_SUPPLY_SCOPE_SYSTEM;
0636 return 0;
0637 case POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT:
0638 return rt9455_charger_get_term_current(info, val);
0639 case POWER_SUPPLY_PROP_MODEL_NAME:
0640 val->strval = RT9455_MODEL_NAME;
0641 return 0;
0642 case POWER_SUPPLY_PROP_MANUFACTURER:
0643 val->strval = RT9455_MANUFACTURER;
0644 return 0;
0645 default:
0646 return -ENODATA;
0647 }
0648 }
0649
0650 static int rt9455_hw_init(struct rt9455_info *info, u32 ichrg,
0651 u32 ieoc_percentage,
0652 u32 mivr, u32 iaicr)
0653 {
0654 struct device *dev = &info->client->dev;
0655 int idx, ret;
0656
0657 ret = rt9455_register_reset(info);
0658 if (ret) {
0659 dev_err(dev, "Power On Reset failed\n");
0660 return ret;
0661 }
0662
0663
0664 ret = regmap_field_write(info->regmap_fields[F_TE], 1);
0665 if (ret) {
0666 dev_err(dev, "Failed to set TE bit\n");
0667 return ret;
0668 }
0669
0670
0671 ret = regmap_field_write(info->regmap_fields[F_TE_SHDN_EN], 1);
0672 if (ret) {
0673 dev_err(dev, "Failed to set TE_SHDN_EN bit\n");
0674 return ret;
0675 }
0676
0677
0678
0679
0680
0681 ret = regmap_field_write(info->regmap_fields[F_BATD_EN], 1);
0682 if (ret) {
0683 dev_err(dev, "Failed to set BATD_EN bit\n");
0684 return ret;
0685 }
0686
0687
0688
0689
0690
0691
0692
0693
0694
0695
0696
0697
0698 ret = regmap_field_write(info->regmap_fields[F_TMR_EN], 0x00);
0699 if (ret) {
0700 dev_err(dev, "Failed to disable Safety Timer\n");
0701 return ret;
0702 }
0703
0704
0705 ret = rt9455_set_field_val(info, F_ICHRG,
0706 rt9455_ichrg_values,
0707 ARRAY_SIZE(rt9455_ichrg_values), ichrg);
0708 if (ret) {
0709 dev_err(dev, "Failed to set ICHRG value\n");
0710 return ret;
0711 }
0712
0713
0714 ret = rt9455_set_field_val(info, F_IEOC_PERCENTAGE,
0715 rt9455_ieoc_percentage_values,
0716 ARRAY_SIZE(rt9455_ieoc_percentage_values),
0717 ieoc_percentage);
0718 if (ret) {
0719 dev_err(dev, "Failed to set IEOC Percentage value\n");
0720 return ret;
0721 }
0722
0723
0724 ret = rt9455_set_field_val(info, F_VOREG,
0725 rt9455_voreg_values,
0726 ARRAY_SIZE(rt9455_voreg_values),
0727 info->voreg);
0728 if (ret) {
0729 dev_err(dev, "Failed to set VOREG value\n");
0730 return ret;
0731 }
0732
0733
0734 idx = ARRAY_SIZE(rt9455_vmreg_values) - 1;
0735 ret = rt9455_set_field_val(info, F_VMREG,
0736 rt9455_vmreg_values,
0737 ARRAY_SIZE(rt9455_vmreg_values),
0738 rt9455_vmreg_values[idx]);
0739 if (ret) {
0740 dev_err(dev, "Failed to set VMREG value\n");
0741 return ret;
0742 }
0743
0744
0745
0746
0747
0748 if (mivr == -1)
0749 mivr = 4500000;
0750
0751 ret = rt9455_set_field_val(info, F_MIVR,
0752 rt9455_mivr_values,
0753 ARRAY_SIZE(rt9455_mivr_values), mivr);
0754 if (ret) {
0755 dev_err(dev, "Failed to set MIVR value\n");
0756 return ret;
0757 }
0758
0759
0760
0761
0762
0763 if (iaicr == -1)
0764 iaicr = 500000;
0765
0766 ret = rt9455_set_field_val(info, F_IAICR,
0767 rt9455_iaicr_values,
0768 ARRAY_SIZE(rt9455_iaicr_values), iaicr);
0769 if (ret) {
0770 dev_err(dev, "Failed to set IAICR value\n");
0771 return ret;
0772 }
0773
0774
0775
0776
0777
0778 ret = regmap_field_write(info->regmap_fields[F_IAICR_INT], 0x01);
0779 if (ret) {
0780 dev_err(dev, "Failed to set IAICR_INT bit\n");
0781 return ret;
0782 }
0783
0784
0785
0786
0787
0788
0789 ret = regmap_field_write(info->regmap_fields[F_CHMIVRIM], 0x01);
0790 if (ret) {
0791 dev_err(dev, "Failed to mask CHMIVRI interrupt\n");
0792 return ret;
0793 }
0794
0795 return 0;
0796 }
0797
0798 #if IS_ENABLED(CONFIG_USB_PHY)
0799
0800
0801
0802
0803
0804
0805
0806
0807 static int rt9455_set_boost_voltage_before_boost_mode(struct rt9455_info *info)
0808 {
0809 struct device *dev = &info->client->dev;
0810 int ret;
0811
0812 ret = rt9455_set_field_val(info, F_VOREG,
0813 rt9455_boost_voltage_values,
0814 ARRAY_SIZE(rt9455_boost_voltage_values),
0815 info->boost_voltage);
0816 if (ret) {
0817 dev_err(dev, "Failed to set boost output voltage value\n");
0818 return ret;
0819 }
0820
0821 return 0;
0822 }
0823 #endif
0824
0825
0826
0827
0828
0829
0830
0831
0832
0833 static int rt9455_set_voreg_before_charge_mode(struct rt9455_info *info)
0834 {
0835 struct device *dev = &info->client->dev;
0836 int ret;
0837
0838 ret = rt9455_set_field_val(info, F_VOREG,
0839 rt9455_voreg_values,
0840 ARRAY_SIZE(rt9455_voreg_values),
0841 info->voreg);
0842 if (ret) {
0843 dev_err(dev, "Failed to set VOREG value\n");
0844 return ret;
0845 }
0846
0847 return 0;
0848 }
0849
0850 static int rt9455_irq_handler_check_irq1_register(struct rt9455_info *info,
0851 bool *_is_battery_absent,
0852 bool *_alert_userspace)
0853 {
0854 unsigned int irq1, mask1, mask2;
0855 struct device *dev = &info->client->dev;
0856 bool is_battery_absent = false;
0857 bool alert_userspace = false;
0858 int ret;
0859
0860 ret = regmap_read(info->regmap, RT9455_REG_IRQ1, &irq1);
0861 if (ret) {
0862 dev_err(dev, "Failed to read IRQ1 register\n");
0863 return ret;
0864 }
0865
0866 ret = regmap_read(info->regmap, RT9455_REG_MASK1, &mask1);
0867 if (ret) {
0868 dev_err(dev, "Failed to read MASK1 register\n");
0869 return ret;
0870 }
0871
0872 if (irq1 & GET_MASK(F_TSDI)) {
0873 dev_err(dev, "Thermal shutdown fault occurred\n");
0874 alert_userspace = true;
0875 }
0876
0877 if (irq1 & GET_MASK(F_VINOVPI)) {
0878 dev_err(dev, "Overvoltage input occurred\n");
0879 alert_userspace = true;
0880 }
0881
0882 if (irq1 & GET_MASK(F_BATAB)) {
0883 dev_err(dev, "Battery absence occurred\n");
0884 is_battery_absent = true;
0885 alert_userspace = true;
0886
0887 if ((mask1 & GET_MASK(F_BATABM)) == 0) {
0888 ret = regmap_field_write(info->regmap_fields[F_BATABM],
0889 0x01);
0890 if (ret) {
0891 dev_err(dev, "Failed to mask BATAB interrupt\n");
0892 return ret;
0893 }
0894 }
0895
0896 ret = regmap_read(info->regmap, RT9455_REG_MASK2, &mask2);
0897 if (ret) {
0898 dev_err(dev, "Failed to read MASK2 register\n");
0899 return ret;
0900 }
0901
0902 if (mask2 & GET_MASK(F_CHTERMIM)) {
0903 ret = regmap_field_write(
0904 info->regmap_fields[F_CHTERMIM], 0x00);
0905 if (ret) {
0906 dev_err(dev, "Failed to unmask CHTERMI interrupt\n");
0907 return ret;
0908 }
0909 }
0910
0911 if (mask2 & GET_MASK(F_CHRCHGIM)) {
0912 ret = regmap_field_write(
0913 info->regmap_fields[F_CHRCHGIM], 0x00);
0914 if (ret) {
0915 dev_err(dev, "Failed to unmask CHRCHGI interrupt\n");
0916 return ret;
0917 }
0918 }
0919
0920
0921
0922
0923
0924 cancel_delayed_work_sync(&info->max_charging_time_work);
0925
0926
0927
0928
0929
0930
0931 queue_delayed_work(system_power_efficient_wq,
0932 &info->batt_presence_work,
0933 RT9455_BATT_PRESENCE_DELAY * HZ);
0934 }
0935
0936 *_is_battery_absent = is_battery_absent;
0937
0938 if (alert_userspace)
0939 *_alert_userspace = alert_userspace;
0940
0941 return 0;
0942 }
0943
0944 static int rt9455_irq_handler_check_irq2_register(struct rt9455_info *info,
0945 bool is_battery_absent,
0946 bool *_alert_userspace)
0947 {
0948 unsigned int irq2, mask2;
0949 struct device *dev = &info->client->dev;
0950 bool alert_userspace = false;
0951 int ret;
0952
0953 ret = regmap_read(info->regmap, RT9455_REG_IRQ2, &irq2);
0954 if (ret) {
0955 dev_err(dev, "Failed to read IRQ2 register\n");
0956 return ret;
0957 }
0958
0959 ret = regmap_read(info->regmap, RT9455_REG_MASK2, &mask2);
0960 if (ret) {
0961 dev_err(dev, "Failed to read MASK2 register\n");
0962 return ret;
0963 }
0964
0965 if (irq2 & GET_MASK(F_CHRVPI)) {
0966 dev_dbg(dev, "Charger fault occurred\n");
0967
0968
0969
0970
0971
0972
0973
0974
0975
0976
0977
0978 queue_delayed_work(system_power_efficient_wq,
0979 &info->pwr_rdy_work,
0980 RT9455_PWR_RDY_DELAY * HZ);
0981 }
0982 if (irq2 & GET_MASK(F_CHBATOVI)) {
0983 dev_err(dev, "Battery OVP occurred\n");
0984 alert_userspace = true;
0985 }
0986 if (irq2 & GET_MASK(F_CHTERMI)) {
0987 dev_dbg(dev, "Charge terminated\n");
0988 if (!is_battery_absent) {
0989 if ((mask2 & GET_MASK(F_CHTERMIM)) == 0) {
0990 ret = regmap_field_write(
0991 info->regmap_fields[F_CHTERMIM], 0x01);
0992 if (ret) {
0993 dev_err(dev, "Failed to mask CHTERMI interrupt\n");
0994 return ret;
0995 }
0996
0997
0998
0999
1000 mask2 = mask2 | GET_MASK(F_CHTERMIM);
1001 }
1002 cancel_delayed_work_sync(&info->max_charging_time_work);
1003 alert_userspace = true;
1004 }
1005 }
1006 if (irq2 & GET_MASK(F_CHRCHGI)) {
1007 dev_dbg(dev, "Recharge request\n");
1008 ret = regmap_field_write(info->regmap_fields[F_CHG_EN],
1009 RT9455_CHARGE_ENABLE);
1010 if (ret) {
1011 dev_err(dev, "Failed to enable charging\n");
1012 return ret;
1013 }
1014 if (mask2 & GET_MASK(F_CHTERMIM)) {
1015 ret = regmap_field_write(
1016 info->regmap_fields[F_CHTERMIM], 0x00);
1017 if (ret) {
1018 dev_err(dev, "Failed to unmask CHTERMI interrupt\n");
1019 return ret;
1020 }
1021
1022 mask2 = mask2 & ~GET_MASK(F_CHTERMIM);
1023 }
1024 if (!is_battery_absent) {
1025
1026
1027
1028
1029
1030
1031 queue_delayed_work(system_power_efficient_wq,
1032 &info->max_charging_time_work,
1033 RT9455_MAX_CHARGING_TIME * HZ);
1034 alert_userspace = true;
1035 }
1036 }
1037 if (irq2 & GET_MASK(F_CH32MI)) {
1038 dev_err(dev, "Charger fault. 32 mins timeout occurred\n");
1039 alert_userspace = true;
1040 }
1041 if (irq2 & GET_MASK(F_CHTREGI)) {
1042 dev_warn(dev,
1043 "Charger warning. Thermal regulation loop active\n");
1044 alert_userspace = true;
1045 }
1046 if (irq2 & GET_MASK(F_CHMIVRI)) {
1047 dev_dbg(dev,
1048 "Charger warning. Input voltage MIVR loop active\n");
1049 }
1050
1051 if (alert_userspace)
1052 *_alert_userspace = alert_userspace;
1053
1054 return 0;
1055 }
1056
1057 static int rt9455_irq_handler_check_irq3_register(struct rt9455_info *info,
1058 bool *_alert_userspace)
1059 {
1060 unsigned int irq3, mask3;
1061 struct device *dev = &info->client->dev;
1062 bool alert_userspace = false;
1063 int ret;
1064
1065 ret = regmap_read(info->regmap, RT9455_REG_IRQ3, &irq3);
1066 if (ret) {
1067 dev_err(dev, "Failed to read IRQ3 register\n");
1068 return ret;
1069 }
1070
1071 ret = regmap_read(info->regmap, RT9455_REG_MASK3, &mask3);
1072 if (ret) {
1073 dev_err(dev, "Failed to read MASK3 register\n");
1074 return ret;
1075 }
1076
1077 if (irq3 & GET_MASK(F_BSTBUSOVI)) {
1078 dev_err(dev, "Boost fault. Overvoltage input occurred\n");
1079 alert_userspace = true;
1080 }
1081 if (irq3 & GET_MASK(F_BSTOLI)) {
1082 dev_err(dev, "Boost fault. Overload\n");
1083 alert_userspace = true;
1084 }
1085 if (irq3 & GET_MASK(F_BSTLOWVI)) {
1086 dev_err(dev, "Boost fault. Battery voltage too low\n");
1087 alert_userspace = true;
1088 }
1089 if (irq3 & GET_MASK(F_BST32SI)) {
1090 dev_err(dev, "Boost fault. 32 seconds timeout occurred.\n");
1091 alert_userspace = true;
1092 }
1093
1094 if (alert_userspace) {
1095 dev_info(dev, "Boost fault occurred, therefore the charger goes into charge mode\n");
1096 ret = rt9455_set_voreg_before_charge_mode(info);
1097 if (ret) {
1098 dev_err(dev, "Failed to set VOREG before entering charge mode\n");
1099 return ret;
1100 }
1101 ret = regmap_field_write(info->regmap_fields[F_OPA_MODE],
1102 RT9455_CHARGE_MODE);
1103 if (ret) {
1104 dev_err(dev, "Failed to set charger in charge mode\n");
1105 return ret;
1106 }
1107 *_alert_userspace = alert_userspace;
1108 }
1109
1110 return 0;
1111 }
1112
1113 static irqreturn_t rt9455_irq_handler_thread(int irq, void *data)
1114 {
1115 struct rt9455_info *info = data;
1116 struct device *dev;
1117 bool alert_userspace = false;
1118 bool is_battery_absent = false;
1119 unsigned int status;
1120 int ret;
1121
1122 if (!info)
1123 return IRQ_NONE;
1124
1125 dev = &info->client->dev;
1126
1127 if (irq != info->client->irq) {
1128 dev_err(dev, "Interrupt is not for RT9455 charger\n");
1129 return IRQ_NONE;
1130 }
1131
1132 ret = regmap_field_read(info->regmap_fields[F_STAT], &status);
1133 if (ret) {
1134 dev_err(dev, "Failed to read STAT bits\n");
1135 return IRQ_HANDLED;
1136 }
1137 dev_dbg(dev, "Charger status is %d\n", status);
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150 ret = rt9455_irq_handler_check_irq1_register(info, &is_battery_absent,
1151 &alert_userspace);
1152 if (ret) {
1153 dev_err(dev, "Failed to handle IRQ1 register\n");
1154 return IRQ_HANDLED;
1155 }
1156
1157 ret = rt9455_irq_handler_check_irq2_register(info, is_battery_absent,
1158 &alert_userspace);
1159 if (ret) {
1160 dev_err(dev, "Failed to handle IRQ2 register\n");
1161 return IRQ_HANDLED;
1162 }
1163
1164 ret = rt9455_irq_handler_check_irq3_register(info, &alert_userspace);
1165 if (ret) {
1166 dev_err(dev, "Failed to handle IRQ3 register\n");
1167 return IRQ_HANDLED;
1168 }
1169
1170 if (alert_userspace) {
1171
1172
1173
1174
1175
1176 if (info->charger)
1177 power_supply_changed(info->charger);
1178 }
1179
1180 return IRQ_HANDLED;
1181 }
1182
1183 static int rt9455_discover_charger(struct rt9455_info *info, u32 *ichrg,
1184 u32 *ieoc_percentage,
1185 u32 *mivr, u32 *iaicr)
1186 {
1187 struct device *dev = &info->client->dev;
1188 int ret;
1189
1190 if (!dev->of_node && !ACPI_HANDLE(dev)) {
1191 dev_err(dev, "No support for either device tree or ACPI\n");
1192 return -EINVAL;
1193 }
1194
1195
1196
1197
1198 ret = device_property_read_u32(dev, "richtek,output-charge-current",
1199 ichrg);
1200 if (ret) {
1201 dev_err(dev, "Error: missing \"output-charge-current\" property\n");
1202 return ret;
1203 }
1204
1205 ret = device_property_read_u32(dev, "richtek,end-of-charge-percentage",
1206 ieoc_percentage);
1207 if (ret) {
1208 dev_err(dev, "Error: missing \"end-of-charge-percentage\" property\n");
1209 return ret;
1210 }
1211
1212 ret = device_property_read_u32(dev,
1213 "richtek,battery-regulation-voltage",
1214 &info->voreg);
1215 if (ret) {
1216 dev_err(dev, "Error: missing \"battery-regulation-voltage\" property\n");
1217 return ret;
1218 }
1219
1220 ret = device_property_read_u32(dev, "richtek,boost-output-voltage",
1221 &info->boost_voltage);
1222 if (ret) {
1223 dev_err(dev, "Error: missing \"boost-output-voltage\" property\n");
1224 return ret;
1225 }
1226
1227
1228
1229
1230
1231 device_property_read_u32(dev, "richtek,min-input-voltage-regulation",
1232 mivr);
1233 device_property_read_u32(dev, "richtek,avg-input-current-regulation",
1234 iaicr);
1235
1236 return 0;
1237 }
1238
1239 #if IS_ENABLED(CONFIG_USB_PHY)
1240 static int rt9455_usb_event_none(struct rt9455_info *info,
1241 u8 opa_mode, u8 iaicr)
1242 {
1243 struct device *dev = &info->client->dev;
1244 int ret;
1245
1246 if (opa_mode == RT9455_BOOST_MODE) {
1247 ret = rt9455_set_voreg_before_charge_mode(info);
1248 if (ret) {
1249 dev_err(dev, "Failed to set VOREG before entering charge mode\n");
1250 return ret;
1251 }
1252
1253
1254
1255
1256
1257
1258 dev_dbg(dev, "USB_EVENT_NONE received, therefore the charger goes into charge mode\n");
1259 ret = regmap_field_write(info->regmap_fields[F_OPA_MODE],
1260 RT9455_CHARGE_MODE);
1261 if (ret) {
1262 dev_err(dev, "Failed to set charger in charge mode\n");
1263 return NOTIFY_DONE;
1264 }
1265 }
1266
1267 dev_dbg(dev, "USB_EVENT_NONE received, therefore IAICR is set to its minimum value\n");
1268 if (iaicr != RT9455_IAICR_100MA) {
1269 ret = regmap_field_write(info->regmap_fields[F_IAICR],
1270 RT9455_IAICR_100MA);
1271 if (ret) {
1272 dev_err(dev, "Failed to set IAICR value\n");
1273 return NOTIFY_DONE;
1274 }
1275 }
1276
1277 return NOTIFY_OK;
1278 }
1279
1280 static int rt9455_usb_event_vbus(struct rt9455_info *info,
1281 u8 opa_mode, u8 iaicr)
1282 {
1283 struct device *dev = &info->client->dev;
1284 int ret;
1285
1286 if (opa_mode == RT9455_BOOST_MODE) {
1287 ret = rt9455_set_voreg_before_charge_mode(info);
1288 if (ret) {
1289 dev_err(dev, "Failed to set VOREG before entering charge mode\n");
1290 return ret;
1291 }
1292
1293
1294
1295
1296
1297
1298 dev_dbg(dev, "USB_EVENT_VBUS received, therefore the charger goes into charge mode\n");
1299 ret = regmap_field_write(info->regmap_fields[F_OPA_MODE],
1300 RT9455_CHARGE_MODE);
1301 if (ret) {
1302 dev_err(dev, "Failed to set charger in charge mode\n");
1303 return NOTIFY_DONE;
1304 }
1305 }
1306
1307 dev_dbg(dev, "USB_EVENT_VBUS received, therefore IAICR is set to 500 mA\n");
1308 if (iaicr != RT9455_IAICR_500MA) {
1309 ret = regmap_field_write(info->regmap_fields[F_IAICR],
1310 RT9455_IAICR_500MA);
1311 if (ret) {
1312 dev_err(dev, "Failed to set IAICR value\n");
1313 return NOTIFY_DONE;
1314 }
1315 }
1316
1317 return NOTIFY_OK;
1318 }
1319
1320 static int rt9455_usb_event_id(struct rt9455_info *info,
1321 u8 opa_mode, u8 iaicr)
1322 {
1323 struct device *dev = &info->client->dev;
1324 int ret;
1325
1326 if (opa_mode == RT9455_CHARGE_MODE) {
1327 ret = rt9455_set_boost_voltage_before_boost_mode(info);
1328 if (ret) {
1329 dev_err(dev, "Failed to set boost output voltage before entering boost mode\n");
1330 return ret;
1331 }
1332
1333
1334
1335
1336
1337
1338 dev_dbg(dev, "USB_EVENT_ID received, therefore the charger goes into boost mode\n");
1339 ret = regmap_field_write(info->regmap_fields[F_OPA_MODE],
1340 RT9455_BOOST_MODE);
1341 if (ret) {
1342 dev_err(dev, "Failed to set charger in boost mode\n");
1343 return NOTIFY_DONE;
1344 }
1345 }
1346
1347 dev_dbg(dev, "USB_EVENT_ID received, therefore IAICR is set to its minimum value\n");
1348 if (iaicr != RT9455_IAICR_100MA) {
1349 ret = regmap_field_write(info->regmap_fields[F_IAICR],
1350 RT9455_IAICR_100MA);
1351 if (ret) {
1352 dev_err(dev, "Failed to set IAICR value\n");
1353 return NOTIFY_DONE;
1354 }
1355 }
1356
1357 return NOTIFY_OK;
1358 }
1359
1360 static int rt9455_usb_event_charger(struct rt9455_info *info,
1361 u8 opa_mode, u8 iaicr)
1362 {
1363 struct device *dev = &info->client->dev;
1364 int ret;
1365
1366 if (opa_mode == RT9455_BOOST_MODE) {
1367 ret = rt9455_set_voreg_before_charge_mode(info);
1368 if (ret) {
1369 dev_err(dev, "Failed to set VOREG before entering charge mode\n");
1370 return ret;
1371 }
1372
1373
1374
1375
1376
1377
1378 dev_dbg(dev, "USB_EVENT_CHARGER received, therefore the charger goes into charge mode\n");
1379 ret = regmap_field_write(info->regmap_fields[F_OPA_MODE],
1380 RT9455_CHARGE_MODE);
1381 if (ret) {
1382 dev_err(dev, "Failed to set charger in charge mode\n");
1383 return NOTIFY_DONE;
1384 }
1385 }
1386
1387 dev_dbg(dev, "USB_EVENT_CHARGER received, therefore IAICR is set to no current limit\n");
1388 if (iaicr != RT9455_IAICR_NO_LIMIT) {
1389 ret = regmap_field_write(info->regmap_fields[F_IAICR],
1390 RT9455_IAICR_NO_LIMIT);
1391 if (ret) {
1392 dev_err(dev, "Failed to set IAICR value\n");
1393 return NOTIFY_DONE;
1394 }
1395 }
1396
1397 return NOTIFY_OK;
1398 }
1399
1400 static int rt9455_usb_event(struct notifier_block *nb,
1401 unsigned long event, void *power)
1402 {
1403 struct rt9455_info *info = container_of(nb, struct rt9455_info, nb);
1404 struct device *dev = &info->client->dev;
1405 unsigned int opa_mode, iaicr;
1406 int ret;
1407
1408
1409
1410
1411
1412 ret = regmap_field_read(info->regmap_fields[F_OPA_MODE],
1413 &opa_mode);
1414 if (ret) {
1415 dev_err(dev, "Failed to read OPA_MODE value\n");
1416 return NOTIFY_DONE;
1417 }
1418
1419 ret = regmap_field_read(info->regmap_fields[F_IAICR],
1420 &iaicr);
1421 if (ret) {
1422 dev_err(dev, "Failed to read IAICR value\n");
1423 return NOTIFY_DONE;
1424 }
1425
1426 dev_dbg(dev, "Received USB event %lu\n", event);
1427 switch (event) {
1428 case USB_EVENT_NONE:
1429 return rt9455_usb_event_none(info, opa_mode, iaicr);
1430 case USB_EVENT_VBUS:
1431 return rt9455_usb_event_vbus(info, opa_mode, iaicr);
1432 case USB_EVENT_ID:
1433 return rt9455_usb_event_id(info, opa_mode, iaicr);
1434 case USB_EVENT_CHARGER:
1435 return rt9455_usb_event_charger(info, opa_mode, iaicr);
1436 default:
1437 dev_err(dev, "Unknown USB event\n");
1438 }
1439 return NOTIFY_DONE;
1440 }
1441 #endif
1442
1443 static void rt9455_pwr_rdy_work_callback(struct work_struct *work)
1444 {
1445 struct rt9455_info *info = container_of(work, struct rt9455_info,
1446 pwr_rdy_work.work);
1447 struct device *dev = &info->client->dev;
1448 unsigned int pwr_rdy;
1449 int ret;
1450
1451 ret = regmap_field_read(info->regmap_fields[F_PWR_RDY], &pwr_rdy);
1452 if (ret) {
1453 dev_err(dev, "Failed to read PWR_RDY bit\n");
1454 return;
1455 }
1456 switch (pwr_rdy) {
1457 case RT9455_PWR_FAULT:
1458 dev_dbg(dev, "Charger disconnected from power source\n");
1459 cancel_delayed_work_sync(&info->max_charging_time_work);
1460 break;
1461 case RT9455_PWR_GOOD:
1462 dev_dbg(dev, "Charger connected to power source\n");
1463 ret = regmap_field_write(info->regmap_fields[F_CHG_EN],
1464 RT9455_CHARGE_ENABLE);
1465 if (ret) {
1466 dev_err(dev, "Failed to enable charging\n");
1467 return;
1468 }
1469 queue_delayed_work(system_power_efficient_wq,
1470 &info->max_charging_time_work,
1471 RT9455_MAX_CHARGING_TIME * HZ);
1472 break;
1473 }
1474
1475
1476
1477
1478 power_supply_changed(info->charger);
1479 }
1480
1481 static void rt9455_max_charging_time_work_callback(struct work_struct *work)
1482 {
1483 struct rt9455_info *info = container_of(work, struct rt9455_info,
1484 max_charging_time_work.work);
1485 struct device *dev = &info->client->dev;
1486 int ret;
1487
1488 dev_err(dev, "Battery has been charging for at least 6 hours and is not yet fully charged. Battery is dead, therefore charging is disabled.\n");
1489 ret = regmap_field_write(info->regmap_fields[F_CHG_EN],
1490 RT9455_CHARGE_DISABLE);
1491 if (ret)
1492 dev_err(dev, "Failed to disable charging\n");
1493 }
1494
1495 static void rt9455_batt_presence_work_callback(struct work_struct *work)
1496 {
1497 struct rt9455_info *info = container_of(work, struct rt9455_info,
1498 batt_presence_work.work);
1499 struct device *dev = &info->client->dev;
1500 unsigned int irq1, mask1;
1501 int ret;
1502
1503 ret = regmap_read(info->regmap, RT9455_REG_IRQ1, &irq1);
1504 if (ret) {
1505 dev_err(dev, "Failed to read IRQ1 register\n");
1506 return;
1507 }
1508
1509
1510
1511
1512
1513 if (irq1 & GET_MASK(F_BATAB)) {
1514 queue_delayed_work(system_power_efficient_wq,
1515 &info->batt_presence_work,
1516 RT9455_BATT_PRESENCE_DELAY * HZ);
1517 } else {
1518 queue_delayed_work(system_power_efficient_wq,
1519 &info->max_charging_time_work,
1520 RT9455_MAX_CHARGING_TIME * HZ);
1521
1522 ret = regmap_read(info->regmap, RT9455_REG_MASK1, &mask1);
1523 if (ret) {
1524 dev_err(dev, "Failed to read MASK1 register\n");
1525 return;
1526 }
1527
1528 if (mask1 & GET_MASK(F_BATABM)) {
1529 ret = regmap_field_write(info->regmap_fields[F_BATABM],
1530 0x00);
1531 if (ret)
1532 dev_err(dev, "Failed to unmask BATAB interrupt\n");
1533 }
1534
1535
1536
1537
1538 power_supply_changed(info->charger);
1539 }
1540 }
1541
1542 static const struct power_supply_desc rt9455_charger_desc = {
1543 .name = RT9455_DRIVER_NAME,
1544 .type = POWER_SUPPLY_TYPE_USB,
1545 .properties = rt9455_charger_properties,
1546 .num_properties = ARRAY_SIZE(rt9455_charger_properties),
1547 .get_property = rt9455_charger_get_property,
1548 };
1549
1550 static bool rt9455_is_writeable_reg(struct device *dev, unsigned int reg)
1551 {
1552 switch (reg) {
1553 case RT9455_REG_DEV_ID:
1554 case RT9455_REG_IRQ1:
1555 case RT9455_REG_IRQ2:
1556 case RT9455_REG_IRQ3:
1557 return false;
1558 default:
1559 return true;
1560 }
1561 }
1562
1563 static bool rt9455_is_volatile_reg(struct device *dev, unsigned int reg)
1564 {
1565 switch (reg) {
1566 case RT9455_REG_DEV_ID:
1567 case RT9455_REG_CTRL5:
1568 case RT9455_REG_CTRL6:
1569 return false;
1570 default:
1571 return true;
1572 }
1573 }
1574
1575 static const struct regmap_config rt9455_regmap_config = {
1576 .reg_bits = 8,
1577 .val_bits = 8,
1578 .writeable_reg = rt9455_is_writeable_reg,
1579 .volatile_reg = rt9455_is_volatile_reg,
1580 .max_register = RT9455_REG_MASK3,
1581 .cache_type = REGCACHE_RBTREE,
1582 };
1583
1584 static int rt9455_probe(struct i2c_client *client,
1585 const struct i2c_device_id *id)
1586 {
1587 struct i2c_adapter *adapter = client->adapter;
1588 struct device *dev = &client->dev;
1589 struct rt9455_info *info;
1590 struct power_supply_config rt9455_charger_config = {};
1591
1592
1593
1594
1595
1596 u32 ichrg, ieoc_percentage;
1597
1598 u32 mivr = -1, iaicr = -1;
1599 int i, ret;
1600
1601 if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) {
1602 dev_err(dev, "No support for SMBUS_BYTE_DATA\n");
1603 return -ENODEV;
1604 }
1605 info = devm_kzalloc(dev, sizeof(*info), GFP_KERNEL);
1606 if (!info)
1607 return -ENOMEM;
1608
1609 info->client = client;
1610 i2c_set_clientdata(client, info);
1611
1612 info->regmap = devm_regmap_init_i2c(client,
1613 &rt9455_regmap_config);
1614 if (IS_ERR(info->regmap)) {
1615 dev_err(dev, "Failed to initialize register map\n");
1616 return -EINVAL;
1617 }
1618
1619 for (i = 0; i < F_MAX_FIELDS; i++) {
1620 info->regmap_fields[i] =
1621 devm_regmap_field_alloc(dev, info->regmap,
1622 rt9455_reg_fields[i]);
1623 if (IS_ERR(info->regmap_fields[i])) {
1624 dev_err(dev,
1625 "Failed to allocate regmap field = %d\n", i);
1626 return PTR_ERR(info->regmap_fields[i]);
1627 }
1628 }
1629
1630 ret = rt9455_discover_charger(info, &ichrg, &ieoc_percentage,
1631 &mivr, &iaicr);
1632 if (ret) {
1633 dev_err(dev, "Failed to discover charger\n");
1634 return ret;
1635 }
1636
1637 #if IS_ENABLED(CONFIG_USB_PHY)
1638 info->usb_phy = devm_usb_get_phy(dev, USB_PHY_TYPE_USB2);
1639 if (IS_ERR(info->usb_phy)) {
1640 dev_err(dev, "Failed to get USB transceiver\n");
1641 } else {
1642 info->nb.notifier_call = rt9455_usb_event;
1643 ret = usb_register_notifier(info->usb_phy, &info->nb);
1644 if (ret) {
1645 dev_err(dev, "Failed to register USB notifier\n");
1646
1647
1648
1649
1650 info->nb.notifier_call = NULL;
1651 }
1652 }
1653 #endif
1654
1655 INIT_DEFERRABLE_WORK(&info->pwr_rdy_work, rt9455_pwr_rdy_work_callback);
1656 INIT_DEFERRABLE_WORK(&info->max_charging_time_work,
1657 rt9455_max_charging_time_work_callback);
1658 INIT_DEFERRABLE_WORK(&info->batt_presence_work,
1659 rt9455_batt_presence_work_callback);
1660
1661 rt9455_charger_config.of_node = dev->of_node;
1662 rt9455_charger_config.drv_data = info;
1663 rt9455_charger_config.supplied_to = rt9455_charger_supplied_to;
1664 rt9455_charger_config.num_supplicants =
1665 ARRAY_SIZE(rt9455_charger_supplied_to);
1666 ret = devm_request_threaded_irq(dev, client->irq, NULL,
1667 rt9455_irq_handler_thread,
1668 IRQF_TRIGGER_LOW | IRQF_ONESHOT,
1669 RT9455_DRIVER_NAME, info);
1670 if (ret) {
1671 dev_err(dev, "Failed to register IRQ handler\n");
1672 goto put_usb_notifier;
1673 }
1674
1675 ret = rt9455_hw_init(info, ichrg, ieoc_percentage, mivr, iaicr);
1676 if (ret) {
1677 dev_err(dev, "Failed to set charger to its default values\n");
1678 goto put_usb_notifier;
1679 }
1680
1681 info->charger = devm_power_supply_register(dev, &rt9455_charger_desc,
1682 &rt9455_charger_config);
1683 if (IS_ERR(info->charger)) {
1684 dev_err(dev, "Failed to register charger\n");
1685 ret = PTR_ERR(info->charger);
1686 goto put_usb_notifier;
1687 }
1688
1689 return 0;
1690
1691 put_usb_notifier:
1692 #if IS_ENABLED(CONFIG_USB_PHY)
1693 if (info->nb.notifier_call) {
1694 usb_unregister_notifier(info->usb_phy, &info->nb);
1695 info->nb.notifier_call = NULL;
1696 }
1697 #endif
1698 return ret;
1699 }
1700
1701 static int rt9455_remove(struct i2c_client *client)
1702 {
1703 int ret;
1704 struct rt9455_info *info = i2c_get_clientdata(client);
1705
1706 ret = rt9455_register_reset(info);
1707 if (ret)
1708 dev_err(&info->client->dev, "Failed to set charger to its default values\n");
1709
1710 #if IS_ENABLED(CONFIG_USB_PHY)
1711 if (info->nb.notifier_call)
1712 usb_unregister_notifier(info->usb_phy, &info->nb);
1713 #endif
1714
1715 cancel_delayed_work_sync(&info->pwr_rdy_work);
1716 cancel_delayed_work_sync(&info->max_charging_time_work);
1717 cancel_delayed_work_sync(&info->batt_presence_work);
1718
1719 return 0;
1720 }
1721
1722 static const struct i2c_device_id rt9455_i2c_id_table[] = {
1723 { RT9455_DRIVER_NAME, 0 },
1724 { },
1725 };
1726 MODULE_DEVICE_TABLE(i2c, rt9455_i2c_id_table);
1727
1728 static const struct of_device_id rt9455_of_match[] = {
1729 { .compatible = "richtek,rt9455", },
1730 { },
1731 };
1732 MODULE_DEVICE_TABLE(of, rt9455_of_match);
1733
1734 #ifdef CONFIG_ACPI
1735 static const struct acpi_device_id rt9455_i2c_acpi_match[] = {
1736 { "RT945500", 0 },
1737 { }
1738 };
1739 MODULE_DEVICE_TABLE(acpi, rt9455_i2c_acpi_match);
1740 #endif
1741
1742 static struct i2c_driver rt9455_driver = {
1743 .probe = rt9455_probe,
1744 .remove = rt9455_remove,
1745 .id_table = rt9455_i2c_id_table,
1746 .driver = {
1747 .name = RT9455_DRIVER_NAME,
1748 .of_match_table = of_match_ptr(rt9455_of_match),
1749 .acpi_match_table = ACPI_PTR(rt9455_i2c_acpi_match),
1750 },
1751 };
1752 module_i2c_driver(rt9455_driver);
1753
1754 MODULE_LICENSE("GPL");
1755 MODULE_AUTHOR("Anda-Maria Nicolae <anda-maria.nicolae@intel.com>");
1756 MODULE_DESCRIPTION("Richtek RT9455 Charger Driver");