Thread (9 messages) flat view 9 messages, 2 authors, 2020-03-02

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

From: Roy Im <hidden>
Date: 2020-02-29 00:59:31
Also in: linux-pwm, lkml

On Thursday, Feb 27, 2020 at 1:13 AM, Uwe Kleine-König wrote: 
On Fri, Feb 21, 2020 at 04:27:05PM +0900, Roy Im wrote:
quoted
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.

Signed-off-by: Roy Im <redacted>

---
v9:
	- Removed the header file and put the definitions into the c file.
	- Updated the pwm code and error logs with %pE
+
+struct da7280_haptic {
+	struct regmap *regmap;
+	struct input_dev *input_dev;
+	struct device *dev;
+	struct i2c_client *client;
+	struct pwm_device *pwm_dev;
+
+	bool legacy;
+	int pwm_id;
pwm_id is unused?
Okay, I will remove this.

[...]
quoted
+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;
+	period_mag_multi = enabled ? state.period * haptics->gain : 0;
if .enabled is false .duty_cycle has no effect on the output. So there is no good reason for setting the duty_cyle to
something different for a disabled PWM.
Okay, I will add a condition for this.
quoted
+	state.duty_cycle  = (haptics->acc_en) ?
+		(unsigned int)(period_mag_multi >> 15) :
+		(unsigned int)((period_mag_multi >> 15)
+			+ state.period) / 2;
This can be written in a more readable way:

	/* would be great to have a symbolic name for 15 */
	period_mag_multi >>= 15;

	/* comment with a rational here */
	if (!haptics->acc_en) {
		period_mag_multi += state.period;
		period_mag_multi /= 2;
	}

	state.duty_cycle = period_mag_multi;
Okay, thanks. I have tried to update that as below.
Could I get your comment if you still see anything on this?

	/* Maximum gain is 0x7fff for PWM mode */
	#define MAX_MAGNITUDE_SHIFT		15
       [...]
	period_mag_multi >>= MAX_MAGNITUDE_SHIFT;

	/* The interpretation of duty cycle depends on the acc_en,
	* it should be from 50% to 100% for acc_en = 0.
	* See datasheet 'PWM mode' section for more details.
	*/
	if (!haptics->acc_en) {
		period_mag_multi += state.period;
		period_mag_multi /= 2;
	}
quoted
[...]
+		pwm_init_state(haptics->pwm_dev, &state);
+		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 */
+		period2freq = 1000000 / pwm_get_period(haptics->pwm_dev);
You already know the return value of pwm_get_period(), it's state.period.
Right, I will replace that to state.period.
quoted
+		if (period2freq < DA7280_MIN_PWM_FREQ_KHZ ||
+		    period2freq > DA7280_MAX_PWM_FREQ_KHZ) {
[...]
Best regards
Uwe

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

Thanks a lot for your comments.

Best regards,
Roy
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help