Lines Matching full:host

38 static inline void sh_sdhi_writeq(struct sh_sdhi_host *host, int reg, u64 val)  in sh_sdhi_writeq()  argument
40 writeq(val, host->addr + (reg << host->bus_shift)); in sh_sdhi_writeq()
43 static inline u64 sh_sdhi_readq(struct sh_sdhi_host *host, int reg) in sh_sdhi_readq() argument
45 return readq(host->addr + (reg << host->bus_shift)); in sh_sdhi_readq()
48 static inline void sh_sdhi_writew(struct sh_sdhi_host *host, int reg, u16 val) in sh_sdhi_writew() argument
50 writew(val, host->addr + (reg << host->bus_shift)); in sh_sdhi_writew()
53 static inline u16 sh_sdhi_readw(struct sh_sdhi_host *host, int reg) in sh_sdhi_readw() argument
55 return readw(host->addr + (reg << host->bus_shift)); in sh_sdhi_readw()
58 static void sh_sdhi_detect(struct sh_sdhi_host *host) in sh_sdhi_detect() argument
60 sh_sdhi_writew(host, SDHI_OPTION, in sh_sdhi_detect()
61 OPT_BUS_WIDTH_1 | sh_sdhi_readw(host, SDHI_OPTION)); in sh_sdhi_detect()
63 host->detect_waiting = 0; in sh_sdhi_detect()
68 struct sh_sdhi_host *host = dev_id; in sh_sdhi_intr() local
71 state1 = sh_sdhi_readw(host, SDHI_INFO1); in sh_sdhi_intr()
72 state2 = sh_sdhi_readw(host, SDHI_INFO2); in sh_sdhi_intr()
78 sh_sdhi_writew(host, SDHI_INFO1, ~INFO1_CARD_IN); in sh_sdhi_intr()
79 if (!host->detect_waiting) { in sh_sdhi_intr()
80 host->detect_waiting = 1; in sh_sdhi_intr()
81 sh_sdhi_detect(host); in sh_sdhi_intr()
83 sh_sdhi_writew(host, SDHI_INFO1_MASK, INFO1M_RESP_END | in sh_sdhi_intr()
90 sh_sdhi_writew(host, SDHI_INFO1, ~INFO1_CARD_RE); in sh_sdhi_intr()
91 if (!host->detect_waiting) { in sh_sdhi_intr()
92 host->detect_waiting = 1; in sh_sdhi_intr()
93 sh_sdhi_detect(host); in sh_sdhi_intr()
95 sh_sdhi_writew(host, SDHI_INFO1_MASK, INFO1M_RESP_END | in sh_sdhi_intr()
98 sh_sdhi_writew(host, SDHI_SDIO_INFO1_MASK, SDIO_INFO1M_ON); in sh_sdhi_intr()
99 sh_sdhi_writew(host, SDHI_SDIO_MODE, SDIO_MODE_OFF); in sh_sdhi_intr()
104 sh_sdhi_writew(host, SDHI_INFO2, in sh_sdhi_intr()
106 sh_sdhi_writew(host, SDHI_INFO2_MASK, in sh_sdhi_intr()
108 sh_sdhi_readw(host, SDHI_INFO2_MASK)); in sh_sdhi_intr()
109 host->sd_error = 1; in sh_sdhi_intr()
110 host->wait_int = 1; in sh_sdhi_intr()
115 sh_sdhi_writew(host, SDHI_INFO1, ~INFO1_RESP_END); in sh_sdhi_intr()
116 sh_sdhi_writew(host, SDHI_INFO1_MASK, in sh_sdhi_intr()
118 sh_sdhi_readw(host, SDHI_INFO1_MASK)); in sh_sdhi_intr()
119 host->wait_int = 1; in sh_sdhi_intr()
124 sh_sdhi_writew(host, SDHI_INFO2, ~INFO2_BRE_ENABLE); in sh_sdhi_intr()
125 sh_sdhi_writew(host, SDHI_INFO2_MASK, in sh_sdhi_intr()
127 sh_sdhi_readw(host, SDHI_INFO2_MASK)); in sh_sdhi_intr()
128 host->wait_int = 1; in sh_sdhi_intr()
133 sh_sdhi_writew(host, SDHI_INFO2, ~INFO2_BWE_ENABLE); in sh_sdhi_intr()
134 sh_sdhi_writew(host, SDHI_INFO2_MASK, in sh_sdhi_intr()
136 sh_sdhi_readw(host, SDHI_INFO2_MASK)); in sh_sdhi_intr()
137 host->wait_int = 1; in sh_sdhi_intr()
142 sh_sdhi_writew(host, SDHI_INFO1, ~INFO1_ACCESS_END); in sh_sdhi_intr()
143 sh_sdhi_writew(host, SDHI_INFO1_MASK, in sh_sdhi_intr()
145 sh_sdhi_readw(host, SDHI_INFO1_MASK)); in sh_sdhi_intr()
146 host->wait_int = 1; in sh_sdhi_intr()
152 static int sh_sdhi_wait_interrupt_flag(struct sh_sdhi_host *host) in sh_sdhi_wait_interrupt_flag() argument
163 if (!sh_sdhi_intr(host)) in sh_sdhi_wait_interrupt_flag()
172 static int sh_sdhi_clock_control(struct sh_sdhi_host *host, unsigned long clk) in sh_sdhi_clock_control() argument
176 if (sh_sdhi_readw(host, SDHI_INFO2) & (1 << 14)) { in sh_sdhi_clock_control()
181 sh_sdhi_writew(host, SDHI_CLK_CTRL, in sh_sdhi_clock_control()
182 ~CLK_ENABLE & sh_sdhi_readw(host, SDHI_CLK_CTRL)); in sh_sdhi_clock_control()
192 sh_sdhi_writew(host, SDHI_CLK_CTRL, clkdiv); in sh_sdhi_clock_control()
197 if ((sh_sdhi_readw(host, SDHI_INFO2) & 0x2000)) in sh_sdhi_clock_control()
202 sh_sdhi_writew(host, SDHI_CLK_CTRL, in sh_sdhi_clock_control()
203 CLK_ENABLE | sh_sdhi_readw(host, SDHI_CLK_CTRL)); in sh_sdhi_clock_control()
210 static int sh_sdhi_sync_reset(struct sh_sdhi_host *host) in sh_sdhi_sync_reset() argument
213 sh_sdhi_writew(host, SDHI_SOFT_RST, SOFT_RST_ON); in sh_sdhi_sync_reset()
214 sh_sdhi_writew(host, SDHI_SOFT_RST, SOFT_RST_OFF); in sh_sdhi_sync_reset()
215 sh_sdhi_writew(host, SDHI_CLK_CTRL, in sh_sdhi_sync_reset()
216 CLK_ENABLE | sh_sdhi_readw(host, SDHI_CLK_CTRL)); in sh_sdhi_sync_reset()
220 if (!(sh_sdhi_readw(host, SDHI_INFO2) & INFO2_CBUSY)) in sh_sdhi_sync_reset()
228 if (host->quirks & SH_SDHI_QUIRK_16BIT_BUF) in sh_sdhi_sync_reset()
229 sh_sdhi_writew(host, SDHI_HOST_MODE, 1); in sh_sdhi_sync_reset()
234 static int sh_sdhi_error_manage(struct sh_sdhi_host *host) in sh_sdhi_error_manage() argument
239 host->sd_error = 0; in sh_sdhi_error_manage()
240 host->wait_int = 0; in sh_sdhi_error_manage()
242 e_state1 = sh_sdhi_readw(host, SDHI_ERR_STS1); in sh_sdhi_error_manage()
243 e_state2 = sh_sdhi_readw(host, SDHI_ERR_STS2); in sh_sdhi_error_manage()
250 DRIVER_NAME, sh_sdhi_readw(host, SDHI_ERR_STS2)); in sh_sdhi_error_manage()
251 sh_sdhi_sync_reset(host); in sh_sdhi_error_manage()
253 sh_sdhi_writew(host, SDHI_INFO1_MASK, in sh_sdhi_error_manage()
263 DRIVER_NAME, sh_sdhi_readw(host, SDHI_ERR_STS1)); in sh_sdhi_error_manage()
264 sh_sdhi_sync_reset(host); in sh_sdhi_error_manage()
265 sh_sdhi_writew(host, SDHI_INFO1_MASK, in sh_sdhi_error_manage()
270 static int sh_sdhi_single_read(struct sh_sdhi_host *host, struct mmc_data *data) in sh_sdhi_single_read() argument
283 host->wait_int = 0; in sh_sdhi_single_read()
284 sh_sdhi_writew(host, SDHI_INFO2_MASK, in sh_sdhi_single_read()
286 sh_sdhi_readw(host, SDHI_INFO2_MASK)); in sh_sdhi_single_read()
287 sh_sdhi_writew(host, SDHI_INFO1_MASK, in sh_sdhi_single_read()
289 sh_sdhi_readw(host, SDHI_INFO1_MASK)); in sh_sdhi_single_read()
290 time = sh_sdhi_wait_interrupt_flag(host); in sh_sdhi_single_read()
291 if (time == 0 || host->sd_error != 0) in sh_sdhi_single_read()
292 return sh_sdhi_error_manage(host); in sh_sdhi_single_read()
294 host->wait_int = 0; in sh_sdhi_single_read()
295 blocksize = sh_sdhi_readw(host, SDHI_SIZE); in sh_sdhi_single_read()
296 if (host->quirks & SH_SDHI_QUIRK_64BIT_BUF) in sh_sdhi_single_read()
298 *q++ = sh_sdhi_readq(host, SDHI_BUF0); in sh_sdhi_single_read()
301 *p++ = sh_sdhi_readw(host, SDHI_BUF0); in sh_sdhi_single_read()
303 time = sh_sdhi_wait_interrupt_flag(host); in sh_sdhi_single_read()
304 if (time == 0 || host->sd_error != 0) in sh_sdhi_single_read()
305 return sh_sdhi_error_manage(host); in sh_sdhi_single_read()
307 host->wait_int = 0; in sh_sdhi_single_read()
311 static int sh_sdhi_multi_read(struct sh_sdhi_host *host, struct mmc_data *data) in sh_sdhi_multi_read() argument
327 host->wait_int = 0; in sh_sdhi_multi_read()
329 sh_sdhi_writew(host, SDHI_INFO2_MASK, in sh_sdhi_multi_read()
331 sh_sdhi_readw(host, SDHI_INFO2_MASK)); in sh_sdhi_multi_read()
333 time = sh_sdhi_wait_interrupt_flag(host); in sh_sdhi_multi_read()
334 if (time == 0 || host->sd_error != 0) in sh_sdhi_multi_read()
335 return sh_sdhi_error_manage(host); in sh_sdhi_multi_read()
337 host->wait_int = 0; in sh_sdhi_multi_read()
338 blocksize = sh_sdhi_readw(host, SDHI_SIZE); in sh_sdhi_multi_read()
339 if (host->quirks & SH_SDHI_QUIRK_64BIT_BUF) in sh_sdhi_multi_read()
341 *q++ = sh_sdhi_readq(host, SDHI_BUF0); in sh_sdhi_multi_read()
344 *p++ = sh_sdhi_readw(host, SDHI_BUF0); in sh_sdhi_multi_read()
350 static int sh_sdhi_single_write(struct sh_sdhi_host *host, in sh_sdhi_single_write() argument
367 host->wait_int = 0; in sh_sdhi_single_write()
368 sh_sdhi_writew(host, SDHI_INFO2_MASK, in sh_sdhi_single_write()
370 sh_sdhi_readw(host, SDHI_INFO2_MASK)); in sh_sdhi_single_write()
371 sh_sdhi_writew(host, SDHI_INFO1_MASK, in sh_sdhi_single_write()
373 sh_sdhi_readw(host, SDHI_INFO1_MASK)); in sh_sdhi_single_write()
375 time = sh_sdhi_wait_interrupt_flag(host); in sh_sdhi_single_write()
376 if (time == 0 || host->sd_error != 0) in sh_sdhi_single_write()
377 return sh_sdhi_error_manage(host); in sh_sdhi_single_write()
379 host->wait_int = 0; in sh_sdhi_single_write()
380 blocksize = sh_sdhi_readw(host, SDHI_SIZE); in sh_sdhi_single_write()
381 if (host->quirks & SH_SDHI_QUIRK_64BIT_BUF) in sh_sdhi_single_write()
383 sh_sdhi_writeq(host, SDHI_BUF0, *q++); in sh_sdhi_single_write()
386 sh_sdhi_writew(host, SDHI_BUF0, *p++); in sh_sdhi_single_write()
388 time = sh_sdhi_wait_interrupt_flag(host); in sh_sdhi_single_write()
389 if (time == 0 || host->sd_error != 0) in sh_sdhi_single_write()
390 return sh_sdhi_error_manage(host); in sh_sdhi_single_write()
392 host->wait_int = 0; in sh_sdhi_single_write()
396 static int sh_sdhi_multi_write(struct sh_sdhi_host *host, struct mmc_data *data) in sh_sdhi_multi_write() argument
406 host->wait_int = 0; in sh_sdhi_multi_write()
408 sh_sdhi_writew(host, SDHI_INFO2_MASK, in sh_sdhi_multi_write()
410 sh_sdhi_readw(host, SDHI_INFO2_MASK)); in sh_sdhi_multi_write()
412 time = sh_sdhi_wait_interrupt_flag(host); in sh_sdhi_multi_write()
413 if (time == 0 || host->sd_error != 0) in sh_sdhi_multi_write()
414 return sh_sdhi_error_manage(host); in sh_sdhi_multi_write()
416 host->wait_int = 0; in sh_sdhi_multi_write()
417 blocksize = sh_sdhi_readw(host, SDHI_SIZE); in sh_sdhi_multi_write()
418 if (host->quirks & SH_SDHI_QUIRK_64BIT_BUF) in sh_sdhi_multi_write()
420 sh_sdhi_writeq(host, SDHI_BUF0, *q++); in sh_sdhi_multi_write()
423 sh_sdhi_writew(host, SDHI_BUF0, *p++); in sh_sdhi_multi_write()
429 static void sh_sdhi_get_response(struct sh_sdhi_host *host, struct mmc_cmd *cmd) in sh_sdhi_get_response() argument
436 resp[0] = sh_sdhi_readw(host, SDHI_RSP00); in sh_sdhi_get_response()
437 resp[1] = sh_sdhi_readw(host, SDHI_RSP01); in sh_sdhi_get_response()
438 resp[2] = sh_sdhi_readw(host, SDHI_RSP02); in sh_sdhi_get_response()
439 resp[3] = sh_sdhi_readw(host, SDHI_RSP03); in sh_sdhi_get_response()
440 resp[4] = sh_sdhi_readw(host, SDHI_RSP04); in sh_sdhi_get_response()
441 resp[5] = sh_sdhi_readw(host, SDHI_RSP05); in sh_sdhi_get_response()
442 resp[6] = sh_sdhi_readw(host, SDHI_RSP06); in sh_sdhi_get_response()
443 resp[7] = sh_sdhi_readw(host, SDHI_RSP07); in sh_sdhi_get_response()
452 resp[0] = sh_sdhi_readw(host, SDHI_RSP00); in sh_sdhi_get_response()
453 resp[1] = sh_sdhi_readw(host, SDHI_RSP01); in sh_sdhi_get_response()
477 static unsigned short sh_sdhi_set_cmd(struct sh_sdhi_host *host, in sh_sdhi_set_cmd() argument
480 if (host->app_cmd) { in sh_sdhi_set_cmd()
482 host->app_cmd = 0; in sh_sdhi_set_cmd()
494 host->app_cmd = 1; in sh_sdhi_set_cmd()
500 static unsigned short sh_sdhi_data_trans(struct sh_sdhi_host *host, in sh_sdhi_data_trans() argument
503 if (host->app_cmd) { in sh_sdhi_data_trans()
504 host->app_cmd = 0; in sh_sdhi_data_trans()
508 return sh_sdhi_single_read(host, data); in sh_sdhi_data_trans()
517 return sh_sdhi_multi_write(host, data); in sh_sdhi_data_trans()
519 return sh_sdhi_multi_read(host, data); in sh_sdhi_data_trans()
521 return sh_sdhi_single_write(host, data); in sh_sdhi_data_trans()
525 return sh_sdhi_single_read(host, data); in sh_sdhi_data_trans()
533 static int sh_sdhi_start_cmd(struct sh_sdhi_host *host, in sh_sdhi_start_cmd() argument
546 sh_sdhi_writew(host, SDHI_INFO1_MASK, ~INFO1M_ACCESS_END & in sh_sdhi_start_cmd()
547 sh_sdhi_readw(host, SDHI_INFO1_MASK)); in sh_sdhi_start_cmd()
549 time = sh_sdhi_wait_interrupt_flag(host); in sh_sdhi_start_cmd()
550 if (time == 0 || host->sd_error != 0) in sh_sdhi_start_cmd()
551 return sh_sdhi_error_manage(host); in sh_sdhi_start_cmd()
553 sh_sdhi_get_response(host, cmd); in sh_sdhi_start_cmd()
560 sh_sdhi_writew(host, SDHI_STOP, STOP_SEC_ENABLE); in sh_sdhi_start_cmd()
561 sh_sdhi_writew(host, SDHI_SECCNT, data->blocks); in sh_sdhi_start_cmd()
563 sh_sdhi_writew(host, SDHI_SIZE, data->blocksize); in sh_sdhi_start_cmd()
566 shcmd = sh_sdhi_set_cmd(host, data, opc); in sh_sdhi_start_cmd()
572 sh_sdhi_writew(host, SDHI_INFO1, ~INFO1_RESP_END); in sh_sdhi_start_cmd()
574 sh_sdhi_writew(host, SDHI_INFO1_MASK, in sh_sdhi_start_cmd()
575 INFO1M_RESP_END | sh_sdhi_readw(host, SDHI_INFO1_MASK)); in sh_sdhi_start_cmd()
576 sh_sdhi_writew(host, SDHI_ARG0, in sh_sdhi_start_cmd()
578 sh_sdhi_writew(host, SDHI_ARG1, in sh_sdhi_start_cmd()
584 if ((sh_sdhi_readw(host, SDHI_INFO2) & 0x2000)) in sh_sdhi_start_cmd()
588 host->wait_int = 0; in sh_sdhi_start_cmd()
589 sh_sdhi_writew(host, SDHI_INFO1_MASK, in sh_sdhi_start_cmd()
590 ~INFO1M_RESP_END & sh_sdhi_readw(host, SDHI_INFO1_MASK)); in sh_sdhi_start_cmd()
591 sh_sdhi_writew(host, SDHI_INFO2_MASK, in sh_sdhi_start_cmd()
595 sh_sdhi_readw(host, SDHI_INFO2_MASK)); in sh_sdhi_start_cmd()
597 sh_sdhi_writew(host, SDHI_CMD, (unsigned short)(shcmd & CMD_MASK)); in sh_sdhi_start_cmd()
598 time = sh_sdhi_wait_interrupt_flag(host); in sh_sdhi_start_cmd()
600 host->app_cmd = 0; in sh_sdhi_start_cmd()
601 return sh_sdhi_error_manage(host); in sh_sdhi_start_cmd()
604 if (host->sd_error) { in sh_sdhi_start_cmd()
615 ret = sh_sdhi_error_manage(host); in sh_sdhi_start_cmd()
618 host->sd_error = 0; in sh_sdhi_start_cmd()
619 host->wait_int = 0; in sh_sdhi_start_cmd()
620 host->app_cmd = 0; in sh_sdhi_start_cmd()
624 if (sh_sdhi_readw(host, SDHI_INFO1) & INFO1_RESP_END) { in sh_sdhi_start_cmd()
625 host->app_cmd = 0; in sh_sdhi_start_cmd()
629 if (host->wait_int) { in sh_sdhi_start_cmd()
630 sh_sdhi_get_response(host, cmd); in sh_sdhi_start_cmd()
631 host->wait_int = 0; in sh_sdhi_start_cmd()
635 ret = sh_sdhi_data_trans(host, data, opc); in sh_sdhi_start_cmd()
643 static int sh_sdhi_send_cmd_common(struct sh_sdhi_host *host, in sh_sdhi_send_cmd_common() argument
646 host->sd_error = 0; in sh_sdhi_send_cmd_common()
648 return sh_sdhi_start_cmd(host, data, cmd); in sh_sdhi_send_cmd_common()
651 static int sh_sdhi_set_ios_common(struct sh_sdhi_host *host, struct mmc *mmc) in sh_sdhi_set_ios_common() argument
655 ret = sh_sdhi_clock_control(host, mmc->clock); in sh_sdhi_set_ios_common()
660 sh_sdhi_writew(host, SDHI_OPTION, in sh_sdhi_set_ios_common()
662 sh_sdhi_readw(host, SDHI_OPTION))); in sh_sdhi_set_ios_common()
664 sh_sdhi_writew(host, SDHI_OPTION, in sh_sdhi_set_ios_common()
666 sh_sdhi_readw(host, SDHI_OPTION))); in sh_sdhi_set_ios_common()
668 sh_sdhi_writew(host, SDHI_OPTION, in sh_sdhi_set_ios_common()
670 sh_sdhi_readw(host, SDHI_OPTION))); in sh_sdhi_set_ios_common()
677 static int sh_sdhi_initialize_common(struct sh_sdhi_host *host) in sh_sdhi_initialize_common() argument
679 int ret = sh_sdhi_sync_reset(host); in sh_sdhi_initialize_common()
681 sh_sdhi_writew(host, SDHI_PORTSEL, USE_1PORT); in sh_sdhi_initialize_common()
684 sh_sdhi_writew(host, SDHI_EXT_SWAP, SET_SWAP); in sh_sdhi_initialize_common()
687 sh_sdhi_writew(host, SDHI_INFO1_MASK, INFO1M_RESP_END | in sh_sdhi_initialize_common()
703 struct sh_sdhi_host *host = mmc_priv(mmc); in sh_sdhi_send_cmd() local
705 return sh_sdhi_send_cmd_common(host, cmd, data); in sh_sdhi_send_cmd()
710 struct sh_sdhi_host *host = mmc_priv(mmc); in sh_sdhi_set_ios() local
712 return sh_sdhi_set_ios_common(host, mmc); in sh_sdhi_set_ios()
717 struct sh_sdhi_host *host = mmc_priv(mmc); in sh_sdhi_initialize() local
719 return sh_sdhi_initialize_common(host); in sh_sdhi_initialize()
757 struct sh_sdhi_host *host = NULL; in sh_sdhi_init() local
762 host = malloc(sizeof(struct sh_sdhi_host)); in sh_sdhi_init()
763 if (!host) in sh_sdhi_init()
766 mmc = mmc_create(&sh_sdhi_cfg, host); in sh_sdhi_init()
772 host->ch = ch; in sh_sdhi_init()
773 host->addr = (void __iomem *)addr; in sh_sdhi_init()
774 host->quirks = quirks; in sh_sdhi_init()
776 if (host->quirks & SH_SDHI_QUIRK_64BIT_BUF) in sh_sdhi_init()
777 host->bus_shift = 2; in sh_sdhi_init()
778 else if (host->quirks & SH_SDHI_QUIRK_16BIT_BUF) in sh_sdhi_init()
779 host->bus_shift = 1; in sh_sdhi_init()
783 if (host) in sh_sdhi_init()
784 free(host); in sh_sdhi_init()
798 struct sh_sdhi_host *host = dev_get_priv(dev); in sh_sdhi_dm_send_cmd() local
800 return sh_sdhi_send_cmd_common(host, cmd, data); in sh_sdhi_dm_send_cmd()
805 struct sh_sdhi_host *host = dev_get_priv(dev); in sh_sdhi_dm_set_ios() local
808 return sh_sdhi_set_ios_common(host, mmc); in sh_sdhi_dm_set_ios()
826 struct sh_sdhi_host *host = dev_get_priv(dev); in sh_sdhi_dm_probe() local
837 host->addr = devm_ioremap(dev, base, SZ_2K); in sh_sdhi_dm_probe()
838 if (!host->addr) in sh_sdhi_dm_probe()
853 host->quirks = quirks; in sh_sdhi_dm_probe()
855 if (host->quirks & SH_SDHI_QUIRK_64BIT_BUF) in sh_sdhi_dm_probe()
856 host->bus_shift = 2; in sh_sdhi_dm_probe()
857 else if (host->quirks & SH_SDHI_QUIRK_16BIT_BUF) in sh_sdhi_dm_probe()
858 host->bus_shift = 1; in sh_sdhi_dm_probe()
878 sh_sdhi_initialize_common(host); in sh_sdhi_dm_probe()