Le 10/12/2024 à 11:45, Ming Yu a écrit :
The Nuvoton NCT6694 is a peripheral expander with 16 GPIO chips, 6 I2C controllers, 2 CANfd controllers, 2 Watchdog timers, ADC, PWM, and RTC. This driver implements USB device functionality and shares the chip's peripherals as a child device. Each child device can use the USB functions nct6694_read_msg() and nct6694_write_msg() to issue a command. They can also request interrupt that will be called when the USB device receives its interrupt pipe.
...
+int nct6694_read_msg(struct nct6694 *nct6694, u8 mod, u16 offset, + u16 length, void *buf) +{ + struct nct6694_cmd_header *cmd_header = nct6694->cmd_header; + struct nct6694_response_header *response_header = nct6694->response_header; + struct usb_device *udev = nct6694->udev; + int tx_len, rx_len, ret; + + guard(mutex)(&nct6694->access_lock);
Nitpick: This could be moved a few lines below, should it still comply with your coding style.
+ + /* Send command packet to USB device */ + cmd_header->mod = mod; + cmd_header->cmd = offset & 0xFF; + cmd_header->sel = (offset >> 8) & 0xFF; + cmd_header->hctrl = NCT6694_HCTRL_GET; + cmd_header->len = length; + + ret = usb_bulk_msg(udev, usb_sndbulkpipe(udev, NCT6694_BULK_OUT_EP), + cmd_header, NCT6694_CMD_PACKET_SZ, &tx_len, + nct6694->timeout); + if (ret) + return ret; + + /* Receive response packet from USB device */ + ret = usb_bulk_msg(udev, usb_rcvbulkpipe(udev, NCT6694_BULK_IN_EP), + response_header, NCT6694_CMD_PACKET_SZ, &rx_len, + nct6694->timeout); + if (ret) + return ret; + + ret = usb_bulk_msg(udev, usb_rcvbulkpipe(udev, NCT6694_BULK_IN_EP), + buf, NCT6694_MAX_PACKET_SZ, &rx_len, nct6694->timeout); + if (ret) + return ret; + + return nct6694_response_err_handling(nct6694, response_header->sts); +} +EXPORT_SYMBOL(nct6694_read_msg); + +int nct6694_write_msg(struct nct6694 *nct6694, u8 mod, u16 offset, + u16 length, void *buf) +{ + struct nct6694_cmd_header *cmd_header = nct6694->cmd_header; + struct nct6694_response_header *response_header = nct6694->response_header; + struct usb_device *udev = nct6694->udev; + int tx_len, rx_len, ret; + + guard(mutex)(&nct6694->access_lock);
Nitpick: This could be moved a few lines below, should it still comply with your coding style.
+ + /* Send command packet to USB device */
Nitpick: double space before */
+ cmd_header->mod = mod; + cmd_header->cmd = offset & 0xFF; + cmd_header->sel = (offset >> 8) & 0xFF; + cmd_header->hctrl = NCT6694_HCTRL_SET; + cmd_header->len = length;
...
+static struct irq_chip nct6694_irq_chip = {
const?
+ .name = "nct6694-irq", + .flags = IRQCHIP_SKIP_SET_WAKE, + .irq_bus_lock = nct6694_irq_lock, + .irq_bus_sync_unlock = nct6694_irq_sync_unlock, + .irq_enable = nct6694_irq_enable, + .irq_disable = nct6694_irq_disable, +};
...
+static int nct6694_usb_probe(struct usb_interface *iface, + const struct usb_device_id *id) +{ + struct usb_device *udev = interface_to_usbdev(iface); + struct device *dev = &udev->dev; + struct usb_host_interface *interface; + struct usb_endpoint_descriptor *int_endpoint; + struct nct6694 *nct6694; + struct nct6694_cmd_header *cmd_header; + struct nct6694_response_header *response_header; + int pipe, maxp; + int ret; + + interface = iface->cur_altsetting; + + int_endpoint = &interface->endpoint[0].desc; + if (!usb_endpoint_is_int_in(int_endpoint)) + return -ENODEV; + + nct6694 = devm_kzalloc(dev, sizeof(*nct6694), GFP_KERNEL); + if (!nct6694) + return -ENOMEM; + + pipe = usb_rcvintpipe(udev, NCT6694_INT_IN_EP); + maxp = usb_maxpacket(udev, pipe); + + cmd_header = devm_kzalloc(dev, sizeof(*cmd_header), + GFP_KERNEL); + if (!cmd_header) + return -ENOMEM; + + response_header = devm_kzalloc(dev, sizeof(*response_header), + GFP_KERNEL); + if (!response_header) + return -ENOMEM; + + nct6694->int_buffer = devm_kcalloc(dev, NCT6694_MAX_PACKET_SZ, + sizeof(unsigned char), GFP_KERNEL);
Why for cmd_header and response_header we use a temp variable, while here we update directly nct6694->int_buffer?
It would save a few LoC do remove this temp var.
+ if (!nct6694->int_buffer) + return -ENOMEM; + + nct6694->int_in_urb = usb_alloc_urb(0, GFP_KERNEL); + if (!nct6694->int_in_urb) + return -ENOMEM;
... CJ