xref: /rk3399_rockchip-uboot/cmd/mmc_spi.c (revision 2e192b245ed36a63bab0ef576999a95e23f60ecd)
1*2e192b24SSimon Glass /*
2*2e192b24SSimon Glass  * Command for mmc_spi setup.
3*2e192b24SSimon Glass  *
4*2e192b24SSimon Glass  * Copyright (C) 2010 Thomas Chou <thomas@wytron.com.tw>
5*2e192b24SSimon Glass  * Licensed under the GPL-2 or later.
6*2e192b24SSimon Glass  */
7*2e192b24SSimon Glass 
8*2e192b24SSimon Glass #include <common.h>
9*2e192b24SSimon Glass #include <mmc.h>
10*2e192b24SSimon Glass #include <spi.h>
11*2e192b24SSimon Glass 
12*2e192b24SSimon Glass #ifndef CONFIG_MMC_SPI_BUS
13*2e192b24SSimon Glass # define CONFIG_MMC_SPI_BUS 0
14*2e192b24SSimon Glass #endif
15*2e192b24SSimon Glass #ifndef CONFIG_MMC_SPI_CS
16*2e192b24SSimon Glass # define CONFIG_MMC_SPI_CS 1
17*2e192b24SSimon Glass #endif
18*2e192b24SSimon Glass /* in SPI mode, MMC speed limit is 20MHz, while SD speed limit is 25MHz */
19*2e192b24SSimon Glass #ifndef CONFIG_MMC_SPI_SPEED
20*2e192b24SSimon Glass # define CONFIG_MMC_SPI_SPEED 25000000
21*2e192b24SSimon Glass #endif
22*2e192b24SSimon Glass /* MMC and SD specs only seem to care that sampling is on the
23*2e192b24SSimon Glass  * rising edge ... meaning SPI modes 0 or 3.  So either SPI mode
24*2e192b24SSimon Glass  * should be legit.  We'll use mode 0 since the steady state is 0,
25*2e192b24SSimon Glass  * which is appropriate for hotplugging, unless the platform data
26*2e192b24SSimon Glass  * specify mode 3 (if hardware is not compatible to mode 0).
27*2e192b24SSimon Glass  */
28*2e192b24SSimon Glass #ifndef CONFIG_MMC_SPI_MODE
29*2e192b24SSimon Glass # define CONFIG_MMC_SPI_MODE SPI_MODE_0
30*2e192b24SSimon Glass #endif
31*2e192b24SSimon Glass 
32*2e192b24SSimon Glass static int do_mmc_spi(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
33*2e192b24SSimon Glass {
34*2e192b24SSimon Glass 	uint bus = CONFIG_MMC_SPI_BUS;
35*2e192b24SSimon Glass 	uint cs = CONFIG_MMC_SPI_CS;
36*2e192b24SSimon Glass 	uint speed = CONFIG_MMC_SPI_SPEED;
37*2e192b24SSimon Glass 	uint mode = CONFIG_MMC_SPI_MODE;
38*2e192b24SSimon Glass 	char *endp;
39*2e192b24SSimon Glass 	struct mmc *mmc;
40*2e192b24SSimon Glass 
41*2e192b24SSimon Glass 	if (argc < 2)
42*2e192b24SSimon Glass 		goto usage;
43*2e192b24SSimon Glass 
44*2e192b24SSimon Glass 	cs = simple_strtoul(argv[1], &endp, 0);
45*2e192b24SSimon Glass 	if (*argv[1] == 0 || (*endp != 0 && *endp != ':'))
46*2e192b24SSimon Glass 		goto usage;
47*2e192b24SSimon Glass 	if (*endp == ':') {
48*2e192b24SSimon Glass 		if (endp[1] == 0)
49*2e192b24SSimon Glass 			goto usage;
50*2e192b24SSimon Glass 		bus = cs;
51*2e192b24SSimon Glass 		cs = simple_strtoul(endp + 1, &endp, 0);
52*2e192b24SSimon Glass 		if (*endp != 0)
53*2e192b24SSimon Glass 			goto usage;
54*2e192b24SSimon Glass 	}
55*2e192b24SSimon Glass 	if (argc >= 3) {
56*2e192b24SSimon Glass 		speed = simple_strtoul(argv[2], &endp, 0);
57*2e192b24SSimon Glass 		if (*argv[2] == 0 || *endp != 0)
58*2e192b24SSimon Glass 			goto usage;
59*2e192b24SSimon Glass 	}
60*2e192b24SSimon Glass 	if (argc >= 4) {
61*2e192b24SSimon Glass 		mode = simple_strtoul(argv[3], &endp, 16);
62*2e192b24SSimon Glass 		if (*argv[3] == 0 || *endp != 0)
63*2e192b24SSimon Glass 			goto usage;
64*2e192b24SSimon Glass 	}
65*2e192b24SSimon Glass 	if (!spi_cs_is_valid(bus, cs)) {
66*2e192b24SSimon Glass 		printf("Invalid SPI bus %u cs %u\n", bus, cs);
67*2e192b24SSimon Glass 		return 1;
68*2e192b24SSimon Glass 	}
69*2e192b24SSimon Glass 
70*2e192b24SSimon Glass 	mmc = mmc_spi_init(bus, cs, speed, mode);
71*2e192b24SSimon Glass 	if (!mmc) {
72*2e192b24SSimon Glass 		printf("Failed to create MMC Device\n");
73*2e192b24SSimon Glass 		return 1;
74*2e192b24SSimon Glass 	}
75*2e192b24SSimon Glass 	printf("%s: %d at %u:%u hz %u mode %u\n", mmc->cfg->name, mmc->block_dev.dev,
76*2e192b24SSimon Glass 	       bus, cs, speed, mode);
77*2e192b24SSimon Glass 	mmc_init(mmc);
78*2e192b24SSimon Glass 	return 0;
79*2e192b24SSimon Glass 
80*2e192b24SSimon Glass usage:
81*2e192b24SSimon Glass 	return CMD_RET_USAGE;
82*2e192b24SSimon Glass }
83*2e192b24SSimon Glass 
84*2e192b24SSimon Glass U_BOOT_CMD(
85*2e192b24SSimon Glass 	mmc_spi,	4,	0,	do_mmc_spi,
86*2e192b24SSimon Glass 	"mmc_spi setup",
87*2e192b24SSimon Glass 	"[bus:]cs [hz] [mode]	- setup mmc_spi device"
88*2e192b24SSimon Glass );
89