Author: stefanct
Date: Sat Mar  3 19:09:33 2012
New Revision: 1512
URL: http://flashrom.org/trac/flashrom/changeset/1512

Log:
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().

Signed-off-by: Stefan Tauner <[email protected]>
Tested-by: Denis 'GNUtoo' Carikli <[email protected]>
Acked-by: Carl-Daniel Hailfinger <[email protected]>

Modified:
   trunk/linux_spi.c

Modified: trunk/linux_spi.c
==============================================================================
--- trunk/linux_spi.c   Thu Mar  1 23:38:27 2012        (r1511)
+++ trunk/linux_spi.c   Sat Mar  3 19:09:33 2012        (r1512)
@@ -57,6 +57,10 @@
 {
        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 @@
                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);
 

_______________________________________________
flashrom mailing list
[email protected]
http://www.flashrom.org/mailman/listinfo/flashrom

Reply via email to