19
19
#define MAX_FF_SPEED 0xff
20
20
21
21
struct pm8xxx_regs {
22
- unsigned int enable_addr ;
22
+ unsigned int enable_offset ;
23
23
unsigned int enable_mask ;
24
24
25
- unsigned int drv_addr ;
25
+ unsigned int drv_offset ;
26
26
unsigned int drv_mask ;
27
27
unsigned int drv_shift ;
28
28
unsigned int drv_en_manual_mask ;
29
29
};
30
30
31
31
static const struct pm8xxx_regs pm8058_regs = {
32
- .drv_addr = 0x4A ,
33
- .drv_mask = 0xf8 ,
32
+ .drv_offset = 0 ,
33
+ .drv_mask = GENMASK ( 7 , 3 ) ,
34
34
.drv_shift = 3 ,
35
35
.drv_en_manual_mask = 0xfc ,
36
36
};
37
37
38
38
static struct pm8xxx_regs pm8916_regs = {
39
- .enable_addr = 0xc046 ,
39
+ .enable_offset = 0x46 ,
40
40
.enable_mask = BIT (7 ),
41
- .drv_addr = 0xc041 ,
42
- .drv_mask = 0x1F ,
41
+ .drv_offset = 0x41 ,
42
+ .drv_mask = GENMASK ( 4 , 0 ) ,
43
43
.drv_shift = 0 ,
44
44
.drv_en_manual_mask = 0 ,
45
45
};
@@ -50,6 +50,8 @@ static struct pm8xxx_regs pm8916_regs = {
50
50
* @work: work structure to set the vibration parameters
51
51
* @regmap: regmap for register read/write
52
52
* @regs: registers' info
53
+ * @enable_addr: vibrator enable register
54
+ * @drv_addr: vibrator drive strength register
53
55
* @speed: speed of vibration set from userland
54
56
* @active: state of vibrator
55
57
* @level: level of vibration to set in the chip
@@ -60,6 +62,8 @@ struct pm8xxx_vib {
60
62
struct work_struct work ;
61
63
struct regmap * regmap ;
62
64
const struct pm8xxx_regs * regs ;
65
+ unsigned int enable_addr ;
66
+ unsigned int drv_addr ;
63
67
int speed ;
64
68
int level ;
65
69
bool active ;
@@ -82,15 +86,15 @@ static int pm8xxx_vib_set(struct pm8xxx_vib *vib, bool on)
82
86
else
83
87
val &= ~regs -> drv_mask ;
84
88
85
- rc = regmap_write (vib -> regmap , regs -> drv_addr , val );
89
+ rc = regmap_write (vib -> regmap , vib -> drv_addr , val );
86
90
if (rc < 0 )
87
91
return rc ;
88
92
89
93
vib -> reg_vib_drv = val ;
90
94
91
95
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 );
94
98
95
99
return rc ;
96
100
}
@@ -102,11 +106,10 @@ static int pm8xxx_vib_set(struct pm8xxx_vib *vib, bool on)
102
106
static void pm8xxx_work_handler (struct work_struct * work )
103
107
{
104
108
struct pm8xxx_vib * vib = container_of (work , struct pm8xxx_vib , work );
105
- const struct pm8xxx_regs * regs = vib -> regs ;
106
- int rc ;
107
109
unsigned int val ;
110
+ int rc ;
108
111
109
- rc = regmap_read (vib -> regmap , regs -> drv_addr , & val );
112
+ rc = regmap_read (vib -> regmap , vib -> drv_addr , & val );
110
113
if (rc < 0 )
111
114
return ;
112
115
@@ -169,7 +172,7 @@ static int pm8xxx_vib_probe(struct platform_device *pdev)
169
172
struct pm8xxx_vib * vib ;
170
173
struct input_dev * input_dev ;
171
174
int error ;
172
- unsigned int val ;
175
+ unsigned int val , reg_base = 0 ;
173
176
const struct pm8xxx_regs * regs ;
174
177
175
178
vib = devm_kzalloc (& pdev -> dev , sizeof (* vib ), GFP_KERNEL );
@@ -187,15 +190,21 @@ static int pm8xxx_vib_probe(struct platform_device *pdev)
187
190
INIT_WORK (& vib -> work , pm8xxx_work_handler );
188
191
vib -> vib_input_dev = input_dev ;
189
192
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
+
190
197
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 ;
191
200
192
201
/* operate in manual mode */
193
- error = regmap_read (vib -> regmap , regs -> drv_addr , & val );
202
+ error = regmap_read (vib -> regmap , vib -> drv_addr , & val );
194
203
if (error < 0 )
195
204
return error ;
196
205
197
206
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 );
199
208
if (error < 0 )
200
209
return error ;
201
210
0 commit comments