Re: [PATCH v3] Input: usbtouchscreen - add sysfs attribute for 3M MTouch firmware rev

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, May 10, 2018 at 08:30:22PM +0100, Nick Dyer wrote:
> Allow querying of the firmware revision of the device
> 
> example:
> 
> 4.10
> 
> Tested on ZII RDU2 platform and on Intel x86_64 PC.
> 
> [v3: remove fw rev output, move sysfs init to alloc, free priv properly]
> [v2: output fw rev on probe]
> 
> Signed-off-by: Nick Dyer <nick@xxxxxxxxxxxxx>
> Tested-By: Nikita Yushchenko <nikita.yoush@xxxxxxxxxxxxxxxxxx>
> ---
>  drivers/input/touchscreen/usbtouchscreen.c | 91 ++++++++++++++++++++++
>  1 file changed, 91 insertions(+)
> 
> diff --git a/drivers/input/touchscreen/usbtouchscreen.c b/drivers/input/touchscreen/usbtouchscreen.c
> index c6cf90868503..e2ccf39c3462 100644
> --- a/drivers/input/touchscreen/usbtouchscreen.c
> +++ b/drivers/input/touchscreen/usbtouchscreen.c
> @@ -440,6 +440,8 @@ static int panjit_read_data(struct usbtouch_usb *dev, unsigned char *pkt)
>  #define MTOUCHUSB_RESET                 7
>  #define MTOUCHUSB_REQ_CTRLLR_ID         10
>  
> +#define MTOUCHUSB_REQ_CTRLLR_ID_LEN	16
> +
>  static int mtouch_read_data(struct usbtouch_usb *dev, unsigned char *pkt)
>  {
>  	if (hwcalib_xy) {
> @@ -454,11 +456,90 @@ static int mtouch_read_data(struct usbtouch_usb *dev, unsigned char *pkt)
>  	return 1;
>  }
>  
> +struct mtouch_priv {
> +	u8 fw_rev_major;
> +	u8 fw_rev_minor;
> +};
> +
> +static ssize_t mtouch_firmware_rev_show(struct device *dev,
> +				struct device_attribute *attr, char *output)
> +{
> +	struct usb_interface *intf = to_usb_interface(dev);
> +	struct usbtouch_usb *usbtouch = usb_get_intfdata(intf);
> +	struct mtouch_priv *priv = usbtouch->priv;
> +
> +	return scnprintf(output, PAGE_SIZE, "%1x.%1x\n",
> +			 priv->fw_rev_major, priv->fw_rev_minor);
> +}
> +static DEVICE_ATTR(firmware_rev, 0444, mtouch_firmware_rev_show, NULL);
> +
> +static struct attribute *mtouch_attrs[] = {
> +	&dev_attr_firmware_rev.attr,
> +	NULL
> +};
> +
> +static const struct attribute_group mtouch_attr_group = {
> +	.attrs = mtouch_attrs,
> +};
> +
> +static int mtouch_get_fw_revision(struct usbtouch_usb *usbtouch)
> +{
> +	int ret;
> +	struct usb_device *udev = interface_to_usbdev(usbtouch->interface);
> +	struct mtouch_priv *priv = usbtouch->priv;
> +	u8 *buf;
> +
> +	buf = kzalloc(MTOUCHUSB_REQ_CTRLLR_ID_LEN, GFP_NOIO);
> +	if (!buf)
> +		return -ENOMEM;
> +
> +	ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
> +			      MTOUCHUSB_REQ_CTRLLR_ID,
> +			      USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
> +			      0, 0, buf, MTOUCHUSB_REQ_CTRLLR_ID_LEN,
> +			      USB_CTRL_SET_TIMEOUT);
> +	if (ret != MTOUCHUSB_REQ_CTRLLR_ID_LEN) {
> +		dev_warn(&usbtouch->interface->dev,
> +			 "Failed to read FW rev: %d\n", ret);
> +		ret = (ret < 0) ? ret : -EIO;
> +		goto free;
> +	}
> +
> +	priv->fw_rev_major = buf[3];
> +	priv->fw_rev_minor = buf[4];
> +
> +	ret = 0;
> +
> +free:
> +	kfree(buf);
> +	return ret;
> +}
> +
> +static int mtouch_alloc(struct usbtouch_usb *usbtouch)
> +{
> +	int ret;
> +
> +	usbtouch->priv = kmalloc(sizeof(struct mtouch_priv), GFP_KERNEL);
> +	if (!usbtouch->priv)
> +		return -ENOMEM;
> +
> +	ret = sysfs_create_group(&usbtouch->interface->dev.kobj,
> +				 &mtouch_attr_group);
> +	if (ret)
> +		return ret;

You leak memory here. I fixed it up and applied.

Thanks!

-- 
Dmitry
--
To unsubscribe from this list: send the line "unsubscribe linux-input" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux Media Devel]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Linux Wireless Networking]     [Linux Omap]

  Powered by Linux