Skip to content

Commit 6d84ec2

Browse files
Fenglin Wudtor
authored andcommitted
input: pm8xxx-vibrator: refactor to support new SPMI vibrator
Currently, vibrator control register addresses are hard coded, including the base address and offsets, it's not flexible to support new SPMI vibrator module which is usually included in different PMICs with different base address. Refactor it by using the base address defined in devicetree. Signed-off-by: Fenglin Wu <[email protected]> Reviewed-by: Konrad Dybcio <[email protected]> Reviewed-by: Dmitry Baryshkov <[email protected]> Link: https://lore.kernel.org/r/20240416-pm8xxx-vibrator-new-design-v11-1-7b1c951e1515@quicinc.com Signed-off-by: Dmitry Torokhov <[email protected]>
1 parent 48c0687 commit 6d84ec2

File tree

1 file changed

+25
-16
lines changed

1 file changed

+25
-16
lines changed

drivers/input/misc/pm8xxx-vibrator.c

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -19,27 +19,27 @@
1919
#define MAX_FF_SPEED 0xff
2020

2121
struct 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

3131
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),
3434
.drv_shift = 3,
3535
.drv_en_manual_mask = 0xfc,
3636
};
3737

3838
static 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)
102106
static 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

Comments
 (0)