aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Brown <broonie@linaro.org>2013-09-01 08:49:00 -0400
committerMark Brown <broonie@linaro.org>2013-09-01 08:49:00 -0400
commit45bb5065e11cd770fcf4afe9714ccea671333766 (patch)
tree83b32ad10bc70190bd95194e4c4be1682bab57b9
parent455765f02eabaa0c6041ca92ba9c138117f1b4fd (diff)
parentf79cc88e4e7a673cd1b068c46cbbed97cce5f6da (diff)
Merge remote-tracking branch 'spi/topic/octeon' into spi-next
-rw-r--r--drivers/spi/spi-octeon.c49
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
30struct octeon_spi { 30struct 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
169static 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
182static int octeon_spi_transfer_one_message(struct spi_master *master, 164static 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
237static int octeon_spi_setup(struct spi_device *spi) 210static 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
264static int octeon_spi_nop_transfer_hardware(struct spi_master *master)
265{
266 return 0;
267}
268
269static int octeon_spi_probe(struct platform_device *pdev) 232static 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
329static int octeon_spi_remove(struct platform_device *pdev) 289static 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);