Allow using control register (in addition to data register) for all output
signals.

Signed-off-by: Ondrej Zary <[email protected]>

--- a/rayer_spi.c       2013-03-16 23:13:02.000000000 +0100
+++ b/rayer_spi.c       2013-03-16 23:13:09.000000000 +0100
@@ -58,6 +58,9 @@ struct rayer_pinout {
        int sck_inverted;
        int mosi_inverted;
        int miso_inverted;
+       int cs_reg;
+       int sck_reg;
+       int mosi_reg;
        void (*preinit)(void *);
        int (*shutdown)(void *);
 };
@@ -136,33 +139,33 @@ struct rayer_pinout *pinout = NULL;
 static uint16_t lpt_iobase;
 
 /* Cached value of last byte sent. */
-static uint8_t lpt_outbyte;
+static uint8_t lpt_outbyte[3];
 
 static void rayer_bitbang_set_cs(int val)
 {
        if (pinout->cs_inverted)
                val = !val;
-       lpt_outbyte &= ~(1 << pinout->cs_bit);
-       lpt_outbyte |= (val << pinout->cs_bit);
-       OUTB(lpt_outbyte, lpt_iobase);
+       lpt_outbyte[pinout->cs_reg] &= ~(1 << pinout->cs_bit);
+       lpt_outbyte[pinout->cs_reg] |= (val << pinout->cs_bit);
+       OUTB(lpt_outbyte[pinout->cs_reg], lpt_iobase + pinout->cs_reg);
 }
 
 static void rayer_bitbang_set_sck(int val)
 {
        if (pinout->sck_inverted)
                val = !val;
-       lpt_outbyte &= ~(1 << pinout->sck_bit);
-       lpt_outbyte |= (val << pinout->sck_bit);
-       OUTB(lpt_outbyte, lpt_iobase);
+       lpt_outbyte[pinout->sck_reg] &= ~(1 << pinout->sck_bit);
+       lpt_outbyte[pinout->sck_reg] |= (val << pinout->sck_bit);
+       OUTB(lpt_outbyte[pinout->sck_reg], lpt_iobase + pinout->sck_reg);
 }
 
 static void rayer_bitbang_set_mosi(int val)
 {
        if (pinout->mosi_inverted)
                val = !val;
-       lpt_outbyte &= ~(1 << pinout->mosi_bit);
-       lpt_outbyte |= (val << pinout->mosi_bit);
-       OUTB(lpt_outbyte, lpt_iobase);
+       lpt_outbyte[pinout->mosi_reg] &= ~(1 << pinout->mosi_bit);
+       lpt_outbyte[pinout->mosi_reg] |= (val << pinout->mosi_bit);
+       OUTB(lpt_outbyte[pinout->mosi_reg], lpt_iobase + pinout->mosi_reg);
 }
 
 static int rayer_bitbang_get_miso(void)
@@ -245,7 +248,8 @@ int rayer_spi_init(void)
                return 1;
 
        /* Get the initial value before writing to any line. */
-       lpt_outbyte = INB(lpt_iobase);
+       lpt_outbyte[0] = INB(lpt_iobase);
+       lpt_outbyte[2] = INB(lpt_iobase + 2);
 
        if (pinout->shutdown)
                register_shutdown(pinout->shutdown, (void*)pinout);
@@ -261,15 +265,15 @@ int rayer_spi_init(void)
 static void dlc5b_preinit(void * data) {
        msg_pdbg("dlc5b_preinit\n");
        /* Assert pin 6 to receive MISO. */
-       lpt_outbyte |= (1<<4);
-       OUTB(lpt_outbyte, lpt_iobase);
+       lpt_outbyte[0] |= (1<<4);
+       OUTB(lpt_outbyte[0], lpt_iobase);
 }
 
 static int dlc5b_shutdown(void * data) {
        msg_pdbg("dlc5b_shutdown\n");
        /* De-assert pin 6 to force MISO low. */
-       lpt_outbyte &= ~(1<<4);
-       OUTB(lpt_outbyte, lpt_iobase);
+       lpt_outbyte[0] &= ~(1<<4);
+       OUTB(lpt_outbyte[0], lpt_iobase);
        return 0;
 }
 
@@ -289,15 +293,15 @@ static int byteblaster_shutdown(void * d
 static void stk200_preinit(void *data) {
        msg_pdbg("stk200_init\n");
        /* Assert #EN signals, set LED signal. */
-       lpt_outbyte = (1 << 6) ;
-       OUTB(lpt_outbyte, lpt_iobase);
+       lpt_outbyte[0] = (1 << 6) ;
+       OUTB(lpt_outbyte[0], lpt_iobase);
 }
 
 static int stk200_shutdown(void *data) {
        msg_pdbg("stk200_shutdown\n");
        /* Assert #EN signals, clear LED signal. */
-       lpt_outbyte = (1 << 2) | (1 << 3);
-       OUTB(lpt_outbyte, lpt_iobase);
+       lpt_outbyte[0] = (1 << 2) | (1 << 3);
+       OUTB(lpt_outbyte[0], lpt_iobase);
        return 0;
 }
 




-- 
Ondrej Zary

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

Reply via email to