4 * Copyright (C) 2011-2012 Renesas Solutions Corp.
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; version 2 of the License.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
27 static void sh_spi_write(unsigned long data
, unsigned long *reg
)
32 static unsigned long sh_spi_read(unsigned long *reg
)
37 static void sh_spi_set_bit(unsigned long val
, unsigned long *reg
)
41 tmp
= sh_spi_read(reg
);
43 sh_spi_write(tmp
, reg
);
46 static void sh_spi_clear_bit(unsigned long val
, unsigned long *reg
)
50 tmp
= sh_spi_read(reg
);
52 sh_spi_write(tmp
, reg
);
55 static void clear_fifo(struct sh_spi
*ss
)
57 sh_spi_set_bit(SH_SPI_RSTF
, &ss
->regs
->cr2
);
58 sh_spi_clear_bit(SH_SPI_RSTF
, &ss
->regs
->cr2
);
61 static int recvbuf_wait(struct sh_spi
*ss
)
63 while (sh_spi_read(&ss
->regs
->cr1
) & SH_SPI_RBE
) {
71 static int write_fifo_empty_wait(struct sh_spi
*ss
)
73 while (!(sh_spi_read(&ss
->regs
->cr1
) & SH_SPI_TBE
)) {
85 static void sh_spi_set_cs(struct sh_spi
*ss
, unsigned int cs
)
87 unsigned long val
= 0;
94 sh_spi_clear_bit(SH_SPI_SSS0
| SH_SPI_SSS1
, &ss
->regs
->cr4
);
95 sh_spi_set_bit(val
, &ss
->regs
->cr4
);
98 struct spi_slave
*spi_setup_slave(unsigned int bus
, unsigned int cs
,
99 unsigned int max_hz
, unsigned int mode
)
103 if (!spi_cs_is_valid(bus
, cs
))
106 ss
= spi_alloc_slave(struct sh_spi
, bus
, cs
);
110 ss
->regs
= (struct sh_spi_regs
*)CONFIG_SH_SPI_BASE
;
113 sh_spi_write(0xfe, &ss
->regs
->cr1
);
115 sh_spi_write(0x00, &ss
->regs
->cr1
);
117 sh_spi_write(0x00, &ss
->regs
->cr3
);
118 sh_spi_set_cs(ss
, cs
);
123 sh_spi_write(sh_spi_read(&ss
->regs
->cr2
) | 0x07, &ss
->regs
->cr2
);
129 void spi_free_slave(struct spi_slave
*slave
)
131 struct sh_spi
*spi
= to_sh_spi(slave
);
136 int spi_claim_bus(struct spi_slave
*slave
)
141 void spi_release_bus(struct spi_slave
*slave
)
143 struct sh_spi
*ss
= to_sh_spi(slave
);
145 sh_spi_write(sh_spi_read(&ss
->regs
->cr1
) &
146 ~(SH_SPI_SSA
| SH_SPI_SSDB
| SH_SPI_SSD
), &ss
->regs
->cr1
);
149 static int sh_spi_send(struct sh_spi
*ss
, const unsigned char *tx_data
,
150 unsigned int len
, unsigned long flags
)
152 int i
, cur_len
, ret
= 0;
153 int remain
= (int)len
;
155 if (len
>= SH_SPI_FIFO_SIZE
)
156 sh_spi_set_bit(SH_SPI_SSA
, &ss
->regs
->cr1
);
159 cur_len
= (remain
< SH_SPI_FIFO_SIZE
) ?
160 remain
: SH_SPI_FIFO_SIZE
;
161 for (i
= 0; i
< cur_len
&&
162 !(sh_spi_read(&ss
->regs
->cr4
) & SH_SPI_WPABRT
) &&
163 !(sh_spi_read(&ss
->regs
->cr1
) & SH_SPI_TBF
);
165 sh_spi_write(tx_data
[i
], &ss
->regs
->tbr_rbr
);
169 if (sh_spi_read(&ss
->regs
->cr4
) & SH_SPI_WPABRT
) {
170 /* Abort the transaction */
171 flags
|= SPI_XFER_END
;
172 sh_spi_set_bit(SH_SPI_WPABRT
, &ss
->regs
->cr4
);
181 write_fifo_empty_wait(ss
);
184 if (flags
& SPI_XFER_END
) {
185 sh_spi_clear_bit(SH_SPI_SSD
| SH_SPI_SSDB
, &ss
->regs
->cr1
);
186 sh_spi_set_bit(SH_SPI_SSA
, &ss
->regs
->cr1
);
188 write_fifo_empty_wait(ss
);
194 static int sh_spi_receive(struct sh_spi
*ss
, unsigned char *rx_data
,
195 unsigned int len
, unsigned long flags
)
199 if (len
> SH_SPI_MAX_BYTE
)
200 sh_spi_write(SH_SPI_MAX_BYTE
, &ss
->regs
->cr3
);
202 sh_spi_write(len
, &ss
->regs
->cr3
);
204 sh_spi_clear_bit(SH_SPI_SSD
| SH_SPI_SSDB
, &ss
->regs
->cr1
);
205 sh_spi_set_bit(SH_SPI_SSA
, &ss
->regs
->cr1
);
207 for (i
= 0; i
< len
; i
++) {
208 if (recvbuf_wait(ss
))
211 rx_data
[i
] = (unsigned char)sh_spi_read(&ss
->regs
->tbr_rbr
);
213 sh_spi_write(0, &ss
->regs
->cr3
);
218 int spi_xfer(struct spi_slave
*slave
, unsigned int bitlen
, const void *dout
,
219 void *din
, unsigned long flags
)
221 struct sh_spi
*ss
= to_sh_spi(slave
);
222 const unsigned char *tx_data
= dout
;
223 unsigned char *rx_data
= din
;
224 unsigned int len
= bitlen
/ 8;
227 if (flags
& SPI_XFER_BEGIN
)
228 sh_spi_write(sh_spi_read(&ss
->regs
->cr1
) & ~SH_SPI_SSA
,
232 ret
= sh_spi_send(ss
, tx_data
, len
, flags
);
234 if (ret
== 0 && rx_data
)
235 ret
= sh_spi_receive(ss
, rx_data
, len
, flags
);
237 if (flags
& SPI_XFER_END
) {
238 sh_spi_set_bit(SH_SPI_SSD
, &ss
->regs
->cr1
);
241 sh_spi_clear_bit(SH_SPI_SSA
| SH_SPI_SSDB
| SH_SPI_SSD
,
249 int spi_cs_is_valid(unsigned int bus
, unsigned int cs
)
251 if (!bus
&& cs
< SH_SPI_NUM_CS
)
257 void spi_cs_activate(struct spi_slave
*slave
)
262 void spi_cs_deactivate(struct spi_slave
*slave
)