Lines Matching refs:ucr
34 struct rtsx_ucr *ucr = from_timer(ucr, t, sg_timer); in rtsx_usb_sg_timed_out() local
36 dev_dbg(&ucr->pusb_intf->dev, "%s: sg transfer timed out", __func__); in rtsx_usb_sg_timed_out()
37 usb_sg_cancel(&ucr->current_sg); in rtsx_usb_sg_timed_out()
40 static int rtsx_usb_bulk_transfer_sglist(struct rtsx_ucr *ucr, in rtsx_usb_bulk_transfer_sglist() argument
46 dev_dbg(&ucr->pusb_intf->dev, "%s: xfer %u bytes, %d entries\n", in rtsx_usb_bulk_transfer_sglist()
48 ret = usb_sg_init(&ucr->current_sg, ucr->pusb_dev, pipe, 0, in rtsx_usb_bulk_transfer_sglist()
53 ucr->sg_timer.expires = jiffies + msecs_to_jiffies(timeout); in rtsx_usb_bulk_transfer_sglist()
54 add_timer(&ucr->sg_timer); in rtsx_usb_bulk_transfer_sglist()
55 usb_sg_wait(&ucr->current_sg); in rtsx_usb_bulk_transfer_sglist()
56 if (!del_timer_sync(&ucr->sg_timer)) in rtsx_usb_bulk_transfer_sglist()
59 ret = ucr->current_sg.status; in rtsx_usb_bulk_transfer_sglist()
62 *act_len = ucr->current_sg.bytes; in rtsx_usb_bulk_transfer_sglist()
67 int rtsx_usb_transfer_data(struct rtsx_ucr *ucr, unsigned int pipe, in rtsx_usb_transfer_data() argument
75 return rtsx_usb_bulk_transfer_sglist(ucr, pipe, in rtsx_usb_transfer_data()
79 return usb_bulk_msg(ucr->pusb_dev, pipe, buf, len, act_len, in rtsx_usb_transfer_data()
84 static inline void rtsx_usb_seq_cmd_hdr(struct rtsx_ucr *ucr, in rtsx_usb_seq_cmd_hdr() argument
87 rtsx_usb_cmd_hdr_tag(ucr); in rtsx_usb_seq_cmd_hdr()
89 ucr->cmd_buf[PACKET_TYPE] = seq_type; in rtsx_usb_seq_cmd_hdr()
90 ucr->cmd_buf[5] = (u8)(len >> 8); in rtsx_usb_seq_cmd_hdr()
91 ucr->cmd_buf[6] = (u8)len; in rtsx_usb_seq_cmd_hdr()
92 ucr->cmd_buf[8] = (u8)(addr >> 8); in rtsx_usb_seq_cmd_hdr()
93 ucr->cmd_buf[9] = (u8)addr; in rtsx_usb_seq_cmd_hdr()
96 ucr->cmd_buf[STAGE_FLAG] = 0; in rtsx_usb_seq_cmd_hdr()
98 ucr->cmd_buf[STAGE_FLAG] = STAGE_R; in rtsx_usb_seq_cmd_hdr()
101 static int rtsx_usb_seq_write_register(struct rtsx_ucr *ucr, in rtsx_usb_seq_write_register() argument
112 rtsx_usb_seq_cmd_hdr(ucr, addr, len, SEQ_WRITE); in rtsx_usb_seq_write_register()
113 memcpy(ucr->cmd_buf + SEQ_WRITE_DATA_OFFSET, data, len); in rtsx_usb_seq_write_register()
115 return rtsx_usb_transfer_data(ucr, in rtsx_usb_seq_write_register()
116 usb_sndbulkpipe(ucr->pusb_dev, EP_BULK_OUT), in rtsx_usb_seq_write_register()
117 ucr->cmd_buf, cmd_len, 0, NULL, 100); in rtsx_usb_seq_write_register()
120 static int rtsx_usb_seq_read_register(struct rtsx_ucr *ucr, in rtsx_usb_seq_read_register() argument
132 rtsx_usb_seq_cmd_hdr(ucr, addr, len, SEQ_READ); in rtsx_usb_seq_read_register()
133 ret = rtsx_usb_transfer_data(ucr, in rtsx_usb_seq_read_register()
134 usb_sndbulkpipe(ucr->pusb_dev, EP_BULK_OUT), in rtsx_usb_seq_read_register()
135 ucr->cmd_buf, 12, 0, NULL, 100); in rtsx_usb_seq_read_register()
139 ret = rtsx_usb_transfer_data(ucr, in rtsx_usb_seq_read_register()
140 usb_rcvbulkpipe(ucr->pusb_dev, EP_BULK_IN), in rtsx_usb_seq_read_register()
148 ret = rtsx_usb_read_register(ucr, addr + rsp_len + i, in rtsx_usb_seq_read_register()
157 int rtsx_usb_read_ppbuf(struct rtsx_ucr *ucr, u8 *buf, int buf_len) in rtsx_usb_read_ppbuf() argument
159 return rtsx_usb_seq_read_register(ucr, PPBUF_BASE2, (u16)buf_len, buf); in rtsx_usb_read_ppbuf()
163 int rtsx_usb_write_ppbuf(struct rtsx_ucr *ucr, u8 *buf, int buf_len) in rtsx_usb_write_ppbuf() argument
165 return rtsx_usb_seq_write_register(ucr, PPBUF_BASE2, (u16)buf_len, buf); in rtsx_usb_write_ppbuf()
169 int rtsx_usb_ep0_write_register(struct rtsx_ucr *ucr, u16 addr, in rtsx_usb_ep0_write_register() argument
178 return usb_control_msg(ucr->pusb_dev, in rtsx_usb_ep0_write_register()
179 usb_sndctrlpipe(ucr->pusb_dev, 0), RTSX_USB_REQ_REG_OP, in rtsx_usb_ep0_write_register()
185 int rtsx_usb_ep0_read_register(struct rtsx_ucr *ucr, u16 addr, u8 *data) in rtsx_usb_ep0_read_register() argument
201 ret = usb_control_msg(ucr->pusb_dev, in rtsx_usb_ep0_read_register()
202 usb_rcvctrlpipe(ucr->pusb_dev, 0), RTSX_USB_REQ_REG_OP, in rtsx_usb_ep0_read_register()
212 void rtsx_usb_add_cmd(struct rtsx_ucr *ucr, u8 cmd_type, u16 reg_addr, in rtsx_usb_add_cmd() argument
217 if (ucr->cmd_idx < (IOBUF_SIZE - CMD_OFFSET) / 4) { in rtsx_usb_add_cmd()
218 i = CMD_OFFSET + ucr->cmd_idx * 4; in rtsx_usb_add_cmd()
220 ucr->cmd_buf[i++] = ((cmd_type & 0x03) << 6) | in rtsx_usb_add_cmd()
222 ucr->cmd_buf[i++] = (u8)reg_addr; in rtsx_usb_add_cmd()
223 ucr->cmd_buf[i++] = mask; in rtsx_usb_add_cmd()
224 ucr->cmd_buf[i++] = data; in rtsx_usb_add_cmd()
226 ucr->cmd_idx++; in rtsx_usb_add_cmd()
231 int rtsx_usb_send_cmd(struct rtsx_ucr *ucr, u8 flag, int timeout) in rtsx_usb_send_cmd() argument
235 ucr->cmd_buf[CNT_H] = (u8)(ucr->cmd_idx >> 8); in rtsx_usb_send_cmd()
236 ucr->cmd_buf[CNT_L] = (u8)(ucr->cmd_idx); in rtsx_usb_send_cmd()
237 ucr->cmd_buf[STAGE_FLAG] = flag; in rtsx_usb_send_cmd()
239 ret = rtsx_usb_transfer_data(ucr, in rtsx_usb_send_cmd()
240 usb_sndbulkpipe(ucr->pusb_dev, EP_BULK_OUT), in rtsx_usb_send_cmd()
241 ucr->cmd_buf, ucr->cmd_idx * 4 + CMD_OFFSET, in rtsx_usb_send_cmd()
244 rtsx_usb_clear_fsm_err(ucr); in rtsx_usb_send_cmd()
252 int rtsx_usb_get_rsp(struct rtsx_ucr *ucr, int rsp_len, int timeout) in rtsx_usb_get_rsp() argument
259 return rtsx_usb_transfer_data(ucr, in rtsx_usb_get_rsp()
260 usb_rcvbulkpipe(ucr->pusb_dev, EP_BULK_IN), in rtsx_usb_get_rsp()
261 ucr->rsp_buf, rsp_len, 0, NULL, timeout); in rtsx_usb_get_rsp()
265 static int rtsx_usb_get_status_with_bulk(struct rtsx_ucr *ucr, u16 *status) in rtsx_usb_get_status_with_bulk() argument
269 rtsx_usb_init_cmd(ucr); in rtsx_usb_get_status_with_bulk()
270 rtsx_usb_add_cmd(ucr, READ_REG_CMD, CARD_EXIST, 0x00, 0x00); in rtsx_usb_get_status_with_bulk()
271 rtsx_usb_add_cmd(ucr, READ_REG_CMD, OCPSTAT, 0x00, 0x00); in rtsx_usb_get_status_with_bulk()
272 ret = rtsx_usb_send_cmd(ucr, MODE_CR, 100); in rtsx_usb_get_status_with_bulk()
276 ret = rtsx_usb_get_rsp(ucr, 2, 100); in rtsx_usb_get_status_with_bulk()
280 *status = ((ucr->rsp_buf[0] >> 2) & 0x0f) | in rtsx_usb_get_status_with_bulk()
281 ((ucr->rsp_buf[1] & 0x03) << 4); in rtsx_usb_get_status_with_bulk()
286 int rtsx_usb_get_card_status(struct rtsx_ucr *ucr, u16 *status) in rtsx_usb_get_card_status() argument
299 ret = usb_control_msg(ucr->pusb_dev, in rtsx_usb_get_card_status()
300 usb_rcvctrlpipe(ucr->pusb_dev, 0), in rtsx_usb_get_card_status()
308 ret = rtsx_usb_get_status_with_bulk(ucr, status); in rtsx_usb_get_card_status()
319 static int rtsx_usb_write_phy_register(struct rtsx_ucr *ucr, u8 addr, u8 val) in rtsx_usb_write_phy_register() argument
321 dev_dbg(&ucr->pusb_intf->dev, "Write 0x%x to phy register 0x%x\n", in rtsx_usb_write_phy_register()
324 rtsx_usb_init_cmd(ucr); in rtsx_usb_write_phy_register()
326 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, HS_VSTAIN, 0xFF, val); in rtsx_usb_write_phy_register()
327 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, HS_VCONTROL, 0xFF, addr & 0x0F); in rtsx_usb_write_phy_register()
328 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, HS_VLOADM, 0xFF, 0x00); in rtsx_usb_write_phy_register()
329 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, HS_VLOADM, 0xFF, 0x00); in rtsx_usb_write_phy_register()
330 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, HS_VLOADM, 0xFF, 0x01); in rtsx_usb_write_phy_register()
331 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, HS_VCONTROL, in rtsx_usb_write_phy_register()
333 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, HS_VLOADM, 0xFF, 0x00); in rtsx_usb_write_phy_register()
334 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, HS_VLOADM, 0xFF, 0x00); in rtsx_usb_write_phy_register()
335 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, HS_VLOADM, 0xFF, 0x01); in rtsx_usb_write_phy_register()
337 return rtsx_usb_send_cmd(ucr, MODE_C, 100); in rtsx_usb_write_phy_register()
340 int rtsx_usb_write_register(struct rtsx_ucr *ucr, u16 addr, u8 mask, u8 data) in rtsx_usb_write_register() argument
342 rtsx_usb_init_cmd(ucr); in rtsx_usb_write_register()
343 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, addr, mask, data); in rtsx_usb_write_register()
344 return rtsx_usb_send_cmd(ucr, MODE_C, 100); in rtsx_usb_write_register()
348 int rtsx_usb_read_register(struct rtsx_ucr *ucr, u16 addr, u8 *data) in rtsx_usb_read_register() argument
355 rtsx_usb_init_cmd(ucr); in rtsx_usb_read_register()
356 rtsx_usb_add_cmd(ucr, READ_REG_CMD, addr, 0, 0); in rtsx_usb_read_register()
357 ret = rtsx_usb_send_cmd(ucr, MODE_CR, 100); in rtsx_usb_read_register()
361 ret = rtsx_usb_get_rsp(ucr, 1, 100); in rtsx_usb_read_register()
366 *data = ucr->rsp_buf[0]; in rtsx_usb_read_register()
389 int rtsx_usb_switch_clock(struct rtsx_ucr *ucr, unsigned int card_clock, in rtsx_usb_switch_clock() argument
396 ucr->cur_clk = 0; in rtsx_usb_switch_clock()
408 ret = rtsx_usb_write_register(ucr, SD_CFG1, in rtsx_usb_switch_clock()
414 dev_dbg(&ucr->pusb_intf->dev, in rtsx_usb_switch_clock()
419 dev_dbg(&ucr->pusb_intf->dev, in rtsx_usb_switch_clock()
421 card_clock, ucr->cur_clk); in rtsx_usb_switch_clock()
423 if (card_clock == ucr->cur_clk) in rtsx_usb_switch_clock()
442 dev_dbg(&ucr->pusb_intf->dev, "n = %d, div = %d\n", n, div); in rtsx_usb_switch_clock()
448 dev_dbg(&ucr->pusb_intf->dev, "ssc_depth = %d\n", ssc_depth); in rtsx_usb_switch_clock()
450 rtsx_usb_init_cmd(ucr); in rtsx_usb_switch_clock()
451 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CLK_DIV, CLK_CHANGE, CLK_CHANGE); in rtsx_usb_switch_clock()
452 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CLK_DIV, in rtsx_usb_switch_clock()
454 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, SSC_CTL1, SSC_RSTB, 0); in rtsx_usb_switch_clock()
455 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, SSC_CTL2, in rtsx_usb_switch_clock()
457 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, SSC_DIV_N_0, 0xFF, n); in rtsx_usb_switch_clock()
458 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, SSC_CTL1, SSC_RSTB, SSC_RSTB); in rtsx_usb_switch_clock()
460 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, SD_VPCLK0_CTL, in rtsx_usb_switch_clock()
462 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, SD_VPCLK0_CTL, in rtsx_usb_switch_clock()
466 ret = rtsx_usb_send_cmd(ucr, MODE_C, 2000); in rtsx_usb_switch_clock()
470 ret = rtsx_usb_write_register(ucr, SSC_CTL1, 0xff, in rtsx_usb_switch_clock()
478 ret = rtsx_usb_write_register(ucr, CLK_DIV, CLK_CHANGE, 0); in rtsx_usb_switch_clock()
482 ucr->cur_clk = card_clock; in rtsx_usb_switch_clock()
488 int rtsx_usb_card_exclusive_check(struct rtsx_ucr *ucr, int card) in rtsx_usb_card_exclusive_check() argument
497 ret = rtsx_usb_get_card_status(ucr, &val); in rtsx_usb_card_exclusive_check()
512 static int rtsx_usb_reset_chip(struct rtsx_ucr *ucr) in rtsx_usb_reset_chip() argument
517 rtsx_usb_init_cmd(ucr); in rtsx_usb_reset_chip()
519 if (CHECK_PKG(ucr, LQFP48)) { in rtsx_usb_reset_chip()
520 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_PWR_CTL, in rtsx_usb_reset_chip()
522 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_PWR_CTL, in rtsx_usb_reset_chip()
524 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_PULL_CTL1, in rtsx_usb_reset_chip()
526 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_PULL_CTL5, in rtsx_usb_reset_chip()
528 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_PULL_CTL6, in rtsx_usb_reset_chip()
532 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, SYS_DUMMY0, NYET_MSAK, NYET_EN); in rtsx_usb_reset_chip()
533 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CD_DEGLITCH_WIDTH, 0xFF, 0x08); in rtsx_usb_reset_chip()
534 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, in rtsx_usb_reset_chip()
536 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, SD30_DRIVE_SEL, in rtsx_usb_reset_chip()
538 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, in rtsx_usb_reset_chip()
540 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, LDO_POWER_CFG, 0xE0, 0x0); in rtsx_usb_reset_chip()
542 if (ucr->is_rts5179) in rtsx_usb_reset_chip()
543 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, in rtsx_usb_reset_chip()
546 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_DMA1_CTL, in rtsx_usb_reset_chip()
548 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_INT_PEND, in rtsx_usb_reset_chip()
552 ret = rtsx_usb_send_cmd(ucr, MODE_C, 100); in rtsx_usb_reset_chip()
557 rtsx_usb_read_register(ucr, CFG_MODE, &val); in rtsx_usb_reset_chip()
559 ret = rtsx_usb_write_phy_register(ucr, 0xC2, 0x7C); in rtsx_usb_reset_chip()
567 static int rtsx_usb_init_chip(struct rtsx_ucr *ucr) in rtsx_usb_init_chip() argument
572 rtsx_usb_clear_fsm_err(ucr); in rtsx_usb_init_chip()
575 ret = rtsx_usb_write_register(ucr, in rtsx_usb_init_chip()
581 ret = rtsx_usb_write_register(ucr, CLK_DIV, CLK_CHANGE, 0x00); in rtsx_usb_init_chip()
586 ret = rtsx_usb_read_register(ucr, HW_VERSION, &val); in rtsx_usb_init_chip()
590 ucr->ic_version = val & HW_VER_MASK; in rtsx_usb_init_chip()
593 ret = rtsx_usb_read_register(ucr, CARD_SHARE_MODE, &val); in rtsx_usb_init_chip()
598 ucr->package = LQFP48; in rtsx_usb_init_chip()
599 dev_dbg(&ucr->pusb_intf->dev, "Package: LQFP48\n"); in rtsx_usb_init_chip()
601 ucr->package = QFN24; in rtsx_usb_init_chip()
602 dev_dbg(&ucr->pusb_intf->dev, "Package: QFN24\n"); in rtsx_usb_init_chip()
606 rtsx_usb_read_register(ucr, CFG_MODE_1, &val); in rtsx_usb_init_chip()
608 ucr->is_rts5179 = true; in rtsx_usb_init_chip()
609 dev_dbg(&ucr->pusb_intf->dev, "Device is rts5179\n"); in rtsx_usb_init_chip()
611 ucr->is_rts5179 = false; in rtsx_usb_init_chip()
614 return rtsx_usb_reset_chip(ucr); in rtsx_usb_init_chip()
621 struct rtsx_ucr *ucr; in rtsx_usb_probe() local
628 ucr = devm_kzalloc(&intf->dev, sizeof(*ucr), GFP_KERNEL); in rtsx_usb_probe()
629 if (!ucr) in rtsx_usb_probe()
632 ucr->pusb_dev = usb_dev; in rtsx_usb_probe()
634 ucr->cmd_buf = kmalloc(IOBUF_SIZE, GFP_KERNEL); in rtsx_usb_probe()
635 if (!ucr->cmd_buf) in rtsx_usb_probe()
638 ucr->rsp_buf = kmalloc(IOBUF_SIZE, GFP_KERNEL); in rtsx_usb_probe()
639 if (!ucr->rsp_buf) { in rtsx_usb_probe()
644 usb_set_intfdata(intf, ucr); in rtsx_usb_probe()
646 ucr->vendor_id = id->idVendor; in rtsx_usb_probe()
647 ucr->product_id = id->idProduct; in rtsx_usb_probe()
649 mutex_init(&ucr->dev_mutex); in rtsx_usb_probe()
651 ucr->pusb_intf = intf; in rtsx_usb_probe()
654 ret = rtsx_usb_init_chip(ucr); in rtsx_usb_probe()
659 timer_setup(&ucr->sg_timer, rtsx_usb_sg_timed_out, 0); in rtsx_usb_probe()
674 usb_set_intfdata(ucr->pusb_intf, NULL); in rtsx_usb_probe()
675 kfree(ucr->rsp_buf); in rtsx_usb_probe()
676 ucr->rsp_buf = NULL; in rtsx_usb_probe()
678 kfree(ucr->cmd_buf); in rtsx_usb_probe()
679 ucr->cmd_buf = NULL; in rtsx_usb_probe()
685 struct rtsx_ucr *ucr = (struct rtsx_ucr *)usb_get_intfdata(intf); in rtsx_usb_disconnect() local
691 usb_set_intfdata(ucr->pusb_intf, NULL); in rtsx_usb_disconnect()
693 kfree(ucr->cmd_buf); in rtsx_usb_disconnect()
694 ucr->cmd_buf = NULL; in rtsx_usb_disconnect()
696 kfree(ucr->rsp_buf); in rtsx_usb_disconnect()
697 ucr->rsp_buf = NULL; in rtsx_usb_disconnect()
703 struct rtsx_ucr *ucr = in rtsx_usb_suspend() local
711 if (mutex_trylock(&ucr->dev_mutex)) { in rtsx_usb_suspend()
712 rtsx_usb_get_card_status(ucr, &val); in rtsx_usb_suspend()
713 mutex_unlock(&ucr->dev_mutex); in rtsx_usb_suspend()
741 struct rtsx_ucr *ucr = in rtsx_usb_reset_resume() local
744 rtsx_usb_reset_chip(ucr); in rtsx_usb_reset_resume()
760 struct rtsx_ucr *ucr = (struct rtsx_ucr *)usb_get_intfdata(intf); in rtsx_usb_pre_reset() local
762 mutex_lock(&ucr->dev_mutex); in rtsx_usb_pre_reset()
768 struct rtsx_ucr *ucr = (struct rtsx_ucr *)usb_get_intfdata(intf); in rtsx_usb_post_reset() local
770 mutex_unlock(&ucr->dev_mutex); in rtsx_usb_post_reset()