^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0-only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /* Copyright (c) 2010-2011, Code Aurora Forum. All rights reserved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) #include <linux/errno.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) #include <linux/input.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include <linux/of.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <linux/of_device.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <linux/platform_device.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <linux/regmap.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #define VIB_MAX_LEVEL_mV (3100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #define VIB_MIN_LEVEL_mV (1200)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #define VIB_MAX_LEVELS (VIB_MAX_LEVEL_mV - VIB_MIN_LEVEL_mV)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #define MAX_FF_SPEED 0xff
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) struct pm8xxx_regs {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) unsigned int enable_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) unsigned int enable_mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) unsigned int drv_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) unsigned int drv_mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) unsigned int drv_shift;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) unsigned int drv_en_manual_mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) static const struct pm8xxx_regs pm8058_regs = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) .drv_addr = 0x4A,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) .drv_mask = 0xf8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) .drv_shift = 3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) .drv_en_manual_mask = 0xfc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) static struct pm8xxx_regs pm8916_regs = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) .enable_addr = 0xc046,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) .enable_mask = BIT(7),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) .drv_addr = 0xc041,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) .drv_mask = 0x1F,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) .drv_shift = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) .drv_en_manual_mask = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) * struct pm8xxx_vib - structure to hold vibrator data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) * @vib_input_dev: input device supporting force feedback
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) * @work: work structure to set the vibration parameters
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) * @regmap: regmap for register read/write
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) * @regs: registers' info
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) * @speed: speed of vibration set from userland
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) * @active: state of vibrator
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) * @level: level of vibration to set in the chip
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) * @reg_vib_drv: regs->drv_addr register value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) struct pm8xxx_vib {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) struct input_dev *vib_input_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) struct work_struct work;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) struct regmap *regmap;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) const struct pm8xxx_regs *regs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) int speed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) int level;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) bool active;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) u8 reg_vib_drv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) * pm8xxx_vib_set - handler to start/stop vibration
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) * @vib: pointer to vibrator structure
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) * @on: state to set
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) static int pm8xxx_vib_set(struct pm8xxx_vib *vib, bool on)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) unsigned int val = vib->reg_vib_drv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) const struct pm8xxx_regs *regs = vib->regs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) if (on)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) val |= (vib->level << regs->drv_shift) & regs->drv_mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) val &= ~regs->drv_mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) rc = regmap_write(vib->regmap, regs->drv_addr, val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) if (rc < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) vib->reg_vib_drv = val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) if (regs->enable_mask)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) rc = regmap_update_bits(vib->regmap, regs->enable_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) regs->enable_mask, on ? ~0 : 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) * pm8xxx_work_handler - worker to set vibration level
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) * @work: pointer to work_struct
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) static void pm8xxx_work_handler(struct work_struct *work)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) struct pm8xxx_vib *vib = container_of(work, struct pm8xxx_vib, work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) const struct pm8xxx_regs *regs = vib->regs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) unsigned int val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) rc = regmap_read(vib->regmap, regs->drv_addr, &val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) if (rc < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) * pmic vibrator supports voltage ranges from 1.2 to 3.1V, so
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) * scale the level to fit into these ranges.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) if (vib->speed) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) vib->active = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) vib->level = ((VIB_MAX_LEVELS * vib->speed) / MAX_FF_SPEED) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) VIB_MIN_LEVEL_mV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) vib->level /= 100;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) vib->active = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) vib->level = VIB_MIN_LEVEL_mV / 100;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) pm8xxx_vib_set(vib, vib->active);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) * pm8xxx_vib_close - callback of input close callback
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) * @dev: input device pointer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) * Turns off the vibrator.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) static void pm8xxx_vib_close(struct input_dev *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) struct pm8xxx_vib *vib = input_get_drvdata(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) cancel_work_sync(&vib->work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) if (vib->active)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) pm8xxx_vib_set(vib, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) * pm8xxx_vib_play_effect - function to handle vib effects.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) * @dev: input device pointer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) * @data: data of effect
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) * @effect: effect to play
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) * Currently this driver supports only rumble effects.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) static int pm8xxx_vib_play_effect(struct input_dev *dev, void *data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) struct ff_effect *effect)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) struct pm8xxx_vib *vib = input_get_drvdata(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) vib->speed = effect->u.rumble.strong_magnitude >> 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) if (!vib->speed)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) vib->speed = effect->u.rumble.weak_magnitude >> 9;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) schedule_work(&vib->work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) static int pm8xxx_vib_probe(struct platform_device *pdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) struct pm8xxx_vib *vib;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) struct input_dev *input_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) int error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) unsigned int val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) const struct pm8xxx_regs *regs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) vib = devm_kzalloc(&pdev->dev, sizeof(*vib), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) if (!vib)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) vib->regmap = dev_get_regmap(pdev->dev.parent, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) if (!vib->regmap)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) input_dev = devm_input_allocate_device(&pdev->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) if (!input_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) INIT_WORK(&vib->work, pm8xxx_work_handler);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) vib->vib_input_dev = input_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) regs = of_device_get_match_data(&pdev->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) /* operate in manual mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) error = regmap_read(vib->regmap, regs->drv_addr, &val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) if (error < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) return error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) val &= regs->drv_en_manual_mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) error = regmap_write(vib->regmap, regs->drv_addr, val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) if (error < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) return error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) vib->regs = regs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) vib->reg_vib_drv = val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) input_dev->name = "pm8xxx_vib_ffmemless";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) input_dev->id.version = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) input_dev->close = pm8xxx_vib_close;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) input_set_drvdata(input_dev, vib);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) input_set_capability(vib->vib_input_dev, EV_FF, FF_RUMBLE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) error = input_ff_create_memless(input_dev, NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) pm8xxx_vib_play_effect);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) if (error) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) dev_err(&pdev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) "couldn't register vibrator as FF device\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) return error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) error = input_register_device(input_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) if (error) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) dev_err(&pdev->dev, "couldn't register input device\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) return error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) platform_set_drvdata(pdev, vib);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) static int __maybe_unused pm8xxx_vib_suspend(struct device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) struct pm8xxx_vib *vib = dev_get_drvdata(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) /* Turn off the vibrator */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) pm8xxx_vib_set(vib, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) static SIMPLE_DEV_PM_OPS(pm8xxx_vib_pm_ops, pm8xxx_vib_suspend, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) static const struct of_device_id pm8xxx_vib_id_table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) { .compatible = "qcom,pm8058-vib", .data = &pm8058_regs },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) { .compatible = "qcom,pm8921-vib", .data = &pm8058_regs },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) { .compatible = "qcom,pm8916-vib", .data = &pm8916_regs },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) MODULE_DEVICE_TABLE(of, pm8xxx_vib_id_table);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) static struct platform_driver pm8xxx_vib_driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) .probe = pm8xxx_vib_probe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) .driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) .name = "pm8xxx-vib",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) .pm = &pm8xxx_vib_pm_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) .of_match_table = pm8xxx_vib_id_table,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) module_platform_driver(pm8xxx_vib_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) MODULE_ALIAS("platform:pm8xxx_vib");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) MODULE_DESCRIPTION("PMIC8xxx vibrator driver based on ff-memless framework");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) MODULE_LICENSE("GPL v2");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) MODULE_AUTHOR("Amy Maloche <amaloche@codeaurora.org>");