diff options
author | Axel Lin <axel.lin@ingics.com> | 2014-02-24 10:07:36 -0500 |
---|---|---|
committer | Mark Brown <broonie@linaro.org> | 2014-02-25 18:54:54 -0500 |
commit | 00cce74d081e86ee0660cbe41699cbc523a55605 (patch) | |
tree | 4a8faf69010a3ea2b15c483b33f524d065dae801 | |
parent | 83f091440db9ba3f739522cee0c627ecfe1cc8ef (diff) |
spi: qup: Get rid of using struct spi_qup_device
Current code uses struct spi_qup_device to store spi->mode and spi->chip_select
settings. We can get these settings in spi_qup_transfer_one and spi_qup_set_cs
without using struct spi_qup_device. Refactor the code a bit to remove
spi_qup_setup(), spi_qup_cleanup(), and struct spi_qup_device.
Signed-off-by: Axel Lin <axel.lin@ingics.com>
Tested-by: Ivan T. Ivanov <iivanov@mm-sol.com>
Signed-off-by: Mark Brown <broonie@linaro.org>
-rw-r--r-- | drivers/spi/spi-qup.c | 61 |
1 files changed, 9 insertions, 52 deletions
diff --git a/drivers/spi/spi-qup.c b/drivers/spi/spi-qup.c index 203f0d4f049f..b032e8885e24 100644 --- a/drivers/spi/spi-qup.c +++ b/drivers/spi/spi-qup.c | |||
@@ -123,11 +123,6 @@ | |||
123 | #define SPI_DELAY_THRESHOLD 1 | 123 | #define SPI_DELAY_THRESHOLD 1 |
124 | #define SPI_DELAY_RETRY 10 | 124 | #define SPI_DELAY_RETRY 10 |
125 | 125 | ||
126 | struct spi_qup_device { | ||
127 | int select; | ||
128 | u16 mode; | ||
129 | }; | ||
130 | |||
131 | struct spi_qup { | 126 | struct spi_qup { |
132 | void __iomem *base; | 127 | void __iomem *base; |
133 | struct device *dev; | 128 | struct device *dev; |
@@ -338,14 +333,13 @@ static irqreturn_t spi_qup_qup_irq(int irq, void *dev_id) | |||
338 | 333 | ||
339 | 334 | ||
340 | /* set clock freq ... bits per word */ | 335 | /* set clock freq ... bits per word */ |
341 | static int spi_qup_io_config(struct spi_qup *controller, | 336 | static int spi_qup_io_config(struct spi_device *spi, struct spi_transfer *xfer) |
342 | struct spi_qup_device *chip, | ||
343 | struct spi_transfer *xfer) | ||
344 | { | 337 | { |
338 | struct spi_qup *controller = spi_master_get_devdata(spi->master); | ||
345 | u32 config, iomode, mode; | 339 | u32 config, iomode, mode; |
346 | int ret, n_words, w_size; | 340 | int ret, n_words, w_size; |
347 | 341 | ||
348 | if (chip->mode & SPI_LOOP && xfer->len > controller->in_fifo_sz) { | 342 | if (spi->mode & SPI_LOOP && xfer->len > controller->in_fifo_sz) { |
349 | dev_err(controller->dev, "too big size for loopback %d > %d\n", | 343 | dev_err(controller->dev, "too big size for loopback %d > %d\n", |
350 | xfer->len, controller->in_fifo_sz); | 344 | xfer->len, controller->in_fifo_sz); |
351 | return -EIO; | 345 | return -EIO; |
@@ -399,12 +393,12 @@ static int spi_qup_io_config(struct spi_qup *controller, | |||
399 | 393 | ||
400 | config = readl_relaxed(controller->base + SPI_CONFIG); | 394 | config = readl_relaxed(controller->base + SPI_CONFIG); |
401 | 395 | ||
402 | if (chip->mode & SPI_LOOP) | 396 | if (spi->mode & SPI_LOOP) |
403 | config |= SPI_CONFIG_LOOPBACK; | 397 | config |= SPI_CONFIG_LOOPBACK; |
404 | else | 398 | else |
405 | config &= ~SPI_CONFIG_LOOPBACK; | 399 | config &= ~SPI_CONFIG_LOOPBACK; |
406 | 400 | ||
407 | if (chip->mode & SPI_CPHA) | 401 | if (spi->mode & SPI_CPHA) |
408 | config &= ~SPI_CONFIG_INPUT_FIRST; | 402 | config &= ~SPI_CONFIG_INPUT_FIRST; |
409 | else | 403 | else |
410 | config |= SPI_CONFIG_INPUT_FIRST; | 404 | config |= SPI_CONFIG_INPUT_FIRST; |
@@ -413,7 +407,7 @@ static int spi_qup_io_config(struct spi_qup *controller, | |||
413 | * HS_MODE improves signal stability for spi-clk high rates, | 407 | * HS_MODE improves signal stability for spi-clk high rates, |
414 | * but is invalid in loop back mode. | 408 | * but is invalid in loop back mode. |
415 | */ | 409 | */ |
416 | if ((xfer->speed_hz >= SPI_HS_MIN_RATE) && !(chip->mode & SPI_LOOP)) | 410 | if ((xfer->speed_hz >= SPI_HS_MIN_RATE) && !(spi->mode & SPI_LOOP)) |
417 | config |= SPI_CONFIG_HS_MODE; | 411 | config |= SPI_CONFIG_HS_MODE; |
418 | else | 412 | else |
419 | config &= ~SPI_CONFIG_HS_MODE; | 413 | config &= ~SPI_CONFIG_HS_MODE; |
@@ -433,7 +427,6 @@ static int spi_qup_io_config(struct spi_qup *controller, | |||
433 | static void spi_qup_set_cs(struct spi_device *spi, bool enable) | 427 | static void spi_qup_set_cs(struct spi_device *spi, bool enable) |
434 | { | 428 | { |
435 | struct spi_qup *controller = spi_master_get_devdata(spi->master); | 429 | struct spi_qup *controller = spi_master_get_devdata(spi->master); |
436 | struct spi_qup_device *chip = spi_get_ctldata(spi); | ||
437 | 430 | ||
438 | u32 iocontol, mask; | 431 | u32 iocontol, mask; |
439 | 432 | ||
@@ -444,9 +437,9 @@ static void spi_qup_set_cs(struct spi_device *spi, bool enable) | |||
444 | iocontol |= SPI_IO_C_FORCE_CS; | 437 | iocontol |= SPI_IO_C_FORCE_CS; |
445 | 438 | ||
446 | iocontol &= ~SPI_IO_C_CS_SELECT_MASK; | 439 | iocontol &= ~SPI_IO_C_CS_SELECT_MASK; |
447 | iocontol |= SPI_IO_C_CS_SELECT(chip->select); | 440 | iocontol |= SPI_IO_C_CS_SELECT(spi->chip_select); |
448 | 441 | ||
449 | mask = SPI_IO_C_CS_N_POLARITY_0 << chip->select; | 442 | mask = SPI_IO_C_CS_N_POLARITY_0 << spi->chip_select; |
450 | 443 | ||
451 | if (enable) | 444 | if (enable) |
452 | iocontol |= mask; | 445 | iocontol |= mask; |
@@ -461,11 +454,10 @@ static int spi_qup_transfer_one(struct spi_master *master, | |||
461 | struct spi_transfer *xfer) | 454 | struct spi_transfer *xfer) |
462 | { | 455 | { |
463 | struct spi_qup *controller = spi_master_get_devdata(master); | 456 | struct spi_qup *controller = spi_master_get_devdata(master); |
464 | struct spi_qup_device *chip = spi_get_ctldata(spi); | ||
465 | unsigned long timeout, flags; | 457 | unsigned long timeout, flags; |
466 | int ret = -EIO; | 458 | int ret = -EIO; |
467 | 459 | ||
468 | ret = spi_qup_io_config(controller, chip, xfer); | 460 | ret = spi_qup_io_config(spi, xfer); |
469 | if (ret) | 461 | if (ret) |
470 | return ret; | 462 | return ret; |
471 | 463 | ||
@@ -511,38 +503,6 @@ exit: | |||
511 | return ret; | 503 | return ret; |
512 | } | 504 | } |
513 | 505 | ||
514 | static int spi_qup_setup(struct spi_device *spi) | ||
515 | { | ||
516 | struct spi_qup *controller = spi_master_get_devdata(spi->master); | ||
517 | struct spi_qup_device *chip = spi_get_ctldata(spi); | ||
518 | |||
519 | if (!chip) { | ||
520 | /* First setup */ | ||
521 | chip = kzalloc(sizeof(*chip), GFP_KERNEL); | ||
522 | if (!chip) { | ||
523 | dev_err(controller->dev, "no memory for chip data\n"); | ||
524 | return -ENOMEM; | ||
525 | } | ||
526 | |||
527 | chip->mode = spi->mode; | ||
528 | chip->select = spi->chip_select; | ||
529 | spi_set_ctldata(spi, chip); | ||
530 | } | ||
531 | |||
532 | return 0; | ||
533 | } | ||
534 | |||
535 | static void spi_qup_cleanup(struct spi_device *spi) | ||
536 | { | ||
537 | struct spi_qup_device *chip = spi_get_ctldata(spi); | ||
538 | |||
539 | if (!chip) | ||
540 | return; | ||
541 | |||
542 | spi_set_ctldata(spi, NULL); | ||
543 | kfree(chip); | ||
544 | } | ||
545 | |||
546 | static int spi_qup_probe(struct platform_device *pdev) | 506 | static int spi_qup_probe(struct platform_device *pdev) |
547 | { | 507 | { |
548 | struct spi_master *master; | 508 | struct spi_master *master; |
@@ -561,7 +521,6 @@ static int spi_qup_probe(struct platform_device *pdev) | |||
561 | return PTR_ERR(base); | 521 | return PTR_ERR(base); |
562 | 522 | ||
563 | irq = platform_get_irq(pdev, 0); | 523 | irq = platform_get_irq(pdev, 0); |
564 | |||
565 | if (irq < 0) | 524 | if (irq < 0) |
566 | return irq; | 525 | return irq; |
567 | 526 | ||
@@ -617,8 +576,6 @@ static int spi_qup_probe(struct platform_device *pdev) | |||
617 | master->num_chipselect = SPI_NUM_CHIPSELECTS; | 576 | master->num_chipselect = SPI_NUM_CHIPSELECTS; |
618 | master->bits_per_word_mask = SPI_BPW_RANGE_MASK(4, 32); | 577 | master->bits_per_word_mask = SPI_BPW_RANGE_MASK(4, 32); |
619 | master->max_speed_hz = max_freq; | 578 | master->max_speed_hz = max_freq; |
620 | master->setup = spi_qup_setup; | ||
621 | master->cleanup = spi_qup_cleanup; | ||
622 | master->set_cs = spi_qup_set_cs; | 579 | master->set_cs = spi_qup_set_cs; |
623 | master->transfer_one = spi_qup_transfer_one; | 580 | master->transfer_one = spi_qup_transfer_one; |
624 | master->dev.of_node = pdev->dev.of_node; | 581 | master->dev.of_node = pdev->dev.of_node; |