Skip to contentSkip to conversation

da7280: haptic driver submission

PATCH RESEND Superseded Roy Im 2 participants 10 messages Jun 15, 2020 – Jun 24, 2020

Subsystems (5)

v13 of 20 Superseded Latest is v20 →

lore
Share & tools
lore

Roy Im

author
#0 lore raw

v13 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 V13 1/3] MAINTAINERS file update for DA7280 [PATCH V13 2/3] DA7280 DT Binding
[PATCH V13 3/3] DA7280 Driver

This patch applies against linux-mainline and v5.7

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                        | 1898 ++++++++++++++++++++
 5 files changed, 2023 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 RESEND PATCH V13
author
#1 lore raw

PATCH RESEND v13 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.

---
v13: No changes.
v12: Corrected file list order.
v11: No changes.
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
index 50659d7..eff15f4 100644
@@ -4938,6 +4938,7 @@ M:	Support Opensource <[email protected]>
 S:	Supported
 W:	http://www.dialog-semiconductor.com/products
 F:	Documentation/devicetree/bindings/input/da90??-onkey.txt
+F:	Documentation/devicetree/bindings/input/dlg,da72??.txt
 F:	Documentation/devicetree/bindings/mfd/da90*.txt
 F:	Documentation/devicetree/bindings/regulator/da92*.txt
 F:	Documentation/devicetree/bindings/regulator/slg51000.txt
@@ -4948,6 +4949,7 @@ F:	Documentation/hwmon/da90??.rst
 F:	drivers/gpio/gpio-da90??.c
 F:	drivers/hwmon/da90??-hwmon.c
 F:	drivers/iio/adc/da91??-*.c
+F:	drivers/input/misc/da72??.[ch]
 F:	drivers/input/misc/da90??_onkey.c
 F:	drivers/input/touchscreen/da9052_tsi.c
 F:	drivers/leds/leds-da90??.c
Signature · 1 line
end-of-patch for RESEND PATCH V13
author
#2 lore raw

PATCH RESEND v13 2/3 dt-bindings: input: Add document bindings for DA7280

In reply to Roy Im

Add device tree binding information for DA7280 haptic driver. Example bindings for DA7280 are added.

---
v13: No changes.
v12: No changes.
v11: No changes.
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
new file mode 100644
index 0000000..e6b719d
@@ -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 RESEND PATCH V13
author
#3 lore raw

PATCH RESEND v13 3/3 Input: new da7280 haptic driver

In reply to Roy Im

Adds 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.

---
v13:
- Updated some conditions in pwm function and alignments.
v12: No changes.
v11:
- Updated the pwm related code, comments and typo.
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.
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 | 1898 +++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 1912 insertions(+)
 create mode 100644 drivers/input/misc/da7280.c
drivers/input/misc/Kconfig +13 -0
index 7e2e658..e2bf442 100644
@@ -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
index 8fd187f..71dc381 100644
@@ -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 +1898 -0

1,898 lines not on this page · raw message

Signature · 1 line
end-of-patch for RESEND PATCH V13
#4 lore raw

Re: [RESEND PATCH V13 3/3] Input: new da7280 haptic driver

Hello,

Quoted 5 lines · Roy Im

Adds 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.

Just some picky comments below.

drivers/input/misc/da7280.c line 404

Quoted 5 lines
drivers/input/misc/da7280.c new file +5 -0
+	error = pwm_apply_state(haptics->pwm_dev, &state);
+	if (error)
+		dev_err(haptics->dev,
+			"failed to apply pwm state: %pE\n",
+			ERR_PTR(error));

You can save some horizontal space here by dropping the \n after the first comma. (There are a few more occurences.)

Quoted 6 lines
drivers/input/misc/da7280.c new file +6 -0
+	return error;
+}
+[...]
+
+		/* Sync up PWM state and ensure it is off. */
+		pwm_init_state(haptics->pwm_dev, &state);

drivers/input/misc/da7280.c line 1744

