diff options
| -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; |
