^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) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * DRV260X haptics driver family
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Author: Dan Murphy <dmurphy@ti.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) * Copyright: (C) 2014 Texas Instruments, Inc.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <linux/i2c.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <linux/input.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <linux/regmap.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <linux/delay.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include <linux/gpio/consumer.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #include <linux/regulator/consumer.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #include <dt-bindings/input/ti-drv260x.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #define DRV260X_STATUS 0x0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #define DRV260X_MODE 0x1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #define DRV260X_RT_PB_IN 0x2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #define DRV260X_LIB_SEL 0x3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #define DRV260X_WV_SEQ_1 0x4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #define DRV260X_WV_SEQ_2 0x5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #define DRV260X_WV_SEQ_3 0x6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #define DRV260X_WV_SEQ_4 0x7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #define DRV260X_WV_SEQ_5 0x8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #define DRV260X_WV_SEQ_6 0x9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #define DRV260X_WV_SEQ_7 0xa
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) #define DRV260X_WV_SEQ_8 0xb
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) #define DRV260X_GO 0xc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) #define DRV260X_OVERDRIVE_OFF 0xd
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) #define DRV260X_SUSTAIN_P_OFF 0xe
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) #define DRV260X_SUSTAIN_N_OFF 0xf
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) #define DRV260X_BRAKE_OFF 0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) #define DRV260X_A_TO_V_CTRL 0x11
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) #define DRV260X_A_TO_V_MIN_INPUT 0x12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) #define DRV260X_A_TO_V_MAX_INPUT 0x13
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) #define DRV260X_A_TO_V_MIN_OUT 0x14
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) #define DRV260X_A_TO_V_MAX_OUT 0x15
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) #define DRV260X_RATED_VOLT 0x16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) #define DRV260X_OD_CLAMP_VOLT 0x17
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) #define DRV260X_CAL_COMP 0x18
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) #define DRV260X_CAL_BACK_EMF 0x19
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) #define DRV260X_FEEDBACK_CTRL 0x1a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) #define DRV260X_CTRL1 0x1b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) #define DRV260X_CTRL2 0x1c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) #define DRV260X_CTRL3 0x1d
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) #define DRV260X_CTRL4 0x1e
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) #define DRV260X_CTRL5 0x1f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) #define DRV260X_LRA_LOOP_PERIOD 0x20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) #define DRV260X_VBAT_MON 0x21
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) #define DRV260X_LRA_RES_PERIOD 0x22
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) #define DRV260X_MAX_REG 0x23
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) #define DRV260X_GO_BIT 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) /* Library Selection */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) #define DRV260X_LIB_SEL_MASK 0x07
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) #define DRV260X_LIB_SEL_RAM 0x0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) #define DRV260X_LIB_SEL_OD 0x1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) #define DRV260X_LIB_SEL_40_60 0x2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) #define DRV260X_LIB_SEL_60_80 0x3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) #define DRV260X_LIB_SEL_100_140 0x4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) #define DRV260X_LIB_SEL_140_PLUS 0x5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) #define DRV260X_LIB_SEL_HIZ_MASK 0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) #define DRV260X_LIB_SEL_HIZ_EN 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) #define DRV260X_LIB_SEL_HIZ_DIS 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) /* Mode register */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) #define DRV260X_STANDBY (1 << 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) #define DRV260X_STANDBY_MASK 0x40
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) #define DRV260X_INTERNAL_TRIGGER 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) #define DRV260X_EXT_TRIGGER_EDGE 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) #define DRV260X_EXT_TRIGGER_LEVEL 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) #define DRV260X_PWM_ANALOG_IN 0x03
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) #define DRV260X_AUDIOHAPTIC 0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) #define DRV260X_RT_PLAYBACK 0x05
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) #define DRV260X_DIAGNOSTICS 0x06
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) #define DRV260X_AUTO_CAL 0x07
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) /* Audio to Haptics Control */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) #define DRV260X_AUDIO_HAPTICS_PEAK_10MS (0 << 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) #define DRV260X_AUDIO_HAPTICS_PEAK_20MS (1 << 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) #define DRV260X_AUDIO_HAPTICS_PEAK_30MS (2 << 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) #define DRV260X_AUDIO_HAPTICS_PEAK_40MS (3 << 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) #define DRV260X_AUDIO_HAPTICS_FILTER_100HZ 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) #define DRV260X_AUDIO_HAPTICS_FILTER_125HZ 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) #define DRV260X_AUDIO_HAPTICS_FILTER_150HZ 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) #define DRV260X_AUDIO_HAPTICS_FILTER_200HZ 0x03
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) /* Min/Max Input/Output Voltages */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) #define DRV260X_AUDIO_HAPTICS_MIN_IN_VOLT 0x19
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) #define DRV260X_AUDIO_HAPTICS_MAX_IN_VOLT 0x64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) #define DRV260X_AUDIO_HAPTICS_MIN_OUT_VOLT 0x19
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) #define DRV260X_AUDIO_HAPTICS_MAX_OUT_VOLT 0xFF
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) /* Feedback register */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) #define DRV260X_FB_REG_ERM_MODE 0x7f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) #define DRV260X_FB_REG_LRA_MODE (1 << 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) #define DRV260X_BRAKE_FACTOR_MASK 0x1f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) #define DRV260X_BRAKE_FACTOR_2X (1 << 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) #define DRV260X_BRAKE_FACTOR_3X (2 << 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) #define DRV260X_BRAKE_FACTOR_4X (3 << 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) #define DRV260X_BRAKE_FACTOR_6X (4 << 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) #define DRV260X_BRAKE_FACTOR_8X (5 << 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) #define DRV260X_BRAKE_FACTOR_16 (6 << 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) #define DRV260X_BRAKE_FACTOR_DIS (7 << 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) #define DRV260X_LOOP_GAIN_LOW 0xf3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) #define DRV260X_LOOP_GAIN_MED (1 << 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) #define DRV260X_LOOP_GAIN_HIGH (2 << 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) #define DRV260X_LOOP_GAIN_VERY_HIGH (3 << 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) #define DRV260X_BEMF_GAIN_0 0xfc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) #define DRV260X_BEMF_GAIN_1 (1 << 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) #define DRV260X_BEMF_GAIN_2 (2 << 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) #define DRV260X_BEMF_GAIN_3 (3 << 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) /* Control 1 register */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) #define DRV260X_AC_CPLE_EN (1 << 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) #define DRV260X_STARTUP_BOOST (1 << 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) /* Control 2 register */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) #define DRV260X_IDISS_TIME_45 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) #define DRV260X_IDISS_TIME_75 (1 << 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) #define DRV260X_IDISS_TIME_150 (1 << 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) #define DRV260X_IDISS_TIME_225 0x03
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) #define DRV260X_BLANK_TIME_45 (0 << 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) #define DRV260X_BLANK_TIME_75 (1 << 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) #define DRV260X_BLANK_TIME_150 (2 << 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) #define DRV260X_BLANK_TIME_225 (3 << 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) #define DRV260X_SAMP_TIME_150 (0 << 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) #define DRV260X_SAMP_TIME_200 (1 << 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) #define DRV260X_SAMP_TIME_250 (2 << 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) #define DRV260X_SAMP_TIME_300 (3 << 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) #define DRV260X_BRAKE_STABILIZER (1 << 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) #define DRV260X_UNIDIR_IN (0 << 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) #define DRV260X_BIDIR_IN (1 << 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) /* Control 3 Register */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) #define DRV260X_LRA_OPEN_LOOP (1 << 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) #define DRV260X_ANANLOG_IN (1 << 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) #define DRV260X_LRA_DRV_MODE (1 << 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) #define DRV260X_RTP_UNSIGNED_DATA (1 << 3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) #define DRV260X_SUPPLY_COMP_DIS (1 << 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) #define DRV260X_ERM_OPEN_LOOP (1 << 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) #define DRV260X_NG_THRESH_0 (0 << 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) #define DRV260X_NG_THRESH_2 (1 << 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) #define DRV260X_NG_THRESH_4 (2 << 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) #define DRV260X_NG_THRESH_8 (3 << 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) /* Control 4 Register */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) #define DRV260X_AUTOCAL_TIME_150MS (0 << 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) #define DRV260X_AUTOCAL_TIME_250MS (1 << 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) #define DRV260X_AUTOCAL_TIME_500MS (2 << 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) #define DRV260X_AUTOCAL_TIME_1000MS (3 << 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) * struct drv260x_data -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) * @input_dev - Pointer to the input device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) * @client - Pointer to the I2C client
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) * @regmap - Register map of the device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) * @work - Work item used to off load the enable/disable of the vibration
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) * @enable_gpio - Pointer to the gpio used for enable/disabling
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) * @regulator - Pointer to the regulator for the IC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) * @magnitude - Magnitude of the vibration event
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) * @mode - The operating mode of the IC (LRA_NO_CAL, ERM or LRA)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) * @library - The vibration library to be used
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) * @rated_voltage - The rated_voltage of the actuator
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) * @overdriver_voltage - The over drive voltage of the actuator
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) **/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) struct drv260x_data {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) struct input_dev *input_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) struct i2c_client *client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) struct regmap *regmap;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) struct work_struct work;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) struct gpio_desc *enable_gpio;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) struct regulator *regulator;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) u32 magnitude;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) u32 mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) u32 library;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) int rated_voltage;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) int overdrive_voltage;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) static const struct reg_default drv260x_reg_defs[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) { DRV260X_STATUS, 0xe0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) { DRV260X_MODE, 0x40 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) { DRV260X_RT_PB_IN, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) { DRV260X_LIB_SEL, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) { DRV260X_WV_SEQ_1, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) { DRV260X_WV_SEQ_2, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) { DRV260X_WV_SEQ_3, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) { DRV260X_WV_SEQ_4, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) { DRV260X_WV_SEQ_5, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) { DRV260X_WV_SEQ_6, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) { DRV260X_WV_SEQ_7, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) { DRV260X_WV_SEQ_8, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) { DRV260X_GO, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) { DRV260X_OVERDRIVE_OFF, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) { DRV260X_SUSTAIN_P_OFF, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) { DRV260X_SUSTAIN_N_OFF, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) { DRV260X_BRAKE_OFF, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) { DRV260X_A_TO_V_CTRL, 0x05 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) { DRV260X_A_TO_V_MIN_INPUT, 0x19 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) { DRV260X_A_TO_V_MAX_INPUT, 0xff },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) { DRV260X_A_TO_V_MIN_OUT, 0x19 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) { DRV260X_A_TO_V_MAX_OUT, 0xff },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) { DRV260X_RATED_VOLT, 0x3e },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) { DRV260X_OD_CLAMP_VOLT, 0x8c },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) { DRV260X_CAL_COMP, 0x0c },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) { DRV260X_CAL_BACK_EMF, 0x6c },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) { DRV260X_FEEDBACK_CTRL, 0x36 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) { DRV260X_CTRL1, 0x93 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) { DRV260X_CTRL2, 0xfa },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) { DRV260X_CTRL3, 0xa0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) { DRV260X_CTRL4, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) { DRV260X_CTRL5, 0x80 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) { DRV260X_LRA_LOOP_PERIOD, 0x33 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) { DRV260X_VBAT_MON, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) { DRV260X_LRA_RES_PERIOD, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) #define DRV260X_DEF_RATED_VOLT 0x90
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) #define DRV260X_DEF_OD_CLAMP_VOLT 0x90
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) * Rated and Overdriver Voltages:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) * Calculated using the formula r = v * 255 / 5.6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) * where r is what will be written to the register
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) * and v is the rated or overdriver voltage of the actuator
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) **/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) static int drv260x_calculate_voltage(unsigned int voltage)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) return (voltage * 255 / 5600);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) static void drv260x_worker(struct work_struct *work)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) struct drv260x_data *haptics = container_of(work, struct drv260x_data, work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) int error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) gpiod_set_value(haptics->enable_gpio, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) /* Data sheet says to wait 250us before trying to communicate */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) udelay(250);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) error = regmap_write(haptics->regmap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) DRV260X_MODE, DRV260X_RT_PLAYBACK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) if (error) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) dev_err(&haptics->client->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) "Failed to write set mode: %d\n", error);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) error = regmap_write(haptics->regmap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) DRV260X_RT_PB_IN, haptics->magnitude);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) if (error)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) dev_err(&haptics->client->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) "Failed to set magnitude: %d\n", error);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) static int drv260x_haptics_play(struct input_dev *input, void *data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) struct ff_effect *effect)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) struct drv260x_data *haptics = input_get_drvdata(input);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) haptics->mode = DRV260X_LRA_NO_CAL_MODE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) if (effect->u.rumble.strong_magnitude > 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) haptics->magnitude = effect->u.rumble.strong_magnitude;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) else if (effect->u.rumble.weak_magnitude > 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) haptics->magnitude = effect->u.rumble.weak_magnitude;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) haptics->magnitude = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) schedule_work(&haptics->work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) static void drv260x_close(struct input_dev *input)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) struct drv260x_data *haptics = input_get_drvdata(input);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) int error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) cancel_work_sync(&haptics->work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) error = regmap_write(haptics->regmap, DRV260X_MODE, DRV260X_STANDBY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) if (error)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) dev_err(&haptics->client->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) "Failed to enter standby mode: %d\n", error);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) gpiod_set_value(haptics->enable_gpio, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) static const struct reg_sequence drv260x_lra_cal_regs[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) { DRV260X_MODE, DRV260X_AUTO_CAL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) { DRV260X_CTRL3, DRV260X_NG_THRESH_2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) { DRV260X_FEEDBACK_CTRL, DRV260X_FB_REG_LRA_MODE |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) DRV260X_BRAKE_FACTOR_4X | DRV260X_LOOP_GAIN_HIGH },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) static const struct reg_sequence drv260x_lra_init_regs[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) { DRV260X_MODE, DRV260X_RT_PLAYBACK },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) { DRV260X_A_TO_V_CTRL, DRV260X_AUDIO_HAPTICS_PEAK_20MS |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) DRV260X_AUDIO_HAPTICS_FILTER_125HZ },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) { DRV260X_A_TO_V_MIN_INPUT, DRV260X_AUDIO_HAPTICS_MIN_IN_VOLT },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) { DRV260X_A_TO_V_MAX_INPUT, DRV260X_AUDIO_HAPTICS_MAX_IN_VOLT },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) { DRV260X_A_TO_V_MIN_OUT, DRV260X_AUDIO_HAPTICS_MIN_OUT_VOLT },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) { DRV260X_A_TO_V_MAX_OUT, DRV260X_AUDIO_HAPTICS_MAX_OUT_VOLT },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) { DRV260X_FEEDBACK_CTRL, DRV260X_FB_REG_LRA_MODE |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) DRV260X_BRAKE_FACTOR_2X | DRV260X_LOOP_GAIN_MED |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) DRV260X_BEMF_GAIN_3 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) { DRV260X_CTRL1, DRV260X_STARTUP_BOOST },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) { DRV260X_CTRL2, DRV260X_SAMP_TIME_250 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) { DRV260X_CTRL3, DRV260X_NG_THRESH_2 | DRV260X_ANANLOG_IN },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) { DRV260X_CTRL4, DRV260X_AUTOCAL_TIME_500MS },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) static const struct reg_sequence drv260x_erm_cal_regs[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) { DRV260X_MODE, DRV260X_AUTO_CAL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) { DRV260X_A_TO_V_MIN_INPUT, DRV260X_AUDIO_HAPTICS_MIN_IN_VOLT },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) { DRV260X_A_TO_V_MAX_INPUT, DRV260X_AUDIO_HAPTICS_MAX_IN_VOLT },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) { DRV260X_A_TO_V_MIN_OUT, DRV260X_AUDIO_HAPTICS_MIN_OUT_VOLT },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) { DRV260X_A_TO_V_MAX_OUT, DRV260X_AUDIO_HAPTICS_MAX_OUT_VOLT },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) { DRV260X_FEEDBACK_CTRL, DRV260X_BRAKE_FACTOR_3X |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) DRV260X_LOOP_GAIN_MED | DRV260X_BEMF_GAIN_2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) { DRV260X_CTRL1, DRV260X_STARTUP_BOOST },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) { DRV260X_CTRL2, DRV260X_SAMP_TIME_250 | DRV260X_BLANK_TIME_75 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) DRV260X_IDISS_TIME_75 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) { DRV260X_CTRL3, DRV260X_NG_THRESH_2 | DRV260X_ERM_OPEN_LOOP },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) { DRV260X_CTRL4, DRV260X_AUTOCAL_TIME_500MS },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) static int drv260x_init(struct drv260x_data *haptics)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) int error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) unsigned int cal_buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) error = regmap_write(haptics->regmap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) DRV260X_RATED_VOLT, haptics->rated_voltage);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) if (error) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) dev_err(&haptics->client->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) "Failed to write DRV260X_RATED_VOLT register: %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) error);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) return error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) error = regmap_write(haptics->regmap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) DRV260X_OD_CLAMP_VOLT, haptics->overdrive_voltage);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) if (error) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) dev_err(&haptics->client->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) "Failed to write DRV260X_OD_CLAMP_VOLT register: %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) error);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) return error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) switch (haptics->mode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) case DRV260X_LRA_MODE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) error = regmap_register_patch(haptics->regmap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) drv260x_lra_cal_regs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) ARRAY_SIZE(drv260x_lra_cal_regs));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) if (error) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) dev_err(&haptics->client->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) "Failed to write LRA calibration registers: %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) error);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) return error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) case DRV260X_ERM_MODE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) error = regmap_register_patch(haptics->regmap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) drv260x_erm_cal_regs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) ARRAY_SIZE(drv260x_erm_cal_regs));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) if (error) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) dev_err(&haptics->client->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) "Failed to write ERM calibration registers: %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) error);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) return error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) error = regmap_update_bits(haptics->regmap, DRV260X_LIB_SEL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) DRV260X_LIB_SEL_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) haptics->library);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) if (error) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) dev_err(&haptics->client->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) "Failed to write DRV260X_LIB_SEL register: %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) error);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) return error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) error = regmap_register_patch(haptics->regmap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) drv260x_lra_init_regs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) ARRAY_SIZE(drv260x_lra_init_regs));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) if (error) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) dev_err(&haptics->client->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) "Failed to write LRA init registers: %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) error);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) return error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) error = regmap_update_bits(haptics->regmap, DRV260X_LIB_SEL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) DRV260X_LIB_SEL_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) haptics->library);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) if (error) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) dev_err(&haptics->client->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) "Failed to write DRV260X_LIB_SEL register: %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) error);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) return error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) /* No need to set GO bit here */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) error = regmap_write(haptics->regmap, DRV260X_GO, DRV260X_GO_BIT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) if (error) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) dev_err(&haptics->client->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) "Failed to write GO register: %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) error);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) return error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) error = regmap_read(haptics->regmap, DRV260X_GO, &cal_buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) if (error) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) dev_err(&haptics->client->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) "Failed to read GO register: %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) error);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) return error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) } while (cal_buf == DRV260X_GO_BIT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) static const struct regmap_config drv260x_regmap_config = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) .reg_bits = 8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) .val_bits = 8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) .max_register = DRV260X_MAX_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) .reg_defaults = drv260x_reg_defs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) .num_reg_defaults = ARRAY_SIZE(drv260x_reg_defs),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) .cache_type = REGCACHE_NONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) static int drv260x_probe(struct i2c_client *client,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) const struct i2c_device_id *id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) struct device *dev = &client->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) struct drv260x_data *haptics;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) u32 voltage;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) int error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) haptics = devm_kzalloc(dev, sizeof(*haptics), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) if (!haptics)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) error = device_property_read_u32(dev, "mode", &haptics->mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) if (error) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) dev_err(dev, "Can't fetch 'mode' property: %d\n", error);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) return error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) if (haptics->mode < DRV260X_LRA_MODE ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) haptics->mode > DRV260X_ERM_MODE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) dev_err(dev, "Vibrator mode is invalid: %i\n", haptics->mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) error = device_property_read_u32(dev, "library-sel", &haptics->library);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) if (error) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) dev_err(dev, "Can't fetch 'library-sel' property: %d\n", error);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) return error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) if (haptics->library < DRV260X_LIB_EMPTY ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) haptics->library > DRV260X_ERM_LIB_F) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) dev_err(dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) "Library value is invalid: %i\n", haptics->library);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) if (haptics->mode == DRV260X_LRA_MODE &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) haptics->library != DRV260X_LIB_EMPTY &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) haptics->library != DRV260X_LIB_LRA) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) dev_err(dev, "LRA Mode with ERM Library mismatch\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) if (haptics->mode == DRV260X_ERM_MODE &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) (haptics->library == DRV260X_LIB_EMPTY ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) haptics->library == DRV260X_LIB_LRA)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) dev_err(dev, "ERM Mode with LRA Library mismatch\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) error = device_property_read_u32(dev, "vib-rated-mv", &voltage);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) haptics->rated_voltage = error ? DRV260X_DEF_RATED_VOLT :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) drv260x_calculate_voltage(voltage);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) error = device_property_read_u32(dev, "vib-overdrive-mv", &voltage);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) haptics->overdrive_voltage = error ? DRV260X_DEF_OD_CLAMP_VOLT :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) drv260x_calculate_voltage(voltage);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) haptics->regulator = devm_regulator_get(dev, "vbat");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) if (IS_ERR(haptics->regulator)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) error = PTR_ERR(haptics->regulator);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) dev_err(dev, "unable to get regulator, error: %d\n", error);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) return error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) haptics->enable_gpio = devm_gpiod_get_optional(dev, "enable",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) GPIOD_OUT_HIGH);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) if (IS_ERR(haptics->enable_gpio))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) return PTR_ERR(haptics->enable_gpio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) haptics->input_dev = devm_input_allocate_device(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) if (!haptics->input_dev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) dev_err(dev, "Failed to allocate input device\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) haptics->input_dev->name = "drv260x:haptics";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) haptics->input_dev->close = drv260x_close;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) input_set_drvdata(haptics->input_dev, haptics);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) input_set_capability(haptics->input_dev, EV_FF, FF_RUMBLE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) error = input_ff_create_memless(haptics->input_dev, NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) drv260x_haptics_play);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) if (error) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) dev_err(dev, "input_ff_create() failed: %d\n", error);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) return error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) INIT_WORK(&haptics->work, drv260x_worker);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) haptics->client = client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) i2c_set_clientdata(client, haptics);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) haptics->regmap = devm_regmap_init_i2c(client, &drv260x_regmap_config);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) if (IS_ERR(haptics->regmap)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) error = PTR_ERR(haptics->regmap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) dev_err(dev, "Failed to allocate register map: %d\n", error);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) return error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) error = drv260x_init(haptics);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) if (error) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) dev_err(dev, "Device init failed: %d\n", error);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) return error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) error = input_register_device(haptics->input_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) if (error) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) dev_err(dev, "couldn't register input device: %d\n", error);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) return error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) static int __maybe_unused drv260x_suspend(struct device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) struct drv260x_data *haptics = dev_get_drvdata(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) mutex_lock(&haptics->input_dev->mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) if (haptics->input_dev->users) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) ret = regmap_update_bits(haptics->regmap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) DRV260X_MODE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) DRV260X_STANDBY_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) DRV260X_STANDBY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) dev_err(dev, "Failed to set standby mode\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) gpiod_set_value(haptics->enable_gpio, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) ret = regulator_disable(haptics->regulator);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) dev_err(dev, "Failed to disable regulator\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) regmap_update_bits(haptics->regmap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) DRV260X_MODE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) DRV260X_STANDBY_MASK, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) mutex_unlock(&haptics->input_dev->mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) static int __maybe_unused drv260x_resume(struct device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) struct drv260x_data *haptics = dev_get_drvdata(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) mutex_lock(&haptics->input_dev->mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) if (haptics->input_dev->users) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) ret = regulator_enable(haptics->regulator);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) dev_err(dev, "Failed to enable regulator\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) ret = regmap_update_bits(haptics->regmap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) DRV260X_MODE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) DRV260X_STANDBY_MASK, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) dev_err(dev, "Failed to unset standby mode\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) regulator_disable(haptics->regulator);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) gpiod_set_value(haptics->enable_gpio, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) mutex_unlock(&haptics->input_dev->mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) static SIMPLE_DEV_PM_OPS(drv260x_pm_ops, drv260x_suspend, drv260x_resume);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) static const struct i2c_device_id drv260x_id[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) { "drv2605l", 0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) MODULE_DEVICE_TABLE(i2c, drv260x_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) static const struct of_device_id drv260x_of_match[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) { .compatible = "ti,drv2604", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) { .compatible = "ti,drv2604l", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) { .compatible = "ti,drv2605", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) { .compatible = "ti,drv2605l", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) MODULE_DEVICE_TABLE(of, drv260x_of_match);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) static struct i2c_driver drv260x_driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) .probe = drv260x_probe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) .driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) .name = "drv260x-haptics",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) .of_match_table = drv260x_of_match,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) .pm = &drv260x_pm_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) .id_table = drv260x_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) module_i2c_driver(drv260x_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) MODULE_DESCRIPTION("TI DRV260x haptics driver");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) MODULE_LICENSE("GPL");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) MODULE_AUTHOR("Dan Murphy <dmurphy@ti.com>");