Quoted 10 lines
drivers/input/misc/da7280.c new file +10 -0
+		state.enabled = false;
+		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;
+		}
+
+		/* Check PWM Period, it must be in 10k ~ 250kHz */

The unit of a PWM period is in (nano)seconds, to it cannot be in the range [10kHz, 250kHz]. (Is this too picky?)

drivers/input/misc/da7280.c line 1749

Quoted 5 lines
drivers/input/misc/da7280.c new file +5 -0
+		period2freq = 1000000 / state.period;
+		if (period2freq < DA7280_MIN_PWM_FREQ_KHZ ||
+		    period2freq > DA7280_MAX_PWM_FREQ_KHZ) {
+			dev_err(dev, "Not supported PWM frequency(%d)\n",
+				period2freq);

Doesn't the compiler warn here about period2freq being unsigned and %d being for signed int values?

For my (non-native) English ear s/Not supported/Unsupported/ sounds better. Also my eyes would be pleases by a space before the opening brace.

drivers/input/misc/da7280.c line 1889

Quoted 11 lines
drivers/input/misc/da7280.c new file +11 -0
+			return -EINVAL;
+		}
+	}
+
+
+[...]
+static struct i2c_driver da7280_driver = {
+	.driver	= {
+		.name		= "da7280",
+		.of_match_table	= of_match_ptr(da7280_of_match),
+		.pm		= &da7280_pm_ops,

I don't like alignment of =, but I'm aware this is a subjective thing. (The reason for me is that adding a new member that is longer than the already existing requires touching all lines. So I stick to a single space before a =.)

Quoted 11 lines
drivers/input/misc/da7280.c new file +9 -0
+	},
+	.probe	  = da7280_probe,
+	.id_table = da7280_i2c_id,
+};
+module_i2c_driver(da7280_driver);
+
+MODULE_DESCRIPTION("DA7280 haptics driver");
+MODULE_AUTHOR("Roy Im <[email protected]>");
+MODULE_LICENSE("GPL");
Signature · 1 line
end-of-patch for RESEND PATCH V13

Best regards
Uwe

Signature · 2 lines
Pengutronix e.K.                           | Uwe Kleine-König            |
Industrial Linux Solutions                 | https://www.pengutronix.de/ |
author
#5 lore raw

RE: [RESEND PATCH V13 3/3] Input: new da7280 haptic driver

Hello Uwe,

Quoted 12 lines · Uwe Kleine-König

Hello,

Quoted 5 lines · Roy Im

Adds 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.

Just some picky comments below.

Quoted 8 lines

drivers/input/misc/da7280.c line 404

Quoted 5 lines
drivers/input/misc/da7280.c new file +5 -0
+	error = pwm_apply_state(haptics->pwm_dev, &state);
+	if (error)
+		dev_err(haptics->dev,
+			"failed to apply pwm state: %pE\n",
+			ERR_PTR(error));

You can save some horizontal space here by dropping the \n after the first comma. (There are a few more occurences.)

Ok, is this what you want?

	error = pwm_apply_state(haptics->pwm_dev, &state);
	if (error)
		dev_err(haptics->dev, "failed to apply pwm state: %pE\n",
			ERR_PTR(error));
Quoted 10 lines
Quoted 10 lines
drivers/input/misc/da7280.c new file +10 -0
+	return error;
+}
+[...]
+
+		/* Sync up PWM state and ensure it is off. */
+		pwm_init_state(haptics->pwm_dev, &state);
+		state.enabled = false;
+		error = pwm_apply_state(haptics->pwm_dev, &state);
+		if (error) {
+			dev_err(dev,
Quoted 8 lines

drivers/input/misc/da7280.c line 1744

Quoted 6 lines
drivers/input/misc/da7280.c new file +6 -0
+				"failed to apply initial PWM state: %pE\n",
+				ERR_PTR(error));
+			return error;
+		}
+
+		/* Check PWM Period, it must be in 10k ~ 250kHz */

The unit of a PWM period is in (nano)seconds, to it cannot be in the range [10kHz, 250kHz]. (Is this too picky?)

