diff options
-rw-r--r-- | drivers/spi/spi-dw-mmio.c | 3 | ||||
-rw-r--r-- | drivers/spi/spi-dw.c | 4 | ||||
-rw-r--r-- | drivers/spi/spi-dw.h | 35 |
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 | ||
149 | static inline u16 dw_readw(struct dw_spi *dws, u32 offset) | ||
150 | { | ||
151 | return __raw_readw(dws->regs + offset); | ||
152 | } | ||
153 | |||
148 | static inline void dw_writel(struct dw_spi *dws, u32 offset, u32 val) | 154 | static 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 | ||
159 | static inline void dw_writew(struct dw_spi *dws, u32 offset, u16 val) | ||
160 | { | ||
161 | __raw_writew(val, dws->regs + offset); | ||
162 | } | ||
163 | |||
164 | static 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 | |||
175 | static 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 | |||
153 | static inline void spi_enable_chip(struct dw_spi *dws, int enable) | 188 | static 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)); |