11
11
#include <linux/regmap.h>
12
12
#include <linux/slab.h>
13
13
14
- #define VIB_MAX_LEVEL_mV (3100)
15
- #define VIB_MIN_LEVEL_mV (1200)
16
- #define VIB_PER_STEP_mV (100)
17
- #define VIB_MAX_LEVELS (VIB_MAX_LEVEL_mV - VIB_MIN_LEVEL_mV + VIB_PER_STEP_mV)
14
+ #define VIB_MAX_LEVEL_mV (vib ) (vib->drv2_addr ? 3544 : 3100)
15
+ #define VIB_MIN_LEVEL_mV (vib ) (vib->drv2_addr ? 1504 : 1200)
16
+ #define VIB_PER_STEP_mV (vib ) (vib->drv2_addr ? 8 : 100)
17
+ #define VIB_MAX_LEVELS (vib ) \
18
+ (VIB_MAX_LEVEL_mV(vib) - VIB_MIN_LEVEL_mV(vib) + VIB_PER_STEP_mV(vib))
18
19
19
20
#define MAX_FF_SPEED 0xff
20
21
@@ -25,14 +26,19 @@ struct pm8xxx_regs {
25
26
unsigned int drv_offset ;
26
27
unsigned int drv_mask ;
27
28
unsigned int drv_shift ;
29
+ unsigned int drv2_offset ;
30
+ unsigned int drv2_mask ;
31
+ unsigned int drv2_shift ;
28
32
unsigned int drv_en_manual_mask ;
33
+ bool drv_in_step ;
29
34
};
30
35
31
36
static const struct pm8xxx_regs pm8058_regs = {
32
37
.drv_offset = 0 ,
33
38
.drv_mask = GENMASK (7 , 3 ),
34
39
.drv_shift = 3 ,
35
40
.drv_en_manual_mask = 0xfc ,
41
+ .drv_in_step = true,
36
42
};
37
43
38
44
static struct pm8xxx_regs pm8916_regs = {
@@ -42,6 +48,20 @@ static struct pm8xxx_regs pm8916_regs = {
42
48
.drv_mask = GENMASK (4 , 0 ),
43
49
.drv_shift = 0 ,
44
50
.drv_en_manual_mask = 0 ,
51
+ .drv_in_step = true,
52
+ };
53
+
54
+ static struct pm8xxx_regs pmi632_regs = {
55
+ .enable_offset = 0x46 ,
56
+ .enable_mask = BIT (7 ),
57
+ .drv_offset = 0x40 ,
58
+ .drv_mask = GENMASK (7 , 0 ),
59
+ .drv_shift = 0 ,
60
+ .drv2_offset = 0x41 ,
61
+ .drv2_mask = GENMASK (3 , 0 ),
62
+ .drv2_shift = 8 ,
63
+ .drv_en_manual_mask = 0 ,
64
+ .drv_in_step = false,
45
65
};
46
66
47
67
/**
@@ -52,6 +72,7 @@ static struct pm8xxx_regs pm8916_regs = {
52
72
* @regs: registers' info
53
73
* @enable_addr: vibrator enable register
54
74
* @drv_addr: vibrator drive strength register
75
+ * @drv2_addr: vibrator drive strength upper byte register
55
76
* @speed: speed of vibration set from userland
56
77
* @active: state of vibrator
57
78
* @level: level of vibration to set in the chip
@@ -64,6 +85,7 @@ struct pm8xxx_vib {
64
85
const struct pm8xxx_regs * regs ;
65
86
unsigned int enable_addr ;
66
87
unsigned int drv_addr ;
88
+ unsigned int drv2_addr ;
67
89
int speed ;
68
90
int level ;
69
91
bool active ;
@@ -81,6 +103,9 @@ static int pm8xxx_vib_set(struct pm8xxx_vib *vib, bool on)
81
103
unsigned int val = vib -> reg_vib_drv ;
82
104
const struct pm8xxx_regs * regs = vib -> regs ;
83
105
106
+ if (regs -> drv_in_step )
107
+ vib -> level /= VIB_PER_STEP_mV (vib );
108
+
84
109
if (on )
85
110
val |= (vib -> level << regs -> drv_shift ) & regs -> drv_mask ;
86
111
else
@@ -92,6 +117,14 @@ static int pm8xxx_vib_set(struct pm8xxx_vib *vib, bool on)
92
117
93
118
vib -> reg_vib_drv = val ;
94
119
120
+ if (regs -> drv2_mask ) {
121
+ val = vib -> level << regs -> drv2_shift ;
122
+ rc = regmap_write_bits (vib -> regmap , vib -> drv2_addr ,
123
+ regs -> drv2_mask , on ? val : 0 );
124
+ if (rc < 0 )
125
+ return rc ;
126
+ }
127
+
95
128
if (regs -> enable_mask )
96
129
rc = regmap_update_bits (vib -> regmap , vib -> enable_addr ,
97
130
regs -> enable_mask , on ? regs -> enable_mask : 0 );
@@ -114,17 +147,16 @@ static void pm8xxx_work_handler(struct work_struct *work)
114
147
return ;
115
148
116
149
/*
117
- * pmic vibrator supports voltage ranges from 1.2 to 3.1V , so
150
+ * pmic vibrator supports voltage ranges from MIN_LEVEL to MAX_LEVEL , so
118
151
* scale the level to fit into these ranges.
119
152
*/
120
153
if (vib -> speed ) {
121
154
vib -> active = true;
122
- vib -> level = ((VIB_MAX_LEVELS * vib -> speed ) / MAX_FF_SPEED ) +
123
- VIB_MIN_LEVEL_mV ;
124
- vib -> level /= VIB_PER_STEP_mV ;
155
+ vib -> level = VIB_MIN_LEVEL_mV (vib );
156
+ vib -> level += mult_frac (VIB_MAX_LEVELS (vib ), vib -> speed , MAX_FF_SPEED );
125
157
} else {
126
158
vib -> active = false;
127
- vib -> level = VIB_MIN_LEVEL_mV / VIB_PER_STEP_mV ;
159
+ vib -> level = VIB_MIN_LEVEL_mV ( vib ) ;
128
160
}
129
161
130
162
pm8xxx_vib_set (vib , vib -> active );
@@ -197,6 +229,7 @@ static int pm8xxx_vib_probe(struct platform_device *pdev)
197
229
regs = of_device_get_match_data (& pdev -> dev );
198
230
vib -> enable_addr = reg_base + regs -> enable_offset ;
199
231
vib -> drv_addr = reg_base + regs -> drv_offset ;
232
+ vib -> drv2_addr = reg_base + regs -> drv2_offset ;
200
233
201
234
/* operate in manual mode */
202
235
error = regmap_read (vib -> regmap , vib -> drv_addr , & val );
@@ -251,6 +284,7 @@ static const struct of_device_id pm8xxx_vib_id_table[] = {
251
284
{ .compatible = "qcom,pm8058-vib" , .data = & pm8058_regs },
252
285
{ .compatible = "qcom,pm8921-vib" , .data = & pm8058_regs },
253
286
{ .compatible = "qcom,pm8916-vib" , .data = & pm8916_regs },
287
+ { .compatible = "qcom,pmi632-vib" , .data = & pmi632_regs },
254
288
{ }
255
289
};
256
290
MODULE_DEVICE_TABLE (of , pm8xxx_vib_id_table );
0 commit comments