Lines Matching full:host
26 struct sh_mmcif_host *host = dev_id; in sh_mmcif_intr() local
29 state = sh_mmcif_read(&host->regs->ce_int); in sh_mmcif_intr()
30 state &= sh_mmcif_read(&host->regs->ce_int_mask); in sh_mmcif_intr()
33 sh_mmcif_write(~(INT_RBSYE | INT_CRSPE), &host->regs->ce_int); in sh_mmcif_intr()
34 sh_mmcif_bitclr(MASK_MRBSYE, &host->regs->ce_int_mask); in sh_mmcif_intr()
37 sh_mmcif_write(~INT_CRSPE, &host->regs->ce_int); in sh_mmcif_intr()
38 sh_mmcif_bitclr(MASK_MCRSPE, &host->regs->ce_int_mask); in sh_mmcif_intr()
40 if (sh_mmcif_read(&host->regs->ce_cmd_set) & CMD_SET_RBSY) in sh_mmcif_intr()
44 sh_mmcif_write(~INT_BUFREN, &host->regs->ce_int); in sh_mmcif_intr()
45 sh_mmcif_bitclr(MASK_MBUFREN, &host->regs->ce_int_mask); in sh_mmcif_intr()
48 sh_mmcif_write(~INT_BUFWEN, &host->regs->ce_int); in sh_mmcif_intr()
49 sh_mmcif_bitclr(MASK_MBUFWEN, &host->regs->ce_int_mask); in sh_mmcif_intr()
53 INT_BUFRE), &host->regs->ce_int); in sh_mmcif_intr()
54 sh_mmcif_bitclr(MASK_MCMD12DRE, &host->regs->ce_int_mask); in sh_mmcif_intr()
57 sh_mmcif_write(~INT_BUFRE, &host->regs->ce_int); in sh_mmcif_intr()
58 sh_mmcif_bitclr(MASK_MBUFRE, &host->regs->ce_int_mask); in sh_mmcif_intr()
61 sh_mmcif_write(~INT_DTRANE, &host->regs->ce_int); in sh_mmcif_intr()
62 sh_mmcif_bitclr(MASK_MDTRANE, &host->regs->ce_int_mask); in sh_mmcif_intr()
66 &host->regs->ce_int); in sh_mmcif_intr()
67 sh_mmcif_bitclr(MASK_MCMD12RBE, &host->regs->ce_int_mask); in sh_mmcif_intr()
71 sh_mmcif_write(~state, &host->regs->ce_int); in sh_mmcif_intr()
72 sh_mmcif_bitclr(state, &host->regs->ce_int_mask); in sh_mmcif_intr()
78 host->sd_error = 1; in sh_mmcif_intr()
81 host->wait_int = 1; in sh_mmcif_intr()
85 static int mmcif_wait_interrupt_flag(struct sh_mmcif_host *host) in mmcif_wait_interrupt_flag() argument
96 if (!sh_mmcif_intr(host)) in mmcif_wait_interrupt_flag()
105 static void sh_mmcif_clock_control(struct sh_mmcif_host *host, unsigned int clk) in sh_mmcif_clock_control() argument
107 sh_mmcif_bitclr(CLK_ENABLE, &host->regs->ce_clk_ctrl); in sh_mmcif_clock_control()
108 sh_mmcif_bitclr(CLK_CLEAR, &host->regs->ce_clk_ctrl); in sh_mmcif_clock_control()
114 sh_mmcif_bitset(CLK_PCLK, &host->regs->ce_clk_ctrl); in sh_mmcif_clock_control()
116 sh_mmcif_bitset((fls(DIV_ROUND_UP(host->clk, in sh_mmcif_clock_control()
118 &host->regs->ce_clk_ctrl); in sh_mmcif_clock_control()
119 sh_mmcif_bitset(CLK_ENABLE, &host->regs->ce_clk_ctrl); in sh_mmcif_clock_control()
122 static void sh_mmcif_sync_reset(struct sh_mmcif_host *host) in sh_mmcif_sync_reset() argument
126 tmp = sh_mmcif_read(&host->regs->ce_clk_ctrl) & (CLK_ENABLE | in sh_mmcif_sync_reset()
129 sh_mmcif_write(SOFT_RST_ON, &host->regs->ce_version); in sh_mmcif_sync_reset()
130 sh_mmcif_write(SOFT_RST_OFF, &host->regs->ce_version); in sh_mmcif_sync_reset()
132 &host->regs->ce_clk_ctrl); in sh_mmcif_sync_reset()
134 sh_mmcif_bitset(BUF_ACC_ATYP, &host->regs->ce_buf_acc); in sh_mmcif_sync_reset()
137 static int sh_mmcif_error_manage(struct sh_mmcif_host *host) in sh_mmcif_error_manage() argument
142 host->sd_error = 0; in sh_mmcif_error_manage()
143 host->wait_int = 0; in sh_mmcif_error_manage()
145 state1 = sh_mmcif_read(&host->regs->ce_host_sts1); in sh_mmcif_error_manage()
146 state2 = sh_mmcif_read(&host->regs->ce_host_sts2); in sh_mmcif_error_manage()
148 DRIVER_NAME, sh_mmcif_read(&host->regs->ce_host_sts1)); in sh_mmcif_error_manage()
150 DRIVER_NAME, sh_mmcif_read(&host->regs->ce_host_sts2)); in sh_mmcif_error_manage()
154 sh_mmcif_bitset(CMD_CTRL_BREAK, &host->regs->ce_cmd_ctrl); in sh_mmcif_error_manage()
155 sh_mmcif_bitset(~CMD_CTRL_BREAK, &host->regs->ce_cmd_ctrl); in sh_mmcif_error_manage()
163 if (!(sh_mmcif_read(&host->regs->ce_host_sts1) in sh_mmcif_error_manage()
167 sh_mmcif_sync_reset(host); in sh_mmcif_error_manage()
180 static int sh_mmcif_single_read(struct sh_mmcif_host *host, in sh_mmcif_single_read() argument
192 host->wait_int = 0; in sh_mmcif_single_read()
195 sh_mmcif_bitset(MASK_MBUFREN, &host->regs->ce_int_mask); in sh_mmcif_single_read()
196 time = mmcif_wait_interrupt_flag(host); in sh_mmcif_single_read()
197 if (time == 0 || host->sd_error != 0) in sh_mmcif_single_read()
198 return sh_mmcif_error_manage(host); in sh_mmcif_single_read()
200 host->wait_int = 0; in sh_mmcif_single_read()
202 sh_mmcif_read(&host->regs->ce_block_set)) + 3; in sh_mmcif_single_read()
204 *p++ = sh_mmcif_read(&host->regs->ce_data); in sh_mmcif_single_read()
207 sh_mmcif_bitset(MASK_MBUFRE, &host->regs->ce_int_mask); in sh_mmcif_single_read()
208 time = mmcif_wait_interrupt_flag(host); in sh_mmcif_single_read()
209 if (time == 0 || host->sd_error != 0) in sh_mmcif_single_read()
210 return sh_mmcif_error_manage(host); in sh_mmcif_single_read()
212 host->wait_int = 0; in sh_mmcif_single_read()
216 static int sh_mmcif_multi_read(struct sh_mmcif_host *host, in sh_mmcif_multi_read() argument
228 host->wait_int = 0; in sh_mmcif_multi_read()
229 blocksize = BLOCK_SIZE_MASK & sh_mmcif_read(&host->regs->ce_block_set); in sh_mmcif_multi_read()
231 sh_mmcif_bitset(MASK_MBUFREN, &host->regs->ce_int_mask); in sh_mmcif_multi_read()
232 time = mmcif_wait_interrupt_flag(host); in sh_mmcif_multi_read()
233 if (time == 0 || host->sd_error != 0) in sh_mmcif_multi_read()
234 return sh_mmcif_error_manage(host); in sh_mmcif_multi_read()
236 host->wait_int = 0; in sh_mmcif_multi_read()
238 *p++ = sh_mmcif_read(&host->regs->ce_data); in sh_mmcif_multi_read()
245 static int sh_mmcif_single_write(struct sh_mmcif_host *host, in sh_mmcif_single_write() argument
257 host->wait_int = 0; in sh_mmcif_single_write()
258 sh_mmcif_bitset(MASK_MBUFWEN, &host->regs->ce_int_mask); in sh_mmcif_single_write()
260 time = mmcif_wait_interrupt_flag(host); in sh_mmcif_single_write()
261 if (time == 0 || host->sd_error != 0) in sh_mmcif_single_write()
262 return sh_mmcif_error_manage(host); in sh_mmcif_single_write()
264 host->wait_int = 0; in sh_mmcif_single_write()
266 sh_mmcif_read(&host->regs->ce_block_set)) + 3; in sh_mmcif_single_write()
268 sh_mmcif_write(*p++, &host->regs->ce_data); in sh_mmcif_single_write()
271 sh_mmcif_bitset(MASK_MDTRANE, &host->regs->ce_int_mask); in sh_mmcif_single_write()
273 time = mmcif_wait_interrupt_flag(host); in sh_mmcif_single_write()
274 if (time == 0 || host->sd_error != 0) in sh_mmcif_single_write()
275 return sh_mmcif_error_manage(host); in sh_mmcif_single_write()
277 host->wait_int = 0; in sh_mmcif_single_write()
281 static int sh_mmcif_multi_write(struct sh_mmcif_host *host, in sh_mmcif_multi_write() argument
293 host->wait_int = 0; in sh_mmcif_multi_write()
294 blocksize = BLOCK_SIZE_MASK & sh_mmcif_read(&host->regs->ce_block_set); in sh_mmcif_multi_write()
296 sh_mmcif_bitset(MASK_MBUFWEN, &host->regs->ce_int_mask); in sh_mmcif_multi_write()
298 time = mmcif_wait_interrupt_flag(host); in sh_mmcif_multi_write()
300 if (time == 0 || host->sd_error != 0) in sh_mmcif_multi_write()
301 return sh_mmcif_error_manage(host); in sh_mmcif_multi_write()
303 host->wait_int = 0; in sh_mmcif_multi_write()
305 sh_mmcif_write(*p++, &host->regs->ce_data); in sh_mmcif_multi_write()
312 static void sh_mmcif_get_response(struct sh_mmcif_host *host, in sh_mmcif_get_response() argument
316 cmd->response[0] = sh_mmcif_read(&host->regs->ce_resp3); in sh_mmcif_get_response()
317 cmd->response[1] = sh_mmcif_read(&host->regs->ce_resp2); in sh_mmcif_get_response()
318 cmd->response[2] = sh_mmcif_read(&host->regs->ce_resp1); in sh_mmcif_get_response()
319 cmd->response[3] = sh_mmcif_read(&host->regs->ce_resp0); in sh_mmcif_get_response()
323 cmd->response[0] = sh_mmcif_read(&host->regs->ce_resp0); in sh_mmcif_get_response()
327 static void sh_mmcif_get_cmd12response(struct sh_mmcif_host *host, in sh_mmcif_get_cmd12response() argument
330 cmd->response[0] = sh_mmcif_read(&host->regs->ce_resp_cmd12); in sh_mmcif_get_cmd12response()
333 static u32 sh_mmcif_set_cmd(struct sh_mmcif_host *host, in sh_mmcif_set_cmd() argument
362 if (host->data) { in sh_mmcif_set_cmd()
364 switch (host->bus_width) { in sh_mmcif_set_cmd()
387 sh_mmcif_bitset(data->blocks << 16, &host->regs->ce_block_set); in sh_mmcif_set_cmd()
404 static u32 sh_mmcif_data_trans(struct sh_mmcif_host *host, in sh_mmcif_data_trans() argument
411 ret = sh_mmcif_multi_read(host, data); in sh_mmcif_data_trans()
414 ret = sh_mmcif_multi_write(host, data); in sh_mmcif_data_trans()
417 ret = sh_mmcif_single_write(host, data); in sh_mmcif_data_trans()
421 ret = sh_mmcif_single_read(host, data); in sh_mmcif_data_trans()
431 static int sh_mmcif_start_cmd(struct sh_mmcif_host *host, in sh_mmcif_start_cmd() argument
440 if (host->last_cmd == MMC_CMD_READ_MULTIPLE_BLOCK) in sh_mmcif_start_cmd()
442 &host->regs->ce_int_mask); in sh_mmcif_start_cmd()
445 &host->regs->ce_int_mask); in sh_mmcif_start_cmd()
447 time = mmcif_wait_interrupt_flag(host); in sh_mmcif_start_cmd()
448 if (time == 0 || host->sd_error != 0) in sh_mmcif_start_cmd()
449 return sh_mmcif_error_manage(host); in sh_mmcif_start_cmd()
451 sh_mmcif_get_cmd12response(host, cmd); in sh_mmcif_start_cmd()
464 if (host->data) { in sh_mmcif_start_cmd()
465 sh_mmcif_write(0, &host->regs->ce_block_set); in sh_mmcif_start_cmd()
466 sh_mmcif_write(data->blocksize, &host->regs->ce_block_set); in sh_mmcif_start_cmd()
468 opc = sh_mmcif_set_cmd(host, data, cmd); in sh_mmcif_start_cmd()
470 sh_mmcif_write(INT_START_MAGIC, &host->regs->ce_int); in sh_mmcif_start_cmd()
471 sh_mmcif_write(mask, &host->regs->ce_int_mask); in sh_mmcif_start_cmd()
475 sh_mmcif_write(cmd->cmdarg, &host->regs->ce_arg); in sh_mmcif_start_cmd()
476 host->wait_int = 0; in sh_mmcif_start_cmd()
478 sh_mmcif_write(opc, &host->regs->ce_cmd_set); in sh_mmcif_start_cmd()
480 time = mmcif_wait_interrupt_flag(host); in sh_mmcif_start_cmd()
482 return sh_mmcif_error_manage(host); in sh_mmcif_start_cmd()
484 if (host->sd_error) { in sh_mmcif_start_cmd()
493 ret = sh_mmcif_error_manage(host); in sh_mmcif_start_cmd()
496 host->sd_error = 0; in sh_mmcif_start_cmd()
497 host->wait_int = 0; in sh_mmcif_start_cmd()
505 if (host->wait_int == 1) { in sh_mmcif_start_cmd()
506 sh_mmcif_get_response(host, cmd); in sh_mmcif_start_cmd()
507 host->wait_int = 0; in sh_mmcif_start_cmd()
509 if (host->data) in sh_mmcif_start_cmd()
510 ret = sh_mmcif_data_trans(host, data, cmd->cmdidx); in sh_mmcif_start_cmd()
511 host->last_cmd = cmd->cmdidx; in sh_mmcif_start_cmd()
516 static int sh_mmcif_send_cmd_common(struct sh_mmcif_host *host, in sh_mmcif_send_cmd_common() argument
536 host->sd_error = 0; in sh_mmcif_send_cmd_common()
537 host->data = data; in sh_mmcif_send_cmd_common()
538 ret = sh_mmcif_start_cmd(host, data, cmd); in sh_mmcif_send_cmd_common()
539 host->data = NULL; in sh_mmcif_send_cmd_common()
544 static int sh_mmcif_set_ios_common(struct sh_mmcif_host *host, struct mmc *mmc) in sh_mmcif_set_ios_common() argument
547 sh_mmcif_clock_control(host, mmc->clock); in sh_mmcif_set_ios_common()
550 host->bus_width = MMC_BUS_WIDTH_8; in sh_mmcif_set_ios_common()
552 host->bus_width = MMC_BUS_WIDTH_4; in sh_mmcif_set_ios_common()
554 host->bus_width = MMC_BUS_WIDTH_1; in sh_mmcif_set_ios_common()
561 static int sh_mmcif_initialize_common(struct sh_mmcif_host *host) in sh_mmcif_initialize_common() argument
563 sh_mmcif_sync_reset(host); in sh_mmcif_initialize_common()
564 sh_mmcif_write(MASK_ALL, &host->regs->ce_int_mask); in sh_mmcif_initialize_common()
577 struct sh_mmcif_host *host = mmc_priv(mmc); in sh_mmcif_send_cmd() local
579 return sh_mmcif_send_cmd_common(host, cmd, data); in sh_mmcif_send_cmd()
584 struct sh_mmcif_host *host = mmc_priv(mmc); in sh_mmcif_set_ios() local
586 return sh_mmcif_set_ios_common(host, mmc); in sh_mmcif_set_ios()
591 struct sh_mmcif_host *host = mmc_priv(mmc); in sh_mmcif_initialize() local
593 return sh_mmcif_initialize_common(host); in sh_mmcif_initialize()
614 struct sh_mmcif_host *host = NULL; in mmcif_mmc_init() local
616 host = malloc(sizeof(struct sh_mmcif_host)); in mmcif_mmc_init()
617 if (!host) in mmcif_mmc_init()
619 memset(host, 0, sizeof(*host)); in mmcif_mmc_init()
621 host->regs = (struct sh_mmcif_regs *)CONFIG_SH_MMCIF_ADDR; in mmcif_mmc_init()
622 host->clk = CONFIG_SH_MMCIF_CLK; in mmcif_mmc_init()
624 sh_mmcif_cfg.f_min = MMC_CLK_DIV_MIN(host->clk); in mmcif_mmc_init()
625 sh_mmcif_cfg.f_max = MMC_CLK_DIV_MAX(host->clk); in mmcif_mmc_init()
627 mmc = mmc_create(&sh_mmcif_cfg, host); in mmcif_mmc_init()
629 free(host); in mmcif_mmc_init()
645 struct sh_mmcif_host *host = dev_get_priv(dev); in sh_mmcif_dm_send_cmd() local
647 return sh_mmcif_send_cmd_common(host, cmd, data); in sh_mmcif_dm_send_cmd()
652 struct sh_mmcif_host *host = dev_get_priv(dev); in sh_mmcif_dm_set_ios() local
655 return sh_mmcif_set_ios_common(host, mmc); in sh_mmcif_dm_set_ios()
673 struct sh_mmcif_host *host = dev_get_priv(dev); in sh_mmcif_dm_probe() local
683 host->regs = (struct sh_mmcif_regs *)devm_ioremap(dev, base, SZ_2K); in sh_mmcif_dm_probe()
684 if (!host->regs) in sh_mmcif_dm_probe()
699 host->clk = clk_set_rate(&sh_mmcif_clk, 97500000); in sh_mmcif_dm_probe()
719 sh_mmcif_initialize_common(host); in sh_mmcif_dm_probe()
722 plat->cfg.f_min = MMC_CLK_DIV_MIN(host->clk); in sh_mmcif_dm_probe()
723 plat->cfg.f_max = MMC_CLK_DIV_MAX(host->clk); in sh_mmcif_dm_probe()