Lines Matching +full:ssc +full:- +full:internal
1 // SPDX-License-Identifier: GPL-2.0-only
4 * Copyright(c) 2009-2013 Realtek Semiconductor Corp. All rights reserved.
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()
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()
57 ret = -ETIMEDOUT; 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()
79 return usb_bulk_msg(ucr->pusb_dev, pipe, buf, len, act_len, in rtsx_usb_transfer_data()
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()
107 return -EINVAL; in rtsx_usb_seq_write_register()
110 return -EINVAL; in rtsx_usb_seq_write_register()
113 memcpy(ucr->cmd_buf + SEQ_WRITE_DATA_OFFSET, data, len); 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()
125 u16 res_len = len - rsp_len; in rtsx_usb_seq_read_register()
128 return -EINVAL; in rtsx_usb_seq_read_register()
130 /* 4-byte aligned part */ 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()
140 usb_rcvbulkpipe(ucr->pusb_dev, EP_BULK_IN), in rtsx_usb_seq_read_register()
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()
192 return -EINVAL; in rtsx_usb_ep0_read_register()
196 return -ENOMEM; in rtsx_usb_ep0_read_register()
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()
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()
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()
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()
255 return -EINVAL; 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()
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()
292 return -EINVAL; in rtsx_usb_get_card_status()
297 return -ENOMEM; in rtsx_usb_get_card_status()
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()
321 dev_dbg(&ucr->pusb_intf->dev, "Write 0x%x to phy register 0x%x\n", in rtsx_usb_write_phy_register()
366 *data = ucr->rsp_buf[0]; in rtsx_usb_read_register()
374 return (depth > 1) ? (depth - 1) : depth; in double_ssc_depth()
380 if (ssc_depth > div - 1) in revise_ssc_depth()
381 ssc_depth -= (div - 1); in revise_ssc_depth()
396 ucr->cur_clk = 0; 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()
420 "Internal SSC clock: %dMHz (cur_clk = %d)\n", 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()
426 /* Converting clock value into internal settings: n and div */ in rtsx_usb_switch_clock()
427 n = card_clock - 2; in rtsx_usb_switch_clock()
429 return -EINVAL; in rtsx_usb_switch_clock()
435 /* Make sure that the SSC clock div_n is not less than MIN_DIV_N */ in rtsx_usb_switch_clock()
439 n = (n + 2) * 2 - 2; 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()
475 /* Wait SSC clock stable */ in rtsx_usb_switch_clock()
482 ucr->cur_clk = card_clock; in rtsx_usb_switch_clock()
506 return -EIO; in rtsx_usb_card_exclusive_check()
542 if (ucr->is_rts5179) in rtsx_usb_reset_chip()
556 /* config non-crystal mode */ in rtsx_usb_reset_chip()
574 /* power on SSC */ in rtsx_usb_init_chip()
590 ucr->ic_version = val & HW_VER_MASK; 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()
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()
624 dev_dbg(&intf->dev, in rtsx_usb_probe()
626 usb_dev->bus->busnum, usb_dev->devnum); in rtsx_usb_probe()
628 ucr = devm_kzalloc(&intf->dev, sizeof(*ucr), GFP_KERNEL); in rtsx_usb_probe()
630 return -ENOMEM; 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()
636 return -ENOMEM; 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()
640 ret = -ENOMEM; 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()
659 timer_setup(&ucr->sg_timer, rtsx_usb_sg_timed_out, 0); in rtsx_usb_probe()
661 ret = mfd_add_hotplug_devices(&intf->dev, rtsx_usb_cells, in rtsx_usb_probe()
667 intf->needs_remote_wakeup = 1; 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()
687 dev_dbg(&intf->dev, "%s called\n", __func__); in rtsx_usb_disconnect()
689 mfd_remove_devices(&intf->dev); in rtsx_usb_disconnect()
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()
707 dev_dbg(&intf->dev, "%s called with pm message 0x%04x\n", in rtsx_usb_suspend()
711 if (mutex_trylock(&ucr->dev_mutex)) { in rtsx_usb_suspend()
713 mutex_unlock(&ucr->dev_mutex); in rtsx_usb_suspend()
717 return -EAGAIN; in rtsx_usb_suspend()
720 return -EAGAIN; in rtsx_usb_suspend()
735 device_for_each_child(&intf->dev, NULL, rtsx_usb_resume_child); in rtsx_usb_resume()
745 device_for_each_child(&intf->dev, NULL, rtsx_usb_resume_child); in rtsx_usb_reset_resume()
762 mutex_lock(&ucr->dev_mutex); in rtsx_usb_pre_reset()
770 mutex_unlock(&ucr->dev_mutex); in rtsx_usb_post_reset()