]> git.sur5r.net Git - u-boot/blobdiff - drivers/spi/sh_spi.c
power: pmic: Let PFUZE3000 see all 256 registers
[u-boot] / drivers / spi / sh_spi.c
index ba43bec8bf0ff8ecfc75ff406a6eb8f3aaffa644..bc2bd638e6f5ac6bd0b0543b3af2fbc6d1955bcd 100644 (file)
@@ -1,24 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * SH SPI driver
  *
- * Copyright (C) 2011 Renesas Solutions Corp.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- *
+ * Copyright (C) 2011-2012 Renesas Solutions Corp.
  */
 
 #include <common.h>
+#include <console.h>
 #include <malloc.h>
 #include <spi.h>
 #include <asm/io.h>
@@ -82,6 +70,19 @@ void spi_init(void)
 {
 }
 
+static void sh_spi_set_cs(struct sh_spi *ss, unsigned int cs)
+{
+       unsigned long val = 0;
+
+       if (cs & 0x01)
+               val |= SH_SPI_SSS0;
+       if (cs & 0x02)
+               val |= SH_SPI_SSS1;
+
+       sh_spi_clear_bit(SH_SPI_SSS0 | SH_SPI_SSS1, &ss->regs->cr4);
+       sh_spi_set_bit(val, &ss->regs->cr4);
+}
+
 struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs,
                unsigned int max_hz, unsigned int mode)
 {
@@ -90,12 +91,10 @@ struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs,
        if (!spi_cs_is_valid(bus, cs))
                return NULL;
 
-       ss = malloc(sizeof(struct spi_slave));
+       ss = spi_alloc_slave(struct sh_spi, bus, cs);
        if (!ss)
                return NULL;
 
-       ss->slave.bus = bus;
-       ss->slave.cs = cs;
        ss->regs = (struct sh_spi_regs *)CONFIG_SH_SPI_BASE;
 
        /* SPI sycle stop */
@@ -104,6 +103,7 @@ struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs,
        sh_spi_write(0x00, &ss->regs->cr1);
        /* CR3 init */
        sh_spi_write(0x00, &ss->regs->cr3);
+       sh_spi_set_cs(ss, cs);
 
        clear_fifo(ss);
 
@@ -139,7 +139,6 @@ static int sh_spi_send(struct sh_spi *ss, const unsigned char *tx_data,
 {
        int i, cur_len, ret = 0;
        int remain = (int)len;
-       unsigned long tmp;
 
        if (len >= SH_SPI_FIFO_SIZE)
                sh_spi_set_bit(SH_SPI_SSA, &ss->regs->cr1);
@@ -171,9 +170,7 @@ static int sh_spi_send(struct sh_spi *ss, const unsigned char *tx_data,
        }
 
        if (flags & SPI_XFER_END) {
-               tmp = sh_spi_read(&ss->regs->cr1);
-               tmp = tmp & ~(SH_SPI_SSD | SH_SPI_SSDB);
-               sh_spi_write(tmp, &ss->regs->cr1);
+               sh_spi_clear_bit(SH_SPI_SSD | SH_SPI_SSDB, &ss->regs->cr1);
                sh_spi_set_bit(SH_SPI_SSA, &ss->regs->cr1);
                udelay(100);
                write_fifo_empty_wait(ss);
@@ -186,16 +183,13 @@ static int sh_spi_receive(struct sh_spi *ss, unsigned char *rx_data,
                          unsigned int len, unsigned long flags)
 {
        int i;
-       unsigned long tmp;
 
        if (len > SH_SPI_MAX_BYTE)
                sh_spi_write(SH_SPI_MAX_BYTE, &ss->regs->cr3);
        else
                sh_spi_write(len, &ss->regs->cr3);
 
-       tmp = sh_spi_read(&ss->regs->cr1);
-       tmp = tmp & ~(SH_SPI_SSD | SH_SPI_SSDB);
-       sh_spi_write(tmp, &ss->regs->cr1);
+       sh_spi_clear_bit(SH_SPI_SSD | SH_SPI_SSDB, &ss->regs->cr1);
        sh_spi_set_bit(SH_SPI_SSA, &ss->regs->cr1);
 
        for (i = 0; i < len; i++) {
@@ -242,8 +236,7 @@ int  spi_xfer(struct spi_slave *slave, unsigned int bitlen, const void *dout,
 
 int  spi_cs_is_valid(unsigned int bus, unsigned int cs)
 {
-       /* This driver supports "bus = 0" and "cs = 0" only. */
-       if (!bus && !cs)
+       if (!bus && cs < SH_SPI_NUM_CS)
                return 1;
        else
                return 0;
@@ -258,4 +251,3 @@ void spi_cs_deactivate(struct spi_slave *slave)
 {
 
 }
-