Lines Matching refs:ucr
45 struct rtsx_ucr *ucr = (struct rtsx_ucr *)data; in rtsx_usb_sg_timed_out() local
47 dev_dbg(&ucr->pusb_intf->dev, "%s: sg transfer timed out", __func__); in rtsx_usb_sg_timed_out()
48 usb_sg_cancel(&ucr->current_sg); in rtsx_usb_sg_timed_out()
51 ucr->current_sg.status = -ETIMEDOUT; in rtsx_usb_sg_timed_out()
54 static int rtsx_usb_bulk_transfer_sglist(struct rtsx_ucr *ucr, in rtsx_usb_bulk_transfer_sglist() argument
60 dev_dbg(&ucr->pusb_intf->dev, "%s: xfer %u bytes, %d entries\n", in rtsx_usb_bulk_transfer_sglist()
62 ret = usb_sg_init(&ucr->current_sg, ucr->pusb_dev, pipe, 0, in rtsx_usb_bulk_transfer_sglist()
67 ucr->sg_timer.expires = jiffies + msecs_to_jiffies(timeout); in rtsx_usb_bulk_transfer_sglist()
68 add_timer(&ucr->sg_timer); in rtsx_usb_bulk_transfer_sglist()
69 usb_sg_wait(&ucr->current_sg); in rtsx_usb_bulk_transfer_sglist()
70 del_timer_sync(&ucr->sg_timer); in rtsx_usb_bulk_transfer_sglist()
73 *act_len = ucr->current_sg.bytes; in rtsx_usb_bulk_transfer_sglist()
75 return ucr->current_sg.status; in rtsx_usb_bulk_transfer_sglist()
78 int rtsx_usb_transfer_data(struct rtsx_ucr *ucr, unsigned int pipe, in rtsx_usb_transfer_data() argument
86 return rtsx_usb_bulk_transfer_sglist(ucr, pipe, in rtsx_usb_transfer_data()
90 return usb_bulk_msg(ucr->pusb_dev, pipe, buf, len, act_len, in rtsx_usb_transfer_data()
95 static inline void rtsx_usb_seq_cmd_hdr(struct rtsx_ucr *ucr, in rtsx_usb_seq_cmd_hdr() argument
98 rtsx_usb_cmd_hdr_tag(ucr); in rtsx_usb_seq_cmd_hdr()
100 ucr->cmd_buf[PACKET_TYPE] = seq_type; in rtsx_usb_seq_cmd_hdr()
101 ucr->cmd_buf[5] = (u8)(len >> 8); in rtsx_usb_seq_cmd_hdr()
102 ucr->cmd_buf[6] = (u8)len; in rtsx_usb_seq_cmd_hdr()
103 ucr->cmd_buf[8] = (u8)(addr >> 8); in rtsx_usb_seq_cmd_hdr()
104 ucr->cmd_buf[9] = (u8)addr; in rtsx_usb_seq_cmd_hdr()
107 ucr->cmd_buf[STAGE_FLAG] = 0; in rtsx_usb_seq_cmd_hdr()
109 ucr->cmd_buf[STAGE_FLAG] = STAGE_R; in rtsx_usb_seq_cmd_hdr()
112 static int rtsx_usb_seq_write_register(struct rtsx_ucr *ucr, in rtsx_usb_seq_write_register() argument
123 rtsx_usb_seq_cmd_hdr(ucr, addr, len, SEQ_WRITE); in rtsx_usb_seq_write_register()
124 memcpy(ucr->cmd_buf + SEQ_WRITE_DATA_OFFSET, data, len); in rtsx_usb_seq_write_register()
126 return rtsx_usb_transfer_data(ucr, in rtsx_usb_seq_write_register()
127 usb_sndbulkpipe(ucr->pusb_dev, EP_BULK_OUT), in rtsx_usb_seq_write_register()
128 ucr->cmd_buf, cmd_len, 0, NULL, 100); in rtsx_usb_seq_write_register()
131 static int rtsx_usb_seq_read_register(struct rtsx_ucr *ucr, in rtsx_usb_seq_read_register() argument
143 rtsx_usb_seq_cmd_hdr(ucr, addr, len, SEQ_READ); in rtsx_usb_seq_read_register()
144 ret = rtsx_usb_transfer_data(ucr, in rtsx_usb_seq_read_register()
145 usb_sndbulkpipe(ucr->pusb_dev, EP_BULK_OUT), in rtsx_usb_seq_read_register()
146 ucr->cmd_buf, 12, 0, NULL, 100); in rtsx_usb_seq_read_register()
150 ret = rtsx_usb_transfer_data(ucr, in rtsx_usb_seq_read_register()
151 usb_rcvbulkpipe(ucr->pusb_dev, EP_BULK_IN), in rtsx_usb_seq_read_register()
159 ret = rtsx_usb_read_register(ucr, addr + rsp_len + i, in rtsx_usb_seq_read_register()
168 int rtsx_usb_read_ppbuf(struct rtsx_ucr *ucr, u8 *buf, int buf_len) in rtsx_usb_read_ppbuf() argument
170 return rtsx_usb_seq_read_register(ucr, PPBUF_BASE2, (u16)buf_len, buf); in rtsx_usb_read_ppbuf()
174 int rtsx_usb_write_ppbuf(struct rtsx_ucr *ucr, u8 *buf, int buf_len) in rtsx_usb_write_ppbuf() argument
176 return rtsx_usb_seq_write_register(ucr, PPBUF_BASE2, (u16)buf_len, buf); in rtsx_usb_write_ppbuf()
180 int rtsx_usb_ep0_write_register(struct rtsx_ucr *ucr, u16 addr, in rtsx_usb_ep0_write_register() argument
189 return usb_control_msg(ucr->pusb_dev, in rtsx_usb_ep0_write_register()
190 usb_sndctrlpipe(ucr->pusb_dev, 0), RTSX_USB_REQ_REG_OP, in rtsx_usb_ep0_write_register()
196 int rtsx_usb_ep0_read_register(struct rtsx_ucr *ucr, u16 addr, u8 *data) in rtsx_usb_ep0_read_register() argument
212 ret = usb_control_msg(ucr->pusb_dev, in rtsx_usb_ep0_read_register()
213 usb_rcvctrlpipe(ucr->pusb_dev, 0), RTSX_USB_REQ_REG_OP, in rtsx_usb_ep0_read_register()
223 void rtsx_usb_add_cmd(struct rtsx_ucr *ucr, u8 cmd_type, u16 reg_addr, in rtsx_usb_add_cmd() argument
228 if (ucr->cmd_idx < (IOBUF_SIZE - CMD_OFFSET) / 4) { in rtsx_usb_add_cmd()
229 i = CMD_OFFSET + ucr->cmd_idx * 4; in rtsx_usb_add_cmd()
231 ucr->cmd_buf[i++] = ((cmd_type & 0x03) << 6) | in rtsx_usb_add_cmd()
233 ucr->cmd_buf[i++] = (u8)reg_addr; in rtsx_usb_add_cmd()
234 ucr->cmd_buf[i++] = mask; in rtsx_usb_add_cmd()
235 ucr->cmd_buf[i++] = data; in rtsx_usb_add_cmd()
237 ucr->cmd_idx++; in rtsx_usb_add_cmd()
242 int rtsx_usb_send_cmd(struct rtsx_ucr *ucr, u8 flag, int timeout) in rtsx_usb_send_cmd() argument
246 ucr->cmd_buf[CNT_H] = (u8)(ucr->cmd_idx >> 8); in rtsx_usb_send_cmd()
247 ucr->cmd_buf[CNT_L] = (u8)(ucr->cmd_idx); in rtsx_usb_send_cmd()
248 ucr->cmd_buf[STAGE_FLAG] = flag; in rtsx_usb_send_cmd()
250 ret = rtsx_usb_transfer_data(ucr, in rtsx_usb_send_cmd()
251 usb_sndbulkpipe(ucr->pusb_dev, EP_BULK_OUT), in rtsx_usb_send_cmd()
252 ucr->cmd_buf, ucr->cmd_idx * 4 + CMD_OFFSET, in rtsx_usb_send_cmd()
255 rtsx_usb_clear_fsm_err(ucr); in rtsx_usb_send_cmd()
263 int rtsx_usb_get_rsp(struct rtsx_ucr *ucr, int rsp_len, int timeout) in rtsx_usb_get_rsp() argument
270 return rtsx_usb_transfer_data(ucr, in rtsx_usb_get_rsp()
271 usb_rcvbulkpipe(ucr->pusb_dev, EP_BULK_IN), in rtsx_usb_get_rsp()
272 ucr->rsp_buf, rsp_len, 0, NULL, timeout); in rtsx_usb_get_rsp()
276 static int rtsx_usb_get_status_with_bulk(struct rtsx_ucr *ucr, u16 *status) in rtsx_usb_get_status_with_bulk() argument
280 rtsx_usb_init_cmd(ucr); in rtsx_usb_get_status_with_bulk()
281 rtsx_usb_add_cmd(ucr, READ_REG_CMD, CARD_EXIST, 0x00, 0x00); in rtsx_usb_get_status_with_bulk()
282 rtsx_usb_add_cmd(ucr, READ_REG_CMD, OCPSTAT, 0x00, 0x00); in rtsx_usb_get_status_with_bulk()
283 ret = rtsx_usb_send_cmd(ucr, MODE_CR, 100); in rtsx_usb_get_status_with_bulk()
287 ret = rtsx_usb_get_rsp(ucr, 2, 100); in rtsx_usb_get_status_with_bulk()
291 *status = ((ucr->rsp_buf[0] >> 2) & 0x0f) | in rtsx_usb_get_status_with_bulk()
292 ((ucr->rsp_buf[1] & 0x03) << 4); in rtsx_usb_get_status_with_bulk()
297 int rtsx_usb_get_card_status(struct rtsx_ucr *ucr, u16 *status) in rtsx_usb_get_card_status() argument
310 ret = usb_control_msg(ucr->pusb_dev, in rtsx_usb_get_card_status()
311 usb_rcvctrlpipe(ucr->pusb_dev, 0), in rtsx_usb_get_card_status()
319 ret = rtsx_usb_get_status_with_bulk(ucr, status); in rtsx_usb_get_card_status()
330 static int rtsx_usb_write_phy_register(struct rtsx_ucr *ucr, u8 addr, u8 val) in rtsx_usb_write_phy_register() argument
332 dev_dbg(&ucr->pusb_intf->dev, "Write 0x%x to phy register 0x%x\n", in rtsx_usb_write_phy_register()
335 rtsx_usb_init_cmd(ucr); in rtsx_usb_write_phy_register()
337 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, HS_VSTAIN, 0xFF, val); in rtsx_usb_write_phy_register()
338 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, HS_VCONTROL, 0xFF, addr & 0x0F); in rtsx_usb_write_phy_register()
339 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, HS_VLOADM, 0xFF, 0x00); in rtsx_usb_write_phy_register()
340 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, HS_VLOADM, 0xFF, 0x00); in rtsx_usb_write_phy_register()
341 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, HS_VLOADM, 0xFF, 0x01); in rtsx_usb_write_phy_register()
342 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, HS_VCONTROL, in rtsx_usb_write_phy_register()
344 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, HS_VLOADM, 0xFF, 0x00); in rtsx_usb_write_phy_register()
345 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, HS_VLOADM, 0xFF, 0x00); in rtsx_usb_write_phy_register()
346 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, HS_VLOADM, 0xFF, 0x01); in rtsx_usb_write_phy_register()
348 return rtsx_usb_send_cmd(ucr, MODE_C, 100); in rtsx_usb_write_phy_register()
351 int rtsx_usb_write_register(struct rtsx_ucr *ucr, u16 addr, u8 mask, u8 data) in rtsx_usb_write_register() argument
353 rtsx_usb_init_cmd(ucr); in rtsx_usb_write_register()
354 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, addr, mask, data); in rtsx_usb_write_register()
355 return rtsx_usb_send_cmd(ucr, MODE_C, 100); in rtsx_usb_write_register()
359 int rtsx_usb_read_register(struct rtsx_ucr *ucr, u16 addr, u8 *data) in rtsx_usb_read_register() argument
366 rtsx_usb_init_cmd(ucr); in rtsx_usb_read_register()
367 rtsx_usb_add_cmd(ucr, READ_REG_CMD, addr, 0, 0); in rtsx_usb_read_register()
368 ret = rtsx_usb_send_cmd(ucr, MODE_CR, 100); in rtsx_usb_read_register()
372 ret = rtsx_usb_get_rsp(ucr, 1, 100); in rtsx_usb_read_register()
377 *data = ucr->rsp_buf[0]; in rtsx_usb_read_register()
400 int rtsx_usb_switch_clock(struct rtsx_ucr *ucr, unsigned int card_clock, in rtsx_usb_switch_clock() argument
407 ucr->cur_clk = 0; in rtsx_usb_switch_clock()
419 ret = rtsx_usb_write_register(ucr, SD_CFG1, in rtsx_usb_switch_clock()
425 dev_dbg(&ucr->pusb_intf->dev, in rtsx_usb_switch_clock()
430 dev_dbg(&ucr->pusb_intf->dev, in rtsx_usb_switch_clock()
432 card_clock, ucr->cur_clk); in rtsx_usb_switch_clock()
434 if (card_clock == ucr->cur_clk) in rtsx_usb_switch_clock()
453 dev_dbg(&ucr->pusb_intf->dev, "n = %d, div = %d\n", n, div); in rtsx_usb_switch_clock()
459 dev_dbg(&ucr->pusb_intf->dev, "ssc_depth = %d\n", ssc_depth); in rtsx_usb_switch_clock()
461 rtsx_usb_init_cmd(ucr); in rtsx_usb_switch_clock()
462 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CLK_DIV, CLK_CHANGE, CLK_CHANGE); in rtsx_usb_switch_clock()
463 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CLK_DIV, in rtsx_usb_switch_clock()
465 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, SSC_CTL1, SSC_RSTB, 0); in rtsx_usb_switch_clock()
466 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, SSC_CTL2, in rtsx_usb_switch_clock()
468 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, SSC_DIV_N_0, 0xFF, n); in rtsx_usb_switch_clock()
469 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, SSC_CTL1, SSC_RSTB, SSC_RSTB); in rtsx_usb_switch_clock()
471 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, SD_VPCLK0_CTL, in rtsx_usb_switch_clock()
473 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, SD_VPCLK0_CTL, in rtsx_usb_switch_clock()
477 ret = rtsx_usb_send_cmd(ucr, MODE_C, 2000); in rtsx_usb_switch_clock()
481 ret = rtsx_usb_write_register(ucr, SSC_CTL1, 0xff, in rtsx_usb_switch_clock()
489 ret = rtsx_usb_write_register(ucr, CLK_DIV, CLK_CHANGE, 0); in rtsx_usb_switch_clock()
493 ucr->cur_clk = card_clock; in rtsx_usb_switch_clock()
499 int rtsx_usb_card_exclusive_check(struct rtsx_ucr *ucr, int card) in rtsx_usb_card_exclusive_check() argument
508 ret = rtsx_usb_get_card_status(ucr, &val); in rtsx_usb_card_exclusive_check()
523 static int rtsx_usb_reset_chip(struct rtsx_ucr *ucr) in rtsx_usb_reset_chip() argument
528 rtsx_usb_init_cmd(ucr); in rtsx_usb_reset_chip()
530 if (CHECK_PKG(ucr, LQFP48)) { in rtsx_usb_reset_chip()
531 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_PWR_CTL, in rtsx_usb_reset_chip()
533 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_PWR_CTL, in rtsx_usb_reset_chip()
535 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_PULL_CTL1, in rtsx_usb_reset_chip()
537 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_PULL_CTL5, in rtsx_usb_reset_chip()
539 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_PULL_CTL6, in rtsx_usb_reset_chip()
543 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, SYS_DUMMY0, NYET_MSAK, NYET_EN); in rtsx_usb_reset_chip()
544 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CD_DEGLITCH_WIDTH, 0xFF, 0x08); in rtsx_usb_reset_chip()
545 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, in rtsx_usb_reset_chip()
547 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, SD30_DRIVE_SEL, in rtsx_usb_reset_chip()
549 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, in rtsx_usb_reset_chip()
551 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, LDO_POWER_CFG, 0xE0, 0x0); in rtsx_usb_reset_chip()
553 if (ucr->is_rts5179) in rtsx_usb_reset_chip()
554 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, in rtsx_usb_reset_chip()
557 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_DMA1_CTL, in rtsx_usb_reset_chip()
559 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_INT_PEND, in rtsx_usb_reset_chip()
563 ret = rtsx_usb_send_cmd(ucr, MODE_C, 100); in rtsx_usb_reset_chip()
568 rtsx_usb_read_register(ucr, CFG_MODE, &val); in rtsx_usb_reset_chip()
570 ret = rtsx_usb_write_phy_register(ucr, 0xC2, 0x7C); in rtsx_usb_reset_chip()
578 static int rtsx_usb_init_chip(struct rtsx_ucr *ucr) in rtsx_usb_init_chip() argument
583 rtsx_usb_clear_fsm_err(ucr); in rtsx_usb_init_chip()
586 ret = rtsx_usb_write_register(ucr, in rtsx_usb_init_chip()
592 ret = rtsx_usb_write_register(ucr, CLK_DIV, CLK_CHANGE, 0x00); in rtsx_usb_init_chip()
597 ret = rtsx_usb_read_register(ucr, HW_VERSION, &val); in rtsx_usb_init_chip()
601 ucr->ic_version = val & HW_VER_MASK; in rtsx_usb_init_chip()
604 ret = rtsx_usb_read_register(ucr, CARD_SHARE_MODE, &val); in rtsx_usb_init_chip()
609 ucr->package = LQFP48; in rtsx_usb_init_chip()
610 dev_dbg(&ucr->pusb_intf->dev, "Package: LQFP48\n"); in rtsx_usb_init_chip()
612 ucr->package = QFN24; in rtsx_usb_init_chip()
613 dev_dbg(&ucr->pusb_intf->dev, "Package: QFN24\n"); in rtsx_usb_init_chip()
617 rtsx_usb_read_register(ucr, CFG_MODE_1, &val); in rtsx_usb_init_chip()
619 ucr->is_rts5179 = true; in rtsx_usb_init_chip()
620 dev_dbg(&ucr->pusb_intf->dev, "Device is rts5179\n"); in rtsx_usb_init_chip()
622 ucr->is_rts5179 = false; in rtsx_usb_init_chip()
625 return rtsx_usb_reset_chip(ucr); in rtsx_usb_init_chip()
632 struct rtsx_ucr *ucr; in rtsx_usb_probe() local
639 ucr = devm_kzalloc(&intf->dev, sizeof(*ucr), GFP_KERNEL); in rtsx_usb_probe()
640 if (!ucr) in rtsx_usb_probe()
643 ucr->pusb_dev = usb_dev; in rtsx_usb_probe()
645 ucr->iobuf = usb_alloc_coherent(ucr->pusb_dev, IOBUF_SIZE, in rtsx_usb_probe()
646 GFP_KERNEL, &ucr->iobuf_dma); in rtsx_usb_probe()
647 if (!ucr->iobuf) in rtsx_usb_probe()
650 usb_set_intfdata(intf, ucr); in rtsx_usb_probe()
652 ucr->vendor_id = id->idVendor; in rtsx_usb_probe()
653 ucr->product_id = id->idProduct; in rtsx_usb_probe()
654 ucr->cmd_buf = ucr->rsp_buf = ucr->iobuf; in rtsx_usb_probe()
656 mutex_init(&ucr->dev_mutex); in rtsx_usb_probe()
658 ucr->pusb_intf = intf; in rtsx_usb_probe()
661 ret = rtsx_usb_init_chip(ucr); in rtsx_usb_probe()
666 setup_timer(&ucr->sg_timer, rtsx_usb_sg_timed_out, (unsigned long) ucr); in rtsx_usb_probe()
681 usb_free_coherent(ucr->pusb_dev, IOBUF_SIZE, ucr->iobuf, in rtsx_usb_probe()
682 ucr->iobuf_dma); in rtsx_usb_probe()
688 struct rtsx_ucr *ucr = (struct rtsx_ucr *)usb_get_intfdata(intf); in rtsx_usb_disconnect() local
694 usb_set_intfdata(ucr->pusb_intf, NULL); in rtsx_usb_disconnect()
695 usb_free_coherent(ucr->pusb_dev, IOBUF_SIZE, ucr->iobuf, in rtsx_usb_disconnect()
696 ucr->iobuf_dma); in rtsx_usb_disconnect()
702 struct rtsx_ucr *ucr = in rtsx_usb_suspend() local
710 if (mutex_trylock(&ucr->dev_mutex)) { in rtsx_usb_suspend()
711 rtsx_usb_get_card_status(ucr, &val); in rtsx_usb_suspend()
712 mutex_unlock(&ucr->dev_mutex); in rtsx_usb_suspend()
733 struct rtsx_ucr *ucr = in rtsx_usb_reset_resume() local
736 rtsx_usb_reset_chip(ucr); in rtsx_usb_reset_resume()
751 struct rtsx_ucr *ucr = (struct rtsx_ucr *)usb_get_intfdata(intf); in rtsx_usb_pre_reset() local
753 mutex_lock(&ucr->dev_mutex); in rtsx_usb_pre_reset()
759 struct rtsx_ucr *ucr = (struct rtsx_ucr *)usb_get_intfdata(intf); in rtsx_usb_post_reset() local
761 mutex_unlock(&ucr->dev_mutex); in rtsx_usb_post_reset()