No, it isn't. The 'Period' should be changed to 'frequency', I will fix this as below.

		/* Check PWM frequency, valid range: 10k ~ 250kHz */
Quoted 11 lines

drivers/input/misc/da7280.c line 1749

Quoted 6 lines
drivers/input/misc/da7280.c new file +5 -0
+		period2freq = 1000000 / state.period;
+		if (period2freq < DA7280_MIN_PWM_FREQ_KHZ ||
+		    period2freq > DA7280_MAX_PWM_FREQ_KHZ) {
+			dev_err(dev, "Not supported PWM frequency(%d)\n",
+				period2freq);

Doesn't the compiler warn here about period2freq being unsigned and %d being for signed int values?

For my (non-native) English ear s/Not supported/Unsupported/ sounds better. Also my eyes would be pleases by a space before the opening brace.

I didn't see any warning message, but I will change/improve them to proper one and the log as below.

		period2freq = 1000000 / state.period;
		if (period2freq < DA7280_MIN_PWM_FREQ_KHZ ||
		    period2freq > DA7280_MAX_PWM_FREQ_KHZ) {
			dev_err(dev, "Unsupported PWM frequency (%u)\n",
				period2freq);
			return -EINVAL;
		}

If you look ok, let me update this so.

Quoted 16 lines

drivers/input/misc/da7280.c line 1889

Quoted 12 lines
drivers/input/misc/da7280.c new file +11 -0
+			return -EINVAL;
+		}
+	}
+
+
+[...]
+static struct i2c_driver da7280_driver = {
+	.driver	= {
+		.name		= "da7280",
+		.of_match_table	= of_match_ptr(da7280_of_match),
+		.pm		= &da7280_pm_ops,

I don't like alignment of =, but I'm aware this is a subjective thing.
(The reason for me is that adding a new member that is longer than the already existing requires touching all lines. So I stick to a single space before a =.)

OK, I will do as you said.

Quoted 19 lines
Quoted 11 lines
drivers/input/misc/da7280.c new file +9 -1
+	},
+	.probe	  = da7280_probe,
+	.id_table = da7280_i2c_id,
+};
+module_i2c_driver(da7280_driver);
+
+MODULE_DESCRIPTION("DA7280 haptics driver"); MODULE_AUTHOR("Roy Im
+<[email protected]>");
+MODULE_LICENSE("GPL");
--
Quoted 1 line

end-of-patch for RESEND PATCH V13

Best regards
Uwe

--
Pengutronix e.K. | Uwe Kleine-König |
Industrial Linux Solutions | https://www.pengutronix.de/ |

#6 lore raw

Re: [RESEND PATCH V13 3/3] Input: new da7280 haptic driver

Quoted 23 lines · Roy Im

Hello Uwe,

Quoted 12 lines · Uwe Kleine-König

Hello,

Quoted 5 lines · Roy Im

Adds 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.

Just some picky comments below.

Quoted 8 lines

drivers/input/misc/da7280.c line 404

Quoted 5 lines
drivers/input/misc/da7280.c new file +5 -0
+	error = pwm_apply_state(haptics->pwm_dev, &state);
+	if (error)
+		dev_err(haptics->dev,
+			"failed to apply pwm state: %pE\n",
+			ERR_PTR(error));

You can save some horizontal space here by dropping the \n after the first comma. (There are a few more occurences.)

Quoted 5 lines

Ok, is this what you want?

	error = pwm_apply_state(haptics->pwm_dev, &state);
	if (error)
		dev_err(haptics->dev, "failed to apply pwm state: %pE\n",
			ERR_PTR(error));

Yes, that's what I meant.

Quoted 19 lines
Quoted 10 lines
Quoted 10 lines
drivers/input/misc/da7280.c new file +10 -0
+	return error;
+}
+[...]
+
+		/* Sync up PWM state and ensure it is off. */
+		pwm_init_state(haptics->pwm_dev, &state);
+		state.enabled = false;
+		error = pwm_apply_state(haptics->pwm_dev, &state);
+		if (error) {
+			dev_err(dev,
Quoted 8 lines

drivers/input/misc/da7280.c line 1744

Quoted 6 lines
drivers/input/misc/da7280.c new file +6 -0
+				"failed to apply initial PWM state: %pE\n",
+				ERR_PTR(error));
+			return error;
+		}
+
+		/* Check PWM Period, it must be in 10k ~ 250kHz */

