.. | .. |
---|
| 1 | +// SPDX-License-Identifier: GPL-2.0 |
---|
1 | 2 | /* |
---|
2 | | - * SuperH MSIOF SPI Master Interface |
---|
| 3 | + * SuperH MSIOF SPI Controller Interface |
---|
3 | 4 | * |
---|
4 | 5 | * Copyright (c) 2009 Magnus Damm |
---|
5 | 6 | * Copyright (C) 2014 Renesas Electronics Corporation |
---|
6 | 7 | * Copyright (C) 2014-2017 Glider bvba |
---|
7 | | - * |
---|
8 | | - * This program is free software; you can redistribute it and/or modify |
---|
9 | | - * it under the terms of the GNU General Public License version 2 as |
---|
10 | | - * published by the Free Software Foundation. |
---|
11 | | - * |
---|
12 | 8 | */ |
---|
13 | 9 | |
---|
14 | 10 | #include <linux/bitmap.h> |
---|
.. | .. |
---|
18 | 14 | #include <linux/dma-mapping.h> |
---|
19 | 15 | #include <linux/dmaengine.h> |
---|
20 | 16 | #include <linux/err.h> |
---|
21 | | -#include <linux/gpio.h> |
---|
22 | | -#include <linux/gpio/consumer.h> |
---|
23 | 17 | #include <linux/interrupt.h> |
---|
24 | 18 | #include <linux/io.h> |
---|
| 19 | +#include <linux/iopoll.h> |
---|
25 | 20 | #include <linux/kernel.h> |
---|
26 | 21 | #include <linux/module.h> |
---|
27 | 22 | #include <linux/of.h> |
---|
.. | .. |
---|
36 | 31 | #include <asm/unaligned.h> |
---|
37 | 32 | |
---|
38 | 33 | struct sh_msiof_chipdata { |
---|
| 34 | + u32 bits_per_word_mask; |
---|
39 | 35 | u16 tx_fifo_size; |
---|
40 | 36 | u16 rx_fifo_size; |
---|
41 | | - u16 master_flags; |
---|
| 37 | + u16 ctlr_flags; |
---|
42 | 38 | u16 min_div_pow; |
---|
43 | 39 | }; |
---|
44 | 40 | |
---|
45 | 41 | struct sh_msiof_spi_priv { |
---|
46 | | - struct spi_master *master; |
---|
| 42 | + struct spi_controller *ctlr; |
---|
47 | 43 | void __iomem *mapbase; |
---|
48 | 44 | struct clk *clk; |
---|
49 | 45 | struct platform_device *pdev; |
---|
.. | .. |
---|
57 | 53 | void *rx_dma_page; |
---|
58 | 54 | dma_addr_t tx_dma_addr; |
---|
59 | 55 | dma_addr_t rx_dma_addr; |
---|
60 | | - unsigned short unused_ss; |
---|
61 | 56 | bool native_cs_inited; |
---|
62 | 57 | bool native_cs_high; |
---|
63 | 58 | bool slave_aborted; |
---|
.. | .. |
---|
65 | 60 | |
---|
66 | 61 | #define MAX_SS 3 /* Maximum number of native chip selects */ |
---|
67 | 62 | |
---|
68 | | -#define TMDR1 0x00 /* Transmit Mode Register 1 */ |
---|
69 | | -#define TMDR2 0x04 /* Transmit Mode Register 2 */ |
---|
70 | | -#define TMDR3 0x08 /* Transmit Mode Register 3 */ |
---|
71 | | -#define RMDR1 0x10 /* Receive Mode Register 1 */ |
---|
72 | | -#define RMDR2 0x14 /* Receive Mode Register 2 */ |
---|
73 | | -#define RMDR3 0x18 /* Receive Mode Register 3 */ |
---|
74 | | -#define TSCR 0x20 /* Transmit Clock Select Register */ |
---|
75 | | -#define RSCR 0x22 /* Receive Clock Select Register (SH, A1, APE6) */ |
---|
76 | | -#define CTR 0x28 /* Control Register */ |
---|
77 | | -#define FCTR 0x30 /* FIFO Control Register */ |
---|
78 | | -#define STR 0x40 /* Status Register */ |
---|
79 | | -#define IER 0x44 /* Interrupt Enable Register */ |
---|
80 | | -#define TDR1 0x48 /* Transmit Control Data Register 1 (SH, A1) */ |
---|
81 | | -#define TDR2 0x4c /* Transmit Control Data Register 2 (SH, A1) */ |
---|
82 | | -#define TFDR 0x50 /* Transmit FIFO Data Register */ |
---|
83 | | -#define RDR1 0x58 /* Receive Control Data Register 1 (SH, A1) */ |
---|
84 | | -#define RDR2 0x5c /* Receive Control Data Register 2 (SH, A1) */ |
---|
85 | | -#define RFDR 0x60 /* Receive FIFO Data Register */ |
---|
| 63 | +#define SITMDR1 0x00 /* Transmit Mode Register 1 */ |
---|
| 64 | +#define SITMDR2 0x04 /* Transmit Mode Register 2 */ |
---|
| 65 | +#define SITMDR3 0x08 /* Transmit Mode Register 3 */ |
---|
| 66 | +#define SIRMDR1 0x10 /* Receive Mode Register 1 */ |
---|
| 67 | +#define SIRMDR2 0x14 /* Receive Mode Register 2 */ |
---|
| 68 | +#define SIRMDR3 0x18 /* Receive Mode Register 3 */ |
---|
| 69 | +#define SITSCR 0x20 /* Transmit Clock Select Register */ |
---|
| 70 | +#define SIRSCR 0x22 /* Receive Clock Select Register (SH, A1, APE6) */ |
---|
| 71 | +#define SICTR 0x28 /* Control Register */ |
---|
| 72 | +#define SIFCTR 0x30 /* FIFO Control Register */ |
---|
| 73 | +#define SISTR 0x40 /* Status Register */ |
---|
| 74 | +#define SIIER 0x44 /* Interrupt Enable Register */ |
---|
| 75 | +#define SITDR1 0x48 /* Transmit Control Data Register 1 (SH, A1) */ |
---|
| 76 | +#define SITDR2 0x4c /* Transmit Control Data Register 2 (SH, A1) */ |
---|
| 77 | +#define SITFDR 0x50 /* Transmit FIFO Data Register */ |
---|
| 78 | +#define SIRDR1 0x58 /* Receive Control Data Register 1 (SH, A1) */ |
---|
| 79 | +#define SIRDR2 0x5c /* Receive Control Data Register 2 (SH, A1) */ |
---|
| 80 | +#define SIRFDR 0x60 /* Receive FIFO Data Register */ |
---|
86 | 81 | |
---|
87 | | -/* TMDR1 and RMDR1 */ |
---|
88 | | -#define MDR1_TRMD 0x80000000 /* Transfer Mode (1 = Master mode) */ |
---|
89 | | -#define MDR1_SYNCMD_MASK 0x30000000 /* SYNC Mode */ |
---|
90 | | -#define MDR1_SYNCMD_SPI 0x20000000 /* Level mode/SPI */ |
---|
91 | | -#define MDR1_SYNCMD_LR 0x30000000 /* L/R mode */ |
---|
92 | | -#define MDR1_SYNCAC_SHIFT 25 /* Sync Polarity (1 = Active-low) */ |
---|
93 | | -#define MDR1_BITLSB_SHIFT 24 /* MSB/LSB First (1 = LSB first) */ |
---|
94 | | -#define MDR1_DTDL_SHIFT 20 /* Data Pin Bit Delay for MSIOF_SYNC */ |
---|
95 | | -#define MDR1_SYNCDL_SHIFT 16 /* Frame Sync Signal Timing Delay */ |
---|
96 | | -#define MDR1_FLD_MASK 0x0000000c /* Frame Sync Signal Interval (0-3) */ |
---|
97 | | -#define MDR1_FLD_SHIFT 2 |
---|
98 | | -#define MDR1_XXSTP 0x00000001 /* Transmission/Reception Stop on FIFO */ |
---|
99 | | -/* TMDR1 */ |
---|
100 | | -#define TMDR1_PCON 0x40000000 /* Transfer Signal Connection */ |
---|
101 | | -#define TMDR1_SYNCCH_MASK 0xc000000 /* Synchronization Signal Channel Select */ |
---|
102 | | -#define TMDR1_SYNCCH_SHIFT 26 /* 0=MSIOF_SYNC, 1=MSIOF_SS1, 2=MSIOF_SS2 */ |
---|
| 82 | +/* SITMDR1 and SIRMDR1 */ |
---|
| 83 | +#define SIMDR1_TRMD BIT(31) /* Transfer Mode (1 = Master mode) */ |
---|
| 84 | +#define SIMDR1_SYNCMD_MASK GENMASK(29, 28) /* SYNC Mode */ |
---|
| 85 | +#define SIMDR1_SYNCMD_SPI (2 << 28) /* Level mode/SPI */ |
---|
| 86 | +#define SIMDR1_SYNCMD_LR (3 << 28) /* L/R mode */ |
---|
| 87 | +#define SIMDR1_SYNCAC_SHIFT 25 /* Sync Polarity (1 = Active-low) */ |
---|
| 88 | +#define SIMDR1_BITLSB_SHIFT 24 /* MSB/LSB First (1 = LSB first) */ |
---|
| 89 | +#define SIMDR1_DTDL_SHIFT 20 /* Data Pin Bit Delay for MSIOF_SYNC */ |
---|
| 90 | +#define SIMDR1_SYNCDL_SHIFT 16 /* Frame Sync Signal Timing Delay */ |
---|
| 91 | +#define SIMDR1_FLD_MASK GENMASK(3, 2) /* Frame Sync Signal Interval (0-3) */ |
---|
| 92 | +#define SIMDR1_FLD_SHIFT 2 |
---|
| 93 | +#define SIMDR1_XXSTP BIT(0) /* Transmission/Reception Stop on FIFO */ |
---|
| 94 | +/* SITMDR1 */ |
---|
| 95 | +#define SITMDR1_PCON BIT(30) /* Transfer Signal Connection */ |
---|
| 96 | +#define SITMDR1_SYNCCH_MASK GENMASK(27, 26) /* Sync Signal Channel Select */ |
---|
| 97 | +#define SITMDR1_SYNCCH_SHIFT 26 /* 0=MSIOF_SYNC, 1=MSIOF_SS1, 2=MSIOF_SS2 */ |
---|
103 | 98 | |
---|
104 | | -/* TMDR2 and RMDR2 */ |
---|
105 | | -#define MDR2_BITLEN1(i) (((i) - 1) << 24) /* Data Size (8-32 bits) */ |
---|
106 | | -#define MDR2_WDLEN1(i) (((i) - 1) << 16) /* Word Count (1-64/256 (SH, A1))) */ |
---|
107 | | -#define MDR2_GRPMASK1 0x00000001 /* Group Output Mask 1 (SH, A1) */ |
---|
| 99 | +/* SITMDR2 and SIRMDR2 */ |
---|
| 100 | +#define SIMDR2_BITLEN1(i) (((i) - 1) << 24) /* Data Size (8-32 bits) */ |
---|
| 101 | +#define SIMDR2_WDLEN1(i) (((i) - 1) << 16) /* Word Count (1-64/256 (SH, A1))) */ |
---|
| 102 | +#define SIMDR2_GRPMASK1 BIT(0) /* Group Output Mask 1 (SH, A1) */ |
---|
108 | 103 | |
---|
109 | | -/* TSCR and RSCR */ |
---|
110 | | -#define SCR_BRPS_MASK 0x1f00 /* Prescaler Setting (1-32) */ |
---|
111 | | -#define SCR_BRPS(i) (((i) - 1) << 8) |
---|
112 | | -#define SCR_BRDV_MASK 0x0007 /* Baud Rate Generator's Division Ratio */ |
---|
113 | | -#define SCR_BRDV_DIV_2 0x0000 |
---|
114 | | -#define SCR_BRDV_DIV_4 0x0001 |
---|
115 | | -#define SCR_BRDV_DIV_8 0x0002 |
---|
116 | | -#define SCR_BRDV_DIV_16 0x0003 |
---|
117 | | -#define SCR_BRDV_DIV_32 0x0004 |
---|
118 | | -#define SCR_BRDV_DIV_1 0x0007 |
---|
| 104 | +/* SITSCR and SIRSCR */ |
---|
| 105 | +#define SISCR_BRPS_MASK GENMASK(12, 8) /* Prescaler Setting (1-32) */ |
---|
| 106 | +#define SISCR_BRPS(i) (((i) - 1) << 8) |
---|
| 107 | +#define SISCR_BRDV_MASK GENMASK(2, 0) /* Baud Rate Generator's Division Ratio */ |
---|
| 108 | +#define SISCR_BRDV_DIV_2 0 |
---|
| 109 | +#define SISCR_BRDV_DIV_4 1 |
---|
| 110 | +#define SISCR_BRDV_DIV_8 2 |
---|
| 111 | +#define SISCR_BRDV_DIV_16 3 |
---|
| 112 | +#define SISCR_BRDV_DIV_32 4 |
---|
| 113 | +#define SISCR_BRDV_DIV_1 7 |
---|
119 | 114 | |
---|
120 | | -/* CTR */ |
---|
121 | | -#define CTR_TSCKIZ_MASK 0xc0000000 /* Transmit Clock I/O Polarity Select */ |
---|
122 | | -#define CTR_TSCKIZ_SCK 0x80000000 /* Disable SCK when TX disabled */ |
---|
123 | | -#define CTR_TSCKIZ_POL_SHIFT 30 /* Transmit Clock Polarity */ |
---|
124 | | -#define CTR_RSCKIZ_MASK 0x30000000 /* Receive Clock Polarity Select */ |
---|
125 | | -#define CTR_RSCKIZ_SCK 0x20000000 /* Must match CTR_TSCKIZ_SCK */ |
---|
126 | | -#define CTR_RSCKIZ_POL_SHIFT 28 /* Receive Clock Polarity */ |
---|
127 | | -#define CTR_TEDG_SHIFT 27 /* Transmit Timing (1 = falling edge) */ |
---|
128 | | -#define CTR_REDG_SHIFT 26 /* Receive Timing (1 = falling edge) */ |
---|
129 | | -#define CTR_TXDIZ_MASK 0x00c00000 /* Pin Output When TX is Disabled */ |
---|
130 | | -#define CTR_TXDIZ_LOW 0x00000000 /* 0 */ |
---|
131 | | -#define CTR_TXDIZ_HIGH 0x00400000 /* 1 */ |
---|
132 | | -#define CTR_TXDIZ_HIZ 0x00800000 /* High-impedance */ |
---|
133 | | -#define CTR_TSCKE 0x00008000 /* Transmit Serial Clock Output Enable */ |
---|
134 | | -#define CTR_TFSE 0x00004000 /* Transmit Frame Sync Signal Output Enable */ |
---|
135 | | -#define CTR_TXE 0x00000200 /* Transmit Enable */ |
---|
136 | | -#define CTR_RXE 0x00000100 /* Receive Enable */ |
---|
| 115 | +/* SICTR */ |
---|
| 116 | +#define SICTR_TSCKIZ_MASK GENMASK(31, 30) /* Transmit Clock I/O Polarity Select */ |
---|
| 117 | +#define SICTR_TSCKIZ_SCK BIT(31) /* Disable SCK when TX disabled */ |
---|
| 118 | +#define SICTR_TSCKIZ_POL_SHIFT 30 /* Transmit Clock Polarity */ |
---|
| 119 | +#define SICTR_RSCKIZ_MASK GENMASK(29, 28) /* Receive Clock Polarity Select */ |
---|
| 120 | +#define SICTR_RSCKIZ_SCK BIT(29) /* Must match CTR_TSCKIZ_SCK */ |
---|
| 121 | +#define SICTR_RSCKIZ_POL_SHIFT 28 /* Receive Clock Polarity */ |
---|
| 122 | +#define SICTR_TEDG_SHIFT 27 /* Transmit Timing (1 = falling edge) */ |
---|
| 123 | +#define SICTR_REDG_SHIFT 26 /* Receive Timing (1 = falling edge) */ |
---|
| 124 | +#define SICTR_TXDIZ_MASK GENMASK(23, 22) /* Pin Output When TX is Disabled */ |
---|
| 125 | +#define SICTR_TXDIZ_LOW (0 << 22) /* 0 */ |
---|
| 126 | +#define SICTR_TXDIZ_HIGH (1 << 22) /* 1 */ |
---|
| 127 | +#define SICTR_TXDIZ_HIZ (2 << 22) /* High-impedance */ |
---|
| 128 | +#define SICTR_TSCKE BIT(15) /* Transmit Serial Clock Output Enable */ |
---|
| 129 | +#define SICTR_TFSE BIT(14) /* Transmit Frame Sync Signal Output Enable */ |
---|
| 130 | +#define SICTR_TXE BIT(9) /* Transmit Enable */ |
---|
| 131 | +#define SICTR_RXE BIT(8) /* Receive Enable */ |
---|
| 132 | +#define SICTR_TXRST BIT(1) /* Transmit Reset */ |
---|
| 133 | +#define SICTR_RXRST BIT(0) /* Receive Reset */ |
---|
137 | 134 | |
---|
138 | | -/* FCTR */ |
---|
139 | | -#define FCTR_TFWM_MASK 0xe0000000 /* Transmit FIFO Watermark */ |
---|
140 | | -#define FCTR_TFWM_64 0x00000000 /* Transfer Request when 64 empty stages */ |
---|
141 | | -#define FCTR_TFWM_32 0x20000000 /* Transfer Request when 32 empty stages */ |
---|
142 | | -#define FCTR_TFWM_24 0x40000000 /* Transfer Request when 24 empty stages */ |
---|
143 | | -#define FCTR_TFWM_16 0x60000000 /* Transfer Request when 16 empty stages */ |
---|
144 | | -#define FCTR_TFWM_12 0x80000000 /* Transfer Request when 12 empty stages */ |
---|
145 | | -#define FCTR_TFWM_8 0xa0000000 /* Transfer Request when 8 empty stages */ |
---|
146 | | -#define FCTR_TFWM_4 0xc0000000 /* Transfer Request when 4 empty stages */ |
---|
147 | | -#define FCTR_TFWM_1 0xe0000000 /* Transfer Request when 1 empty stage */ |
---|
148 | | -#define FCTR_TFUA_MASK 0x07f00000 /* Transmit FIFO Usable Area */ |
---|
149 | | -#define FCTR_TFUA_SHIFT 20 |
---|
150 | | -#define FCTR_TFUA(i) ((i) << FCTR_TFUA_SHIFT) |
---|
151 | | -#define FCTR_RFWM_MASK 0x0000e000 /* Receive FIFO Watermark */ |
---|
152 | | -#define FCTR_RFWM_1 0x00000000 /* Transfer Request when 1 valid stages */ |
---|
153 | | -#define FCTR_RFWM_4 0x00002000 /* Transfer Request when 4 valid stages */ |
---|
154 | | -#define FCTR_RFWM_8 0x00004000 /* Transfer Request when 8 valid stages */ |
---|
155 | | -#define FCTR_RFWM_16 0x00006000 /* Transfer Request when 16 valid stages */ |
---|
156 | | -#define FCTR_RFWM_32 0x00008000 /* Transfer Request when 32 valid stages */ |
---|
157 | | -#define FCTR_RFWM_64 0x0000a000 /* Transfer Request when 64 valid stages */ |
---|
158 | | -#define FCTR_RFWM_128 0x0000c000 /* Transfer Request when 128 valid stages */ |
---|
159 | | -#define FCTR_RFWM_256 0x0000e000 /* Transfer Request when 256 valid stages */ |
---|
160 | | -#define FCTR_RFUA_MASK 0x00001ff0 /* Receive FIFO Usable Area (0x40 = full) */ |
---|
161 | | -#define FCTR_RFUA_SHIFT 4 |
---|
162 | | -#define FCTR_RFUA(i) ((i) << FCTR_RFUA_SHIFT) |
---|
| 135 | +/* SIFCTR */ |
---|
| 136 | +#define SIFCTR_TFWM_MASK GENMASK(31, 29) /* Transmit FIFO Watermark */ |
---|
| 137 | +#define SIFCTR_TFWM_64 (0 << 29) /* Transfer Request when 64 empty stages */ |
---|
| 138 | +#define SIFCTR_TFWM_32 (1 << 29) /* Transfer Request when 32 empty stages */ |
---|
| 139 | +#define SIFCTR_TFWM_24 (2 << 29) /* Transfer Request when 24 empty stages */ |
---|
| 140 | +#define SIFCTR_TFWM_16 (3 << 29) /* Transfer Request when 16 empty stages */ |
---|
| 141 | +#define SIFCTR_TFWM_12 (4 << 29) /* Transfer Request when 12 empty stages */ |
---|
| 142 | +#define SIFCTR_TFWM_8 (5 << 29) /* Transfer Request when 8 empty stages */ |
---|
| 143 | +#define SIFCTR_TFWM_4 (6 << 29) /* Transfer Request when 4 empty stages */ |
---|
| 144 | +#define SIFCTR_TFWM_1 (7 << 29) /* Transfer Request when 1 empty stage */ |
---|
| 145 | +#define SIFCTR_TFUA_MASK GENMASK(26, 20) /* Transmit FIFO Usable Area */ |
---|
| 146 | +#define SIFCTR_TFUA_SHIFT 20 |
---|
| 147 | +#define SIFCTR_TFUA(i) ((i) << SIFCTR_TFUA_SHIFT) |
---|
| 148 | +#define SIFCTR_RFWM_MASK GENMASK(15, 13) /* Receive FIFO Watermark */ |
---|
| 149 | +#define SIFCTR_RFWM_1 (0 << 13) /* Transfer Request when 1 valid stages */ |
---|
| 150 | +#define SIFCTR_RFWM_4 (1 << 13) /* Transfer Request when 4 valid stages */ |
---|
| 151 | +#define SIFCTR_RFWM_8 (2 << 13) /* Transfer Request when 8 valid stages */ |
---|
| 152 | +#define SIFCTR_RFWM_16 (3 << 13) /* Transfer Request when 16 valid stages */ |
---|
| 153 | +#define SIFCTR_RFWM_32 (4 << 13) /* Transfer Request when 32 valid stages */ |
---|
| 154 | +#define SIFCTR_RFWM_64 (5 << 13) /* Transfer Request when 64 valid stages */ |
---|
| 155 | +#define SIFCTR_RFWM_128 (6 << 13) /* Transfer Request when 128 valid stages */ |
---|
| 156 | +#define SIFCTR_RFWM_256 (7 << 13) /* Transfer Request when 256 valid stages */ |
---|
| 157 | +#define SIFCTR_RFUA_MASK GENMASK(12, 4) /* Receive FIFO Usable Area (0x40 = full) */ |
---|
| 158 | +#define SIFCTR_RFUA_SHIFT 4 |
---|
| 159 | +#define SIFCTR_RFUA(i) ((i) << SIFCTR_RFUA_SHIFT) |
---|
163 | 160 | |
---|
164 | | -/* STR */ |
---|
165 | | -#define STR_TFEMP 0x20000000 /* Transmit FIFO Empty */ |
---|
166 | | -#define STR_TDREQ 0x10000000 /* Transmit Data Transfer Request */ |
---|
167 | | -#define STR_TEOF 0x00800000 /* Frame Transmission End */ |
---|
168 | | -#define STR_TFSERR 0x00200000 /* Transmit Frame Synchronization Error */ |
---|
169 | | -#define STR_TFOVF 0x00100000 /* Transmit FIFO Overflow */ |
---|
170 | | -#define STR_TFUDF 0x00080000 /* Transmit FIFO Underflow */ |
---|
171 | | -#define STR_RFFUL 0x00002000 /* Receive FIFO Full */ |
---|
172 | | -#define STR_RDREQ 0x00001000 /* Receive Data Transfer Request */ |
---|
173 | | -#define STR_REOF 0x00000080 /* Frame Reception End */ |
---|
174 | | -#define STR_RFSERR 0x00000020 /* Receive Frame Synchronization Error */ |
---|
175 | | -#define STR_RFUDF 0x00000010 /* Receive FIFO Underflow */ |
---|
176 | | -#define STR_RFOVF 0x00000008 /* Receive FIFO Overflow */ |
---|
| 161 | +/* SISTR */ |
---|
| 162 | +#define SISTR_TFEMP BIT(29) /* Transmit FIFO Empty */ |
---|
| 163 | +#define SISTR_TDREQ BIT(28) /* Transmit Data Transfer Request */ |
---|
| 164 | +#define SISTR_TEOF BIT(23) /* Frame Transmission End */ |
---|
| 165 | +#define SISTR_TFSERR BIT(21) /* Transmit Frame Synchronization Error */ |
---|
| 166 | +#define SISTR_TFOVF BIT(20) /* Transmit FIFO Overflow */ |
---|
| 167 | +#define SISTR_TFUDF BIT(19) /* Transmit FIFO Underflow */ |
---|
| 168 | +#define SISTR_RFFUL BIT(13) /* Receive FIFO Full */ |
---|
| 169 | +#define SISTR_RDREQ BIT(12) /* Receive Data Transfer Request */ |
---|
| 170 | +#define SISTR_REOF BIT(7) /* Frame Reception End */ |
---|
| 171 | +#define SISTR_RFSERR BIT(5) /* Receive Frame Synchronization Error */ |
---|
| 172 | +#define SISTR_RFUDF BIT(4) /* Receive FIFO Underflow */ |
---|
| 173 | +#define SISTR_RFOVF BIT(3) /* Receive FIFO Overflow */ |
---|
177 | 174 | |
---|
178 | | -/* IER */ |
---|
179 | | -#define IER_TDMAE 0x80000000 /* Transmit Data DMA Transfer Req. Enable */ |
---|
180 | | -#define IER_TFEMPE 0x20000000 /* Transmit FIFO Empty Enable */ |
---|
181 | | -#define IER_TDREQE 0x10000000 /* Transmit Data Transfer Request Enable */ |
---|
182 | | -#define IER_TEOFE 0x00800000 /* Frame Transmission End Enable */ |
---|
183 | | -#define IER_TFSERRE 0x00200000 /* Transmit Frame Sync Error Enable */ |
---|
184 | | -#define IER_TFOVFE 0x00100000 /* Transmit FIFO Overflow Enable */ |
---|
185 | | -#define IER_TFUDFE 0x00080000 /* Transmit FIFO Underflow Enable */ |
---|
186 | | -#define IER_RDMAE 0x00008000 /* Receive Data DMA Transfer Req. Enable */ |
---|
187 | | -#define IER_RFFULE 0x00002000 /* Receive FIFO Full Enable */ |
---|
188 | | -#define IER_RDREQE 0x00001000 /* Receive Data Transfer Request Enable */ |
---|
189 | | -#define IER_REOFE 0x00000080 /* Frame Reception End Enable */ |
---|
190 | | -#define IER_RFSERRE 0x00000020 /* Receive Frame Sync Error Enable */ |
---|
191 | | -#define IER_RFUDFE 0x00000010 /* Receive FIFO Underflow Enable */ |
---|
192 | | -#define IER_RFOVFE 0x00000008 /* Receive FIFO Overflow Enable */ |
---|
| 175 | +/* SIIER */ |
---|
| 176 | +#define SIIER_TDMAE BIT(31) /* Transmit Data DMA Transfer Req. Enable */ |
---|
| 177 | +#define SIIER_TFEMPE BIT(29) /* Transmit FIFO Empty Enable */ |
---|
| 178 | +#define SIIER_TDREQE BIT(28) /* Transmit Data Transfer Request Enable */ |
---|
| 179 | +#define SIIER_TEOFE BIT(23) /* Frame Transmission End Enable */ |
---|
| 180 | +#define SIIER_TFSERRE BIT(21) /* Transmit Frame Sync Error Enable */ |
---|
| 181 | +#define SIIER_TFOVFE BIT(20) /* Transmit FIFO Overflow Enable */ |
---|
| 182 | +#define SIIER_TFUDFE BIT(19) /* Transmit FIFO Underflow Enable */ |
---|
| 183 | +#define SIIER_RDMAE BIT(15) /* Receive Data DMA Transfer Req. Enable */ |
---|
| 184 | +#define SIIER_RFFULE BIT(13) /* Receive FIFO Full Enable */ |
---|
| 185 | +#define SIIER_RDREQE BIT(12) /* Receive Data Transfer Request Enable */ |
---|
| 186 | +#define SIIER_REOFE BIT(7) /* Frame Reception End Enable */ |
---|
| 187 | +#define SIIER_RFSERRE BIT(5) /* Receive Frame Sync Error Enable */ |
---|
| 188 | +#define SIIER_RFUDFE BIT(4) /* Receive FIFO Underflow Enable */ |
---|
| 189 | +#define SIIER_RFOVFE BIT(3) /* Receive FIFO Overflow Enable */ |
---|
193 | 190 | |
---|
194 | 191 | |
---|
195 | 192 | static u32 sh_msiof_read(struct sh_msiof_spi_priv *p, int reg_offs) |
---|
196 | 193 | { |
---|
197 | 194 | switch (reg_offs) { |
---|
198 | | - case TSCR: |
---|
199 | | - case RSCR: |
---|
| 195 | + case SITSCR: |
---|
| 196 | + case SIRSCR: |
---|
200 | 197 | return ioread16(p->mapbase + reg_offs); |
---|
201 | 198 | default: |
---|
202 | 199 | return ioread32(p->mapbase + reg_offs); |
---|
.. | .. |
---|
207 | 204 | u32 value) |
---|
208 | 205 | { |
---|
209 | 206 | switch (reg_offs) { |
---|
210 | | - case TSCR: |
---|
211 | | - case RSCR: |
---|
| 207 | + case SITSCR: |
---|
| 208 | + case SIRSCR: |
---|
212 | 209 | iowrite16(value, p->mapbase + reg_offs); |
---|
213 | 210 | break; |
---|
214 | 211 | default: |
---|
.. | .. |
---|
222 | 219 | { |
---|
223 | 220 | u32 mask = clr | set; |
---|
224 | 221 | u32 data; |
---|
225 | | - int k; |
---|
226 | 222 | |
---|
227 | | - data = sh_msiof_read(p, CTR); |
---|
| 223 | + data = sh_msiof_read(p, SICTR); |
---|
228 | 224 | data &= ~clr; |
---|
229 | 225 | data |= set; |
---|
230 | | - sh_msiof_write(p, CTR, data); |
---|
| 226 | + sh_msiof_write(p, SICTR, data); |
---|
231 | 227 | |
---|
232 | | - for (k = 100; k > 0; k--) { |
---|
233 | | - if ((sh_msiof_read(p, CTR) & mask) == set) |
---|
234 | | - break; |
---|
235 | | - |
---|
236 | | - udelay(10); |
---|
237 | | - } |
---|
238 | | - |
---|
239 | | - return k > 0 ? 0 : -ETIMEDOUT; |
---|
| 228 | + return readl_poll_timeout_atomic(p->mapbase + SICTR, data, |
---|
| 229 | + (data & mask) == set, 1, 100); |
---|
240 | 230 | } |
---|
241 | 231 | |
---|
242 | 232 | static irqreturn_t sh_msiof_spi_irq(int irq, void *data) |
---|
.. | .. |
---|
244 | 234 | struct sh_msiof_spi_priv *p = data; |
---|
245 | 235 | |
---|
246 | 236 | /* just disable the interrupt and wake up */ |
---|
247 | | - sh_msiof_write(p, IER, 0); |
---|
| 237 | + sh_msiof_write(p, SIIER, 0); |
---|
248 | 238 | complete(&p->done); |
---|
249 | 239 | |
---|
250 | 240 | return IRQ_HANDLED; |
---|
251 | 241 | } |
---|
252 | 242 | |
---|
| 243 | +static void sh_msiof_spi_reset_regs(struct sh_msiof_spi_priv *p) |
---|
| 244 | +{ |
---|
| 245 | + u32 mask = SICTR_TXRST | SICTR_RXRST; |
---|
| 246 | + u32 data; |
---|
| 247 | + |
---|
| 248 | + data = sh_msiof_read(p, SICTR); |
---|
| 249 | + data |= mask; |
---|
| 250 | + sh_msiof_write(p, SICTR, data); |
---|
| 251 | + |
---|
| 252 | + readl_poll_timeout_atomic(p->mapbase + SICTR, data, !(data & mask), 1, |
---|
| 253 | + 100); |
---|
| 254 | +} |
---|
| 255 | + |
---|
253 | 256 | static const u32 sh_msiof_spi_div_array[] = { |
---|
254 | | - SCR_BRDV_DIV_1, SCR_BRDV_DIV_2, SCR_BRDV_DIV_4, |
---|
255 | | - SCR_BRDV_DIV_8, SCR_BRDV_DIV_16, SCR_BRDV_DIV_32, |
---|
| 257 | + SISCR_BRDV_DIV_1, SISCR_BRDV_DIV_2, SISCR_BRDV_DIV_4, |
---|
| 258 | + SISCR_BRDV_DIV_8, SISCR_BRDV_DIV_16, SISCR_BRDV_DIV_32, |
---|
256 | 259 | }; |
---|
257 | 260 | |
---|
258 | 261 | static void sh_msiof_spi_set_clk_regs(struct sh_msiof_spi_priv *p, |
---|
.. | .. |
---|
270 | 273 | |
---|
271 | 274 | div = DIV_ROUND_UP(parent_rate, spi_hz); |
---|
272 | 275 | if (div <= 1024) { |
---|
273 | | - /* SCR_BRDV_DIV_1 is valid only if BRPS is x 1/1 or x 1/2 */ |
---|
| 276 | + /* SISCR_BRDV_DIV_1 is valid only if BRPS is x 1/1 or x 1/2 */ |
---|
274 | 277 | if (!div_pow && div <= 32 && div > 2) |
---|
275 | 278 | div_pow = 1; |
---|
276 | 279 | |
---|
.. | .. |
---|
289 | 292 | brps = 32; |
---|
290 | 293 | } |
---|
291 | 294 | |
---|
292 | | - scr = sh_msiof_spi_div_array[div_pow] | SCR_BRPS(brps); |
---|
293 | | - sh_msiof_write(p, TSCR, scr); |
---|
294 | | - if (!(p->master->flags & SPI_MASTER_MUST_TX)) |
---|
295 | | - sh_msiof_write(p, RSCR, scr); |
---|
| 295 | + scr = sh_msiof_spi_div_array[div_pow] | SISCR_BRPS(brps); |
---|
| 296 | + sh_msiof_write(p, SITSCR, scr); |
---|
| 297 | + if (!(p->ctlr->flags & SPI_CONTROLLER_MUST_TX)) |
---|
| 298 | + sh_msiof_write(p, SIRSCR, scr); |
---|
296 | 299 | } |
---|
297 | 300 | |
---|
298 | 301 | static u32 sh_msiof_get_delay_bit(u32 dtdl_or_syncdl) |
---|
.. | .. |
---|
331 | 334 | return 0; |
---|
332 | 335 | } |
---|
333 | 336 | |
---|
334 | | - val = sh_msiof_get_delay_bit(p->info->dtdl) << MDR1_DTDL_SHIFT; |
---|
335 | | - val |= sh_msiof_get_delay_bit(p->info->syncdl) << MDR1_SYNCDL_SHIFT; |
---|
| 337 | + val = sh_msiof_get_delay_bit(p->info->dtdl) << SIMDR1_DTDL_SHIFT; |
---|
| 338 | + val |= sh_msiof_get_delay_bit(p->info->syncdl) << SIMDR1_SYNCDL_SHIFT; |
---|
336 | 339 | |
---|
337 | 340 | return val; |
---|
338 | 341 | } |
---|
.. | .. |
---|
351 | 354 | * 1 0 11 11 0 0 |
---|
352 | 355 | * 1 1 11 11 1 1 |
---|
353 | 356 | */ |
---|
354 | | - tmp = MDR1_SYNCMD_SPI | 1 << MDR1_FLD_SHIFT | MDR1_XXSTP; |
---|
355 | | - tmp |= !cs_high << MDR1_SYNCAC_SHIFT; |
---|
356 | | - tmp |= lsb_first << MDR1_BITLSB_SHIFT; |
---|
| 357 | + tmp = SIMDR1_SYNCMD_SPI | 1 << SIMDR1_FLD_SHIFT | SIMDR1_XXSTP; |
---|
| 358 | + tmp |= !cs_high << SIMDR1_SYNCAC_SHIFT; |
---|
| 359 | + tmp |= lsb_first << SIMDR1_BITLSB_SHIFT; |
---|
357 | 360 | tmp |= sh_msiof_spi_get_dtdl_and_syncdl(p); |
---|
358 | | - if (spi_controller_is_slave(p->master)) { |
---|
359 | | - sh_msiof_write(p, TMDR1, tmp | TMDR1_PCON); |
---|
| 361 | + if (spi_controller_is_slave(p->ctlr)) { |
---|
| 362 | + sh_msiof_write(p, SITMDR1, tmp | SITMDR1_PCON); |
---|
360 | 363 | } else { |
---|
361 | | - sh_msiof_write(p, TMDR1, |
---|
362 | | - tmp | MDR1_TRMD | TMDR1_PCON | |
---|
363 | | - (ss < MAX_SS ? ss : 0) << TMDR1_SYNCCH_SHIFT); |
---|
| 364 | + sh_msiof_write(p, SITMDR1, |
---|
| 365 | + tmp | SIMDR1_TRMD | SITMDR1_PCON | |
---|
| 366 | + (ss < MAX_SS ? ss : 0) << SITMDR1_SYNCCH_SHIFT); |
---|
364 | 367 | } |
---|
365 | | - if (p->master->flags & SPI_MASTER_MUST_TX) { |
---|
| 368 | + if (p->ctlr->flags & SPI_CONTROLLER_MUST_TX) { |
---|
366 | 369 | /* These bits are reserved if RX needs TX */ |
---|
367 | 370 | tmp &= ~0x0000ffff; |
---|
368 | 371 | } |
---|
369 | | - sh_msiof_write(p, RMDR1, tmp); |
---|
| 372 | + sh_msiof_write(p, SIRMDR1, tmp); |
---|
370 | 373 | |
---|
371 | 374 | tmp = 0; |
---|
372 | | - tmp |= CTR_TSCKIZ_SCK | cpol << CTR_TSCKIZ_POL_SHIFT; |
---|
373 | | - tmp |= CTR_RSCKIZ_SCK | cpol << CTR_RSCKIZ_POL_SHIFT; |
---|
| 375 | + tmp |= SICTR_TSCKIZ_SCK | cpol << SICTR_TSCKIZ_POL_SHIFT; |
---|
| 376 | + tmp |= SICTR_RSCKIZ_SCK | cpol << SICTR_RSCKIZ_POL_SHIFT; |
---|
374 | 377 | |
---|
375 | 378 | edge = cpol ^ !cpha; |
---|
376 | 379 | |
---|
377 | | - tmp |= edge << CTR_TEDG_SHIFT; |
---|
378 | | - tmp |= edge << CTR_REDG_SHIFT; |
---|
379 | | - tmp |= tx_hi_z ? CTR_TXDIZ_HIZ : CTR_TXDIZ_LOW; |
---|
380 | | - sh_msiof_write(p, CTR, tmp); |
---|
| 380 | + tmp |= edge << SICTR_TEDG_SHIFT; |
---|
| 381 | + tmp |= edge << SICTR_REDG_SHIFT; |
---|
| 382 | + tmp |= tx_hi_z ? SICTR_TXDIZ_HIZ : SICTR_TXDIZ_LOW; |
---|
| 383 | + sh_msiof_write(p, SICTR, tmp); |
---|
381 | 384 | } |
---|
382 | 385 | |
---|
383 | 386 | static void sh_msiof_spi_set_mode_regs(struct sh_msiof_spi_priv *p, |
---|
384 | 387 | const void *tx_buf, void *rx_buf, |
---|
385 | 388 | u32 bits, u32 words) |
---|
386 | 389 | { |
---|
387 | | - u32 dr2 = MDR2_BITLEN1(bits) | MDR2_WDLEN1(words); |
---|
| 390 | + u32 dr2 = SIMDR2_BITLEN1(bits) | SIMDR2_WDLEN1(words); |
---|
388 | 391 | |
---|
389 | | - if (tx_buf || (p->master->flags & SPI_MASTER_MUST_TX)) |
---|
390 | | - sh_msiof_write(p, TMDR2, dr2); |
---|
| 392 | + if (tx_buf || (p->ctlr->flags & SPI_CONTROLLER_MUST_TX)) |
---|
| 393 | + sh_msiof_write(p, SITMDR2, dr2); |
---|
391 | 394 | else |
---|
392 | | - sh_msiof_write(p, TMDR2, dr2 | MDR2_GRPMASK1); |
---|
| 395 | + sh_msiof_write(p, SITMDR2, dr2 | SIMDR2_GRPMASK1); |
---|
393 | 396 | |
---|
394 | 397 | if (rx_buf) |
---|
395 | | - sh_msiof_write(p, RMDR2, dr2); |
---|
| 398 | + sh_msiof_write(p, SIRMDR2, dr2); |
---|
396 | 399 | } |
---|
397 | 400 | |
---|
398 | 401 | static void sh_msiof_reset_str(struct sh_msiof_spi_priv *p) |
---|
399 | 402 | { |
---|
400 | | - sh_msiof_write(p, STR, |
---|
401 | | - sh_msiof_read(p, STR) & ~(STR_TDREQ | STR_RDREQ)); |
---|
| 403 | + sh_msiof_write(p, SISTR, |
---|
| 404 | + sh_msiof_read(p, SISTR) & ~(SISTR_TDREQ | SISTR_RDREQ)); |
---|
402 | 405 | } |
---|
403 | 406 | |
---|
404 | 407 | static void sh_msiof_spi_write_fifo_8(struct sh_msiof_spi_priv *p, |
---|
.. | .. |
---|
408 | 411 | int k; |
---|
409 | 412 | |
---|
410 | 413 | for (k = 0; k < words; k++) |
---|
411 | | - sh_msiof_write(p, TFDR, buf_8[k] << fs); |
---|
| 414 | + sh_msiof_write(p, SITFDR, buf_8[k] << fs); |
---|
412 | 415 | } |
---|
413 | 416 | |
---|
414 | 417 | static void sh_msiof_spi_write_fifo_16(struct sh_msiof_spi_priv *p, |
---|
.. | .. |
---|
418 | 421 | int k; |
---|
419 | 422 | |
---|
420 | 423 | for (k = 0; k < words; k++) |
---|
421 | | - sh_msiof_write(p, TFDR, buf_16[k] << fs); |
---|
| 424 | + sh_msiof_write(p, SITFDR, buf_16[k] << fs); |
---|
422 | 425 | } |
---|
423 | 426 | |
---|
424 | 427 | static void sh_msiof_spi_write_fifo_16u(struct sh_msiof_spi_priv *p, |
---|
.. | .. |
---|
428 | 431 | int k; |
---|
429 | 432 | |
---|
430 | 433 | for (k = 0; k < words; k++) |
---|
431 | | - sh_msiof_write(p, TFDR, get_unaligned(&buf_16[k]) << fs); |
---|
| 434 | + sh_msiof_write(p, SITFDR, get_unaligned(&buf_16[k]) << fs); |
---|
432 | 435 | } |
---|
433 | 436 | |
---|
434 | 437 | static void sh_msiof_spi_write_fifo_32(struct sh_msiof_spi_priv *p, |
---|
.. | .. |
---|
438 | 441 | int k; |
---|
439 | 442 | |
---|
440 | 443 | for (k = 0; k < words; k++) |
---|
441 | | - sh_msiof_write(p, TFDR, buf_32[k] << fs); |
---|
| 444 | + sh_msiof_write(p, SITFDR, buf_32[k] << fs); |
---|
442 | 445 | } |
---|
443 | 446 | |
---|
444 | 447 | static void sh_msiof_spi_write_fifo_32u(struct sh_msiof_spi_priv *p, |
---|
.. | .. |
---|
448 | 451 | int k; |
---|
449 | 452 | |
---|
450 | 453 | for (k = 0; k < words; k++) |
---|
451 | | - sh_msiof_write(p, TFDR, get_unaligned(&buf_32[k]) << fs); |
---|
| 454 | + sh_msiof_write(p, SITFDR, get_unaligned(&buf_32[k]) << fs); |
---|
452 | 455 | } |
---|
453 | 456 | |
---|
454 | 457 | static void sh_msiof_spi_write_fifo_s32(struct sh_msiof_spi_priv *p, |
---|
.. | .. |
---|
458 | 461 | int k; |
---|
459 | 462 | |
---|
460 | 463 | for (k = 0; k < words; k++) |
---|
461 | | - sh_msiof_write(p, TFDR, swab32(buf_32[k] << fs)); |
---|
| 464 | + sh_msiof_write(p, SITFDR, swab32(buf_32[k] << fs)); |
---|
462 | 465 | } |
---|
463 | 466 | |
---|
464 | 467 | static void sh_msiof_spi_write_fifo_s32u(struct sh_msiof_spi_priv *p, |
---|
.. | .. |
---|
468 | 471 | int k; |
---|
469 | 472 | |
---|
470 | 473 | for (k = 0; k < words; k++) |
---|
471 | | - sh_msiof_write(p, TFDR, swab32(get_unaligned(&buf_32[k]) << fs)); |
---|
| 474 | + sh_msiof_write(p, SITFDR, swab32(get_unaligned(&buf_32[k]) << fs)); |
---|
472 | 475 | } |
---|
473 | 476 | |
---|
474 | 477 | static void sh_msiof_spi_read_fifo_8(struct sh_msiof_spi_priv *p, |
---|
.. | .. |
---|
478 | 481 | int k; |
---|
479 | 482 | |
---|
480 | 483 | for (k = 0; k < words; k++) |
---|
481 | | - buf_8[k] = sh_msiof_read(p, RFDR) >> fs; |
---|
| 484 | + buf_8[k] = sh_msiof_read(p, SIRFDR) >> fs; |
---|
482 | 485 | } |
---|
483 | 486 | |
---|
484 | 487 | static void sh_msiof_spi_read_fifo_16(struct sh_msiof_spi_priv *p, |
---|
.. | .. |
---|
488 | 491 | int k; |
---|
489 | 492 | |
---|
490 | 493 | for (k = 0; k < words; k++) |
---|
491 | | - buf_16[k] = sh_msiof_read(p, RFDR) >> fs; |
---|
| 494 | + buf_16[k] = sh_msiof_read(p, SIRFDR) >> fs; |
---|
492 | 495 | } |
---|
493 | 496 | |
---|
494 | 497 | static void sh_msiof_spi_read_fifo_16u(struct sh_msiof_spi_priv *p, |
---|
.. | .. |
---|
498 | 501 | int k; |
---|
499 | 502 | |
---|
500 | 503 | for (k = 0; k < words; k++) |
---|
501 | | - put_unaligned(sh_msiof_read(p, RFDR) >> fs, &buf_16[k]); |
---|
| 504 | + put_unaligned(sh_msiof_read(p, SIRFDR) >> fs, &buf_16[k]); |
---|
502 | 505 | } |
---|
503 | 506 | |
---|
504 | 507 | static void sh_msiof_spi_read_fifo_32(struct sh_msiof_spi_priv *p, |
---|
.. | .. |
---|
508 | 511 | int k; |
---|
509 | 512 | |
---|
510 | 513 | for (k = 0; k < words; k++) |
---|
511 | | - buf_32[k] = sh_msiof_read(p, RFDR) >> fs; |
---|
| 514 | + buf_32[k] = sh_msiof_read(p, SIRFDR) >> fs; |
---|
512 | 515 | } |
---|
513 | 516 | |
---|
514 | 517 | static void sh_msiof_spi_read_fifo_32u(struct sh_msiof_spi_priv *p, |
---|
.. | .. |
---|
518 | 521 | int k; |
---|
519 | 522 | |
---|
520 | 523 | for (k = 0; k < words; k++) |
---|
521 | | - put_unaligned(sh_msiof_read(p, RFDR) >> fs, &buf_32[k]); |
---|
| 524 | + put_unaligned(sh_msiof_read(p, SIRFDR) >> fs, &buf_32[k]); |
---|
522 | 525 | } |
---|
523 | 526 | |
---|
524 | 527 | static void sh_msiof_spi_read_fifo_s32(struct sh_msiof_spi_priv *p, |
---|
.. | .. |
---|
528 | 531 | int k; |
---|
529 | 532 | |
---|
530 | 533 | for (k = 0; k < words; k++) |
---|
531 | | - buf_32[k] = swab32(sh_msiof_read(p, RFDR) >> fs); |
---|
| 534 | + buf_32[k] = swab32(sh_msiof_read(p, SIRFDR) >> fs); |
---|
532 | 535 | } |
---|
533 | 536 | |
---|
534 | 537 | static void sh_msiof_spi_read_fifo_s32u(struct sh_msiof_spi_priv *p, |
---|
.. | .. |
---|
538 | 541 | int k; |
---|
539 | 542 | |
---|
540 | 543 | for (k = 0; k < words; k++) |
---|
541 | | - put_unaligned(swab32(sh_msiof_read(p, RFDR) >> fs), &buf_32[k]); |
---|
| 544 | + put_unaligned(swab32(sh_msiof_read(p, SIRFDR) >> fs), &buf_32[k]); |
---|
542 | 545 | } |
---|
543 | 546 | |
---|
544 | 547 | static int sh_msiof_spi_setup(struct spi_device *spi) |
---|
545 | 548 | { |
---|
546 | | - struct device_node *np = spi->master->dev.of_node; |
---|
547 | | - struct sh_msiof_spi_priv *p = spi_master_get_devdata(spi->master); |
---|
| 549 | + struct sh_msiof_spi_priv *p = |
---|
| 550 | + spi_controller_get_devdata(spi->controller); |
---|
548 | 551 | u32 clr, set, tmp; |
---|
549 | 552 | |
---|
550 | | - if (!np) { |
---|
551 | | - /* |
---|
552 | | - * Use spi->controller_data for CS (same strategy as spi_gpio), |
---|
553 | | - * if any. otherwise let HW control CS |
---|
554 | | - */ |
---|
555 | | - spi->cs_gpio = (uintptr_t)spi->controller_data; |
---|
556 | | - } |
---|
557 | | - |
---|
558 | | - if (gpio_is_valid(spi->cs_gpio)) { |
---|
559 | | - gpio_direction_output(spi->cs_gpio, !(spi->mode & SPI_CS_HIGH)); |
---|
560 | | - return 0; |
---|
561 | | - } |
---|
562 | | - |
---|
563 | | - if (spi_controller_is_slave(p->master)) |
---|
| 553 | + if (spi->cs_gpiod || spi_controller_is_slave(p->ctlr)) |
---|
564 | 554 | return 0; |
---|
565 | 555 | |
---|
566 | 556 | if (p->native_cs_inited && |
---|
.. | .. |
---|
568 | 558 | return 0; |
---|
569 | 559 | |
---|
570 | 560 | /* Configure native chip select mode/polarity early */ |
---|
571 | | - clr = MDR1_SYNCMD_MASK; |
---|
572 | | - set = MDR1_SYNCMD_SPI; |
---|
| 561 | + clr = SIMDR1_SYNCMD_MASK; |
---|
| 562 | + set = SIMDR1_SYNCMD_SPI; |
---|
573 | 563 | if (spi->mode & SPI_CS_HIGH) |
---|
574 | | - clr |= BIT(MDR1_SYNCAC_SHIFT); |
---|
| 564 | + clr |= BIT(SIMDR1_SYNCAC_SHIFT); |
---|
575 | 565 | else |
---|
576 | | - set |= BIT(MDR1_SYNCAC_SHIFT); |
---|
| 566 | + set |= BIT(SIMDR1_SYNCAC_SHIFT); |
---|
577 | 567 | pm_runtime_get_sync(&p->pdev->dev); |
---|
578 | | - tmp = sh_msiof_read(p, TMDR1) & ~clr; |
---|
579 | | - sh_msiof_write(p, TMDR1, tmp | set | MDR1_TRMD | TMDR1_PCON); |
---|
580 | | - tmp = sh_msiof_read(p, RMDR1) & ~clr; |
---|
581 | | - sh_msiof_write(p, RMDR1, tmp | set); |
---|
| 568 | + tmp = sh_msiof_read(p, SITMDR1) & ~clr; |
---|
| 569 | + sh_msiof_write(p, SITMDR1, tmp | set | SIMDR1_TRMD | SITMDR1_PCON); |
---|
| 570 | + tmp = sh_msiof_read(p, SIRMDR1) & ~clr; |
---|
| 571 | + sh_msiof_write(p, SIRMDR1, tmp | set); |
---|
582 | 572 | pm_runtime_put(&p->pdev->dev); |
---|
583 | 573 | p->native_cs_high = spi->mode & SPI_CS_HIGH; |
---|
584 | 574 | p->native_cs_inited = true; |
---|
585 | 575 | return 0; |
---|
586 | 576 | } |
---|
587 | 577 | |
---|
588 | | -static int sh_msiof_prepare_message(struct spi_master *master, |
---|
| 578 | +static int sh_msiof_prepare_message(struct spi_controller *ctlr, |
---|
589 | 579 | struct spi_message *msg) |
---|
590 | 580 | { |
---|
591 | | - struct sh_msiof_spi_priv *p = spi_master_get_devdata(master); |
---|
| 581 | + struct sh_msiof_spi_priv *p = spi_controller_get_devdata(ctlr); |
---|
592 | 582 | const struct spi_device *spi = msg->spi; |
---|
593 | 583 | u32 ss, cs_high; |
---|
594 | 584 | |
---|
595 | 585 | /* Configure pins before asserting CS */ |
---|
596 | | - if (gpio_is_valid(spi->cs_gpio)) { |
---|
597 | | - ss = p->unused_ss; |
---|
| 586 | + if (spi->cs_gpiod) { |
---|
| 587 | + ss = ctlr->unused_native_cs; |
---|
598 | 588 | cs_high = p->native_cs_high; |
---|
599 | 589 | } else { |
---|
600 | 590 | ss = spi->chip_select; |
---|
.. | .. |
---|
609 | 599 | |
---|
610 | 600 | static int sh_msiof_spi_start(struct sh_msiof_spi_priv *p, void *rx_buf) |
---|
611 | 601 | { |
---|
612 | | - bool slave = spi_controller_is_slave(p->master); |
---|
| 602 | + bool slave = spi_controller_is_slave(p->ctlr); |
---|
613 | 603 | int ret = 0; |
---|
614 | 604 | |
---|
615 | 605 | /* setup clock and rx/tx signals */ |
---|
616 | 606 | if (!slave) |
---|
617 | | - ret = sh_msiof_modify_ctr_wait(p, 0, CTR_TSCKE); |
---|
| 607 | + ret = sh_msiof_modify_ctr_wait(p, 0, SICTR_TSCKE); |
---|
618 | 608 | if (rx_buf && !ret) |
---|
619 | | - ret = sh_msiof_modify_ctr_wait(p, 0, CTR_RXE); |
---|
| 609 | + ret = sh_msiof_modify_ctr_wait(p, 0, SICTR_RXE); |
---|
620 | 610 | if (!ret) |
---|
621 | | - ret = sh_msiof_modify_ctr_wait(p, 0, CTR_TXE); |
---|
| 611 | + ret = sh_msiof_modify_ctr_wait(p, 0, SICTR_TXE); |
---|
622 | 612 | |
---|
623 | 613 | /* start by setting frame bit */ |
---|
624 | 614 | if (!ret && !slave) |
---|
625 | | - ret = sh_msiof_modify_ctr_wait(p, 0, CTR_TFSE); |
---|
| 615 | + ret = sh_msiof_modify_ctr_wait(p, 0, SICTR_TFSE); |
---|
626 | 616 | |
---|
627 | 617 | return ret; |
---|
628 | 618 | } |
---|
629 | 619 | |
---|
630 | 620 | static int sh_msiof_spi_stop(struct sh_msiof_spi_priv *p, void *rx_buf) |
---|
631 | 621 | { |
---|
632 | | - bool slave = spi_controller_is_slave(p->master); |
---|
| 622 | + bool slave = spi_controller_is_slave(p->ctlr); |
---|
633 | 623 | int ret = 0; |
---|
634 | 624 | |
---|
635 | 625 | /* shut down frame, rx/tx and clock signals */ |
---|
636 | 626 | if (!slave) |
---|
637 | | - ret = sh_msiof_modify_ctr_wait(p, CTR_TFSE, 0); |
---|
| 627 | + ret = sh_msiof_modify_ctr_wait(p, SICTR_TFSE, 0); |
---|
638 | 628 | if (!ret) |
---|
639 | | - ret = sh_msiof_modify_ctr_wait(p, CTR_TXE, 0); |
---|
| 629 | + ret = sh_msiof_modify_ctr_wait(p, SICTR_TXE, 0); |
---|
640 | 630 | if (rx_buf && !ret) |
---|
641 | | - ret = sh_msiof_modify_ctr_wait(p, CTR_RXE, 0); |
---|
| 631 | + ret = sh_msiof_modify_ctr_wait(p, SICTR_RXE, 0); |
---|
642 | 632 | if (!ret && !slave) |
---|
643 | | - ret = sh_msiof_modify_ctr_wait(p, CTR_TSCKE, 0); |
---|
| 633 | + ret = sh_msiof_modify_ctr_wait(p, SICTR_TSCKE, 0); |
---|
644 | 634 | |
---|
645 | 635 | return ret; |
---|
646 | 636 | } |
---|
647 | 637 | |
---|
648 | | -static int sh_msiof_slave_abort(struct spi_master *master) |
---|
| 638 | +static int sh_msiof_slave_abort(struct spi_controller *ctlr) |
---|
649 | 639 | { |
---|
650 | | - struct sh_msiof_spi_priv *p = spi_master_get_devdata(master); |
---|
| 640 | + struct sh_msiof_spi_priv *p = spi_controller_get_devdata(ctlr); |
---|
651 | 641 | |
---|
652 | 642 | p->slave_aborted = true; |
---|
653 | 643 | complete(&p->done); |
---|
.. | .. |
---|
658 | 648 | static int sh_msiof_wait_for_completion(struct sh_msiof_spi_priv *p, |
---|
659 | 649 | struct completion *x) |
---|
660 | 650 | { |
---|
661 | | - if (spi_controller_is_slave(p->master)) { |
---|
| 651 | + if (spi_controller_is_slave(p->ctlr)) { |
---|
662 | 652 | if (wait_for_completion_interruptible(x) || |
---|
663 | 653 | p->slave_aborted) { |
---|
664 | 654 | dev_dbg(&p->pdev->dev, "interrupted\n"); |
---|
.. | .. |
---|
695 | 685 | fifo_shift = 32 - bits; |
---|
696 | 686 | |
---|
697 | 687 | /* default FIFO watermarks for PIO */ |
---|
698 | | - sh_msiof_write(p, FCTR, 0); |
---|
| 688 | + sh_msiof_write(p, SIFCTR, 0); |
---|
699 | 689 | |
---|
700 | 690 | /* setup msiof transfer mode registers */ |
---|
701 | 691 | sh_msiof_spi_set_mode_regs(p, tx_buf, rx_buf, bits, words); |
---|
702 | | - sh_msiof_write(p, IER, IER_TEOFE | IER_REOFE); |
---|
| 692 | + sh_msiof_write(p, SIIER, SIIER_TEOFE | SIIER_REOFE); |
---|
703 | 693 | |
---|
704 | 694 | /* write tx fifo */ |
---|
705 | 695 | if (tx_buf) |
---|
.. | .. |
---|
738 | 728 | sh_msiof_reset_str(p); |
---|
739 | 729 | sh_msiof_spi_stop(p, rx_buf); |
---|
740 | 730 | stop_ier: |
---|
741 | | - sh_msiof_write(p, IER, 0); |
---|
| 731 | + sh_msiof_write(p, SIIER, 0); |
---|
742 | 732 | return ret; |
---|
743 | 733 | } |
---|
744 | 734 | |
---|
.. | .. |
---|
757 | 747 | |
---|
758 | 748 | /* First prepare and submit the DMA request(s), as this may fail */ |
---|
759 | 749 | if (rx) { |
---|
760 | | - ier_bits |= IER_RDREQE | IER_RDMAE; |
---|
761 | | - desc_rx = dmaengine_prep_slave_single(p->master->dma_rx, |
---|
| 750 | + ier_bits |= SIIER_RDREQE | SIIER_RDMAE; |
---|
| 751 | + desc_rx = dmaengine_prep_slave_single(p->ctlr->dma_rx, |
---|
762 | 752 | p->rx_dma_addr, len, DMA_DEV_TO_MEM, |
---|
763 | 753 | DMA_PREP_INTERRUPT | DMA_CTRL_ACK); |
---|
764 | 754 | if (!desc_rx) |
---|
.. | .. |
---|
772 | 762 | } |
---|
773 | 763 | |
---|
774 | 764 | if (tx) { |
---|
775 | | - ier_bits |= IER_TDREQE | IER_TDMAE; |
---|
776 | | - dma_sync_single_for_device(p->master->dma_tx->device->dev, |
---|
| 765 | + ier_bits |= SIIER_TDREQE | SIIER_TDMAE; |
---|
| 766 | + dma_sync_single_for_device(p->ctlr->dma_tx->device->dev, |
---|
777 | 767 | p->tx_dma_addr, len, DMA_TO_DEVICE); |
---|
778 | | - desc_tx = dmaengine_prep_slave_single(p->master->dma_tx, |
---|
| 768 | + desc_tx = dmaengine_prep_slave_single(p->ctlr->dma_tx, |
---|
779 | 769 | p->tx_dma_addr, len, DMA_MEM_TO_DEV, |
---|
780 | 770 | DMA_PREP_INTERRUPT | DMA_CTRL_ACK); |
---|
781 | 771 | if (!desc_tx) { |
---|
.. | .. |
---|
793 | 783 | } |
---|
794 | 784 | |
---|
795 | 785 | /* 1 stage FIFO watermarks for DMA */ |
---|
796 | | - sh_msiof_write(p, FCTR, FCTR_TFWM_1 | FCTR_RFWM_1); |
---|
| 786 | + sh_msiof_write(p, SIFCTR, SIFCTR_TFWM_1 | SIFCTR_RFWM_1); |
---|
797 | 787 | |
---|
798 | 788 | /* setup msiof transfer mode registers (32-bit words) */ |
---|
799 | 789 | sh_msiof_spi_set_mode_regs(p, tx, rx, 32, len / 4); |
---|
800 | 790 | |
---|
801 | | - sh_msiof_write(p, IER, ier_bits); |
---|
| 791 | + sh_msiof_write(p, SIIER, ier_bits); |
---|
802 | 792 | |
---|
803 | 793 | reinit_completion(&p->done); |
---|
804 | 794 | if (tx) |
---|
.. | .. |
---|
807 | 797 | |
---|
808 | 798 | /* Now start DMA */ |
---|
809 | 799 | if (rx) |
---|
810 | | - dma_async_issue_pending(p->master->dma_rx); |
---|
| 800 | + dma_async_issue_pending(p->ctlr->dma_rx); |
---|
811 | 801 | if (tx) |
---|
812 | | - dma_async_issue_pending(p->master->dma_tx); |
---|
| 802 | + dma_async_issue_pending(p->ctlr->dma_tx); |
---|
813 | 803 | |
---|
814 | 804 | ret = sh_msiof_spi_start(p, rx); |
---|
815 | 805 | if (ret) { |
---|
.. | .. |
---|
830 | 820 | if (ret) |
---|
831 | 821 | goto stop_reset; |
---|
832 | 822 | |
---|
833 | | - sh_msiof_write(p, IER, 0); |
---|
| 823 | + sh_msiof_write(p, SIIER, 0); |
---|
834 | 824 | } else { |
---|
835 | 825 | /* wait for tx fifo to be emptied */ |
---|
836 | | - sh_msiof_write(p, IER, IER_TEOFE); |
---|
| 826 | + sh_msiof_write(p, SIIER, SIIER_TEOFE); |
---|
837 | 827 | ret = sh_msiof_wait_for_completion(p, &p->done); |
---|
838 | 828 | if (ret) |
---|
839 | 829 | goto stop_reset; |
---|
.. | .. |
---|
849 | 839 | } |
---|
850 | 840 | |
---|
851 | 841 | if (rx) |
---|
852 | | - dma_sync_single_for_cpu(p->master->dma_rx->device->dev, |
---|
853 | | - p->rx_dma_addr, len, |
---|
854 | | - DMA_FROM_DEVICE); |
---|
| 842 | + dma_sync_single_for_cpu(p->ctlr->dma_rx->device->dev, |
---|
| 843 | + p->rx_dma_addr, len, DMA_FROM_DEVICE); |
---|
855 | 844 | |
---|
856 | 845 | return 0; |
---|
857 | 846 | |
---|
.. | .. |
---|
860 | 849 | sh_msiof_spi_stop(p, rx); |
---|
861 | 850 | stop_dma: |
---|
862 | 851 | if (tx) |
---|
863 | | - dmaengine_terminate_all(p->master->dma_tx); |
---|
| 852 | + dmaengine_terminate_all(p->ctlr->dma_tx); |
---|
864 | 853 | no_dma_tx: |
---|
865 | 854 | if (rx) |
---|
866 | | - dmaengine_terminate_all(p->master->dma_rx); |
---|
867 | | - sh_msiof_write(p, IER, 0); |
---|
| 855 | + dmaengine_terminate_all(p->ctlr->dma_rx); |
---|
| 856 | + sh_msiof_write(p, SIIER, 0); |
---|
868 | 857 | return ret; |
---|
869 | 858 | } |
---|
870 | 859 | |
---|
.. | .. |
---|
911 | 900 | memcpy(dst, src, words * 4); |
---|
912 | 901 | } |
---|
913 | 902 | |
---|
914 | | -static int sh_msiof_transfer_one(struct spi_master *master, |
---|
| 903 | +static int sh_msiof_transfer_one(struct spi_controller *ctlr, |
---|
915 | 904 | struct spi_device *spi, |
---|
916 | 905 | struct spi_transfer *t) |
---|
917 | 906 | { |
---|
918 | | - struct sh_msiof_spi_priv *p = spi_master_get_devdata(master); |
---|
| 907 | + struct sh_msiof_spi_priv *p = spi_controller_get_devdata(ctlr); |
---|
919 | 908 | void (*copy32)(u32 *, const u32 *, unsigned int); |
---|
920 | 909 | void (*tx_fifo)(struct sh_msiof_spi_priv *, const void *, int, int); |
---|
921 | 910 | void (*rx_fifo)(struct sh_msiof_spi_priv *, void *, int, int); |
---|
.. | .. |
---|
929 | 918 | bool swab; |
---|
930 | 919 | int ret; |
---|
931 | 920 | |
---|
| 921 | + /* reset registers */ |
---|
| 922 | + sh_msiof_spi_reset_regs(p); |
---|
| 923 | + |
---|
932 | 924 | /* setup clocks (clock already enabled in chipselect()) */ |
---|
933 | | - if (!spi_controller_is_slave(p->master)) |
---|
| 925 | + if (!spi_controller_is_slave(p->ctlr)) |
---|
934 | 926 | sh_msiof_spi_set_clk_regs(p, clk_get_rate(p->clk), t->speed_hz); |
---|
935 | 927 | |
---|
936 | | - while (master->dma_tx && len > 15) { |
---|
| 928 | + while (ctlr->dma_tx && len > 15) { |
---|
937 | 929 | /* |
---|
938 | 930 | * DMA supports 32-bit words only, hence pack 8-bit and 16-bit |
---|
939 | 931 | * words, with byte resp. word swapping. |
---|
.. | .. |
---|
941 | 933 | unsigned int l = 0; |
---|
942 | 934 | |
---|
943 | 935 | if (tx_buf) |
---|
944 | | - l = min(len, p->tx_fifo_size * 4); |
---|
| 936 | + l = min(round_down(len, 4), p->tx_fifo_size * 4); |
---|
945 | 937 | if (rx_buf) |
---|
946 | | - l = min(len, p->rx_fifo_size * 4); |
---|
| 938 | + l = min(round_down(len, 4), p->rx_fifo_size * 4); |
---|
947 | 939 | |
---|
948 | 940 | if (bits <= 8) { |
---|
949 | | - if (l & 3) |
---|
950 | | - break; |
---|
951 | 941 | copy32 = copy_bswap32; |
---|
952 | 942 | } else if (bits <= 16) { |
---|
953 | | - if (l & 3) |
---|
954 | | - break; |
---|
955 | 943 | copy32 = copy_wswap32; |
---|
956 | 944 | } else { |
---|
957 | 945 | copy32 = copy_plain32; |
---|
.. | .. |
---|
981 | 969 | return 0; |
---|
982 | 970 | } |
---|
983 | 971 | |
---|
984 | | - if (bits <= 8 && len > 15 && !(len & 3)) { |
---|
| 972 | + if (bits <= 8 && len > 15) { |
---|
985 | 973 | bits = 32; |
---|
986 | 974 | swab = true; |
---|
987 | 975 | } else { |
---|
.. | .. |
---|
1042 | 1030 | if (rx_buf) |
---|
1043 | 1031 | rx_buf += n * bytes_per_word; |
---|
1044 | 1032 | words -= n; |
---|
| 1033 | + |
---|
| 1034 | + if (words == 0 && (len % bytes_per_word)) { |
---|
| 1035 | + words = len % bytes_per_word; |
---|
| 1036 | + bits = t->bits_per_word; |
---|
| 1037 | + bytes_per_word = 1; |
---|
| 1038 | + tx_fifo = sh_msiof_spi_write_fifo_8; |
---|
| 1039 | + rx_fifo = sh_msiof_spi_read_fifo_8; |
---|
| 1040 | + } |
---|
1045 | 1041 | } |
---|
1046 | 1042 | |
---|
1047 | 1043 | return 0; |
---|
1048 | 1044 | } |
---|
1049 | 1045 | |
---|
1050 | 1046 | static const struct sh_msiof_chipdata sh_data = { |
---|
| 1047 | + .bits_per_word_mask = SPI_BPW_RANGE_MASK(8, 32), |
---|
1051 | 1048 | .tx_fifo_size = 64, |
---|
1052 | 1049 | .rx_fifo_size = 64, |
---|
1053 | | - .master_flags = 0, |
---|
| 1050 | + .ctlr_flags = 0, |
---|
1054 | 1051 | .min_div_pow = 0, |
---|
1055 | 1052 | }; |
---|
1056 | 1053 | |
---|
1057 | 1054 | static const struct sh_msiof_chipdata rcar_gen2_data = { |
---|
| 1055 | + .bits_per_word_mask = SPI_BPW_MASK(8) | SPI_BPW_MASK(16) | |
---|
| 1056 | + SPI_BPW_MASK(24) | SPI_BPW_MASK(32), |
---|
1058 | 1057 | .tx_fifo_size = 64, |
---|
1059 | 1058 | .rx_fifo_size = 64, |
---|
1060 | | - .master_flags = SPI_MASTER_MUST_TX, |
---|
| 1059 | + .ctlr_flags = SPI_CONTROLLER_MUST_TX, |
---|
1061 | 1060 | .min_div_pow = 0, |
---|
1062 | 1061 | }; |
---|
1063 | 1062 | |
---|
1064 | 1063 | static const struct sh_msiof_chipdata rcar_gen3_data = { |
---|
| 1064 | + .bits_per_word_mask = SPI_BPW_MASK(8) | SPI_BPW_MASK(16) | |
---|
| 1065 | + SPI_BPW_MASK(24) | SPI_BPW_MASK(32), |
---|
1065 | 1066 | .tx_fifo_size = 64, |
---|
1066 | 1067 | .rx_fifo_size = 64, |
---|
1067 | | - .master_flags = SPI_MASTER_MUST_TX, |
---|
| 1068 | + .ctlr_flags = SPI_CONTROLLER_MUST_TX, |
---|
1068 | 1069 | .min_div_pow = 1, |
---|
1069 | 1070 | }; |
---|
1070 | 1071 | |
---|
.. | .. |
---|
1120 | 1121 | } |
---|
1121 | 1122 | #endif |
---|
1122 | 1123 | |
---|
1123 | | -static int sh_msiof_get_cs_gpios(struct sh_msiof_spi_priv *p) |
---|
1124 | | -{ |
---|
1125 | | - struct device *dev = &p->pdev->dev; |
---|
1126 | | - unsigned int used_ss_mask = 0; |
---|
1127 | | - unsigned int cs_gpios = 0; |
---|
1128 | | - unsigned int num_cs, i; |
---|
1129 | | - int ret; |
---|
1130 | | - |
---|
1131 | | - ret = gpiod_count(dev, "cs"); |
---|
1132 | | - if (ret <= 0) |
---|
1133 | | - return 0; |
---|
1134 | | - |
---|
1135 | | - num_cs = max_t(unsigned int, ret, p->master->num_chipselect); |
---|
1136 | | - for (i = 0; i < num_cs; i++) { |
---|
1137 | | - struct gpio_desc *gpiod; |
---|
1138 | | - |
---|
1139 | | - gpiod = devm_gpiod_get_index(dev, "cs", i, GPIOD_ASIS); |
---|
1140 | | - if (!IS_ERR(gpiod)) { |
---|
1141 | | - cs_gpios++; |
---|
1142 | | - continue; |
---|
1143 | | - } |
---|
1144 | | - |
---|
1145 | | - if (PTR_ERR(gpiod) != -ENOENT) |
---|
1146 | | - return PTR_ERR(gpiod); |
---|
1147 | | - |
---|
1148 | | - if (i >= MAX_SS) { |
---|
1149 | | - dev_err(dev, "Invalid native chip select %d\n", i); |
---|
1150 | | - return -EINVAL; |
---|
1151 | | - } |
---|
1152 | | - used_ss_mask |= BIT(i); |
---|
1153 | | - } |
---|
1154 | | - p->unused_ss = ffz(used_ss_mask); |
---|
1155 | | - if (cs_gpios && p->unused_ss >= MAX_SS) { |
---|
1156 | | - dev_err(dev, "No unused native chip select available\n"); |
---|
1157 | | - return -EINVAL; |
---|
1158 | | - } |
---|
1159 | | - return 0; |
---|
1160 | | -} |
---|
1161 | | - |
---|
1162 | 1124 | static struct dma_chan *sh_msiof_request_dma_chan(struct device *dev, |
---|
1163 | 1125 | enum dma_transfer_direction dir, unsigned int id, dma_addr_t port_addr) |
---|
1164 | 1126 | { |
---|
.. | .. |
---|
1202 | 1164 | { |
---|
1203 | 1165 | struct platform_device *pdev = p->pdev; |
---|
1204 | 1166 | struct device *dev = &pdev->dev; |
---|
1205 | | - const struct sh_msiof_spi_info *info = dev_get_platdata(dev); |
---|
| 1167 | + const struct sh_msiof_spi_info *info = p->info; |
---|
1206 | 1168 | unsigned int dma_tx_id, dma_rx_id; |
---|
1207 | 1169 | const struct resource *res; |
---|
1208 | | - struct spi_master *master; |
---|
| 1170 | + struct spi_controller *ctlr; |
---|
1209 | 1171 | struct device *tx_dev, *rx_dev; |
---|
1210 | 1172 | |
---|
1211 | 1173 | if (dev->of_node) { |
---|
.. | .. |
---|
1225 | 1187 | if (!res) |
---|
1226 | 1188 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
---|
1227 | 1189 | |
---|
1228 | | - master = p->master; |
---|
1229 | | - master->dma_tx = sh_msiof_request_dma_chan(dev, DMA_MEM_TO_DEV, |
---|
1230 | | - dma_tx_id, |
---|
1231 | | - res->start + TFDR); |
---|
1232 | | - if (!master->dma_tx) |
---|
| 1190 | + ctlr = p->ctlr; |
---|
| 1191 | + ctlr->dma_tx = sh_msiof_request_dma_chan(dev, DMA_MEM_TO_DEV, |
---|
| 1192 | + dma_tx_id, res->start + SITFDR); |
---|
| 1193 | + if (!ctlr->dma_tx) |
---|
1233 | 1194 | return -ENODEV; |
---|
1234 | 1195 | |
---|
1235 | | - master->dma_rx = sh_msiof_request_dma_chan(dev, DMA_DEV_TO_MEM, |
---|
1236 | | - dma_rx_id, |
---|
1237 | | - res->start + RFDR); |
---|
1238 | | - if (!master->dma_rx) |
---|
| 1196 | + ctlr->dma_rx = sh_msiof_request_dma_chan(dev, DMA_DEV_TO_MEM, |
---|
| 1197 | + dma_rx_id, res->start + SIRFDR); |
---|
| 1198 | + if (!ctlr->dma_rx) |
---|
1239 | 1199 | goto free_tx_chan; |
---|
1240 | 1200 | |
---|
1241 | 1201 | p->tx_dma_page = (void *)__get_free_page(GFP_KERNEL | GFP_DMA); |
---|
.. | .. |
---|
1246 | 1206 | if (!p->rx_dma_page) |
---|
1247 | 1207 | goto free_tx_page; |
---|
1248 | 1208 | |
---|
1249 | | - tx_dev = master->dma_tx->device->dev; |
---|
| 1209 | + tx_dev = ctlr->dma_tx->device->dev; |
---|
1250 | 1210 | p->tx_dma_addr = dma_map_single(tx_dev, p->tx_dma_page, PAGE_SIZE, |
---|
1251 | 1211 | DMA_TO_DEVICE); |
---|
1252 | 1212 | if (dma_mapping_error(tx_dev, p->tx_dma_addr)) |
---|
1253 | 1213 | goto free_rx_page; |
---|
1254 | 1214 | |
---|
1255 | | - rx_dev = master->dma_rx->device->dev; |
---|
| 1215 | + rx_dev = ctlr->dma_rx->device->dev; |
---|
1256 | 1216 | p->rx_dma_addr = dma_map_single(rx_dev, p->rx_dma_page, PAGE_SIZE, |
---|
1257 | 1217 | DMA_FROM_DEVICE); |
---|
1258 | 1218 | if (dma_mapping_error(rx_dev, p->rx_dma_addr)) |
---|
.. | .. |
---|
1268 | 1228 | free_tx_page: |
---|
1269 | 1229 | free_page((unsigned long)p->tx_dma_page); |
---|
1270 | 1230 | free_rx_chan: |
---|
1271 | | - dma_release_channel(master->dma_rx); |
---|
| 1231 | + dma_release_channel(ctlr->dma_rx); |
---|
1272 | 1232 | free_tx_chan: |
---|
1273 | | - dma_release_channel(master->dma_tx); |
---|
1274 | | - master->dma_tx = NULL; |
---|
| 1233 | + dma_release_channel(ctlr->dma_tx); |
---|
| 1234 | + ctlr->dma_tx = NULL; |
---|
1275 | 1235 | return -ENODEV; |
---|
1276 | 1236 | } |
---|
1277 | 1237 | |
---|
1278 | 1238 | static void sh_msiof_release_dma(struct sh_msiof_spi_priv *p) |
---|
1279 | 1239 | { |
---|
1280 | | - struct spi_master *master = p->master; |
---|
| 1240 | + struct spi_controller *ctlr = p->ctlr; |
---|
1281 | 1241 | |
---|
1282 | | - if (!master->dma_tx) |
---|
| 1242 | + if (!ctlr->dma_tx) |
---|
1283 | 1243 | return; |
---|
1284 | 1244 | |
---|
1285 | | - dma_unmap_single(master->dma_rx->device->dev, p->rx_dma_addr, |
---|
1286 | | - PAGE_SIZE, DMA_FROM_DEVICE); |
---|
1287 | | - dma_unmap_single(master->dma_tx->device->dev, p->tx_dma_addr, |
---|
1288 | | - PAGE_SIZE, DMA_TO_DEVICE); |
---|
| 1245 | + dma_unmap_single(ctlr->dma_rx->device->dev, p->rx_dma_addr, PAGE_SIZE, |
---|
| 1246 | + DMA_FROM_DEVICE); |
---|
| 1247 | + dma_unmap_single(ctlr->dma_tx->device->dev, p->tx_dma_addr, PAGE_SIZE, |
---|
| 1248 | + DMA_TO_DEVICE); |
---|
1289 | 1249 | free_page((unsigned long)p->rx_dma_page); |
---|
1290 | 1250 | free_page((unsigned long)p->tx_dma_page); |
---|
1291 | | - dma_release_channel(master->dma_rx); |
---|
1292 | | - dma_release_channel(master->dma_tx); |
---|
| 1251 | + dma_release_channel(ctlr->dma_rx); |
---|
| 1252 | + dma_release_channel(ctlr->dma_tx); |
---|
1293 | 1253 | } |
---|
1294 | 1254 | |
---|
1295 | 1255 | static int sh_msiof_spi_probe(struct platform_device *pdev) |
---|
1296 | 1256 | { |
---|
1297 | | - struct resource *r; |
---|
1298 | | - struct spi_master *master; |
---|
| 1257 | + struct spi_controller *ctlr; |
---|
1299 | 1258 | const struct sh_msiof_chipdata *chipdata; |
---|
1300 | 1259 | struct sh_msiof_spi_info *info; |
---|
1301 | 1260 | struct sh_msiof_spi_priv *p; |
---|
.. | .. |
---|
1316 | 1275 | } |
---|
1317 | 1276 | |
---|
1318 | 1277 | if (info->mode == MSIOF_SPI_SLAVE) |
---|
1319 | | - master = spi_alloc_slave(&pdev->dev, |
---|
1320 | | - sizeof(struct sh_msiof_spi_priv)); |
---|
| 1278 | + ctlr = spi_alloc_slave(&pdev->dev, |
---|
| 1279 | + sizeof(struct sh_msiof_spi_priv)); |
---|
1321 | 1280 | else |
---|
1322 | | - master = spi_alloc_master(&pdev->dev, |
---|
1323 | | - sizeof(struct sh_msiof_spi_priv)); |
---|
1324 | | - if (master == NULL) |
---|
| 1281 | + ctlr = spi_alloc_master(&pdev->dev, |
---|
| 1282 | + sizeof(struct sh_msiof_spi_priv)); |
---|
| 1283 | + if (ctlr == NULL) |
---|
1325 | 1284 | return -ENOMEM; |
---|
1326 | 1285 | |
---|
1327 | | - p = spi_master_get_devdata(master); |
---|
| 1286 | + p = spi_controller_get_devdata(ctlr); |
---|
1328 | 1287 | |
---|
1329 | 1288 | platform_set_drvdata(pdev, p); |
---|
1330 | | - p->master = master; |
---|
| 1289 | + p->ctlr = ctlr; |
---|
1331 | 1290 | p->info = info; |
---|
1332 | 1291 | p->min_div_pow = chipdata->min_div_pow; |
---|
1333 | 1292 | |
---|
.. | .. |
---|
1343 | 1302 | |
---|
1344 | 1303 | i = platform_get_irq(pdev, 0); |
---|
1345 | 1304 | if (i < 0) { |
---|
1346 | | - dev_err(&pdev->dev, "cannot get IRQ\n"); |
---|
1347 | 1305 | ret = i; |
---|
1348 | 1306 | goto err1; |
---|
1349 | 1307 | } |
---|
1350 | 1308 | |
---|
1351 | | - r = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
---|
1352 | | - p->mapbase = devm_ioremap_resource(&pdev->dev, r); |
---|
| 1309 | + p->mapbase = devm_platform_ioremap_resource(pdev, 0); |
---|
1353 | 1310 | if (IS_ERR(p->mapbase)) { |
---|
1354 | 1311 | ret = PTR_ERR(p->mapbase); |
---|
1355 | 1312 | goto err1; |
---|
.. | .. |
---|
1373 | 1330 | if (p->info->rx_fifo_override) |
---|
1374 | 1331 | p->rx_fifo_size = p->info->rx_fifo_override; |
---|
1375 | 1332 | |
---|
1376 | | - /* Setup GPIO chip selects */ |
---|
1377 | | - master->num_chipselect = p->info->num_chipselect; |
---|
1378 | | - ret = sh_msiof_get_cs_gpios(p); |
---|
1379 | | - if (ret) |
---|
1380 | | - goto err1; |
---|
1381 | | - |
---|
1382 | | - /* init master code */ |
---|
1383 | | - master->mode_bits = SPI_CPOL | SPI_CPHA | SPI_CS_HIGH; |
---|
1384 | | - master->mode_bits |= SPI_LSB_FIRST | SPI_3WIRE; |
---|
1385 | | - master->flags = chipdata->master_flags; |
---|
1386 | | - master->bus_num = pdev->id; |
---|
1387 | | - master->dev.of_node = pdev->dev.of_node; |
---|
1388 | | - master->setup = sh_msiof_spi_setup; |
---|
1389 | | - master->prepare_message = sh_msiof_prepare_message; |
---|
1390 | | - master->slave_abort = sh_msiof_slave_abort; |
---|
1391 | | - master->bits_per_word_mask = SPI_BPW_RANGE_MASK(8, 32); |
---|
1392 | | - master->auto_runtime_pm = true; |
---|
1393 | | - master->transfer_one = sh_msiof_transfer_one; |
---|
| 1333 | + /* init controller code */ |
---|
| 1334 | + ctlr->mode_bits = SPI_CPOL | SPI_CPHA | SPI_CS_HIGH; |
---|
| 1335 | + ctlr->mode_bits |= SPI_LSB_FIRST | SPI_3WIRE; |
---|
| 1336 | + ctlr->flags = chipdata->ctlr_flags; |
---|
| 1337 | + ctlr->bus_num = pdev->id; |
---|
| 1338 | + ctlr->num_chipselect = p->info->num_chipselect; |
---|
| 1339 | + ctlr->dev.of_node = pdev->dev.of_node; |
---|
| 1340 | + ctlr->setup = sh_msiof_spi_setup; |
---|
| 1341 | + ctlr->prepare_message = sh_msiof_prepare_message; |
---|
| 1342 | + ctlr->slave_abort = sh_msiof_slave_abort; |
---|
| 1343 | + ctlr->bits_per_word_mask = chipdata->bits_per_word_mask; |
---|
| 1344 | + ctlr->auto_runtime_pm = true; |
---|
| 1345 | + ctlr->transfer_one = sh_msiof_transfer_one; |
---|
| 1346 | + ctlr->use_gpio_descriptors = true; |
---|
| 1347 | + ctlr->max_native_cs = MAX_SS; |
---|
1394 | 1348 | |
---|
1395 | 1349 | ret = sh_msiof_request_dma(p); |
---|
1396 | 1350 | if (ret < 0) |
---|
1397 | 1351 | dev_warn(&pdev->dev, "DMA not available, using PIO\n"); |
---|
1398 | 1352 | |
---|
1399 | | - ret = devm_spi_register_master(&pdev->dev, master); |
---|
| 1353 | + ret = devm_spi_register_controller(&pdev->dev, ctlr); |
---|
1400 | 1354 | if (ret < 0) { |
---|
1401 | | - dev_err(&pdev->dev, "spi_register_master error.\n"); |
---|
| 1355 | + dev_err(&pdev->dev, "devm_spi_register_controller error.\n"); |
---|
1402 | 1356 | goto err2; |
---|
1403 | 1357 | } |
---|
1404 | 1358 | |
---|
.. | .. |
---|
1408 | 1362 | sh_msiof_release_dma(p); |
---|
1409 | 1363 | pm_runtime_disable(&pdev->dev); |
---|
1410 | 1364 | err1: |
---|
1411 | | - spi_master_put(master); |
---|
| 1365 | + spi_controller_put(ctlr); |
---|
1412 | 1366 | return ret; |
---|
1413 | 1367 | } |
---|
1414 | 1368 | |
---|
.. | .. |
---|
1430 | 1384 | #ifdef CONFIG_PM_SLEEP |
---|
1431 | 1385 | static int sh_msiof_spi_suspend(struct device *dev) |
---|
1432 | 1386 | { |
---|
1433 | | - struct platform_device *pdev = to_platform_device(dev); |
---|
1434 | | - struct sh_msiof_spi_priv *p = platform_get_drvdata(pdev); |
---|
| 1387 | + struct sh_msiof_spi_priv *p = dev_get_drvdata(dev); |
---|
1435 | 1388 | |
---|
1436 | | - return spi_master_suspend(p->master); |
---|
| 1389 | + return spi_controller_suspend(p->ctlr); |
---|
1437 | 1390 | } |
---|
1438 | 1391 | |
---|
1439 | 1392 | static int sh_msiof_spi_resume(struct device *dev) |
---|
1440 | 1393 | { |
---|
1441 | | - struct platform_device *pdev = to_platform_device(dev); |
---|
1442 | | - struct sh_msiof_spi_priv *p = platform_get_drvdata(pdev); |
---|
| 1394 | + struct sh_msiof_spi_priv *p = dev_get_drvdata(dev); |
---|
1443 | 1395 | |
---|
1444 | | - return spi_master_resume(p->master); |
---|
| 1396 | + return spi_controller_resume(p->ctlr); |
---|
1445 | 1397 | } |
---|
1446 | 1398 | |
---|
1447 | 1399 | static SIMPLE_DEV_PM_OPS(sh_msiof_spi_pm_ops, sh_msiof_spi_suspend, |
---|
1448 | 1400 | sh_msiof_spi_resume); |
---|
1449 | | -#define DEV_PM_OPS &sh_msiof_spi_pm_ops |
---|
| 1401 | +#define DEV_PM_OPS (&sh_msiof_spi_pm_ops) |
---|
1450 | 1402 | #else |
---|
1451 | 1403 | #define DEV_PM_OPS NULL |
---|
1452 | 1404 | #endif /* CONFIG_PM_SLEEP */ |
---|
.. | .. |
---|
1463 | 1415 | }; |
---|
1464 | 1416 | module_platform_driver(sh_msiof_spi_drv); |
---|
1465 | 1417 | |
---|
1466 | | -MODULE_DESCRIPTION("SuperH MSIOF SPI Master Interface Driver"); |
---|
| 1418 | +MODULE_DESCRIPTION("SuperH MSIOF SPI Controller Interface Driver"); |
---|
1467 | 1419 | MODULE_AUTHOR("Magnus Damm"); |
---|
1468 | 1420 | MODULE_LICENSE("GPL v2"); |
---|
1469 | 1421 | MODULE_ALIAS("platform:spi_sh_msiof"); |
---|