diff options
author | Stefan Tauner <stefan.tauner@alumni.tuwien.ac.at> | 2012-03-03 18:09:33 +0000 |
---|---|---|
committer | Stefan Tauner <stefan.tauner@alumni.tuwien.ac.at> | 2012-03-03 18:09:33 +0000 |
commit | 2c3e9d5f57b8f2c33bda30dcac043c1b31089183 (patch) | |
tree | 3460628ca2658848c6e213b80684aa44fb70e2d4 /linux_spi.c | |
parent | ccd71c21222cd73c55284265d306d52e88d8c6c8 (diff) | |
download | flashrom-2c3e9d5f57b8f2c33bda30dcac043c1b31089183.tar.gz flashrom-2c3e9d5f57b8f2c33bda30dcac043c1b31089183.tar.bz2 flashrom-2c3e9d5f57b8f2c33bda30dcac043c1b31089183.zip |
linux_spi.c: set SPI mode, bit order and bits per word on init
Previously we relied on a correctly set up state.
Also, we start to rely on the shutdown function for cleanup after
registering it, i.e. we no longer explicitly call close(fd) after
register_shutdown().
Corresponding to flashrom svn r1512.
Signed-off-by: Stefan Tauner <stefan.tauner@alumni.tuwien.ac.at>
Tested-by: Denis 'GNUtoo' Carikli <GNUtoo@no-log.org>
Acked-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net>
Diffstat (limited to 'linux_spi.c')
-rw-r--r-- | linux_spi.c | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/linux_spi.c b/linux_spi.c index d99438988..2ae681f5e 100644 --- a/linux_spi.c +++ b/linux_spi.c @@ -57,6 +57,10 @@ int linux_spi_init(void) { char *p, *endp, *dev; uint32_t speed = 0; + /* FIXME: make the following configurable by CLI options. */ + /* SPI mode 0 (beware this also includes: MSB first, CS active low and others */ + const uint8_t mode = SPI_MODE_0; + const uint8_t bits = 8; dev = extract_programmer_param("dev"); if (!dev || !strlen(dev)) { @@ -81,19 +85,31 @@ int linux_spi_init(void) return 1; } + if (register_shutdown(linux_spi_shutdown, NULL)) + return 1; + /* We rely on the shutdown function for cleanup from here on. */ + if (speed > 0) { if (ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed) == -1) { - msg_perr("%s: failed to set speed %dHz: %s\n", + msg_perr("%s: failed to set speed to %d Hz: %s\n", __func__, speed, strerror(errno)); - close(fd); return 1; } msg_pdbg("Using %d kHz clock\n", speed); } - if (register_shutdown(linux_spi_shutdown, NULL)) + if (ioctl(fd, SPI_IOC_WR_MODE, &mode) == -1) { + msg_perr("%s: failed to set SPI mode to 0x%02x: %s\n", + __func__, mode, strerror(errno)); return 1; + } + + if (ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &bits) == -1) { + msg_perr("%s: failed to set the number of bits per SPI word to %u: %s\n", + __func__, bits == 0 ? 8 : bits, strerror(errno)); + return 1; + } register_spi_programmer(&spi_programmer_linux); |