diff options
Diffstat (limited to 'drivers/spi/spi-orion.c')
-rw-r--r-- | drivers/spi/spi-orion.c | 79 |
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 @@ | |||
42 | struct orion_spi { | 42 | struct 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 | ||
77 | static 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 | |||
94 | static int orion_spi_baudrate_set(struct spi_device *spi, unsigned int speed) | 75 | static 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 | ||
175 | static void orion_spi_set_cs(struct orion_spi *orion_spi, int enable) | 163 | static 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, | |||
259 | static unsigned int | 247 | static unsigned int |
260 | orion_spi_write_read(struct spi_device *spi, struct spi_transfer *xfer) | 248 | orion_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 | ||
377 | static 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 | |||
399 | static int orion_spi_probe(struct platform_device *pdev) | 342 | static 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); |