The unit of a PWM period is in (nano)seconds, to it cannot be in the range [10kHz, 250kHz]. (Is this too picky?)

Quoted 3 lines

No, it isn't. The 'Period' should be changed to 'frequency', I will fix this as below.

		/* Check PWM frequency, valid range: 10k ~ 250kHz */

Much better.

Quoted 14 lines
Quoted 11 lines

drivers/input/misc/da7280.c line 1749

Quoted 6 lines
drivers/input/misc/da7280.c new file +5 -0
+		period2freq = 1000000 / state.period;
+		if (period2freq < DA7280_MIN_PWM_FREQ_KHZ ||
+		    period2freq > DA7280_MAX_PWM_FREQ_KHZ) {
+			dev_err(dev, "Not supported PWM frequency(%d)\n",
+				period2freq);

Doesn't the compiler warn here about period2freq being unsigned and %d being for signed int values?

For my (non-native) English ear s/Not supported/Unsupported/ sounds better. Also my eyes would be pleases by a space before the opening brace.

I didn't see any warning message, but I will change/improve them to proper one and the log as below.

Quoted 8 lines
		period2freq = 1000000 / state.period;
		if (period2freq < DA7280_MIN_PWM_FREQ_KHZ ||
		    period2freq > DA7280_MAX_PWM_FREQ_KHZ) {
			dev_err(dev, "Unsupported PWM frequency (%u)\n",
				period2freq);
			return -EINVAL;
		}

If you look ok, let me update this so.

looks fine.

Note that you don't need the division if you check for:

	if (state.period > 100000 || state.period < 4000) {
		...

(maybe the compiler is already clever enough to get rid of the division for you, but then the check is:

	if (state.period > 100000 || state.period < 3985) {

because of rounding errors.)

Best regards
Uwe

Signature · 2 lines
Pengutronix e.K.                           | Uwe Kleine-König            |
Industrial Linux Solutions                 | https://www.pengutronix.de/ |
author
#7 lore raw

RE: [RESEND PATCH V13 3/3] Input: new da7280 haptic driver

Quoted 40 lines · Uwe Kleine-König
Quoted 26 lines · Roy Im

Hello Uwe,

Quoted 18 lines · Uwe Kleine-König

Hello,

drivers/input/misc/da7280.c line 1749

Quoted 11 lines · Roy Im

Adds 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.

drivers/input/misc/da7280.c new file +5 -0
+		period2freq = 1000000 / state.period;
+		if (period2freq < DA7280_MIN_PWM_FREQ_KHZ ||
+		    period2freq > DA7280_MAX_PWM_FREQ_KHZ) {
+			dev_err(dev, "Not supported PWM frequency(%d)\n",
+				period2freq);

Doesn't the compiler warn here about period2freq being unsigned and %d being for signed int values?

Quoted 2 lines

For my (non-native) English ear s/Not supported/Unsupported/ sounds better. Also my eyes would be pleases by a space before the opening brace.

I didn't see any warning message, but I will change/improve them to proper one and the log as below.

Quoted 8 lines
		period2freq = 1000000 / state.period;
		if (period2freq < DA7280_MIN_PWM_FREQ_KHZ ||
		    period2freq > DA7280_MAX_PWM_FREQ_KHZ) {
			dev_err(dev, "Unsupported PWM frequency (%u)\n",
				period2freq);
			return -EINVAL;
		}

If you look ok, let me update this so.

looks fine.

Note that you don't need the division if you check for:

Quoted 8 lines
	if (state.period > 100000 || state.period < 4000) {
		...

(maybe the compiler is already clever enough to get rid of the division for you, but then the check is:

	if (state.period > 100000 || state.period < 3985) {

because of rounding errors.)

OK, you are right, that will be better. So let me change that as below if you look fine.

	/* Check PWM period, PWM freq = 1000000 / state.period.
	 * The valid PWM freq range: 10k ~ 250kHz.
	 */
	if (state.period > 100000 || state.period < 3985) {
		dev_err(dev, "Unsupported PWM period (%u)\n",
			state.period);
		return -EINVAL;
	}
Quoted 7 lines

Best regards
Uwe

--
Pengutronix e.K. | Uwe Kleine-König |
Industrial Linux Solutions | https://www.pengutronix.de/ |

#8 lore raw

Re: [RESEND PATCH V13 3/3] Input: new da7280 haptic driver

Hello,

Quoted 18 lines · Roy Im
Quoted 17 lines · Uwe Kleine-König
Quoted 8 lines · Roy Im
		period2freq = 1000000 / state.period;
		if (period2freq < DA7280_MIN_PWM_FREQ_KHZ ||
		    period2freq > DA7280_MAX_PWM_FREQ_KHZ) {
			dev_err(dev, "Unsupported PWM frequency (%u)\n",
				period2freq);
			return -EINVAL;
		}

If you look ok, let me update this so.

looks fine.

Note that you don't need the division if you check for:

	if (state.period > 100000 || state.period < 4000) {
		...
Quoted 8 lines
Quoted 5 lines

(maybe the compiler is already clever enough to get rid of the division for you, but then the check is:

	if (state.period > 100000 || state.period < 3985) {

because of rounding errors.)

OK, you are right, that will be better. So let me change that as below if you look fine.

I look fine, the code however is wrong. :-)

Quoted 4 lines
	/* Check PWM period, PWM freq = 1000000 / state.period.
	 * The valid PWM freq range: 10k ~ 250kHz.
	 */
	if (state.period > 100000 || state.period < 3985) {

You want 4000 here ---------------------------------^^^^, don't you?

Quoted 4 lines
		dev_err(dev, "Unsupported PWM period (%u)\n",
			state.period);
		return -EINVAL;
	}

Best regards
Uwe

Signature · 2 lines
Pengutronix e.K.                           | Uwe Kleine-König            |
Industrial Linux Solutions                 | https://www.pengutronix.de/ |
author
#9 lore raw

RE: [RESEND PATCH V13 3/3] Input: new da7280 haptic driver

On Thu, June 25, 2020 1:28 AM, Uwe Kleine-König

Quoted 28 lines · Roy Im
Quoted 18 lines · Uwe Kleine-König
Quoted 17 lines · Roy Im
Quoted 8 lines
		period2freq = 1000000 / state.period;
		if (period2freq < DA7280_MIN_PWM_FREQ_KHZ ||
		    period2freq > DA7280_MAX_PWM_FREQ_KHZ) {
			dev_err(dev, "Unsupported PWM frequency (%u)\n",
				period2freq);
			return -EINVAL;
		}

If you look ok, let me update this so.

looks fine.

Note that you don't need the division if you check for:

	if (state.period > 100000 || state.period < 4000) {
		...
Quoted 8 lines
Quoted 5 lines

(maybe the compiler is already clever enough to get rid of the division for you, but then the check is:

	if (state.period > 100000 || state.period < 3985) {

because of rounding errors.)

OK, you are right, that will be better. So let me change that as below if you look fine.

Quoted 8 lines

I look fine, the code however is wrong. :-)

Quoted 4 lines
	/* Check PWM period, PWM freq = 1000000 / state.period.
	 * The valid PWM freq range: 10k ~ 250kHz.
	 */
	if (state.period > 100000 || state.period < 3985) {

You want 4000 here ---------------------------------^^^^, don't you?

Yes, it is now based on period, not frequency. You are right. 4000 is correct now. Thanks.

Quoted 12 lines
Quoted 5 lines
		dev_err(dev, "Unsupported PWM period (%u)\n",
			state.period);
		return -EINVAL;
	}

Best regards
Uwe

--
Pengutronix e.K. | Uwe Kleine-König |
Industrial Linux Solutions | https://www.pengutronix.de/ |