Message ID | 20240111220333.66060-1-macroalpha82@gmail.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | [V2] Input: adc-joystick: Handle inverted axes | expand |
Hi Chris, some comments inline. On 2024-01-11 23:03, Chris Morgan wrote: > From: Chris Morgan <macromorgan@hotmail.com> > > When one or more axes are inverted, (where min > max), normalize the > data so that min < max and invert the values reported to the input > stack. > > This ensures we can continue defining the device correctly in the > device tree while not breaking downstream assumptions that min is > always less than max. > > Changes since V1: > - Moved proposed helper for inversion from input stack to adc-joystick > driver. The changes summary should go after the "---" separator, otherwise it ends up in the commit description. > > Signed-off-by: Chris Morgan <macromorgan@hotmail.com> > --- > drivers/input/joystick/adc-joystick.c | 21 ++++++++++++++++++++- > 1 file changed, 20 insertions(+), 1 deletion(-) > > diff --git a/drivers/input/joystick/adc-joystick.c > b/drivers/input/joystick/adc-joystick.c > index c0deff5d4282..46197ebd3564 100644 > --- a/drivers/input/joystick/adc-joystick.c > +++ b/drivers/input/joystick/adc-joystick.c > @@ -18,6 +18,7 @@ struct adc_joystick_axis { > s32 range[2]; > s32 fuzz; > s32 flat; > + bool inverted; > }; > > struct adc_joystick { > @@ -29,6 +30,14 @@ struct adc_joystick { > bool polled; > }; > > +static int adc_joystick_invert(struct input_dev *dev, unsigned int > axis, int val) As the parameter list exceeds 80 characters, can you move "int val" into a second line? > +{ > + int min = dev->absinfo[axis].minimum; > + int max = dev->absinfo[axis].maximum; > + > + return (max + min) - val; > +} > + > static void adc_joystick_poll(struct input_dev *input) > { > struct adc_joystick *joy = input_get_drvdata(input); > @@ -38,6 +47,8 @@ static void adc_joystick_poll(struct input_dev > *input) > ret = iio_read_channel_raw(&joy->chans[i], &val); > if (ret < 0) > return; > + if (joy->axes[i].inverted) > + val = adc_joystick_invert(input, i, val); > input_report_abs(input, joy->axes[i].code, val); > } > input_sync(input); > @@ -86,6 +97,8 @@ static int adc_joystick_handle(const void *data, > void *private) > val = sign_extend32(val, msb); > else > val &= GENMASK(msb, 0); > + if (joy->axes[i].inverted) > + val = adc_joystick_invert(joy->input, i, val); > input_report_abs(joy->input, joy->axes[i].code, val); > } > > @@ -168,11 +181,17 @@ static int adc_joystick_set_axes(struct device > *dev, struct adc_joystick *joy) > goto err_fwnode_put; > } > > + if (axes[i].range[0] > axes[i].range[1]) { > + dev_dbg(dev, "abs-axis %d inverted\n", i); There is no "abs-axis" property. Make it "Axis %d inverted\n" instead. > + axes[i].inverted = 1; Turn this into an explicit "true", as its a bool. With all above nits fixed: Acked-by: Artur Rojek <contact@artur-rojek.eu> Cheers, Artur > + } > + > fwnode_property_read_u32(child, "abs-fuzz", &axes[i].fuzz); > fwnode_property_read_u32(child, "abs-flat", &axes[i].flat); > > input_set_abs_params(joy->input, axes[i].code, > - axes[i].range[0], axes[i].range[1], > + min_array(axes[i].range, 2), > + max_array(axes[i].range, 2), > axes[i].fuzz, axes[i].flat); > input_set_capability(joy->input, EV_ABS, axes[i].code); > }
diff --git a/drivers/input/joystick/adc-joystick.c b/drivers/input/joystick/adc-joystick.c index c0deff5d4282..46197ebd3564 100644 --- a/drivers/input/joystick/adc-joystick.c +++ b/drivers/input/joystick/adc-joystick.c @@ -18,6 +18,7 @@ struct adc_joystick_axis { s32 range[2]; s32 fuzz; s32 flat; + bool inverted; }; struct adc_joystick { @@ -29,6 +30,14 @@ struct adc_joystick { bool polled; }; +static int adc_joystick_invert(struct input_dev *dev, unsigned int axis, int val) +{ + int min = dev->absinfo[axis].minimum; + int max = dev->absinfo[axis].maximum; + + return (max + min) - val; +} + static void adc_joystick_poll(struct input_dev *input) { struct adc_joystick *joy = input_get_drvdata(input); @@ -38,6 +47,8 @@ static void adc_joystick_poll(struct input_dev *input) ret = iio_read_channel_raw(&joy->chans[i], &val); if (ret < 0) return; + if (joy->axes[i].inverted) + val = adc_joystick_invert(input, i, val); input_report_abs(input, joy->axes[i].code, val); } input_sync(input); @@ -86,6 +97,8 @@ static int adc_joystick_handle(const void *data, void *private) val = sign_extend32(val, msb); else val &= GENMASK(msb, 0); + if (joy->axes[i].inverted) + val = adc_joystick_invert(joy->input, i, val); input_report_abs(joy->input, joy->axes[i].code, val); } @@ -168,11 +181,17 @@ static int adc_joystick_set_axes(struct device *dev, struct adc_joystick *joy) goto err_fwnode_put; } + if (axes[i].range[0] > axes[i].range[1]) { + dev_dbg(dev, "abs-axis %d inverted\n", i); + axes[i].inverted = 1; + } + fwnode_property_read_u32(child, "abs-fuzz", &axes[i].fuzz); fwnode_property_read_u32(child, "abs-flat", &axes[i].flat); input_set_abs_params(joy->input, axes[i].code, - axes[i].range[0], axes[i].range[1], + min_array(axes[i].range, 2), + max_array(axes[i].range, 2), axes[i].fuzz, axes[i].flat); input_set_capability(joy->input, EV_ABS, axes[i].code); }