blob: dd19dd1af64dc17316a0380f690dbbd18c10b9c9 [file] [log] [blame]
Tirupathi Reddy9722c562017-11-28 12:41:59 +05301/* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
2 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 and
5 * only version 2 as published by the Free Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 */
12
13#define pr_fmt(fmt) "%s: " fmt, __func__
14
15#include <linux/errno.h>
16#include <linux/hrtimer.h>
17#include <linux/init.h>
18#include <linux/kernel.h>
19#include <linux/leds.h>
20#include <linux/module.h>
21#include <linux/mutex.h>
22#include <linux/of_device.h>
23#include <linux/regmap.h>
24#include <linux/workqueue.h>
25
26/* Vibrator-LDO register definitions */
27#define QPNP_VIB_LDO_REG_STATUS1 0x08
28#define QPNP_VIB_LDO_VREG_READY BIT(7)
29
30#define QPNP_VIB_LDO_REG_VSET_LB 0x40
31
32#define QPNP_VIB_LDO_REG_EN_CTL 0x46
33#define QPNP_VIB_LDO_EN BIT(7)
34
35/* Vibrator-LDO voltage settings */
36#define QPNP_VIB_LDO_VMIN_UV 1504000
37#define QPNP_VIB_LDO_VMAX_UV 3544000
38#define QPNP_VIB_LDO_VOLT_STEP_UV 8000
39
40/*
41 * Define vibration periods: default(5sec), min(50ms), max(15sec) and
42 * overdrive(30ms).
43 */
44#define QPNP_VIB_MIN_PLAY_MS 50
45#define QPNP_VIB_PLAY_MS 5000
46#define QPNP_VIB_MAX_PLAY_MS 15000
47#define QPNP_VIB_OVERDRIVE_PLAY_MS 30
48
49struct vib_ldo_chip {
50 struct led_classdev cdev;
51 struct regmap *regmap;
52 struct mutex lock;
53 struct hrtimer stop_timer;
54 struct hrtimer overdrive_timer;
55 struct work_struct vib_work;
56 struct work_struct overdrive_work;
57
58 u16 base;
59 int vmax_uV;
60 int overdrive_volt_uV;
61 int ldo_uV;
62 int state;
63 u64 vib_play_ms;
64 bool vib_enabled;
65 bool disable_overdrive;
66};
67
Tirupathi Reddy638d5f02018-06-12 09:11:27 +053068static inline int qpnp_vib_ldo_poll_status(struct vib_ldo_chip *chip)
Tirupathi Reddy9722c562017-11-28 12:41:59 +053069{
70 unsigned int val;
Tirupathi Reddy638d5f02018-06-12 09:11:27 +053071 int ret;
72
73 ret = regmap_read_poll_timeout(chip->regmap,
74 chip->base + QPNP_VIB_LDO_REG_STATUS1, val,
75 val & QPNP_VIB_LDO_VREG_READY, 100, 1000);
76 if (ret < 0) {
77 pr_err("Vibrator LDO vreg_ready timeout, status=0x%02x, ret=%d\n",
78 val, ret);
79
80 /* Keep VIB_LDO disabled */
81 regmap_update_bits(chip->regmap,
82 chip->base + QPNP_VIB_LDO_REG_EN_CTL,
83 QPNP_VIB_LDO_EN, 0);
84 }
85
86 return ret;
87}
88
89static int qpnp_vib_ldo_set_voltage(struct vib_ldo_chip *chip, int new_uV)
90{
Tirupathi Reddy9722c562017-11-28 12:41:59 +053091 u32 vlevel;
92 u8 reg[2];
93 int ret;
94
95 if (chip->ldo_uV == new_uV)
96 return 0;
97
98 vlevel = roundup(new_uV, QPNP_VIB_LDO_VOLT_STEP_UV) / 1000;
99 reg[0] = vlevel & 0xff;
100 reg[1] = (vlevel & 0xff00) >> 8;
101 ret = regmap_bulk_write(chip->regmap,
102 chip->base + QPNP_VIB_LDO_REG_VSET_LB, reg, 2);
103 if (ret < 0) {
104 pr_err("regmap write failed, ret=%d\n", ret);
105 return ret;
106 }
107
108 if (chip->vib_enabled) {
Tirupathi Reddy638d5f02018-06-12 09:11:27 +0530109 ret = qpnp_vib_ldo_poll_status(chip);
Tirupathi Reddy9722c562017-11-28 12:41:59 +0530110 if (ret < 0) {
Tirupathi Reddy638d5f02018-06-12 09:11:27 +0530111 pr_err("Vibrator LDO status polling timedout\n");
Tirupathi Reddy9722c562017-11-28 12:41:59 +0530112 return ret;
113 }
114 }
115
116 chip->ldo_uV = new_uV;
117 return ret;
118}
119
120static inline int qpnp_vib_ldo_enable(struct vib_ldo_chip *chip, bool enable)
121{
Tirupathi Reddy9722c562017-11-28 12:41:59 +0530122 int ret;
123
124 if (chip->vib_enabled == enable)
125 return 0;
126
127 ret = regmap_update_bits(chip->regmap,
128 chip->base + QPNP_VIB_LDO_REG_EN_CTL,
129 QPNP_VIB_LDO_EN,
130 enable ? QPNP_VIB_LDO_EN : 0);
131 if (ret < 0) {
132 pr_err("Program Vibrator LDO %s is failed, ret=%d\n",
133 enable ? "enable" : "disable", ret);
134 return ret;
135 }
136
137 if (enable) {
Tirupathi Reddy638d5f02018-06-12 09:11:27 +0530138 ret = qpnp_vib_ldo_poll_status(chip);
Tirupathi Reddy9722c562017-11-28 12:41:59 +0530139 if (ret < 0) {
Tirupathi Reddy638d5f02018-06-12 09:11:27 +0530140 pr_err("Vibrator LDO status polling timedout\n");
Tirupathi Reddy9722c562017-11-28 12:41:59 +0530141 return ret;
142 }
143 }
144
145 chip->vib_enabled = enable;
146
147 return ret;
148}
149
150static int qpnp_vibrator_play_on(struct vib_ldo_chip *chip)
151{
152 int volt_uV;
153 int ret;
154
155 volt_uV = chip->vmax_uV;
156 if (!chip->disable_overdrive)
157 volt_uV = chip->overdrive_volt_uV ? chip->overdrive_volt_uV
158 : min(chip->vmax_uV * 2, QPNP_VIB_LDO_VMAX_UV);
159
160 ret = qpnp_vib_ldo_set_voltage(chip, volt_uV);
161 if (ret < 0) {
162 pr_err("set voltage = %duV failed, ret=%d\n", volt_uV, ret);
163 return ret;
164 }
165 pr_debug("voltage set to %d uV\n", volt_uV);
166
167 ret = qpnp_vib_ldo_enable(chip, true);
168 if (ret < 0) {
169 pr_err("vibration enable failed, ret=%d\n", ret);
170 return ret;
171 }
172
173 if (!chip->disable_overdrive)
174 hrtimer_start(&chip->overdrive_timer,
175 ms_to_ktime(QPNP_VIB_OVERDRIVE_PLAY_MS),
176 HRTIMER_MODE_REL);
177
178 return ret;
179}
180
181static void qpnp_vib_work(struct work_struct *work)
182{
183 struct vib_ldo_chip *chip = container_of(work, struct vib_ldo_chip,
184 vib_work);
185 int ret = 0;
186
187 if (chip->state) {
188 if (!chip->vib_enabled)
189 ret = qpnp_vibrator_play_on(chip);
190
191 if (ret == 0)
192 hrtimer_start(&chip->stop_timer,
193 ms_to_ktime(chip->vib_play_ms),
194 HRTIMER_MODE_REL);
195 } else {
196 if (!chip->disable_overdrive) {
197 hrtimer_cancel(&chip->overdrive_timer);
198 cancel_work_sync(&chip->overdrive_work);
199 }
200 qpnp_vib_ldo_enable(chip, false);
201 }
202}
203
204static enum hrtimer_restart vib_stop_timer(struct hrtimer *timer)
205{
206 struct vib_ldo_chip *chip = container_of(timer, struct vib_ldo_chip,
207 stop_timer);
208
209 chip->state = 0;
210 schedule_work(&chip->vib_work);
211 return HRTIMER_NORESTART;
212}
213
214static void qpnp_vib_overdrive_work(struct work_struct *work)
215{
216 struct vib_ldo_chip *chip = container_of(work, struct vib_ldo_chip,
217 overdrive_work);
218 int ret;
219
220 mutex_lock(&chip->lock);
221
222 /* LDO voltage update not required if Vibration disabled */
223 if (!chip->vib_enabled)
224 goto unlock;
225
226 ret = qpnp_vib_ldo_set_voltage(chip, chip->vmax_uV);
227 if (ret < 0) {
228 pr_err("set vibration voltage = %duV failed, ret=%d\n",
229 chip->vmax_uV, ret);
230 qpnp_vib_ldo_enable(chip, false);
231 goto unlock;
232 }
233 pr_debug("voltage set to %d\n", chip->vmax_uV);
234
235unlock:
236 mutex_unlock(&chip->lock);
237}
238
239static enum hrtimer_restart vib_overdrive_timer(struct hrtimer *timer)
240{
241 struct vib_ldo_chip *chip = container_of(timer, struct vib_ldo_chip,
242 overdrive_timer);
243 schedule_work(&chip->overdrive_work);
244 pr_debug("overdrive timer expired\n");
245 return HRTIMER_NORESTART;
246}
247
248static ssize_t qpnp_vib_show_state(struct device *dev,
249 struct device_attribute *attr, char *buf)
250{
251 struct led_classdev *cdev = dev_get_drvdata(dev);
252 struct vib_ldo_chip *chip = container_of(cdev, struct vib_ldo_chip,
253 cdev);
254
255 return snprintf(buf, PAGE_SIZE, "%d\n", chip->vib_enabled);
256}
257
258static ssize_t qpnp_vib_store_state(struct device *dev,
259 struct device_attribute *attr, const char *buf, size_t count)
260{
261 /* At present, nothing to do with setting state */
262 return count;
263}
264
265static ssize_t qpnp_vib_show_duration(struct device *dev,
266 struct device_attribute *attr, char *buf)
267{
268 struct led_classdev *cdev = dev_get_drvdata(dev);
269 struct vib_ldo_chip *chip = container_of(cdev, struct vib_ldo_chip,
270 cdev);
271 ktime_t time_rem;
272 s64 time_ms = 0;
273
274 if (hrtimer_active(&chip->stop_timer)) {
275 time_rem = hrtimer_get_remaining(&chip->stop_timer);
276 time_ms = ktime_to_ms(time_rem);
277 }
278
279 return snprintf(buf, PAGE_SIZE, "%lld\n", time_ms);
280}
281
282static ssize_t qpnp_vib_store_duration(struct device *dev,
283 struct device_attribute *attr, const char *buf, size_t count)
284{
285 struct led_classdev *cdev = dev_get_drvdata(dev);
286 struct vib_ldo_chip *chip = container_of(cdev, struct vib_ldo_chip,
287 cdev);
288 u32 val;
289 int ret;
290
291 ret = kstrtouint(buf, 0, &val);
292 if (ret < 0)
293 return ret;
294
295 /* setting 0 on duration is NOP for now */
296 if (val <= 0)
297 return count;
298
299 if (val < QPNP_VIB_MIN_PLAY_MS)
300 val = QPNP_VIB_MIN_PLAY_MS;
301
302 if (val > QPNP_VIB_MAX_PLAY_MS)
303 val = QPNP_VIB_MAX_PLAY_MS;
304
305 mutex_lock(&chip->lock);
306 chip->vib_play_ms = val;
307 mutex_unlock(&chip->lock);
308
309 return count;
310}
311
312static ssize_t qpnp_vib_show_activate(struct device *dev,
313 struct device_attribute *attr, char *buf)
314{
315 /* For now nothing to show */
316 return snprintf(buf, PAGE_SIZE, "%d\n", 0);
317}
318
319static ssize_t qpnp_vib_store_activate(struct device *dev,
320 struct device_attribute *attr, const char *buf, size_t count)
321{
322 struct led_classdev *cdev = dev_get_drvdata(dev);
323 struct vib_ldo_chip *chip = container_of(cdev, struct vib_ldo_chip,
324 cdev);
325 u32 val;
326 int ret;
327
328 ret = kstrtouint(buf, 0, &val);
329 if (ret < 0)
330 return ret;
331
332 if (val != 0 && val != 1)
333 return count;
334
335 mutex_lock(&chip->lock);
336 hrtimer_cancel(&chip->stop_timer);
337 chip->state = val;
338 pr_debug("state = %d, time = %llums\n", chip->state, chip->vib_play_ms);
339 mutex_unlock(&chip->lock);
340 schedule_work(&chip->vib_work);
341
342 return count;
343}
344
345static ssize_t qpnp_vib_show_vmax(struct device *dev,
346 struct device_attribute *attr, char *buf)
347{
348 struct led_classdev *cdev = dev_get_drvdata(dev);
349 struct vib_ldo_chip *chip = container_of(cdev, struct vib_ldo_chip,
350 cdev);
351
352 return snprintf(buf, PAGE_SIZE, "%d\n", chip->vmax_uV / 1000);
353}
354
355static ssize_t qpnp_vib_store_vmax(struct device *dev,
356 struct device_attribute *attr, const char *buf, size_t count)
357{
358 struct led_classdev *cdev = dev_get_drvdata(dev);
359 struct vib_ldo_chip *chip = container_of(cdev, struct vib_ldo_chip,
360 cdev);
361 int data, ret;
362
363 ret = kstrtoint(buf, 10, &data);
364 if (ret < 0)
365 return ret;
366
367 data = data * 1000; /* Convert to microvolts */
368
369 /* check against vibrator ldo min/max voltage limits */
370 data = min(data, QPNP_VIB_LDO_VMAX_UV);
371 data = max(data, QPNP_VIB_LDO_VMIN_UV);
372
373 mutex_lock(&chip->lock);
374 chip->vmax_uV = data;
375 mutex_unlock(&chip->lock);
376 return ret;
377}
378
379static struct device_attribute qpnp_vib_attrs[] = {
380 __ATTR(state, 0664, qpnp_vib_show_state, qpnp_vib_store_state),
381 __ATTR(duration, 0664, qpnp_vib_show_duration, qpnp_vib_store_duration),
382 __ATTR(activate, 0664, qpnp_vib_show_activate, qpnp_vib_store_activate),
383 __ATTR(vmax_mv, 0664, qpnp_vib_show_vmax, qpnp_vib_store_vmax),
384};
385
386static int qpnp_vib_parse_dt(struct device *dev, struct vib_ldo_chip *chip)
387{
388 int ret;
389
390 ret = of_property_read_u32(dev->of_node, "qcom,vib-ldo-volt-uv",
391 &chip->vmax_uV);
392 if (ret < 0) {
393 pr_err("qcom,vib-ldo-volt-uv property read failed, ret=%d\n",
394 ret);
395 return ret;
396 }
397
398 chip->disable_overdrive = of_property_read_bool(dev->of_node,
399 "qcom,disable-overdrive");
400
401 if (of_find_property(dev->of_node, "qcom,vib-overdrive-volt-uv",
402 NULL)) {
403 ret = of_property_read_u32(dev->of_node,
404 "qcom,vib-overdrive-volt-uv",
405 &chip->overdrive_volt_uV);
406 if (ret < 0) {
407 pr_err("qcom,vib-overdrive-volt-uv property read failed, ret=%d\n",
408 ret);
409 return ret;
410 }
411
412 /* check against vibrator ldo min/max voltage limits */
413 chip->overdrive_volt_uV = min(chip->overdrive_volt_uV,
414 QPNP_VIB_LDO_VMAX_UV);
415 chip->overdrive_volt_uV = max(chip->overdrive_volt_uV,
416 QPNP_VIB_LDO_VMIN_UV);
417 }
418
419 return ret;
420}
421
422/* Dummy functions for brightness */
423static enum led_brightness qpnp_vib_brightness_get(struct led_classdev *cdev)
424{
425 return 0;
426}
427
428static void qpnp_vib_brightness_set(struct led_classdev *cdev,
429 enum led_brightness level)
430{
431}
432
433static int qpnp_vibrator_ldo_suspend(struct device *dev)
434{
435 struct vib_ldo_chip *chip = dev_get_drvdata(dev);
436
437 mutex_lock(&chip->lock);
438 if (!chip->disable_overdrive) {
439 hrtimer_cancel(&chip->overdrive_timer);
440 cancel_work_sync(&chip->overdrive_work);
441 }
442 hrtimer_cancel(&chip->stop_timer);
443 cancel_work_sync(&chip->vib_work);
Tirupathi Reddyd2c8b932018-06-18 13:10:55 +0530444 qpnp_vib_ldo_enable(chip, false);
Tirupathi Reddy9722c562017-11-28 12:41:59 +0530445 mutex_unlock(&chip->lock);
446
447 return 0;
448}
449static SIMPLE_DEV_PM_OPS(qpnp_vibrator_ldo_pm_ops, qpnp_vibrator_ldo_suspend,
450 NULL);
451
452static int qpnp_vibrator_ldo_probe(struct platform_device *pdev)
453{
454 struct device_node *of_node = pdev->dev.of_node;
455 struct vib_ldo_chip *chip;
456 int i, ret;
457 u32 base;
458
459 ret = of_property_read_u32(of_node, "reg", &base);
460 if (ret < 0) {
461 pr_err("reg property reading failed, ret=%d\n", ret);
462 return ret;
463 }
464
465 chip = devm_kzalloc(&pdev->dev, sizeof(*chip), GFP_KERNEL);
466 if (!chip)
467 return -ENOMEM;
468
469 chip->regmap = dev_get_regmap(pdev->dev.parent, NULL);
470 if (!chip->regmap) {
471 pr_err("couldn't get parent's regmap\n");
472 return -EINVAL;
473 }
474
475 ret = qpnp_vib_parse_dt(&pdev->dev, chip);
476 if (ret < 0) {
477 pr_err("couldn't parse device tree, ret=%d\n", ret);
478 return ret;
479 }
480
481 chip->base = (uint16_t)base;
482 chip->vib_play_ms = QPNP_VIB_PLAY_MS;
483 mutex_init(&chip->lock);
484 INIT_WORK(&chip->vib_work, qpnp_vib_work);
485 INIT_WORK(&chip->overdrive_work, qpnp_vib_overdrive_work);
486
487 hrtimer_init(&chip->stop_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
488 chip->stop_timer.function = vib_stop_timer;
489 hrtimer_init(&chip->overdrive_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
490 chip->overdrive_timer.function = vib_overdrive_timer;
491 dev_set_drvdata(&pdev->dev, chip);
492
493 chip->cdev.name = "vibrator";
494 chip->cdev.brightness_get = qpnp_vib_brightness_get;
495 chip->cdev.brightness_set = qpnp_vib_brightness_set;
496 chip->cdev.max_brightness = 100;
497 ret = devm_led_classdev_register(&pdev->dev, &chip->cdev);
498 if (ret < 0) {
499 pr_err("Error in registering led class device, ret=%d\n", ret);
500 goto fail;
501 }
502
503 for (i = 0; i < ARRAY_SIZE(qpnp_vib_attrs); i++) {
504 ret = sysfs_create_file(&chip->cdev.dev->kobj,
505 &qpnp_vib_attrs[i].attr);
506 if (ret < 0) {
507 dev_err(&pdev->dev, "Error in creating sysfs file, ret=%d\n",
508 ret);
509 goto sysfs_fail;
510 }
511 }
512
513 pr_info("Vibrator LDO successfully registered: uV = %d, overdrive = %s\n",
514 chip->vmax_uV,
515 chip->disable_overdrive ? "disabled" : "enabled");
516 return 0;
517
518sysfs_fail:
519 for (--i; i >= 0; i--)
520 sysfs_remove_file(&chip->cdev.dev->kobj,
521 &qpnp_vib_attrs[i].attr);
522fail:
523 mutex_destroy(&chip->lock);
524 dev_set_drvdata(&pdev->dev, NULL);
525 return ret;
526}
527
528static int qpnp_vibrator_ldo_remove(struct platform_device *pdev)
529{
530 struct vib_ldo_chip *chip = dev_get_drvdata(&pdev->dev);
531
532 if (!chip->disable_overdrive) {
533 hrtimer_cancel(&chip->overdrive_timer);
534 cancel_work_sync(&chip->overdrive_work);
535 }
536 hrtimer_cancel(&chip->stop_timer);
537 cancel_work_sync(&chip->vib_work);
538 mutex_destroy(&chip->lock);
539 dev_set_drvdata(&pdev->dev, NULL);
540
541 return 0;
542}
543
544static const struct of_device_id vibrator_ldo_match_table[] = {
545 { .compatible = "qcom,qpnp-vibrator-ldo" },
546 { /* sentinel */ },
547};
548MODULE_DEVICE_TABLE(of, vibrator_ldo_match_table);
549
550static struct platform_driver qpnp_vibrator_ldo_driver = {
551 .driver = {
552 .name = "qcom,qpnp-vibrator-ldo",
553 .of_match_table = vibrator_ldo_match_table,
554 .pm = &qpnp_vibrator_ldo_pm_ops,
555 },
556 .probe = qpnp_vibrator_ldo_probe,
557 .remove = qpnp_vibrator_ldo_remove,
558};
559module_platform_driver(qpnp_vibrator_ldo_driver);
560
561MODULE_DESCRIPTION("QCOM QPNP Vibrator-LDO driver");
562MODULE_LICENSE("GPL v2");