diff options
author | Mark Brown <broonie@linaro.org> | 2013-09-01 08:49:00 -0400 |
---|---|---|
committer | Mark Brown <broonie@linaro.org> | 2013-09-01 08:49:00 -0400 |
commit | 45bb5065e11cd770fcf4afe9714ccea671333766 (patch) | |
tree | 83b32ad10bc70190bd95194e4c4be1682bab57b9 | |
parent | 455765f02eabaa0c6041ca92ba9c138117f1b4fd (diff) | |
parent | f79cc88e4e7a673cd1b068c46cbbed97cce5f6da (diff) |
Merge remote-tracking branch 'spi/topic/octeon' into spi-next
-rw-r--r-- | drivers/spi/spi-octeon.c | 49 |
1 files changed, 5 insertions, 44 deletions
diff --git a/drivers/spi/spi-octeon.c b/drivers/spi/spi-octeon.c index 24daf964a409..5f28ddbe4f7e 100644 --- a/drivers/spi/spi-octeon.c +++ b/drivers/spi/spi-octeon.c | |||
@@ -28,7 +28,6 @@ | |||
28 | #define OCTEON_SPI_MAX_CLOCK_HZ 16000000 | 28 | #define OCTEON_SPI_MAX_CLOCK_HZ 16000000 |
29 | 29 | ||
30 | struct octeon_spi { | 30 | struct octeon_spi { |
31 | struct spi_master *my_master; | ||
32 | u64 register_base; | 31 | u64 register_base; |
33 | u64 last_cfg; | 32 | u64 last_cfg; |
34 | u64 cs_enax; | 33 | u64 cs_enax; |
@@ -64,7 +63,6 @@ static int octeon_spi_do_transfer(struct octeon_spi *p, | |||
64 | unsigned int speed_hz; | 63 | unsigned int speed_hz; |
65 | int mode; | 64 | int mode; |
66 | bool cpha, cpol; | 65 | bool cpha, cpol; |
67 | int bits_per_word; | ||
68 | const u8 *tx_buf; | 66 | const u8 *tx_buf; |
69 | u8 *rx_buf; | 67 | u8 *rx_buf; |
70 | int len; | 68 | int len; |
@@ -76,12 +74,9 @@ static int octeon_spi_do_transfer(struct octeon_spi *p, | |||
76 | mode = msg_setup->mode; | 74 | mode = msg_setup->mode; |
77 | cpha = mode & SPI_CPHA; | 75 | cpha = mode & SPI_CPHA; |
78 | cpol = mode & SPI_CPOL; | 76 | cpol = mode & SPI_CPOL; |
79 | bits_per_word = msg_setup->bits_per_word; | ||
80 | 77 | ||
81 | if (xfer->speed_hz) | 78 | if (xfer->speed_hz) |
82 | speed_hz = xfer->speed_hz; | 79 | speed_hz = xfer->speed_hz; |
83 | if (xfer->bits_per_word) | ||
84 | bits_per_word = xfer->bits_per_word; | ||
85 | 80 | ||
86 | if (speed_hz > OCTEON_SPI_MAX_CLOCK_HZ) | 81 | if (speed_hz > OCTEON_SPI_MAX_CLOCK_HZ) |
87 | speed_hz = OCTEON_SPI_MAX_CLOCK_HZ; | 82 | speed_hz = OCTEON_SPI_MAX_CLOCK_HZ; |
@@ -166,19 +161,6 @@ static int octeon_spi_do_transfer(struct octeon_spi *p, | |||
166 | return xfer->len; | 161 | return xfer->len; |
167 | } | 162 | } |
168 | 163 | ||
169 | static int octeon_spi_validate_bpw(struct spi_device *spi, u32 speed) | ||
170 | { | ||
171 | switch (speed) { | ||
172 | case 8: | ||
173 | break; | ||
174 | default: | ||
175 | dev_err(&spi->dev, "Error: %d bits per word not supported\n", | ||
176 | speed); | ||
177 | return -EINVAL; | ||
178 | } | ||
179 | return 0; | ||
180 | } | ||
181 | |||
182 | static int octeon_spi_transfer_one_message(struct spi_master *master, | 164 | static int octeon_spi_transfer_one_message(struct spi_master *master, |
183 | struct spi_message *msg) | 165 | struct spi_message *msg) |
184 | { | 166 | { |
@@ -197,15 +179,6 @@ static int octeon_spi_transfer_one_message(struct spi_master *master, | |||
197 | } | 179 | } |
198 | 180 | ||
199 | list_for_each_entry(xfer, &msg->transfers, transfer_list) { | 181 | list_for_each_entry(xfer, &msg->transfers, transfer_list) { |
200 | if (xfer->bits_per_word) { | ||
201 | status = octeon_spi_validate_bpw(msg->spi, | ||
202 | xfer->bits_per_word); | ||
203 | if (status) | ||
204 | goto err; | ||
205 | } | ||
206 | } | ||
207 | |||
208 | list_for_each_entry(xfer, &msg->transfers, transfer_list) { | ||
209 | bool last_xfer = &xfer->transfer_list == msg->transfers.prev; | 182 | bool last_xfer = &xfer->transfer_list == msg->transfers.prev; |
210 | int r = octeon_spi_do_transfer(p, msg, xfer, last_xfer); | 183 | int r = octeon_spi_do_transfer(p, msg, xfer, last_xfer); |
211 | if (r < 0) { | 184 | if (r < 0) { |
@@ -236,14 +209,9 @@ static struct octeon_spi_setup *octeon_spi_new_setup(struct spi_device *spi) | |||
236 | 209 | ||
237 | static int octeon_spi_setup(struct spi_device *spi) | 210 | static int octeon_spi_setup(struct spi_device *spi) |
238 | { | 211 | { |
239 | int r; | ||
240 | struct octeon_spi_setup *new_setup; | 212 | struct octeon_spi_setup *new_setup; |
241 | struct octeon_spi_setup *old_setup = spi_get_ctldata(spi); | 213 | struct octeon_spi_setup *old_setup = spi_get_ctldata(spi); |
242 | 214 | ||
243 | r = octeon_spi_validate_bpw(spi, spi->bits_per_word); | ||
244 | if (r) | ||
245 | return r; | ||
246 | |||
247 | new_setup = octeon_spi_new_setup(spi); | 215 | new_setup = octeon_spi_new_setup(spi); |
248 | if (!new_setup) | 216 | if (!new_setup) |
249 | return -ENOMEM; | 217 | return -ENOMEM; |
@@ -261,14 +229,8 @@ static void octeon_spi_cleanup(struct spi_device *spi) | |||
261 | kfree(old_setup); | 229 | kfree(old_setup); |
262 | } | 230 | } |
263 | 231 | ||
264 | static int octeon_spi_nop_transfer_hardware(struct spi_master *master) | ||
265 | { | ||
266 | return 0; | ||
267 | } | ||
268 | |||
269 | static int octeon_spi_probe(struct platform_device *pdev) | 232 | static int octeon_spi_probe(struct platform_device *pdev) |
270 | { | 233 | { |
271 | |||
272 | struct resource *res_mem; | 234 | struct resource *res_mem; |
273 | struct spi_master *master; | 235 | struct spi_master *master; |
274 | struct octeon_spi *p; | 236 | struct octeon_spi *p; |
@@ -278,8 +240,7 @@ static int octeon_spi_probe(struct platform_device *pdev) | |||
278 | if (!master) | 240 | if (!master) |
279 | return -ENOMEM; | 241 | return -ENOMEM; |
280 | p = spi_master_get_devdata(master); | 242 | p = spi_master_get_devdata(master); |
281 | platform_set_drvdata(pdev, p); | 243 | platform_set_drvdata(pdev, master); |
282 | p->my_master = master; | ||
283 | 244 | ||
284 | res_mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 245 | res_mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
285 | 246 | ||
@@ -307,9 +268,8 @@ static int octeon_spi_probe(struct platform_device *pdev) | |||
307 | 268 | ||
308 | master->setup = octeon_spi_setup; | 269 | master->setup = octeon_spi_setup; |
309 | master->cleanup = octeon_spi_cleanup; | 270 | master->cleanup = octeon_spi_cleanup; |
310 | master->prepare_transfer_hardware = octeon_spi_nop_transfer_hardware; | ||
311 | master->transfer_one_message = octeon_spi_transfer_one_message; | 271 | master->transfer_one_message = octeon_spi_transfer_one_message; |
312 | master->unprepare_transfer_hardware = octeon_spi_nop_transfer_hardware; | 272 | master->bits_per_word_mask = SPI_BPW_MASK(8); |
313 | 273 | ||
314 | master->dev.of_node = pdev->dev.of_node; | 274 | master->dev.of_node = pdev->dev.of_node; |
315 | err = spi_register_master(master); | 275 | err = spi_register_master(master); |
@@ -328,10 +288,11 @@ fail: | |||
328 | 288 | ||
329 | static int octeon_spi_remove(struct platform_device *pdev) | 289 | static int octeon_spi_remove(struct platform_device *pdev) |
330 | { | 290 | { |
331 | struct octeon_spi *p = platform_get_drvdata(pdev); | 291 | struct spi_master *master = platform_get_drvdata(pdev); |
292 | struct octeon_spi *p = spi_master_get_devdata(master); | ||
332 | u64 register_base = p->register_base; | 293 | u64 register_base = p->register_base; |
333 | 294 | ||
334 | spi_unregister_master(p->my_master); | 295 | spi_unregister_master(master); |
335 | 296 | ||
336 | /* Clear the CSENA* and put everything in a known state. */ | 297 | /* Clear the CSENA* and put everything in a known state. */ |
337 | cvmx_write_csr(register_base + OCTEON_SPI_CFG, 0); | 298 | cvmx_write_csr(register_base + OCTEON_SPI_CFG, 0); |