da7280: haptic driver submission
Subsystems (5)
v10 cover da7280: haptic driver submission
This patch adds support for the Dialog DA7280 Haptic driver IC.
In this patch set the following is provided:
[PATCH V10 1/3] MAINTAINERS file update for DA7280 [PATCH V10 2/3] DA7280 DT Binding
[PATCH V10 3/3] DA7280 Driver
This patch applies against linux-next and v5.5
Thank you,
Roy Im, Dialog Semiconductor Ltd.
Roy Im (3):
MAINTAINERS: da7280 updates to the Dialog Semiconductor search terms
dt-bindings: input: Add document bindings for DA7280
Input: new da7280 haptic driver
.../devicetree/bindings/input/dlg,da7280.txt | 109 ++ MAINTAINERS | 2 + drivers/input/misc/Kconfig | 13 + drivers/input/misc/Makefile | 1 + drivers/input/misc/da7280.c | 1892 ++++++++++++++++++++ 5 files changed, 2017 insertions(+) create mode 100644 Documentation/devicetree/bindings/input/dlg,da7280.txt create mode 100644 drivers/input/misc/da7280.c
Signature · 1 line
end-of-patch for PATCH V10
PATCH v10 1/3 MAINTAINERS: da7280 updates to the Dialog Semiconductor search terms
This patch adds the da7280 bindings doc and driver to the Dialog Semiconductor support list.
---
v10: No changes.
v9: No changes.
v8: No changes.
v7: No changes.
v6: No changes.
v5: No changes.
v4: No changes.
v3: No changes.
v2: No changes.
MAINTAINERS | 2 ++ 1 file changed, 2 insertions(+)
MAINTAINERS +2 -0
@@ -4856,6 +4856,7 @@ S: Supported F: Documentation/hwmon/da90??.rst F: Documentation/devicetree/bindings/mfd/da90*.txt F: Documentation/devicetree/bindings/input/da90??-onkey.txt +F: Documentation/devicetree/bindings/input/dlg,da72??.txt F: Documentation/devicetree/bindings/thermal/da90??-thermal.txt F: Documentation/devicetree/bindings/regulator/da92*.txt F: Documentation/devicetree/bindings/regulator/slg51000.txt
@@ -4865,6 +4866,7 @@ F: drivers/gpio/gpio-da90??.c F: drivers/hwmon/da90??-hwmon.c F: drivers/iio/adc/da91??-*.c F: drivers/input/misc/da90??_onkey.c +F: drivers/input/misc/da72??.[ch] F: drivers/input/touchscreen/da9052_tsi.c F: drivers/leds/leds-da90??.c F: drivers/mfd/da903x.c
Signature · 1 line
end-of-patch for PATCH V10
PATCH v10 2/3 dt-bindings: input: Add document bindings for DA7280
In reply to Roy ImAdd device tree binding information for DA7280 haptic driver. Example bindings for DA7280 are added.
---
v10: No changes.
v9: No changes.
v8: Updated descriptions for new properties.
v7: No changes.
v6: No changes.
v5: Updated descriptions and fixed errors.
v4: Fixed commit message, properties.
v3: Fixed subject format.
v2: No changes
.../devicetree/bindings/input/dlg,da7280.txt | 109 +++++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 Documentation/devicetree/bindings/input/dlg,da7280.txt
Documentation/devicetree/bindings/input/dlg,da7280.txt new file +109 -0
@@ -0,0 +1,109 @@ +Dialog Semiconductor DA7280 Haptics bindings + +Required properties: +- compatible: Should be "dlg,da7280". +- reg: Specifies the I2C slave address. + +- interrupt-parent : Specifies the phandle of the interrupt controller to + which the IRQs from DA7280 are delivered to. + +- dlg,actuator-type: Set Actuator type. it should be one of: + "LRA" - Linear Resonance Actuator type. + "ERM-bar" - Bar type Eccentric Rotating Mass. + "ERM-coin" - Coin type Eccentric Rotating Mass. + +- dlg,const-op-mode: Haptic operation mode for FF_CONSTANT. + Possible values: + 1 - Direct register override(DRO) mode triggered by i2c(default), + 2 - PWM data source mode controlled by PWM duty, +- dlg,periodic-op-mode: Haptic operation mode for FF_PERIODIC. + Possible values: + 1 - Register triggered waveform memory(RTWM) mode, the pattern + assigned to the PS_SEQ_ID played as much times as PS_SEQ_LOOP, + 2 - Edge triggered waveform memory(ETWM) mode, external GPI(N) + control are required to enable/disable and it needs to keep + device enabled by sending magnitude (X > 0), + the pattern is assigned to the GPI(N)_SEQUENCE_ID below. + The default value is 1 for both of the operation modes. + For more details, please see the datasheet. + +- dlg,nom-microvolt: Nominal actuator voltage rating. + Valid values: 0 - 6000000. +- dlg,abs-max-microvolt: Absolute actuator maximum voltage rating. + Valid values: 0 - 6000000. +- dlg,imax-microamp: Actuator max current rating. + Valid values: 0 - 252000. + Default: 130000. +- dlg,impd-micro-ohms: the impedance of the actuator in micro ohms. + Valid values: 0 - 1500000000. + +Optional properties: +- pwms : phandle to the physical PWM(Pulse Width Modulation) device. + PWM properties should be named "pwms". And number of cell is different + for each pwm device. + (See Documentation/devicetree/bindings/pwm/pwm.txt + for further information relating to pwm properties) + +- dlg,ps-seq-id: the PS_SEQ_ID(pattern ID in waveform memory inside chip) + to play back when RTWM-MODE is enabled. + Valid range: 0 - 15. +- dlg,ps-seq-loop: the PS_SEQ_LOOP, Number of times the pre-stored sequence + pointed to by PS_SEQ_ID or GPI(N)_SEQUENCE_ID is repeated. + Valid range: 0 - 15. +- dlg,gpiN-seq-id: the GPI(N)_SEQUENCE_ID, pattern to play + when gpi0 is triggered, 'N' must be 0 - 2. + Valid range: 0 - 15. +- dlg,gpiN-mode: the pattern mode which can select either + "Single-pattern" or "Multi-pattern", 'N' must be 0 - 2. +- dlg,gpiN-polarity: gpiN polarity which can be chosen among + "Rising-edge", "Falling-edge" and "Both-edge", + 'N' must be 0 - 2 + Haptic will work by this edge option in case of ETWM mode. + +- dlg,resonant-freq-hz: use in case of LRA. + the frequency range: 50 - 300. + Default: 205. + +- dlg,bemf-sens-enable: Enable for internal loop computations. +- dlg,freq-track-enable: Enable for resonant frequency tracking. +- dlg,acc-enable: Enable for active acceleration. +- dlg,rapid-stop-enable: Enable for rapid stop. +- dlg,amp-pid-enable: Enable for the amplitude PID. +- dlg,mem-array: Customized waveform memory(patterns) data downloaded to + the device during initialization. This is an array of 100 values(u8). + +For further information, see device datasheet. + +====== + +Example: + + haptics: da7280-haptics@4a { + compatible = "dlg,da7280"; + reg = <0x4a>; + interrupt-parent = <&gpio6>; + interrupts = <11 IRQ_TYPE_LEVEL_LOW>; + dlg,actuator-type = "LRA"; + dlg,dlg,const-op-mode = <1>; + dlg,dlg,periodic-op-mode = <1>; + dlg,nom-microvolt = <2000000>; + dlg,abs-max-microvolt = <2000000>; + dlg,imax-microamp = <170000>; + dlg,resonant-freq-hz = <180>; + dlg,impd-micro-ohms = <10500000>; + dlg,freq-track-enable; + dlg,rapid-stop-enable; + dlg,mem-array = < + 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 + 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 + 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 + 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 + 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 + 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 + 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 + 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 + 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 + 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 + >; + + };
Signature · 1 line
end-of-patch for PATCH V10
PATCH v10 3/3 Input: new da7280 haptic driver
In reply to Roy ImAdds support for the Dialog DA7280 LRA/ERM Haptic Driver with multiple mode and integrated waveform memory and wideband support. It communicates via an I2C bus to the device.
---
v10:
- Updated the pwm related function and added some comments.
v9:
- Removed the header file and put the definitions into the c file.
- Updated the pwm code and error logs with %pE
v8:
- Added changes to support FF_PERIODIC/FF_CUSTOM and FF_CONSTANT.
- Updated the dt-related code.
- Removed memless related functions.
v7:
- Added more attributes to handle one value per file.
- Replaced and updated the dt-related code and functions called.
- Fixed error/functions.
- Rebased to v4.19-rc6.
v6: No changes.
v5: Fixed errors in Kconfig file.
v4: Updated code as dt-bindings are changed.
v3: No changes.
v2: Fixed kbuild error/warning
drivers/input/misc/Kconfig | 13 + drivers/input/misc/Makefile | 1 + drivers/input/misc/da7280.c | 1892 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 1906 insertions(+) create mode 100644 drivers/input/misc/da7280.c
drivers/input/misc/Kconfig +13 -0
@@ -879,4 +879,17 @@ config INPUT_STPMIC1_ONKEY To compile this driver as a module, choose M here: the module will be called stpmic1_onkey. +config INPUT_DA7280_HAPTICS + tristate "Dialog Semiconductor DA7280 haptics support" + depends on INPUT && I2C + select INPUT_FF_MEMLESS + select REGMAP_I2C + help + Say Y to enable support for the Dialog DA7280 haptics driver. + The haptics can be controlled by i2c communication, + or by PWM input, or by GPI. + + To compile this driver as a module, choose M here: the + module will be called da7280. + endif
drivers/input/misc/Makefile +1 -0
@@ -25,6 +25,7 @@ obj-$(CONFIG_INPUT_CMA3000) += cma3000_d0x.o obj-$(CONFIG_INPUT_CMA3000_I2C) += cma3000_d0x_i2c.o obj-$(CONFIG_INPUT_COBALT_BTNS) += cobalt_btns.o obj-$(CONFIG_INPUT_CPCAP_PWRBUTTON) += cpcap-pwrbutton.o +obj-$(CONFIG_INPUT_DA7280_HAPTICS) += da7280.o obj-$(CONFIG_INPUT_DA9052_ONKEY) += da9052_onkey.o obj-$(CONFIG_INPUT_DA9055_ONKEY) += da9055_onkey.o obj-$(CONFIG_INPUT_DA9063_ONKEY) += da9063_onkey.o
drivers/input/misc/da7280.c new file +1892 -0
1,892 lines not on this page · raw message
Signature · 1 line
end-of-patch for PATCH V10
Re: [PATCH V10 3/3] Input: new da7280 haptic driver
Hello Roy,
Quoted 10 lines · Roy Im
drivers/input/misc/da7280.c new file +10
-0+static int da7280_haptic_set_pwm (struct da7280_haptic *haptics,bool enabled) +{ +struct pwm_state state; +u64 period_mag_multi; +int error; + +if (!haptics->gain) { +dev_err (haptics->dev, +"Please set the gain first for the pwm mode\n" ); +return -EINVAL ;
drivers/input/misc/da7280.c line 391
Quoted 10 lines
drivers/input/misc/da7280.c new file +10
-0+ } + +pwm_get_state (haptics->pwm_dev, &state); + state.enabled = enabled; +if (enabled) { + period_mag_multi = state.period * haptics->gain; + period_mag_multi >>=MAX_MAGNITUDE_SHIFT ; + +/* The interpretation of duty cycle depends on the acc_en, +* it should be form 50% to 100% for acc_en = 0.
At least s/form/from/, but maybe better: it should be between 50% and 100% ...
drivers/input/misc/da7280.c line 399
Quoted 8 lines
drivers/input/misc/da7280.c new file +8
-0+* See datasheet 'PWM mode' section. +*/ +if (!haptics->acc_en) { + period_mag_multi += state.period; + period_mag_multi /=2 ; + } + + state.duty_cycle = (unsigned int )period_mag_multi;
This cast is not needed. (Also it seems struct pwm_state::duty_cycle becomes u64 soon, after this happens the cast even hurts.)
Quoted 15 lines
[...]
drivers/input/misc/da7280.c new file +14
-0+struct device *dev = &client->dev; +struct da7280_haptic *haptics; +struct input_dev *input_dev; +struct ff_device *ff; +struct pwm_state state; +unsigned int period2freq; +int error; + + haptics =devm_kzalloc (dev,sizeof (*haptics),GFP_KERNEL ); +if (!haptics) +return -ENOMEM ; + haptics->dev = dev; + +if (!client->irq) {
drivers/input/misc/da7280.c line 1725
Quoted 10 lines
drivers/input/misc/da7280.c new file +10
-0+dev_err (dev,"No IRQ configured\n" ); +return -EINVAL ; + } + +da7280_parse_properties (dev, haptics); + +if (haptics->const_op_mode ==DA7280_PWM_MODE ) { + haptics->pwm_dev =devm_pwm_get (dev,NULL ); +if (IS_ERR (haptics->pwm_dev)) { +dev_err (dev,"failed to get PWM device\n" );
Please use %pE to show the actual error and don't print if it is EPROBE_DEFER.
drivers/input/misc/da7280.c line 1730
Quoted 5 lines
drivers/input/misc/da7280.c new file +5
-0+return PTR_ERR (haptics->pwm_dev); + } + +pwm_init_state (haptics->pwm_dev, &state); + state.enabled = false;
This usuage is strange (which might be because pwm_init_state() is strange). I assume the goal here is to disable the PWM with the right polarity set, right? Ah, and initialize .period as this isn't touched later on. Hmm, no better idea, I guess we have to leave it as is for now.
Can it be that the PWM is already on at probe time and it might be usefull to keep it running as is?
drivers/input/misc/da7280.c line 1737
Quoted 7 lines
drivers/input/misc/da7280.c new file +7
-0+ error =pwm_apply_state (haptics->pwm_dev, &state); +if (error) { +dev_err (dev, +"failed to apply initial PWM state: %pE\n" , +ERR_PTR (error)); +return error; + }
Best regards
Uwe
Signature · 2 lines
Pengutronix e.K. | Uwe Kleine-König | Industrial Linux Solutions | https://www.pengutronix.de/ |
RE: [PATCH V10 3/3] Input: new da7280 haptic driver
Friday, Mar 06, 2020 at 4:06 PM, Uwe Kleine-König wrote
Quoted 15 lines · Roy Im
Quoted 14 lines
drivers/input/misc/da7280.c new file +14
-0+static int da7280_haptic_set_pwm (struct da7280_haptic *haptics,bool +enabled) { +struct pwm_state state; +u64 period_mag_multi; +int error; + +if (!haptics->gain) { +dev_err (haptics->dev, +"Please set the gain first for the pwm mode\n" ); +return -EINVAL ; + } + +pwm_get_state (haptics->pwm_dev, &state); + state.enabled = enabled;
Quoted 8 lines
drivers/input/misc/da7280.c line 391
Quoted 6 lines
drivers/input/misc/da7280.c new file +6
-0+if (enabled) { + period_mag_multi = state.period * haptics->gain; + period_mag_multi >>=MAX_MAGNITUDE_SHIFT ; + +/* The interpretation of duty cycle depends on the acc_en, +* it should be form 50% to 100% for acc_en = 0. At least s/form/from/, but maybe better: it should be between 50% and 100% ...
Okay, got it and sorry for the typo, I will update as you advise..
Quoted 11 lines
drivers/input/misc/da7280.c line 399
Quoted 8 lines
drivers/input/misc/da7280.c new file +8
-0+* See datasheet 'PWM mode' section. +*/ +if (!haptics->acc_en) { + period_mag_multi += state.period; + period_mag_multi /=2 ; + } + + state.duty_cycle = (unsigned int )period_mag_multi;This cast is not needed. (Also it seems struct
pwm_state::duty_cyclebecomes u64 soon, after this happens the cast even hurts.)
Okay, I will remove the cast.
Quoted 19 lines
Quoted 19 lines
[...]
drivers/input/misc/da7280.c new file +18
-0+struct device *dev = &client->dev; +struct da7280_haptic *haptics; +struct input_dev *input_dev; +struct ff_device *ff; +struct pwm_state state; +unsigned int period2freq; +int error; + + haptics =devm_kzalloc (dev,sizeof (*haptics),GFP_KERNEL ); +if (!haptics) +return -ENOMEM ; + haptics->dev = dev; + +if (!client->irq) { +dev_err (dev,"No IRQ configured\n" ); +return -EINVAL ; + } +
Quoted 8 lines
drivers/input/misc/da7280.c line 1725
Quoted 6 lines
drivers/input/misc/da7280.c new file +6
-0+da7280_parse_properties (dev, haptics); + +if (haptics->const_op_mode ==DA7280_PWM_MODE ) { + haptics->pwm_dev =devm_pwm_get (dev,NULL ); +if (IS_ERR (haptics->pwm_dev)) { +dev_err (dev,"failed to get PWM device\n" );Please use %pE to show the actual error and don't print if it is
EPROBE_DEFER.
Okay, I will change as following:
if (IS_ERR(haptics->pwm_dev)) {
error = PTR_ERR(haptics->pwm_dev);
if (error != -EPROBE_DEFER)
dev_err(dev, "unable to request PWM: %pE\n",
ERR_PTR(error));
return error;
}Do you still see anything on this changes?
Quoted 11 lines
drivers/input/misc/da7280.c line 1730
Quoted 5 lines
drivers/input/misc/da7280.c new file +5
-0+return PTR_ERR (haptics->pwm_dev); + } + +pwm_init_state (haptics->pwm_dev, &state); + state.enabled = false;This usuage is strange (which might be because
pwm_init_state()is strange). I assume the goal here is to disable the PWM with the right polarity set, right? Ah, and initialize .period as this isn't touched later on. Hmm, no better idea, I guess we have to leave it as is for now.Can it be that the PWM is already on at probe time and it might be usefull to keep it running as is?
Yes, that's right. I think so too..
Although it may not be that the PWM is already on at probe time but it may be useful to ensure that it is off for something unexpected. Also I will add this comments on the pwm_init_state():
/* Sync up PWM state and ensure it is off. */ pwm_init_state(haptics->pwm_dev, &state);
Do you have any comments more on this?
Quoted 11 lines
drivers/input/misc/da7280.c line 1737
Quoted 7 lines
drivers/input/misc/da7280.c new file +7
-0+ error =pwm_apply_state (haptics->pwm_dev, &state); +if (error) { +dev_err (dev, +"failed to apply initial PWM state: %pE\n" , +ERR_PTR (error)); +return error; + }Best regards
Uwe
Quoted 3 lines
--
Pengutronix e.K. | Uwe Kleine-König |
Industrial Linux Solutions | https://www.pengutronix.de/ |
Hello Uwe,
Thanks for your comments.
Kind regards,
Roy
RE: [PATCH V10 3/3] Input: new da7280 haptic driver
Friday, Mar 06, 2020 at 4:06 PM, Uwe Kleine-König wrote
Quoted 16 lines · Roy Im
Quoted 15 lines
drivers/input/misc/da7280.c new file +15
-0+static int da7280_haptic_set_pwm (struct da7280_haptic *haptics, +bool +enabled) { +struct pwm_state state; +u64 period_mag_multi; +int error; + +if (!haptics->gain) { +dev_err (haptics->dev, +"Please set the gain first for the pwm mode\n" ); +return -EINVAL ; + } + +pwm_get_state (haptics->pwm_dev, &state); + state.enabled = enabled;
Quoted 8 lines
drivers/input/misc/da7280.c line 391
Quoted 6 lines
drivers/input/misc/da7280.c new file +6
-0+if (enabled) { + period_mag_multi = state.period * haptics->gain; + period_mag_multi >>=MAX_MAGNITUDE_SHIFT ; + +/* The interpretation of duty cycle depends on the acc_en, +* it should be form 50% to 100% for acc_en = 0. At least s/form/from/, but maybe better: it should be between 50% and 100% ...
Okay, got it and sorry for the typo, I will update as you advise..
Quoted 4 lines
Quoted 4 lines
drivers/input/misc/da7280.c new file +4
-0+* See datasheet 'PWM mode' section. +*/ +if (!haptics->acc_en) { + period_mag_multi += state.period;
Quoted 8 lines
drivers/input/misc/da7280.c line 399
Quoted 4 lines
drivers/input/misc/da7280.c new file +4
-0+ period_mag_multi /=2 ; + } + + state.duty_cycle = (unsigned int )period_mag_multi;This cast is not needed. (Also it seems struct
pwm_state::duty_cyclebecomes u64 soon, after this happens the cast even hurts.)
Okay, I will remove the cast.
Quoted 19 lines
Quoted 19 lines
[...]
drivers/input/misc/da7280.c new file +18
-0+struct device *dev = &client->dev; +struct da7280_haptic *haptics; +struct input_dev *input_dev; +struct ff_device *ff; +struct pwm_state state; +unsigned int period2freq; +int error; + + haptics =devm_kzalloc (dev,sizeof (*haptics),GFP_KERNEL ); +if (!haptics) +return -ENOMEM ; + haptics->dev = dev; + +if (!client->irq) { +dev_err (dev,"No IRQ configured\n" ); +return -EINVAL ; + } +
Quoted 8 lines
drivers/input/misc/da7280.c line 1725
Quoted 6 lines
drivers/input/misc/da7280.c new file +6
-0+da7280_parse_properties (dev, haptics); + +if (haptics->const_op_mode ==DA7280_PWM_MODE ) { + haptics->pwm_dev =devm_pwm_get (dev,NULL ); +if (IS_ERR (haptics->pwm_dev)) { +dev_err (dev,"failed to get PWM device\n" );Please use %pE to show the actual error and don't print if it is
EPROBE_DEFER.
Okay, I will change as following:
if (IS_ERR(haptics->pwm_dev)) {
error = PTR_ERR(haptics->pwm_dev);
if (error != -EPROBE_DEFER)
dev_err(dev, "unable to request PWM: %pE\n",
ERR_PTR(error));
return error;
}Do you still see anything on this changes?
Quoted 9 lines
drivers/input/misc/da7280.c line 1730
Quoted 5 lines
drivers/input/misc/da7280.c new file +5
-0+return PTR_ERR (haptics->pwm_dev); + } + +pwm_init_state (haptics->pwm_dev, &state); + state.enabled = false;This usuage is strange (which might be because
pwm_init_state()is
strange). I assume the goal here is to disable the PWM with the right
polarity set, right? Ah, and initialize .period as this isn't touched later on. Hmm, no better idea, I guess we have to leave it as is for now.
Yes, that's right. I think so.
Quoted 1 line
Can it be that the PWM is already on at probe time and it might be usefull to keep it running as is?
I don't think it can be that the PWM is already on at probe time but it would be useful to ensure that it is off. Also I will add this comments on the pwm_init_state():
/* Sync up PWM state and ensure it is off. */ pwm_init_state(haptics->pwm_dev, &state);
Do you have any comments more on this?
Quoted 11 lines
drivers/input/misc/da7280.c line 1737
Quoted 7 lines
drivers/input/misc/da7280.c new file +7
-0+ error =pwm_apply_state (haptics->pwm_dev, &state); +if (error) { +dev_err (dev, +"failed to apply initial PWM state: %pE\n" , +ERR_PTR (error)); +return error; + }Best regards
Uwe
Quoted 3 lines
--
Pengutronix e.K. | Uwe Kleine-König |
Industrial Linux Solutions | https://www.pengutronix.de/ |
Hello Uwe,
Thanks for your comments.
Kind regards,
Roy