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