Lines Matching refs:host

37 static inline void sh_sdhi_writeq(struct sh_sdhi_host *host, int reg, u64 val)  in sh_sdhi_writeq()  argument
39 writeq(val, host->addr + (reg << host->bus_shift)); in sh_sdhi_writeq()
42 static inline u64 sh_sdhi_readq(struct sh_sdhi_host *host, int reg) in sh_sdhi_readq() argument
44 return readq(host->addr + (reg << host->bus_shift)); in sh_sdhi_readq()
47 static inline void sh_sdhi_writew(struct sh_sdhi_host *host, int reg, u16 val) in sh_sdhi_writew() argument
49 writew(val, host->addr + (reg << host->bus_shift)); in sh_sdhi_writew()
52 static inline u16 sh_sdhi_readw(struct sh_sdhi_host *host, int reg) in sh_sdhi_readw() argument
54 return readw(host->addr + (reg << host->bus_shift)); in sh_sdhi_readw()
57 static void sh_sdhi_detect(struct sh_sdhi_host *host) in sh_sdhi_detect() argument
59 sh_sdhi_writew(host, SDHI_OPTION, in sh_sdhi_detect()
60 OPT_BUS_WIDTH_1 | sh_sdhi_readw(host, SDHI_OPTION)); in sh_sdhi_detect()
62 host->detect_waiting = 0; in sh_sdhi_detect()
67 struct sh_sdhi_host *host = dev_id; in sh_sdhi_intr() local
70 state1 = sh_sdhi_readw(host, SDHI_INFO1); in sh_sdhi_intr()
71 state2 = sh_sdhi_readw(host, SDHI_INFO2); in sh_sdhi_intr()
77 sh_sdhi_writew(host, SDHI_INFO1, ~INFO1_CARD_IN); in sh_sdhi_intr()
78 if (!host->detect_waiting) { in sh_sdhi_intr()
79 host->detect_waiting = 1; in sh_sdhi_intr()
80 sh_sdhi_detect(host); in sh_sdhi_intr()
82 sh_sdhi_writew(host, SDHI_INFO1_MASK, INFO1M_RESP_END | in sh_sdhi_intr()
89 sh_sdhi_writew(host, SDHI_INFO1, ~INFO1_CARD_RE); in sh_sdhi_intr()
90 if (!host->detect_waiting) { in sh_sdhi_intr()
91 host->detect_waiting = 1; in sh_sdhi_intr()
92 sh_sdhi_detect(host); in sh_sdhi_intr()
94 sh_sdhi_writew(host, SDHI_INFO1_MASK, INFO1M_RESP_END | in sh_sdhi_intr()
97 sh_sdhi_writew(host, SDHI_SDIO_INFO1_MASK, SDIO_INFO1M_ON); in sh_sdhi_intr()
98 sh_sdhi_writew(host, SDHI_SDIO_MODE, SDIO_MODE_OFF); in sh_sdhi_intr()
103 sh_sdhi_writew(host, SDHI_INFO2, in sh_sdhi_intr()
105 sh_sdhi_writew(host, SDHI_INFO2_MASK, in sh_sdhi_intr()
107 sh_sdhi_readw(host, SDHI_INFO2_MASK)); in sh_sdhi_intr()
108 host->sd_error = 1; in sh_sdhi_intr()
109 host->wait_int = 1; in sh_sdhi_intr()
114 sh_sdhi_writew(host, SDHI_INFO1, ~INFO1_RESP_END); in sh_sdhi_intr()
115 sh_sdhi_writew(host, SDHI_INFO1_MASK, in sh_sdhi_intr()
117 sh_sdhi_readw(host, SDHI_INFO1_MASK)); in sh_sdhi_intr()
118 host->wait_int = 1; in sh_sdhi_intr()
123 sh_sdhi_writew(host, SDHI_INFO2, ~INFO2_BRE_ENABLE); in sh_sdhi_intr()
124 sh_sdhi_writew(host, SDHI_INFO2_MASK, in sh_sdhi_intr()
126 sh_sdhi_readw(host, SDHI_INFO2_MASK)); in sh_sdhi_intr()
127 host->wait_int = 1; in sh_sdhi_intr()
132 sh_sdhi_writew(host, SDHI_INFO2, ~INFO2_BWE_ENABLE); in sh_sdhi_intr()
133 sh_sdhi_writew(host, SDHI_INFO2_MASK, in sh_sdhi_intr()
135 sh_sdhi_readw(host, SDHI_INFO2_MASK)); in sh_sdhi_intr()
136 host->wait_int = 1; in sh_sdhi_intr()
141 sh_sdhi_writew(host, SDHI_INFO1, ~INFO1_ACCESS_END); in sh_sdhi_intr()
142 sh_sdhi_writew(host, SDHI_INFO1_MASK, in sh_sdhi_intr()
144 sh_sdhi_readw(host, SDHI_INFO1_MASK)); in sh_sdhi_intr()
145 host->wait_int = 1; in sh_sdhi_intr()
151 static int sh_sdhi_wait_interrupt_flag(struct sh_sdhi_host *host) in sh_sdhi_wait_interrupt_flag() argument
162 if (!sh_sdhi_intr(host)) in sh_sdhi_wait_interrupt_flag()
171 static int sh_sdhi_clock_control(struct sh_sdhi_host *host, unsigned long clk) in sh_sdhi_clock_control() argument
175 if (sh_sdhi_readw(host, SDHI_INFO2) & (1 << 14)) { in sh_sdhi_clock_control()
180 sh_sdhi_writew(host, SDHI_CLK_CTRL, in sh_sdhi_clock_control()
181 ~CLK_ENABLE & sh_sdhi_readw(host, SDHI_CLK_CTRL)); in sh_sdhi_clock_control()
191 sh_sdhi_writew(host, SDHI_CLK_CTRL, clkdiv); in sh_sdhi_clock_control()
196 if ((sh_sdhi_readw(host, SDHI_INFO2) & 0x2000)) in sh_sdhi_clock_control()
201 sh_sdhi_writew(host, SDHI_CLK_CTRL, in sh_sdhi_clock_control()
202 CLK_ENABLE | sh_sdhi_readw(host, SDHI_CLK_CTRL)); in sh_sdhi_clock_control()
209 static int sh_sdhi_sync_reset(struct sh_sdhi_host *host) in sh_sdhi_sync_reset() argument
212 sh_sdhi_writew(host, SDHI_SOFT_RST, SOFT_RST_ON); in sh_sdhi_sync_reset()
213 sh_sdhi_writew(host, SDHI_SOFT_RST, SOFT_RST_OFF); in sh_sdhi_sync_reset()
214 sh_sdhi_writew(host, SDHI_CLK_CTRL, in sh_sdhi_sync_reset()
215 CLK_ENABLE | sh_sdhi_readw(host, SDHI_CLK_CTRL)); in sh_sdhi_sync_reset()
219 if (!(sh_sdhi_readw(host, SDHI_INFO2) & INFO2_CBUSY)) in sh_sdhi_sync_reset()
227 if (host->quirks & SH_SDHI_QUIRK_16BIT_BUF) in sh_sdhi_sync_reset()
228 sh_sdhi_writew(host, SDHI_HOST_MODE, 1); in sh_sdhi_sync_reset()
233 static int sh_sdhi_error_manage(struct sh_sdhi_host *host) in sh_sdhi_error_manage() argument
238 host->sd_error = 0; in sh_sdhi_error_manage()
239 host->wait_int = 0; in sh_sdhi_error_manage()
241 e_state1 = sh_sdhi_readw(host, SDHI_ERR_STS1); in sh_sdhi_error_manage()
242 e_state2 = sh_sdhi_readw(host, SDHI_ERR_STS2); in sh_sdhi_error_manage()
249 DRIVER_NAME, sh_sdhi_readw(host, SDHI_ERR_STS2)); in sh_sdhi_error_manage()
250 sh_sdhi_sync_reset(host); in sh_sdhi_error_manage()
252 sh_sdhi_writew(host, SDHI_INFO1_MASK, in sh_sdhi_error_manage()
262 DRIVER_NAME, sh_sdhi_readw(host, SDHI_ERR_STS1)); in sh_sdhi_error_manage()
263 sh_sdhi_sync_reset(host); in sh_sdhi_error_manage()
264 sh_sdhi_writew(host, SDHI_INFO1_MASK, in sh_sdhi_error_manage()
269 static int sh_sdhi_single_read(struct sh_sdhi_host *host, struct mmc_data *data) in sh_sdhi_single_read() argument
282 host->wait_int = 0; in sh_sdhi_single_read()
283 sh_sdhi_writew(host, SDHI_INFO2_MASK, in sh_sdhi_single_read()
285 sh_sdhi_readw(host, SDHI_INFO2_MASK)); in sh_sdhi_single_read()
286 sh_sdhi_writew(host, SDHI_INFO1_MASK, in sh_sdhi_single_read()
288 sh_sdhi_readw(host, SDHI_INFO1_MASK)); in sh_sdhi_single_read()
289 time = sh_sdhi_wait_interrupt_flag(host); in sh_sdhi_single_read()
290 if (time == 0 || host->sd_error != 0) in sh_sdhi_single_read()
291 return sh_sdhi_error_manage(host); in sh_sdhi_single_read()
293 host->wait_int = 0; in sh_sdhi_single_read()
294 blocksize = sh_sdhi_readw(host, SDHI_SIZE); in sh_sdhi_single_read()
295 if (host->quirks & SH_SDHI_QUIRK_64BIT_BUF) in sh_sdhi_single_read()
297 *q++ = sh_sdhi_readq(host, SDHI_BUF0); in sh_sdhi_single_read()
300 *p++ = sh_sdhi_readw(host, SDHI_BUF0); in sh_sdhi_single_read()
302 time = sh_sdhi_wait_interrupt_flag(host); in sh_sdhi_single_read()
303 if (time == 0 || host->sd_error != 0) in sh_sdhi_single_read()
304 return sh_sdhi_error_manage(host); in sh_sdhi_single_read()
306 host->wait_int = 0; in sh_sdhi_single_read()
310 static int sh_sdhi_multi_read(struct sh_sdhi_host *host, struct mmc_data *data) in sh_sdhi_multi_read() argument
326 host->wait_int = 0; in sh_sdhi_multi_read()
328 sh_sdhi_writew(host, SDHI_INFO2_MASK, in sh_sdhi_multi_read()
330 sh_sdhi_readw(host, SDHI_INFO2_MASK)); in sh_sdhi_multi_read()
332 time = sh_sdhi_wait_interrupt_flag(host); in sh_sdhi_multi_read()
333 if (time == 0 || host->sd_error != 0) in sh_sdhi_multi_read()
334 return sh_sdhi_error_manage(host); in sh_sdhi_multi_read()
336 host->wait_int = 0; in sh_sdhi_multi_read()
337 blocksize = sh_sdhi_readw(host, SDHI_SIZE); in sh_sdhi_multi_read()
338 if (host->quirks & SH_SDHI_QUIRK_64BIT_BUF) in sh_sdhi_multi_read()
340 *q++ = sh_sdhi_readq(host, SDHI_BUF0); in sh_sdhi_multi_read()
343 *p++ = sh_sdhi_readw(host, SDHI_BUF0); in sh_sdhi_multi_read()
349 static int sh_sdhi_single_write(struct sh_sdhi_host *host, in sh_sdhi_single_write() argument
366 host->wait_int = 0; in sh_sdhi_single_write()
367 sh_sdhi_writew(host, SDHI_INFO2_MASK, in sh_sdhi_single_write()
369 sh_sdhi_readw(host, SDHI_INFO2_MASK)); in sh_sdhi_single_write()
370 sh_sdhi_writew(host, SDHI_INFO1_MASK, in sh_sdhi_single_write()
372 sh_sdhi_readw(host, SDHI_INFO1_MASK)); in sh_sdhi_single_write()
374 time = sh_sdhi_wait_interrupt_flag(host); in sh_sdhi_single_write()
375 if (time == 0 || host->sd_error != 0) in sh_sdhi_single_write()
376 return sh_sdhi_error_manage(host); in sh_sdhi_single_write()
378 host->wait_int = 0; in sh_sdhi_single_write()
379 blocksize = sh_sdhi_readw(host, SDHI_SIZE); in sh_sdhi_single_write()
380 if (host->quirks & SH_SDHI_QUIRK_64BIT_BUF) in sh_sdhi_single_write()
382 sh_sdhi_writeq(host, SDHI_BUF0, *q++); in sh_sdhi_single_write()
385 sh_sdhi_writew(host, SDHI_BUF0, *p++); in sh_sdhi_single_write()
387 time = sh_sdhi_wait_interrupt_flag(host); in sh_sdhi_single_write()
388 if (time == 0 || host->sd_error != 0) in sh_sdhi_single_write()
389 return sh_sdhi_error_manage(host); in sh_sdhi_single_write()
391 host->wait_int = 0; in sh_sdhi_single_write()
395 static int sh_sdhi_multi_write(struct sh_sdhi_host *host, struct mmc_data *data) in sh_sdhi_multi_write() argument
405 host->wait_int = 0; in sh_sdhi_multi_write()
407 sh_sdhi_writew(host, SDHI_INFO2_MASK, in sh_sdhi_multi_write()
409 sh_sdhi_readw(host, SDHI_INFO2_MASK)); in sh_sdhi_multi_write()
411 time = sh_sdhi_wait_interrupt_flag(host); in sh_sdhi_multi_write()
412 if (time == 0 || host->sd_error != 0) in sh_sdhi_multi_write()
413 return sh_sdhi_error_manage(host); in sh_sdhi_multi_write()
415 host->wait_int = 0; in sh_sdhi_multi_write()
416 blocksize = sh_sdhi_readw(host, SDHI_SIZE); in sh_sdhi_multi_write()
417 if (host->quirks & SH_SDHI_QUIRK_64BIT_BUF) in sh_sdhi_multi_write()
419 sh_sdhi_writeq(host, SDHI_BUF0, *q++); in sh_sdhi_multi_write()
422 sh_sdhi_writew(host, SDHI_BUF0, *p++); in sh_sdhi_multi_write()
428 static void sh_sdhi_get_response(struct sh_sdhi_host *host, struct mmc_cmd *cmd) in sh_sdhi_get_response() argument
435 resp[0] = sh_sdhi_readw(host, SDHI_RSP00); in sh_sdhi_get_response()
436 resp[1] = sh_sdhi_readw(host, SDHI_RSP01); in sh_sdhi_get_response()
437 resp[2] = sh_sdhi_readw(host, SDHI_RSP02); in sh_sdhi_get_response()
438 resp[3] = sh_sdhi_readw(host, SDHI_RSP03); in sh_sdhi_get_response()
439 resp[4] = sh_sdhi_readw(host, SDHI_RSP04); in sh_sdhi_get_response()
440 resp[5] = sh_sdhi_readw(host, SDHI_RSP05); in sh_sdhi_get_response()
441 resp[6] = sh_sdhi_readw(host, SDHI_RSP06); in sh_sdhi_get_response()
442 resp[7] = sh_sdhi_readw(host, SDHI_RSP07); in sh_sdhi_get_response()
451 resp[0] = sh_sdhi_readw(host, SDHI_RSP00); in sh_sdhi_get_response()
452 resp[1] = sh_sdhi_readw(host, SDHI_RSP01); in sh_sdhi_get_response()
476 static unsigned short sh_sdhi_set_cmd(struct sh_sdhi_host *host, in sh_sdhi_set_cmd() argument
479 if (host->app_cmd) { in sh_sdhi_set_cmd()
481 host->app_cmd = 0; in sh_sdhi_set_cmd()
493 host->app_cmd = 1; in sh_sdhi_set_cmd()
499 static unsigned short sh_sdhi_data_trans(struct sh_sdhi_host *host, in sh_sdhi_data_trans() argument
502 if (host->app_cmd) { in sh_sdhi_data_trans()
503 host->app_cmd = 0; in sh_sdhi_data_trans()
507 return sh_sdhi_single_read(host, data); in sh_sdhi_data_trans()
516 return sh_sdhi_multi_write(host, data); in sh_sdhi_data_trans()
518 return sh_sdhi_multi_read(host, data); in sh_sdhi_data_trans()
520 return sh_sdhi_single_write(host, data); in sh_sdhi_data_trans()
524 return sh_sdhi_single_read(host, data); in sh_sdhi_data_trans()
532 static int sh_sdhi_start_cmd(struct sh_sdhi_host *host, in sh_sdhi_start_cmd() argument
545 sh_sdhi_writew(host, SDHI_INFO1_MASK, ~INFO1M_ACCESS_END & in sh_sdhi_start_cmd()
546 sh_sdhi_readw(host, SDHI_INFO1_MASK)); in sh_sdhi_start_cmd()
548 time = sh_sdhi_wait_interrupt_flag(host); in sh_sdhi_start_cmd()
549 if (time == 0 || host->sd_error != 0) in sh_sdhi_start_cmd()
550 return sh_sdhi_error_manage(host); in sh_sdhi_start_cmd()
552 sh_sdhi_get_response(host, cmd); in sh_sdhi_start_cmd()
559 sh_sdhi_writew(host, SDHI_STOP, STOP_SEC_ENABLE); in sh_sdhi_start_cmd()
560 sh_sdhi_writew(host, SDHI_SECCNT, data->blocks); in sh_sdhi_start_cmd()
562 sh_sdhi_writew(host, SDHI_SIZE, data->blocksize); in sh_sdhi_start_cmd()
565 shcmd = sh_sdhi_set_cmd(host, data, opc); in sh_sdhi_start_cmd()
571 sh_sdhi_writew(host, SDHI_INFO1, ~INFO1_RESP_END); in sh_sdhi_start_cmd()
573 sh_sdhi_writew(host, SDHI_INFO1_MASK, in sh_sdhi_start_cmd()
574 INFO1M_RESP_END | sh_sdhi_readw(host, SDHI_INFO1_MASK)); in sh_sdhi_start_cmd()
575 sh_sdhi_writew(host, SDHI_ARG0, in sh_sdhi_start_cmd()
577 sh_sdhi_writew(host, SDHI_ARG1, in sh_sdhi_start_cmd()
583 if ((sh_sdhi_readw(host, SDHI_INFO2) & 0x2000)) in sh_sdhi_start_cmd()
587 host->wait_int = 0; in sh_sdhi_start_cmd()
588 sh_sdhi_writew(host, SDHI_INFO1_MASK, in sh_sdhi_start_cmd()
589 ~INFO1M_RESP_END & sh_sdhi_readw(host, SDHI_INFO1_MASK)); in sh_sdhi_start_cmd()
590 sh_sdhi_writew(host, SDHI_INFO2_MASK, in sh_sdhi_start_cmd()
594 sh_sdhi_readw(host, SDHI_INFO2_MASK)); in sh_sdhi_start_cmd()
596 sh_sdhi_writew(host, SDHI_CMD, (unsigned short)(shcmd & CMD_MASK)); in sh_sdhi_start_cmd()
597 time = sh_sdhi_wait_interrupt_flag(host); in sh_sdhi_start_cmd()
599 host->app_cmd = 0; in sh_sdhi_start_cmd()
600 return sh_sdhi_error_manage(host); in sh_sdhi_start_cmd()
603 if (host->sd_error) { in sh_sdhi_start_cmd()
614 ret = sh_sdhi_error_manage(host); in sh_sdhi_start_cmd()
617 host->sd_error = 0; in sh_sdhi_start_cmd()
618 host->wait_int = 0; in sh_sdhi_start_cmd()
619 host->app_cmd = 0; in sh_sdhi_start_cmd()
623 if (sh_sdhi_readw(host, SDHI_INFO1) & INFO1_RESP_END) { in sh_sdhi_start_cmd()
624 host->app_cmd = 0; in sh_sdhi_start_cmd()
628 if (host->wait_int) { in sh_sdhi_start_cmd()
629 sh_sdhi_get_response(host, cmd); in sh_sdhi_start_cmd()
630 host->wait_int = 0; in sh_sdhi_start_cmd()
634 ret = sh_sdhi_data_trans(host, data, opc); in sh_sdhi_start_cmd()
642 static int sh_sdhi_send_cmd_common(struct sh_sdhi_host *host, in sh_sdhi_send_cmd_common() argument
645 host->sd_error = 0; in sh_sdhi_send_cmd_common()
647 return sh_sdhi_start_cmd(host, data, cmd); in sh_sdhi_send_cmd_common()
650 static int sh_sdhi_set_ios_common(struct sh_sdhi_host *host, struct mmc *mmc) in sh_sdhi_set_ios_common() argument
654 ret = sh_sdhi_clock_control(host, mmc->clock); in sh_sdhi_set_ios_common()
659 sh_sdhi_writew(host, SDHI_OPTION, in sh_sdhi_set_ios_common()
661 sh_sdhi_readw(host, SDHI_OPTION))); in sh_sdhi_set_ios_common()
663 sh_sdhi_writew(host, SDHI_OPTION, in sh_sdhi_set_ios_common()
665 sh_sdhi_readw(host, SDHI_OPTION))); in sh_sdhi_set_ios_common()
667 sh_sdhi_writew(host, SDHI_OPTION, in sh_sdhi_set_ios_common()
669 sh_sdhi_readw(host, SDHI_OPTION))); in sh_sdhi_set_ios_common()
676 static int sh_sdhi_initialize_common(struct sh_sdhi_host *host) in sh_sdhi_initialize_common() argument
678 int ret = sh_sdhi_sync_reset(host); in sh_sdhi_initialize_common()
680 sh_sdhi_writew(host, SDHI_PORTSEL, USE_1PORT); in sh_sdhi_initialize_common()
683 sh_sdhi_writew(host, SDHI_EXT_SWAP, SET_SWAP); in sh_sdhi_initialize_common()
686 sh_sdhi_writew(host, SDHI_INFO1_MASK, INFO1M_RESP_END | in sh_sdhi_initialize_common()
702 struct sh_sdhi_host *host = mmc_priv(mmc); in sh_sdhi_send_cmd() local
704 return sh_sdhi_send_cmd_common(host, cmd, data); in sh_sdhi_send_cmd()
709 struct sh_sdhi_host *host = mmc_priv(mmc); in sh_sdhi_set_ios() local
711 return sh_sdhi_set_ios_common(host, mmc); in sh_sdhi_set_ios()
716 struct sh_sdhi_host *host = mmc_priv(mmc); in sh_sdhi_initialize() local
718 return sh_sdhi_initialize_common(host); in sh_sdhi_initialize()
756 struct sh_sdhi_host *host = NULL; in sh_sdhi_init() local
761 host = malloc(sizeof(struct sh_sdhi_host)); in sh_sdhi_init()
762 if (!host) in sh_sdhi_init()
765 mmc = mmc_create(&sh_sdhi_cfg, host); in sh_sdhi_init()
771 host->ch = ch; in sh_sdhi_init()
772 host->addr = (void __iomem *)addr; in sh_sdhi_init()
773 host->quirks = quirks; in sh_sdhi_init()
775 if (host->quirks & SH_SDHI_QUIRK_64BIT_BUF) in sh_sdhi_init()
776 host->bus_shift = 2; in sh_sdhi_init()
777 else if (host->quirks & SH_SDHI_QUIRK_16BIT_BUF) in sh_sdhi_init()
778 host->bus_shift = 1; in sh_sdhi_init()
782 if (host) in sh_sdhi_init()
783 free(host); in sh_sdhi_init()
797 struct sh_sdhi_host *host = dev_get_priv(dev); in sh_sdhi_dm_send_cmd() local
799 return sh_sdhi_send_cmd_common(host, cmd, data); in sh_sdhi_dm_send_cmd()
804 struct sh_sdhi_host *host = dev_get_priv(dev); in sh_sdhi_dm_set_ios() local
807 return sh_sdhi_set_ios_common(host, mmc); in sh_sdhi_dm_set_ios()
825 struct sh_sdhi_host *host = dev_get_priv(dev); in sh_sdhi_dm_probe() local
836 host->addr = devm_ioremap(dev, base, SZ_2K); in sh_sdhi_dm_probe()
837 if (!host->addr) in sh_sdhi_dm_probe()
852 host->quirks = quirks; in sh_sdhi_dm_probe()
854 if (host->quirks & SH_SDHI_QUIRK_64BIT_BUF) in sh_sdhi_dm_probe()
855 host->bus_shift = 2; in sh_sdhi_dm_probe()
856 else if (host->quirks & SH_SDHI_QUIRK_16BIT_BUF) in sh_sdhi_dm_probe()
857 host->bus_shift = 1; in sh_sdhi_dm_probe()
877 sh_sdhi_initialize_common(host); in sh_sdhi_dm_probe()