Lines Matching +full:rx +full:- +full:ping +full:- +full:pong
1 // SPDX-License-Identifier: GPL-2.0-only
4 * Copyright(c) 2009-2013 Realtek Semiconductor Corp. All rights reserved.
61 return &(host->pdev->dev); in sdmmc_dev()
66 struct rtsx_ucr *ucr = host->ucr; in sd_clear_error()
78 struct rtsx_ucr *ucr = host->ucr; in sd_print_debug_regs()
95 struct rtsx_ucr *ucr = host->ucr; in sd_read_data()
105 , cmd->opcode); in sd_read_data()
106 if (cmd->opcode == MMC_SEND_TUNING_BLOCK) in sd_read_data()
112 SD_CMD0, 0xFF, (u8)(cmd->opcode) | 0x40); in sd_read_data()
114 SD_CMD1, 0xFF, (u8)(cmd->arg >> 24)); in sd_read_data()
116 SD_CMD2, 0xFF, (u8)(cmd->arg >> 16)); in sd_read_data()
118 SD_CMD3, 0xFF, (u8)(cmd->arg >> 8)); in sd_read_data()
120 SD_CMD4, 0xFF, (u8)cmd->arg); in sd_read_data()
158 if (err || (ucr->rsp_buf[0] & SD_TRANSFER_ERR)) { in sd_read_data()
164 ucr->rsp_buf[0]); in sd_read_data()
165 err = -EIO; in sd_read_data()
175 cmd->resp[0] = get_unaligned_be32(ucr->rsp_buf + 1); in sd_read_data()
176 dev_dbg(sdmmc_dev(host), "cmd->resp[0] = 0x%08x\n", in sd_read_data()
177 cmd->resp[0]); in sd_read_data()
181 /* 2-byte aligned part */ in sd_read_data()
182 err = rtsx_usb_read_ppbuf(ucr, buf, byte_cnt - (byte_cnt % 2)); in sd_read_data()
193 buf + byte_cnt - 1); in sd_read_data()
202 struct rtsx_ucr *ucr = host->ucr; in sd_write_data()
224 cmd->opcode); in sd_write_data()
226 SD_CMD0, 0xFF, (u8)(cmd->opcode) | 0x40); in sd_write_data()
228 SD_CMD1, 0xFF, (u8)(cmd->arg >> 24)); in sd_write_data()
230 SD_CMD2, 0xFF, (u8)(cmd->arg >> 16)); in sd_write_data()
232 SD_CMD3, 0xFF, (u8)(cmd->arg >> 8)); in sd_write_data()
234 SD_CMD4, 0xFF, (u8)cmd->arg); in sd_write_data()
277 cmd->resp[0] = get_unaligned_be32(ucr->rsp_buf + 1); in sd_write_data()
278 dev_dbg(sdmmc_dev(host), "cmd->resp[0] = 0x%08x\n", in sd_write_data()
279 cmd->resp[0]); in sd_write_data()
288 struct rtsx_ucr *ucr = host->ucr; in sd_send_cmd_get_rsp()
289 u8 cmd_idx = (u8)cmd->opcode; in sd_send_cmd_get_rsp()
290 u32 arg = cmd->arg; in sd_send_cmd_get_rsp()
326 dev_dbg(sdmmc_dev(host), "cmd->flag is not valid\n"); in sd_send_cmd_get_rsp()
327 err = -EINVAL; in sd_send_cmd_get_rsp()
332 timeout = cmd->busy_timeout ? cmd->busy_timeout : 3000; in sd_send_cmd_get_rsp()
334 if (cmd->opcode == SD_SWITCH_VOLTAGE) { in sd_send_cmd_get_rsp()
360 /* Read data from ping-pong buffer */ in sd_send_cmd_get_rsp()
382 if (err || (ucr->rsp_buf[0] & SD_TRANSFER_ERR)) { in sd_send_cmd_get_rsp()
389 ucr->rsp_buf[0]); in sd_send_cmd_get_rsp()
390 err = -EIO; in sd_send_cmd_get_rsp()
405 ptr = ucr->rsp_buf + 1; in sd_send_cmd_get_rsp()
409 err = -EILSEQ; in sd_send_cmd_get_rsp()
417 err = -EILSEQ; in sd_send_cmd_get_rsp()
425 * The controller offloads the last byte {CRC-7, end bit 1'b1} in sd_send_cmd_get_rsp()
432 cmd->resp[i] = get_unaligned_be32(ptr + 1 + i * 4); in sd_send_cmd_get_rsp()
433 dev_dbg(sdmmc_dev(host), "cmd->resp[%d] = 0x%08x\n", in sd_send_cmd_get_rsp()
434 i, cmd->resp[i]); in sd_send_cmd_get_rsp()
437 cmd->resp[0] = get_unaligned_be32(ptr + 1); in sd_send_cmd_get_rsp()
438 dev_dbg(sdmmc_dev(host), "cmd->resp[0] = 0x%08x\n", in sd_send_cmd_get_rsp()
439 cmd->resp[0]); in sd_send_cmd_get_rsp()
443 cmd->error = err; in sd_send_cmd_get_rsp()
448 struct rtsx_ucr *ucr = host->ucr; in sd_rw_multi()
449 struct mmc_data *data = mrq->data; in sd_rw_multi()
450 int read = (data->flags & MMC_DATA_READ) ? 1 : 0; in sd_rw_multi()
454 size_t data_len = data->blksz * data->blocks; in sd_rw_multi()
476 0xFF, (u8)data->blocks); in sd_rw_multi()
478 0xFF, (u8)(data->blocks >> 8)); in sd_rw_multi()
514 pipe = usb_rcvbulkpipe(ucr->pusb_dev, EP_BULK_IN); in sd_rw_multi()
516 pipe = usb_sndbulkpipe(ucr->pusb_dev, EP_BULK_OUT); in sd_rw_multi()
518 err = rtsx_usb_transfer_data(ucr, pipe, data->sg, data_len, in sd_rw_multi()
519 data->sg_len, NULL, 10000); in sd_rw_multi()
532 rtsx_usb_write_register(host->ucr, SD_CFG1, in sd_enable_initial_mode()
538 rtsx_usb_write_register(host->ucr, SD_CFG1, in sd_disable_initial_mode()
545 struct mmc_command *cmd = mrq->cmd; in sd_normal_rw()
546 struct mmc_data *data = mrq->data; in sd_normal_rw()
549 buf = kzalloc(data->blksz, GFP_NOIO); in sd_normal_rw()
551 cmd->error = -ENOMEM; in sd_normal_rw()
555 if (data->flags & MMC_DATA_READ) { in sd_normal_rw()
556 if (host->initial_mode) in sd_normal_rw()
559 cmd->error = sd_read_data(host, cmd, (u16)data->blksz, buf, in sd_normal_rw()
560 data->blksz, 200); in sd_normal_rw()
562 if (host->initial_mode) in sd_normal_rw()
565 sg_copy_from_buffer(data->sg, data->sg_len, buf, data->blksz); in sd_normal_rw()
567 sg_copy_to_buffer(data->sg, data->sg_len, buf, data->blksz); in sd_normal_rw()
569 cmd->error = sd_write_data(host, cmd, (u16)data->blksz, buf, in sd_normal_rw()
570 data->blksz, 200); in sd_normal_rw()
578 struct rtsx_ucr *ucr = host->ucr; in sd_change_phase()
581 __func__, tx ? "TX" : "RX", sample_point); in sd_change_phase()
653 rtsx_usb_ep0_read_register(host->ucr, SD_DATA_STATE, &val); in sd_wait_data_idle()
689 for (i = MAX_PHASE; i >= 0; i--) { in sd_tuning_phase()
712 /* tuning RX phase */ in sd_tuning_rx()
722 dev_dbg(sdmmc_dev(host), "RX raw_phase_map[%d] = 0x%04x\n", in sd_tuning_rx()
726 dev_dbg(sdmmc_dev(host), "RX phase_map = 0x%04x\n", phase_map); in sd_tuning_rx()
731 return -EINVAL; in sd_tuning_rx()
737 return -EINVAL; in sd_tuning_rx()
746 struct rtsx_ucr *ucr = host->ucr; in sdmmc_get_ro()
750 if (host->host_removal) in sdmmc_get_ro()
751 return -ENOMEDIUM; in sdmmc_get_ro()
753 mutex_lock(&ucr->dev_mutex); in sdmmc_get_ro()
758 mutex_unlock(&ucr->dev_mutex); in sdmmc_get_ro()
761 /* Treat failed detection as non-ro */ in sdmmc_get_ro()
774 struct rtsx_ucr *ucr = host->ucr; in sdmmc_get_cd()
778 if (host->host_removal) in sdmmc_get_cd()
779 return -ENOMEDIUM; in sdmmc_get_cd()
781 mutex_lock(&ucr->dev_mutex); in sdmmc_get_cd()
786 mutex_unlock(&ucr->dev_mutex); in sdmmc_get_cd()
788 /* Treat failed detection as non-exist */ in sdmmc_get_cd()
793 host->card_exist = true; in sdmmc_get_cd()
798 host->card_exist = false; in sdmmc_get_cd()
805 struct rtsx_ucr *ucr = host->ucr; in sdmmc_request()
806 struct mmc_command *cmd = mrq->cmd; in sdmmc_request()
807 struct mmc_data *data = mrq->data; in sdmmc_request()
812 if (host->host_removal) { in sdmmc_request()
813 cmd->error = -ENOMEDIUM; in sdmmc_request()
817 if ((!host->card_exist)) { in sdmmc_request()
818 cmd->error = -ENOMEDIUM; in sdmmc_request()
822 mutex_lock(&ucr->dev_mutex); in sdmmc_request()
824 mutex_lock(&host->host_mutex); in sdmmc_request()
825 host->mrq = mrq; in sdmmc_request()
826 mutex_unlock(&host->host_mutex); in sdmmc_request()
828 if (mrq->data) in sdmmc_request()
829 data_size = data->blocks * data->blksz; in sdmmc_request()
833 } else if ((!(data_size % 512) && cmd->opcode != MMC_SEND_EXT_CSD) || in sdmmc_request()
834 mmc_op_multi(cmd->opcode)) { in sdmmc_request()
837 if (!cmd->error) { in sdmmc_request()
840 if (mmc_op_multi(cmd->opcode) && mrq->stop) { in sdmmc_request()
841 sd_send_cmd_get_rsp(host, mrq->stop); in sdmmc_request()
850 if (mrq->data) { in sdmmc_request()
851 if (cmd->error || data->error) in sdmmc_request()
852 data->bytes_xfered = 0; in sdmmc_request()
854 data->bytes_xfered = data->blocks * data->blksz; in sdmmc_request()
857 mutex_unlock(&ucr->dev_mutex); in sdmmc_request()
860 if (cmd->error) { in sdmmc_request()
866 dev_dbg(sdmmc_dev(host), "cmd->error = %d\n", cmd->error); in sdmmc_request()
870 mutex_lock(&host->host_mutex); in sdmmc_request()
871 host->mrq = NULL; in sdmmc_request()
872 mutex_unlock(&host->host_mutex); in sdmmc_request()
888 err = rtsx_usb_write_register(host->ucr, SD_CFG1, in sd_set_bus_width()
952 struct rtsx_ucr *ucr = host->ucr; in sd_power_on()
991 struct rtsx_ucr *ucr = host->ucr; in sd_power_off()
1021 if (power_mode == host->power_mode) in sd_set_power_mode()
1033 host->power_mode = power_mode; in sd_set_power_mode()
1041 struct rtsx_ucr *ucr = host->ucr; in sd_set_timing()
1102 struct rtsx_ucr *ucr = host->ucr; in sdmmc_set_ios()
1105 mutex_lock(&ucr->dev_mutex); in sdmmc_set_ios()
1107 sd_set_power_mode(host, ios->power_mode); in sdmmc_set_ios()
1108 sd_set_bus_width(host, ios->bus_width); in sdmmc_set_ios()
1109 sd_set_timing(host, ios->timing, &host->ddr_mode); in sdmmc_set_ios()
1111 host->vpclk = false; in sdmmc_set_ios()
1112 host->double_clk = true; in sdmmc_set_ios()
1114 switch (ios->timing) { in sdmmc_set_ios()
1117 host->ssc_depth = SSC_DEPTH_2M; in sdmmc_set_ios()
1118 host->vpclk = true; in sdmmc_set_ios()
1119 host->double_clk = false; in sdmmc_set_ios()
1123 host->ssc_depth = SSC_DEPTH_1M; in sdmmc_set_ios()
1126 host->ssc_depth = SSC_DEPTH_512K; in sdmmc_set_ios()
1130 host->initial_mode = (ios->clock <= 1000000) ? true : false; in sdmmc_set_ios()
1131 host->clock = ios->clock; in sdmmc_set_ios()
1133 rtsx_usb_switch_clock(host->ucr, host->clock, host->ssc_depth, in sdmmc_set_ios()
1134 host->initial_mode, host->double_clk, host->vpclk); in sdmmc_set_ios()
1136 mutex_unlock(&ucr->dev_mutex); in sdmmc_set_ios()
1143 struct rtsx_ucr *ucr = host->ucr; in sdmmc_switch_voltage()
1147 __func__, ios->signal_voltage); in sdmmc_switch_voltage()
1149 if (host->host_removal) in sdmmc_switch_voltage()
1150 return -ENOMEDIUM; in sdmmc_switch_voltage()
1152 if (ios->signal_voltage == MMC_SIGNAL_VOLTAGE_120) in sdmmc_switch_voltage()
1153 return -EPERM; in sdmmc_switch_voltage()
1155 mutex_lock(&ucr->dev_mutex); in sdmmc_switch_voltage()
1159 mutex_unlock(&ucr->dev_mutex); in sdmmc_switch_voltage()
1163 /* Let mmc core do the busy checking, simply stop the forced-toggle in sdmmc_switch_voltage()
1168 if (ios->signal_voltage == MMC_SIGNAL_VOLTAGE_330) { in sdmmc_switch_voltage()
1184 mutex_unlock(&ucr->dev_mutex); in sdmmc_switch_voltage()
1192 struct rtsx_ucr *ucr = host->ucr; in sdmmc_card_busy()
1200 mutex_lock(&ucr->dev_mutex); in sdmmc_card_busy()
1217 mutex_unlock(&ucr->dev_mutex); in sdmmc_card_busy()
1232 struct rtsx_ucr *ucr = host->ucr; in sdmmc_execute_tuning()
1235 if (host->host_removal) in sdmmc_execute_tuning()
1236 return -ENOMEDIUM; in sdmmc_execute_tuning()
1238 mutex_lock(&ucr->dev_mutex); in sdmmc_execute_tuning()
1240 if (!host->ddr_mode) in sdmmc_execute_tuning()
1243 mutex_unlock(&ucr->dev_mutex); in sdmmc_execute_tuning()
1265 if (host->host_removal) in rtsx_usb_led_control()
1268 host->led.brightness = brightness; in rtsx_usb_led_control()
1269 schedule_work(&host->led_work); in rtsx_usb_led_control()
1276 struct rtsx_ucr *ucr = host->ucr; in rtsx_usb_update_led()
1279 mutex_lock(&ucr->dev_mutex); in rtsx_usb_update_led()
1281 if (host->power_mode == MMC_POWER_OFF) in rtsx_usb_update_led()
1284 if (host->led.brightness == LED_OFF) in rtsx_usb_update_led()
1290 mutex_unlock(&ucr->dev_mutex); in rtsx_usb_update_led()
1297 struct mmc_host *mmc = host->mmc; in rtsx_usb_init_host()
1299 mmc->f_min = 250000; in rtsx_usb_init_host()
1300 mmc->f_max = 208000000; in rtsx_usb_init_host()
1301 mmc->ocr_avail = MMC_VDD_32_33 | MMC_VDD_33_34 | MMC_VDD_165_195; in rtsx_usb_init_host()
1302 mmc->caps = MMC_CAP_4_BIT_DATA | MMC_CAP_SD_HIGHSPEED | in rtsx_usb_init_host()
1306 mmc->caps2 = MMC_CAP2_NO_PRESCAN_POWERUP | MMC_CAP2_FULL_PWR_CYCLE | in rtsx_usb_init_host()
1309 mmc->max_current_330 = 400; in rtsx_usb_init_host()
1310 mmc->max_current_180 = 800; in rtsx_usb_init_host()
1311 mmc->ops = &rtsx_usb_sdmmc_ops; in rtsx_usb_init_host()
1312 mmc->max_segs = 256; in rtsx_usb_init_host()
1313 mmc->max_seg_size = 65536; in rtsx_usb_init_host()
1314 mmc->max_blk_size = 512; in rtsx_usb_init_host()
1315 mmc->max_blk_count = 65535; in rtsx_usb_init_host()
1316 mmc->max_req_size = 524288; in rtsx_usb_init_host()
1318 host->power_mode = MMC_POWER_OFF; in rtsx_usb_init_host()
1331 ucr = usb_get_intfdata(to_usb_interface(pdev->dev.parent)); in rtsx_usb_sdmmc_drv_probe()
1333 return -ENXIO; in rtsx_usb_sdmmc_drv_probe()
1335 dev_dbg(&(pdev->dev), ": Realtek USB SD/MMC controller found\n"); in rtsx_usb_sdmmc_drv_probe()
1337 mmc = mmc_alloc_host(sizeof(*host), &pdev->dev); in rtsx_usb_sdmmc_drv_probe()
1339 return -ENOMEM; in rtsx_usb_sdmmc_drv_probe()
1342 host->ucr = ucr; in rtsx_usb_sdmmc_drv_probe()
1343 host->mmc = mmc; in rtsx_usb_sdmmc_drv_probe()
1344 host->pdev = pdev; in rtsx_usb_sdmmc_drv_probe()
1347 mutex_init(&host->host_mutex); in rtsx_usb_sdmmc_drv_probe()
1349 pm_runtime_enable(&pdev->dev); in rtsx_usb_sdmmc_drv_probe()
1352 snprintf(host->led_name, sizeof(host->led_name), in rtsx_usb_sdmmc_drv_probe()
1354 host->led.name = host->led_name; in rtsx_usb_sdmmc_drv_probe()
1355 host->led.brightness = LED_OFF; in rtsx_usb_sdmmc_drv_probe()
1356 host->led.default_trigger = mmc_hostname(mmc); in rtsx_usb_sdmmc_drv_probe()
1357 host->led.brightness_set = rtsx_usb_led_control; in rtsx_usb_sdmmc_drv_probe()
1359 err = led_classdev_register(mmc_dev(mmc), &host->led); in rtsx_usb_sdmmc_drv_probe()
1361 dev_err(&(pdev->dev), in rtsx_usb_sdmmc_drv_probe()
1363 INIT_WORK(&host->led_work, rtsx_usb_update_led); in rtsx_usb_sdmmc_drv_probe()
1369 led_classdev_unregister(&host->led); in rtsx_usb_sdmmc_drv_probe()
1372 pm_runtime_disable(&pdev->dev); in rtsx_usb_sdmmc_drv_probe()
1387 mmc = host->mmc; in rtsx_usb_sdmmc_drv_remove()
1388 host->host_removal = true; in rtsx_usb_sdmmc_drv_remove()
1390 mutex_lock(&host->host_mutex); in rtsx_usb_sdmmc_drv_remove()
1391 if (host->mrq) { in rtsx_usb_sdmmc_drv_remove()
1392 dev_dbg(&(pdev->dev), in rtsx_usb_sdmmc_drv_remove()
1395 host->mrq->cmd->error = -ENOMEDIUM; in rtsx_usb_sdmmc_drv_remove()
1396 if (host->mrq->stop) in rtsx_usb_sdmmc_drv_remove()
1397 host->mrq->stop->error = -ENOMEDIUM; in rtsx_usb_sdmmc_drv_remove()
1398 mmc_request_done(mmc, host->mrq); in rtsx_usb_sdmmc_drv_remove()
1400 mutex_unlock(&host->host_mutex); in rtsx_usb_sdmmc_drv_remove()
1405 cancel_work_sync(&host->led_work); in rtsx_usb_sdmmc_drv_remove()
1406 led_classdev_unregister(&host->led); in rtsx_usb_sdmmc_drv_remove()
1410 pm_runtime_disable(&pdev->dev); in rtsx_usb_sdmmc_drv_remove()
1413 dev_dbg(&(pdev->dev), in rtsx_usb_sdmmc_drv_remove()
1422 host->mmc->caps &= ~MMC_CAP_NEEDS_POLL; in rtsx_usb_sdmmc_runtime_suspend()
1430 host->mmc->caps |= MMC_CAP_NEEDS_POLL; in rtsx_usb_sdmmc_runtime_resume()
1431 if (sdmmc_get_cd(host->mmc) == 1) in rtsx_usb_sdmmc_runtime_resume()
1432 mmc_detect_change(host->mmc, 0); in rtsx_usb_sdmmc_runtime_resume()