xref: /openbmc/u-boot/drivers/mmc/davinci_mmc.c (revision 5c8fd32b)
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * Davinci MMC Controller Driver
4  *
5  * Copyright (C) 2010 Texas Instruments Incorporated
6  */
7 
8 #include <config.h>
9 #include <common.h>
10 #include <dm.h>
11 #include <errno.h>
12 #include <mmc.h>
13 #include <command.h>
14 #include <part.h>
15 #include <malloc.h>
16 #include <asm/io.h>
17 #include <asm/arch/sdmmc_defs.h>
18 #include <asm-generic/gpio.h>
19 
20 #define DAVINCI_MAX_BLOCKS	(32)
21 #define WATCHDOG_COUNT		(100000)
22 
23 #define get_val(addr)		REG(addr)
24 #define set_val(addr, val)	REG(addr) = (val)
25 #define set_bit(addr, val)	set_val((addr), (get_val(addr) | (val)))
26 #define clear_bit(addr, val)	set_val((addr), (get_val(addr) & ~(val)))
27 
28 #ifdef CONFIG_DM_MMC
29 struct davinci_of_data {
30 	const char *name;
31 	u8 version;
32 };
33 
34 /* Davinci MMC board definitions */
35 struct davinci_mmc_priv {
36 	struct davinci_mmc_regs *reg_base;	/* Register base address */
37 	uint input_clk;		/* Input clock to MMC controller */
38 	uint version;		/* MMC Controller version */
39 	struct gpio_desc cd_gpio;       /* Card Detect GPIO */
40 	struct gpio_desc wp_gpio;       /* Write Protect GPIO */
41 };
42 
43 struct davinci_mmc_plat
44 {
45 	struct mmc_config cfg;
46 	struct mmc mmc;
47 };
48 #endif
49 
50 /* Set davinci clock prescalar value based on the required clock in HZ */
51 #if !CONFIG_IS_ENABLED(DM_MMC)
52 static void dmmc_set_clock(struct mmc *mmc, uint clock)
53 {
54 	struct davinci_mmc *host = mmc->priv;
55 #else
56 
57 static void davinci_mmc_set_clock(struct udevice *dev, uint clock)
58 {
59 	struct davinci_mmc_priv *host = dev_get_priv(dev);
60         struct mmc *mmc = mmc_get_mmc_dev(dev);
61 #endif
62 	struct davinci_mmc_regs *regs = host->reg_base;
63 	uint clkrt, sysclk2, act_clock;
64 
65 	if (clock < mmc->cfg->f_min)
66 		clock = mmc->cfg->f_min;
67 	if (clock > mmc->cfg->f_max)
68 		clock = mmc->cfg->f_max;
69 
70 	set_val(&regs->mmcclk, 0);
71 	sysclk2 = host->input_clk;
72 	clkrt = (sysclk2 / (2 * clock)) - 1;
73 
74 	/* Calculate the actual clock for the divider used */
75 	act_clock = (sysclk2 / (2 * (clkrt + 1)));
76 
77 	/* Adjust divider if actual clock exceeds the required clock */
78 	if (act_clock > clock)
79 		clkrt++;
80 
81 	/* check clock divider boundary and correct it */
82 	if (clkrt > 0xFF)
83 		clkrt = 0xFF;
84 
85 	set_val(&regs->mmcclk, (clkrt | MMCCLK_CLKEN));
86 }
87 
88 /* Status bit wait loop for MMCST1 */
89 static int
90 dmmc_wait_fifo_status(volatile struct davinci_mmc_regs *regs, uint status)
91 {
92 	uint wdog = WATCHDOG_COUNT;
93 
94 	while (--wdog && ((get_val(&regs->mmcst1) & status) != status))
95 		udelay(10);
96 
97 	if (!(get_val(&regs->mmcctl) & MMCCTL_WIDTH_4_BIT))
98 		udelay(100);
99 
100 	if (wdog == 0)
101 		return -ECOMM;
102 
103 	return 0;
104 }
105 
106 /* Busy bit wait loop for MMCST1 */
107 static int dmmc_busy_wait(volatile struct davinci_mmc_regs *regs)
108 {
109 	uint wdog = WATCHDOG_COUNT;
110 
111 	while (--wdog && (get_val(&regs->mmcst1) & MMCST1_BUSY))
112 		udelay(10);
113 
114 	if (wdog == 0)
115 		return -ECOMM;
116 
117 	return 0;
118 }
119 
120 /* Status bit wait loop for MMCST0 - Checks for error bits as well */
121 static int dmmc_check_status(volatile struct davinci_mmc_regs *regs,
122 		uint *cur_st, uint st_ready, uint st_error)
123 {
124 	uint wdog = WATCHDOG_COUNT;
125 	uint mmcstatus = *cur_st;
126 
127 	while (wdog--) {
128 		if (mmcstatus & st_ready) {
129 			*cur_st = mmcstatus;
130 			mmcstatus = get_val(&regs->mmcst1);
131 			return 0;
132 		} else if (mmcstatus & st_error) {
133 			if (mmcstatus & MMCST0_TOUTRS)
134 				return -ETIMEDOUT;
135 			printf("[ ST0 ERROR %x]\n", mmcstatus);
136 			/*
137 			 * Ignore CRC errors as some MMC cards fail to
138 			 * initialize on DM365-EVM on the SD1 slot
139 			 */
140 			if (mmcstatus & MMCST0_CRCRS)
141 				return 0;
142 			return -ECOMM;
143 		}
144 		udelay(10);
145 
146 		mmcstatus = get_val(&regs->mmcst0);
147 	}
148 
149 	printf("Status %x Timeout ST0:%x ST1:%x\n", st_ready, mmcstatus,
150 			get_val(&regs->mmcst1));
151 	return -ECOMM;
152 }
153 
154 /*
155  * Sends a command out on the bus.  Takes the device pointer,
156  * a command pointer, and an optional data pointer.
157  */
158 #if !CONFIG_IS_ENABLED(DM_MMC)
159 static int dmmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, struct mmc_data *data)
160 {
161 	struct davinci_mmc *host = mmc->priv;
162 #else
163 static int
164 davinci_mmc_send_cmd(struct udevice *dev, struct mmc_cmd *cmd, struct mmc_data *data)
165 {
166 	struct davinci_mmc_priv *host = dev_get_priv(dev);
167 #endif
168 	volatile struct davinci_mmc_regs *regs = host->reg_base;
169 	uint mmcstatus, status_rdy, status_err;
170 	uint i, cmddata, bytes_left = 0;
171 	int fifo_words, fifo_bytes, err;
172 	char *data_buf = NULL;
173 
174 	/* Clear status registers */
175 	mmcstatus = get_val(&regs->mmcst0);
176 	fifo_words = (host->version == MMC_CTLR_VERSION_2) ? 16 : 8;
177 	fifo_bytes = fifo_words << 2;
178 
179 	/* Wait for any previous busy signal to be cleared */
180 	dmmc_busy_wait(regs);
181 
182 	cmddata = cmd->cmdidx;
183 	cmddata |= MMCCMD_PPLEN;
184 
185 	/* Send init clock for CMD0 */
186 	if (cmd->cmdidx == MMC_CMD_GO_IDLE_STATE)
187 		cmddata |= MMCCMD_INITCK;
188 
189 	switch (cmd->resp_type) {
190 	case MMC_RSP_R1b:
191 		cmddata |= MMCCMD_BSYEXP;
192 		/* Fall-through */
193 	case MMC_RSP_R1:    /* R1, R1b, R5, R6, R7 */
194 		cmddata |= MMCCMD_RSPFMT_R1567;
195 		break;
196 	case MMC_RSP_R2:
197 		cmddata |= MMCCMD_RSPFMT_R2;
198 		break;
199 	case MMC_RSP_R3: /* R3, R4 */
200 		cmddata |= MMCCMD_RSPFMT_R3;
201 		break;
202 	}
203 
204 	set_val(&regs->mmcim, 0);
205 
206 	if (data) {
207 		/* clear previous data transfer if any and set new one */
208 		bytes_left = (data->blocksize * data->blocks);
209 
210 		/* Reset FIFO - Always use 32 byte fifo threshold */
211 		set_val(&regs->mmcfifoctl,
212 				(MMCFIFOCTL_FIFOLEV | MMCFIFOCTL_FIFORST));
213 
214 		if (host->version == MMC_CTLR_VERSION_2)
215 			cmddata |= MMCCMD_DMATRIG;
216 
217 		cmddata |= MMCCMD_WDATX;
218 		if (data->flags == MMC_DATA_READ) {
219 			set_val(&regs->mmcfifoctl, MMCFIFOCTL_FIFOLEV);
220 		} else if (data->flags == MMC_DATA_WRITE) {
221 			set_val(&regs->mmcfifoctl,
222 					(MMCFIFOCTL_FIFOLEV |
223 					 MMCFIFOCTL_FIFODIR));
224 			cmddata |= MMCCMD_DTRW;
225 		}
226 
227 		set_val(&regs->mmctod, 0xFFFF);
228 		set_val(&regs->mmcnblk, (data->blocks & MMCNBLK_NBLK_MASK));
229 		set_val(&regs->mmcblen, (data->blocksize & MMCBLEN_BLEN_MASK));
230 
231 		if (data->flags == MMC_DATA_WRITE) {
232 			uint val;
233 			data_buf = (char *)data->src;
234 			/* For write, fill FIFO with data before issue of CMD */
235 			for (i = 0; (i < fifo_words) && bytes_left; i++) {
236 				memcpy((char *)&val, data_buf, 4);
237 				set_val(&regs->mmcdxr, val);
238 				data_buf += 4;
239 				bytes_left -= 4;
240 			}
241 		}
242 	} else {
243 		set_val(&regs->mmcblen, 0);
244 		set_val(&regs->mmcnblk, 0);
245 	}
246 
247 	set_val(&regs->mmctor, 0x1FFF);
248 
249 	/* Send the command */
250 	set_val(&regs->mmcarghl, cmd->cmdarg);
251 	set_val(&regs->mmccmd, cmddata);
252 
253 	status_rdy = MMCST0_RSPDNE;
254 	status_err = (MMCST0_TOUTRS | MMCST0_TOUTRD |
255 			MMCST0_CRCWR | MMCST0_CRCRD);
256 	if (cmd->resp_type & MMC_RSP_CRC)
257 		status_err |= MMCST0_CRCRS;
258 
259 	mmcstatus = get_val(&regs->mmcst0);
260 	err = dmmc_check_status(regs, &mmcstatus, status_rdy, status_err);
261 	if (err)
262 		return err;
263 
264 	/* For R1b wait for busy done */
265 	if (cmd->resp_type == MMC_RSP_R1b)
266 		dmmc_busy_wait(regs);
267 
268 	/* Collect response from controller for specific commands */
269 	if (mmcstatus & MMCST0_RSPDNE) {
270 		/* Copy the response to the response buffer */
271 		if (cmd->resp_type & MMC_RSP_136) {
272 			cmd->response[0] = get_val(&regs->mmcrsp67);
273 			cmd->response[1] = get_val(&regs->mmcrsp45);
274 			cmd->response[2] = get_val(&regs->mmcrsp23);
275 			cmd->response[3] = get_val(&regs->mmcrsp01);
276 		} else if (cmd->resp_type & MMC_RSP_PRESENT) {
277 			cmd->response[0] = get_val(&regs->mmcrsp67);
278 		}
279 	}
280 
281 	if (data == NULL)
282 		return 0;
283 
284 	if (data->flags == MMC_DATA_READ) {
285 		/* check for DATDNE along with DRRDY as the controller might
286 		 * set the DATDNE without DRRDY for smaller transfers with
287 		 * less than FIFO threshold bytes
288 		 */
289 		status_rdy = MMCST0_DRRDY | MMCST0_DATDNE;
290 		status_err = MMCST0_TOUTRD | MMCST0_CRCRD;
291 		data_buf = data->dest;
292 	} else {
293 		status_rdy = MMCST0_DXRDY | MMCST0_DATDNE;
294 		status_err = MMCST0_CRCWR;
295 	}
296 
297 	/* Wait until all of the blocks are transferred */
298 	while (bytes_left) {
299 		err = dmmc_check_status(regs, &mmcstatus, status_rdy,
300 				status_err);
301 		if (err)
302 			return err;
303 
304 		if (data->flags == MMC_DATA_READ) {
305 			/*
306 			 * MMC controller sets the Data receive ready bit
307 			 * (DRRDY) in MMCST0 even before the entire FIFO is
308 			 * full. This results in erratic behavior if we start
309 			 * reading the FIFO soon after DRRDY.  Wait for the
310 			 * FIFO full bit in MMCST1 for proper FIFO clearing.
311 			 */
312 			if (bytes_left > fifo_bytes)
313 				dmmc_wait_fifo_status(regs, 0x4a);
314 			else if (bytes_left == fifo_bytes) {
315 				dmmc_wait_fifo_status(regs, 0x40);
316 				if (cmd->cmdidx == MMC_CMD_SEND_EXT_CSD)
317 					udelay(600);
318 			}
319 
320 			for (i = 0; bytes_left && (i < fifo_words); i++) {
321 				cmddata = get_val(&regs->mmcdrr);
322 				memcpy(data_buf, (char *)&cmddata, 4);
323 				data_buf += 4;
324 				bytes_left -= 4;
325 			}
326 		} else {
327 			/*
328 			 * MMC controller sets the Data transmit ready bit
329 			 * (DXRDY) in MMCST0 even before the entire FIFO is
330 			 * empty. This results in erratic behavior if we start
331 			 * writing the FIFO soon after DXRDY.  Wait for the
332 			 * FIFO empty bit in MMCST1 for proper FIFO clearing.
333 			 */
334 			dmmc_wait_fifo_status(regs, MMCST1_FIFOEMP);
335 			for (i = 0; bytes_left && (i < fifo_words); i++) {
336 				memcpy((char *)&cmddata, data_buf, 4);
337 				set_val(&regs->mmcdxr, cmddata);
338 				data_buf += 4;
339 				bytes_left -= 4;
340 			}
341 			dmmc_busy_wait(regs);
342 		}
343 	}
344 
345 	err = dmmc_check_status(regs, &mmcstatus, MMCST0_DATDNE, status_err);
346 	if (err)
347 		return err;
348 
349 	return 0;
350 }
351 
352 /* Initialize Davinci MMC controller */
353 #if !CONFIG_IS_ENABLED(DM_MMC)
354 static int dmmc_init(struct mmc *mmc)
355 {
356 	struct davinci_mmc *host = mmc->priv;
357 #else
358 static int davinci_dm_mmc_init(struct udevice *dev)
359 {
360 	struct davinci_mmc_priv *host = dev_get_priv(dev);
361 #endif
362 	struct davinci_mmc_regs *regs = host->reg_base;
363 
364 	/* Clear status registers explicitly - soft reset doesn't clear it
365 	 * If Uboot is invoked from UBL with SDMMC Support, the status
366 	 * registers can have uncleared bits
367 	 */
368 	get_val(&regs->mmcst0);
369 	get_val(&regs->mmcst1);
370 
371 	/* Hold software reset */
372 	set_bit(&regs->mmcctl, MMCCTL_DATRST);
373 	set_bit(&regs->mmcctl, MMCCTL_CMDRST);
374 	udelay(10);
375 
376 	set_val(&regs->mmcclk, 0x0);
377 	set_val(&regs->mmctor, 0x1FFF);
378 	set_val(&regs->mmctod, 0xFFFF);
379 
380 	/* Clear software reset */
381 	clear_bit(&regs->mmcctl, MMCCTL_DATRST);
382 	clear_bit(&regs->mmcctl, MMCCTL_CMDRST);
383 
384 	udelay(10);
385 
386 	/* Reset FIFO - Always use the maximum fifo threshold */
387 	set_val(&regs->mmcfifoctl, (MMCFIFOCTL_FIFOLEV | MMCFIFOCTL_FIFORST));
388 	set_val(&regs->mmcfifoctl, MMCFIFOCTL_FIFOLEV);
389 
390 	return 0;
391 }
392 
393 /* Set buswidth or clock as indicated by the MMC framework */
394 #if !CONFIG_IS_ENABLED(DM_MMC)
395 static int dmmc_set_ios(struct mmc *mmc)
396 {
397 	struct davinci_mmc *host = mmc->priv;
398 	struct davinci_mmc_regs *regs = host->reg_base;
399 #else
400 static int davinci_mmc_set_ios(struct udevice *dev)
401 {
402 	struct mmc *mmc = mmc_get_mmc_dev(dev);
403 
404 	struct davinci_mmc_priv *host = dev_get_priv(dev);
405 	struct davinci_mmc_regs *regs = host->reg_base;
406 #endif
407 	/* Set the bus width */
408 	if (mmc->bus_width == 4)
409 		set_bit(&regs->mmcctl, MMCCTL_WIDTH_4_BIT);
410 	else
411 		clear_bit(&regs->mmcctl, MMCCTL_WIDTH_4_BIT);
412 
413 	/* Set clock speed */
414 	if (mmc->clock) {
415 #if !CONFIG_IS_ENABLED(DM_MMC)
416 		dmmc_set_clock(mmc, mmc->clock);
417 #else
418 		davinci_mmc_set_clock(dev, mmc->clock);
419 #endif
420 	}
421 	return 0;
422 }
423 
424 #if !CONFIG_IS_ENABLED(DM_MMC)
425 static const struct mmc_ops dmmc_ops = {
426        .send_cmd       = dmmc_send_cmd,
427        .set_ios        = dmmc_set_ios,
428        .init           = dmmc_init,
429 };
430 #else
431 
432 static int davinci_mmc_getcd(struct udevice *dev)
433 {
434 	int value = -1;
435 #if CONFIG_IS_ENABLED(DM_GPIO)
436 	struct davinci_mmc_priv *priv = dev_get_priv(dev);
437 	value = dm_gpio_get_value(&priv->cd_gpio);
438 #endif
439 	/* if no CD return as 1 */
440 	if (value < 0)
441 		return 1;
442 
443 	return value;
444 }
445 
446 static int davinci_mmc_getwp(struct udevice *dev)
447 {
448 	int value = -1;
449 #if CONFIG_IS_ENABLED(DM_GPIO)
450 	struct davinci_mmc_priv *priv = dev_get_priv(dev);
451 
452 	value = dm_gpio_get_value(&priv->wp_gpio);
453 #endif
454 	/* if no WP return as 0 */
455 	if (value < 0)
456 		return 0;
457 
458 	return value;
459 }
460 
461 static const struct dm_mmc_ops davinci_mmc_ops = {
462 	.send_cmd	= davinci_mmc_send_cmd,
463 	.set_ios	= davinci_mmc_set_ios,
464 	.get_cd		= davinci_mmc_getcd,
465 	.get_wp		= davinci_mmc_getwp,
466 };
467 #endif
468 
469 #if !CONFIG_IS_ENABLED(DM_MMC)
470 /* Called from board_mmc_init during startup. Can be called multiple times
471 * depending on the number of slots available on board and controller
472 */
473 int davinci_mmc_init(bd_t *bis, struct davinci_mmc *host)
474 {
475 	host->cfg.name = "davinci";
476 	host->cfg.ops = &dmmc_ops;
477 	host->cfg.f_min = 200000;
478 	host->cfg.f_max = 25000000;
479 	host->cfg.voltages = host->voltages;
480 	host->cfg.host_caps = host->host_caps;
481 
482 	host->cfg.b_max = DAVINCI_MAX_BLOCKS;
483 
484 	mmc_create(&host->cfg, host);
485 
486 	return 0;
487 }
488 #else
489 
490 
491 static int davinci_mmc_probe(struct udevice *dev)
492 {
493 	struct mmc_uclass_priv *upriv = dev_get_uclass_priv(dev);
494 	struct davinci_mmc_plat *plat = dev_get_platdata(dev);
495 	struct davinci_mmc_priv *priv = dev_get_priv(dev);
496 	struct mmc_config *cfg = &plat->cfg;
497 	struct davinci_of_data *data =
498 			(struct davinci_of_data *)dev_get_driver_data(dev);
499 	cfg->f_min = 200000;
500 	cfg->f_max = 25000000;
501 	cfg->voltages = MMC_VDD_32_33 | MMC_VDD_33_34,
502 	cfg->host_caps = MMC_MODE_4BIT, /* DA850 supports only 4-bit SD/MMC */
503 	cfg->b_max = DAVINCI_MAX_BLOCKS;
504 
505 	if (data) {
506 		cfg->name = data->name;
507 		priv->version = data->version;
508 	}
509 
510 	priv->reg_base = (struct davinci_mmc_regs *)dev_read_addr(dev);
511 	priv->input_clk = clk_get(DAVINCI_MMCSD_CLKID);
512 
513 #if CONFIG_IS_ENABLED(DM_GPIO)
514 	/* These GPIOs are optional */
515 	gpio_request_by_name(dev, "cd-gpios", 0, &priv->cd_gpio, GPIOD_IS_IN);
516 	gpio_request_by_name(dev, "wp-gpios", 0, &priv->wp_gpio, GPIOD_IS_IN);
517 #endif
518 
519 	upriv->mmc = &plat->mmc;
520 
521 	return davinci_dm_mmc_init(dev);
522 }
523 
524 static int davinci_mmc_bind(struct udevice *dev)
525 {
526 	struct davinci_mmc_plat *plat = dev_get_platdata(dev);
527 
528 	return mmc_bind(dev, &plat->mmc, &plat->cfg);
529 }
530 
531 
532 const struct davinci_of_data davinci_mmc_host_info[] = {
533 	{
534 		.name	= "dm6441-mmc",
535 		.version = MMC_CTLR_VERSION_1,
536 	},
537 	{
538 		.name	= "da830-mmc",
539 		.version = MMC_CTLR_VERSION_2,
540 	},
541 	{},
542 };
543 
544 static const struct udevice_id davinci_mmc_ids[] = {
545 	{
546 		.compatible = "ti,dm6441-mmc",
547 		.data = (ulong) &davinci_mmc_host_info[MMC_CTLR_VERSION_1]
548 	},
549 	{
550 		.compatible = "ti,da830-mmc",
551 		.data = (ulong) &davinci_mmc_host_info[MMC_CTLR_VERSION_2]
552 	},
553 	{},
554 };
555 
556 U_BOOT_DRIVER(davinci_mmc_drv) = {
557 	.name = "davinci_mmc",
558 	.id		= UCLASS_MMC,
559 	.of_match	= davinci_mmc_ids,
560 #if CONFIG_BLK
561 	.bind		= davinci_mmc_bind,
562 #endif
563 	.probe = davinci_mmc_probe,
564 	.ops = &davinci_mmc_ops,
565 	.platdata_auto_alloc_size = sizeof(struct davinci_mmc_plat),
566 	.priv_auto_alloc_size = sizeof(struct davinci_mmc_priv),
567 };
568 #endif
569