diff options
| -rw-r--r-- | drivers/spi/sh_spi.c | 19 | ||||
| -rw-r--r-- | drivers/spi/sh_spi.h | 4 | 
2 files changed, 19 insertions, 4 deletions
| diff --git a/drivers/spi/sh_spi.c b/drivers/spi/sh_spi.c index 78c7f1ac8..e944b23c2 100644 --- a/drivers/spi/sh_spi.c +++ b/drivers/spi/sh_spi.c @@ -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)  { @@ -104,6 +117,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 +256,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; diff --git a/drivers/spi/sh_spi.h b/drivers/spi/sh_spi.h index dd8f937e4..96b4b6850 100644 --- a/drivers/spi/sh_spi.h +++ b/drivers/spi/sh_spi.h @@ -60,10 +60,12 @@ struct sh_spi_regs {  #define SH_SPI_TBFI	0x40  #define SH_SPI_RBEI	0x20  #define SH_SPI_RBFI	0x10 +#define SH_SPI_SSS1	0x08  #define SH_SPI_WPABRT	0x04 -#define SH_SPI_SSS	0x01 +#define SH_SPI_SSS0	0x01  #define SH_SPI_FIFO_SIZE	32 +#define SH_SPI_NUM_CS		4  struct sh_spi {  	struct spi_slave	slave; |