Date:2011-07-06 07:09:38 (12 years 8 months ago)
Author:Werner Almesberger
Commit:e803b814f3329e64068253c83c72c4948232999e
Message:atusb: merged USB control message submission into common function

atusb_read1 and atusb_write had extensive code for submitting their
control message. Since it's almost identical, moved it to a common
function called submit_control_msg.

Signed-off-by: Werner Almesberger <werner@almesberger.net>
Files: drivers/spi/atusb.c (2 diffs)

Change Details

drivers/spi/atusb.c
189189    }
190190}
191191
192static void atusb_read1(struct atusb_local *atusb, const uint8_t *tx, uint8_t *rx, int len)
192static int submit_control_msg(struct atusb_local *atusb,
193    __u8 request, __u8 requesttype, __u16 value, __u16 index,
194    void *data, __u16 size, usb_complete_t complete_fn, void *context)
193195{
194    int retval;
196    struct usb_device *dev = atusb->udev;
195197    struct usb_ctrlrequest *req;
198    int retval = -ENOMEM;
196199
197    dev_info(&atusb->udev->dev, "atusb_read1: tx = 0x%x\n", tx[0]);
198    atusb->ctrl_urb = usb_alloc_urb(0, GFP_KERNEL);
199    if (!atusb->ctrl_urb) {
200        retval = -ENOMEM;
201    }
202    /* ->host ATUSB_SPI_READ1 byte0 - #bytes */
203200    req = kmalloc(sizeof(struct usb_ctrlrequest), GFP_KERNEL);
204    req->bRequest = ATUSB_SPI_READ1;
205    req->bRequestType = ATUSB_FROM_DEV;
206    req->wValue = cpu_to_le16(tx[0]);
207    req->wIndex = cpu_to_le16(0x00);
208    req->wLength = cpu_to_le16(0x01);
209
210    usb_fill_control_urb(atusb->ctrl_urb,
211            atusb->udev,
212            usb_rcvbulkpipe(atusb->udev, 0),
213            (unsigned char *)req,
214            rx+1,
215            0x01,
216            atusb_read1_cb,
217            atusb);
201    if (!req)
202        return -ENOMEM;
203
204    req->bRequest = request;
205    req->bRequestType = requesttype;
206    req->wValue = cpu_to_le16(value);
207    req->wIndex = cpu_to_le16(index);
208    req->wLength = cpu_to_le16(size);
209
210    atusb->ctrl_urb = usb_alloc_urb(0, GFP_KERNEL);
211    if (!atusb->ctrl_urb)
212        goto out_nourb;
213
214    usb_fill_control_urb(atusb->ctrl_urb, dev,
215        requesttype == ATUSB_FROM_DEV ?
216          usb_rcvctrlpipe(dev, 0) : usb_sndctrlpipe(dev, 0),
217        (unsigned char *) req, data, size, complete_fn, context);
218218
219219    retval = usb_submit_urb(atusb->ctrl_urb, GFP_KERNEL);
220    if (retval < 0) {
221        dev_info(&atusb->udev->dev, "failed submitting read urb, error %d",
222            retval);
223        retval = (retval == -ENOMEM) ? retval : -EIO;
224        kfree(req);
225    }
220    if (!retval)
221        return 0;
222    dev_info(&dev->dev, "failed submitting read urb, error %d",
223        retval);
224    retval = retval == -ENOMEM ? retval : -EIO;
225
226    usb_free_urb(atusb->ctrl_urb);
227out_nourb:
228    kfree(req);
229
230    return retval;
231}
232
233
234static void atusb_read1(struct atusb_local *atusb,
235    const uint8_t *tx, uint8_t *rx, int len)
236{
237    dev_info(&atusb->udev->dev, "atusb_read1: tx = 0x%x\n", tx[0]);
238    submit_control_msg(atusb,
239        ATUSB_SPI_READ1, ATUSB_FROM_DEV, tx[0], 0,
240        rx+1, 1, atusb_read1_cb, atusb);
226241}
227242
228243static void atusb_read2(struct atusb_local *atusb, uint8_t *buf, int len)
...... 
230245    /* ->host ATUSB_SPI_READ2 byte0 byte1 #bytes */
231246}
232247
233static void atusb_write(struct atusb_local *atusb, const uint8_t *tx, uint8_t *rx, int len)
248static void atusb_write(struct atusb_local *atusb,
249    const uint8_t *tx, uint8_t *rx, int len)
234250{
235    int retval;
236    struct usb_ctrlrequest *req;
237
238251    dev_info(&atusb->udev->dev, "atusb_write: tx[0] = 0x%x\n", tx[0]);
239252    dev_info(&atusb->udev->dev, "atusb_write: tx[1] = 0x%x\n", tx[1]);
240    atusb->ctrl_urb = usb_alloc_urb(0, GFP_KERNEL);
241    if (!atusb->ctrl_urb) {
242        retval = -ENOMEM;
243    }
244    /* host-> ATUSB_SPI_WRITE byte0 byte1 #bytes */
245    req = kmalloc(sizeof(struct usb_ctrlrequest), GFP_KERNEL);
246    req->bRequest = ATUSB_SPI_WRITE;
247    req->bRequestType = ATUSB_TO_DEV;
248    req->wValue = cpu_to_le16(tx[0]);
249    req->wIndex = cpu_to_le16(tx[1]);
250    req->wLength = cpu_to_le16(0x0);
251
252    usb_fill_control_urb(atusb->ctrl_urb,
253            atusb->udev,
254            usb_rcvbulkpipe(atusb->udev, 0),
255            (unsigned char *)req,
256            0,
257            0,
258            atusb_read1_cb,
259            atusb);
260
261    retval = usb_submit_urb(atusb->ctrl_urb, GFP_KERNEL);
262    if (retval < 0) {
263        dev_info(&atusb->udev->dev, "failed submitting read urb, error %d",
264            retval);
265        retval = (retval == -ENOMEM) ? retval : -EIO;
266        kfree(req);
267    }
253    submit_control_msg(atusb,
254        ATUSB_SPI_WRITE, ATUSB_TO_DEV, tx[0], tx[1],
255        NULL, 0, atusb_read1_cb, atusb);
268256}
269257
270258static int atusb_transfer(struct spi_device *spi, struct spi_message *msg)

Archive Download the corresponding diff file



interactive