Message ID | 20240115192752.266367-1-macroalpha82@gmail.com |
---|---|
State | New |
Headers | show |
Series | [v3] Input: adc-joystick: Handle inverted axes | expand |
Hi Chris, On Mon, Jan 15, 2024 at 01:27:52PM -0600, Chris Morgan wrote: > > +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; I changed this to input_abs_get_[min|max](dev, axis) to avoid peeking into absinfo and applied. Thanks.
On Fri, Jan 19, 2024 at 12:29:54AM -0800, Dmitry Torokhov wrote: > Hi Chris, > > On Mon, Jan 15, 2024 at 01:27:52PM -0600, Chris Morgan wrote: > > > > +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; > > I changed this to input_abs_get_[min|max](dev, axis) to avoid peeking > into absinfo and applied. Apparently min_array() and max_array() are a bit too new. Also I am not sure if they are actually needed. Can we do it like this: diff --git a/drivers/input/joystick/adc-joystick.c b/drivers/input/joystick/adc-joystick.c index 10ee13465cfe..916e78e4dc9f 100644 --- a/drivers/input/joystick/adc-joystick.c +++ b/drivers/input/joystick/adc-joystick.c @@ -185,14 +185,14 @@ static int adc_joystick_set_axes(struct device *dev, struct adc_joystick *joy) if (axes[i].range[0] > axes[i].range[1]) { dev_dbg(dev, "abs-axis %d inverted\n", i); axes[i].inverted = true; + swap(axes[i].range[0], axes[i].range[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, - min_array(axes[i].range, 2), - max_array(axes[i].range, 2), + axes[i].range[0], axes[i].range[1], axes[i].fuzz, axes[i].flat); input_set_capability(joy->input, EV_ABS, axes[i].code); } Thanks.
On Sat, Jan 20, 2024 at 01:10:18AM -0800, Dmitry Torokhov wrote: > On Fri, Jan 19, 2024 at 12:29:54AM -0800, Dmitry Torokhov wrote: > > Hi Chris, > > > > On Mon, Jan 15, 2024 at 01:27:52PM -0600, Chris Morgan wrote: > > > > > > +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; > > > > I changed this to input_abs_get_[min|max](dev, axis) to avoid peeking > > into absinfo and applied. > > Apparently min_array() and max_array() are a bit too new. Also I am not > sure if they are actually needed. Can we do it like this: > > diff --git a/drivers/input/joystick/adc-joystick.c b/drivers/input/joystick/adc-joystick.c > index 10ee13465cfe..916e78e4dc9f 100644 > --- a/drivers/input/joystick/adc-joystick.c > +++ b/drivers/input/joystick/adc-joystick.c > @@ -185,14 +185,14 @@ static int adc_joystick_set_axes(struct device *dev, struct adc_joystick *joy) > if (axes[i].range[0] > axes[i].range[1]) { > dev_dbg(dev, "abs-axis %d inverted\n", i); > axes[i].inverted = true; > + swap(axes[i].range[0], axes[i].range[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, > - min_array(axes[i].range, 2), > - max_array(axes[i].range, 2), > + axes[i].range[0], axes[i].range[1], > axes[i].fuzz, axes[i].flat); > input_set_capability(joy->input, EV_ABS, axes[i].code); > } OK, I went ahead and folded this into the original patch and applied. Thanks.
diff --git a/drivers/input/joystick/adc-joystick.c b/drivers/input/joystick/adc-joystick.c index c0deff5d4282..6b155e614b5a 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,15 @@ 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 +48,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 +98,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 +182,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 = true; + } + 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); }