Lines Matching refs:ushc

123 static int ushc_hw_reset(struct ushc_data *ushc)  in ushc_hw_reset()  argument
125 return usb_control_msg(ushc->usb_dev, usb_sndctrlpipe(ushc->usb_dev, 0), in ushc_hw_reset()
130 static int ushc_hw_get_caps(struct ushc_data *ushc) in ushc_hw_get_caps() argument
135 ret = usb_control_msg(ushc->usb_dev, usb_rcvctrlpipe(ushc->usb_dev, 0), in ushc_hw_get_caps()
137 0, 0, &ushc->caps, sizeof(ushc->caps), 100); in ushc_hw_get_caps()
141 ushc->caps = le32_to_cpu(ushc->caps); in ushc_hw_get_caps()
143 version = ushc->caps & USHC_GET_CAPS_VERSION_MASK; in ushc_hw_get_caps()
145 dev_err(&ushc->usb_dev->dev, "controller version %d is not supported\n", version); in ushc_hw_get_caps()
152 static int ushc_hw_set_host_ctrl(struct ushc_data *ushc, u16 mask, u16 val) in ushc_hw_set_host_ctrl() argument
157 host_ctrl = (ushc->host_ctrl & ~mask) | val; in ushc_hw_set_host_ctrl()
158 ret = usb_control_msg(ushc->usb_dev, usb_sndctrlpipe(ushc->usb_dev, 0), in ushc_hw_set_host_ctrl()
163 ushc->host_ctrl = host_ctrl; in ushc_hw_set_host_ctrl()
169 struct ushc_data *ushc = urb->context; in int_callback() local
175 status = ushc->int_data->status; in int_callback()
176 last_status = ushc->last_status; in int_callback()
177 ushc->last_status = status; in int_callback()
187 if (!test_and_clear_bit(IGNORE_NEXT_INT, &ushc->flags) in int_callback()
188 && test_bit(INT_EN, &ushc->flags) in int_callback()
190 mmc_signal_sdio_irq(ushc->mmc); in int_callback()
194 mmc_detect_change(ushc->mmc, msecs_to_jiffies(100)); in int_callback()
196 if (!test_bit(INT_EN, &ushc->flags)) in int_callback()
197 set_bit(IGNORE_NEXT_INT, &ushc->flags); in int_callback()
198 usb_submit_urb(ushc->int_urb, GFP_ATOMIC); in int_callback()
203 struct ushc_data *ushc = urb->context; in cbw_callback() local
206 usb_unlink_urb(ushc->data_urb); in cbw_callback()
207 usb_unlink_urb(ushc->csw_urb); in cbw_callback()
213 struct ushc_data *ushc = urb->context; in data_callback() local
216 usb_unlink_urb(ushc->csw_urb); in data_callback()
221 struct ushc_data *ushc = urb->context; in csw_callback() local
222 struct mmc_request *req = ushc->current_req; in csw_callback()
225 status = ushc->csw->status; in csw_callback()
247 req->cmd->resp[0] = le32_to_cpu(ushc->csw->response); in csw_callback()
249 mmc_request_done(ushc->mmc, req); in csw_callback()
254 struct ushc_data *ushc = mmc_priv(mmc); in ushc_request() local
258 spin_lock_irqsave(&ushc->lock, flags); in ushc_request()
260 if (test_bit(DISCONNECTED, &ushc->flags)) { in ushc_request()
273 if (req->data && ushc->clock_freq < 6000000) { in ushc_request()
278 ushc->current_req = req; in ushc_request()
281 ushc->cbw->cmd_idx = cpu_to_le16(req->cmd->opcode); in ushc_request()
283 ushc->cbw->block_size = cpu_to_le16(req->data->blksz); in ushc_request()
285 ushc->cbw->block_size = 0; in ushc_request()
286 ushc->cbw->arg = cpu_to_le32(req->cmd->arg); in ushc_request()
288 ret = usb_submit_urb(ushc->cbw_urb, GFP_ATOMIC); in ushc_request()
298 pipe = usb_rcvbulkpipe(ushc->usb_dev, 6); in ushc_request()
300 pipe = usb_sndbulkpipe(ushc->usb_dev, 2); in ushc_request()
302 usb_fill_bulk_urb(ushc->data_urb, ushc->usb_dev, pipe, in ushc_request()
304 data_callback, ushc); in ushc_request()
305 ret = usb_submit_urb(ushc->data_urb, GFP_ATOMIC); in ushc_request()
311 ret = usb_submit_urb(ushc->csw_urb, GFP_ATOMIC); in ushc_request()
316 spin_unlock_irqrestore(&ushc->lock, flags); in ushc_request()
318 usb_unlink_urb(ushc->cbw_urb); in ushc_request()
319 usb_unlink_urb(ushc->data_urb); in ushc_request()
325 static int ushc_set_power(struct ushc_data *ushc, unsigned char power_mode) in ushc_set_power() argument
341 return usb_control_msg(ushc->usb_dev, usb_sndctrlpipe(ushc->usb_dev, 0), in ushc_set_power()
346 static int ushc_set_bus_width(struct ushc_data *ushc, int bus_width) in ushc_set_bus_width() argument
348 return ushc_hw_set_host_ctrl(ushc, USHC_HOST_CTRL_4BIT, in ushc_set_bus_width()
352 static int ushc_set_bus_freq(struct ushc_data *ushc, int clk, bool enable_hs) in ushc_set_bus_freq() argument
360 ret = ushc_hw_set_host_ctrl(ushc, USHC_HOST_CTRL_HIGH_SPD, in ushc_set_bus_freq()
365 ret = usb_control_msg(ushc->usb_dev, usb_sndctrlpipe(ushc->usb_dev, 0), in ushc_set_bus_freq()
371 ushc->clock_freq = clk; in ushc_set_bus_freq()
377 struct ushc_data *ushc = mmc_priv(mmc); in ushc_set_ios() local
379 ushc_set_power(ushc, ios->power_mode); in ushc_set_ios()
380 ushc_set_bus_width(ushc, 1 << ios->bus_width); in ushc_set_ios()
381 ushc_set_bus_freq(ushc, ios->clock, ios->timing == MMC_TIMING_SD_HS); in ushc_set_ios()
386 struct ushc_data *ushc = mmc_priv(mmc); in ushc_get_cd() local
388 return !!(ushc->last_status & USHC_INT_STATUS_CARD_PRESENT); in ushc_get_cd()
393 struct ushc_data *ushc = mmc_priv(mmc); in ushc_enable_sdio_irq() local
396 set_bit(INT_EN, &ushc->flags); in ushc_enable_sdio_irq()
398 clear_bit(INT_EN, &ushc->flags); in ushc_enable_sdio_irq()
401 static void ushc_clean_up(struct ushc_data *ushc) in ushc_clean_up() argument
403 usb_free_urb(ushc->int_urb); in ushc_clean_up()
404 usb_free_urb(ushc->csw_urb); in ushc_clean_up()
405 usb_free_urb(ushc->data_urb); in ushc_clean_up()
406 usb_free_urb(ushc->cbw_urb); in ushc_clean_up()
408 kfree(ushc->int_data); in ushc_clean_up()
409 kfree(ushc->cbw); in ushc_clean_up()
410 kfree(ushc->csw); in ushc_clean_up()
412 mmc_free_host(ushc->mmc); in ushc_clean_up()
426 struct ushc_data *ushc; in ushc_probe() local
432 ushc = mmc_priv(mmc); in ushc_probe()
433 usb_set_intfdata(intf, ushc); in ushc_probe()
435 ushc->usb_dev = usb_dev; in ushc_probe()
436 ushc->mmc = mmc; in ushc_probe()
438 spin_lock_init(&ushc->lock); in ushc_probe()
440 ret = ushc_hw_reset(ushc); in ushc_probe()
445 ret = ushc_hw_get_caps(ushc); in ushc_probe()
455 mmc->caps |= (ushc->caps & USHC_GET_CAPS_HIGH_SPD) ? MMC_CAP_SD_HIGHSPEED : 0; in ushc_probe()
463 ushc->int_urb = usb_alloc_urb(0, GFP_KERNEL); in ushc_probe()
464 if (ushc->int_urb == NULL) { in ushc_probe()
468 ushc->int_data = kzalloc(sizeof(struct ushc_int_data), GFP_KERNEL); in ushc_probe()
469 if (ushc->int_data == NULL) { in ushc_probe()
473 usb_fill_int_urb(ushc->int_urb, ushc->usb_dev, in ushc_probe()
476 ushc->int_data, sizeof(struct ushc_int_data), in ushc_probe()
477 int_callback, ushc, in ushc_probe()
480 ushc->cbw_urb = usb_alloc_urb(0, GFP_KERNEL); in ushc_probe()
481 if (ushc->cbw_urb == NULL) { in ushc_probe()
485 ushc->cbw = kzalloc(sizeof(struct ushc_cbw), GFP_KERNEL); in ushc_probe()
486 if (ushc->cbw == NULL) { in ushc_probe()
490 ushc->cbw->signature = USHC_CBW_SIGNATURE; in ushc_probe()
492 usb_fill_bulk_urb(ushc->cbw_urb, ushc->usb_dev, usb_sndbulkpipe(usb_dev, 2), in ushc_probe()
493 ushc->cbw, sizeof(struct ushc_cbw), in ushc_probe()
494 cbw_callback, ushc); in ushc_probe()
496 ushc->data_urb = usb_alloc_urb(0, GFP_KERNEL); in ushc_probe()
497 if (ushc->data_urb == NULL) { in ushc_probe()
502 ushc->csw_urb = usb_alloc_urb(0, GFP_KERNEL); in ushc_probe()
503 if (ushc->csw_urb == NULL) { in ushc_probe()
507 ushc->csw = kzalloc(sizeof(struct ushc_csw), GFP_KERNEL); in ushc_probe()
508 if (ushc->csw == NULL) { in ushc_probe()
512 usb_fill_bulk_urb(ushc->csw_urb, ushc->usb_dev, usb_rcvbulkpipe(usb_dev, 6), in ushc_probe()
513 ushc->csw, sizeof(struct ushc_csw), in ushc_probe()
514 csw_callback, ushc); in ushc_probe()
516 ret = mmc_add_host(ushc->mmc); in ushc_probe()
520 ret = usb_submit_urb(ushc->int_urb, GFP_KERNEL); in ushc_probe()
522 mmc_remove_host(ushc->mmc); in ushc_probe()
529 ushc_clean_up(ushc); in ushc_probe()
535 struct ushc_data *ushc = usb_get_intfdata(intf); in ushc_disconnect() local
537 spin_lock_irq(&ushc->lock); in ushc_disconnect()
538 set_bit(DISCONNECTED, &ushc->flags); in ushc_disconnect()
539 spin_unlock_irq(&ushc->lock); in ushc_disconnect()
541 usb_kill_urb(ushc->int_urb); in ushc_disconnect()
542 usb_kill_urb(ushc->cbw_urb); in ushc_disconnect()
543 usb_kill_urb(ushc->data_urb); in ushc_disconnect()
544 usb_kill_urb(ushc->csw_urb); in ushc_disconnect()
546 mmc_remove_host(ushc->mmc); in ushc_disconnect()
548 ushc_clean_up(ushc); in ushc_disconnect()