* [gpio:gpio-descriptors-spi 5/5] drivers//spi/spi-pl022.c:442:22: error: 'struct pl022' has no member named 'cur_cs'; did you mean 'cur_msg'?
@ 2019-08-06 6:28 kbuild test robot
0 siblings, 0 replies; only message in thread
From: kbuild test robot @ 2019-08-06 6:28 UTC (permalink / raw)
To: Linus Walleij; +Cc: kbuild-all, linux-gpio
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain; charset=unknown-8bit, Size: 236134 bytes --]
tree: https://kernel.googlesource.com/pub/scm/linux/kernel/git/linusw/linux-gpio.git gpio-descriptors-spi
head: 6e5614b6476001adb8ce6e2859bc2ca0a4339398
commit: 6e5614b6476001adb8ce6e2859bc2ca0a4339398 [5/5] slask
config: arm-allmodconfig (attached as .config)
compiler: arm-linux-gnueabi-gcc (GCC) 7.4.0
reproduce:
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
git checkout 6e5614b6476001adb8ce6e2859bc2ca0a4339398
# save the attached .config to linux build tree
GCC_VERSION=7.4.0 make.cross ARCH=arm
If you fix the issue, kindly add following tag
Reported-by: kbuild test robot <lkp@intel.com>
All errors (new ones prefixed by >>):
In file included from include/linux/bitops.h:5:0,
from include/linux/kernel.h:12,
from include/linux/list.h:9,
from include/linux/module.h:9,
from drivers//spi/spi-pl022.c:17:
drivers//spi/spi-pl022.c: In function 'pl022_set_cs':
>> drivers//spi/spi-pl022.c:442:22: error: 'struct pl022' has no member named 'cur_cs'; did you mean 'cur_msg'?
tmp &= ~BIT(pl022->cur_cs);
^
include/linux/bits.h:8:30: note: in definition of macro 'BIT'
#define BIT(nr) (UL(1) << (nr))
^~
drivers//spi/spi-pl022.c:444:21: error: 'struct pl022' has no member named 'cur_cs'; did you mean 'cur_msg'?
tmp |= BIT(pl022->cur_cs);
^
include/linux/bits.h:8:30: note: in definition of macro 'BIT'
#define BIT(nr) (UL(1) << (nr))
^~
drivers//spi/spi-pl022.c: In function 'giveback':
>> drivers//spi/spi-pl022.c:493:4: error: implicit declaration of function 'pl022_cs_control'; did you mean 'pl022_set_cs'? [-Werror=implicit-function-declaration]
pl022_cs_control(pl022, SSP_CHIP_DESELECT);
^~~~~~~~~~~~~~~~
pl022_set_cs
drivers//spi/spi-pl022.c: In function 'pl022_transfer_one_message':
drivers//spi/spi-pl022.c:1571:9: error: 'struct pl022' has no member named 'cur_cs'; did you mean 'cur_msg'?
pl022->cur_cs = pl022->chipselects[msg->spi->chip_select];
^~~~~~
cur_msg
>> drivers//spi/spi-pl022.c:1571:23: error: 'struct pl022' has no member named 'chipselects'
pl022->cur_cs = pl022->chipselects[msg->spi->chip_select];
^~
drivers//spi/spi-pl022.c: In function 'pl022_setup':
>> drivers//spi/spi-pl022.c:1852:4: error: implicit declaration of function 'of_property_read_u32' [-Werror=implicit-function-declaration]
of_property_read_u32(np, "pl022,interface",
^~~~~~~~~~~~~~~~~~~~
>> drivers//spi/spi-pl022.c:1914:7: error: implicit declaration of function 'gpio_is_valid'; did you mean 'uuid_is_valid'? [-Werror=implicit-function-declaration]
if (!gpio_is_valid(pl022->chipselects[spi->chip_select]))
^~~~~~~~~~~~~
uuid_is_valid
drivers//spi/spi-pl022.c:1914:26: error: 'struct pl022' has no member named 'chipselects'
if (!gpio_is_valid(pl022->chipselects[spi->chip_select]))
^~
drivers//spi/spi-pl022.c: In function 'pl022_platform_data_dt_get':
>> drivers//spi/spi-pl022.c:2081:11: error: implicit declaration of function 'of_property_read_bool' [-Werror=implicit-function-declaration]
pd->rt = of_property_read_bool(np, "pl022,rt");
^~~~~~~~~~~~~~~~~~~~~
drivers//spi/spi-pl022.c: In function 'pl022_probe':
drivers//spi/spi-pl022.c:2125:7: error: 'struct pl022' has no member named 'chipselects'
pl022->chipselects = devm_kcalloc(dev, num_cs, sizeof(int),
^~
drivers//spi/spi-pl022.c:2127:12: error: 'struct pl022' has no member named 'chipselects'
if (!pl022->chipselects) {
^~
drivers//spi/spi-pl022.c:2137:8: warning: statement with no effect [-Wunused-value]
master->use_gpio_descriptors;
~~~~~~^~~~~~~~~~~~~~~~~~~~~~
drivers//spi/spi-pl022.c:2150:9: error: 'struct pl022' has no member named 'chipselects'
pl022->chipselects[i] = i;
^~
>> drivers//spi/spi-pl022.c:2153:18: error: implicit declaration of function 'of_get_named_gpio'; did you mean 'fwnode_get_named_gpiod'? [-Werror=implicit-function-declaration]
int cs_gpio = of_get_named_gpio(np, "cs-gpios", i);
^~~~~~~~~~~~~~~~~
fwnode_get_named_gpiod
drivers//spi/spi-pl022.c:2160:9: error: 'struct pl022' has no member named 'chipselects'
pl022->chipselects[i] = cs_gpio;
^~
>> drivers//spi/spi-pl022.c:2163:9: error: implicit declaration of function 'devm_gpio_request'; did you mean 'devm_gpiod_put'? [-Werror=implicit-function-declaration]
if (devm_gpio_request(dev, cs_gpio, "ssp-pl022"))
^~~~~~~~~~~~~~~~~
devm_gpiod_put
>> drivers//spi/spi-pl022.c:2167:14: error: implicit declaration of function 'gpio_direction_output'; did you mean 'gpiod_direction_output'? [-Werror=implicit-function-declaration]
else if (gpio_direction_output(cs_gpio, 1))
^~~~~~~~~~~~~~~~~~~~~
gpiod_direction_output
cc1: some warnings being treated as errors
vim +442 drivers//spi/spi-pl022.c
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 421
6e5614b6476001a drivers/spi/spi-pl022.c Linus Walleij 2019-06-25 422 static void pl022_set_cs(struct spi_device *spi, bool enable)
db4fa45ed3182d8 drivers/spi/spi-pl022.c Anders Berg 2014-09-17 423 {
6e5614b6476001a drivers/spi/spi-pl022.c Linus Walleij 2019-06-25 424 struct pl022 *pl022 = spi_controller_get_devdata(spi->controller);
db4fa45ed3182d8 drivers/spi/spi-pl022.c Anders Berg 2014-09-17 425 u32 tmp;
db4fa45ed3182d8 drivers/spi/spi-pl022.c Anders Berg 2014-09-17 426
6e5614b6476001a drivers/spi/spi-pl022.c Linus Walleij 2019-06-25 427 /*
6e5614b6476001a drivers/spi/spi-pl022.c Linus Walleij 2019-06-25 428 * This callback will ONLY be called of no GPIO descriptors were found
6e5614b6476001a drivers/spi/spi-pl022.c Linus Walleij 2019-06-25 429 * for the device, so we know we are dealing exclusively with variants
6e5614b6476001a drivers/spi/spi-pl022.c Linus Walleij 2019-06-25 430 * that have internal CS control here, but just to be sure: extra check
6e5614b6476001a drivers/spi/spi-pl022.c Linus Walleij 2019-06-25 431 * for now.
6e5614b6476001a drivers/spi/spi-pl022.c Linus Walleij 2019-06-25 432 */
6e5614b6476001a drivers/spi/spi-pl022.c Linus Walleij 2019-06-25 433 if (!pl022->vendor->internal_cs_ctrl) {
6e5614b6476001a drivers/spi/spi-pl022.c Linus Walleij 2019-06-25 434 dev_err(&spi->dev,
6e5614b6476001a drivers/spi/spi-pl022.c Linus Walleij 2019-06-25 435 "called internal CS control on unsupported device\n");
6e5614b6476001a drivers/spi/spi-pl022.c Linus Walleij 2019-06-25 436 return;
6e5614b6476001a drivers/spi/spi-pl022.c Linus Walleij 2019-06-25 437 }
6e5614b6476001a drivers/spi/spi-pl022.c Linus Walleij 2019-06-25 438
6e5614b6476001a drivers/spi/spi-pl022.c Linus Walleij 2019-06-25 439 /* We draw a line low here to imply we enable it */
db4fa45ed3182d8 drivers/spi/spi-pl022.c Anders Berg 2014-09-17 440 tmp = readw(SSP_CSR(pl022->virtbase));
6e5614b6476001a drivers/spi/spi-pl022.c Linus Walleij 2019-06-25 441 if (enable)
db4fa45ed3182d8 drivers/spi/spi-pl022.c Anders Berg 2014-09-17 @442 tmp &= ~BIT(pl022->cur_cs);
db4fa45ed3182d8 drivers/spi/spi-pl022.c Anders Berg 2014-09-17 443 else
db4fa45ed3182d8 drivers/spi/spi-pl022.c Anders Berg 2014-09-17 @444 tmp |= BIT(pl022->cur_cs);
db4fa45ed3182d8 drivers/spi/spi-pl022.c Anders Berg 2014-09-17 445 writew(tmp, SSP_CSR(pl022->virtbase));
db4fa45ed3182d8 drivers/spi/spi-pl022.c Anders Berg 2014-09-17 446 }
db4fa45ed3182d8 drivers/spi/spi-pl022.c Anders Berg 2014-09-17 447
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 448 /**
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 449 * giveback - current spi_message is over, schedule next message and call
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 450 * callback of this message. Assumes that caller already
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 451 * set message->status; dma and pio irqs are blocked
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 452 * @pl022: SSP driver private data structure
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 453 */
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 454 static void giveback(struct pl022 *pl022)
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 455 {
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 456 struct spi_transfer *last_transfer;
8b8d719161c3866 drivers/spi/spi-pl022.c Virupax Sadashivpetimath 2011-11-10 457 pl022->next_msg_cs_active = false;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 458
23e2c2aa45a213e drivers/spi/spi-pl022.c Axel Lin 2014-02-12 459 last_transfer = list_last_entry(&pl022->cur_msg->transfers,
23e2c2aa45a213e drivers/spi/spi-pl022.c Axel Lin 2014-02-12 460 struct spi_transfer, transfer_list);
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 461
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 462 /* Delay if requested before any change in chip select */
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 463 if (last_transfer->delay_usecs)
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 464 /*
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 465 * FIXME: This runs in interrupt context.
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 466 * Is this really smart?
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 467 */
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 468 udelay(last_transfer->delay_usecs);
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 469
8b8d719161c3866 drivers/spi/spi-pl022.c Virupax Sadashivpetimath 2011-11-10 470 if (!last_transfer->cs_change) {
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 471 struct spi_message *next_msg;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 472
8b8d719161c3866 drivers/spi/spi-pl022.c Virupax Sadashivpetimath 2011-11-10 473 /*
8b8d719161c3866 drivers/spi/spi-pl022.c Virupax Sadashivpetimath 2011-11-10 474 * cs_change was not set. We can keep the chip select
8b8d719161c3866 drivers/spi/spi-pl022.c Virupax Sadashivpetimath 2011-11-10 475 * enabled if there is message in the queue and it is
8b8d719161c3866 drivers/spi/spi-pl022.c Virupax Sadashivpetimath 2011-11-10 476 * for the same spi device.
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 477 *
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 478 * We cannot postpone this until pump_messages, because
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 479 * after calling msg->complete (below) the driver that
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 480 * sent the current message could be unloaded, which
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 481 * could invalidate the cs_control() callback...
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 482 */
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 483 /* get a pointer to the next message, if any */
ffbbdd21329f3e1 drivers/spi/spi-pl022.c Linus Walleij 2012-02-22 484 next_msg = spi_get_next_queued_message(pl022->master);
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 485
8b8d719161c3866 drivers/spi/spi-pl022.c Virupax Sadashivpetimath 2011-11-10 486 /*
8b8d719161c3866 drivers/spi/spi-pl022.c Virupax Sadashivpetimath 2011-11-10 487 * see if the next and current messages point
8b8d719161c3866 drivers/spi/spi-pl022.c Virupax Sadashivpetimath 2011-11-10 488 * to the same spi device.
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 489 */
8b8d719161c3866 drivers/spi/spi-pl022.c Virupax Sadashivpetimath 2011-11-10 490 if (next_msg && next_msg->spi != pl022->cur_msg->spi)
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 491 next_msg = NULL;
8b8d719161c3866 drivers/spi/spi-pl022.c Virupax Sadashivpetimath 2011-11-10 492 if (!next_msg || pl022->cur_msg->state == STATE_ERROR)
f6f46de1063c882 drivers/spi/spi-pl022.c Roland Stigge 2012-08-22 @493 pl022_cs_control(pl022, SSP_CHIP_DESELECT);
8b8d719161c3866 drivers/spi/spi-pl022.c Virupax Sadashivpetimath 2011-11-10 494 else
8b8d719161c3866 drivers/spi/spi-pl022.c Virupax Sadashivpetimath 2011-11-10 495 pl022->next_msg_cs_active = true;
ffbbdd21329f3e1 drivers/spi/spi-pl022.c Linus Walleij 2012-02-22 496
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 497 }
8b8d719161c3866 drivers/spi/spi-pl022.c Virupax Sadashivpetimath 2011-11-10 498
8b8d719161c3866 drivers/spi/spi-pl022.c Virupax Sadashivpetimath 2011-11-10 499 pl022->cur_msg = NULL;
8b8d719161c3866 drivers/spi/spi-pl022.c Virupax Sadashivpetimath 2011-11-10 500 pl022->cur_transfer = NULL;
8b8d719161c3866 drivers/spi/spi-pl022.c Virupax Sadashivpetimath 2011-11-10 501 pl022->cur_chip = NULL;
fd316941cfee1fb drivers/spi/spi-pl022.c Virupax Sadashivpetimath 2012-06-12 502
fd316941cfee1fb drivers/spi/spi-pl022.c Virupax Sadashivpetimath 2012-06-12 503 /* disable the SPI/SSP operation */
fd316941cfee1fb drivers/spi/spi-pl022.c Virupax Sadashivpetimath 2012-06-12 504 writew((readw(SSP_CR1(pl022->virtbase)) &
fd316941cfee1fb drivers/spi/spi-pl022.c Virupax Sadashivpetimath 2012-06-12 505 (~SSP_CR1_MASK_SSE)), SSP_CR1(pl022->virtbase));
fd316941cfee1fb drivers/spi/spi-pl022.c Virupax Sadashivpetimath 2012-06-12 506
cd6fa8d2ca53cac drivers/spi/spi-pl022.c Alexander Sverdlin 2015-02-27 507 spi_finalize_current_message(pl022->master);
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 508 }
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 509
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 510 /**
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 511 * flush - flush the FIFO to reach a clean state
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 512 * @pl022: SSP driver private data structure
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 513 */
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 514 static int flush(struct pl022 *pl022)
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 515 {
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 516 unsigned long limit = loops_per_jiffy << 1;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 517
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 518 dev_dbg(&pl022->adev->dev, "flush\n");
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 519 do {
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 520 while (readw(SSP_SR(pl022->virtbase)) & SSP_SR_MASK_RNE)
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 521 readw(SSP_DR(pl022->virtbase));
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 522 } while ((readw(SSP_SR(pl022->virtbase)) & SSP_SR_MASK_BSY) && limit--);
fc05475f867624d drivers/spi/amba-pl022.c Linus Walleij 2010-01-22 523
fc05475f867624d drivers/spi/amba-pl022.c Linus Walleij 2010-01-22 524 pl022->exp_fifo_level = 0;
fc05475f867624d drivers/spi/amba-pl022.c Linus Walleij 2010-01-22 525
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 526 return limit;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 527 }
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 528
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 529 /**
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 530 * restore_state - Load configuration of current chip
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 531 * @pl022: SSP driver private data structure
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 532 */
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 533 static void restore_state(struct pl022 *pl022)
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 534 {
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 535 struct chip_data *chip = pl022->cur_chip;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 536
556f4aeb7d9dfac drivers/spi/amba-pl022.c Linus Walleij 2010-05-05 537 if (pl022->vendor->extended_cr)
556f4aeb7d9dfac drivers/spi/amba-pl022.c Linus Walleij 2010-05-05 538 writel(chip->cr0, SSP_CR0(pl022->virtbase));
556f4aeb7d9dfac drivers/spi/amba-pl022.c Linus Walleij 2010-05-05 539 else
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 540 writew(chip->cr0, SSP_CR0(pl022->virtbase));
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 541 writew(chip->cr1, SSP_CR1(pl022->virtbase));
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 542 writew(chip->dmacr, SSP_DMACR(pl022->virtbase));
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 543 writew(chip->cpsr, SSP_CPSR(pl022->virtbase));
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 544 writew(DISABLE_ALL_INTERRUPTS, SSP_IMSC(pl022->virtbase));
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 545 writew(CLEAR_ALL_INTERRUPTS, SSP_ICR(pl022->virtbase));
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 546 }
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 547
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 548 /*
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 549 * Default SSP Register Values
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 550 */
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 551 #define DEFAULT_SSP_REG_CR0 ( \
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 552 GEN_MASK_BITS(SSP_DATA_BITS_12, SSP_CR0_MASK_DSS, 0) | \
556f4aeb7d9dfac drivers/spi/amba-pl022.c Linus Walleij 2010-05-05 553 GEN_MASK_BITS(SSP_INTERFACE_MOTOROLA_SPI, SSP_CR0_MASK_FRF, 4) | \
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 554 GEN_MASK_BITS(SSP_CLK_POL_IDLE_LOW, SSP_CR0_MASK_SPO, 6) | \
ee2b805c8eb6459 drivers/spi/amba-pl022.c Linus Walleij 2009-08-15 555 GEN_MASK_BITS(SSP_CLK_SECOND_EDGE, SSP_CR0_MASK_SPH, 7) | \
556f4aeb7d9dfac drivers/spi/amba-pl022.c Linus Walleij 2010-05-05 556 GEN_MASK_BITS(SSP_DEFAULT_CLKRATE, SSP_CR0_MASK_SCR, 8) \
556f4aeb7d9dfac drivers/spi/amba-pl022.c Linus Walleij 2010-05-05 557 )
556f4aeb7d9dfac drivers/spi/amba-pl022.c Linus Walleij 2010-05-05 558
556f4aeb7d9dfac drivers/spi/amba-pl022.c Linus Walleij 2010-05-05 559 /* ST versions have slightly different bit layout */
556f4aeb7d9dfac drivers/spi/amba-pl022.c Linus Walleij 2010-05-05 560 #define DEFAULT_SSP_REG_CR0_ST ( \
556f4aeb7d9dfac drivers/spi/amba-pl022.c Linus Walleij 2010-05-05 561 GEN_MASK_BITS(SSP_DATA_BITS_12, SSP_CR0_MASK_DSS_ST, 0) | \
556f4aeb7d9dfac drivers/spi/amba-pl022.c Linus Walleij 2010-05-05 562 GEN_MASK_BITS(SSP_MICROWIRE_CHANNEL_FULL_DUPLEX, SSP_CR0_MASK_HALFDUP_ST, 5) | \
556f4aeb7d9dfac drivers/spi/amba-pl022.c Linus Walleij 2010-05-05 563 GEN_MASK_BITS(SSP_CLK_POL_IDLE_LOW, SSP_CR0_MASK_SPO, 6) | \
556f4aeb7d9dfac drivers/spi/amba-pl022.c Linus Walleij 2010-05-05 564 GEN_MASK_BITS(SSP_CLK_SECOND_EDGE, SSP_CR0_MASK_SPH, 7) | \
556f4aeb7d9dfac drivers/spi/amba-pl022.c Linus Walleij 2010-05-05 565 GEN_MASK_BITS(SSP_DEFAULT_CLKRATE, SSP_CR0_MASK_SCR, 8) | \
556f4aeb7d9dfac drivers/spi/amba-pl022.c Linus Walleij 2010-05-05 566 GEN_MASK_BITS(SSP_BITS_8, SSP_CR0_MASK_CSS_ST, 16) | \
556f4aeb7d9dfac drivers/spi/amba-pl022.c Linus Walleij 2010-05-05 567 GEN_MASK_BITS(SSP_INTERFACE_MOTOROLA_SPI, SSP_CR0_MASK_FRF_ST, 21) \
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 568 )
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 569
781c7b129b1beb8 drivers/spi/amba-pl022.c Linus Walleij 2010-05-07 570 /* The PL023 version is slightly different again */
781c7b129b1beb8 drivers/spi/amba-pl022.c Linus Walleij 2010-05-07 571 #define DEFAULT_SSP_REG_CR0_ST_PL023 ( \
781c7b129b1beb8 drivers/spi/amba-pl022.c Linus Walleij 2010-05-07 572 GEN_MASK_BITS(SSP_DATA_BITS_12, SSP_CR0_MASK_DSS_ST, 0) | \
781c7b129b1beb8 drivers/spi/amba-pl022.c Linus Walleij 2010-05-07 573 GEN_MASK_BITS(SSP_CLK_POL_IDLE_LOW, SSP_CR0_MASK_SPO, 6) | \
781c7b129b1beb8 drivers/spi/amba-pl022.c Linus Walleij 2010-05-07 574 GEN_MASK_BITS(SSP_CLK_SECOND_EDGE, SSP_CR0_MASK_SPH, 7) | \
781c7b129b1beb8 drivers/spi/amba-pl022.c Linus Walleij 2010-05-07 575 GEN_MASK_BITS(SSP_DEFAULT_CLKRATE, SSP_CR0_MASK_SCR, 8) \
781c7b129b1beb8 drivers/spi/amba-pl022.c Linus Walleij 2010-05-07 576 )
781c7b129b1beb8 drivers/spi/amba-pl022.c Linus Walleij 2010-05-07 577
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 578 #define DEFAULT_SSP_REG_CR1 ( \
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 579 GEN_MASK_BITS(LOOPBACK_DISABLED, SSP_CR1_MASK_LBM, 0) | \
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 580 GEN_MASK_BITS(SSP_DISABLED, SSP_CR1_MASK_SSE, 1) | \
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 581 GEN_MASK_BITS(SSP_MASTER, SSP_CR1_MASK_MS, 2) | \
556f4aeb7d9dfac drivers/spi/amba-pl022.c Linus Walleij 2010-05-05 582 GEN_MASK_BITS(DO_NOT_DRIVE_TX, SSP_CR1_MASK_SOD, 3) \
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 583 )
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 584
556f4aeb7d9dfac drivers/spi/amba-pl022.c Linus Walleij 2010-05-05 585 /* ST versions extend this register to use all 16 bits */
556f4aeb7d9dfac drivers/spi/amba-pl022.c Linus Walleij 2010-05-05 586 #define DEFAULT_SSP_REG_CR1_ST ( \
556f4aeb7d9dfac drivers/spi/amba-pl022.c Linus Walleij 2010-05-05 587 DEFAULT_SSP_REG_CR1 | \
556f4aeb7d9dfac drivers/spi/amba-pl022.c Linus Walleij 2010-05-05 588 GEN_MASK_BITS(SSP_RX_MSB, SSP_CR1_MASK_RENDN_ST, 4) | \
556f4aeb7d9dfac drivers/spi/amba-pl022.c Linus Walleij 2010-05-05 589 GEN_MASK_BITS(SSP_TX_MSB, SSP_CR1_MASK_TENDN_ST, 5) | \
556f4aeb7d9dfac drivers/spi/amba-pl022.c Linus Walleij 2010-05-05 590 GEN_MASK_BITS(SSP_MWIRE_WAIT_ZERO, SSP_CR1_MASK_MWAIT_ST, 6) |\
556f4aeb7d9dfac drivers/spi/amba-pl022.c Linus Walleij 2010-05-05 591 GEN_MASK_BITS(SSP_RX_1_OR_MORE_ELEM, SSP_CR1_MASK_RXIFLSEL_ST, 7) | \
556f4aeb7d9dfac drivers/spi/amba-pl022.c Linus Walleij 2010-05-05 592 GEN_MASK_BITS(SSP_TX_1_OR_MORE_EMPTY_LOC, SSP_CR1_MASK_TXIFLSEL_ST, 10) \
556f4aeb7d9dfac drivers/spi/amba-pl022.c Linus Walleij 2010-05-05 593 )
556f4aeb7d9dfac drivers/spi/amba-pl022.c Linus Walleij 2010-05-05 594
781c7b129b1beb8 drivers/spi/amba-pl022.c Linus Walleij 2010-05-07 595 /*
781c7b129b1beb8 drivers/spi/amba-pl022.c Linus Walleij 2010-05-07 596 * The PL023 variant has further differences: no loopback mode, no microwire
781c7b129b1beb8 drivers/spi/amba-pl022.c Linus Walleij 2010-05-07 597 * support, and a new clock feedback delay setting.
781c7b129b1beb8 drivers/spi/amba-pl022.c Linus Walleij 2010-05-07 598 */
781c7b129b1beb8 drivers/spi/amba-pl022.c Linus Walleij 2010-05-07 599 #define DEFAULT_SSP_REG_CR1_ST_PL023 ( \
781c7b129b1beb8 drivers/spi/amba-pl022.c Linus Walleij 2010-05-07 600 GEN_MASK_BITS(SSP_DISABLED, SSP_CR1_MASK_SSE, 1) | \
781c7b129b1beb8 drivers/spi/amba-pl022.c Linus Walleij 2010-05-07 601 GEN_MASK_BITS(SSP_MASTER, SSP_CR1_MASK_MS, 2) | \
781c7b129b1beb8 drivers/spi/amba-pl022.c Linus Walleij 2010-05-07 602 GEN_MASK_BITS(DO_NOT_DRIVE_TX, SSP_CR1_MASK_SOD, 3) | \
781c7b129b1beb8 drivers/spi/amba-pl022.c Linus Walleij 2010-05-07 603 GEN_MASK_BITS(SSP_RX_MSB, SSP_CR1_MASK_RENDN_ST, 4) | \
781c7b129b1beb8 drivers/spi/amba-pl022.c Linus Walleij 2010-05-07 604 GEN_MASK_BITS(SSP_TX_MSB, SSP_CR1_MASK_TENDN_ST, 5) | \
781c7b129b1beb8 drivers/spi/amba-pl022.c Linus Walleij 2010-05-07 605 GEN_MASK_BITS(SSP_RX_1_OR_MORE_ELEM, SSP_CR1_MASK_RXIFLSEL_ST, 7) | \
781c7b129b1beb8 drivers/spi/amba-pl022.c Linus Walleij 2010-05-07 606 GEN_MASK_BITS(SSP_TX_1_OR_MORE_EMPTY_LOC, SSP_CR1_MASK_TXIFLSEL_ST, 10) | \
781c7b129b1beb8 drivers/spi/amba-pl022.c Linus Walleij 2010-05-07 607 GEN_MASK_BITS(SSP_FEEDBACK_CLK_DELAY_NONE, SSP_CR1_MASK_FBCLKDEL_ST, 13) \
781c7b129b1beb8 drivers/spi/amba-pl022.c Linus Walleij 2010-05-07 608 )
556f4aeb7d9dfac drivers/spi/amba-pl022.c Linus Walleij 2010-05-05 609
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 610 #define DEFAULT_SSP_REG_CPSR ( \
556f4aeb7d9dfac drivers/spi/amba-pl022.c Linus Walleij 2010-05-05 611 GEN_MASK_BITS(SSP_DEFAULT_PRESCALE, SSP_CPSR_MASK_CPSDVSR, 0) \
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 612 )
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 613
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 614 #define DEFAULT_SSP_REG_DMACR (\
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 615 GEN_MASK_BITS(SSP_DMA_DISABLED, SSP_DMACR_MASK_RXDMAE, 0) | \
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 616 GEN_MASK_BITS(SSP_DMA_DISABLED, SSP_DMACR_MASK_TXDMAE, 1) \
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 617 )
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 618
781c7b129b1beb8 drivers/spi/amba-pl022.c Linus Walleij 2010-05-07 619 /**
781c7b129b1beb8 drivers/spi/amba-pl022.c Linus Walleij 2010-05-07 620 * load_ssp_default_config - Load default configuration for SSP
781c7b129b1beb8 drivers/spi/amba-pl022.c Linus Walleij 2010-05-07 621 * @pl022: SSP driver private data structure
781c7b129b1beb8 drivers/spi/amba-pl022.c Linus Walleij 2010-05-07 622 */
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 623 static void load_ssp_default_config(struct pl022 *pl022)
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 624 {
781c7b129b1beb8 drivers/spi/amba-pl022.c Linus Walleij 2010-05-07 625 if (pl022->vendor->pl023) {
781c7b129b1beb8 drivers/spi/amba-pl022.c Linus Walleij 2010-05-07 626 writel(DEFAULT_SSP_REG_CR0_ST_PL023, SSP_CR0(pl022->virtbase));
781c7b129b1beb8 drivers/spi/amba-pl022.c Linus Walleij 2010-05-07 627 writew(DEFAULT_SSP_REG_CR1_ST_PL023, SSP_CR1(pl022->virtbase));
781c7b129b1beb8 drivers/spi/amba-pl022.c Linus Walleij 2010-05-07 628 } else if (pl022->vendor->extended_cr) {
556f4aeb7d9dfac drivers/spi/amba-pl022.c Linus Walleij 2010-05-05 629 writel(DEFAULT_SSP_REG_CR0_ST, SSP_CR0(pl022->virtbase));
556f4aeb7d9dfac drivers/spi/amba-pl022.c Linus Walleij 2010-05-05 630 writew(DEFAULT_SSP_REG_CR1_ST, SSP_CR1(pl022->virtbase));
556f4aeb7d9dfac drivers/spi/amba-pl022.c Linus Walleij 2010-05-05 631 } else {
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 632 writew(DEFAULT_SSP_REG_CR0, SSP_CR0(pl022->virtbase));
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 633 writew(DEFAULT_SSP_REG_CR1, SSP_CR1(pl022->virtbase));
556f4aeb7d9dfac drivers/spi/amba-pl022.c Linus Walleij 2010-05-05 634 }
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 635 writew(DEFAULT_SSP_REG_DMACR, SSP_DMACR(pl022->virtbase));
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 636 writew(DEFAULT_SSP_REG_CPSR, SSP_CPSR(pl022->virtbase));
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 637 writew(DISABLE_ALL_INTERRUPTS, SSP_IMSC(pl022->virtbase));
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 638 writew(CLEAR_ALL_INTERRUPTS, SSP_ICR(pl022->virtbase));
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 639 }
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 640
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 641 /**
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 642 * This will write to TX and read from RX according to the parameters
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 643 * set in pl022.
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 644 */
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 645 static void readwriter(struct pl022 *pl022)
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 646 {
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 647
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 648 /*
25985edcedea639 drivers/spi/amba-pl022.c Lucas De Marchi 2011-03-30 649 * The FIFO depth is different between primecell variants.
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 650 * I believe filling in too much in the FIFO might cause
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 651 * errons in 8bit wide transfers on ARM variants (just 8 words
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 652 * FIFO, means only 8x8 = 64 bits in FIFO) at least.
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 653 *
fc05475f867624d drivers/spi/amba-pl022.c Linus Walleij 2010-01-22 654 * To prevent this issue, the TX FIFO is only filled to the
fc05475f867624d drivers/spi/amba-pl022.c Linus Walleij 2010-01-22 655 * unused RX FIFO fill length, regardless of what the TX
fc05475f867624d drivers/spi/amba-pl022.c Linus Walleij 2010-01-22 656 * FIFO status flag indicates.
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 657 */
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 658 dev_dbg(&pl022->adev->dev,
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 659 "%s, rx: %p, rxend: %p, tx: %p, txend: %p\n",
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 660 __func__, pl022->rx, pl022->rx_end, pl022->tx, pl022->tx_end);
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 661
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 662 /* Read as much as you can */
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 663 while ((readw(SSP_SR(pl022->virtbase)) & SSP_SR_MASK_RNE)
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 664 && (pl022->rx < pl022->rx_end)) {
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 665 switch (pl022->read) {
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 666 case READING_NULL:
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 667 readw(SSP_DR(pl022->virtbase));
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 668 break;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 669 case READING_U8:
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 670 *(u8 *) (pl022->rx) =
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 671 readw(SSP_DR(pl022->virtbase)) & 0xFFU;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 672 break;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 673 case READING_U16:
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 674 *(u16 *) (pl022->rx) =
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 675 (u16) readw(SSP_DR(pl022->virtbase));
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 676 break;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 677 case READING_U32:
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 678 *(u32 *) (pl022->rx) =
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 679 readl(SSP_DR(pl022->virtbase));
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 680 break;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 681 }
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 682 pl022->rx += (pl022->cur_chip->n_bytes);
fc05475f867624d drivers/spi/amba-pl022.c Linus Walleij 2010-01-22 683 pl022->exp_fifo_level--;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 684 }
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 685 /*
fc05475f867624d drivers/spi/amba-pl022.c Linus Walleij 2010-01-22 686 * Write as much as possible up to the RX FIFO size
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 687 */
fc05475f867624d drivers/spi/amba-pl022.c Linus Walleij 2010-01-22 688 while ((pl022->exp_fifo_level < pl022->vendor->fifodepth)
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 689 && (pl022->tx < pl022->tx_end)) {
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 690 switch (pl022->write) {
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 691 case WRITING_NULL:
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 692 writew(0x0, SSP_DR(pl022->virtbase));
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 693 break;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 694 case WRITING_U8:
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 695 writew(*(u8 *) (pl022->tx), SSP_DR(pl022->virtbase));
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 696 break;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 697 case WRITING_U16:
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 698 writew((*(u16 *) (pl022->tx)), SSP_DR(pl022->virtbase));
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 699 break;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 700 case WRITING_U32:
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 701 writel(*(u32 *) (pl022->tx), SSP_DR(pl022->virtbase));
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 702 break;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 703 }
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 704 pl022->tx += (pl022->cur_chip->n_bytes);
fc05475f867624d drivers/spi/amba-pl022.c Linus Walleij 2010-01-22 705 pl022->exp_fifo_level++;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 706 /*
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 707 * This inner reader takes care of things appearing in the RX
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 708 * FIFO as we're transmitting. This will happen a lot since the
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 709 * clock starts running when you put things into the TX FIFO,
25985edcedea639 drivers/spi/amba-pl022.c Lucas De Marchi 2011-03-30 710 * and then things are continuously clocked into the RX FIFO.
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 711 */
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 712 while ((readw(SSP_SR(pl022->virtbase)) & SSP_SR_MASK_RNE)
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 713 && (pl022->rx < pl022->rx_end)) {
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 714 switch (pl022->read) {
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 715 case READING_NULL:
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 716 readw(SSP_DR(pl022->virtbase));
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 717 break;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 718 case READING_U8:
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 719 *(u8 *) (pl022->rx) =
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 720 readw(SSP_DR(pl022->virtbase)) & 0xFFU;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 721 break;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 722 case READING_U16:
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 723 *(u16 *) (pl022->rx) =
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 724 (u16) readw(SSP_DR(pl022->virtbase));
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 725 break;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 726 case READING_U32:
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 727 *(u32 *) (pl022->rx) =
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 728 readl(SSP_DR(pl022->virtbase));
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 729 break;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 730 }
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 731 pl022->rx += (pl022->cur_chip->n_bytes);
fc05475f867624d drivers/spi/amba-pl022.c Linus Walleij 2010-01-22 732 pl022->exp_fifo_level--;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 733 }
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 734 }
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 735 /*
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 736 * When we exit here the TX FIFO should be full and the RX FIFO
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 737 * should be empty
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 738 */
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 739 }
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 740
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 741 /**
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 742 * next_transfer - Move to the Next transfer in the current spi message
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 743 * @pl022: SSP driver private data structure
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 744 *
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 745 * This function moves though the linked list of spi transfers in the
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 746 * current spi message and returns with the state of current spi
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 747 * message i.e whether its last transfer is done(STATE_DONE) or
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 748 * Next transfer is ready(STATE_RUNNING)
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 749 */
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 750 static void *next_transfer(struct pl022 *pl022)
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 751 {
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 752 struct spi_message *msg = pl022->cur_msg;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 753 struct spi_transfer *trans = pl022->cur_transfer;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 754
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 755 /* Move to next transfer */
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 756 if (trans->transfer_list.next != &msg->transfers) {
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 757 pl022->cur_transfer =
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 758 list_entry(trans->transfer_list.next,
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 759 struct spi_transfer, transfer_list);
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 760 return STATE_RUNNING;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 761 }
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 762 return STATE_DONE;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 763 }
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 764
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 765 /*
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 766 * This DMA functionality is only compiled in if we have
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 767 * access to the generic DMA devices/DMA engine.
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 768 */
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 769 #ifdef CONFIG_DMA_ENGINE
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 770 static void unmap_free_dma_scatter(struct pl022 *pl022)
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 771 {
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 772 /* Unmap and free the SG tables */
b729889686afb7d drivers/spi/amba-pl022.c Linus Walleij 2010-12-22 773 dma_unmap_sg(pl022->dma_tx_channel->device->dev, pl022->sgt_tx.sgl,
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 774 pl022->sgt_tx.nents, DMA_TO_DEVICE);
b729889686afb7d drivers/spi/amba-pl022.c Linus Walleij 2010-12-22 775 dma_unmap_sg(pl022->dma_rx_channel->device->dev, pl022->sgt_rx.sgl,
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 776 pl022->sgt_rx.nents, DMA_FROM_DEVICE);
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 777 sg_free_table(&pl022->sgt_rx);
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 778 sg_free_table(&pl022->sgt_tx);
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 779 }
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 780
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 781 static void dma_callback(void *data)
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 782 {
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 783 struct pl022 *pl022 = data;
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 784 struct spi_message *msg = pl022->cur_msg;
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 785
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 786 BUG_ON(!pl022->sgt_rx.sgl);
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 787
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 788 #ifdef VERBOSE_DEBUG
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 789 /*
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 790 * Optionally dump out buffers to inspect contents, this is
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 791 * good if you want to convince yourself that the loopback
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 792 * read/write contents are the same, when adopting to a new
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 793 * DMA engine.
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 794 */
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 795 {
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 796 struct scatterlist *sg;
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 797 unsigned int i;
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 798
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 799 dma_sync_sg_for_cpu(&pl022->adev->dev,
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 800 pl022->sgt_rx.sgl,
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 801 pl022->sgt_rx.nents,
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 802 DMA_FROM_DEVICE);
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 803
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 804 for_each_sg(pl022->sgt_rx.sgl, sg, pl022->sgt_rx.nents, i) {
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 805 dev_dbg(&pl022->adev->dev, "SPI RX SG ENTRY: %d", i);
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 806 print_hex_dump(KERN_ERR, "SPI RX: ",
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 807 DUMP_PREFIX_OFFSET,
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 808 16,
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 809 1,
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 810 sg_virt(sg),
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 811 sg_dma_len(sg),
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 812 1);
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 813 }
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 814 for_each_sg(pl022->sgt_tx.sgl, sg, pl022->sgt_tx.nents, i) {
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 815 dev_dbg(&pl022->adev->dev, "SPI TX SG ENTRY: %d", i);
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 816 print_hex_dump(KERN_ERR, "SPI TX: ",
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 817 DUMP_PREFIX_OFFSET,
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 818 16,
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 819 1,
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 820 sg_virt(sg),
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 821 sg_dma_len(sg),
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 822 1);
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 823 }
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 824 }
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 825 #endif
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 826
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 827 unmap_free_dma_scatter(pl022);
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 828
25985edcedea639 drivers/spi/amba-pl022.c Lucas De Marchi 2011-03-30 829 /* Update total bytes transferred */
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 830 msg->actual_length += pl022->cur_transfer->len;
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 831 /* Move to next transfer */
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 832 msg->state = next_transfer(pl022);
c0b07605f1a0285 drivers/spi/spi-pl022.c Fredrik Ternerot 2018-11-13 833 if (msg->state != STATE_DONE && pl022->cur_transfer->cs_change)
c0b07605f1a0285 drivers/spi/spi-pl022.c Fredrik Ternerot 2018-11-13 834 pl022_cs_control(pl022, SSP_CHIP_DESELECT);
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 835 tasklet_schedule(&pl022->pump_transfers);
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 836 }
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 837
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 838 static void setup_dma_scatter(struct pl022 *pl022,
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 839 void *buffer,
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 840 unsigned int length,
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 841 struct sg_table *sgtab)
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 842 {
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 843 struct scatterlist *sg;
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 844 int bytesleft = length;
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 845 void *bufp = buffer;
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 846 int mapbytes;
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 847 int i;
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 848
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 849 if (buffer) {
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 850 for_each_sg(sgtab->sgl, sg, sgtab->nents, i) {
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 851 /*
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 852 * If there are less bytes left than what fits
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 853 * in the current page (plus page alignment offset)
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 854 * we just feed in this, else we stuff in as much
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 855 * as we can.
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 856 */
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 857 if (bytesleft < (PAGE_SIZE - offset_in_page(bufp)))
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 858 mapbytes = bytesleft;
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 859 else
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 860 mapbytes = PAGE_SIZE - offset_in_page(bufp);
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 861 sg_set_page(sg, virt_to_page(bufp),
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 862 mapbytes, offset_in_page(bufp));
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 863 bufp += mapbytes;
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 864 bytesleft -= mapbytes;
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 865 dev_dbg(&pl022->adev->dev,
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 866 "set RX/TX target page @ %p, %d bytes, %d left\n",
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 867 bufp, mapbytes, bytesleft);
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 868 }
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 869 } else {
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 870 /* Map the dummy buffer on every page */
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 871 for_each_sg(sgtab->sgl, sg, sgtab->nents, i) {
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 872 if (bytesleft < PAGE_SIZE)
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 873 mapbytes = bytesleft;
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 874 else
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 875 mapbytes = PAGE_SIZE;
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 876 sg_set_page(sg, virt_to_page(pl022->dummypage),
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 877 mapbytes, 0);
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 878 bytesleft -= mapbytes;
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 879 dev_dbg(&pl022->adev->dev,
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 880 "set RX/TX to dummy page %d bytes, %d left\n",
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 881 mapbytes, bytesleft);
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 882
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 883 }
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 884 }
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 885 BUG_ON(bytesleft);
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 886 }
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 887
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 888 /**
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 889 * configure_dma - configures the channels for the next transfer
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 890 * @pl022: SSP driver's private data structure
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 891 */
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 892 static int configure_dma(struct pl022 *pl022)
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 893 {
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 894 struct dma_slave_config rx_conf = {
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 895 .src_addr = SSP_DR(pl022->phybase),
a485df4b4404379 drivers/spi/spi-pl022.c Vinod Koul 2011-10-14 896 .direction = DMA_DEV_TO_MEM,
258aea76f552cc7 drivers/spi/spi-pl022.c Viresh Kumar 2012-02-01 897 .device_fc = false,
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 898 };
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 899 struct dma_slave_config tx_conf = {
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 900 .dst_addr = SSP_DR(pl022->phybase),
a485df4b4404379 drivers/spi/spi-pl022.c Vinod Koul 2011-10-14 901 .direction = DMA_MEM_TO_DEV,
258aea76f552cc7 drivers/spi/spi-pl022.c Viresh Kumar 2012-02-01 902 .device_fc = false,
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 903 };
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 904 unsigned int pages;
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 905 int ret;
082086f2ce53c69 drivers/spi/amba-pl022.c Linus Walleij 2010-12-22 906 int rx_sglen, tx_sglen;
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 907 struct dma_chan *rxchan = pl022->dma_rx_channel;
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 908 struct dma_chan *txchan = pl022->dma_tx_channel;
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 909 struct dma_async_tx_descriptor *rxdesc;
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 910 struct dma_async_tx_descriptor *txdesc;
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 911
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 912 /* Check that the channels are available */
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 913 if (!rxchan || !txchan)
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 914 return -ENODEV;
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 915
083be3f05371b8f drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 916 /*
083be3f05371b8f drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 917 * If supplied, the DMA burstsize should equal the FIFO trigger level.
083be3f05371b8f drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 918 * Notice that the DMA engine uses one-to-one mapping. Since we can
083be3f05371b8f drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 919 * not trigger on 2 elements this needs explicit mapping rather than
083be3f05371b8f drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 920 * calculation.
083be3f05371b8f drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 921 */
083be3f05371b8f drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 922 switch (pl022->rx_lev_trig) {
083be3f05371b8f drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 923 case SSP_RX_1_OR_MORE_ELEM:
083be3f05371b8f drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 924 rx_conf.src_maxburst = 1;
083be3f05371b8f drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 925 break;
083be3f05371b8f drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 926 case SSP_RX_4_OR_MORE_ELEM:
083be3f05371b8f drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 927 rx_conf.src_maxburst = 4;
083be3f05371b8f drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 928 break;
083be3f05371b8f drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 929 case SSP_RX_8_OR_MORE_ELEM:
083be3f05371b8f drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 930 rx_conf.src_maxburst = 8;
083be3f05371b8f drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 931 break;
083be3f05371b8f drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 932 case SSP_RX_16_OR_MORE_ELEM:
083be3f05371b8f drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 933 rx_conf.src_maxburst = 16;
083be3f05371b8f drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 934 break;
083be3f05371b8f drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 935 case SSP_RX_32_OR_MORE_ELEM:
083be3f05371b8f drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 936 rx_conf.src_maxburst = 32;
083be3f05371b8f drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 937 break;
083be3f05371b8f drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 938 default:
083be3f05371b8f drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 939 rx_conf.src_maxburst = pl022->vendor->fifodepth >> 1;
083be3f05371b8f drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 940 break;
083be3f05371b8f drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 941 }
083be3f05371b8f drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 942
083be3f05371b8f drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 943 switch (pl022->tx_lev_trig) {
083be3f05371b8f drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 944 case SSP_TX_1_OR_MORE_EMPTY_LOC:
083be3f05371b8f drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 945 tx_conf.dst_maxburst = 1;
083be3f05371b8f drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 946 break;
083be3f05371b8f drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 947 case SSP_TX_4_OR_MORE_EMPTY_LOC:
083be3f05371b8f drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 948 tx_conf.dst_maxburst = 4;
083be3f05371b8f drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 949 break;
083be3f05371b8f drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 950 case SSP_TX_8_OR_MORE_EMPTY_LOC:
083be3f05371b8f drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 951 tx_conf.dst_maxburst = 8;
083be3f05371b8f drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 952 break;
083be3f05371b8f drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 953 case SSP_TX_16_OR_MORE_EMPTY_LOC:
083be3f05371b8f drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 954 tx_conf.dst_maxburst = 16;
083be3f05371b8f drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 955 break;
083be3f05371b8f drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 956 case SSP_TX_32_OR_MORE_EMPTY_LOC:
083be3f05371b8f drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 957 tx_conf.dst_maxburst = 32;
083be3f05371b8f drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 958 break;
083be3f05371b8f drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 959 default:
083be3f05371b8f drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 960 tx_conf.dst_maxburst = pl022->vendor->fifodepth >> 1;
083be3f05371b8f drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 961 break;
083be3f05371b8f drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 962 }
083be3f05371b8f drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 963
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 964 switch (pl022->read) {
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 965 case READING_NULL:
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 966 /* Use the same as for writing */
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 967 rx_conf.src_addr_width = DMA_SLAVE_BUSWIDTH_UNDEFINED;
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 968 break;
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 969 case READING_U8:
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 970 rx_conf.src_addr_width = DMA_SLAVE_BUSWIDTH_1_BYTE;
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 971 break;
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 972 case READING_U16:
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 973 rx_conf.src_addr_width = DMA_SLAVE_BUSWIDTH_2_BYTES;
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 974 break;
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 975 case READING_U32:
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 976 rx_conf.src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 977 break;
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 978 }
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 979
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 980 switch (pl022->write) {
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 981 case WRITING_NULL:
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 982 /* Use the same as for reading */
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 983 tx_conf.dst_addr_width = DMA_SLAVE_BUSWIDTH_UNDEFINED;
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 984 break;
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 985 case WRITING_U8:
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 986 tx_conf.dst_addr_width = DMA_SLAVE_BUSWIDTH_1_BYTE;
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 987 break;
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 988 case WRITING_U16:
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 989 tx_conf.dst_addr_width = DMA_SLAVE_BUSWIDTH_2_BYTES;
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 990 break;
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 991 case WRITING_U32:
bc3f67a3e1b2075 drivers/spi/amba-pl022.c Joe Perches 2010-11-14 992 tx_conf.dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 993 break;
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 994 }
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 995
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 996 /* SPI pecularity: we need to read and write the same width */
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 997 if (rx_conf.src_addr_width == DMA_SLAVE_BUSWIDTH_UNDEFINED)
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 998 rx_conf.src_addr_width = tx_conf.dst_addr_width;
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 999 if (tx_conf.dst_addr_width == DMA_SLAVE_BUSWIDTH_UNDEFINED)
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1000 tx_conf.dst_addr_width = rx_conf.src_addr_width;
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1001 BUG_ON(rx_conf.src_addr_width != tx_conf.dst_addr_width);
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1002
ecd442fd9e388a3 drivers/spi/amba-pl022.c Linus Walleij 2011-02-08 1003 dmaengine_slave_config(rxchan, &rx_conf);
ecd442fd9e388a3 drivers/spi/amba-pl022.c Linus Walleij 2011-02-08 1004 dmaengine_slave_config(txchan, &tx_conf);
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1005
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1006 /* Create sglists for the transfers */
b181565ee6a0f89 drivers/spi/spi-pl022.c Viresh Kumar 2011-08-10 1007 pages = DIV_ROUND_UP(pl022->cur_transfer->len, PAGE_SIZE);
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1008 dev_dbg(&pl022->adev->dev, "using %d pages for transfer\n", pages);
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1009
538a18dc189ef5d drivers/spi/spi-pl022.c Viresh Kumar 2011-08-10 1010 ret = sg_alloc_table(&pl022->sgt_rx, pages, GFP_ATOMIC);
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1011 if (ret)
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1012 goto err_alloc_rx_sg;
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1013
538a18dc189ef5d drivers/spi/spi-pl022.c Viresh Kumar 2011-08-10 1014 ret = sg_alloc_table(&pl022->sgt_tx, pages, GFP_ATOMIC);
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1015 if (ret)
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1016 goto err_alloc_tx_sg;
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1017
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1018 /* Fill in the scatterlists for the RX+TX buffers */
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1019 setup_dma_scatter(pl022, pl022->rx,
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1020 pl022->cur_transfer->len, &pl022->sgt_rx);
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1021 setup_dma_scatter(pl022, pl022->tx,
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1022 pl022->cur_transfer->len, &pl022->sgt_tx);
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1023
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1024 /* Map DMA buffers */
082086f2ce53c69 drivers/spi/amba-pl022.c Linus Walleij 2010-12-22 1025 rx_sglen = dma_map_sg(rxchan->device->dev, pl022->sgt_rx.sgl,
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1026 pl022->sgt_rx.nents, DMA_FROM_DEVICE);
082086f2ce53c69 drivers/spi/amba-pl022.c Linus Walleij 2010-12-22 1027 if (!rx_sglen)
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1028 goto err_rx_sgmap;
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1029
082086f2ce53c69 drivers/spi/amba-pl022.c Linus Walleij 2010-12-22 1030 tx_sglen = dma_map_sg(txchan->device->dev, pl022->sgt_tx.sgl,
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1031 pl022->sgt_tx.nents, DMA_TO_DEVICE);
082086f2ce53c69 drivers/spi/amba-pl022.c Linus Walleij 2010-12-22 1032 if (!tx_sglen)
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1033 goto err_tx_sgmap;
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1034
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1035 /* Send both scatterlists */
16052827d98fbc1 drivers/spi/spi-pl022.c Alexandre Bounine 2012-03-08 1036 rxdesc = dmaengine_prep_slave_sg(rxchan,
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1037 pl022->sgt_rx.sgl,
082086f2ce53c69 drivers/spi/amba-pl022.c Linus Walleij 2010-12-22 1038 rx_sglen,
a485df4b4404379 drivers/spi/spi-pl022.c Vinod Koul 2011-10-14 1039 DMA_DEV_TO_MEM,
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1040 DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1041 if (!rxdesc)
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1042 goto err_rxdesc;
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1043
16052827d98fbc1 drivers/spi/spi-pl022.c Alexandre Bounine 2012-03-08 1044 txdesc = dmaengine_prep_slave_sg(txchan,
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1045 pl022->sgt_tx.sgl,
082086f2ce53c69 drivers/spi/amba-pl022.c Linus Walleij 2010-12-22 1046 tx_sglen,
a485df4b4404379 drivers/spi/spi-pl022.c Vinod Koul 2011-10-14 1047 DMA_MEM_TO_DEV,
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1048 DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1049 if (!txdesc)
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1050 goto err_txdesc;
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1051
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1052 /* Put the callback on the RX transfer only, that should finish last */
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1053 rxdesc->callback = dma_callback;
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1054 rxdesc->callback_param = pl022;
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1055
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1056 /* Submit and fire RX and TX with TX last so we're ready to read! */
ecd442fd9e388a3 drivers/spi/amba-pl022.c Linus Walleij 2011-02-08 1057 dmaengine_submit(rxdesc);
ecd442fd9e388a3 drivers/spi/amba-pl022.c Linus Walleij 2011-02-08 1058 dmaengine_submit(txdesc);
ecd442fd9e388a3 drivers/spi/amba-pl022.c Linus Walleij 2011-02-08 1059 dma_async_issue_pending(rxchan);
ecd442fd9e388a3 drivers/spi/amba-pl022.c Linus Walleij 2011-02-08 1060 dma_async_issue_pending(txchan);
ffbbdd21329f3e1 drivers/spi/spi-pl022.c Linus Walleij 2012-02-22 1061 pl022->dma_running = true;
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1062
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1063 return 0;
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1064
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1065 err_txdesc:
ecd442fd9e388a3 drivers/spi/amba-pl022.c Linus Walleij 2011-02-08 1066 dmaengine_terminate_all(txchan);
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1067 err_rxdesc:
ecd442fd9e388a3 drivers/spi/amba-pl022.c Linus Walleij 2011-02-08 1068 dmaengine_terminate_all(rxchan);
b729889686afb7d drivers/spi/amba-pl022.c Linus Walleij 2010-12-22 1069 dma_unmap_sg(txchan->device->dev, pl022->sgt_tx.sgl,
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1070 pl022->sgt_tx.nents, DMA_TO_DEVICE);
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1071 err_tx_sgmap:
b729889686afb7d drivers/spi/amba-pl022.c Linus Walleij 2010-12-22 1072 dma_unmap_sg(rxchan->device->dev, pl022->sgt_rx.sgl,
3ffa6158f002e09 drivers/spi/spi-pl022.c Ray Jui 2014-10-09 1073 pl022->sgt_rx.nents, DMA_FROM_DEVICE);
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1074 err_rx_sgmap:
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1075 sg_free_table(&pl022->sgt_tx);
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1076 err_alloc_tx_sg:
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1077 sg_free_table(&pl022->sgt_rx);
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1078 err_alloc_rx_sg:
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1079 return -ENOMEM;
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1080 }
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1081
fd4a319bc933ae9 drivers/spi/spi-pl022.c Grant Likely 2012-12-07 1082 static int pl022_dma_probe(struct pl022 *pl022)
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1083 {
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1084 dma_cap_mask_t mask;
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1085
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1086 /* Try to acquire a generic DMA engine slave channel */
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1087 dma_cap_zero(mask);
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1088 dma_cap_set(DMA_SLAVE, mask);
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1089 /*
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1090 * We need both RX and TX channels to do DMA, else do none
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1091 * of them.
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1092 */
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1093 pl022->dma_rx_channel = dma_request_channel(mask,
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1094 pl022->master_info->dma_filter,
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1095 pl022->master_info->dma_rx_param);
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1096 if (!pl022->dma_rx_channel) {
43c640157d4366a drivers/spi/amba-pl022.c Viresh Kumar 2011-05-16 1097 dev_dbg(&pl022->adev->dev, "no RX DMA channel!\n");
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1098 goto err_no_rxchan;
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1099 }
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1100
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1101 pl022->dma_tx_channel = dma_request_channel(mask,
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1102 pl022->master_info->dma_filter,
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1103 pl022->master_info->dma_tx_param);
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1104 if (!pl022->dma_tx_channel) {
43c640157d4366a drivers/spi/amba-pl022.c Viresh Kumar 2011-05-16 1105 dev_dbg(&pl022->adev->dev, "no TX DMA channel!\n");
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1106 goto err_no_txchan;
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1107 }
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1108
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1109 pl022->dummypage = kmalloc(PAGE_SIZE, GFP_KERNEL);
77538f4a98dc542 drivers/spi/spi-pl022.c Jingoo Han 2014-04-29 1110 if (!pl022->dummypage)
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1111 goto err_no_dummypage;
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1112
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1113 dev_info(&pl022->adev->dev, "setup for DMA on RX %s, TX %s\n",
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1114 dma_chan_name(pl022->dma_rx_channel),
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1115 dma_chan_name(pl022->dma_tx_channel));
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1116
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1117 return 0;
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1118
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1119 err_no_dummypage:
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1120 dma_release_channel(pl022->dma_tx_channel);
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1121 err_no_txchan:
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1122 dma_release_channel(pl022->dma_rx_channel);
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1123 pl022->dma_rx_channel = NULL;
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1124 err_no_rxchan:
43c640157d4366a drivers/spi/amba-pl022.c Viresh Kumar 2011-05-16 1125 dev_err(&pl022->adev->dev,
43c640157d4366a drivers/spi/amba-pl022.c Viresh Kumar 2011-05-16 1126 "Failed to work in dma mode, work without dma!\n");
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1127 return -ENODEV;
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1128 }
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1129
dc715452e914515 drivers/spi/spi-pl022.c Arnd Bergmann 2013-01-28 1130 static int pl022_dma_autoprobe(struct pl022 *pl022)
dc715452e914515 drivers/spi/spi-pl022.c Arnd Bergmann 2013-01-28 1131 {
dc715452e914515 drivers/spi/spi-pl022.c Arnd Bergmann 2013-01-28 1132 struct device *dev = &pl022->adev->dev;
f3d4bb3342630cd drivers/spi/spi-pl022.c Rabin Vincent 2015-11-23 1133 struct dma_chan *chan;
f3d4bb3342630cd drivers/spi/spi-pl022.c Rabin Vincent 2015-11-23 1134 int err;
dc715452e914515 drivers/spi/spi-pl022.c Arnd Bergmann 2013-01-28 1135
dc715452e914515 drivers/spi/spi-pl022.c Arnd Bergmann 2013-01-28 1136 /* automatically configure DMA channels from platform, normally using DT */
f3d4bb3342630cd drivers/spi/spi-pl022.c Rabin Vincent 2015-11-23 1137 chan = dma_request_slave_channel_reason(dev, "rx");
f3d4bb3342630cd drivers/spi/spi-pl022.c Rabin Vincent 2015-11-23 1138 if (IS_ERR(chan)) {
f3d4bb3342630cd drivers/spi/spi-pl022.c Rabin Vincent 2015-11-23 1139 err = PTR_ERR(chan);
dc715452e914515 drivers/spi/spi-pl022.c Arnd Bergmann 2013-01-28 1140 goto err_no_rxchan;
f3d4bb3342630cd drivers/spi/spi-pl022.c Rabin Vincent 2015-11-23 1141 }
f3d4bb3342630cd drivers/spi/spi-pl022.c Rabin Vincent 2015-11-23 1142
f3d4bb3342630cd drivers/spi/spi-pl022.c Rabin Vincent 2015-11-23 1143 pl022->dma_rx_channel = chan;
dc715452e914515 drivers/spi/spi-pl022.c Arnd Bergmann 2013-01-28 1144
f3d4bb3342630cd drivers/spi/spi-pl022.c Rabin Vincent 2015-11-23 1145 chan = dma_request_slave_channel_reason(dev, "tx");
f3d4bb3342630cd drivers/spi/spi-pl022.c Rabin Vincent 2015-11-23 1146 if (IS_ERR(chan)) {
f3d4bb3342630cd drivers/spi/spi-pl022.c Rabin Vincent 2015-11-23 1147 err = PTR_ERR(chan);
dc715452e914515 drivers/spi/spi-pl022.c Arnd Bergmann 2013-01-28 1148 goto err_no_txchan;
f3d4bb3342630cd drivers/spi/spi-pl022.c Rabin Vincent 2015-11-23 1149 }
f3d4bb3342630cd drivers/spi/spi-pl022.c Rabin Vincent 2015-11-23 1150
f3d4bb3342630cd drivers/spi/spi-pl022.c Rabin Vincent 2015-11-23 1151 pl022->dma_tx_channel = chan;
dc715452e914515 drivers/spi/spi-pl022.c Arnd Bergmann 2013-01-28 1152
dc715452e914515 drivers/spi/spi-pl022.c Arnd Bergmann 2013-01-28 1153 pl022->dummypage = kmalloc(PAGE_SIZE, GFP_KERNEL);
f3d4bb3342630cd drivers/spi/spi-pl022.c Rabin Vincent 2015-11-23 1154 if (!pl022->dummypage) {
f3d4bb3342630cd drivers/spi/spi-pl022.c Rabin Vincent 2015-11-23 1155 err = -ENOMEM;
dc715452e914515 drivers/spi/spi-pl022.c Arnd Bergmann 2013-01-28 1156 goto err_no_dummypage;
f3d4bb3342630cd drivers/spi/spi-pl022.c Rabin Vincent 2015-11-23 1157 }
dc715452e914515 drivers/spi/spi-pl022.c Arnd Bergmann 2013-01-28 1158
dc715452e914515 drivers/spi/spi-pl022.c Arnd Bergmann 2013-01-28 1159 return 0;
dc715452e914515 drivers/spi/spi-pl022.c Arnd Bergmann 2013-01-28 1160
dc715452e914515 drivers/spi/spi-pl022.c Arnd Bergmann 2013-01-28 1161 err_no_dummypage:
dc715452e914515 drivers/spi/spi-pl022.c Arnd Bergmann 2013-01-28 1162 dma_release_channel(pl022->dma_tx_channel);
dc715452e914515 drivers/spi/spi-pl022.c Arnd Bergmann 2013-01-28 1163 pl022->dma_tx_channel = NULL;
dc715452e914515 drivers/spi/spi-pl022.c Arnd Bergmann 2013-01-28 1164 err_no_txchan:
dc715452e914515 drivers/spi/spi-pl022.c Arnd Bergmann 2013-01-28 1165 dma_release_channel(pl022->dma_rx_channel);
dc715452e914515 drivers/spi/spi-pl022.c Arnd Bergmann 2013-01-28 1166 pl022->dma_rx_channel = NULL;
dc715452e914515 drivers/spi/spi-pl022.c Arnd Bergmann 2013-01-28 1167 err_no_rxchan:
f3d4bb3342630cd drivers/spi/spi-pl022.c Rabin Vincent 2015-11-23 1168 return err;
dc715452e914515 drivers/spi/spi-pl022.c Arnd Bergmann 2013-01-28 1169 }
dc715452e914515 drivers/spi/spi-pl022.c Arnd Bergmann 2013-01-28 1170
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1171 static void terminate_dma(struct pl022 *pl022)
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1172 {
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1173 struct dma_chan *rxchan = pl022->dma_rx_channel;
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1174 struct dma_chan *txchan = pl022->dma_tx_channel;
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1175
ecd442fd9e388a3 drivers/spi/amba-pl022.c Linus Walleij 2011-02-08 1176 dmaengine_terminate_all(rxchan);
ecd442fd9e388a3 drivers/spi/amba-pl022.c Linus Walleij 2011-02-08 1177 dmaengine_terminate_all(txchan);
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1178 unmap_free_dma_scatter(pl022);
ffbbdd21329f3e1 drivers/spi/spi-pl022.c Linus Walleij 2012-02-22 1179 pl022->dma_running = false;
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1180 }
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1181
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1182 static void pl022_dma_remove(struct pl022 *pl022)
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1183 {
ffbbdd21329f3e1 drivers/spi/spi-pl022.c Linus Walleij 2012-02-22 1184 if (pl022->dma_running)
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1185 terminate_dma(pl022);
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1186 if (pl022->dma_tx_channel)
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1187 dma_release_channel(pl022->dma_tx_channel);
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1188 if (pl022->dma_rx_channel)
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1189 dma_release_channel(pl022->dma_rx_channel);
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1190 kfree(pl022->dummypage);
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1191 }
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1192
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1193 #else
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1194 static inline int configure_dma(struct pl022 *pl022)
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1195 {
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1196 return -ENODEV;
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1197 }
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1198
dc715452e914515 drivers/spi/spi-pl022.c Arnd Bergmann 2013-01-28 1199 static inline int pl022_dma_autoprobe(struct pl022 *pl022)
dc715452e914515 drivers/spi/spi-pl022.c Arnd Bergmann 2013-01-28 1200 {
dc715452e914515 drivers/spi/spi-pl022.c Arnd Bergmann 2013-01-28 1201 return 0;
dc715452e914515 drivers/spi/spi-pl022.c Arnd Bergmann 2013-01-28 1202 }
dc715452e914515 drivers/spi/spi-pl022.c Arnd Bergmann 2013-01-28 1203
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1204 static inline int pl022_dma_probe(struct pl022 *pl022)
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1205 {
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1206 return 0;
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1207 }
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1208
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1209 static inline void pl022_dma_remove(struct pl022 *pl022)
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1210 {
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1211 }
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1212 #endif
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1213
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1214 /**
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1215 * pl022_interrupt_handler - Interrupt handler for SSP controller
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1216 *
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1217 * This function handles interrupts generated for an interrupt based transfer.
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1218 * If a receive overrun (ROR) interrupt is there then we disable SSP, flag the
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1219 * current message's state as STATE_ERROR and schedule the tasklet
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1220 * pump_transfers which will do the postprocessing of the current message by
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1221 * calling giveback(). Otherwise it reads data from RX FIFO till there is no
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1222 * more data, and writes data in TX FIFO till it is not full. If we complete
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1223 * the transfer we move to the next transfer and schedule the tasklet.
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1224 */
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1225 static irqreturn_t pl022_interrupt_handler(int irq, void *dev_id)
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1226 {
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1227 struct pl022 *pl022 = dev_id;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1228 struct spi_message *msg = pl022->cur_msg;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1229 u16 irq_status = 0;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1230
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1231 if (unlikely(!msg)) {
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1232 dev_err(&pl022->adev->dev,
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1233 "bad message state in interrupt handler");
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1234 /* Never fail */
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1235 return IRQ_HANDLED;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1236 }
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1237
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1238 /* Read the Interrupt Status Register */
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1239 irq_status = readw(SSP_MIS(pl022->virtbase));
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1240
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1241 if (unlikely(!irq_status))
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1242 return IRQ_NONE;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1243
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1244 /*
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1245 * This handles the FIFO interrupts, the timeout
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1246 * interrupts are flatly ignored, they cannot be
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1247 * trusted.
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1248 */
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1249 if (unlikely(irq_status & SSP_MIS_MASK_RORMIS)) {
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1250 /*
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1251 * Overrun interrupt - bail out since our Data has been
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1252 * corrupted
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1253 */
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1254 dev_err(&pl022->adev->dev, "FIFO overrun\n");
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1255 if (readw(SSP_SR(pl022->virtbase)) & SSP_SR_MASK_RFF)
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1256 dev_err(&pl022->adev->dev,
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1257 "RXFIFO is full\n");
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1258
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1259 /*
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1260 * Disable and clear interrupts, disable SSP,
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1261 * mark message with bad status so it can be
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1262 * retried.
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1263 */
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1264 writew(DISABLE_ALL_INTERRUPTS,
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1265 SSP_IMSC(pl022->virtbase));
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1266 writew(CLEAR_ALL_INTERRUPTS, SSP_ICR(pl022->virtbase));
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1267 writew((readw(SSP_CR1(pl022->virtbase)) &
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1268 (~SSP_CR1_MASK_SSE)), SSP_CR1(pl022->virtbase));
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1269 msg->state = STATE_ERROR;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1270
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1271 /* Schedule message queue handler */
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1272 tasklet_schedule(&pl022->pump_transfers);
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1273 return IRQ_HANDLED;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1274 }
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1275
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1276 readwriter(pl022);
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1277
7183d1ebda477c4 drivers/spi/spi-pl022.c Alexander Sverdlin 2015-02-27 1278 if (pl022->tx == pl022->tx_end) {
172289df4004ccc drivers/spi/spi-pl022.c Chris Blair 2011-06-04 1279 /* Disable Transmit interrupt, enable receive interrupt */
172289df4004ccc drivers/spi/spi-pl022.c Chris Blair 2011-06-04 1280 writew((readw(SSP_IMSC(pl022->virtbase)) &
172289df4004ccc drivers/spi/spi-pl022.c Chris Blair 2011-06-04 1281 ~SSP_IMSC_MASK_TXIM) | SSP_IMSC_MASK_RXIM,
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1282 SSP_IMSC(pl022->virtbase));
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1283 }
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1284
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1285 /*
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1286 * Since all transactions must write as much as shall be read,
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1287 * we can conclude the entire transaction once RX is complete.
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1288 * At this point, all TX will always be finished.
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1289 */
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1290 if (pl022->rx >= pl022->rx_end) {
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1291 writew(DISABLE_ALL_INTERRUPTS,
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1292 SSP_IMSC(pl022->virtbase));
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1293 writew(CLEAR_ALL_INTERRUPTS, SSP_ICR(pl022->virtbase));
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1294 if (unlikely(pl022->rx > pl022->rx_end)) {
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1295 dev_warn(&pl022->adev->dev, "read %u surplus "
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1296 "bytes (did you request an odd "
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1297 "number of bytes on a 16bit bus?)\n",
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1298 (u32) (pl022->rx - pl022->rx_end));
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1299 }
25985edcedea639 drivers/spi/amba-pl022.c Lucas De Marchi 2011-03-30 1300 /* Update total bytes transferred */
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1301 msg->actual_length += pl022->cur_transfer->len;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1302 /* Move to next transfer */
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1303 msg->state = next_transfer(pl022);
c0b07605f1a0285 drivers/spi/spi-pl022.c Fredrik Ternerot 2018-11-13 1304 if (msg->state != STATE_DONE && pl022->cur_transfer->cs_change)
c0b07605f1a0285 drivers/spi/spi-pl022.c Fredrik Ternerot 2018-11-13 1305 pl022_cs_control(pl022, SSP_CHIP_DESELECT);
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1306 tasklet_schedule(&pl022->pump_transfers);
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1307 return IRQ_HANDLED;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1308 }
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1309
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1310 return IRQ_HANDLED;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1311 }
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1312
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1313 /**
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1314 * This sets up the pointers to memory for the next message to
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1315 * send out on the SPI bus.
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1316 */
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1317 static int set_up_next_transfer(struct pl022 *pl022,
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1318 struct spi_transfer *transfer)
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1319 {
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1320 int residue;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1321
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1322 /* Sanity check the message for this bus width */
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1323 residue = pl022->cur_transfer->len % pl022->cur_chip->n_bytes;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1324 if (unlikely(residue != 0)) {
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1325 dev_err(&pl022->adev->dev,
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1326 "message of %u bytes to transmit but the current "
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1327 "chip bus has a data width of %u bytes!\n",
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1328 pl022->cur_transfer->len,
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1329 pl022->cur_chip->n_bytes);
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1330 dev_err(&pl022->adev->dev, "skipping this message\n");
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1331 return -EIO;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1332 }
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1333 pl022->tx = (void *)transfer->tx_buf;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1334 pl022->tx_end = pl022->tx + pl022->cur_transfer->len;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1335 pl022->rx = (void *)transfer->rx_buf;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1336 pl022->rx_end = pl022->rx + pl022->cur_transfer->len;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1337 pl022->write =
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1338 pl022->tx ? pl022->cur_chip->write : WRITING_NULL;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1339 pl022->read = pl022->rx ? pl022->cur_chip->read : READING_NULL;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1340 return 0;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1341 }
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1342
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1343 /**
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1344 * pump_transfers - Tasklet function which schedules next transfer
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1345 * when running in interrupt or DMA transfer mode.
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1346 * @data: SSP driver private data structure
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1347 *
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1348 */
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1349 static void pump_transfers(unsigned long data)
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1350 {
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1351 struct pl022 *pl022 = (struct pl022 *) data;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1352 struct spi_message *message = NULL;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1353 struct spi_transfer *transfer = NULL;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1354 struct spi_transfer *previous = NULL;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1355
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1356 /* Get current state information */
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1357 message = pl022->cur_msg;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1358 transfer = pl022->cur_transfer;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1359
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1360 /* Handle for abort */
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1361 if (message->state == STATE_ERROR) {
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1362 message->status = -EIO;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1363 giveback(pl022);
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1364 return;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1365 }
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1366
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1367 /* Handle end of message */
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1368 if (message->state == STATE_DONE) {
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1369 message->status = 0;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1370 giveback(pl022);
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1371 return;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1372 }
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1373
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1374 /* Delay if requested at end of transfer before CS change */
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1375 if (message->state == STATE_RUNNING) {
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1376 previous = list_entry(transfer->transfer_list.prev,
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1377 struct spi_transfer,
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1378 transfer_list);
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1379 if (previous->delay_usecs)
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1380 /*
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1381 * FIXME: This runs in interrupt context.
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1382 * Is this really smart?
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1383 */
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1384 udelay(previous->delay_usecs);
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1385
8b8d719161c3866 drivers/spi/spi-pl022.c Virupax Sadashivpetimath 2011-11-10 1386 /* Reselect chip select only if cs_change was requested */
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1387 if (previous->cs_change)
f6f46de1063c882 drivers/spi/spi-pl022.c Roland Stigge 2012-08-22 1388 pl022_cs_control(pl022, SSP_CHIP_SELECT);
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1389 } else {
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1390 /* STATE_START */
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1391 message->state = STATE_RUNNING;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1392 }
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1393
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1394 if (set_up_next_transfer(pl022, transfer)) {
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1395 message->state = STATE_ERROR;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1396 message->status = -EIO;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1397 giveback(pl022);
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1398 return;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1399 }
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1400 /* Flush the FIFOs and let's go! */
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1401 flush(pl022);
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1402
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1403 if (pl022->cur_chip->enable_dma) {
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1404 if (configure_dma(pl022)) {
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1405 dev_dbg(&pl022->adev->dev,
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1406 "configuration of DMA failed, fall back to interrupt mode\n");
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1407 goto err_config_dma;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1408 }
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1409 return;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1410 }
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1411
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1412 err_config_dma:
172289df4004ccc drivers/spi/spi-pl022.c Chris Blair 2011-06-04 1413 /* enable all interrupts except RX */
172289df4004ccc drivers/spi/spi-pl022.c Chris Blair 2011-06-04 1414 writew(ENABLE_ALL_INTERRUPTS & ~SSP_IMSC_MASK_RXIM, SSP_IMSC(pl022->virtbase));
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1415 }
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1416
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1417 static void do_interrupt_dma_transfer(struct pl022 *pl022)
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1418 {
172289df4004ccc drivers/spi/spi-pl022.c Chris Blair 2011-06-04 1419 /*
172289df4004ccc drivers/spi/spi-pl022.c Chris Blair 2011-06-04 1420 * Default is to enable all interrupts except RX -
172289df4004ccc drivers/spi/spi-pl022.c Chris Blair 2011-06-04 1421 * this will be enabled once TX is complete
172289df4004ccc drivers/spi/spi-pl022.c Chris Blair 2011-06-04 1422 */
d555ea05f9d8ebf drivers/spi/spi-pl022.c Mark Brown 2014-08-01 1423 u32 irqflags = (u32)(ENABLE_ALL_INTERRUPTS & ~SSP_IMSC_MASK_RXIM);
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1424
8b8d719161c3866 drivers/spi/spi-pl022.c Virupax Sadashivpetimath 2011-11-10 1425 /* Enable target chip, if not already active */
8b8d719161c3866 drivers/spi/spi-pl022.c Virupax Sadashivpetimath 2011-11-10 1426 if (!pl022->next_msg_cs_active)
f6f46de1063c882 drivers/spi/spi-pl022.c Roland Stigge 2012-08-22 1427 pl022_cs_control(pl022, SSP_CHIP_SELECT);
8b8d719161c3866 drivers/spi/spi-pl022.c Virupax Sadashivpetimath 2011-11-10 1428
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1429 if (set_up_next_transfer(pl022, pl022->cur_transfer)) {
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1430 /* Error path */
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1431 pl022->cur_msg->state = STATE_ERROR;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1432 pl022->cur_msg->status = -EIO;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1433 giveback(pl022);
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1434 return;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1435 }
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1436 /* If we're using DMA, set up DMA here */
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1437 if (pl022->cur_chip->enable_dma) {
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1438 /* Configure DMA transfer */
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1439 if (configure_dma(pl022)) {
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1440 dev_dbg(&pl022->adev->dev,
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1441 "configuration of DMA failed, fall back to interrupt mode\n");
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1442 goto err_config_dma;
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1443 }
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1444 /* Disable interrupts in DMA mode, IRQ from DMA controller */
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1445 irqflags = DISABLE_ALL_INTERRUPTS;
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1446 }
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1447 err_config_dma:
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1448 /* Enable SSP, turn on interrupts */
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1449 writew((readw(SSP_CR1(pl022->virtbase)) | SSP_CR1_MASK_SSE),
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1450 SSP_CR1(pl022->virtbase));
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1451 writew(irqflags, SSP_IMSC(pl022->virtbase));
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1452 }
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1453
7aef2b646b24247 drivers/spi/spi-pl022.c Jiwei Sun 2019-01-18 1454 static void print_current_status(struct pl022 *pl022)
7aef2b646b24247 drivers/spi/spi-pl022.c Jiwei Sun 2019-01-18 1455 {
7aef2b646b24247 drivers/spi/spi-pl022.c Jiwei Sun 2019-01-18 1456 u32 read_cr0;
7aef2b646b24247 drivers/spi/spi-pl022.c Jiwei Sun 2019-01-18 1457 u16 read_cr1, read_dmacr, read_sr;
7aef2b646b24247 drivers/spi/spi-pl022.c Jiwei Sun 2019-01-18 1458
7aef2b646b24247 drivers/spi/spi-pl022.c Jiwei Sun 2019-01-18 1459 if (pl022->vendor->extended_cr)
7aef2b646b24247 drivers/spi/spi-pl022.c Jiwei Sun 2019-01-18 1460 read_cr0 = readl(SSP_CR0(pl022->virtbase));
7aef2b646b24247 drivers/spi/spi-pl022.c Jiwei Sun 2019-01-18 1461 else
7aef2b646b24247 drivers/spi/spi-pl022.c Jiwei Sun 2019-01-18 1462 read_cr0 = readw(SSP_CR0(pl022->virtbase));
7aef2b646b24247 drivers/spi/spi-pl022.c Jiwei Sun 2019-01-18 1463 read_cr1 = readw(SSP_CR1(pl022->virtbase));
7aef2b646b24247 drivers/spi/spi-pl022.c Jiwei Sun 2019-01-18 1464 read_dmacr = readw(SSP_DMACR(pl022->virtbase));
7aef2b646b24247 drivers/spi/spi-pl022.c Jiwei Sun 2019-01-18 1465 read_sr = readw(SSP_SR(pl022->virtbase));
7aef2b646b24247 drivers/spi/spi-pl022.c Jiwei Sun 2019-01-18 1466
7aef2b646b24247 drivers/spi/spi-pl022.c Jiwei Sun 2019-01-18 1467 dev_warn(&pl022->adev->dev, "spi-pl022 CR0: %x\n", read_cr0);
7aef2b646b24247 drivers/spi/spi-pl022.c Jiwei Sun 2019-01-18 1468 dev_warn(&pl022->adev->dev, "spi-pl022 CR1: %x\n", read_cr1);
7aef2b646b24247 drivers/spi/spi-pl022.c Jiwei Sun 2019-01-18 1469 dev_warn(&pl022->adev->dev, "spi-pl022 DMACR: %x\n", read_dmacr);
7aef2b646b24247 drivers/spi/spi-pl022.c Jiwei Sun 2019-01-18 1470 dev_warn(&pl022->adev->dev, "spi-pl022 SR: %x\n", read_sr);
7aef2b646b24247 drivers/spi/spi-pl022.c Jiwei Sun 2019-01-18 1471 dev_warn(&pl022->adev->dev,
7aef2b646b24247 drivers/spi/spi-pl022.c Jiwei Sun 2019-01-18 1472 "spi-pl022 exp_fifo_level/fifodepth: %u/%d\n",
7aef2b646b24247 drivers/spi/spi-pl022.c Jiwei Sun 2019-01-18 1473 pl022->exp_fifo_level,
7aef2b646b24247 drivers/spi/spi-pl022.c Jiwei Sun 2019-01-18 1474 pl022->vendor->fifodepth);
7aef2b646b24247 drivers/spi/spi-pl022.c Jiwei Sun 2019-01-18 1475
7aef2b646b24247 drivers/spi/spi-pl022.c Jiwei Sun 2019-01-18 1476 }
7aef2b646b24247 drivers/spi/spi-pl022.c Jiwei Sun 2019-01-18 1477
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1478 static void do_polling_transfer(struct pl022 *pl022)
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1479 {
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1480 struct spi_message *message = NULL;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1481 struct spi_transfer *transfer = NULL;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1482 struct spi_transfer *previous = NULL;
a18c266f8e43004 drivers/spi/amba-pl022.c Magnus Templing 2011-05-19 1483 unsigned long time, timeout;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1484
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1485 message = pl022->cur_msg;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1486
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1487 while (message->state != STATE_DONE) {
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1488 /* Handle for abort */
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1489 if (message->state == STATE_ERROR)
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1490 break;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1491 transfer = pl022->cur_transfer;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1492
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1493 /* Delay if requested at end of transfer */
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1494 if (message->state == STATE_RUNNING) {
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1495 previous =
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1496 list_entry(transfer->transfer_list.prev,
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1497 struct spi_transfer, transfer_list);
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1498 if (previous->delay_usecs)
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1499 udelay(previous->delay_usecs);
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1500 if (previous->cs_change)
f6f46de1063c882 drivers/spi/spi-pl022.c Roland Stigge 2012-08-22 1501 pl022_cs_control(pl022, SSP_CHIP_SELECT);
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1502 } else {
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1503 /* STATE_START */
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1504 message->state = STATE_RUNNING;
8b8d719161c3866 drivers/spi/spi-pl022.c Virupax Sadashivpetimath 2011-11-10 1505 if (!pl022->next_msg_cs_active)
f6f46de1063c882 drivers/spi/spi-pl022.c Roland Stigge 2012-08-22 1506 pl022_cs_control(pl022, SSP_CHIP_SELECT);
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1507 }
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1508
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1509 /* Configuration Changing Per Transfer */
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1510 if (set_up_next_transfer(pl022, transfer)) {
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1511 /* Error path */
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1512 message->state = STATE_ERROR;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1513 break;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1514 }
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1515 /* Flush FIFOs and enable SSP */
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1516 flush(pl022);
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1517 writew((readw(SSP_CR1(pl022->virtbase)) | SSP_CR1_MASK_SSE),
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1518 SSP_CR1(pl022->virtbase));
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1519
556f4aeb7d9dfac drivers/spi/amba-pl022.c Linus Walleij 2010-05-05 1520 dev_dbg(&pl022->adev->dev, "polling transfer ongoing ...\n");
a18c266f8e43004 drivers/spi/amba-pl022.c Magnus Templing 2011-05-19 1521
a18c266f8e43004 drivers/spi/amba-pl022.c Magnus Templing 2011-05-19 1522 timeout = jiffies + msecs_to_jiffies(SPI_POLLING_TIMEOUT);
a18c266f8e43004 drivers/spi/amba-pl022.c Magnus Templing 2011-05-19 1523 while (pl022->tx < pl022->tx_end || pl022->rx < pl022->rx_end) {
a18c266f8e43004 drivers/spi/amba-pl022.c Magnus Templing 2011-05-19 1524 time = jiffies;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1525 readwriter(pl022);
a18c266f8e43004 drivers/spi/amba-pl022.c Magnus Templing 2011-05-19 1526 if (time_after(time, timeout)) {
a18c266f8e43004 drivers/spi/amba-pl022.c Magnus Templing 2011-05-19 1527 dev_warn(&pl022->adev->dev,
a18c266f8e43004 drivers/spi/amba-pl022.c Magnus Templing 2011-05-19 1528 "%s: timeout!\n", __func__);
7aef2b646b24247 drivers/spi/spi-pl022.c Jiwei Sun 2019-01-18 1529 message->state = STATE_TIMEOUT;
7aef2b646b24247 drivers/spi/spi-pl022.c Jiwei Sun 2019-01-18 1530 print_current_status(pl022);
a18c266f8e43004 drivers/spi/amba-pl022.c Magnus Templing 2011-05-19 1531 goto out;
a18c266f8e43004 drivers/spi/amba-pl022.c Magnus Templing 2011-05-19 1532 }
521999bd4a8c47a drivers/spi/amba-pl022.c Linus Walleij 2011-05-19 1533 cpu_relax();
a18c266f8e43004 drivers/spi/amba-pl022.c Magnus Templing 2011-05-19 1534 }
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1535
25985edcedea639 drivers/spi/amba-pl022.c Lucas De Marchi 2011-03-30 1536 /* Update total byte transferred */
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1537 message->actual_length += pl022->cur_transfer->len;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1538 /* Move to next transfer */
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1539 message->state = next_transfer(pl022);
c0b07605f1a0285 drivers/spi/spi-pl022.c Fredrik Ternerot 2018-11-13 1540 if (message->state != STATE_DONE
c0b07605f1a0285 drivers/spi/spi-pl022.c Fredrik Ternerot 2018-11-13 1541 && pl022->cur_transfer->cs_change)
c0b07605f1a0285 drivers/spi/spi-pl022.c Fredrik Ternerot 2018-11-13 1542 pl022_cs_control(pl022, SSP_CHIP_DESELECT);
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1543 }
a18c266f8e43004 drivers/spi/amba-pl022.c Magnus Templing 2011-05-19 1544 out:
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1545 /* Handle end of message */
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1546 if (message->state == STATE_DONE)
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1547 message->status = 0;
7aef2b646b24247 drivers/spi/spi-pl022.c Jiwei Sun 2019-01-18 1548 else if (message->state == STATE_TIMEOUT)
7aef2b646b24247 drivers/spi/spi-pl022.c Jiwei Sun 2019-01-18 1549 message->status = -EAGAIN;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1550 else
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1551 message->status = -EIO;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1552
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1553 giveback(pl022);
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1554 return;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1555 }
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1556
ffbbdd21329f3e1 drivers/spi/spi-pl022.c Linus Walleij 2012-02-22 1557 static int pl022_transfer_one_message(struct spi_master *master,
ffbbdd21329f3e1 drivers/spi/spi-pl022.c Linus Walleij 2012-02-22 1558 struct spi_message *msg)
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1559 {
ffbbdd21329f3e1 drivers/spi/spi-pl022.c Linus Walleij 2012-02-22 1560 struct pl022 *pl022 = spi_master_get_devdata(master);
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1561
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1562 /* Initial message state */
ffbbdd21329f3e1 drivers/spi/spi-pl022.c Linus Walleij 2012-02-22 1563 pl022->cur_msg = msg;
ffbbdd21329f3e1 drivers/spi/spi-pl022.c Linus Walleij 2012-02-22 1564 msg->state = STATE_START;
ffbbdd21329f3e1 drivers/spi/spi-pl022.c Linus Walleij 2012-02-22 1565
ffbbdd21329f3e1 drivers/spi/spi-pl022.c Linus Walleij 2012-02-22 1566 pl022->cur_transfer = list_entry(msg->transfers.next,
f1e45f86ed93b9e drivers/spi/spi-pl022.c Viresh Kumar 2011-08-10 1567 struct spi_transfer, transfer_list);
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1568
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1569 /* Setup the SPI using the per chip configuration */
ffbbdd21329f3e1 drivers/spi/spi-pl022.c Linus Walleij 2012-02-22 1570 pl022->cur_chip = spi_get_ctldata(msg->spi);
f6f46de1063c882 drivers/spi/spi-pl022.c Roland Stigge 2012-08-22 1571 pl022->cur_cs = pl022->chipselects[msg->spi->chip_select];
d4b6af2e0e29278 drivers/spi/spi-pl022.c Chris Blair 2011-11-04 1572
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1573 restore_state(pl022);
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1574 flush(pl022);
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1575
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1576 if (pl022->cur_chip->xfer_type == POLLING_TRANSFER)
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1577 do_polling_transfer(pl022);
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1578 else
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1579 do_interrupt_dma_transfer(pl022);
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1580
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1581 return 0;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1582 }
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1583
ffbbdd21329f3e1 drivers/spi/spi-pl022.c Linus Walleij 2012-02-22 1584 static int pl022_unprepare_transfer_hardware(struct spi_master *master)
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1585 {
ffbbdd21329f3e1 drivers/spi/spi-pl022.c Linus Walleij 2012-02-22 1586 struct pl022 *pl022 = spi_master_get_devdata(master);
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1587
ffbbdd21329f3e1 drivers/spi/spi-pl022.c Linus Walleij 2012-02-22 1588 /* nothing more to do - disable spi/ssp and power off */
ffbbdd21329f3e1 drivers/spi/spi-pl022.c Linus Walleij 2012-02-22 1589 writew((readw(SSP_CR1(pl022->virtbase)) &
ffbbdd21329f3e1 drivers/spi/spi-pl022.c Linus Walleij 2012-02-22 1590 (~SSP_CR1_MASK_SSE)), SSP_CR1(pl022->virtbase));
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1591
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1592 return 0;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1593 }
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1594
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1595 static int verify_controller_parameters(struct pl022 *pl022,
f9d629c737cb668 drivers/spi/amba-pl022.c Linus Walleij 2010-10-01 1596 struct pl022_config_chip const *chip_info)
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1597 {
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1598 if ((chip_info->iface < SSP_INTERFACE_MOTOROLA_SPI)
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1599 || (chip_info->iface > SSP_INTERFACE_UNIDIRECTIONAL)) {
5a1c98be1de165c drivers/spi/amba-pl022.c Linus Walleij 2010-10-01 1600 dev_err(&pl022->adev->dev,
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1601 "interface is configured incorrectly\n");
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1602 return -EINVAL;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1603 }
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1604 if ((chip_info->iface == SSP_INTERFACE_UNIDIRECTIONAL) &&
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1605 (!pl022->vendor->unidir)) {
5a1c98be1de165c drivers/spi/amba-pl022.c Linus Walleij 2010-10-01 1606 dev_err(&pl022->adev->dev,
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1607 "unidirectional mode not supported in this "
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1608 "hardware version\n");
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1609 return -EINVAL;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1610 }
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1611 if ((chip_info->hierarchy != SSP_MASTER)
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1612 && (chip_info->hierarchy != SSP_SLAVE)) {
5a1c98be1de165c drivers/spi/amba-pl022.c Linus Walleij 2010-10-01 1613 dev_err(&pl022->adev->dev,
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1614 "hierarchy is configured incorrectly\n");
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1615 return -EINVAL;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1616 }
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1617 if ((chip_info->com_mode != INTERRUPT_TRANSFER)
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1618 && (chip_info->com_mode != DMA_TRANSFER)
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1619 && (chip_info->com_mode != POLLING_TRANSFER)) {
5a1c98be1de165c drivers/spi/amba-pl022.c Linus Walleij 2010-10-01 1620 dev_err(&pl022->adev->dev,
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1621 "Communication mode is configured incorrectly\n");
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1622 return -EINVAL;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1623 }
78b2b911bf70203 drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 1624 switch (chip_info->rx_lev_trig) {
78b2b911bf70203 drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 1625 case SSP_RX_1_OR_MORE_ELEM:
78b2b911bf70203 drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 1626 case SSP_RX_4_OR_MORE_ELEM:
78b2b911bf70203 drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 1627 case SSP_RX_8_OR_MORE_ELEM:
78b2b911bf70203 drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 1628 /* These are always OK, all variants can handle this */
78b2b911bf70203 drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 1629 break;
78b2b911bf70203 drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 1630 case SSP_RX_16_OR_MORE_ELEM:
78b2b911bf70203 drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 1631 if (pl022->vendor->fifodepth < 16) {
78b2b911bf70203 drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 1632 dev_err(&pl022->adev->dev,
78b2b911bf70203 drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 1633 "RX FIFO Trigger Level is configured incorrectly\n");
78b2b911bf70203 drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 1634 return -EINVAL;
78b2b911bf70203 drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 1635 }
78b2b911bf70203 drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 1636 break;
78b2b911bf70203 drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 1637 case SSP_RX_32_OR_MORE_ELEM:
78b2b911bf70203 drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 1638 if (pl022->vendor->fifodepth < 32) {
5a1c98be1de165c drivers/spi/amba-pl022.c Linus Walleij 2010-10-01 1639 dev_err(&pl022->adev->dev,
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1640 "RX FIFO Trigger Level is configured incorrectly\n");
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1641 return -EINVAL;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1642 }
78b2b911bf70203 drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 1643 break;
78b2b911bf70203 drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 1644 default:
78b2b911bf70203 drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 1645 dev_err(&pl022->adev->dev,
78b2b911bf70203 drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 1646 "RX FIFO Trigger Level is configured incorrectly\n");
78b2b911bf70203 drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 1647 return -EINVAL;
78b2b911bf70203 drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 1648 }
78b2b911bf70203 drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 1649 switch (chip_info->tx_lev_trig) {
78b2b911bf70203 drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 1650 case SSP_TX_1_OR_MORE_EMPTY_LOC:
78b2b911bf70203 drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 1651 case SSP_TX_4_OR_MORE_EMPTY_LOC:
78b2b911bf70203 drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 1652 case SSP_TX_8_OR_MORE_EMPTY_LOC:
78b2b911bf70203 drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 1653 /* These are always OK, all variants can handle this */
78b2b911bf70203 drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 1654 break;
78b2b911bf70203 drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 1655 case SSP_TX_16_OR_MORE_EMPTY_LOC:
78b2b911bf70203 drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 1656 if (pl022->vendor->fifodepth < 16) {
78b2b911bf70203 drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 1657 dev_err(&pl022->adev->dev,
78b2b911bf70203 drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 1658 "TX FIFO Trigger Level is configured incorrectly\n");
78b2b911bf70203 drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 1659 return -EINVAL;
78b2b911bf70203 drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 1660 }
78b2b911bf70203 drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 1661 break;
78b2b911bf70203 drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 1662 case SSP_TX_32_OR_MORE_EMPTY_LOC:
78b2b911bf70203 drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 1663 if (pl022->vendor->fifodepth < 32) {
5a1c98be1de165c drivers/spi/amba-pl022.c Linus Walleij 2010-10-01 1664 dev_err(&pl022->adev->dev,
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1665 "TX FIFO Trigger Level is configured incorrectly\n");
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1666 return -EINVAL;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1667 }
78b2b911bf70203 drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 1668 break;
78b2b911bf70203 drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 1669 default:
78b2b911bf70203 drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 1670 dev_err(&pl022->adev->dev,
78b2b911bf70203 drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 1671 "TX FIFO Trigger Level is configured incorrectly\n");
78b2b911bf70203 drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 1672 return -EINVAL;
78b2b911bf70203 drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 1673 }
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1674 if (chip_info->iface == SSP_INTERFACE_NATIONAL_MICROWIRE) {
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1675 if ((chip_info->ctrl_len < SSP_BITS_4)
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1676 || (chip_info->ctrl_len > SSP_BITS_32)) {
5a1c98be1de165c drivers/spi/amba-pl022.c Linus Walleij 2010-10-01 1677 dev_err(&pl022->adev->dev,
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1678 "CTRL LEN is configured incorrectly\n");
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1679 return -EINVAL;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1680 }
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1681 if ((chip_info->wait_state != SSP_MWIRE_WAIT_ZERO)
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1682 && (chip_info->wait_state != SSP_MWIRE_WAIT_ONE)) {
5a1c98be1de165c drivers/spi/amba-pl022.c Linus Walleij 2010-10-01 1683 dev_err(&pl022->adev->dev,
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1684 "Wait State is configured incorrectly\n");
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1685 return -EINVAL;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1686 }
556f4aeb7d9dfac drivers/spi/amba-pl022.c Linus Walleij 2010-05-05 1687 /* Half duplex is only available in the ST Micro version */
556f4aeb7d9dfac drivers/spi/amba-pl022.c Linus Walleij 2010-05-05 1688 if (pl022->vendor->extended_cr) {
556f4aeb7d9dfac drivers/spi/amba-pl022.c Linus Walleij 2010-05-05 1689 if ((chip_info->duplex !=
556f4aeb7d9dfac drivers/spi/amba-pl022.c Linus Walleij 2010-05-05 1690 SSP_MICROWIRE_CHANNEL_FULL_DUPLEX)
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1691 && (chip_info->duplex !=
4a4fd47155ac49b drivers/spi/amba-pl022.c Julia Lawall 2010-09-29 1692 SSP_MICROWIRE_CHANNEL_HALF_DUPLEX)) {
5a1c98be1de165c drivers/spi/amba-pl022.c Linus Walleij 2010-10-01 1693 dev_err(&pl022->adev->dev,
556f4aeb7d9dfac drivers/spi/amba-pl022.c Linus Walleij 2010-05-05 1694 "Microwire duplex mode is configured incorrectly\n");
556f4aeb7d9dfac drivers/spi/amba-pl022.c Linus Walleij 2010-05-05 1695 return -EINVAL;
4a4fd47155ac49b drivers/spi/amba-pl022.c Julia Lawall 2010-09-29 1696 }
556f4aeb7d9dfac drivers/spi/amba-pl022.c Linus Walleij 2010-05-05 1697 } else {
556f4aeb7d9dfac drivers/spi/amba-pl022.c Linus Walleij 2010-05-05 1698 if (chip_info->duplex != SSP_MICROWIRE_CHANNEL_FULL_DUPLEX)
5a1c98be1de165c drivers/spi/amba-pl022.c Linus Walleij 2010-10-01 1699 dev_err(&pl022->adev->dev,
556f4aeb7d9dfac drivers/spi/amba-pl022.c Linus Walleij 2010-05-05 1700 "Microwire half duplex mode requested,"
556f4aeb7d9dfac drivers/spi/amba-pl022.c Linus Walleij 2010-05-05 1701 " but this is only available in the"
556f4aeb7d9dfac drivers/spi/amba-pl022.c Linus Walleij 2010-05-05 1702 " ST version of PL022\n");
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1703 return -EINVAL;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1704 }
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1705 }
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1706 return 0;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1707 }
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1708
0379b2a33a8a03d drivers/spi/spi-pl022.c Viresh Kumar 2011-08-10 1709 static inline u32 spi_rate(u32 rate, u16 cpsdvsr, u16 scr)
0379b2a33a8a03d drivers/spi/spi-pl022.c Viresh Kumar 2011-08-10 1710 {
0379b2a33a8a03d drivers/spi/spi-pl022.c Viresh Kumar 2011-08-10 1711 return rate / (cpsdvsr * (1 + scr));
0379b2a33a8a03d drivers/spi/spi-pl022.c Viresh Kumar 2011-08-10 1712 }
0379b2a33a8a03d drivers/spi/spi-pl022.c Viresh Kumar 2011-08-10 1713
0379b2a33a8a03d drivers/spi/spi-pl022.c Viresh Kumar 2011-08-10 1714 static int calculate_effective_freq(struct pl022 *pl022, int freq, struct
0379b2a33a8a03d drivers/spi/spi-pl022.c Viresh Kumar 2011-08-10 1715 ssp_clock_params * clk_freq)
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1716 {
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1717 /* Lets calculate the frequency parameters */
0379b2a33a8a03d drivers/spi/spi-pl022.c Viresh Kumar 2011-08-10 1718 u16 cpsdvsr = CPSDVR_MIN, scr = SCR_MIN;
0379b2a33a8a03d drivers/spi/spi-pl022.c Viresh Kumar 2011-08-10 1719 u32 rate, max_tclk, min_tclk, best_freq = 0, best_cpsdvsr = 0,
0379b2a33a8a03d drivers/spi/spi-pl022.c Viresh Kumar 2011-08-10 1720 best_scr = 0, tmp, found = 0;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1721
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1722 rate = clk_get_rate(pl022->clk);
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1723 /* cpsdvscr = 2 & scr 0 */
0379b2a33a8a03d drivers/spi/spi-pl022.c Viresh Kumar 2011-08-10 1724 max_tclk = spi_rate(rate, CPSDVR_MIN, SCR_MIN);
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1725 /* cpsdvsr = 254 & scr = 255 */
0379b2a33a8a03d drivers/spi/spi-pl022.c Viresh Kumar 2011-08-10 1726 min_tclk = spi_rate(rate, CPSDVR_MAX, SCR_MAX);
0379b2a33a8a03d drivers/spi/spi-pl022.c Viresh Kumar 2011-08-10 1727
ea505bc99f77f3f drivers/spi/spi-pl022.c Viresh Kumar 2012-04-19 1728 if (freq > max_tclk)
ea505bc99f77f3f drivers/spi/spi-pl022.c Viresh Kumar 2012-04-19 1729 dev_warn(&pl022->adev->dev,
ea505bc99f77f3f drivers/spi/spi-pl022.c Viresh Kumar 2012-04-19 1730 "Max speed that can be programmed is %d Hz, you requested %d\n",
ea505bc99f77f3f drivers/spi/spi-pl022.c Viresh Kumar 2012-04-19 1731 max_tclk, freq);
ea505bc99f77f3f drivers/spi/spi-pl022.c Viresh Kumar 2012-04-19 1732
ea505bc99f77f3f drivers/spi/spi-pl022.c Viresh Kumar 2012-04-19 1733 if (freq < min_tclk) {
0379b2a33a8a03d drivers/spi/spi-pl022.c Viresh Kumar 2011-08-10 1734 dev_err(&pl022->adev->dev,
ea505bc99f77f3f drivers/spi/spi-pl022.c Viresh Kumar 2012-04-19 1735 "Requested frequency: %d Hz is less than minimum possible %d Hz\n",
ea505bc99f77f3f drivers/spi/spi-pl022.c Viresh Kumar 2012-04-19 1736 freq, min_tclk);
0379b2a33a8a03d drivers/spi/spi-pl022.c Viresh Kumar 2011-08-10 1737 return -EINVAL;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1738 }
0379b2a33a8a03d drivers/spi/spi-pl022.c Viresh Kumar 2011-08-10 1739
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1740 /*
0379b2a33a8a03d drivers/spi/spi-pl022.c Viresh Kumar 2011-08-10 1741 * best_freq will give closest possible available rate (<= requested
0379b2a33a8a03d drivers/spi/spi-pl022.c Viresh Kumar 2011-08-10 1742 * freq) for all values of scr & cpsdvsr.
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1743 */
0379b2a33a8a03d drivers/spi/spi-pl022.c Viresh Kumar 2011-08-10 1744 while ((cpsdvsr <= CPSDVR_MAX) && !found) {
0379b2a33a8a03d drivers/spi/spi-pl022.c Viresh Kumar 2011-08-10 1745 while (scr <= SCR_MAX) {
0379b2a33a8a03d drivers/spi/spi-pl022.c Viresh Kumar 2011-08-10 1746 tmp = spi_rate(rate, cpsdvsr, scr);
0379b2a33a8a03d drivers/spi/spi-pl022.c Viresh Kumar 2011-08-10 1747
5eb806a3a68920a drivers/spi/spi-pl022.c Viresh Kumar 2012-04-19 1748 if (tmp > freq) {
5eb806a3a68920a drivers/spi/spi-pl022.c Viresh Kumar 2012-04-19 1749 /* we need lower freq */
0379b2a33a8a03d drivers/spi/spi-pl022.c Viresh Kumar 2011-08-10 1750 scr++;
5eb806a3a68920a drivers/spi/spi-pl022.c Viresh Kumar 2012-04-19 1751 continue;
5eb806a3a68920a drivers/spi/spi-pl022.c Viresh Kumar 2012-04-19 1752 }
5eb806a3a68920a drivers/spi/spi-pl022.c Viresh Kumar 2012-04-19 1753
0379b2a33a8a03d drivers/spi/spi-pl022.c Viresh Kumar 2011-08-10 1754 /*
5eb806a3a68920a drivers/spi/spi-pl022.c Viresh Kumar 2012-04-19 1755 * If found exact value, mark found and break.
5eb806a3a68920a drivers/spi/spi-pl022.c Viresh Kumar 2012-04-19 1756 * If found more closer value, update and break.
0379b2a33a8a03d drivers/spi/spi-pl022.c Viresh Kumar 2011-08-10 1757 */
5eb806a3a68920a drivers/spi/spi-pl022.c Viresh Kumar 2012-04-19 1758 if (tmp > best_freq) {
0379b2a33a8a03d drivers/spi/spi-pl022.c Viresh Kumar 2011-08-10 1759 best_freq = tmp;
0379b2a33a8a03d drivers/spi/spi-pl022.c Viresh Kumar 2011-08-10 1760 best_cpsdvsr = cpsdvsr;
0379b2a33a8a03d drivers/spi/spi-pl022.c Viresh Kumar 2011-08-10 1761 best_scr = scr;
0379b2a33a8a03d drivers/spi/spi-pl022.c Viresh Kumar 2011-08-10 1762
0379b2a33a8a03d drivers/spi/spi-pl022.c Viresh Kumar 2011-08-10 1763 if (tmp == freq)
5eb806a3a68920a drivers/spi/spi-pl022.c Viresh Kumar 2012-04-19 1764 found = 1;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1765 }
5eb806a3a68920a drivers/spi/spi-pl022.c Viresh Kumar 2012-04-19 1766 /*
5eb806a3a68920a drivers/spi/spi-pl022.c Viresh Kumar 2012-04-19 1767 * increased scr will give lower rates, which are not
5eb806a3a68920a drivers/spi/spi-pl022.c Viresh Kumar 2012-04-19 1768 * required
5eb806a3a68920a drivers/spi/spi-pl022.c Viresh Kumar 2012-04-19 1769 */
5eb806a3a68920a drivers/spi/spi-pl022.c Viresh Kumar 2012-04-19 1770 break;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1771 }
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1772 cpsdvsr += 2;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1773 scr = SCR_MIN;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1774 }
0379b2a33a8a03d drivers/spi/spi-pl022.c Viresh Kumar 2011-08-10 1775
5eb806a3a68920a drivers/spi/spi-pl022.c Viresh Kumar 2012-04-19 1776 WARN(!best_freq, "pl022: Matching cpsdvsr and scr not found for %d Hz rate \n",
5eb806a3a68920a drivers/spi/spi-pl022.c Viresh Kumar 2012-04-19 1777 freq);
5eb806a3a68920a drivers/spi/spi-pl022.c Viresh Kumar 2012-04-19 1778
0379b2a33a8a03d drivers/spi/spi-pl022.c Viresh Kumar 2011-08-10 1779 clk_freq->cpsdvsr = (u8) (best_cpsdvsr & 0xFF);
0379b2a33a8a03d drivers/spi/spi-pl022.c Viresh Kumar 2011-08-10 1780 clk_freq->scr = (u8) (best_scr & 0xFF);
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1781 dev_dbg(&pl022->adev->dev,
0379b2a33a8a03d drivers/spi/spi-pl022.c Viresh Kumar 2011-08-10 1782 "SSP Target Frequency is: %u, Effective Frequency is %u\n",
0379b2a33a8a03d drivers/spi/spi-pl022.c Viresh Kumar 2011-08-10 1783 freq, best_freq);
0379b2a33a8a03d drivers/spi/spi-pl022.c Viresh Kumar 2011-08-10 1784 dev_dbg(&pl022->adev->dev, "SSP cpsdvsr = %d, scr = %d\n",
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1785 clk_freq->cpsdvsr, clk_freq->scr);
0379b2a33a8a03d drivers/spi/spi-pl022.c Viresh Kumar 2011-08-10 1786
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1787 return 0;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1788 }
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1789
f9d629c737cb668 drivers/spi/amba-pl022.c Linus Walleij 2010-10-01 1790 /*
f9d629c737cb668 drivers/spi/amba-pl022.c Linus Walleij 2010-10-01 1791 * A piece of default chip info unless the platform
f9d629c737cb668 drivers/spi/amba-pl022.c Linus Walleij 2010-10-01 1792 * supplies it.
f9d629c737cb668 drivers/spi/amba-pl022.c Linus Walleij 2010-10-01 1793 */
f9d629c737cb668 drivers/spi/amba-pl022.c Linus Walleij 2010-10-01 1794 static const struct pl022_config_chip pl022_default_chip_info = {
f9d629c737cb668 drivers/spi/amba-pl022.c Linus Walleij 2010-10-01 1795 .com_mode = POLLING_TRANSFER,
f9d629c737cb668 drivers/spi/amba-pl022.c Linus Walleij 2010-10-01 1796 .iface = SSP_INTERFACE_MOTOROLA_SPI,
f9d629c737cb668 drivers/spi/amba-pl022.c Linus Walleij 2010-10-01 1797 .hierarchy = SSP_SLAVE,
f9d629c737cb668 drivers/spi/amba-pl022.c Linus Walleij 2010-10-01 1798 .slave_tx_disable = DO_NOT_DRIVE_TX,
f9d629c737cb668 drivers/spi/amba-pl022.c Linus Walleij 2010-10-01 1799 .rx_lev_trig = SSP_RX_1_OR_MORE_ELEM,
f9d629c737cb668 drivers/spi/amba-pl022.c Linus Walleij 2010-10-01 1800 .tx_lev_trig = SSP_TX_1_OR_MORE_EMPTY_LOC,
f9d629c737cb668 drivers/spi/amba-pl022.c Linus Walleij 2010-10-01 1801 .ctrl_len = SSP_BITS_8,
f9d629c737cb668 drivers/spi/amba-pl022.c Linus Walleij 2010-10-01 1802 .wait_state = SSP_MWIRE_WAIT_ZERO,
f9d629c737cb668 drivers/spi/amba-pl022.c Linus Walleij 2010-10-01 1803 .duplex = SSP_MICROWIRE_CHANNEL_FULL_DUPLEX,
f9d629c737cb668 drivers/spi/amba-pl022.c Linus Walleij 2010-10-01 1804 };
f9d629c737cb668 drivers/spi/amba-pl022.c Linus Walleij 2010-10-01 1805
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1806 /**
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1807 * pl022_setup - setup function registered to SPI master framework
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1808 * @spi: spi device which is requesting setup
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1809 *
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1810 * This function is registered to the SPI framework for this SPI master
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1811 * controller. If it is the first time when setup is called by this device,
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1812 * this function will initialize the runtime state for this chip and save
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1813 * the same in the device structure. Else it will update the runtime info
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1814 * with the updated chip info. Nothing is really being written to the
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1815 * controller hardware here, that is not done until the actual transfer
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1816 * commence.
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1817 */
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1818 static int pl022_setup(struct spi_device *spi)
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1819 {
f9d629c737cb668 drivers/spi/amba-pl022.c Linus Walleij 2010-10-01 1820 struct pl022_config_chip const *chip_info;
6d3952a7dfa8091 drivers/spi/spi-pl022.c Roland Stigge 2012-08-22 1821 struct pl022_config_chip chip_info_dt;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1822 struct chip_data *chip;
c4a4784308f5cb8 drivers/spi/spi-pl022.c Jonas Aaberg 2011-02-28 1823 struct ssp_clock_params clk_freq = { .cpsdvsr = 0, .scr = 0};
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1824 int status = 0;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1825 struct pl022 *pl022 = spi_master_get_devdata(spi->master);
bde435a9ca376d0 drivers/spi/amba-pl022.c Kevin Wells 2010-09-16 1826 unsigned int bits = spi->bits_per_word;
bde435a9ca376d0 drivers/spi/amba-pl022.c Kevin Wells 2010-09-16 1827 u32 tmp;
6d3952a7dfa8091 drivers/spi/spi-pl022.c Roland Stigge 2012-08-22 1828 struct device_node *np = spi->dev.of_node;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1829
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1830 if (!spi->max_speed_hz)
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1831 return -EINVAL;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1832
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1833 /* Get controller_state if one is supplied */
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1834 chip = spi_get_ctldata(spi);
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1835
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1836 if (chip == NULL) {
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1837 chip = kzalloc(sizeof(struct chip_data), GFP_KERNEL);
77538f4a98dc542 drivers/spi/spi-pl022.c Jingoo Han 2014-04-29 1838 if (!chip)
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1839 return -ENOMEM;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1840 dev_dbg(&spi->dev,
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1841 "allocated memory for controller's runtime state\n");
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1842 }
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1843
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1844 /* Get controller data if one is supplied */
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1845 chip_info = spi->controller_data;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1846
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1847 if (chip_info == NULL) {
6d3952a7dfa8091 drivers/spi/spi-pl022.c Roland Stigge 2012-08-22 1848 if (np) {
6d3952a7dfa8091 drivers/spi/spi-pl022.c Roland Stigge 2012-08-22 1849 chip_info_dt = pl022_default_chip_info;
6d3952a7dfa8091 drivers/spi/spi-pl022.c Roland Stigge 2012-08-22 1850
6d3952a7dfa8091 drivers/spi/spi-pl022.c Roland Stigge 2012-08-22 1851 chip_info_dt.hierarchy = SSP_MASTER;
6d3952a7dfa8091 drivers/spi/spi-pl022.c Roland Stigge 2012-08-22 1852 of_property_read_u32(np, "pl022,interface",
6d3952a7dfa8091 drivers/spi/spi-pl022.c Roland Stigge 2012-08-22 1853 &chip_info_dt.iface);
6d3952a7dfa8091 drivers/spi/spi-pl022.c Roland Stigge 2012-08-22 1854 of_property_read_u32(np, "pl022,com-mode",
6d3952a7dfa8091 drivers/spi/spi-pl022.c Roland Stigge 2012-08-22 1855 &chip_info_dt.com_mode);
6d3952a7dfa8091 drivers/spi/spi-pl022.c Roland Stigge 2012-08-22 1856 of_property_read_u32(np, "pl022,rx-level-trig",
6d3952a7dfa8091 drivers/spi/spi-pl022.c Roland Stigge 2012-08-22 1857 &chip_info_dt.rx_lev_trig);
6d3952a7dfa8091 drivers/spi/spi-pl022.c Roland Stigge 2012-08-22 1858 of_property_read_u32(np, "pl022,tx-level-trig",
6d3952a7dfa8091 drivers/spi/spi-pl022.c Roland Stigge 2012-08-22 1859 &chip_info_dt.tx_lev_trig);
6d3952a7dfa8091 drivers/spi/spi-pl022.c Roland Stigge 2012-08-22 1860 of_property_read_u32(np, "pl022,ctrl-len",
6d3952a7dfa8091 drivers/spi/spi-pl022.c Roland Stigge 2012-08-22 1861 &chip_info_dt.ctrl_len);
6d3952a7dfa8091 drivers/spi/spi-pl022.c Roland Stigge 2012-08-22 1862 of_property_read_u32(np, "pl022,wait-state",
6d3952a7dfa8091 drivers/spi/spi-pl022.c Roland Stigge 2012-08-22 1863 &chip_info_dt.wait_state);
6d3952a7dfa8091 drivers/spi/spi-pl022.c Roland Stigge 2012-08-22 1864 of_property_read_u32(np, "pl022,duplex",
6d3952a7dfa8091 drivers/spi/spi-pl022.c Roland Stigge 2012-08-22 1865 &chip_info_dt.duplex);
6d3952a7dfa8091 drivers/spi/spi-pl022.c Roland Stigge 2012-08-22 1866
6d3952a7dfa8091 drivers/spi/spi-pl022.c Roland Stigge 2012-08-22 1867 chip_info = &chip_info_dt;
6d3952a7dfa8091 drivers/spi/spi-pl022.c Roland Stigge 2012-08-22 1868 } else {
f9d629c737cb668 drivers/spi/amba-pl022.c Linus Walleij 2010-10-01 1869 chip_info = &pl022_default_chip_info;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1870 /* spi_board_info.controller_data not is supplied */
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1871 dev_dbg(&spi->dev,
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1872 "using default controller_data settings\n");
6d3952a7dfa8091 drivers/spi/spi-pl022.c Roland Stigge 2012-08-22 1873 }
f9d629c737cb668 drivers/spi/amba-pl022.c Linus Walleij 2010-10-01 1874 } else
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1875 dev_dbg(&spi->dev,
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1876 "using user supplied controller_data settings\n");
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1877
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1878 /*
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1879 * We can override with custom divisors, else we use the board
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1880 * frequency setting
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1881 */
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1882 if ((0 == chip_info->clk_freq.cpsdvsr)
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1883 && (0 == chip_info->clk_freq.scr)) {
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1884 status = calculate_effective_freq(pl022,
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1885 spi->max_speed_hz,
f9d629c737cb668 drivers/spi/amba-pl022.c Linus Walleij 2010-10-01 1886 &clk_freq);
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1887 if (status < 0)
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1888 goto err_config_params;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1889 } else {
f9d629c737cb668 drivers/spi/amba-pl022.c Linus Walleij 2010-10-01 1890 memcpy(&clk_freq, &chip_info->clk_freq, sizeof(clk_freq));
f9d629c737cb668 drivers/spi/amba-pl022.c Linus Walleij 2010-10-01 1891 if ((clk_freq.cpsdvsr % 2) != 0)
f9d629c737cb668 drivers/spi/amba-pl022.c Linus Walleij 2010-10-01 1892 clk_freq.cpsdvsr =
f9d629c737cb668 drivers/spi/amba-pl022.c Linus Walleij 2010-10-01 1893 clk_freq.cpsdvsr - 1;
f9d629c737cb668 drivers/spi/amba-pl022.c Linus Walleij 2010-10-01 1894 }
f9d629c737cb668 drivers/spi/amba-pl022.c Linus Walleij 2010-10-01 1895 if ((clk_freq.cpsdvsr < CPSDVR_MIN)
f9d629c737cb668 drivers/spi/amba-pl022.c Linus Walleij 2010-10-01 1896 || (clk_freq.cpsdvsr > CPSDVR_MAX)) {
e3f88ae99609205 drivers/spi/amba-pl022.c Virupax Sadashivpetimath 2011-06-13 1897 status = -EINVAL;
f9d629c737cb668 drivers/spi/amba-pl022.c Linus Walleij 2010-10-01 1898 dev_err(&spi->dev,
f9d629c737cb668 drivers/spi/amba-pl022.c Linus Walleij 2010-10-01 1899 "cpsdvsr is configured incorrectly\n");
f9d629c737cb668 drivers/spi/amba-pl022.c Linus Walleij 2010-10-01 1900 goto err_config_params;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1901 }
f9d629c737cb668 drivers/spi/amba-pl022.c Linus Walleij 2010-10-01 1902
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1903 status = verify_controller_parameters(pl022, chip_info);
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1904 if (status) {
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1905 dev_err(&spi->dev, "controller data is incorrect");
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1906 goto err_config_params;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1907 }
f9d629c737cb668 drivers/spi/amba-pl022.c Linus Walleij 2010-10-01 1908
083be3f05371b8f drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 1909 pl022->rx_lev_trig = chip_info->rx_lev_trig;
083be3f05371b8f drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 1910 pl022->tx_lev_trig = chip_info->tx_lev_trig;
083be3f05371b8f drivers/spi/spi-pl022.c Linus Walleij 2011-06-16 1911
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1912 /* Now set controller state based on controller data */
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1913 chip->xfer_type = chip_info->com_mode;
f6f46de1063c882 drivers/spi/spi-pl022.c Roland Stigge 2012-08-22 1914 if (!gpio_is_valid(pl022->chipselects[spi->chip_select]))
f9d629c737cb668 drivers/spi/amba-pl022.c Linus Walleij 2010-10-01 1915 dev_warn(&spi->dev,
f6f46de1063c882 drivers/spi/spi-pl022.c Roland Stigge 2012-08-22 1916 "invalid chip select\n");
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1917
eb798c641a34ae9 drivers/spi/spi-pl022.c Vinit Shenoy 2012-04-17 1918 /* Check bits per word with vendor specific range */
eb798c641a34ae9 drivers/spi/spi-pl022.c Vinit Shenoy 2012-04-17 1919 if ((bits <= 3) || (bits > pl022->vendor->max_bpw)) {
bde435a9ca376d0 drivers/spi/amba-pl022.c Kevin Wells 2010-09-16 1920 status = -ENOTSUPP;
eb798c641a34ae9 drivers/spi/spi-pl022.c Vinit Shenoy 2012-04-17 1921 dev_err(&spi->dev, "illegal data size for this controller!\n");
eb798c641a34ae9 drivers/spi/spi-pl022.c Vinit Shenoy 2012-04-17 1922 dev_err(&spi->dev, "This controller can only handle 4 <= n <= %d bit words\n",
eb798c641a34ae9 drivers/spi/spi-pl022.c Vinit Shenoy 2012-04-17 1923 pl022->vendor->max_bpw);
bde435a9ca376d0 drivers/spi/amba-pl022.c Kevin Wells 2010-09-16 1924 goto err_config_params;
bde435a9ca376d0 drivers/spi/amba-pl022.c Kevin Wells 2010-09-16 1925 } else if (bits <= 8) {
bde435a9ca376d0 drivers/spi/amba-pl022.c Kevin Wells 2010-09-16 1926 dev_dbg(&spi->dev, "4 <= n <=8 bits per word\n");
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1927 chip->n_bytes = 1;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1928 chip->read = READING_U8;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1929 chip->write = WRITING_U8;
bde435a9ca376d0 drivers/spi/amba-pl022.c Kevin Wells 2010-09-16 1930 } else if (bits <= 16) {
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1931 dev_dbg(&spi->dev, "9 <= n <= 16 bits per word\n");
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1932 chip->n_bytes = 2;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1933 chip->read = READING_U16;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1934 chip->write = WRITING_U16;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1935 } else {
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1936 dev_dbg(&spi->dev, "17 <= n <= 32 bits per word\n");
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1937 chip->n_bytes = 4;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1938 chip->read = READING_U32;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1939 chip->write = WRITING_U32;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1940 }
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1941
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1942 /* Now Initialize all register settings required for this chip */
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1943 chip->cr0 = 0;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1944 chip->cr1 = 0;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1945 chip->dmacr = 0;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1946 chip->cpsr = 0;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1947 if ((chip_info->com_mode == DMA_TRANSFER)
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1948 && ((pl022->master_info)->enable_dma)) {
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1949 chip->enable_dma = true;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1950 dev_dbg(&spi->dev, "DMA mode set in controller state\n");
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1951 SSP_WRITE_BITS(chip->dmacr, SSP_DMA_ENABLED,
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1952 SSP_DMACR_MASK_RXDMAE, 0);
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1953 SSP_WRITE_BITS(chip->dmacr, SSP_DMA_ENABLED,
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1954 SSP_DMACR_MASK_TXDMAE, 1);
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1955 } else {
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 1956 chip->enable_dma = false;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1957 dev_dbg(&spi->dev, "DMA mode NOT set in controller state\n");
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1958 SSP_WRITE_BITS(chip->dmacr, SSP_DMA_DISABLED,
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1959 SSP_DMACR_MASK_RXDMAE, 0);
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1960 SSP_WRITE_BITS(chip->dmacr, SSP_DMA_DISABLED,
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1961 SSP_DMACR_MASK_TXDMAE, 1);
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1962 }
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1963
f9d629c737cb668 drivers/spi/amba-pl022.c Linus Walleij 2010-10-01 1964 chip->cpsr = clk_freq.cpsdvsr;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 1965
556f4aeb7d9dfac drivers/spi/amba-pl022.c Linus Walleij 2010-05-05 1966 /* Special setup for the ST micro extended control registers */
556f4aeb7d9dfac drivers/spi/amba-pl022.c Linus Walleij 2010-05-05 1967 if (pl022->vendor->extended_cr) {
bde435a9ca376d0 drivers/spi/amba-pl022.c Kevin Wells 2010-09-16 1968 u32 etx;
bde435a9ca376d0 drivers/spi/amba-pl022.c Kevin Wells 2010-09-16 1969
781c7b129b1beb8 drivers/spi/amba-pl022.c Linus Walleij 2010-05-07 1970 if (pl022->vendor->pl023) {
781c7b129b1beb8 drivers/spi/amba-pl022.c Linus Walleij 2010-05-07 1971 /* These bits are only in the PL023 */
781c7b129b1beb8 drivers/spi/amba-pl022.c Linus Walleij 2010-05-07 1972 SSP_WRITE_BITS(chip->cr1, chip_info->clkdelay,
781c7b129b1beb8 drivers/spi/amba-pl022.c Linus Walleij 2010-05-07 1973 SSP_CR1_MASK_FBCLKDEL_ST, 13);
781c7b129b1beb8 drivers/spi/amba-pl022.c Linus Walleij 2010-05-07 1974 } else {
781c7b129b1beb8 drivers/spi/amba-pl022.c Linus Walleij 2010-05-07 1975 /* These bits are in the PL022 but not PL023 */
556f4aeb7d9dfac drivers/spi/amba-pl022.c Linus Walleij 2010-05-05 1976 SSP_WRITE_BITS(chip->cr0, chip_info->duplex,
556f4aeb7d9dfac drivers/spi/amba-pl022.c Linus Walleij 2010-05-05 1977 SSP_CR0_MASK_HALFDUP_ST, 5);
556f4aeb7d9dfac drivers/spi/amba-pl022.c Linus Walleij 2010-05-05 1978 SSP_WRITE_BITS(chip->cr0, chip_info->ctrl_len,
556f4aeb7d9dfac drivers/spi/amba-pl022.c Linus Walleij 2010-05-05 1979 SSP_CR0_MASK_CSS_ST, 16);
556f4aeb7d9dfac drivers/spi/amba-pl022.c Linus Walleij 2010-05-05 1980 SSP_WRITE_BITS(chip->cr0, chip_info->iface,
556f4aeb7d9dfac drivers/spi/amba-pl022.c Linus Walleij 2010-05-05 1981 SSP_CR0_MASK_FRF_ST, 21);
781c7b129b1beb8 drivers/spi/amba-pl022.c Linus Walleij 2010-05-07 1982 SSP_WRITE_BITS(chip->cr1, chip_info->wait_state,
781c7b129b1beb8 drivers/spi/amba-pl022.c Linus Walleij 2010-05-07 1983 SSP_CR1_MASK_MWAIT_ST, 6);
781c7b129b1beb8 drivers/spi/amba-pl022.c Linus Walleij 2010-05-07 1984 }
bde435a9ca376d0 drivers/spi/amba-pl022.c Kevin Wells 2010-09-16 1985 SSP_WRITE_BITS(chip->cr0, bits - 1,
781c7b129b1beb8 drivers/spi/amba-pl022.c Linus Walleij 2010-05-07 1986 SSP_CR0_MASK_DSS_ST, 0);
bde435a9ca376d0 drivers/spi/amba-pl022.c Kevin Wells 2010-09-16 1987
bde435a9ca376d0 drivers/spi/amba-pl022.c Kevin Wells 2010-09-16 1988 if (spi->mode & SPI_LSB_FIRST) {
bde435a9ca376d0 drivers/spi/amba-pl022.c Kevin Wells 2010-09-16 1989 tmp = SSP_RX_LSB;
bde435a9ca376d0 drivers/spi/amba-pl022.c Kevin Wells 2010-09-16 1990 etx = SSP_TX_LSB;
bde435a9ca376d0 drivers/spi/amba-pl022.c Kevin Wells 2010-09-16 1991 } else {
bde435a9ca376d0 drivers/spi/amba-pl022.c Kevin Wells 2010-09-16 1992 tmp = SSP_RX_MSB;
bde435a9ca376d0 drivers/spi/amba-pl022.c Kevin Wells 2010-09-16 1993 etx = SSP_TX_MSB;
bde435a9ca376d0 drivers/spi/amba-pl022.c Kevin Wells 2010-09-16 1994 }
bde435a9ca376d0 drivers/spi/amba-pl022.c Kevin Wells 2010-09-16 1995 SSP_WRITE_BITS(chip->cr1, tmp, SSP_CR1_MASK_RENDN_ST, 4);
bde435a9ca376d0 drivers/spi/amba-pl022.c Kevin Wells 2010-09-16 1996 SSP_WRITE_BITS(chip->cr1, etx, SSP_CR1_MASK_TENDN_ST, 5);
556f4aeb7d9dfac drivers/spi/amba-pl022.c Linus Walleij 2010-05-05 1997 SSP_WRITE_BITS(chip->cr1, chip_info->rx_lev_trig,
556f4aeb7d9dfac drivers/spi/amba-pl022.c Linus Walleij 2010-05-05 1998 SSP_CR1_MASK_RXIFLSEL_ST, 7);
556f4aeb7d9dfac drivers/spi/amba-pl022.c Linus Walleij 2010-05-05 1999 SSP_WRITE_BITS(chip->cr1, chip_info->tx_lev_trig,
556f4aeb7d9dfac drivers/spi/amba-pl022.c Linus Walleij 2010-05-05 2000 SSP_CR1_MASK_TXIFLSEL_ST, 10);
556f4aeb7d9dfac drivers/spi/amba-pl022.c Linus Walleij 2010-05-05 2001 } else {
bde435a9ca376d0 drivers/spi/amba-pl022.c Kevin Wells 2010-09-16 2002 SSP_WRITE_BITS(chip->cr0, bits - 1,
556f4aeb7d9dfac drivers/spi/amba-pl022.c Linus Walleij 2010-05-05 2003 SSP_CR0_MASK_DSS, 0);
556f4aeb7d9dfac drivers/spi/amba-pl022.c Linus Walleij 2010-05-05 2004 SSP_WRITE_BITS(chip->cr0, chip_info->iface,
556f4aeb7d9dfac drivers/spi/amba-pl022.c Linus Walleij 2010-05-05 2005 SSP_CR0_MASK_FRF, 4);
556f4aeb7d9dfac drivers/spi/amba-pl022.c Linus Walleij 2010-05-05 2006 }
bde435a9ca376d0 drivers/spi/amba-pl022.c Kevin Wells 2010-09-16 2007
556f4aeb7d9dfac drivers/spi/amba-pl022.c Linus Walleij 2010-05-05 2008 /* Stuff that is common for all versions */
bde435a9ca376d0 drivers/spi/amba-pl022.c Kevin Wells 2010-09-16 2009 if (spi->mode & SPI_CPOL)
bde435a9ca376d0 drivers/spi/amba-pl022.c Kevin Wells 2010-09-16 2010 tmp = SSP_CLK_POL_IDLE_HIGH;
bde435a9ca376d0 drivers/spi/amba-pl022.c Kevin Wells 2010-09-16 2011 else
bde435a9ca376d0 drivers/spi/amba-pl022.c Kevin Wells 2010-09-16 2012 tmp = SSP_CLK_POL_IDLE_LOW;
bde435a9ca376d0 drivers/spi/amba-pl022.c Kevin Wells 2010-09-16 2013 SSP_WRITE_BITS(chip->cr0, tmp, SSP_CR0_MASK_SPO, 6);
bde435a9ca376d0 drivers/spi/amba-pl022.c Kevin Wells 2010-09-16 2014
bde435a9ca376d0 drivers/spi/amba-pl022.c Kevin Wells 2010-09-16 2015 if (spi->mode & SPI_CPHA)
bde435a9ca376d0 drivers/spi/amba-pl022.c Kevin Wells 2010-09-16 2016 tmp = SSP_CLK_SECOND_EDGE;
bde435a9ca376d0 drivers/spi/amba-pl022.c Kevin Wells 2010-09-16 2017 else
bde435a9ca376d0 drivers/spi/amba-pl022.c Kevin Wells 2010-09-16 2018 tmp = SSP_CLK_FIRST_EDGE;
bde435a9ca376d0 drivers/spi/amba-pl022.c Kevin Wells 2010-09-16 2019 SSP_WRITE_BITS(chip->cr0, tmp, SSP_CR0_MASK_SPH, 7);
bde435a9ca376d0 drivers/spi/amba-pl022.c Kevin Wells 2010-09-16 2020
f9d629c737cb668 drivers/spi/amba-pl022.c Linus Walleij 2010-10-01 2021 SSP_WRITE_BITS(chip->cr0, clk_freq.scr, SSP_CR0_MASK_SCR, 8);
781c7b129b1beb8 drivers/spi/amba-pl022.c Linus Walleij 2010-05-07 2022 /* Loopback is available on all versions except PL023 */
06fb01fd1dc624d drivers/spi/amba-pl022.c Philippe Langlais 2011-03-23 2023 if (pl022->vendor->loopback) {
bde435a9ca376d0 drivers/spi/amba-pl022.c Kevin Wells 2010-09-16 2024 if (spi->mode & SPI_LOOP)
bde435a9ca376d0 drivers/spi/amba-pl022.c Kevin Wells 2010-09-16 2025 tmp = LOOPBACK_ENABLED;
bde435a9ca376d0 drivers/spi/amba-pl022.c Kevin Wells 2010-09-16 2026 else
bde435a9ca376d0 drivers/spi/amba-pl022.c Kevin Wells 2010-09-16 2027 tmp = LOOPBACK_DISABLED;
bde435a9ca376d0 drivers/spi/amba-pl022.c Kevin Wells 2010-09-16 2028 SSP_WRITE_BITS(chip->cr1, tmp, SSP_CR1_MASK_LBM, 0);
bde435a9ca376d0 drivers/spi/amba-pl022.c Kevin Wells 2010-09-16 2029 }
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2030 SSP_WRITE_BITS(chip->cr1, SSP_DISABLED, SSP_CR1_MASK_SSE, 1);
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2031 SSP_WRITE_BITS(chip->cr1, chip_info->hierarchy, SSP_CR1_MASK_MS, 2);
f1e45f86ed93b9e drivers/spi/spi-pl022.c Viresh Kumar 2011-08-10 2032 SSP_WRITE_BITS(chip->cr1, chip_info->slave_tx_disable, SSP_CR1_MASK_SOD,
f1e45f86ed93b9e drivers/spi/spi-pl022.c Viresh Kumar 2011-08-10 2033 3);
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2034
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2035 /* Save controller_state */
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2036 spi_set_ctldata(spi, chip);
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2037 return status;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2038 err_config_params:
bde435a9ca376d0 drivers/spi/amba-pl022.c Kevin Wells 2010-09-16 2039 spi_set_ctldata(spi, NULL);
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2040 kfree(chip);
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2041 return status;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2042 }
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2043
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2044 /**
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2045 * pl022_cleanup - cleanup function registered to SPI master framework
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2046 * @spi: spi device which is requesting cleanup
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2047 *
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2048 * This function is registered to the SPI framework for this SPI master
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2049 * controller. It will free the runtime state of chip.
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2050 */
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2051 static void pl022_cleanup(struct spi_device *spi)
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2052 {
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2053 struct chip_data *chip = spi_get_ctldata(spi);
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2054
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2055 spi_set_ctldata(spi, NULL);
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2056 kfree(chip);
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2057 }
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2058
39a6ac11df6579d drivers/spi/spi-pl022.c Roland Stigge 2012-09-18 2059 static struct pl022_ssp_controller *
39a6ac11df6579d drivers/spi/spi-pl022.c Roland Stigge 2012-09-18 2060 pl022_platform_data_dt_get(struct device *dev)
39a6ac11df6579d drivers/spi/spi-pl022.c Roland Stigge 2012-09-18 2061 {
39a6ac11df6579d drivers/spi/spi-pl022.c Roland Stigge 2012-09-18 2062 struct device_node *np = dev->of_node;
39a6ac11df6579d drivers/spi/spi-pl022.c Roland Stigge 2012-09-18 2063 struct pl022_ssp_controller *pd;
849794c50b24b93 drivers/spi/spi-pl022.c Rabin Vincent 2017-04-06 2064 u32 tmp = 0;
39a6ac11df6579d drivers/spi/spi-pl022.c Roland Stigge 2012-09-18 2065
39a6ac11df6579d drivers/spi/spi-pl022.c Roland Stigge 2012-09-18 2066 if (!np) {
39a6ac11df6579d drivers/spi/spi-pl022.c Roland Stigge 2012-09-18 2067 dev_err(dev, "no dt node defined\n");
39a6ac11df6579d drivers/spi/spi-pl022.c Roland Stigge 2012-09-18 2068 return NULL;
39a6ac11df6579d drivers/spi/spi-pl022.c Roland Stigge 2012-09-18 2069 }
39a6ac11df6579d drivers/spi/spi-pl022.c Roland Stigge 2012-09-18 2070
39a6ac11df6579d drivers/spi/spi-pl022.c Roland Stigge 2012-09-18 2071 pd = devm_kzalloc(dev, sizeof(struct pl022_ssp_controller), GFP_KERNEL);
77538f4a98dc542 drivers/spi/spi-pl022.c Jingoo Han 2014-04-29 2072 if (!pd)
39a6ac11df6579d drivers/spi/spi-pl022.c Roland Stigge 2012-09-18 2073 return NULL;
39a6ac11df6579d drivers/spi/spi-pl022.c Roland Stigge 2012-09-18 2074
39a6ac11df6579d drivers/spi/spi-pl022.c Roland Stigge 2012-09-18 2075 pd->bus_id = -1;
dbd897b9c6fac8b drivers/spi/spi-pl022.c Linus Walleij 2013-05-23 2076 pd->enable_dma = 1;
39a6ac11df6579d drivers/spi/spi-pl022.c Roland Stigge 2012-09-18 2077 of_property_read_u32(np, "num-cs", &tmp);
39a6ac11df6579d drivers/spi/spi-pl022.c Roland Stigge 2012-09-18 2078 pd->num_chipselect = tmp;
39a6ac11df6579d drivers/spi/spi-pl022.c Roland Stigge 2012-09-18 2079 of_property_read_u32(np, "pl022,autosuspend-delay",
39a6ac11df6579d drivers/spi/spi-pl022.c Roland Stigge 2012-09-18 2080 &pd->autosuspend_delay);
39a6ac11df6579d drivers/spi/spi-pl022.c Roland Stigge 2012-09-18 2081 pd->rt = of_property_read_bool(np, "pl022,rt");
39a6ac11df6579d drivers/spi/spi-pl022.c Roland Stigge 2012-09-18 2082
39a6ac11df6579d drivers/spi/spi-pl022.c Roland Stigge 2012-09-18 2083 return pd;
39a6ac11df6579d drivers/spi/spi-pl022.c Roland Stigge 2012-09-18 2084 }
39a6ac11df6579d drivers/spi/spi-pl022.c Roland Stigge 2012-09-18 2085
fd4a319bc933ae9 drivers/spi/spi-pl022.c Grant Likely 2012-12-07 2086 static int pl022_probe(struct amba_device *adev, const struct amba_id *id)
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2087 {
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2088 struct device *dev = &adev->dev;
8074cf063e410a2 drivers/spi/spi-pl022.c Jingoo Han 2013-07-30 2089 struct pl022_ssp_controller *platform_info =
8074cf063e410a2 drivers/spi/spi-pl022.c Jingoo Han 2013-07-30 2090 dev_get_platdata(&adev->dev);
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2091 struct spi_master *master;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2092 struct pl022 *pl022 = NULL; /*Data for this driver */
6d3952a7dfa8091 drivers/spi/spi-pl022.c Roland Stigge 2012-08-22 2093 struct device_node *np = adev->dev.of_node;
6d3952a7dfa8091 drivers/spi/spi-pl022.c Roland Stigge 2012-08-22 2094 int status = 0, i, num_cs;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2095
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2096 dev_info(&adev->dev,
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2097 "ARM PL022 driver, device ID: 0x%08x\n", adev->periphid);
39a6ac11df6579d drivers/spi/spi-pl022.c Roland Stigge 2012-09-18 2098 if (!platform_info && IS_ENABLED(CONFIG_OF))
39a6ac11df6579d drivers/spi/spi-pl022.c Roland Stigge 2012-09-18 2099 platform_info = pl022_platform_data_dt_get(dev);
39a6ac11df6579d drivers/spi/spi-pl022.c Roland Stigge 2012-09-18 2100
39a6ac11df6579d drivers/spi/spi-pl022.c Roland Stigge 2012-09-18 2101 if (!platform_info) {
39a6ac11df6579d drivers/spi/spi-pl022.c Roland Stigge 2012-09-18 2102 dev_err(dev, "probe: no platform data defined\n");
aeef9915b9a40d2 drivers/spi/spi-pl022.c Linus Walleij 2012-09-26 2103 return -ENODEV;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2104 }
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2105
6d3952a7dfa8091 drivers/spi/spi-pl022.c Roland Stigge 2012-08-22 2106 if (platform_info->num_chipselect) {
6d3952a7dfa8091 drivers/spi/spi-pl022.c Roland Stigge 2012-08-22 2107 num_cs = platform_info->num_chipselect;
6d3952a7dfa8091 drivers/spi/spi-pl022.c Roland Stigge 2012-08-22 2108 } else {
39a6ac11df6579d drivers/spi/spi-pl022.c Roland Stigge 2012-09-18 2109 dev_err(dev, "probe: no chip select defined\n");
aeef9915b9a40d2 drivers/spi/spi-pl022.c Linus Walleij 2012-09-26 2110 return -ENODEV;
6d3952a7dfa8091 drivers/spi/spi-pl022.c Roland Stigge 2012-08-22 2111 }
6d3952a7dfa8091 drivers/spi/spi-pl022.c Roland Stigge 2012-08-22 2112
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2113 /* Allocate master with space for data */
b4b8482690d97ea drivers/spi/spi-pl022.c Roland Stigge 2012-09-03 2114 master = spi_alloc_master(dev, sizeof(struct pl022));
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2115 if (master == NULL) {
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2116 dev_err(&adev->dev, "probe - cannot alloc SPI master\n");
aeef9915b9a40d2 drivers/spi/spi-pl022.c Linus Walleij 2012-09-26 2117 return -ENOMEM;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2118 }
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2119
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2120 pl022 = spi_master_get_devdata(master);
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2121 pl022->master = master;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2122 pl022->master_info = platform_info;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2123 pl022->adev = adev;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2124 pl022->vendor = id->data;
a86854d0c599b32 drivers/spi/spi-pl022.c Kees Cook 2018-06-12 2125 pl022->chipselects = devm_kcalloc(dev, num_cs, sizeof(int),
b4b8482690d97ea drivers/spi/spi-pl022.c Roland Stigge 2012-09-03 2126 GFP_KERNEL);
73e3f1eb5188830 drivers/spi/spi-pl022.c Kiran Padwal 2014-09-18 2127 if (!pl022->chipselects) {
73e3f1eb5188830 drivers/spi/spi-pl022.c Kiran Padwal 2014-09-18 2128 status = -ENOMEM;
73e3f1eb5188830 drivers/spi/spi-pl022.c Kiran Padwal 2014-09-18 2129 goto err_no_mem;
73e3f1eb5188830 drivers/spi/spi-pl022.c Kiran Padwal 2014-09-18 2130 }
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2131
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2132 /*
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2133 * Bus Number Which has been Assigned to this SSP controller
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2134 * on this board
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2135 */
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2136 master->bus_num = platform_info->bus_id;
6e5614b6476001a drivers/spi/spi-pl022.c Linus Walleij 2019-06-25 2137 master->use_gpio_descriptors;
6d3952a7dfa8091 drivers/spi/spi-pl022.c Roland Stigge 2012-08-22 2138 master->num_chipselect = num_cs;
6e5614b6476001a drivers/spi/spi-pl022.c Linus Walleij 2019-06-25 2139 master->set_cs = pl022_set_cs;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2140 master->cleanup = pl022_cleanup;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2141 master->setup = pl022_setup;
29b6e906a70a47c drivers/spi/spi-pl022.c Mark Brown 2013-07-28 2142 master->auto_runtime_pm = true;
ffbbdd21329f3e1 drivers/spi/spi-pl022.c Linus Walleij 2012-02-22 2143 master->transfer_one_message = pl022_transfer_one_message;
ffbbdd21329f3e1 drivers/spi/spi-pl022.c Linus Walleij 2012-02-22 2144 master->unprepare_transfer_hardware = pl022_unprepare_transfer_hardware;
ffbbdd21329f3e1 drivers/spi/spi-pl022.c Linus Walleij 2012-02-22 2145 master->rt = platform_info->rt;
6d3952a7dfa8091 drivers/spi/spi-pl022.c Roland Stigge 2012-08-22 2146 master->dev.of_node = dev->of_node;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2147
516843702bb5fd8 drivers/spi/spi-pl022.c Linus Walleij 2019-04-28 2148 if (pl022->vendor->internal_cs_ctrl) {
db4fa45ed3182d8 drivers/spi/spi-pl022.c Anders Berg 2014-09-17 2149 for (i = 0; i < num_cs; i++)
db4fa45ed3182d8 drivers/spi/spi-pl022.c Anders Berg 2014-09-17 2150 pl022->chipselects[i] = i;
6d3952a7dfa8091 drivers/spi/spi-pl022.c Roland Stigge 2012-08-22 2151 } else if (IS_ENABLED(CONFIG_OF)) {
6d3952a7dfa8091 drivers/spi/spi-pl022.c Roland Stigge 2012-08-22 2152 for (i = 0; i < num_cs; i++) {
6d3952a7dfa8091 drivers/spi/spi-pl022.c Roland Stigge 2012-08-22 2153 int cs_gpio = of_get_named_gpio(np, "cs-gpios", i);
6d3952a7dfa8091 drivers/spi/spi-pl022.c Roland Stigge 2012-08-22 2154
6d3952a7dfa8091 drivers/spi/spi-pl022.c Roland Stigge 2012-08-22 2155 if (cs_gpio == -EPROBE_DEFER) {
6d3952a7dfa8091 drivers/spi/spi-pl022.c Roland Stigge 2012-08-22 2156 status = -EPROBE_DEFER;
6d3952a7dfa8091 drivers/spi/spi-pl022.c Roland Stigge 2012-08-22 2157 goto err_no_gpio;
6d3952a7dfa8091 drivers/spi/spi-pl022.c Roland Stigge 2012-08-22 2158 }
6d3952a7dfa8091 drivers/spi/spi-pl022.c Roland Stigge 2012-08-22 2159
6d3952a7dfa8091 drivers/spi/spi-pl022.c Roland Stigge 2012-08-22 2160 pl022->chipselects[i] = cs_gpio;
6d3952a7dfa8091 drivers/spi/spi-pl022.c Roland Stigge 2012-08-22 2161
6d3952a7dfa8091 drivers/spi/spi-pl022.c Roland Stigge 2012-08-22 2162 if (gpio_is_valid(cs_gpio)) {
aeef9915b9a40d2 drivers/spi/spi-pl022.c Linus Walleij 2012-09-26 2163 if (devm_gpio_request(dev, cs_gpio, "ssp-pl022"))
6d3952a7dfa8091 drivers/spi/spi-pl022.c Roland Stigge 2012-08-22 2164 dev_err(&adev->dev,
6d3952a7dfa8091 drivers/spi/spi-pl022.c Roland Stigge 2012-08-22 2165 "could not request %d gpio\n",
6d3952a7dfa8091 drivers/spi/spi-pl022.c Roland Stigge 2012-08-22 2166 cs_gpio);
6d3952a7dfa8091 drivers/spi/spi-pl022.c Roland Stigge 2012-08-22 2167 else if (gpio_direction_output(cs_gpio, 1))
6d3952a7dfa8091 drivers/spi/spi-pl022.c Roland Stigge 2012-08-22 2168 dev_err(&adev->dev,
61e89e65e31516c drivers/spi/spi-pl022.c Roland Stigge 2014-09-09 2169 "could not set gpio %d as output\n",
6d3952a7dfa8091 drivers/spi/spi-pl022.c Roland Stigge 2012-08-22 2170 cs_gpio);
6d3952a7dfa8091 drivers/spi/spi-pl022.c Roland Stigge 2012-08-22 2171 }
6d3952a7dfa8091 drivers/spi/spi-pl022.c Roland Stigge 2012-08-22 2172 }
6d3952a7dfa8091 drivers/spi/spi-pl022.c Roland Stigge 2012-08-22 2173 }
f6f46de1063c882 drivers/spi/spi-pl022.c Roland Stigge 2012-08-22 2174
bde435a9ca376d0 drivers/spi/amba-pl022.c Kevin Wells 2010-09-16 2175 /*
bde435a9ca376d0 drivers/spi/amba-pl022.c Kevin Wells 2010-09-16 2176 * Supports mode 0-3, loopback, and active low CS. Transfers are
bde435a9ca376d0 drivers/spi/amba-pl022.c Kevin Wells 2010-09-16 2177 * always MS bit first on the original pl022.
bde435a9ca376d0 drivers/spi/amba-pl022.c Kevin Wells 2010-09-16 2178 */
bde435a9ca376d0 drivers/spi/amba-pl022.c Kevin Wells 2010-09-16 2179 master->mode_bits = SPI_CPOL | SPI_CPHA | SPI_CS_HIGH | SPI_LOOP;
bde435a9ca376d0 drivers/spi/amba-pl022.c Kevin Wells 2010-09-16 2180 if (pl022->vendor->extended_cr)
bde435a9ca376d0 drivers/spi/amba-pl022.c Kevin Wells 2010-09-16 2181 master->mode_bits |= SPI_LSB_FIRST;
bde435a9ca376d0 drivers/spi/amba-pl022.c Kevin Wells 2010-09-16 2182
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2183 dev_dbg(&adev->dev, "BUSNO: %d\n", master->bus_num);
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2184
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2185 status = amba_request_regions(adev, NULL);
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2186 if (status)
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2187 goto err_no_ioregion;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2188
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 2189 pl022->phybase = adev->res.start;
aeef9915b9a40d2 drivers/spi/spi-pl022.c Linus Walleij 2012-09-26 2190 pl022->virtbase = devm_ioremap(dev, adev->res.start,
aeef9915b9a40d2 drivers/spi/spi-pl022.c Linus Walleij 2012-09-26 2191 resource_size(&adev->res));
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2192 if (pl022->virtbase == NULL) {
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2193 status = -ENOMEM;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2194 goto err_no_ioremap;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2195 }
2c067509a1e3540 drivers/spi/spi-pl022.c Jingoo Han 2013-10-11 2196 dev_info(&adev->dev, "mapped registers from %pa to %p\n",
7085f403517615c drivers/spi/spi-pl022.c Fabio Estevam 2013-08-21 2197 &adev->res.start, pl022->virtbase);
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2198
aeef9915b9a40d2 drivers/spi/spi-pl022.c Linus Walleij 2012-09-26 2199 pl022->clk = devm_clk_get(&adev->dev, NULL);
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2200 if (IS_ERR(pl022->clk)) {
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2201 status = PTR_ERR(pl022->clk);
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2202 dev_err(&adev->dev, "could not retrieve SSP/SPI bus clock\n");
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2203 goto err_no_clk;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2204 }
7ff6bcf048e6a98 drivers/spi/spi-pl022.c Russell King 2011-09-22 2205
6cac167b826eced drivers/spi/spi-pl022.c Ulf Hansson 2014-02-04 2206 status = clk_prepare_enable(pl022->clk);
71e63e748ee6f4b drivers/spi/spi-pl022.c Ulf Hansson 2011-11-04 2207 if (status) {
71e63e748ee6f4b drivers/spi/spi-pl022.c Ulf Hansson 2011-11-04 2208 dev_err(&adev->dev, "could not enable SSP/SPI bus clock\n");
71e63e748ee6f4b drivers/spi/spi-pl022.c Ulf Hansson 2011-11-04 2209 goto err_no_clk_en;
71e63e748ee6f4b drivers/spi/spi-pl022.c Ulf Hansson 2011-11-04 2210 }
71e63e748ee6f4b drivers/spi/spi-pl022.c Ulf Hansson 2011-11-04 2211
ffbbdd21329f3e1 drivers/spi/spi-pl022.c Linus Walleij 2012-02-22 2212 /* Initialize transfer pump */
ffbbdd21329f3e1 drivers/spi/spi-pl022.c Linus Walleij 2012-02-22 2213 tasklet_init(&pl022->pump_transfers, pump_transfers,
ffbbdd21329f3e1 drivers/spi/spi-pl022.c Linus Walleij 2012-02-22 2214 (unsigned long)pl022);
ffbbdd21329f3e1 drivers/spi/spi-pl022.c Linus Walleij 2012-02-22 2215
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2216 /* Disable SSP */
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2217 writew((readw(SSP_CR1(pl022->virtbase)) & (~SSP_CR1_MASK_SSE)),
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2218 SSP_CR1(pl022->virtbase));
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2219 load_ssp_default_config(pl022);
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2220
aeef9915b9a40d2 drivers/spi/spi-pl022.c Linus Walleij 2012-09-26 2221 status = devm_request_irq(dev, adev->irq[0], pl022_interrupt_handler,
aeef9915b9a40d2 drivers/spi/spi-pl022.c Linus Walleij 2012-09-26 2222 0, "pl022", pl022);
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2223 if (status < 0) {
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2224 dev_err(&adev->dev, "probe - cannot get IRQ (%d)\n", status);
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2225 goto err_no_irq;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2226 }
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 2227
dc715452e914515 drivers/spi/spi-pl022.c Arnd Bergmann 2013-01-28 2228 /* Get DMA channels, try autoconfiguration first */
dc715452e914515 drivers/spi/spi-pl022.c Arnd Bergmann 2013-01-28 2229 status = pl022_dma_autoprobe(pl022);
f3d4bb3342630cd drivers/spi/spi-pl022.c Rabin Vincent 2015-11-23 2230 if (status == -EPROBE_DEFER) {
f3d4bb3342630cd drivers/spi/spi-pl022.c Rabin Vincent 2015-11-23 2231 dev_dbg(dev, "deferring probe to get DMA channel\n");
f3d4bb3342630cd drivers/spi/spi-pl022.c Rabin Vincent 2015-11-23 2232 goto err_no_irq;
f3d4bb3342630cd drivers/spi/spi-pl022.c Rabin Vincent 2015-11-23 2233 }
dc715452e914515 drivers/spi/spi-pl022.c Arnd Bergmann 2013-01-28 2234
dc715452e914515 drivers/spi/spi-pl022.c Arnd Bergmann 2013-01-28 2235 /* If that failed, use channels from platform_info */
dc715452e914515 drivers/spi/spi-pl022.c Arnd Bergmann 2013-01-28 2236 if (status == 0)
dc715452e914515 drivers/spi/spi-pl022.c Arnd Bergmann 2013-01-28 2237 platform_info->enable_dma = 1;
dc715452e914515 drivers/spi/spi-pl022.c Arnd Bergmann 2013-01-28 2238 else if (platform_info->enable_dma) {
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 2239 status = pl022_dma_probe(pl022);
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 2240 if (status != 0)
43c640157d4366a drivers/spi/amba-pl022.c Viresh Kumar 2011-05-16 2241 platform_info->enable_dma = 0;
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 2242 }
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 2243
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2244 /* Register with the SPI framework */
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2245 amba_set_drvdata(adev, pl022);
35794a77168b739 drivers/spi/spi-pl022.c Jingoo Han 2013-09-24 2246 status = devm_spi_register_master(&adev->dev, master);
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2247 if (status != 0) {
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2248 dev_err(&adev->dev,
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2249 "probe - problem registering spi master\n");
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2250 goto err_spi_register;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2251 }
25985edcedea639 drivers/spi/amba-pl022.c Lucas De Marchi 2011-03-30 2252 dev_dbg(dev, "probe succeeded\n");
92b97f0aaccbf9d drivers/spi/spi-pl022.c Russell King 2011-08-14 2253
92b97f0aaccbf9d drivers/spi/spi-pl022.c Russell King 2011-08-14 2254 /* let runtime pm put suspend */
53e4acea0e819a6 drivers/spi/spi-pl022.c Chris Blair 2011-11-08 2255 if (platform_info->autosuspend_delay > 0) {
53e4acea0e819a6 drivers/spi/spi-pl022.c Chris Blair 2011-11-08 2256 dev_info(&adev->dev,
53e4acea0e819a6 drivers/spi/spi-pl022.c Chris Blair 2011-11-08 2257 "will use autosuspend for runtime pm, delay %dms\n",
53e4acea0e819a6 drivers/spi/spi-pl022.c Chris Blair 2011-11-08 2258 platform_info->autosuspend_delay);
53e4acea0e819a6 drivers/spi/spi-pl022.c Chris Blair 2011-11-08 2259 pm_runtime_set_autosuspend_delay(dev,
53e4acea0e819a6 drivers/spi/spi-pl022.c Chris Blair 2011-11-08 2260 platform_info->autosuspend_delay);
53e4acea0e819a6 drivers/spi/spi-pl022.c Chris Blair 2011-11-08 2261 pm_runtime_use_autosuspend(dev);
53e4acea0e819a6 drivers/spi/spi-pl022.c Chris Blair 2011-11-08 2262 }
0df349945752bf0 drivers/spi/spi-pl022.c Ulf Hansson 2012-10-17 2263 pm_runtime_put(dev);
0df349945752bf0 drivers/spi/spi-pl022.c Ulf Hansson 2012-10-17 2264
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2265 return 0;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2266
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2267 err_spi_register:
3e3ea716270dc64 drivers/spi/spi-pl022.c Viresh Kumar 2011-08-10 2268 if (platform_info->enable_dma)
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 2269 pl022_dma_remove(pl022);
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2270 err_no_irq:
6cac167b826eced drivers/spi/spi-pl022.c Ulf Hansson 2014-02-04 2271 clk_disable_unprepare(pl022->clk);
71e63e748ee6f4b drivers/spi/spi-pl022.c Ulf Hansson 2011-11-04 2272 err_no_clk_en:
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2273 err_no_clk:
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2274 err_no_ioremap:
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2275 amba_release_regions(adev);
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2276 err_no_ioregion:
6d3952a7dfa8091 drivers/spi/spi-pl022.c Roland Stigge 2012-08-22 2277 err_no_gpio:
73e3f1eb5188830 drivers/spi/spi-pl022.c Kiran Padwal 2014-09-18 2278 err_no_mem:
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2279 spi_master_put(master);
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2280 return status;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2281 }
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2282
fd4a319bc933ae9 drivers/spi/spi-pl022.c Grant Likely 2012-12-07 2283 static int
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2284 pl022_remove(struct amba_device *adev)
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2285 {
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2286 struct pl022 *pl022 = amba_get_drvdata(adev);
50658b6602dad6d drivers/spi/spi-pl022.c Linus Walleij 2011-08-02 2287
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2288 if (!pl022)
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2289 return 0;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2290
92b97f0aaccbf9d drivers/spi/spi-pl022.c Russell King 2011-08-14 2291 /*
92b97f0aaccbf9d drivers/spi/spi-pl022.c Russell King 2011-08-14 2292 * undo pm_runtime_put() in probe. I assume that we're not
92b97f0aaccbf9d drivers/spi/spi-pl022.c Russell King 2011-08-14 2293 * accessing the primecell here.
92b97f0aaccbf9d drivers/spi/spi-pl022.c Russell King 2011-08-14 2294 */
92b97f0aaccbf9d drivers/spi/spi-pl022.c Russell King 2011-08-14 2295 pm_runtime_get_noresume(&adev->dev);
92b97f0aaccbf9d drivers/spi/spi-pl022.c Russell King 2011-08-14 2296
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2297 load_ssp_default_config(pl022);
3e3ea716270dc64 drivers/spi/spi-pl022.c Viresh Kumar 2011-08-10 2298 if (pl022->master_info->enable_dma)
b1b6b9aa6fd32db drivers/spi/amba-pl022.c Linus Walleij 2010-09-29 2299 pl022_dma_remove(pl022);
3e3ea716270dc64 drivers/spi/spi-pl022.c Viresh Kumar 2011-08-10 2300
6cac167b826eced drivers/spi/spi-pl022.c Ulf Hansson 2014-02-04 2301 clk_disable_unprepare(pl022->clk);
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2302 amba_release_regions(adev);
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2303 tasklet_disable(&pl022->pump_transfers);
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2304 return 0;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2305 }
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2306
84a5dc41f64faad drivers/spi/spi-pl022.c Ulf Hansson 2014-03-01 2307 #ifdef CONFIG_PM_SLEEP
6cfa6279edbffa9 drivers/spi/spi-pl022.c Peter Hüwe 2011-09-05 2308 static int pl022_suspend(struct device *dev)
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2309 {
92b97f0aaccbf9d drivers/spi/spi-pl022.c Russell King 2011-08-14 2310 struct pl022 *pl022 = dev_get_drvdata(dev);
ffbbdd21329f3e1 drivers/spi/spi-pl022.c Linus Walleij 2012-02-22 2311 int ret;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2312
ffbbdd21329f3e1 drivers/spi/spi-pl022.c Linus Walleij 2012-02-22 2313 ret = spi_master_suspend(pl022->master);
7c5d8a249acadc3 drivers/spi/spi-pl022.c Geert Uytterhoeven 2018-09-05 2314 if (ret)
ffbbdd21329f3e1 drivers/spi/spi-pl022.c Linus Walleij 2012-02-22 2315 return ret;
4964a26df72c4a8 drivers/spi/spi-pl022.c Ulf Hansson 2012-10-17 2316
84a5dc41f64faad drivers/spi/spi-pl022.c Ulf Hansson 2014-03-01 2317 ret = pm_runtime_force_suspend(dev);
84a5dc41f64faad drivers/spi/spi-pl022.c Ulf Hansson 2014-03-01 2318 if (ret) {
84a5dc41f64faad drivers/spi/spi-pl022.c Ulf Hansson 2014-03-01 2319 spi_master_resume(pl022->master);
84a5dc41f64faad drivers/spi/spi-pl022.c Ulf Hansson 2014-03-01 2320 return ret;
84a5dc41f64faad drivers/spi/spi-pl022.c Ulf Hansson 2014-03-01 2321 }
84a5dc41f64faad drivers/spi/spi-pl022.c Ulf Hansson 2014-03-01 2322
84a5dc41f64faad drivers/spi/spi-pl022.c Ulf Hansson 2014-03-01 2323 pinctrl_pm_select_sleep_state(dev);
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2324
6cfa6279edbffa9 drivers/spi/spi-pl022.c Peter Hüwe 2011-09-05 2325 dev_dbg(dev, "suspended\n");
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2326 return 0;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2327 }
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2328
92b97f0aaccbf9d drivers/spi/spi-pl022.c Russell King 2011-08-14 2329 static int pl022_resume(struct device *dev)
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2330 {
92b97f0aaccbf9d drivers/spi/spi-pl022.c Russell King 2011-08-14 2331 struct pl022 *pl022 = dev_get_drvdata(dev);
ffbbdd21329f3e1 drivers/spi/spi-pl022.c Linus Walleij 2012-02-22 2332 int ret;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2333
84a5dc41f64faad drivers/spi/spi-pl022.c Ulf Hansson 2014-03-01 2334 ret = pm_runtime_force_resume(dev);
84a5dc41f64faad drivers/spi/spi-pl022.c Ulf Hansson 2014-03-01 2335 if (ret)
84a5dc41f64faad drivers/spi/spi-pl022.c Ulf Hansson 2014-03-01 2336 dev_err(dev, "problem resuming\n");
ada7aec7eec0ca2 drivers/spi/spi-pl022.c Linus Walleij 2012-09-26 2337
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2338 /* Start the queue running */
ffbbdd21329f3e1 drivers/spi/spi-pl022.c Linus Walleij 2012-02-22 2339 ret = spi_master_resume(pl022->master);
7c5d8a249acadc3 drivers/spi/spi-pl022.c Geert Uytterhoeven 2018-09-05 2340 if (!ret)
92b97f0aaccbf9d drivers/spi/spi-pl022.c Russell King 2011-08-14 2341 dev_dbg(dev, "resumed\n");
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2342
ffbbdd21329f3e1 drivers/spi/spi-pl022.c Linus Walleij 2012-02-22 2343 return ret;
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2344 }
84a5dc41f64faad drivers/spi/spi-pl022.c Ulf Hansson 2014-03-01 2345 #endif
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2346
736198b0486c8d5 drivers/spi/spi-pl022.c Ulf Hansson 2014-03-01 2347 #ifdef CONFIG_PM
92b97f0aaccbf9d drivers/spi/spi-pl022.c Russell King 2011-08-14 2348 static int pl022_runtime_suspend(struct device *dev)
92b97f0aaccbf9d drivers/spi/spi-pl022.c Russell King 2011-08-14 2349 {
92b97f0aaccbf9d drivers/spi/spi-pl022.c Russell King 2011-08-14 2350 struct pl022 *pl022 = dev_get_drvdata(dev);
4f5e1b370845a0a drivers/spi/spi-pl022.c Patrice Chotard 2012-09-19 2351
84a5dc41f64faad drivers/spi/spi-pl022.c Ulf Hansson 2014-03-01 2352 clk_disable_unprepare(pl022->clk);
84a5dc41f64faad drivers/spi/spi-pl022.c Ulf Hansson 2014-03-01 2353 pinctrl_pm_select_idle_state(dev);
84a5dc41f64faad drivers/spi/spi-pl022.c Ulf Hansson 2014-03-01 2354
92b97f0aaccbf9d drivers/spi/spi-pl022.c Russell King 2011-08-14 2355 return 0;
92b97f0aaccbf9d drivers/spi/spi-pl022.c Russell King 2011-08-14 2356 }
92b97f0aaccbf9d drivers/spi/spi-pl022.c Russell King 2011-08-14 2357
92b97f0aaccbf9d drivers/spi/spi-pl022.c Russell King 2011-08-14 2358 static int pl022_runtime_resume(struct device *dev)
92b97f0aaccbf9d drivers/spi/spi-pl022.c Russell King 2011-08-14 2359 {
92b97f0aaccbf9d drivers/spi/spi-pl022.c Russell King 2011-08-14 2360 struct pl022 *pl022 = dev_get_drvdata(dev);
92b97f0aaccbf9d drivers/spi/spi-pl022.c Russell King 2011-08-14 2361
84a5dc41f64faad drivers/spi/spi-pl022.c Ulf Hansson 2014-03-01 2362 pinctrl_pm_select_default_state(dev);
84a5dc41f64faad drivers/spi/spi-pl022.c Ulf Hansson 2014-03-01 2363 clk_prepare_enable(pl022->clk);
84a5dc41f64faad drivers/spi/spi-pl022.c Ulf Hansson 2014-03-01 2364
92b97f0aaccbf9d drivers/spi/spi-pl022.c Russell King 2011-08-14 2365 return 0;
92b97f0aaccbf9d drivers/spi/spi-pl022.c Russell King 2011-08-14 2366 }
92b97f0aaccbf9d drivers/spi/spi-pl022.c Russell King 2011-08-14 2367 #endif
92b97f0aaccbf9d drivers/spi/spi-pl022.c Russell King 2011-08-14 2368
92b97f0aaccbf9d drivers/spi/spi-pl022.c Russell King 2011-08-14 2369 static const struct dev_pm_ops pl022_dev_pm_ops = {
92b97f0aaccbf9d drivers/spi/spi-pl022.c Russell King 2011-08-14 2370 SET_SYSTEM_SLEEP_PM_OPS(pl022_suspend, pl022_resume)
6ed23b806e73bdd drivers/spi/spi-pl022.c Rafael J. Wysocki 2014-12-04 2371 SET_RUNTIME_PM_OPS(pl022_runtime_suspend, pl022_runtime_resume, NULL)
92b97f0aaccbf9d drivers/spi/spi-pl022.c Russell King 2011-08-14 2372 };
92b97f0aaccbf9d drivers/spi/spi-pl022.c Russell King 2011-08-14 2373
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2374 static struct vendor_data vendor_arm = {
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2375 .fifodepth = 8,
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2376 .max_bpw = 16,
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2377 .unidir = false,
556f4aeb7d9dfac drivers/spi/amba-pl022.c Linus Walleij 2010-05-05 2378 .extended_cr = false,
781c7b129b1beb8 drivers/spi/amba-pl022.c Linus Walleij 2010-05-07 2379 .pl023 = false,
06fb01fd1dc624d drivers/spi/amba-pl022.c Philippe Langlais 2011-03-23 2380 .loopback = true,
db4fa45ed3182d8 drivers/spi/spi-pl022.c Anders Berg 2014-09-17 2381 .internal_cs_ctrl = false,
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2382 };
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2383
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2384 static struct vendor_data vendor_st = {
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2385 .fifodepth = 32,
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2386 .max_bpw = 32,
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2387 .unidir = false,
556f4aeb7d9dfac drivers/spi/amba-pl022.c Linus Walleij 2010-05-05 2388 .extended_cr = true,
781c7b129b1beb8 drivers/spi/amba-pl022.c Linus Walleij 2010-05-07 2389 .pl023 = false,
06fb01fd1dc624d drivers/spi/amba-pl022.c Philippe Langlais 2011-03-23 2390 .loopback = true,
db4fa45ed3182d8 drivers/spi/spi-pl022.c Anders Berg 2014-09-17 2391 .internal_cs_ctrl = false,
781c7b129b1beb8 drivers/spi/amba-pl022.c Linus Walleij 2010-05-07 2392 };
781c7b129b1beb8 drivers/spi/amba-pl022.c Linus Walleij 2010-05-07 2393
781c7b129b1beb8 drivers/spi/amba-pl022.c Linus Walleij 2010-05-07 2394 static struct vendor_data vendor_st_pl023 = {
781c7b129b1beb8 drivers/spi/amba-pl022.c Linus Walleij 2010-05-07 2395 .fifodepth = 32,
781c7b129b1beb8 drivers/spi/amba-pl022.c Linus Walleij 2010-05-07 2396 .max_bpw = 32,
781c7b129b1beb8 drivers/spi/amba-pl022.c Linus Walleij 2010-05-07 2397 .unidir = false,
781c7b129b1beb8 drivers/spi/amba-pl022.c Linus Walleij 2010-05-07 2398 .extended_cr = true,
781c7b129b1beb8 drivers/spi/amba-pl022.c Linus Walleij 2010-05-07 2399 .pl023 = true,
06fb01fd1dc624d drivers/spi/amba-pl022.c Philippe Langlais 2011-03-23 2400 .loopback = false,
db4fa45ed3182d8 drivers/spi/spi-pl022.c Anders Berg 2014-09-17 2401 .internal_cs_ctrl = false,
db4fa45ed3182d8 drivers/spi/spi-pl022.c Anders Berg 2014-09-17 2402 };
db4fa45ed3182d8 drivers/spi/spi-pl022.c Anders Berg 2014-09-17 2403
db4fa45ed3182d8 drivers/spi/spi-pl022.c Anders Berg 2014-09-17 2404 static struct vendor_data vendor_lsi = {
db4fa45ed3182d8 drivers/spi/spi-pl022.c Anders Berg 2014-09-17 2405 .fifodepth = 8,
db4fa45ed3182d8 drivers/spi/spi-pl022.c Anders Berg 2014-09-17 2406 .max_bpw = 16,
db4fa45ed3182d8 drivers/spi/spi-pl022.c Anders Berg 2014-09-17 2407 .unidir = false,
db4fa45ed3182d8 drivers/spi/spi-pl022.c Anders Berg 2014-09-17 2408 .extended_cr = false,
db4fa45ed3182d8 drivers/spi/spi-pl022.c Anders Berg 2014-09-17 2409 .pl023 = false,
db4fa45ed3182d8 drivers/spi/spi-pl022.c Anders Berg 2014-09-17 2410 .loopback = true,
db4fa45ed3182d8 drivers/spi/spi-pl022.c Anders Berg 2014-09-17 2411 .internal_cs_ctrl = true,
06fb01fd1dc624d drivers/spi/amba-pl022.c Philippe Langlais 2011-03-23 2412 };
06fb01fd1dc624d drivers/spi/amba-pl022.c Philippe Langlais 2011-03-23 2413
5b8d5ad2308d2d5 drivers/spi/spi-pl022.c Arvind Yadav 2017-08-23 2414 static const struct amba_id pl022_ids[] = {
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2415 {
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2416 /*
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2417 * ARM PL022 variant, this has a 16bit wide
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2418 * and 8 locations deep TX/RX FIFO
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2419 */
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2420 .id = 0x00041022,
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2421 .mask = 0x000fffff,
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2422 .data = &vendor_arm,
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2423 },
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2424 {
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2425 /*
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2426 * ST Micro derivative, this has 32bit wide
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2427 * and 32 locations deep TX/RX FIFO
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2428 */
e89e04fcdce6146 drivers/spi/amba-pl022.c Srinidhi Kasagar 2009-10-05 2429 .id = 0x01080022,
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2430 .mask = 0xffffffff,
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2431 .data = &vendor_st,
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2432 },
781c7b129b1beb8 drivers/spi/amba-pl022.c Linus Walleij 2010-05-07 2433 {
781c7b129b1beb8 drivers/spi/amba-pl022.c Linus Walleij 2010-05-07 2434 /*
781c7b129b1beb8 drivers/spi/amba-pl022.c Linus Walleij 2010-05-07 2435 * ST-Ericsson derivative "PL023" (this is not
781c7b129b1beb8 drivers/spi/amba-pl022.c Linus Walleij 2010-05-07 2436 * an official ARM number), this is a PL022 SSP block
781c7b129b1beb8 drivers/spi/amba-pl022.c Linus Walleij 2010-05-07 2437 * stripped to SPI mode only, it has 32bit wide
781c7b129b1beb8 drivers/spi/amba-pl022.c Linus Walleij 2010-05-07 2438 * and 32 locations deep TX/RX FIFO but no extended
781c7b129b1beb8 drivers/spi/amba-pl022.c Linus Walleij 2010-05-07 2439 * CR0/CR1 register
781c7b129b1beb8 drivers/spi/amba-pl022.c Linus Walleij 2010-05-07 2440 */
781c7b129b1beb8 drivers/spi/amba-pl022.c Linus Walleij 2010-05-07 2441 .id = 0x00080023,
781c7b129b1beb8 drivers/spi/amba-pl022.c Linus Walleij 2010-05-07 2442 .mask = 0xffffffff,
781c7b129b1beb8 drivers/spi/amba-pl022.c Linus Walleij 2010-05-07 2443 .data = &vendor_st_pl023,
781c7b129b1beb8 drivers/spi/amba-pl022.c Linus Walleij 2010-05-07 2444 },
db4fa45ed3182d8 drivers/spi/spi-pl022.c Anders Berg 2014-09-17 2445 {
db4fa45ed3182d8 drivers/spi/spi-pl022.c Anders Berg 2014-09-17 2446 /*
db4fa45ed3182d8 drivers/spi/spi-pl022.c Anders Berg 2014-09-17 2447 * PL022 variant that has a chip select control register whih
db4fa45ed3182d8 drivers/spi/spi-pl022.c Anders Berg 2014-09-17 2448 * allows control of 5 output signals nCS[0:4].
db4fa45ed3182d8 drivers/spi/spi-pl022.c Anders Berg 2014-09-17 2449 */
db4fa45ed3182d8 drivers/spi/spi-pl022.c Anders Berg 2014-09-17 2450 .id = 0x000b6022,
db4fa45ed3182d8 drivers/spi/spi-pl022.c Anders Berg 2014-09-17 2451 .mask = 0x000fffff,
db4fa45ed3182d8 drivers/spi/spi-pl022.c Anders Berg 2014-09-17 2452 .data = &vendor_lsi,
db4fa45ed3182d8 drivers/spi/spi-pl022.c Anders Berg 2014-09-17 2453 },
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2454 { 0, 0 },
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2455 };
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2456
7eeac71b9fc9b3d drivers/spi/spi-pl022.c Dave Martin 2011-10-05 2457 MODULE_DEVICE_TABLE(amba, pl022_ids);
7eeac71b9fc9b3d drivers/spi/spi-pl022.c Dave Martin 2011-10-05 2458
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2459 static struct amba_driver pl022_driver = {
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2460 .drv = {
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2461 .name = "ssp-pl022",
92b97f0aaccbf9d drivers/spi/spi-pl022.c Russell King 2011-08-14 2462 .pm = &pl022_dev_pm_ops,
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2463 },
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2464 .id_table = pl022_ids,
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2465 .probe = pl022_probe,
fd4a319bc933ae9 drivers/spi/spi-pl022.c Grant Likely 2012-12-07 2466 .remove = pl022_remove,
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2467 };
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2468
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2469 static int __init pl022_init(void)
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2470 {
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2471 return amba_driver_register(&pl022_driver);
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2472 }
25c8e03bdb769df drivers/spi/amba-pl022.c Linus Walleij 2010-09-06 2473 subsys_initcall(pl022_init);
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2474
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2475 static void __exit pl022_exit(void)
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2476 {
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2477 amba_driver_unregister(&pl022_driver);
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2478 }
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2479 module_exit(pl022_exit);
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2480
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2481 MODULE_AUTHOR("Linus Walleij <linus.walleij@stericsson.com>");
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2482 MODULE_DESCRIPTION("PL022 SSP Controller Driver");
b43d65f7e818485 drivers/spi/amba-pl022.c Linus Walleij 2009-06-09 2483 MODULE_LICENSE("GPL");
:::::: The code at line 442 was first introduced by commit
:::::: db4fa45ed3182d8206af241811dfc99369ffa849 spi: pl022: Add support for chip select extension
:::::: TO: Anders Berg <anders.berg@avagotech.com>
:::::: CC: Mark Brown <broonie@kernel.org>
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 71383 bytes --]
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2019-08-06 6:29 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-08-06 6:28 [gpio:gpio-descriptors-spi 5/5] drivers//spi/spi-pl022.c:442:22: error: 'struct pl022' has no member named 'cur_cs'; did you mean 'cur_msg'? kbuild test robot
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).