1919#define MAX_FF_SPEED 0xff
2020
2121struct pm8xxx_regs {
22- unsigned int enable_addr ;
22+ unsigned int enable_offset ;
2323 unsigned int enable_mask ;
2424
25- unsigned int drv_addr ;
25+ unsigned int drv_offset ;
2626 unsigned int drv_mask ;
2727 unsigned int drv_shift ;
2828 unsigned int drv_en_manual_mask ;
2929};
3030
3131static const struct pm8xxx_regs pm8058_regs = {
32- .drv_addr = 0x4A ,
33- .drv_mask = 0xf8 ,
32+ .drv_offset = 0 ,
33+ .drv_mask = GENMASK ( 7 , 3 ) ,
3434 .drv_shift = 3 ,
3535 .drv_en_manual_mask = 0xfc ,
3636};
3737
3838static struct pm8xxx_regs pm8916_regs = {
39- .enable_addr = 0xc046 ,
39+ .enable_offset = 0x46 ,
4040 .enable_mask = BIT (7 ),
41- .drv_addr = 0xc041 ,
42- .drv_mask = 0x1F ,
41+ .drv_offset = 0x41 ,
42+ .drv_mask = GENMASK ( 4 , 0 ) ,
4343 .drv_shift = 0 ,
4444 .drv_en_manual_mask = 0 ,
4545};
@@ -50,6 +50,8 @@ static struct pm8xxx_regs pm8916_regs = {
5050 * @work: work structure to set the vibration parameters
5151 * @regmap: regmap for register read/write
5252 * @regs: registers' info
53+ * @enable_addr: vibrator enable register
54+ * @drv_addr: vibrator drive strength register
5355 * @speed: speed of vibration set from userland
5456 * @active: state of vibrator
5557 * @level: level of vibration to set in the chip
@@ -60,6 +62,8 @@ struct pm8xxx_vib {
6062 struct work_struct work ;
6163 struct regmap * regmap ;
6264 const struct pm8xxx_regs * regs ;
65+ unsigned int enable_addr ;
66+ unsigned int drv_addr ;
6367 int speed ;
6468 int level ;
6569 bool active ;
@@ -82,15 +86,15 @@ static int pm8xxx_vib_set(struct pm8xxx_vib *vib, bool on)
8286 else
8387 val &= ~regs -> drv_mask ;
8488
85- rc = regmap_write (vib -> regmap , regs -> drv_addr , val );
89+ rc = regmap_write (vib -> regmap , vib -> drv_addr , val );
8690 if (rc < 0 )
8791 return rc ;
8892
8993 vib -> reg_vib_drv = val ;
9094
9195 if (regs -> enable_mask )
92- rc = regmap_update_bits (vib -> regmap , regs -> enable_addr ,
93- regs -> enable_mask , on ? ~ 0 : 0 );
96+ rc = regmap_update_bits (vib -> regmap , vib -> enable_addr ,
97+ regs -> enable_mask , on ? regs -> enable_mask : 0 );
9498
9599 return rc ;
96100}
@@ -102,11 +106,10 @@ static int pm8xxx_vib_set(struct pm8xxx_vib *vib, bool on)
102106static void pm8xxx_work_handler (struct work_struct * work )
103107{
104108 struct pm8xxx_vib * vib = container_of (work , struct pm8xxx_vib , work );
105- const struct pm8xxx_regs * regs = vib -> regs ;
106- int rc ;
107109 unsigned int val ;
110+ int rc ;
108111
109- rc = regmap_read (vib -> regmap , regs -> drv_addr , & val );
112+ rc = regmap_read (vib -> regmap , vib -> drv_addr , & val );
110113 if (rc < 0 )
111114 return ;
112115
@@ -169,7 +172,7 @@ static int pm8xxx_vib_probe(struct platform_device *pdev)
169172 struct pm8xxx_vib * vib ;
170173 struct input_dev * input_dev ;
171174 int error ;
172- unsigned int val ;
175+ unsigned int val , reg_base = 0 ;
173176 const struct pm8xxx_regs * regs ;
174177
175178 vib = devm_kzalloc (& pdev -> dev , sizeof (* vib ), GFP_KERNEL );
@@ -187,15 +190,21 @@ static int pm8xxx_vib_probe(struct platform_device *pdev)
187190 INIT_WORK (& vib -> work , pm8xxx_work_handler );
188191 vib -> vib_input_dev = input_dev ;
189192
193+ error = fwnode_property_read_u32 (pdev -> dev .fwnode , "reg" , & reg_base );
194+ if (error < 0 )
195+ return dev_err_probe (& pdev -> dev , error , "Failed to read reg address\n" );
196+
190197 regs = of_device_get_match_data (& pdev -> dev );
198+ vib -> enable_addr = reg_base + regs -> enable_offset ;
199+ vib -> drv_addr = reg_base + regs -> drv_offset ;
191200
192201 /* operate in manual mode */
193- error = regmap_read (vib -> regmap , regs -> drv_addr , & val );
202+ error = regmap_read (vib -> regmap , vib -> drv_addr , & val );
194203 if (error < 0 )
195204 return error ;
196205
197206 val &= regs -> drv_en_manual_mask ;
198- error = regmap_write (vib -> regmap , regs -> drv_addr , val );
207+ error = regmap_write (vib -> regmap , vib -> drv_addr , val );
199208 if (error < 0 )
200209 return error ;
201210
0 commit comments