aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/spi/spi-orion.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/spi/spi-orion.c')
-rw-r--r--drivers/spi/spi-orion.c79
1 files changed, 11 insertions, 68 deletions
diff --git a/drivers/spi/spi-orion.c b/drivers/spi/spi-orion.c
index a362425400ea..d018a4aac3a1 100644
--- a/drivers/spi/spi-orion.c
+++ b/drivers/spi/spi-orion.c
@@ -42,8 +42,6 @@
42struct orion_spi { 42struct orion_spi {
43 struct spi_master *master; 43 struct spi_master *master;
44 void __iomem *base; 44 void __iomem *base;
45 unsigned int max_speed;
46 unsigned int min_speed;
47 struct clk *clk; 45 struct clk *clk;
48}; 46};
49 47
@@ -74,23 +72,6 @@ orion_spi_clrbits(struct orion_spi *orion_spi, u32 reg, u32 mask)
74 writel(val, reg_addr); 72 writel(val, reg_addr);
75} 73}
76 74
77static int orion_spi_set_transfer_size(struct orion_spi *orion_spi, int size)
78{
79 if (size == 16) {
80 orion_spi_setbits(orion_spi, ORION_SPI_IF_CONFIG_REG,
81 ORION_SPI_IF_8_16_BIT_MODE);
82 } else if (size == 8) {
83 orion_spi_clrbits(orion_spi, ORION_SPI_IF_CONFIG_REG,
84 ORION_SPI_IF_8_16_BIT_MODE);
85 } else {
86 pr_debug("Bad bits per word value %d (only 8 or 16 are allowed).\n",
87 size);
88 return -EINVAL;
89 }
90
91 return 0;
92}
93
94static int orion_spi_baudrate_set(struct spi_device *spi, unsigned int speed) 75static int orion_spi_baudrate_set(struct spi_device *spi, unsigned int speed)
95{ 76{
96 u32 tclk_hz; 77 u32 tclk_hz;
@@ -169,7 +150,14 @@ orion_spi_setup_transfer(struct spi_device *spi, struct spi_transfer *t)
169 if (rc) 150 if (rc)
170 return rc; 151 return rc;
171 152
172 return orion_spi_set_transfer_size(orion_spi, bits_per_word); 153 if (bits_per_word == 16)
154 orion_spi_setbits(orion_spi, ORION_SPI_IF_CONFIG_REG,
155 ORION_SPI_IF_8_16_BIT_MODE);
156 else
157 orion_spi_clrbits(orion_spi, ORION_SPI_IF_CONFIG_REG,
158 ORION_SPI_IF_8_16_BIT_MODE);
159
160 return 0;
173} 161}
174 162
175static void orion_spi_set_cs(struct orion_spi *orion_spi, int enable) 163static void orion_spi_set_cs(struct orion_spi *orion_spi, int enable)
@@ -259,11 +247,9 @@ orion_spi_write_read_16bit(struct spi_device *spi,
259static unsigned int 247static unsigned int
260orion_spi_write_read(struct spi_device *spi, struct spi_transfer *xfer) 248orion_spi_write_read(struct spi_device *spi, struct spi_transfer *xfer)
261{ 249{
262 struct orion_spi *orion_spi;
263 unsigned int count; 250 unsigned int count;
264 int word_len; 251 int word_len;
265 252
266 orion_spi = spi_master_get_devdata(spi->master);
267 word_len = spi->bits_per_word; 253 word_len = spi->bits_per_word;
268 count = xfer->len; 254 count = xfer->len;
269 255
@@ -309,27 +295,6 @@ static int orion_spi_transfer_one_message(struct spi_master *master,
309 goto msg_done; 295 goto msg_done;
310 296
311 list_for_each_entry(t, &m->transfers, transfer_list) { 297 list_for_each_entry(t, &m->transfers, transfer_list) {
312 /* make sure buffer length is even when working in 16
313 * bit mode*/
314 if ((t->bits_per_word == 16) && (t->len & 1)) {
315 dev_err(&spi->dev,
316 "message rejected : "
317 "odd data length %d while in 16 bit mode\n",
318 t->len);
319 status = -EIO;
320 goto msg_done;
321 }
322
323 if (t->speed_hz && t->speed_hz < orion_spi->min_speed) {
324 dev_err(&spi->dev,
325 "message rejected : "
326 "device min speed (%d Hz) exceeds "
327 "required transfer speed (%d Hz)\n",
328 orion_spi->min_speed, t->speed_hz);
329 status = -EIO;
330 goto msg_done;
331 }
332
333 if (par_override || t->speed_hz || t->bits_per_word) { 298 if (par_override || t->speed_hz || t->bits_per_word) {
334 par_override = 1; 299 par_override = 1;
335 status = orion_spi_setup_transfer(spi, t); 300 status = orion_spi_setup_transfer(spi, t);
@@ -374,28 +339,6 @@ static int orion_spi_reset(struct orion_spi *orion_spi)
374 return 0; 339 return 0;
375} 340}
376 341
377static int orion_spi_setup(struct spi_device *spi)
378{
379 struct orion_spi *orion_spi;
380
381 orion_spi = spi_master_get_devdata(spi->master);
382
383 if ((spi->max_speed_hz == 0)
384 || (spi->max_speed_hz > orion_spi->max_speed))
385 spi->max_speed_hz = orion_spi->max_speed;
386
387 if (spi->max_speed_hz < orion_spi->min_speed) {
388 dev_err(&spi->dev, "setup: requested speed too low %d Hz\n",
389 spi->max_speed_hz);
390 return -EINVAL;
391 }
392
393 /*
394 * baudrate & width will be set orion_spi_setup_transfer
395 */
396 return 0;
397}
398
399static int orion_spi_probe(struct platform_device *pdev) 342static int orion_spi_probe(struct platform_device *pdev)
400{ 343{
401 struct spi_master *master; 344 struct spi_master *master;
@@ -424,9 +367,9 @@ static int orion_spi_probe(struct platform_device *pdev)
424 /* we support only mode 0, and no options */ 367 /* we support only mode 0, and no options */
425 master->mode_bits = SPI_CPHA | SPI_CPOL; 368 master->mode_bits = SPI_CPHA | SPI_CPOL;
426 369
427 master->setup = orion_spi_setup;
428 master->transfer_one_message = orion_spi_transfer_one_message; 370 master->transfer_one_message = orion_spi_transfer_one_message;
429 master->num_chipselect = ORION_NUM_CHIPSELECTS; 371 master->num_chipselect = ORION_NUM_CHIPSELECTS;
372 master->bits_per_word_mask = SPI_BPW_MASK(8) | SPI_BPW_MASK(16);
430 373
431 platform_set_drvdata(pdev, master); 374 platform_set_drvdata(pdev, master);
432 375
@@ -442,8 +385,8 @@ static int orion_spi_probe(struct platform_device *pdev)
442 clk_prepare(spi->clk); 385 clk_prepare(spi->clk);
443 clk_enable(spi->clk); 386 clk_enable(spi->clk);
444 tclk_hz = clk_get_rate(spi->clk); 387 tclk_hz = clk_get_rate(spi->clk);
445 spi->max_speed = DIV_ROUND_UP(tclk_hz, 4); 388 master->max_speed_hz = DIV_ROUND_UP(tclk_hz, 4);
446 spi->min_speed = DIV_ROUND_UP(tclk_hz, 30); 389 master->min_speed_hz = DIV_ROUND_UP(tclk_hz, 30);
447 390
448 r = platform_get_resource(pdev, IORESOURCE_MEM, 0); 391 r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
449 spi->base = devm_ioremap_resource(&pdev->dev, r); 392 spi->base = devm_ioremap_resource(&pdev->dev, r);