Skip to content

Commit ef1e734

Browse files
Dzmitry Sankouskisre
authored andcommitted
power: supply: max77705_charger: use regfields for config registers
Using regfields allows to cleanup masks and register offset definition, allowing to access register info by it's functional name. Signed-off-by: Dzmitry Sankouski <dsankouski@gmail.com> Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
1 parent d84510d commit ef1e734

2 files changed

Lines changed: 93 additions & 114 deletions

File tree

drivers/power/supply/max77705_charger.c

Lines changed: 39 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,7 @@ static int max77705_charger_enable(struct max77705_charger_data *chg)
7474
{
7575
int rv;
7676

77-
rv = regmap_update_bits(chg->regmap, MAX77705_CHG_REG_CNFG_09,
78-
MAX77705_CHG_EN_MASK, MAX77705_CHG_EN_MASK);
77+
rv = regmap_field_write(chg->rfield[MAX77705_CHG_EN], 1);
7978
if (rv)
8079
dev_err(chg->dev, "unable to enable the charger: %d\n", rv);
8180

@@ -87,10 +86,7 @@ static void max77705_charger_disable(void *data)
8786
struct max77705_charger_data *chg = data;
8887
int rv;
8988

90-
rv = regmap_update_bits(chg->regmap,
91-
MAX77705_CHG_REG_CNFG_09,
92-
MAX77705_CHG_EN_MASK,
93-
MAX77705_CHG_DISABLE);
89+
rv = regmap_field_write(chg->rfield[MAX77705_CHG_EN], MAX77705_CHG_DISABLE);
9490
if (rv)
9591
dev_err(chg->dev, "unable to disable the charger: %d\n", rv);
9692
}
@@ -134,10 +130,10 @@ static int max77705_check_battery(struct max77705_charger_data *chg, int *val)
134130
static int max77705_get_charge_type(struct max77705_charger_data *chg, int *val)
135131
{
136132
struct regmap *regmap = chg->regmap;
137-
unsigned int reg_data;
133+
unsigned int reg_data, chg_en;
138134

139-
regmap_read(regmap, MAX77705_CHG_REG_CNFG_09, &reg_data);
140-
if (!MAX77705_CHARGER_CHG_CHARGING(reg_data)) {
135+
regmap_field_read(chg->rfield[MAX77705_CHG_EN], &chg_en);
136+
if (!chg_en) {
141137
*val = POWER_SUPPLY_CHARGE_TYPE_NONE;
142138
return 0;
143139
}
@@ -162,10 +158,10 @@ static int max77705_get_charge_type(struct max77705_charger_data *chg, int *val)
162158
static int max77705_get_status(struct max77705_charger_data *chg, int *val)
163159
{
164160
struct regmap *regmap = chg->regmap;
165-
unsigned int reg_data;
161+
unsigned int reg_data, chg_en;
166162

167-
regmap_read(regmap, MAX77705_CHG_REG_CNFG_09, &reg_data);
168-
if (!MAX77705_CHARGER_CHG_CHARGING(reg_data)) {
163+
regmap_field_read(chg->rfield[MAX77705_CHG_EN], &chg_en);
164+
if (!chg_en) {
169165
*val = POWER_SUPPLY_CHARGE_TYPE_NONE;
170166
return 0;
171167
}
@@ -295,16 +291,11 @@ static int max77705_get_input_current(struct max77705_charger_data *chg,
295291
{
296292
unsigned int reg_data;
297293
int get_current = 0;
298-
struct regmap *regmap = chg->regmap;
299294

300-
regmap_read(regmap, MAX77705_CHG_REG_CNFG_09, &reg_data);
301-
302-
reg_data &= MAX77705_CHG_CHGIN_LIM_MASK;
295+
regmap_field_read(chg->rfield[MAX77705_CHG_CHGIN_LIM], &reg_data);
303296

304297
if (reg_data <= 3)
305298
get_current = MAX77705_CURRENT_CHGIN_MIN;
306-
else if (reg_data >= MAX77705_CHG_CHGIN_LIM_MASK)
307-
get_current = MAX77705_CURRENT_CHGIN_MAX;
308299
else
309300
get_current = (reg_data + 1) * MAX77705_CURRENT_CHGIN_STEP;
310301

@@ -317,10 +308,8 @@ static int max77705_get_charge_current(struct max77705_charger_data *chg,
317308
int *val)
318309
{
319310
unsigned int reg_data;
320-
struct regmap *regmap = chg->regmap;
321311

322-
regmap_read(regmap, MAX77705_CHG_REG_CNFG_02, &reg_data);
323-
reg_data &= MAX77705_CHG_CC;
312+
regmap_field_read(chg->rfield[MAX77705_CHG_CC_LIM], &reg_data);
324313

325314
*val = reg_data <= 0x2 ? MAX77705_CURRENT_CHGIN_MIN : reg_data * MAX77705_CURRENT_CHG_STEP;
326315

@@ -332,28 +321,23 @@ static int max77705_set_float_voltage(struct max77705_charger_data *chg,
332321
{
333322
int float_voltage_mv;
334323
unsigned int reg_data = 0;
335-
struct regmap *regmap = chg->regmap;
336324

337325
float_voltage_mv = float_voltage / 1000;
338326
reg_data = float_voltage_mv <= 4000 ? 0x0 :
339327
float_voltage_mv >= 4500 ? 0x23 :
340328
(float_voltage_mv <= 4200) ? (float_voltage_mv - 4000) / 50 :
341329
(((float_voltage_mv - 4200) / 10) + 0x04);
342330

343-
return regmap_update_bits(regmap, MAX77705_CHG_REG_CNFG_04,
344-
MAX77705_CHG_CV_PRM_MASK,
345-
(reg_data << MAX77705_CHG_CV_PRM_SHIFT));
331+
return regmap_field_write(chg->rfield[MAX77705_CHG_CV_PRM], reg_data);
346332
}
347333

348334
static int max77705_get_float_voltage(struct max77705_charger_data *chg,
349335
int *val)
350336
{
351337
unsigned int reg_data = 0;
352338
int voltage_mv;
353-
struct regmap *regmap = chg->regmap;
354339

355-
regmap_read(regmap, MAX77705_CHG_REG_CNFG_04, &reg_data);
356-
reg_data &= MAX77705_CHG_PRM_MASK;
340+
regmap_field_read(chg->rfield[MAX77705_CHG_CV_PRM], &reg_data);
357341
voltage_mv = reg_data <= 0x04 ? reg_data * 50 + 4000 :
358342
(reg_data - 4) * 10 + 4200;
359343
*val = voltage_mv * 1000;
@@ -418,7 +402,6 @@ static void max77705_chgin_isr_work(struct work_struct *work)
418402

419403
static void max77705_charger_initialize(struct max77705_charger_data *chg)
420404
{
421-
u8 reg_data;
422405
struct power_supply_battery_info *info;
423406
struct regmap *regmap = chg->regmap;
424407

@@ -429,45 +412,31 @@ static void max77705_charger_initialize(struct max77705_charger_data *chg)
429412

430413
/* unlock charger setting protect */
431414
/* slowest LX slope */
432-
reg_data = MAX77705_CHGPROT_MASK | MAX77705_SLOWEST_LX_SLOPE;
433-
regmap_update_bits(regmap, MAX77705_CHG_REG_CNFG_06, reg_data,
434-
reg_data);
415+
regmap_field_write(chg->rfield[MAX77705_CHGPROT], MAX77705_CHGPROT_UNLOCKED);
416+
regmap_field_write(chg->rfield[MAX77705_LX_SLOPE], MAX77705_SLOWEST_LX_SLOPE);
435417

436418
/* fast charge timer disable */
437419
/* restart threshold disable */
438420
/* pre-qual charge disable */
439-
reg_data = (MAX77705_FCHGTIME_DISABLE << MAX77705_FCHGTIME_SHIFT) |
440-
(MAX77705_CHG_RSTRT_DISABLE << MAX77705_CHG_RSTRT_SHIFT) |
441-
(MAX77705_CHG_PQEN_DISABLE << MAX77705_PQEN_SHIFT);
442-
regmap_update_bits(regmap, MAX77705_CHG_REG_CNFG_01,
443-
(MAX77705_FCHGTIME_MASK |
444-
MAX77705_CHG_RSTRT_MASK |
445-
MAX77705_PQEN_MASK),
446-
reg_data);
447-
448-
/* OTG off(UNO on), boost off */
449-
regmap_update_bits(regmap, MAX77705_CHG_REG_CNFG_00,
450-
MAX77705_OTG_CTRL, 0);
421+
regmap_field_write(chg->rfield[MAX77705_FCHGTIME], MAX77705_FCHGTIME_DISABLE);
422+
regmap_field_write(chg->rfield[MAX77705_CHG_RSTRT], MAX77705_CHG_RSTRT_DISABLE);
423+
regmap_field_write(chg->rfield[MAX77705_CHG_PQEN], MAX77705_CHG_PQEN_DISABLE);
424+
425+
regmap_field_write(chg->rfield[MAX77705_MODE],
426+
MAX77705_CHG_MASK | MAX77705_BUCK_MASK);
451427

452428
/* charge current 450mA(default) */
453429
/* otg current limit 900mA */
454-
regmap_update_bits(regmap, MAX77705_CHG_REG_CNFG_02,
455-
MAX77705_OTG_ILIM_MASK,
456-
MAX77705_OTG_ILIM_900 << MAX77705_OTG_ILIM_SHIFT);
430+
regmap_field_write(chg->rfield[MAX77705_OTG_ILIM], MAX77705_OTG_ILIM_900);
457431

458432
/* BAT to SYS OCP 4.80A */
459-
regmap_update_bits(regmap, MAX77705_CHG_REG_CNFG_05,
460-
MAX77705_REG_B2SOVRC_MASK,
461-
MAX77705_B2SOVRC_4_8A << MAX77705_REG_B2SOVRC_SHIFT);
433+
regmap_field_write(chg->rfield[MAX77705_REG_B2SOVRC], MAX77705_B2SOVRC_4_8A);
434+
462435
/* top off current 150mA */
463436
/* top off timer 30min */
464-
reg_data = (MAX77705_TO_ITH_150MA << MAX77705_TO_ITH_SHIFT) |
465-
(MAX77705_TO_TIME_30M << MAX77705_TO_TIME_SHIFT) |
466-
(MAX77705_SYS_TRACK_DISABLE << MAX77705_SYS_TRACK_DIS_SHIFT);
467-
regmap_update_bits(regmap, MAX77705_CHG_REG_CNFG_03,
468-
(MAX77705_TO_ITH_MASK |
469-
MAX77705_TO_TIME_MASK |
470-
MAX77705_SYS_TRACK_DIS_MASK), reg_data);
437+
regmap_field_write(chg->rfield[MAX77705_TO], MAX77705_TO_ITH_150MA);
438+
regmap_field_write(chg->rfield[MAX77705_TO_TIME], MAX77705_TO_TIME_30M);
439+
regmap_field_write(chg->rfield[MAX77705_SYS_TRACK], MAX77705_SYS_TRACK_DISABLE);
471440

472441
/* cv voltage 4.2V or 4.35V */
473442
/* MINVSYS 3.6V(default) */
@@ -478,25 +447,21 @@ static void max77705_charger_initialize(struct max77705_charger_data *chg)
478447
max77705_set_float_voltage(chg, info->voltage_max_design_uv);
479448
}
480449

481-
regmap_update_bits(regmap, MAX77705_CHG_REG_CNFG_12,
482-
MAX77705_VCHGIN_REG_MASK, MAX77705_VCHGIN_4_5);
483-
regmap_update_bits(regmap, MAX77705_CHG_REG_CNFG_12,
484-
MAX77705_WCIN_REG_MASK, MAX77705_WCIN_4_5);
450+
regmap_field_write(chg->rfield[MAX77705_VCHGIN], MAX77705_VCHGIN_4_5);
451+
regmap_field_write(chg->rfield[MAX77705_WCIN], MAX77705_WCIN_4_5);
485452

486453
/* Watchdog timer */
487454
regmap_update_bits(regmap, MAX77705_CHG_REG_CNFG_00,
488455
MAX77705_WDTEN_MASK, 0);
489456

490457
/* VBYPSET=5.0V */
491-
regmap_update_bits(regmap, MAX77705_CHG_REG_CNFG_11, MAX77705_VBYPSET_MASK, 0);
458+
regmap_field_write(chg->rfield[MAX77705_VBYPSET], 0);
492459

493460
/* Switching Frequency : 1.5MHz */
494-
regmap_update_bits(regmap, MAX77705_CHG_REG_CNFG_08, MAX77705_REG_FSW_MASK,
495-
(MAX77705_CHG_FSW_1_5MHz << MAX77705_REG_FSW_SHIFT));
461+
regmap_field_write(chg->rfield[MAX77705_REG_FSW], MAX77705_CHG_FSW_1_5MHz);
496462

497463
/* Auto skip mode */
498-
regmap_update_bits(regmap, MAX77705_CHG_REG_CNFG_12, MAX77705_REG_DISKIP_MASK,
499-
(MAX77705_AUTO_SKIP << MAX77705_REG_DISKIP_SHIFT));
464+
regmap_field_write(chg->rfield[MAX77705_REG_DISKIP], MAX77705_AUTO_SKIP);
500465
}
501466

502467
static int max77705_charger_probe(struct i2c_client *i2c)
@@ -520,6 +485,14 @@ static int max77705_charger_probe(struct i2c_client *i2c)
520485
if (IS_ERR(chg->regmap))
521486
return PTR_ERR(chg->regmap);
522487

488+
for (int i = 0; i < MAX77705_N_REGMAP_FIELDS; i++) {
489+
chg->rfield[i] = devm_regmap_field_alloc(dev, chg->regmap,
490+
max77705_reg_field[i]);
491+
if (IS_ERR(chg->rfield[i]))
492+
return dev_err_probe(dev, PTR_ERR(chg->rfield[i]),
493+
"cannot allocate regmap field\n");
494+
}
495+
523496
ret = regmap_update_bits(chg->regmap,
524497
MAX77705_CHG_REG_INT_MASK,
525498
MAX77705_CHGIN_IM, 0);

0 commit comments

Comments
 (0)