diff options
Diffstat (limited to 'drivers/mfd/rtsx_usb.c')
-rw-r--r-- | drivers/mfd/rtsx_usb.c | 30 |
1 files changed, 24 insertions, 6 deletions
diff --git a/drivers/mfd/rtsx_usb.c b/drivers/mfd/rtsx_usb.c index ede50244f265..dbd907d7170e 100644 --- a/drivers/mfd/rtsx_usb.c +++ b/drivers/mfd/rtsx_usb.c | |||
@@ -196,18 +196,27 @@ EXPORT_SYMBOL_GPL(rtsx_usb_ep0_write_register); | |||
196 | int rtsx_usb_ep0_read_register(struct rtsx_ucr *ucr, u16 addr, u8 *data) | 196 | int rtsx_usb_ep0_read_register(struct rtsx_ucr *ucr, u16 addr, u8 *data) |
197 | { | 197 | { |
198 | u16 value; | 198 | u16 value; |
199 | u8 *buf; | ||
200 | int ret; | ||
199 | 201 | ||
200 | if (!data) | 202 | if (!data) |
201 | return -EINVAL; | 203 | return -EINVAL; |
202 | *data = 0; | 204 | |
205 | buf = kzalloc(sizeof(u8), GFP_KERNEL); | ||
206 | if (!buf) | ||
207 | return -ENOMEM; | ||
203 | 208 | ||
204 | addr |= EP0_READ_REG_CMD << EP0_OP_SHIFT; | 209 | addr |= EP0_READ_REG_CMD << EP0_OP_SHIFT; |
205 | value = swab16(addr); | 210 | value = swab16(addr); |
206 | 211 | ||
207 | return usb_control_msg(ucr->pusb_dev, | 212 | ret = usb_control_msg(ucr->pusb_dev, |
208 | usb_rcvctrlpipe(ucr->pusb_dev, 0), RTSX_USB_REQ_REG_OP, | 213 | usb_rcvctrlpipe(ucr->pusb_dev, 0), RTSX_USB_REQ_REG_OP, |
209 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, | 214 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, |
210 | value, 0, data, 1, 100); | 215 | value, 0, buf, 1, 100); |
216 | *data = *buf; | ||
217 | |||
218 | kfree(buf); | ||
219 | return ret; | ||
211 | } | 220 | } |
212 | EXPORT_SYMBOL_GPL(rtsx_usb_ep0_read_register); | 221 | EXPORT_SYMBOL_GPL(rtsx_usb_ep0_read_register); |
213 | 222 | ||
@@ -288,18 +297,27 @@ static int rtsx_usb_get_status_with_bulk(struct rtsx_ucr *ucr, u16 *status) | |||
288 | int rtsx_usb_get_card_status(struct rtsx_ucr *ucr, u16 *status) | 297 | int rtsx_usb_get_card_status(struct rtsx_ucr *ucr, u16 *status) |
289 | { | 298 | { |
290 | int ret; | 299 | int ret; |
300 | u16 *buf; | ||
291 | 301 | ||
292 | if (!status) | 302 | if (!status) |
293 | return -EINVAL; | 303 | return -EINVAL; |
294 | 304 | ||
295 | if (polling_pipe == 0) | 305 | if (polling_pipe == 0) { |
306 | buf = kzalloc(sizeof(u16), GFP_KERNEL); | ||
307 | if (!buf) | ||
308 | return -ENOMEM; | ||
309 | |||
296 | ret = usb_control_msg(ucr->pusb_dev, | 310 | ret = usb_control_msg(ucr->pusb_dev, |
297 | usb_rcvctrlpipe(ucr->pusb_dev, 0), | 311 | usb_rcvctrlpipe(ucr->pusb_dev, 0), |
298 | RTSX_USB_REQ_POLL, | 312 | RTSX_USB_REQ_POLL, |
299 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, | 313 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, |
300 | 0, 0, status, 2, 100); | 314 | 0, 0, buf, 2, 100); |
301 | else | 315 | *status = *buf; |
316 | |||
317 | kfree(buf); | ||
318 | } else { | ||
302 | ret = rtsx_usb_get_status_with_bulk(ucr, status); | 319 | ret = rtsx_usb_get_status_with_bulk(ucr, status); |
320 | } | ||
303 | 321 | ||
304 | /* usb_control_msg may return positive when success */ | 322 | /* usb_control_msg may return positive when success */ |
305 | if (ret < 0) | 323 | if (ret < 0) |