cmd: spi: Permit setting bus frequency
authorMarek Vasut <marex@denx.de>
Fri, 20 Dec 2019 11:44:57 +0000 (12:44 +0100)
committerJagan Teki <jagan@amarulasolutions.com>
Mon, 27 Jan 2020 16:57:21 +0000 (22:27 +0530)
The 'sspi' command hard-coded 1 MHz bus frequency for all transmissions.
Allow changing that at runtime by specifying '@freq' bus frequency in Hz.

Signed-off-by: Marek Vasut <marex@denx.de>
Cc: Tom Rini <trini@konsulko.com>
Reviewed-by: Lukasz Majewski <lukma@denx.de>
Reviewed-by: Jagan Teki <jagan@amarulasolutions.com>
cmd/spi.c

index 75226fd36884cbd310477ca5adbc7eb93c8ef325..bfa185b6aefe1838aaf5d7ad533d7d0bf345c12f 100644 (file)
--- a/cmd/spi.c
+++ b/cmd/spi.c
@@ -28,6 +28,7 @@
 static unsigned int    bus;
 static unsigned int    cs;
 static unsigned int    mode;
+static unsigned int    freq;
 static int             bitlen;
 static uchar           dout[MAX_SPI_BYTES];
 static uchar           din[MAX_SPI_BYTES];
@@ -45,12 +46,12 @@ static int do_spi_xfer(int bus, int cs)
        str = strdup(name);
        if (!str)
                return -ENOMEM;
-       ret = spi_get_bus_and_cs(bus, cs, 1000000, mode, "spi_generic_drv",
+       ret = spi_get_bus_and_cs(bus, cs, freq, mode, "spi_generic_drv",
                                 str, &dev, &slave);
        if (ret)
                return ret;
 #else
-       slave = spi_setup_slave(bus, cs, 1000000, mode);
+       slave = spi_setup_slave(bus, cs, freq, mode);
        if (!slave) {
                printf("Invalid device %d:%d\n", bus, cs);
                return -EINVAL;
@@ -106,6 +107,8 @@ int do_spi (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
         * We use the last specified parameters, unless new ones are
         * entered.
         */
+       if (freq == 0)
+               freq = 1000000;
 
        if ((flag & CMD_FLAG_REPEAT) == 0)
        {
@@ -119,7 +122,9 @@ int do_spi (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
                                bus = CONFIG_DEFAULT_SPI_BUS;
                        }
                        if (*cp == '.')
-                               mode = simple_strtoul(cp+1, NULL, 10);
+                               mode = simple_strtoul(cp+1, &cp, 10);
+                       if (*cp == '@')
+                               freq = simple_strtoul(cp+1, &cp, 10);
                }
                if (argc >= 3)
                        bitlen = simple_strtoul(argv[2], NULL, 10);
@@ -159,10 +164,11 @@ int do_spi (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 U_BOOT_CMD(
        sspi,   5,      1,      do_spi,
        "SPI utility command",
-       "[<bus>:]<cs>[.<mode>] <bit_len> <dout> - Send and receive bits\n"
+       "[<bus>:]<cs>[.<mode>][@<freq>] <bit_len> <dout> - Send and receive bits\n"
        "<bus>     - Identifies the SPI bus\n"
        "<cs>      - Identifies the chip select\n"
        "<mode>    - Identifies the SPI mode to use\n"
+       "<freq>    - Identifies the SPI bus frequency in Hz\n"
        "<bit_len> - Number of bits to send (base 10)\n"
        "<dout>    - Hexadecimal string that gets sent"
 );