1111#include <linux/regmap.h>
1212#include <linux/slab.h>
1313
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))
1819
1920#define MAX_FF_SPEED 0xff
2021
@@ -25,14 +26,19 @@ struct pm8xxx_regs {
2526 unsigned int drv_offset ;
2627 unsigned int drv_mask ;
2728 unsigned int drv_shift ;
29+ unsigned int drv2_offset ;
30+ unsigned int drv2_mask ;
31+ unsigned int drv2_shift ;
2832 unsigned int drv_en_manual_mask ;
33+ bool drv_in_step ;
2934};
3035
3136static const struct pm8xxx_regs pm8058_regs = {
3237 .drv_offset = 0 ,
3338 .drv_mask = GENMASK (7 , 3 ),
3439 .drv_shift = 3 ,
3540 .drv_en_manual_mask = 0xfc ,
41+ .drv_in_step = true,
3642};
3743
3844static struct pm8xxx_regs pm8916_regs = {
@@ -42,6 +48,20 @@ static struct pm8xxx_regs pm8916_regs = {
4248 .drv_mask = GENMASK (4 , 0 ),
4349 .drv_shift = 0 ,
4450 .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,
4565};
4666
4767/**
@@ -52,6 +72,7 @@ static struct pm8xxx_regs pm8916_regs = {
5272 * @regs: registers' info
5373 * @enable_addr: vibrator enable register
5474 * @drv_addr: vibrator drive strength register
75+ * @drv2_addr: vibrator drive strength upper byte register
5576 * @speed: speed of vibration set from userland
5677 * @active: state of vibrator
5778 * @level: level of vibration to set in the chip
@@ -64,6 +85,7 @@ struct pm8xxx_vib {
6485 const struct pm8xxx_regs * regs ;
6586 unsigned int enable_addr ;
6687 unsigned int drv_addr ;
88+ unsigned int drv2_addr ;
6789 int speed ;
6890 int level ;
6991 bool active ;
@@ -81,6 +103,9 @@ static int pm8xxx_vib_set(struct pm8xxx_vib *vib, bool on)
81103 unsigned int val = vib -> reg_vib_drv ;
82104 const struct pm8xxx_regs * regs = vib -> regs ;
83105
106+ if (regs -> drv_in_step )
107+ vib -> level /= VIB_PER_STEP_mV (vib );
108+
84109 if (on )
85110 val |= (vib -> level << regs -> drv_shift ) & regs -> drv_mask ;
86111 else
@@ -92,6 +117,14 @@ static int pm8xxx_vib_set(struct pm8xxx_vib *vib, bool on)
92117
93118 vib -> reg_vib_drv = val ;
94119
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+
95128 if (regs -> enable_mask )
96129 rc = regmap_update_bits (vib -> regmap , vib -> enable_addr ,
97130 regs -> enable_mask , on ? regs -> enable_mask : 0 );
@@ -114,17 +147,16 @@ static void pm8xxx_work_handler(struct work_struct *work)
114147 return ;
115148
116149 /*
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
118151 * scale the level to fit into these ranges.
119152 */
120153 if (vib -> speed ) {
121154 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 );
125157 } else {
126158 vib -> active = false;
127- vib -> level = VIB_MIN_LEVEL_mV / VIB_PER_STEP_mV ;
159+ vib -> level = VIB_MIN_LEVEL_mV ( vib ) ;
128160 }
129161
130162 pm8xxx_vib_set (vib , vib -> active );
@@ -197,6 +229,7 @@ static int pm8xxx_vib_probe(struct platform_device *pdev)
197229 regs = of_device_get_match_data (& pdev -> dev );
198230 vib -> enable_addr = reg_base + regs -> enable_offset ;
199231 vib -> drv_addr = reg_base + regs -> drv_offset ;
232+ vib -> drv2_addr = reg_base + regs -> drv2_offset ;
200233
201234 /* operate in manual mode */
202235 error = regmap_read (vib -> regmap , vib -> drv_addr , & val );
@@ -251,6 +284,7 @@ static const struct of_device_id pm8xxx_vib_id_table[] = {
251284 { .compatible = "qcom,pm8058-vib" , .data = & pm8058_regs },
252285 { .compatible = "qcom,pm8921-vib" , .data = & pm8058_regs },
253286 { .compatible = "qcom,pm8916-vib" , .data = & pm8916_regs },
287+ { .compatible = "qcom,pmi632-vib" , .data = & pmi632_regs },
254288 { }
255289};
256290MODULE_DEVICE_TABLE (of , pm8xxx_vib_id_table );
0 commit comments