1 // SPDX-License-Identifier: GPL-2.0+
5 * Copyright (C) 2019 Luca Weiss <luca@z3ntu.xyz>
7 * Based on PWM vibrator driver:
8 * Copyright (C) 2017 Collabora Ltd.
10 * Based on previous work from:
11 * Copyright (C) 2012 Dmitry Torokhov <dmitry.torokhov@gmail.com>
13 * Based on PWM beeper driver:
14 * Copyright (C) 2010, Lars-Peter Clausen <lars@metafoo.de>
17 #include <linux/gpio/consumer.h>
18 #include <linux/input.h>
19 #include <linux/kernel.h>
20 #include <linux/module.h>
21 #include <linux/of_device.h>
22 #include <linux/platform_device.h>
23 #include <linux/property.h>
24 #include <linux/regulator/consumer.h>
25 #include <linux/slab.h>
27 struct gpio_vibrator
{
28 struct input_dev
*input
;
29 struct gpio_desc
*gpio
;
30 struct regulator
*vcc
;
32 struct work_struct play_work
;
37 static int gpio_vibrator_start(struct gpio_vibrator
*vibrator
)
39 struct device
*pdev
= vibrator
->input
->dev
.parent
;
42 if (!vibrator
->vcc_on
) {
43 err
= regulator_enable(vibrator
->vcc
);
45 dev_err(pdev
, "failed to enable regulator: %d\n", err
);
48 vibrator
->vcc_on
= true;
51 gpiod_set_value_cansleep(vibrator
->gpio
, 1);
56 static void gpio_vibrator_stop(struct gpio_vibrator
*vibrator
)
58 gpiod_set_value_cansleep(vibrator
->gpio
, 0);
60 if (vibrator
->vcc_on
) {
61 regulator_disable(vibrator
->vcc
);
62 vibrator
->vcc_on
= false;
66 static void gpio_vibrator_play_work(struct work_struct
*work
)
68 struct gpio_vibrator
*vibrator
=
69 container_of(work
, struct gpio_vibrator
, play_work
);
71 if (vibrator
->running
)
72 gpio_vibrator_start(vibrator
);
74 gpio_vibrator_stop(vibrator
);
77 static int gpio_vibrator_play_effect(struct input_dev
*dev
, void *data
,
78 struct ff_effect
*effect
)
80 struct gpio_vibrator
*vibrator
= input_get_drvdata(dev
);
83 level
= effect
->u
.rumble
.strong_magnitude
;
85 level
= effect
->u
.rumble
.weak_magnitude
;
87 vibrator
->running
= level
;
88 schedule_work(&vibrator
->play_work
);
93 static void gpio_vibrator_close(struct input_dev
*input
)
95 struct gpio_vibrator
*vibrator
= input_get_drvdata(input
);
97 cancel_work_sync(&vibrator
->play_work
);
98 gpio_vibrator_stop(vibrator
);
99 vibrator
->running
= false;
102 static int gpio_vibrator_probe(struct platform_device
*pdev
)
104 struct gpio_vibrator
*vibrator
;
107 vibrator
= devm_kzalloc(&pdev
->dev
, sizeof(*vibrator
), GFP_KERNEL
);
111 vibrator
->input
= devm_input_allocate_device(&pdev
->dev
);
112 if (!vibrator
->input
)
115 vibrator
->vcc
= devm_regulator_get(&pdev
->dev
, "vcc");
116 err
= PTR_ERR_OR_ZERO(vibrator
->vcc
);
118 if (err
!= -EPROBE_DEFER
)
119 dev_err(&pdev
->dev
, "Failed to request regulator: %d\n",
124 vibrator
->gpio
= devm_gpiod_get(&pdev
->dev
, "enable", GPIOD_OUT_LOW
);
125 err
= PTR_ERR_OR_ZERO(vibrator
->gpio
);
127 if (err
!= -EPROBE_DEFER
)
128 dev_err(&pdev
->dev
, "Failed to request main gpio: %d\n",
133 INIT_WORK(&vibrator
->play_work
, gpio_vibrator_play_work
);
135 vibrator
->input
->name
= "gpio-vibrator";
136 vibrator
->input
->id
.bustype
= BUS_HOST
;
137 vibrator
->input
->close
= gpio_vibrator_close
;
139 input_set_drvdata(vibrator
->input
, vibrator
);
140 input_set_capability(vibrator
->input
, EV_FF
, FF_RUMBLE
);
142 err
= input_ff_create_memless(vibrator
->input
, NULL
,
143 gpio_vibrator_play_effect
);
145 dev_err(&pdev
->dev
, "Couldn't create FF dev: %d\n", err
);
149 err
= input_register_device(vibrator
->input
);
151 dev_err(&pdev
->dev
, "Couldn't register input dev: %d\n", err
);
155 platform_set_drvdata(pdev
, vibrator
);
160 static int __maybe_unused
gpio_vibrator_suspend(struct device
*dev
)
162 struct platform_device
*pdev
= to_platform_device(dev
);
163 struct gpio_vibrator
*vibrator
= platform_get_drvdata(pdev
);
165 cancel_work_sync(&vibrator
->play_work
);
166 if (vibrator
->running
)
167 gpio_vibrator_stop(vibrator
);
172 static int __maybe_unused
gpio_vibrator_resume(struct device
*dev
)
174 struct platform_device
*pdev
= to_platform_device(dev
);
175 struct gpio_vibrator
*vibrator
= platform_get_drvdata(pdev
);
177 if (vibrator
->running
)
178 gpio_vibrator_start(vibrator
);
183 static SIMPLE_DEV_PM_OPS(gpio_vibrator_pm_ops
,
184 gpio_vibrator_suspend
, gpio_vibrator_resume
);
187 static const struct of_device_id gpio_vibra_dt_match_table
[] = {
188 { .compatible
= "gpio-vibrator" },
191 MODULE_DEVICE_TABLE(of
, gpio_vibra_dt_match_table
);
194 static struct platform_driver gpio_vibrator_driver
= {
195 .probe
= gpio_vibrator_probe
,
197 .name
= "gpio-vibrator",
198 .pm
= &gpio_vibrator_pm_ops
,
199 .of_match_table
= of_match_ptr(gpio_vibra_dt_match_table
),
202 module_platform_driver(gpio_vibrator_driver
);
204 MODULE_AUTHOR("Luca Weiss <luca@z3ntu.xy>");
205 MODULE_DESCRIPTION("GPIO vibrator driver");
206 MODULE_LICENSE("GPL");
207 MODULE_ALIAS("platform:gpio-vibrator");