summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/spi/spi-dw-mmio.c3
-rw-r--r--drivers/spi/spi-dw.c4
-rw-r--r--drivers/spi/spi-dw.h35
3 files changed, 40 insertions, 2 deletions
diff --git a/drivers/spi/spi-dw-mmio.c b/drivers/spi/spi-dw-mmio.c
index eb03e1215195..7edede6e024b 100644
--- a/drivers/spi/spi-dw-mmio.c
+++ b/drivers/spi/spi-dw-mmio.c
@@ -74,6 +74,9 @@ static int dw_spi_mmio_probe(struct platform_device *pdev)
74 74
75 dws->max_freq = clk_get_rate(dwsmmio->clk); 75 dws->max_freq = clk_get_rate(dwsmmio->clk);
76 76
77 of_property_read_u32(pdev->dev.of_node, "reg-io-width",
78 &dws->reg_io_width);
79
77 num_cs = 4; 80 num_cs = 4;
78 81
79 if (pdev->dev.of_node) 82 if (pdev->dev.of_node)
diff --git a/drivers/spi/spi-dw.c b/drivers/spi/spi-dw.c
index 8d67d03c71eb..4fbfcdc5cb24 100644
--- a/drivers/spi/spi-dw.c
+++ b/drivers/spi/spi-dw.c
@@ -194,7 +194,7 @@ static void dw_writer(struct dw_spi *dws)
194 else 194 else
195 txw = *(u16 *)(dws->tx); 195 txw = *(u16 *)(dws->tx);
196 } 196 }
197 dw_writel(dws, DW_SPI_DR, txw); 197 dw_write_io_reg(dws, DW_SPI_DR, txw);
198 dws->tx += dws->n_bytes; 198 dws->tx += dws->n_bytes;
199 } 199 }
200} 200}
@@ -205,7 +205,7 @@ static void dw_reader(struct dw_spi *dws)
205 u16 rxw; 205 u16 rxw;
206 206
207 while (max--) { 207 while (max--) {
208 rxw = dw_readl(dws, DW_SPI_DR); 208 rxw = dw_read_io_reg(dws, DW_SPI_DR);
209 /* Care rx only if the transfer's original "rx" is not null */ 209 /* Care rx only if the transfer's original "rx" is not null */
210 if (dws->rx_end - dws->len) { 210 if (dws->rx_end - dws->len) {
211 if (dws->n_bytes == 1) 211 if (dws->n_bytes == 1)
diff --git a/drivers/spi/spi-dw.h b/drivers/spi/spi-dw.h
index 6c91391c1a4f..b75ed327d5a2 100644
--- a/drivers/spi/spi-dw.h
+++ b/drivers/spi/spi-dw.h
@@ -109,6 +109,7 @@ struct dw_spi {
109 u32 fifo_len; /* depth of the FIFO buffer */ 109 u32 fifo_len; /* depth of the FIFO buffer */
110 u32 max_freq; /* max bus freq supported */ 110 u32 max_freq; /* max bus freq supported */
111 111
112 u32 reg_io_width; /* DR I/O width in bytes */
112 u16 bus_num; 113 u16 bus_num;
113 u16 num_cs; /* supported slave numbers */ 114 u16 num_cs; /* supported slave numbers */
114 115
@@ -145,11 +146,45 @@ static inline u32 dw_readl(struct dw_spi *dws, u32 offset)
145 return __raw_readl(dws->regs + offset); 146 return __raw_readl(dws->regs + offset);
146} 147}
147 148
149static inline u16 dw_readw(struct dw_spi *dws, u32 offset)
150{
151 return __raw_readw(dws->regs + offset);
152}
153
148static inline void dw_writel(struct dw_spi *dws, u32 offset, u32 val) 154static inline void dw_writel(struct dw_spi *dws, u32 offset, u32 val)
149{ 155{
150 __raw_writel(val, dws->regs + offset); 156 __raw_writel(val, dws->regs + offset);
151} 157}
152 158
159static inline void dw_writew(struct dw_spi *dws, u32 offset, u16 val)
160{
161 __raw_writew(val, dws->regs + offset);
162}
163
164static inline u32 dw_read_io_reg(struct dw_spi *dws, u32 offset)
165{
166 switch (dws->reg_io_width) {
167 case 2:
168 return dw_readw(dws, offset);
169 case 4:
170 default:
171 return dw_readl(dws, offset);
172 }
173}
174
175static inline void dw_write_io_reg(struct dw_spi *dws, u32 offset, u32 val)
176{
177 switch (dws->reg_io_width) {
178 case 2:
179 dw_writew(dws, offset, val);
180 break;
181 case 4:
182 default:
183 dw_writel(dws, offset, val);
184 break;
185 }
186}
187
153static inline void spi_enable_chip(struct dw_spi *dws, int enable) 188static inline void spi_enable_chip(struct dw_spi *dws, int enable)
154{ 189{
155 dw_writel(dws, DW_SPI_SSIENR, (enable ? 1 : 0)); 190 dw_writel(dws, DW_SPI_SSIENR, (enable ? 1 : 0));