blob: 7ffb5cba30a9f44cf8476e8ae068389ea87aaf16 [file] [log] [blame]
Wei WANGff984e52012-10-29 13:49:38 +08001/* Realtek PCI-Express SD/MMC Card Interface driver
2 *
3 * Copyright(c) 2009 Realtek Semiconductor Corp. All rights reserved.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License as published by the
7 * Free Software Foundation; either version 2, or (at your option) any
8 * later version.
9 *
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License along
16 * with this program; if not, see <http://www.gnu.org/licenses/>.
17 *
18 * Author:
19 * Wei WANG <wei_wang@realsil.com.cn>
20 * No. 450, Shenhu Road, Suzhou Industry Park, Suzhou, China
21 */
22
23#include <linux/module.h>
Wei WANG433e0752012-11-20 11:24:44 +080024#include <linux/slab.h>
Wei WANGff984e52012-10-29 13:49:38 +080025#include <linux/highmem.h>
26#include <linux/delay.h>
27#include <linux/platform_device.h>
28#include <linux/mmc/host.h>
29#include <linux/mmc/mmc.h>
30#include <linux/mmc/sd.h>
31#include <linux/mmc/card.h>
32#include <linux/mfd/rtsx_pci.h>
33#include <asm/unaligned.h>
34
35/* SD Tuning Data Structure
36 * Record continuous timing phase path
37 */
38struct timing_phase_path {
39 int start;
40 int end;
41 int mid;
42 int len;
43};
44
45struct realtek_pci_sdmmc {
46 struct platform_device *pdev;
47 struct rtsx_pcr *pcr;
48 struct mmc_host *mmc;
49 struct mmc_request *mrq;
50
51 struct mutex host_mutex;
52
53 u8 ssc_depth;
54 unsigned int clock;
55 bool vpclk;
56 bool double_clk;
57 bool eject;
58 bool initial_mode;
59 bool ddr_mode;
Wei WANGd88691b2013-03-08 15:05:57 +080060 int power_state;
61#define SDMMC_POWER_ON 1
62#define SDMMC_POWER_OFF 0
Wei WANGff984e52012-10-29 13:49:38 +080063};
64
65static inline struct device *sdmmc_dev(struct realtek_pci_sdmmc *host)
66{
67 return &(host->pdev->dev);
68}
69
70static inline void sd_clear_error(struct realtek_pci_sdmmc *host)
71{
72 rtsx_pci_write_register(host->pcr, CARD_STOP,
73 SD_STOP | SD_CLR_ERR, SD_STOP | SD_CLR_ERR);
74}
75
76#ifdef DEBUG
77static void sd_print_debug_regs(struct realtek_pci_sdmmc *host)
78{
79 struct rtsx_pcr *pcr = host->pcr;
80 u16 i;
81 u8 *ptr;
82
83 /* Print SD host internal registers */
84 rtsx_pci_init_cmd(pcr);
85 for (i = 0xFDA0; i <= 0xFDAE; i++)
86 rtsx_pci_add_cmd(pcr, READ_REG_CMD, i, 0, 0);
87 for (i = 0xFD52; i <= 0xFD69; i++)
88 rtsx_pci_add_cmd(pcr, READ_REG_CMD, i, 0, 0);
89 rtsx_pci_send_cmd(pcr, 100);
90
91 ptr = rtsx_pci_get_cmd_data(pcr);
92 for (i = 0xFDA0; i <= 0xFDAE; i++)
93 dev_dbg(sdmmc_dev(host), "0x%04X: 0x%02x\n", i, *(ptr++));
94 for (i = 0xFD52; i <= 0xFD69; i++)
95 dev_dbg(sdmmc_dev(host), "0x%04X: 0x%02x\n", i, *(ptr++));
96}
97#else
98#define sd_print_debug_regs(host)
99#endif /* DEBUG */
100
101static int sd_read_data(struct realtek_pci_sdmmc *host, u8 *cmd, u16 byte_cnt,
102 u8 *buf, int buf_len, int timeout)
103{
104 struct rtsx_pcr *pcr = host->pcr;
105 int err, i;
106 u8 trans_mode;
107
108 dev_dbg(sdmmc_dev(host), "%s: SD/MMC CMD%d\n", __func__, cmd[0] - 0x40);
109
110 if (!buf)
111 buf_len = 0;
112
113 if ((cmd[0] & 0x3F) == MMC_SEND_TUNING_BLOCK)
114 trans_mode = SD_TM_AUTO_TUNING;
115 else
116 trans_mode = SD_TM_NORMAL_READ;
117
118 rtsx_pci_init_cmd(pcr);
119
120 for (i = 0; i < 5; i++)
121 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, SD_CMD0 + i, 0xFF, cmd[i]);
122
123 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, SD_BYTE_CNT_L, 0xFF, (u8)byte_cnt);
124 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, SD_BYTE_CNT_H,
125 0xFF, (u8)(byte_cnt >> 8));
126 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, SD_BLOCK_CNT_L, 0xFF, 1);
127 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, SD_BLOCK_CNT_H, 0xFF, 0);
128
129 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, SD_CFG2, 0xFF,
130 SD_CALCULATE_CRC7 | SD_CHECK_CRC16 |
131 SD_NO_WAIT_BUSY_END | SD_CHECK_CRC7 | SD_RSP_LEN_6);
132 if (trans_mode != SD_TM_AUTO_TUNING)
133 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD,
134 CARD_DATA_SOURCE, 0x01, PINGPONG_BUFFER);
135
136 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, SD_TRANSFER,
137 0xFF, trans_mode | SD_TRANSFER_START);
138 rtsx_pci_add_cmd(pcr, CHECK_REG_CMD, SD_TRANSFER,
139 SD_TRANSFER_END, SD_TRANSFER_END);
140
141 err = rtsx_pci_send_cmd(pcr, timeout);
142 if (err < 0) {
143 sd_print_debug_regs(host);
144 dev_dbg(sdmmc_dev(host),
145 "rtsx_pci_send_cmd fail (err = %d)\n", err);
146 return err;
147 }
148
149 if (buf && buf_len) {
150 err = rtsx_pci_read_ppbuf(pcr, buf, buf_len);
151 if (err < 0) {
152 dev_dbg(sdmmc_dev(host),
153 "rtsx_pci_read_ppbuf fail (err = %d)\n", err);
154 return err;
155 }
156 }
157
158 return 0;
159}
160
161static int sd_write_data(struct realtek_pci_sdmmc *host, u8 *cmd, u16 byte_cnt,
162 u8 *buf, int buf_len, int timeout)
163{
164 struct rtsx_pcr *pcr = host->pcr;
165 int err, i;
166 u8 trans_mode;
167
168 if (!buf)
169 buf_len = 0;
170
171 if (buf && buf_len) {
172 err = rtsx_pci_write_ppbuf(pcr, buf, buf_len);
173 if (err < 0) {
174 dev_dbg(sdmmc_dev(host),
175 "rtsx_pci_write_ppbuf fail (err = %d)\n", err);
176 return err;
177 }
178 }
179
180 trans_mode = cmd ? SD_TM_AUTO_WRITE_2 : SD_TM_AUTO_WRITE_3;
181 rtsx_pci_init_cmd(pcr);
182
183 if (cmd) {
184 dev_dbg(sdmmc_dev(host), "%s: SD/MMC CMD %d\n", __func__,
185 cmd[0] - 0x40);
186
187 for (i = 0; i < 5; i++)
188 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD,
189 SD_CMD0 + i, 0xFF, cmd[i]);
190 }
191
192 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, SD_BYTE_CNT_L, 0xFF, (u8)byte_cnt);
193 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, SD_BYTE_CNT_H,
194 0xFF, (u8)(byte_cnt >> 8));
195 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, SD_BLOCK_CNT_L, 0xFF, 1);
196 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, SD_BLOCK_CNT_H, 0xFF, 0);
197
198 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, SD_CFG2, 0xFF,
199 SD_CALCULATE_CRC7 | SD_CHECK_CRC16 |
200 SD_NO_WAIT_BUSY_END | SD_CHECK_CRC7 | SD_RSP_LEN_6);
201
202 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, SD_TRANSFER, 0xFF,
203 trans_mode | SD_TRANSFER_START);
204 rtsx_pci_add_cmd(pcr, CHECK_REG_CMD, SD_TRANSFER,
205 SD_TRANSFER_END, SD_TRANSFER_END);
206
207 err = rtsx_pci_send_cmd(pcr, timeout);
208 if (err < 0) {
209 sd_print_debug_regs(host);
210 dev_dbg(sdmmc_dev(host),
211 "rtsx_pci_send_cmd fail (err = %d)\n", err);
212 return err;
213 }
214
215 return 0;
216}
217
218static void sd_send_cmd_get_rsp(struct realtek_pci_sdmmc *host,
219 struct mmc_command *cmd)
220{
221 struct rtsx_pcr *pcr = host->pcr;
222 u8 cmd_idx = (u8)cmd->opcode;
223 u32 arg = cmd->arg;
224 int err = 0;
225 int timeout = 100;
226 int i;
227 u8 *ptr;
228 int stat_idx = 0;
229 u8 rsp_type;
230 int rsp_len = 5;
231
232 dev_dbg(sdmmc_dev(host), "%s: SD/MMC CMD %d, arg = 0x%08x\n",
233 __func__, cmd_idx, arg);
234
235 /* Response type:
236 * R0
237 * R1, R5, R6, R7
238 * R1b
239 * R2
240 * R3, R4
241 */
242 switch (mmc_resp_type(cmd)) {
243 case MMC_RSP_NONE:
244 rsp_type = SD_RSP_TYPE_R0;
245 rsp_len = 0;
246 break;
247 case MMC_RSP_R1:
248 rsp_type = SD_RSP_TYPE_R1;
249 break;
Micky Ching8ccd5df2014-03-27 13:35:04 +0800250 case MMC_RSP_R1 & ~MMC_RSP_CRC:
251 rsp_type = SD_RSP_TYPE_R1 | SD_NO_CHECK_CRC7;
252 break;
Wei WANGff984e52012-10-29 13:49:38 +0800253 case MMC_RSP_R1B:
254 rsp_type = SD_RSP_TYPE_R1b;
255 break;
256 case MMC_RSP_R2:
257 rsp_type = SD_RSP_TYPE_R2;
258 rsp_len = 16;
259 break;
260 case MMC_RSP_R3:
261 rsp_type = SD_RSP_TYPE_R3;
262 break;
263 default:
264 dev_dbg(sdmmc_dev(host), "cmd->flag is not valid\n");
265 err = -EINVAL;
266 goto out;
267 }
268
269 if (rsp_type == SD_RSP_TYPE_R1b)
270 timeout = 3000;
271
272 if (cmd->opcode == SD_SWITCH_VOLTAGE) {
273 err = rtsx_pci_write_register(pcr, SD_BUS_STAT,
274 0xFF, SD_CLK_TOGGLE_EN);
275 if (err < 0)
276 goto out;
277 }
278
279 rtsx_pci_init_cmd(pcr);
280
281 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, SD_CMD0, 0xFF, 0x40 | cmd_idx);
282 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, SD_CMD1, 0xFF, (u8)(arg >> 24));
283 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, SD_CMD2, 0xFF, (u8)(arg >> 16));
284 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, SD_CMD3, 0xFF, (u8)(arg >> 8));
285 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, SD_CMD4, 0xFF, (u8)arg);
286
287 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, SD_CFG2, 0xFF, rsp_type);
288 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, CARD_DATA_SOURCE,
289 0x01, PINGPONG_BUFFER);
290 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, SD_TRANSFER,
291 0xFF, SD_TM_CMD_RSP | SD_TRANSFER_START);
292 rtsx_pci_add_cmd(pcr, CHECK_REG_CMD, SD_TRANSFER,
293 SD_TRANSFER_END | SD_STAT_IDLE,
294 SD_TRANSFER_END | SD_STAT_IDLE);
295
296 if (rsp_type == SD_RSP_TYPE_R2) {
297 /* Read data from ping-pong buffer */
298 for (i = PPBUF_BASE2; i < PPBUF_BASE2 + 16; i++)
299 rtsx_pci_add_cmd(pcr, READ_REG_CMD, (u16)i, 0, 0);
300 stat_idx = 16;
301 } else if (rsp_type != SD_RSP_TYPE_R0) {
302 /* Read data from SD_CMDx registers */
303 for (i = SD_CMD0; i <= SD_CMD4; i++)
304 rtsx_pci_add_cmd(pcr, READ_REG_CMD, (u16)i, 0, 0);
305 stat_idx = 5;
306 }
307
308 rtsx_pci_add_cmd(pcr, READ_REG_CMD, SD_STAT1, 0, 0);
309
310 err = rtsx_pci_send_cmd(pcr, timeout);
311 if (err < 0) {
312 sd_print_debug_regs(host);
313 sd_clear_error(host);
314 dev_dbg(sdmmc_dev(host),
315 "rtsx_pci_send_cmd error (err = %d)\n", err);
316 goto out;
317 }
318
319 if (rsp_type == SD_RSP_TYPE_R0) {
320 err = 0;
321 goto out;
322 }
323
324 /* Eliminate returned value of CHECK_REG_CMD */
325 ptr = rtsx_pci_get_cmd_data(pcr) + 1;
326
327 /* Check (Start,Transmission) bit of Response */
328 if ((ptr[0] & 0xC0) != 0) {
329 err = -EILSEQ;
330 dev_dbg(sdmmc_dev(host), "Invalid response bit\n");
331 goto out;
332 }
333
334 /* Check CRC7 */
335 if (!(rsp_type & SD_NO_CHECK_CRC7)) {
336 if (ptr[stat_idx] & SD_CRC7_ERR) {
337 err = -EILSEQ;
338 dev_dbg(sdmmc_dev(host), "CRC7 error\n");
339 goto out;
340 }
341 }
342
343 if (rsp_type == SD_RSP_TYPE_R2) {
344 for (i = 0; i < 4; i++) {
345 cmd->resp[i] = get_unaligned_be32(ptr + 1 + i * 4);
346 dev_dbg(sdmmc_dev(host), "cmd->resp[%d] = 0x%08x\n",
347 i, cmd->resp[i]);
348 }
349 } else {
350 cmd->resp[0] = get_unaligned_be32(ptr + 1);
351 dev_dbg(sdmmc_dev(host), "cmd->resp[0] = 0x%08x\n",
352 cmd->resp[0]);
353 }
354
355out:
356 cmd->error = err;
357}
358
359static int sd_rw_multi(struct realtek_pci_sdmmc *host, struct mmc_request *mrq)
360{
361 struct rtsx_pcr *pcr = host->pcr;
362 struct mmc_host *mmc = host->mmc;
363 struct mmc_card *card = mmc->card;
364 struct mmc_data *data = mrq->data;
365 int uhs = mmc_sd_card_uhs(card);
366 int read = (data->flags & MMC_DATA_READ) ? 1 : 0;
367 u8 cfg2, trans_mode;
368 int err;
369 size_t data_len = data->blksz * data->blocks;
370
371 if (read) {
372 cfg2 = SD_CALCULATE_CRC7 | SD_CHECK_CRC16 |
373 SD_NO_WAIT_BUSY_END | SD_CHECK_CRC7 | SD_RSP_LEN_0;
374 trans_mode = SD_TM_AUTO_READ_3;
375 } else {
376 cfg2 = SD_NO_CALCULATE_CRC7 | SD_CHECK_CRC16 |
377 SD_NO_WAIT_BUSY_END | SD_NO_CHECK_CRC7 | SD_RSP_LEN_0;
378 trans_mode = SD_TM_AUTO_WRITE_3;
379 }
380
381 if (!uhs)
382 cfg2 |= SD_NO_CHECK_WAIT_CRC_TO;
383
384 rtsx_pci_init_cmd(pcr);
385
386 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, SD_BYTE_CNT_L, 0xFF, 0x00);
387 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, SD_BYTE_CNT_H, 0xFF, 0x02);
388 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, SD_BLOCK_CNT_L,
389 0xFF, (u8)data->blocks);
390 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, SD_BLOCK_CNT_H,
391 0xFF, (u8)(data->blocks >> 8));
Wei WANGff984e52012-10-29 13:49:38 +0800392
393 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, IRQSTAT0,
394 DMA_DONE_INT, DMA_DONE_INT);
395 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, DMATC3,
396 0xFF, (u8)(data_len >> 24));
397 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, DMATC2,
398 0xFF, (u8)(data_len >> 16));
399 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, DMATC1,
400 0xFF, (u8)(data_len >> 8));
401 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, DMATC0, 0xFF, (u8)data_len);
402 if (read) {
403 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, DMACTL,
404 0x03 | DMA_PACK_SIZE_MASK,
405 DMA_DIR_FROM_CARD | DMA_EN | DMA_512);
406 } else {
407 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, DMACTL,
408 0x03 | DMA_PACK_SIZE_MASK,
409 DMA_DIR_TO_CARD | DMA_EN | DMA_512);
410 }
411
412 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, CARD_DATA_SOURCE,
413 0x01, RING_BUFFER);
414
Wei WANG38d324df2012-11-20 11:24:36 +0800415 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, SD_CFG2, 0xFF, cfg2);
Wei WANGff984e52012-10-29 13:49:38 +0800416 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, SD_TRANSFER, 0xFF,
417 trans_mode | SD_TRANSFER_START);
418 rtsx_pci_add_cmd(pcr, CHECK_REG_CMD, SD_TRANSFER,
419 SD_TRANSFER_END, SD_TRANSFER_END);
420
421 rtsx_pci_send_cmd_no_wait(pcr);
422
423 err = rtsx_pci_transfer_data(pcr, data->sg, data->sg_len, read, 10000);
424 if (err < 0) {
425 sd_clear_error(host);
426 return err;
427 }
428
429 return 0;
430}
431
432static inline void sd_enable_initial_mode(struct realtek_pci_sdmmc *host)
433{
434 rtsx_pci_write_register(host->pcr, SD_CFG1,
435 SD_CLK_DIVIDE_MASK, SD_CLK_DIVIDE_128);
436}
437
438static inline void sd_disable_initial_mode(struct realtek_pci_sdmmc *host)
439{
440 rtsx_pci_write_register(host->pcr, SD_CFG1,
441 SD_CLK_DIVIDE_MASK, SD_CLK_DIVIDE_0);
442}
443
444static void sd_normal_rw(struct realtek_pci_sdmmc *host,
445 struct mmc_request *mrq)
446{
447 struct mmc_command *cmd = mrq->cmd;
448 struct mmc_data *data = mrq->data;
449 u8 _cmd[5], *buf;
450
451 _cmd[0] = 0x40 | (u8)cmd->opcode;
452 put_unaligned_be32(cmd->arg, (u32 *)(&_cmd[1]));
453
454 buf = kzalloc(data->blksz, GFP_NOIO);
455 if (!buf) {
456 cmd->error = -ENOMEM;
457 return;
458 }
459
460 if (data->flags & MMC_DATA_READ) {
461 if (host->initial_mode)
462 sd_disable_initial_mode(host);
463
464 cmd->error = sd_read_data(host, _cmd, (u16)data->blksz, buf,
465 data->blksz, 200);
466
467 if (host->initial_mode)
468 sd_enable_initial_mode(host);
469
470 sg_copy_from_buffer(data->sg, data->sg_len, buf, data->blksz);
471 } else {
472 sg_copy_to_buffer(data->sg, data->sg_len, buf, data->blksz);
473
474 cmd->error = sd_write_data(host, _cmd, (u16)data->blksz, buf,
475 data->blksz, 200);
476 }
477
478 kfree(buf);
479}
480
481static int sd_change_phase(struct realtek_pci_sdmmc *host, u8 sample_point)
482{
483 struct rtsx_pcr *pcr = host->pcr;
484 int err;
485
486 dev_dbg(sdmmc_dev(host), "%s: sample_point = %d\n",
487 __func__, sample_point);
488
489 rtsx_pci_init_cmd(pcr);
490
491 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, CLK_CTL, CHANGE_CLK, CHANGE_CLK);
492 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, SD_VPRX_CTL, 0x1F, sample_point);
493 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, SD_VPCLK0_CTL, PHASE_NOT_RESET, 0);
494 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, SD_VPCLK0_CTL,
495 PHASE_NOT_RESET, PHASE_NOT_RESET);
496 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, CLK_CTL, CHANGE_CLK, 0);
497 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, SD_CFG1, SD_ASYNC_FIFO_NOT_RST, 0);
498
499 err = rtsx_pci_send_cmd(pcr, 100);
500 if (err < 0)
501 return err;
502
503 return 0;
504}
505
506static u8 sd_search_final_phase(struct realtek_pci_sdmmc *host, u32 phase_map)
507{
508 struct timing_phase_path path[MAX_PHASE + 1];
509 int i, j, cont_path_cnt;
510 int new_block, max_len, final_path_idx;
511 u8 final_phase = 0xFF;
512
513 /* Parse phase_map, take it as a bit-ring */
514 cont_path_cnt = 0;
515 new_block = 1;
516 j = 0;
517 for (i = 0; i < MAX_PHASE + 1; i++) {
518 if (phase_map & (1 << i)) {
519 if (new_block) {
520 new_block = 0;
521 j = cont_path_cnt++;
522 path[j].start = i;
523 path[j].end = i;
524 } else {
525 path[j].end = i;
526 }
527 } else {
528 new_block = 1;
529 if (cont_path_cnt) {
530 /* Calculate path length and middle point */
531 int idx = cont_path_cnt - 1;
532 path[idx].len =
533 path[idx].end - path[idx].start + 1;
534 path[idx].mid =
535 path[idx].start + path[idx].len / 2;
536 }
537 }
538 }
539
540 if (cont_path_cnt == 0) {
541 dev_dbg(sdmmc_dev(host), "No continuous phase path\n");
542 goto finish;
543 } else {
544 /* Calculate last continuous path length and middle point */
545 int idx = cont_path_cnt - 1;
546 path[idx].len = path[idx].end - path[idx].start + 1;
547 path[idx].mid = path[idx].start + path[idx].len / 2;
548 }
549
550 /* Connect the first and last continuous paths if they are adjacent */
551 if (!path[0].start && (path[cont_path_cnt - 1].end == MAX_PHASE)) {
552 /* Using negative index */
553 path[0].start = path[cont_path_cnt - 1].start - MAX_PHASE - 1;
554 path[0].len += path[cont_path_cnt - 1].len;
555 path[0].mid = path[0].start + path[0].len / 2;
556 /* Convert negative middle point index to positive one */
557 if (path[0].mid < 0)
558 path[0].mid += MAX_PHASE + 1;
559 cont_path_cnt--;
560 }
561
562 /* Choose the longest continuous phase path */
563 max_len = 0;
564 final_phase = 0;
565 final_path_idx = 0;
566 for (i = 0; i < cont_path_cnt; i++) {
567 if (path[i].len > max_len) {
568 max_len = path[i].len;
569 final_phase = (u8)path[i].mid;
570 final_path_idx = i;
571 }
572
573 dev_dbg(sdmmc_dev(host), "path[%d].start = %d\n",
574 i, path[i].start);
575 dev_dbg(sdmmc_dev(host), "path[%d].end = %d\n",
576 i, path[i].end);
577 dev_dbg(sdmmc_dev(host), "path[%d].len = %d\n",
578 i, path[i].len);
579 dev_dbg(sdmmc_dev(host), "path[%d].mid = %d\n",
580 i, path[i].mid);
581 }
582
583finish:
584 dev_dbg(sdmmc_dev(host), "Final chosen phase: %d\n", final_phase);
585 return final_phase;
586}
587
588static void sd_wait_data_idle(struct realtek_pci_sdmmc *host)
589{
590 int err, i;
591 u8 val = 0;
592
593 for (i = 0; i < 100; i++) {
594 err = rtsx_pci_read_register(host->pcr, SD_DATA_STATE, &val);
595 if (val & SD_DATA_IDLE)
596 return;
597
598 udelay(100);
599 }
600}
601
602static int sd_tuning_rx_cmd(struct realtek_pci_sdmmc *host,
603 u8 opcode, u8 sample_point)
604{
605 int err;
606 u8 cmd[5] = {0};
607
608 err = sd_change_phase(host, sample_point);
609 if (err < 0)
610 return err;
611
612 cmd[0] = 0x40 | opcode;
613 err = sd_read_data(host, cmd, 0x40, NULL, 0, 100);
614 if (err < 0) {
615 /* Wait till SD DATA IDLE */
616 sd_wait_data_idle(host);
617 sd_clear_error(host);
618 return err;
619 }
620
621 return 0;
622}
623
624static int sd_tuning_phase(struct realtek_pci_sdmmc *host,
625 u8 opcode, u32 *phase_map)
626{
627 int err, i;
628 u32 raw_phase_map = 0;
629
630 for (i = MAX_PHASE; i >= 0; i--) {
631 err = sd_tuning_rx_cmd(host, opcode, (u8)i);
632 if (err == 0)
633 raw_phase_map |= 1 << i;
634 }
635
636 if (phase_map)
637 *phase_map = raw_phase_map;
638
639 return 0;
640}
641
642static int sd_tuning_rx(struct realtek_pci_sdmmc *host, u8 opcode)
643{
644 int err, i;
645 u32 raw_phase_map[RX_TUNING_CNT] = {0}, phase_map;
646 u8 final_phase;
647
648 for (i = 0; i < RX_TUNING_CNT; i++) {
649 err = sd_tuning_phase(host, opcode, &(raw_phase_map[i]));
650 if (err < 0)
651 return err;
652
653 if (raw_phase_map[i] == 0)
654 break;
655 }
656
657 phase_map = 0xFFFFFFFF;
658 for (i = 0; i < RX_TUNING_CNT; i++) {
659 dev_dbg(sdmmc_dev(host), "RX raw_phase_map[%d] = 0x%08x\n",
660 i, raw_phase_map[i]);
661 phase_map &= raw_phase_map[i];
662 }
663 dev_dbg(sdmmc_dev(host), "RX phase_map = 0x%08x\n", phase_map);
664
665 if (phase_map) {
666 final_phase = sd_search_final_phase(host, phase_map);
667 if (final_phase == 0xFF)
668 return -EINVAL;
669
670 err = sd_change_phase(host, final_phase);
671 if (err < 0)
672 return err;
673 } else {
674 return -EINVAL;
675 }
676
677 return 0;
678}
679
680static void sdmmc_request(struct mmc_host *mmc, struct mmc_request *mrq)
681{
682 struct realtek_pci_sdmmc *host = mmc_priv(mmc);
683 struct rtsx_pcr *pcr = host->pcr;
684 struct mmc_command *cmd = mrq->cmd;
685 struct mmc_data *data = mrq->data;
686 unsigned int data_size = 0;
Wei WANGc3481952013-02-08 15:24:27 +0800687 int err;
Wei WANGff984e52012-10-29 13:49:38 +0800688
689 if (host->eject) {
690 cmd->error = -ENOMEDIUM;
691 goto finish;
692 }
693
Wei WANGc3481952013-02-08 15:24:27 +0800694 err = rtsx_pci_card_exclusive_check(host->pcr, RTSX_SD_CARD);
695 if (err) {
696 cmd->error = err;
697 goto finish;
698 }
699
Wei WANGff984e52012-10-29 13:49:38 +0800700 mutex_lock(&pcr->pcr_mutex);
701
702 rtsx_pci_start_run(pcr);
703
704 rtsx_pci_switch_clock(pcr, host->clock, host->ssc_depth,
705 host->initial_mode, host->double_clk, host->vpclk);
706 rtsx_pci_write_register(pcr, CARD_SELECT, 0x07, SD_MOD_SEL);
707 rtsx_pci_write_register(pcr, CARD_SHARE_MODE,
708 CARD_SHARE_MASK, CARD_SHARE_48_SD);
709
710 mutex_lock(&host->host_mutex);
711 host->mrq = mrq;
712 mutex_unlock(&host->host_mutex);
713
714 if (mrq->data)
715 data_size = data->blocks * data->blksz;
716
717 if (!data_size || mmc_op_multi(cmd->opcode) ||
718 (cmd->opcode == MMC_READ_SINGLE_BLOCK) ||
719 (cmd->opcode == MMC_WRITE_BLOCK)) {
720 sd_send_cmd_get_rsp(host, cmd);
721
722 if (!cmd->error && data_size) {
723 sd_rw_multi(host, mrq);
724
725 if (mmc_op_multi(cmd->opcode) && mrq->stop)
726 sd_send_cmd_get_rsp(host, mrq->stop);
727 }
728 } else {
729 sd_normal_rw(host, mrq);
730 }
731
732 if (mrq->data) {
733 if (cmd->error || data->error)
734 data->bytes_xfered = 0;
735 else
736 data->bytes_xfered = data->blocks * data->blksz;
737 }
738
739 mutex_unlock(&pcr->pcr_mutex);
740
741finish:
742 if (cmd->error)
743 dev_dbg(sdmmc_dev(host), "cmd->error = %d\n", cmd->error);
744
745 mutex_lock(&host->host_mutex);
746 host->mrq = NULL;
747 mutex_unlock(&host->host_mutex);
748
749 mmc_request_done(mmc, mrq);
750}
751
752static int sd_set_bus_width(struct realtek_pci_sdmmc *host,
753 unsigned char bus_width)
754{
755 int err = 0;
756 u8 width[] = {
757 [MMC_BUS_WIDTH_1] = SD_BUS_WIDTH_1BIT,
758 [MMC_BUS_WIDTH_4] = SD_BUS_WIDTH_4BIT,
759 [MMC_BUS_WIDTH_8] = SD_BUS_WIDTH_8BIT,
760 };
761
762 if (bus_width <= MMC_BUS_WIDTH_8)
763 err = rtsx_pci_write_register(host->pcr, SD_CFG1,
764 0x03, width[bus_width]);
765
766 return err;
767}
768
769static int sd_power_on(struct realtek_pci_sdmmc *host)
770{
771 struct rtsx_pcr *pcr = host->pcr;
772 int err;
773
Wei WANGd88691b2013-03-08 15:05:57 +0800774 if (host->power_state == SDMMC_POWER_ON)
775 return 0;
776
Wei WANGff984e52012-10-29 13:49:38 +0800777 rtsx_pci_init_cmd(pcr);
778 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, CARD_SELECT, 0x07, SD_MOD_SEL);
779 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, CARD_SHARE_MODE,
780 CARD_SHARE_MASK, CARD_SHARE_48_SD);
781 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, CARD_CLK_EN,
782 SD_CLK_EN, SD_CLK_EN);
783 err = rtsx_pci_send_cmd(pcr, 100);
784 if (err < 0)
785 return err;
786
787 err = rtsx_pci_card_pull_ctl_enable(pcr, RTSX_SD_CARD);
788 if (err < 0)
789 return err;
790
791 err = rtsx_pci_card_power_on(pcr, RTSX_SD_CARD);
792 if (err < 0)
793 return err;
794
795 err = rtsx_pci_write_register(pcr, CARD_OE, SD_OUTPUT_EN, SD_OUTPUT_EN);
796 if (err < 0)
797 return err;
798
Wei WANGd88691b2013-03-08 15:05:57 +0800799 host->power_state = SDMMC_POWER_ON;
Wei WANGff984e52012-10-29 13:49:38 +0800800 return 0;
801}
802
803static int sd_power_off(struct realtek_pci_sdmmc *host)
804{
805 struct rtsx_pcr *pcr = host->pcr;
806 int err;
807
Wei WANGd88691b2013-03-08 15:05:57 +0800808 host->power_state = SDMMC_POWER_OFF;
809
Wei WANGff984e52012-10-29 13:49:38 +0800810 rtsx_pci_init_cmd(pcr);
811
812 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, CARD_CLK_EN, SD_CLK_EN, 0);
813 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, CARD_OE, SD_OUTPUT_EN, 0);
814
815 err = rtsx_pci_send_cmd(pcr, 100);
816 if (err < 0)
817 return err;
818
819 err = rtsx_pci_card_power_off(pcr, RTSX_SD_CARD);
820 if (err < 0)
821 return err;
822
823 return rtsx_pci_card_pull_ctl_disable(pcr, RTSX_SD_CARD);
824}
825
826static int sd_set_power_mode(struct realtek_pci_sdmmc *host,
827 unsigned char power_mode)
828{
829 int err;
830
831 if (power_mode == MMC_POWER_OFF)
832 err = sd_power_off(host);
833 else
834 err = sd_power_on(host);
835
836 return err;
837}
838
839static int sd_set_timing(struct realtek_pci_sdmmc *host,
840 unsigned char timing, bool *ddr_mode)
841{
842 struct rtsx_pcr *pcr = host->pcr;
843 int err = 0;
844
845 *ddr_mode = false;
846
847 rtsx_pci_init_cmd(pcr);
848
849 switch (timing) {
850 case MMC_TIMING_UHS_SDR104:
851 case MMC_TIMING_UHS_SDR50:
852 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, SD_CFG1,
853 0x0C | SD_ASYNC_FIFO_NOT_RST,
854 SD_30_MODE | SD_ASYNC_FIFO_NOT_RST);
855 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, CLK_CTL,
856 CLK_LOW_FREQ, CLK_LOW_FREQ);
857 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, CARD_CLK_SOURCE, 0xFF,
858 CRC_VAR_CLK0 | SD30_FIX_CLK | SAMPLE_VAR_CLK1);
859 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, CLK_CTL, CLK_LOW_FREQ, 0);
860 break;
861
862 case MMC_TIMING_UHS_DDR50:
863 *ddr_mode = true;
864
865 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, SD_CFG1,
866 0x0C | SD_ASYNC_FIFO_NOT_RST,
867 SD_DDR_MODE | SD_ASYNC_FIFO_NOT_RST);
868 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, CLK_CTL,
869 CLK_LOW_FREQ, CLK_LOW_FREQ);
870 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, CARD_CLK_SOURCE, 0xFF,
871 CRC_VAR_CLK0 | SD30_FIX_CLK | SAMPLE_VAR_CLK1);
872 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, CLK_CTL, CLK_LOW_FREQ, 0);
873 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, SD_PUSH_POINT_CTL,
874 DDR_VAR_TX_CMD_DAT, DDR_VAR_TX_CMD_DAT);
875 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, SD_SAMPLE_POINT_CTL,
876 DDR_VAR_RX_DAT | DDR_VAR_RX_CMD,
877 DDR_VAR_RX_DAT | DDR_VAR_RX_CMD);
878 break;
879
880 case MMC_TIMING_MMC_HS:
881 case MMC_TIMING_SD_HS:
882 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, SD_CFG1,
883 0x0C, SD_20_MODE);
884 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, CLK_CTL,
885 CLK_LOW_FREQ, CLK_LOW_FREQ);
886 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, CARD_CLK_SOURCE, 0xFF,
887 CRC_FIX_CLK | SD30_VAR_CLK0 | SAMPLE_VAR_CLK1);
888 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, CLK_CTL, CLK_LOW_FREQ, 0);
889 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, SD_PUSH_POINT_CTL,
890 SD20_TX_SEL_MASK, SD20_TX_14_AHEAD);
891 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, SD_SAMPLE_POINT_CTL,
892 SD20_RX_SEL_MASK, SD20_RX_14_DELAY);
893 break;
894
895 default:
896 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD,
897 SD_CFG1, 0x0C, SD_20_MODE);
898 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, CLK_CTL,
899 CLK_LOW_FREQ, CLK_LOW_FREQ);
900 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, CARD_CLK_SOURCE, 0xFF,
901 CRC_FIX_CLK | SD30_VAR_CLK0 | SAMPLE_VAR_CLK1);
902 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, CLK_CTL, CLK_LOW_FREQ, 0);
903 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD,
904 SD_PUSH_POINT_CTL, 0xFF, 0);
905 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, SD_SAMPLE_POINT_CTL,
906 SD20_RX_SEL_MASK, SD20_RX_POS_EDGE);
907 break;
908 }
909
910 err = rtsx_pci_send_cmd(pcr, 100);
911
912 return err;
913}
914
915static void sdmmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
916{
917 struct realtek_pci_sdmmc *host = mmc_priv(mmc);
918 struct rtsx_pcr *pcr = host->pcr;
919
920 if (host->eject)
921 return;
922
Wei WANGc3481952013-02-08 15:24:27 +0800923 if (rtsx_pci_card_exclusive_check(host->pcr, RTSX_SD_CARD))
924 return;
925
Wei WANGff984e52012-10-29 13:49:38 +0800926 mutex_lock(&pcr->pcr_mutex);
927
928 rtsx_pci_start_run(pcr);
929
930 sd_set_bus_width(host, ios->bus_width);
931 sd_set_power_mode(host, ios->power_mode);
932 sd_set_timing(host, ios->timing, &host->ddr_mode);
933
934 host->vpclk = false;
935 host->double_clk = true;
936
937 switch (ios->timing) {
938 case MMC_TIMING_UHS_SDR104:
939 case MMC_TIMING_UHS_SDR50:
940 host->ssc_depth = RTSX_SSC_DEPTH_2M;
941 host->vpclk = true;
942 host->double_clk = false;
943 break;
944 case MMC_TIMING_UHS_DDR50:
945 case MMC_TIMING_UHS_SDR25:
946 host->ssc_depth = RTSX_SSC_DEPTH_1M;
947 break;
948 default:
949 host->ssc_depth = RTSX_SSC_DEPTH_500K;
950 break;
951 }
952
953 host->initial_mode = (ios->clock <= 1000000) ? true : false;
954
955 host->clock = ios->clock;
956 rtsx_pci_switch_clock(pcr, ios->clock, host->ssc_depth,
957 host->initial_mode, host->double_clk, host->vpclk);
958
959 mutex_unlock(&pcr->pcr_mutex);
960}
961
962static int sdmmc_get_ro(struct mmc_host *mmc)
963{
964 struct realtek_pci_sdmmc *host = mmc_priv(mmc);
965 struct rtsx_pcr *pcr = host->pcr;
966 int ro = 0;
967 u32 val;
968
969 if (host->eject)
970 return -ENOMEDIUM;
971
972 mutex_lock(&pcr->pcr_mutex);
973
974 rtsx_pci_start_run(pcr);
975
976 /* Check SD mechanical write-protect switch */
977 val = rtsx_pci_readl(pcr, RTSX_BIPR);
978 dev_dbg(sdmmc_dev(host), "%s: RTSX_BIPR = 0x%08x\n", __func__, val);
979 if (val & SD_WRITE_PROTECT)
980 ro = 1;
981
982 mutex_unlock(&pcr->pcr_mutex);
983
984 return ro;
985}
986
987static int sdmmc_get_cd(struct mmc_host *mmc)
988{
989 struct realtek_pci_sdmmc *host = mmc_priv(mmc);
990 struct rtsx_pcr *pcr = host->pcr;
991 int cd = 0;
992 u32 val;
993
994 if (host->eject)
995 return -ENOMEDIUM;
996
997 mutex_lock(&pcr->pcr_mutex);
998
999 rtsx_pci_start_run(pcr);
1000
1001 /* Check SD card detect */
1002 val = rtsx_pci_card_exist(pcr);
1003 dev_dbg(sdmmc_dev(host), "%s: RTSX_BIPR = 0x%08x\n", __func__, val);
1004 if (val & SD_EXIST)
1005 cd = 1;
1006
1007 mutex_unlock(&pcr->pcr_mutex);
1008
1009 return cd;
1010}
1011
1012static int sd_wait_voltage_stable_1(struct realtek_pci_sdmmc *host)
1013{
1014 struct rtsx_pcr *pcr = host->pcr;
1015 int err;
1016 u8 stat;
1017
1018 /* Reference to Signal Voltage Switch Sequence in SD spec.
1019 * Wait for a period of time so that the card can drive SD_CMD and
1020 * SD_DAT[3:0] to low after sending back CMD11 response.
1021 */
1022 mdelay(1);
1023
1024 /* SD_CMD, SD_DAT[3:0] should be driven to low by card;
1025 * If either one of SD_CMD,SD_DAT[3:0] is not low,
1026 * abort the voltage switch sequence;
1027 */
1028 err = rtsx_pci_read_register(pcr, SD_BUS_STAT, &stat);
1029 if (err < 0)
1030 return err;
1031
1032 if (stat & (SD_CMD_STATUS | SD_DAT3_STATUS | SD_DAT2_STATUS |
1033 SD_DAT1_STATUS | SD_DAT0_STATUS))
1034 return -EINVAL;
1035
1036 /* Stop toggle SD clock */
1037 err = rtsx_pci_write_register(pcr, SD_BUS_STAT,
1038 0xFF, SD_CLK_FORCE_STOP);
1039 if (err < 0)
1040 return err;
1041
1042 return 0;
1043}
1044
1045static int sd_wait_voltage_stable_2(struct realtek_pci_sdmmc *host)
1046{
1047 struct rtsx_pcr *pcr = host->pcr;
1048 int err;
1049 u8 stat, mask, val;
1050
1051 /* Wait 1.8V output of voltage regulator in card stable */
1052 msleep(50);
1053
1054 /* Toggle SD clock again */
1055 err = rtsx_pci_write_register(pcr, SD_BUS_STAT, 0xFF, SD_CLK_TOGGLE_EN);
1056 if (err < 0)
1057 return err;
1058
1059 /* Wait for a period of time so that the card can drive
1060 * SD_DAT[3:0] to high at 1.8V
1061 */
1062 msleep(20);
1063
1064 /* SD_CMD, SD_DAT[3:0] should be pulled high by host */
1065 err = rtsx_pci_read_register(pcr, SD_BUS_STAT, &stat);
1066 if (err < 0)
1067 return err;
1068
1069 mask = SD_CMD_STATUS | SD_DAT3_STATUS | SD_DAT2_STATUS |
1070 SD_DAT1_STATUS | SD_DAT0_STATUS;
1071 val = SD_CMD_STATUS | SD_DAT3_STATUS | SD_DAT2_STATUS |
1072 SD_DAT1_STATUS | SD_DAT0_STATUS;
1073 if ((stat & mask) != val) {
1074 dev_dbg(sdmmc_dev(host),
1075 "%s: SD_BUS_STAT = 0x%x\n", __func__, stat);
1076 rtsx_pci_write_register(pcr, SD_BUS_STAT,
1077 SD_CLK_TOGGLE_EN | SD_CLK_FORCE_STOP, 0);
1078 rtsx_pci_write_register(pcr, CARD_CLK_EN, 0xFF, 0);
1079 return -EINVAL;
1080 }
1081
1082 return 0;
1083}
1084
Wei WANGff984e52012-10-29 13:49:38 +08001085static int sdmmc_switch_voltage(struct mmc_host *mmc, struct mmc_ios *ios)
1086{
1087 struct realtek_pci_sdmmc *host = mmc_priv(mmc);
1088 struct rtsx_pcr *pcr = host->pcr;
1089 int err = 0;
1090 u8 voltage;
1091
1092 dev_dbg(sdmmc_dev(host), "%s: signal_voltage = %d\n",
1093 __func__, ios->signal_voltage);
1094
1095 if (host->eject)
1096 return -ENOMEDIUM;
1097
Wei WANGc3481952013-02-08 15:24:27 +08001098 err = rtsx_pci_card_exclusive_check(host->pcr, RTSX_SD_CARD);
1099 if (err)
1100 return err;
1101
Wei WANGff984e52012-10-29 13:49:38 +08001102 mutex_lock(&pcr->pcr_mutex);
1103
1104 rtsx_pci_start_run(pcr);
1105
1106 if (ios->signal_voltage == MMC_SIGNAL_VOLTAGE_330)
Wei WANGef85e732013-01-23 09:51:05 +08001107 voltage = OUTPUT_3V3;
Wei WANGff984e52012-10-29 13:49:38 +08001108 else
Wei WANGef85e732013-01-23 09:51:05 +08001109 voltage = OUTPUT_1V8;
Wei WANGff984e52012-10-29 13:49:38 +08001110
Wei WANGef85e732013-01-23 09:51:05 +08001111 if (voltage == OUTPUT_1V8) {
Wei WANGff984e52012-10-29 13:49:38 +08001112 err = sd_wait_voltage_stable_1(host);
1113 if (err < 0)
1114 goto out;
1115 }
1116
Wei WANGef85e732013-01-23 09:51:05 +08001117 err = rtsx_pci_switch_output_voltage(pcr, voltage);
Wei WANGff984e52012-10-29 13:49:38 +08001118 if (err < 0)
1119 goto out;
1120
Wei WANGef85e732013-01-23 09:51:05 +08001121 if (voltage == OUTPUT_1V8) {
Wei WANGff984e52012-10-29 13:49:38 +08001122 err = sd_wait_voltage_stable_2(host);
1123 if (err < 0)
1124 goto out;
1125 }
1126
1127 /* Stop toggle SD clock in idle */
1128 err = rtsx_pci_write_register(pcr, SD_BUS_STAT,
1129 SD_CLK_TOGGLE_EN | SD_CLK_FORCE_STOP, 0);
1130
1131out:
1132 mutex_unlock(&pcr->pcr_mutex);
1133
1134 return err;
1135}
1136
1137static int sdmmc_execute_tuning(struct mmc_host *mmc, u32 opcode)
1138{
1139 struct realtek_pci_sdmmc *host = mmc_priv(mmc);
1140 struct rtsx_pcr *pcr = host->pcr;
1141 int err = 0;
1142
1143 if (host->eject)
1144 return -ENOMEDIUM;
1145
Wei WANGc3481952013-02-08 15:24:27 +08001146 err = rtsx_pci_card_exclusive_check(host->pcr, RTSX_SD_CARD);
1147 if (err)
1148 return err;
1149
Wei WANGff984e52012-10-29 13:49:38 +08001150 mutex_lock(&pcr->pcr_mutex);
1151
1152 rtsx_pci_start_run(pcr);
1153
1154 if (!host->ddr_mode)
1155 err = sd_tuning_rx(host, MMC_SEND_TUNING_BLOCK);
1156
1157 mutex_unlock(&pcr->pcr_mutex);
1158
1159 return err;
1160}
1161
1162static const struct mmc_host_ops realtek_pci_sdmmc_ops = {
1163 .request = sdmmc_request,
1164 .set_ios = sdmmc_set_ios,
1165 .get_ro = sdmmc_get_ro,
1166 .get_cd = sdmmc_get_cd,
1167 .start_signal_voltage_switch = sdmmc_switch_voltage,
1168 .execute_tuning = sdmmc_execute_tuning,
1169};
1170
1171#ifdef CONFIG_PM
1172static int rtsx_pci_sdmmc_suspend(struct platform_device *pdev,
1173 pm_message_t state)
1174{
1175 struct realtek_pci_sdmmc *host = platform_get_drvdata(pdev);
1176 struct mmc_host *mmc = host->mmc;
1177 int err;
1178
1179 dev_dbg(sdmmc_dev(host), "--> %s\n", __func__);
1180
1181 err = mmc_suspend_host(mmc);
1182 if (err)
1183 return err;
1184
1185 return 0;
1186}
1187
1188static int rtsx_pci_sdmmc_resume(struct platform_device *pdev)
1189{
1190 struct realtek_pci_sdmmc *host = platform_get_drvdata(pdev);
1191 struct mmc_host *mmc = host->mmc;
1192
1193 dev_dbg(sdmmc_dev(host), "--> %s\n", __func__);
1194
1195 return mmc_resume_host(mmc);
1196}
1197#else /* CONFIG_PM */
1198#define rtsx_pci_sdmmc_suspend NULL
1199#define rtsx_pci_sdmmc_resume NULL
1200#endif /* CONFIG_PM */
1201
1202static void init_extra_caps(struct realtek_pci_sdmmc *host)
1203{
1204 struct mmc_host *mmc = host->mmc;
1205 struct rtsx_pcr *pcr = host->pcr;
1206
1207 dev_dbg(sdmmc_dev(host), "pcr->extra_caps = 0x%x\n", pcr->extra_caps);
1208
1209 if (pcr->extra_caps & EXTRA_CAPS_SD_SDR50)
1210 mmc->caps |= MMC_CAP_UHS_SDR50;
1211 if (pcr->extra_caps & EXTRA_CAPS_SD_SDR104)
1212 mmc->caps |= MMC_CAP_UHS_SDR104;
1213 if (pcr->extra_caps & EXTRA_CAPS_SD_DDR50)
1214 mmc->caps |= MMC_CAP_UHS_DDR50;
1215 if (pcr->extra_caps & EXTRA_CAPS_MMC_HSDDR)
1216 mmc->caps |= MMC_CAP_1_8V_DDR;
1217 if (pcr->extra_caps & EXTRA_CAPS_MMC_8BIT)
1218 mmc->caps |= MMC_CAP_8_BIT_DATA;
1219}
1220
1221static void realtek_init_host(struct realtek_pci_sdmmc *host)
1222{
1223 struct mmc_host *mmc = host->mmc;
1224
1225 mmc->f_min = 250000;
1226 mmc->f_max = 208000000;
1227 mmc->ocr_avail = MMC_VDD_32_33 | MMC_VDD_33_34 | MMC_VDD_165_195;
1228 mmc->caps = MMC_CAP_4_BIT_DATA | MMC_CAP_SD_HIGHSPEED |
1229 MMC_CAP_MMC_HIGHSPEED | MMC_CAP_BUS_WIDTH_TEST |
1230 MMC_CAP_UHS_SDR12 | MMC_CAP_UHS_SDR25;
1231 mmc->max_current_330 = 400;
1232 mmc->max_current_180 = 800;
1233 mmc->ops = &realtek_pci_sdmmc_ops;
1234
1235 init_extra_caps(host);
1236
1237 mmc->max_segs = 256;
1238 mmc->max_seg_size = 65536;
1239 mmc->max_blk_size = 512;
1240 mmc->max_blk_count = 65535;
1241 mmc->max_req_size = 524288;
1242}
1243
1244static void rtsx_pci_sdmmc_card_event(struct platform_device *pdev)
1245{
1246 struct realtek_pci_sdmmc *host = platform_get_drvdata(pdev);
1247
1248 mmc_detect_change(host->mmc, 0);
1249}
1250
1251static int rtsx_pci_sdmmc_drv_probe(struct platform_device *pdev)
1252{
1253 struct mmc_host *mmc;
1254 struct realtek_pci_sdmmc *host;
1255 struct rtsx_pcr *pcr;
1256 struct pcr_handle *handle = pdev->dev.platform_data;
1257
1258 if (!handle)
1259 return -ENXIO;
1260
1261 pcr = handle->pcr;
1262 if (!pcr)
1263 return -ENXIO;
1264
1265 dev_dbg(&(pdev->dev), ": Realtek PCI-E SDMMC controller found\n");
1266
1267 mmc = mmc_alloc_host(sizeof(*host), &pdev->dev);
1268 if (!mmc)
1269 return -ENOMEM;
1270
1271 host = mmc_priv(mmc);
1272 host->pcr = pcr;
1273 host->mmc = mmc;
1274 host->pdev = pdev;
Wei WANGd88691b2013-03-08 15:05:57 +08001275 host->power_state = SDMMC_POWER_OFF;
Wei WANGff984e52012-10-29 13:49:38 +08001276 platform_set_drvdata(pdev, host);
1277 pcr->slots[RTSX_SD_CARD].p_dev = pdev;
1278 pcr->slots[RTSX_SD_CARD].card_event = rtsx_pci_sdmmc_card_event;
1279
1280 mutex_init(&host->host_mutex);
1281
1282 realtek_init_host(host);
1283
1284 mmc_add_host(mmc);
1285
1286 return 0;
1287}
1288
1289static int rtsx_pci_sdmmc_drv_remove(struct platform_device *pdev)
1290{
1291 struct realtek_pci_sdmmc *host = platform_get_drvdata(pdev);
1292 struct rtsx_pcr *pcr;
1293 struct mmc_host *mmc;
1294
1295 if (!host)
1296 return 0;
1297
1298 pcr = host->pcr;
1299 pcr->slots[RTSX_SD_CARD].p_dev = NULL;
1300 pcr->slots[RTSX_SD_CARD].card_event = NULL;
1301 mmc = host->mmc;
1302 host->eject = true;
1303
1304 mutex_lock(&host->host_mutex);
1305 if (host->mrq) {
1306 dev_dbg(&(pdev->dev),
1307 "%s: Controller removed during transfer\n",
1308 mmc_hostname(mmc));
1309
1310 rtsx_pci_complete_unfinished_transfer(pcr);
1311
1312 host->mrq->cmd->error = -ENOMEDIUM;
1313 if (host->mrq->stop)
1314 host->mrq->stop->error = -ENOMEDIUM;
1315 mmc_request_done(mmc, host->mrq);
1316 }
1317 mutex_unlock(&host->host_mutex);
1318
1319 mmc_remove_host(mmc);
1320 mmc_free_host(mmc);
1321
1322 platform_set_drvdata(pdev, NULL);
1323
1324 dev_dbg(&(pdev->dev),
1325 ": Realtek PCI-E SDMMC controller has been removed\n");
1326
1327 return 0;
1328}
1329
1330static struct platform_device_id rtsx_pci_sdmmc_ids[] = {
1331 {
1332 .name = DRV_NAME_RTSX_PCI_SDMMC,
1333 }, {
1334 /* sentinel */
1335 }
1336};
1337MODULE_DEVICE_TABLE(platform, rtsx_pci_sdmmc_ids);
1338
1339static struct platform_driver rtsx_pci_sdmmc_driver = {
1340 .probe = rtsx_pci_sdmmc_drv_probe,
1341 .remove = rtsx_pci_sdmmc_drv_remove,
1342 .id_table = rtsx_pci_sdmmc_ids,
1343 .suspend = rtsx_pci_sdmmc_suspend,
1344 .resume = rtsx_pci_sdmmc_resume,
1345 .driver = {
1346 .owner = THIS_MODULE,
1347 .name = DRV_NAME_RTSX_PCI_SDMMC,
1348 },
1349};
1350module_platform_driver(rtsx_pci_sdmmc_driver);
1351
1352MODULE_LICENSE("GPL");
1353MODULE_AUTHOR("Wei WANG <wei_wang@realsil.com.cn>");
1354MODULE_DESCRIPTION("Realtek PCI-E SD/MMC Card Host Driver");