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 | ||
---|---|---|
189 | 189 | } |
190 | 190 | } |
191 | 191 | |
192 | static void atusb_read1(struct atusb_local *atusb, const uint8_t *tx, uint8_t *rx, int len) | |
192 | static 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) | |
193 | 195 | { |
194 | int retval; | |
196 | struct usb_device *dev = atusb->udev; | |
195 | 197 | struct usb_ctrlrequest *req; |
198 | int retval = -ENOMEM; | |
196 | 199 | |
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 */ | |
203 | 200 | 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); | |
218 | 218 | |
219 | 219 | 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); | |
227 | out_nourb: | |
228 | kfree(req); | |
229 | ||
230 | return retval; | |
231 | } | |
232 | ||
233 | ||
234 | static 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); | |
226 | 241 | } |
227 | 242 | |
228 | 243 | static void atusb_read2(struct atusb_local *atusb, uint8_t *buf, int len) |
... | ... | |
230 | 245 | /* ->host ATUSB_SPI_READ2 byte0 byte1 #bytes */ |
231 | 246 | } |
232 | 247 | |
233 | static void atusb_write(struct atusb_local *atusb, const uint8_t *tx, uint8_t *rx, int len) | |
248 | static void atusb_write(struct atusb_local *atusb, | |
249 | const uint8_t *tx, uint8_t *rx, int len) | |
234 | 250 | { |
235 | int retval; | |
236 | struct usb_ctrlrequest *req; | |
237 | ||
238 | 251 | dev_info(&atusb->udev->dev, "atusb_write: tx[0] = 0x%x\n", tx[0]); |
239 | 252 | 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); | |
268 | 256 | } |
269 | 257 | |
270 | 258 | static int atusb_transfer(struct spi_device *spi, struct spi_message *msg) |
Branches:
ben-wpan
ben-wpan-stefan
5396a9238205f20f811ea57898980d3ca82df0b6
jz-2.6.34
jz-2.6.34-rc5
jz-2.6.34-rc6
jz-2.6.34-rc7
jz-2.6.35
jz-2.6.36
jz-2.6.37
jz-2.6.38
jz-2.6.39
jz-3.0
jz-3.1
jz-3.11
jz-3.12
jz-3.13
jz-3.15
jz-3.16
jz-3.18-dt
jz-3.2
jz-3.3
jz-3.4
jz-3.5
jz-3.6
jz-3.6-rc2-pwm
jz-3.9
jz-3.9-clk
jz-3.9-rc8
jz47xx
jz47xx-2.6.38
master
Tags:
od-2011-09-04
od-2011-09-18
v2.6.34-rc5
v2.6.34-rc6
v2.6.34-rc7
v3.9