]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - drivers/spi/sh_spi.c
Merge branch 'u-boot-imx/master' into 'u-boot-arm/master'
[karo-tx-uboot.git] / drivers / spi / sh_spi.c
index ba43bec8bf0ff8ecfc75ff406a6eb8f3aaffa644..744afe3295aebeca01ad9e1921ce387c0c823dbb 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * SH SPI driver
  *
- * Copyright (C) 2011 Renesas Solutions Corp.
+ * Copyright (C) 2011-2012 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
@@ -82,6 +82,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 +103,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 +115,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);
 
@@ -242,8 +254,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 +269,3 @@ void spi_cs_deactivate(struct spi_slave *slave)
 {
 
 }
-