@@ -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)
134130static 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)
162158static 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
348334static 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
419403static 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
502467static 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