Lines Matching refs:ushc
119 static int ushc_hw_reset(struct ushc_data *ushc)
121 return usb_control_msg(ushc->usb_dev, usb_sndctrlpipe(ushc->usb_dev, 0),
126 static int ushc_hw_get_caps(struct ushc_data *ushc)
131 ret = usb_control_msg(ushc->usb_dev, usb_rcvctrlpipe(ushc->usb_dev, 0),
133 0, 0, &ushc->caps, sizeof(ushc->caps), 100);
137 ushc->caps = le32_to_cpu(ushc->caps);
139 version = ushc->caps & USHC_GET_CAPS_VERSION_MASK;
141 dev_err(&ushc->usb_dev->dev, "controller version %d is not supported\n", version);
148 static int ushc_hw_set_host_ctrl(struct ushc_data *ushc, u16 mask, u16 val)
153 host_ctrl = (ushc->host_ctrl & ~mask) | val;
154 ret = usb_control_msg(ushc->usb_dev, usb_sndctrlpipe(ushc->usb_dev, 0),
159 ushc->host_ctrl = host_ctrl;
165 struct ushc_data *ushc = urb->context;
171 status = ushc->int_data->status;
172 last_status = ushc->last_status;
173 ushc->last_status = status;
183 if (!test_and_clear_bit(IGNORE_NEXT_INT, &ushc->flags)
184 && test_bit(INT_EN, &ushc->flags)
186 mmc_signal_sdio_irq(ushc->mmc);
190 mmc_detect_change(ushc->mmc, msecs_to_jiffies(100));
192 if (!test_bit(INT_EN, &ushc->flags))
193 set_bit(IGNORE_NEXT_INT, &ushc->flags);
194 usb_submit_urb(ushc->int_urb, GFP_ATOMIC);
199 struct ushc_data *ushc = urb->context;
202 usb_unlink_urb(ushc->data_urb);
203 usb_unlink_urb(ushc->csw_urb);
209 struct ushc_data *ushc = urb->context;
212 usb_unlink_urb(ushc->csw_urb);
217 struct ushc_data *ushc = urb->context;
218 struct mmc_request *req = ushc->current_req;
221 status = ushc->csw->status;
243 req->cmd->resp[0] = le32_to_cpu(ushc->csw->response);
245 mmc_request_done(ushc->mmc, req);
250 struct ushc_data *ushc = mmc_priv(mmc);
254 spin_lock_irqsave(&ushc->lock, flags);
256 if (test_bit(DISCONNECTED, &ushc->flags)) {
269 if (req->data && ushc->clock_freq < 6000000) {
274 ushc->current_req = req;
277 ushc->cbw->cmd_idx = cpu_to_le16(req->cmd->opcode);
279 ushc->cbw->block_size = cpu_to_le16(req->data->blksz);
281 ushc->cbw->block_size = 0;
282 ushc->cbw->arg = cpu_to_le32(req->cmd->arg);
284 ret = usb_submit_urb(ushc->cbw_urb, GFP_ATOMIC);
294 pipe = usb_rcvbulkpipe(ushc->usb_dev, 6);
296 pipe = usb_sndbulkpipe(ushc->usb_dev, 2);
298 usb_fill_bulk_urb(ushc->data_urb, ushc->usb_dev, pipe,
300 data_callback, ushc);
301 ushc->data_urb->num_sgs = 1;
302 ushc->data_urb->sg = data->sg;
303 ret = usb_submit_urb(ushc->data_urb, GFP_ATOMIC);
309 ret = usb_submit_urb(ushc->csw_urb, GFP_ATOMIC);
312 spin_unlock_irqrestore(&ushc->lock, flags);
314 usb_unlink_urb(ushc->cbw_urb);
315 usb_unlink_urb(ushc->data_urb);
321 static int ushc_set_power(struct ushc_data *ushc, unsigned char power_mode)
337 return usb_control_msg(ushc->usb_dev, usb_sndctrlpipe(ushc->usb_dev, 0),
342 static int ushc_set_bus_width(struct ushc_data *ushc, int bus_width)
344 return ushc_hw_set_host_ctrl(ushc, USHC_HOST_CTRL_4BIT,
348 static int ushc_set_bus_freq(struct ushc_data *ushc, int clk, bool enable_hs)
356 ret = ushc_hw_set_host_ctrl(ushc, USHC_HOST_CTRL_HIGH_SPD,
361 ret = usb_control_msg(ushc->usb_dev, usb_sndctrlpipe(ushc->usb_dev, 0),
367 ushc->clock_freq = clk;
373 struct ushc_data *ushc = mmc_priv(mmc);
375 ushc_set_power(ushc, ios->power_mode);
376 ushc_set_bus_width(ushc, 1 << ios->bus_width);
377 ushc_set_bus_freq(ushc, ios->clock, ios->timing == MMC_TIMING_SD_HS);
382 struct ushc_data *ushc = mmc_priv(mmc);
384 return !!(ushc->last_status & USHC_INT_STATUS_CARD_PRESENT);
389 struct ushc_data *ushc = mmc_priv(mmc);
392 set_bit(INT_EN, &ushc->flags);
394 clear_bit(INT_EN, &ushc->flags);
397 static void ushc_clean_up(struct ushc_data *ushc)
399 usb_free_urb(ushc->int_urb);
400 usb_free_urb(ushc->csw_urb);
401 usb_free_urb(ushc->data_urb);
402 usb_free_urb(ushc->cbw_urb);
404 kfree(ushc->int_data);
405 kfree(ushc->cbw);
406 kfree(ushc->csw);
408 mmc_free_host(ushc->mmc);
422 struct ushc_data *ushc;
431 ushc = mmc_priv(mmc);
432 usb_set_intfdata(intf, ushc);
434 ushc->usb_dev = usb_dev;
435 ushc->mmc = mmc;
437 spin_lock_init(&ushc->lock);
439 ret = ushc_hw_reset(ushc);
444 ret = ushc_hw_get_caps(ushc);
454 mmc->caps |= (ushc->caps & USHC_GET_CAPS_HIGH_SPD) ? MMC_CAP_SD_HIGHSPEED : 0;
462 ushc->int_urb = usb_alloc_urb(0, GFP_KERNEL);
463 if (ushc->int_urb == NULL) {
467 ushc->int_data = kzalloc(sizeof(struct ushc_int_data), GFP_KERNEL);
468 if (ushc->int_data == NULL) {
472 usb_fill_int_urb(ushc->int_urb, ushc->usb_dev,
475 ushc->int_data, sizeof(struct ushc_int_data),
476 int_callback, ushc,
479 ushc->cbw_urb = usb_alloc_urb(0, GFP_KERNEL);
480 if (ushc->cbw_urb == NULL) {
484 ushc->cbw = kzalloc(sizeof(struct ushc_cbw), GFP_KERNEL);
485 if (ushc->cbw == NULL) {
489 ushc->cbw->signature = USHC_CBW_SIGNATURE;
491 usb_fill_bulk_urb(ushc->cbw_urb, ushc->usb_dev, usb_sndbulkpipe(usb_dev, 2),
492 ushc->cbw, sizeof(struct ushc_cbw),
493 cbw_callback, ushc);
495 ushc->data_urb = usb_alloc_urb(0, GFP_KERNEL);
496 if (ushc->data_urb == NULL) {
501 ushc->csw_urb = usb_alloc_urb(0, GFP_KERNEL);
502 if (ushc->csw_urb == NULL) {
506 ushc->csw = kzalloc(sizeof(struct ushc_csw), GFP_KERNEL);
507 if (ushc->csw == NULL) {
511 usb_fill_bulk_urb(ushc->csw_urb, ushc->usb_dev, usb_rcvbulkpipe(usb_dev, 6),
512 ushc->csw, sizeof(struct ushc_csw),
513 csw_callback, ushc);
515 ret = mmc_add_host(ushc->mmc);
519 ret = usb_submit_urb(ushc->int_urb, GFP_KERNEL);
521 mmc_remove_host(ushc->mmc);
528 ushc_clean_up(ushc);
534 struct ushc_data *ushc = usb_get_intfdata(intf);
536 spin_lock_irq(&ushc->lock);
537 set_bit(DISCONNECTED, &ushc->flags);
538 spin_unlock_irq(&ushc->lock);
540 usb_kill_urb(ushc->int_urb);
541 usb_kill_urb(ushc->cbw_urb);
542 usb_kill_urb(ushc->data_urb);
543 usb_kill_urb(ushc->csw_urb);
545 mmc_remove_host(ushc->mmc);
547 ushc_clean_up(ushc);
558 .name = "ushc",