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