aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Walleij <linus.walleij@stericsson.com>2010-05-05 05:28:15 -0400
committerGrant Likely <grant.likely@secretlab.ca>2010-05-25 02:23:13 -0400
commit556f4aeb7d9dfac8573d0281dd555bd3210d8366 (patch)
tree43103539c2cdaae5a1032168076c52049e846025
parent338ff2982d969a8e09ca356552cb5022ad380766 (diff)
spi/pl022: fix up differences between ARM and ST versions
The PL022 SPI driver did not cleanly separate between the original unmodified ARM version and the ST Microelectronics versions. Split this more cleanly and fix some whitespace moaning from checkpatch at the same time. Signed-off-by: Linus Walleij <linus.walleij@stericsson.com> Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
-rw-r--r--drivers/spi/amba-pl022.c178
-rw-r--r--include/linux/amba/pl022.h4
2 files changed, 125 insertions, 57 deletions
diff --git a/drivers/spi/amba-pl022.c b/drivers/spi/amba-pl022.c
index e9aeee16d922..65092171cec3 100644
--- a/drivers/spi/amba-pl022.c
+++ b/drivers/spi/amba-pl022.c
@@ -102,13 +102,21 @@
102/* 102/*
103 * SSP Control Register 0 - SSP_CR0 103 * SSP Control Register 0 - SSP_CR0
104 */ 104 */
105#define SSP_CR0_MASK_DSS (0x1FUL << 0) 105#define SSP_CR0_MASK_DSS (0x0FUL << 0)
106#define SSP_CR0_MASK_HALFDUP (0x1UL << 5) 106#define SSP_CR0_MASK_FRF (0x3UL << 4)
107#define SSP_CR0_MASK_SPO (0x1UL << 6) 107#define SSP_CR0_MASK_SPO (0x1UL << 6)
108#define SSP_CR0_MASK_SPH (0x1UL << 7) 108#define SSP_CR0_MASK_SPH (0x1UL << 7)
109#define SSP_CR0_MASK_SCR (0xFFUL << 8) 109#define SSP_CR0_MASK_SCR (0xFFUL << 8)
110#define SSP_CR0_MASK_CSS (0x1FUL << 16) 110
111#define SSP_CR0_MASK_FRF (0x3UL << 21) 111/*
112 * The ST version of this block moves som bits
113 * in SSP_CR0 and extends it to 32 bits
114 */
115#define SSP_CR0_MASK_DSS_ST (0x1FUL << 0)
116#define SSP_CR0_MASK_HALFDUP_ST (0x1UL << 5)
117#define SSP_CR0_MASK_CSS_ST (0x1FUL << 16)
118#define SSP_CR0_MASK_FRF_ST (0x3UL << 21)
119
112 120
113/* 121/*
114 * SSP Control Register 0 - SSP_CR1 122 * SSP Control Register 0 - SSP_CR1
@@ -117,16 +125,16 @@
117#define SSP_CR1_MASK_SSE (0x1UL << 1) 125#define SSP_CR1_MASK_SSE (0x1UL << 1)
118#define SSP_CR1_MASK_MS (0x1UL << 2) 126#define SSP_CR1_MASK_MS (0x1UL << 2)
119#define SSP_CR1_MASK_SOD (0x1UL << 3) 127#define SSP_CR1_MASK_SOD (0x1UL << 3)
120#define SSP_CR1_MASK_RENDN (0x1UL << 4)
121#define SSP_CR1_MASK_TENDN (0x1UL << 5)
122#define SSP_CR1_MASK_MWAIT (0x1UL << 6)
123#define SSP_CR1_MASK_RXIFLSEL (0x7UL << 7)
124#define SSP_CR1_MASK_TXIFLSEL (0x7UL << 10)
125 128
126/* 129/*
127 * SSP Data Register - SSP_DR 130 * The ST version of this block adds some bits
131 * in SSP_CR1
128 */ 132 */
129#define SSP_DR_MASK_DATA 0xFFFFFFFF 133#define SSP_CR1_MASK_RENDN_ST (0x1UL << 4)
134#define SSP_CR1_MASK_TENDN_ST (0x1UL << 5)
135#define SSP_CR1_MASK_MWAIT_ST (0x1UL << 6)
136#define SSP_CR1_MASK_RXIFLSEL_ST (0x7UL << 7)
137#define SSP_CR1_MASK_TXIFLSEL_ST (0x7UL << 10)
130 138
131/* 139/*
132 * SSP Status Register - SSP_SR 140 * SSP Status Register - SSP_SR
@@ -134,7 +142,7 @@
134#define SSP_SR_MASK_TFE (0x1UL << 0) /* Transmit FIFO empty */ 142#define SSP_SR_MASK_TFE (0x1UL << 0) /* Transmit FIFO empty */
135#define SSP_SR_MASK_TNF (0x1UL << 1) /* Transmit FIFO not full */ 143#define SSP_SR_MASK_TNF (0x1UL << 1) /* Transmit FIFO not full */
136#define SSP_SR_MASK_RNE (0x1UL << 2) /* Receive FIFO not empty */ 144#define SSP_SR_MASK_RNE (0x1UL << 2) /* Receive FIFO not empty */
137#define SSP_SR_MASK_RFF (0x1UL << 3) /* Receive FIFO full */ 145#define SSP_SR_MASK_RFF (0x1UL << 3) /* Receive FIFO full */
138#define SSP_SR_MASK_BSY (0x1UL << 4) /* Busy Flag */ 146#define SSP_SR_MASK_BSY (0x1UL << 4) /* Busy Flag */
139 147
140/* 148/*
@@ -227,7 +235,7 @@
227/* 235/*
228 * SSP Test Data Register - SSP_TDR 236 * SSP Test Data Register - SSP_TDR
229 */ 237 */
230#define TDR_MASK_TESTDATA (0xFFFFFFFF) 238#define TDR_MASK_TESTDATA (0xFFFFFFFF)
231 239
232/* 240/*
233 * Message State 241 * Message State
@@ -235,33 +243,33 @@
235 * hold a single state value, that's why all this 243 * hold a single state value, that's why all this
236 * (void *) casting is done here. 244 * (void *) casting is done here.
237 */ 245 */
238#define STATE_START ((void *) 0) 246#define STATE_START ((void *) 0)
239#define STATE_RUNNING ((void *) 1) 247#define STATE_RUNNING ((void *) 1)
240#define STATE_DONE ((void *) 2) 248#define STATE_DONE ((void *) 2)
241#define STATE_ERROR ((void *) -1) 249#define STATE_ERROR ((void *) -1)
242 250
243/* 251/*
244 * Queue State 252 * Queue State
245 */ 253 */
246#define QUEUE_RUNNING (0) 254#define QUEUE_RUNNING (0)
247#define QUEUE_STOPPED (1) 255#define QUEUE_STOPPED (1)
248/* 256/*
249 * SSP State - Whether Enabled or Disabled 257 * SSP State - Whether Enabled or Disabled
250 */ 258 */
251#define SSP_DISABLED (0) 259#define SSP_DISABLED (0)
252#define SSP_ENABLED (1) 260#define SSP_ENABLED (1)
253 261
254/* 262/*
255 * SSP DMA State - Whether DMA Enabled or Disabled 263 * SSP DMA State - Whether DMA Enabled or Disabled
256 */ 264 */
257#define SSP_DMA_DISABLED (0) 265#define SSP_DMA_DISABLED (0)
258#define SSP_DMA_ENABLED (1) 266#define SSP_DMA_ENABLED (1)
259 267
260/* 268/*
261 * SSP Clock Defaults 269 * SSP Clock Defaults
262 */ 270 */
263#define NMDK_SSP_DEFAULT_CLKRATE 0x2 271#define SSP_DEFAULT_CLKRATE 0x2
264#define NMDK_SSP_DEFAULT_PRESCALE 0x40 272#define SSP_DEFAULT_PRESCALE 0x40
265 273
266/* 274/*
267 * SSP Clock Parameter ranges 275 * SSP Clock Parameter ranges
@@ -307,16 +315,20 @@ enum ssp_writing {
307 * @fifodepth: depth of FIFOs (both) 315 * @fifodepth: depth of FIFOs (both)
308 * @max_bpw: maximum number of bits per word 316 * @max_bpw: maximum number of bits per word
309 * @unidir: supports unidirection transfers 317 * @unidir: supports unidirection transfers
318 * @extended_cr: 32 bit wide control register 0 with extra
319 * features and extra features in CR1 as found in the ST variants
310 */ 320 */
311struct vendor_data { 321struct vendor_data {
312 int fifodepth; 322 int fifodepth;
313 int max_bpw; 323 int max_bpw;
314 bool unidir; 324 bool unidir;
325 bool extended_cr;
315}; 326};
316 327
317/** 328/**
318 * struct pl022 - This is the private SSP driver data structure 329 * struct pl022 - This is the private SSP driver data structure
319 * @adev: AMBA device model hookup 330 * @adev: AMBA device model hookup
331 * @vendor: Vendor data for the IP block
320 * @phybase: The physical memory where the SSP device resides 332 * @phybase: The physical memory where the SSP device resides
321 * @virtbase: The virtual memory where the SSP is mapped 333 * @virtbase: The virtual memory where the SSP is mapped
322 * @master: SPI framework hookup 334 * @master: SPI framework hookup
@@ -369,7 +381,8 @@ struct pl022 {
369 381
370/** 382/**
371 * struct chip_data - To maintain runtime state of SSP for each client chip 383 * struct chip_data - To maintain runtime state of SSP for each client chip
372 * @cr0: Value of control register CR0 of SSP 384 * @cr0: Value of control register CR0 of SSP - on later ST variants this
385 * register is 32 bits wide rather than just 16
373 * @cr1: Value of control register CR1 of SSP 386 * @cr1: Value of control register CR1 of SSP
374 * @dmacr: Value of DMA control Register of SSP 387 * @dmacr: Value of DMA control Register of SSP
375 * @cpsr: Value of Clock prescale register 388 * @cpsr: Value of Clock prescale register
@@ -384,7 +397,7 @@ struct pl022 {
384 * This would be set according to the current message that would be served 397 * This would be set according to the current message that would be served
385 */ 398 */
386struct chip_data { 399struct chip_data {
387 u16 cr0; 400 u32 cr0;
388 u16 cr1; 401 u16 cr1;
389 u16 dmacr; 402 u16 dmacr;
390 u16 cpsr; 403 u16 cpsr;
@@ -517,7 +530,10 @@ static void restore_state(struct pl022 *pl022)
517{ 530{
518 struct chip_data *chip = pl022->cur_chip; 531 struct chip_data *chip = pl022->cur_chip;
519 532
520 writew(chip->cr0, SSP_CR0(pl022->virtbase)); 533 if (pl022->vendor->extended_cr)
534 writel(chip->cr0, SSP_CR0(pl022->virtbase));
535 else
536 writew(chip->cr0, SSP_CR0(pl022->virtbase));
521 writew(chip->cr1, SSP_CR1(pl022->virtbase)); 537 writew(chip->cr1, SSP_CR1(pl022->virtbase));
522 writew(chip->dmacr, SSP_DMACR(pl022->virtbase)); 538 writew(chip->dmacr, SSP_DMACR(pl022->virtbase));
523 writew(chip->cpsr, SSP_CPSR(pl022->virtbase)); 539 writew(chip->cpsr, SSP_CPSR(pl022->virtbase));
@@ -535,28 +551,43 @@ static void restore_state(struct pl022 *pl022)
535 */ 551 */
536#define DEFAULT_SSP_REG_CR0 ( \ 552#define DEFAULT_SSP_REG_CR0 ( \
537 GEN_MASK_BITS(SSP_DATA_BITS_12, SSP_CR0_MASK_DSS, 0) | \ 553 GEN_MASK_BITS(SSP_DATA_BITS_12, SSP_CR0_MASK_DSS, 0) | \
538 GEN_MASK_BITS(SSP_MICROWIRE_CHANNEL_FULL_DUPLEX, SSP_CR0_MASK_HALFDUP, 5) | \ 554 GEN_MASK_BITS(SSP_INTERFACE_MOTOROLA_SPI, SSP_CR0_MASK_FRF, 4) | \
555 GEN_MASK_BITS(SSP_CLK_POL_IDLE_LOW, SSP_CR0_MASK_SPO, 6) | \
556 GEN_MASK_BITS(SSP_CLK_SECOND_EDGE, SSP_CR0_MASK_SPH, 7) | \
557 GEN_MASK_BITS(SSP_DEFAULT_CLKRATE, SSP_CR0_MASK_SCR, 8) \
558)
559
560/* ST versions have slightly different bit layout */
561#define DEFAULT_SSP_REG_CR0_ST ( \
562 GEN_MASK_BITS(SSP_DATA_BITS_12, SSP_CR0_MASK_DSS_ST, 0) | \
563 GEN_MASK_BITS(SSP_MICROWIRE_CHANNEL_FULL_DUPLEX, SSP_CR0_MASK_HALFDUP_ST, 5) | \
539 GEN_MASK_BITS(SSP_CLK_POL_IDLE_LOW, SSP_CR0_MASK_SPO, 6) | \ 564 GEN_MASK_BITS(SSP_CLK_POL_IDLE_LOW, SSP_CR0_MASK_SPO, 6) | \
540 GEN_MASK_BITS(SSP_CLK_SECOND_EDGE, SSP_CR0_MASK_SPH, 7) | \ 565 GEN_MASK_BITS(SSP_CLK_SECOND_EDGE, SSP_CR0_MASK_SPH, 7) | \
541 GEN_MASK_BITS(NMDK_SSP_DEFAULT_CLKRATE, SSP_CR0_MASK_SCR, 8) | \ 566 GEN_MASK_BITS(SSP_DEFAULT_CLKRATE, SSP_CR0_MASK_SCR, 8) | \
542 GEN_MASK_BITS(SSP_BITS_8, SSP_CR0_MASK_CSS, 16) | \ 567 GEN_MASK_BITS(SSP_BITS_8, SSP_CR0_MASK_CSS_ST, 16) | \
543 GEN_MASK_BITS(SSP_INTERFACE_MOTOROLA_SPI, SSP_CR0_MASK_FRF, 21) \ 568 GEN_MASK_BITS(SSP_INTERFACE_MOTOROLA_SPI, SSP_CR0_MASK_FRF_ST, 21) \
544) 569)
545 570
546#define DEFAULT_SSP_REG_CR1 ( \ 571#define DEFAULT_SSP_REG_CR1 ( \
547 GEN_MASK_BITS(LOOPBACK_DISABLED, SSP_CR1_MASK_LBM, 0) | \ 572 GEN_MASK_BITS(LOOPBACK_DISABLED, SSP_CR1_MASK_LBM, 0) | \
548 GEN_MASK_BITS(SSP_DISABLED, SSP_CR1_MASK_SSE, 1) | \ 573 GEN_MASK_BITS(SSP_DISABLED, SSP_CR1_MASK_SSE, 1) | \
549 GEN_MASK_BITS(SSP_MASTER, SSP_CR1_MASK_MS, 2) | \ 574 GEN_MASK_BITS(SSP_MASTER, SSP_CR1_MASK_MS, 2) | \
550 GEN_MASK_BITS(DO_NOT_DRIVE_TX, SSP_CR1_MASK_SOD, 3) | \ 575 GEN_MASK_BITS(DO_NOT_DRIVE_TX, SSP_CR1_MASK_SOD, 3) \
551 GEN_MASK_BITS(SSP_RX_MSB, SSP_CR1_MASK_RENDN, 4) | \
552 GEN_MASK_BITS(SSP_TX_MSB, SSP_CR1_MASK_TENDN, 5) | \
553 GEN_MASK_BITS(SSP_MWIRE_WAIT_ZERO, SSP_CR1_MASK_MWAIT, 6) |\
554 GEN_MASK_BITS(SSP_RX_1_OR_MORE_ELEM, SSP_CR1_MASK_RXIFLSEL, 7) | \
555 GEN_MASK_BITS(SSP_TX_1_OR_MORE_EMPTY_LOC, SSP_CR1_MASK_TXIFLSEL, 10) \
556) 576)
557 577
578/* ST versions extend this register to use all 16 bits */
579#define DEFAULT_SSP_REG_CR1_ST ( \
580 DEFAULT_SSP_REG_CR1 | \
581 GEN_MASK_BITS(SSP_RX_MSB, SSP_CR1_MASK_RENDN_ST, 4) | \
582 GEN_MASK_BITS(SSP_TX_MSB, SSP_CR1_MASK_TENDN_ST, 5) | \
583 GEN_MASK_BITS(SSP_MWIRE_WAIT_ZERO, SSP_CR1_MASK_MWAIT_ST, 6) |\
584 GEN_MASK_BITS(SSP_RX_1_OR_MORE_ELEM, SSP_CR1_MASK_RXIFLSEL_ST, 7) | \
585 GEN_MASK_BITS(SSP_TX_1_OR_MORE_EMPTY_LOC, SSP_CR1_MASK_TXIFLSEL_ST, 10) \
586)
587
588
558#define DEFAULT_SSP_REG_CPSR ( \ 589#define DEFAULT_SSP_REG_CPSR ( \
559 GEN_MASK_BITS(NMDK_SSP_DEFAULT_PRESCALE, SSP_CPSR_MASK_CPSDVSR, 0) \ 590 GEN_MASK_BITS(SSP_DEFAULT_PRESCALE, SSP_CPSR_MASK_CPSDVSR, 0) \
560) 591)
561 592
562#define DEFAULT_SSP_REG_DMACR (\ 593#define DEFAULT_SSP_REG_DMACR (\
@@ -567,8 +598,13 @@ static void restore_state(struct pl022 *pl022)
567 598
568static void load_ssp_default_config(struct pl022 *pl022) 599static void load_ssp_default_config(struct pl022 *pl022)
569{ 600{
570 writew(DEFAULT_SSP_REG_CR0, SSP_CR0(pl022->virtbase)); 601 if (pl022->vendor->extended_cr) {
571 writew(DEFAULT_SSP_REG_CR1, SSP_CR1(pl022->virtbase)); 602 writel(DEFAULT_SSP_REG_CR0_ST, SSP_CR0(pl022->virtbase));
603 writew(DEFAULT_SSP_REG_CR1_ST, SSP_CR1(pl022->virtbase));
604 } else {
605 writew(DEFAULT_SSP_REG_CR0, SSP_CR0(pl022->virtbase));
606 writew(DEFAULT_SSP_REG_CR1, SSP_CR1(pl022->virtbase));
607 }
572 writew(DEFAULT_SSP_REG_DMACR, SSP_DMACR(pl022->virtbase)); 608 writew(DEFAULT_SSP_REG_DMACR, SSP_DMACR(pl022->virtbase));
573 writew(DEFAULT_SSP_REG_CPSR, SSP_CPSR(pl022->virtbase)); 609 writew(DEFAULT_SSP_REG_CPSR, SSP_CPSR(pl022->virtbase));
574 writew(DISABLE_ALL_INTERRUPTS, SSP_IMSC(pl022->virtbase)); 610 writew(DISABLE_ALL_INTERRUPTS, SSP_IMSC(pl022->virtbase));
@@ -1008,7 +1044,7 @@ static void do_polling_transfer(void *data)
1008 writew((readw(SSP_CR1(pl022->virtbase)) | SSP_CR1_MASK_SSE), 1044 writew((readw(SSP_CR1(pl022->virtbase)) | SSP_CR1_MASK_SSE),
1009 SSP_CR1(pl022->virtbase)); 1045 SSP_CR1(pl022->virtbase));
1010 1046
1011 dev_dbg(&pl022->adev->dev, "POLLING TRANSFER ONGOING ... \n"); 1047 dev_dbg(&pl022->adev->dev, "polling transfer ongoing ...\n");
1012 /* FIXME: insert a timeout so we don't hang here indefinately */ 1048 /* FIXME: insert a timeout so we don't hang here indefinately */
1013 while (pl022->tx < pl022->tx_end || pl022->rx < pl022->rx_end) 1049 while (pl022->tx < pl022->tx_end || pl022->rx < pl022->rx_end)
1014 readwriter(pl022); 1050 readwriter(pl022);
@@ -1280,11 +1316,21 @@ static int verify_controller_parameters(struct pl022 *pl022,
1280 "Wait State is configured incorrectly\n"); 1316 "Wait State is configured incorrectly\n");
1281 return -EINVAL; 1317 return -EINVAL;
1282 } 1318 }
1283 if ((chip_info->duplex != SSP_MICROWIRE_CHANNEL_FULL_DUPLEX) 1319 /* Half duplex is only available in the ST Micro version */
1284 && (chip_info->duplex != 1320 if (pl022->vendor->extended_cr) {
1285 SSP_MICROWIRE_CHANNEL_HALF_DUPLEX)) { 1321 if ((chip_info->duplex !=
1286 dev_err(chip_info->dev, 1322 SSP_MICROWIRE_CHANNEL_FULL_DUPLEX)
1287 "DUPLEX is configured incorrectly\n"); 1323 && (chip_info->duplex !=
1324 SSP_MICROWIRE_CHANNEL_HALF_DUPLEX))
1325 dev_err(chip_info->dev,
1326 "Microwire duplex mode is configured incorrectly\n");
1327 return -EINVAL;
1328 } else {
1329 if (chip_info->duplex != SSP_MICROWIRE_CHANNEL_FULL_DUPLEX)
1330 dev_err(chip_info->dev,
1331 "Microwire half duplex mode requested,"
1332 " but this is only available in the"
1333 " ST version of PL022\n");
1288 return -EINVAL; 1334 return -EINVAL;
1289 } 1335 }
1290 } 1336 }
@@ -1581,22 +1627,40 @@ static int pl022_setup(struct spi_device *spi)
1581 1627
1582 chip->cpsr = chip_info->clk_freq.cpsdvsr; 1628 chip->cpsr = chip_info->clk_freq.cpsdvsr;
1583 1629
1584 SSP_WRITE_BITS(chip->cr0, chip_info->data_size, SSP_CR0_MASK_DSS, 0); 1630 /* Special setup for the ST micro extended control registers */
1585 SSP_WRITE_BITS(chip->cr0, chip_info->duplex, SSP_CR0_MASK_HALFDUP, 5); 1631 if (pl022->vendor->extended_cr) {
1632 SSP_WRITE_BITS(chip->cr0, chip_info->data_size,
1633 SSP_CR0_MASK_DSS_ST, 0);
1634 SSP_WRITE_BITS(chip->cr0, chip_info->duplex,
1635 SSP_CR0_MASK_HALFDUP_ST, 5);
1636 SSP_WRITE_BITS(chip->cr0, chip_info->ctrl_len,
1637 SSP_CR0_MASK_CSS_ST, 16);
1638 SSP_WRITE_BITS(chip->cr0, chip_info->iface,
1639 SSP_CR0_MASK_FRF_ST, 21);
1640 SSP_WRITE_BITS(chip->cr1, chip_info->endian_rx,
1641 SSP_CR1_MASK_RENDN_ST, 4);
1642 SSP_WRITE_BITS(chip->cr1, chip_info->endian_tx,
1643 SSP_CR1_MASK_TENDN_ST, 5);
1644 SSP_WRITE_BITS(chip->cr1, chip_info->wait_state,
1645 SSP_CR1_MASK_MWAIT_ST, 6);
1646 SSP_WRITE_BITS(chip->cr1, chip_info->rx_lev_trig,
1647 SSP_CR1_MASK_RXIFLSEL_ST, 7);
1648 SSP_WRITE_BITS(chip->cr1, chip_info->tx_lev_trig,
1649 SSP_CR1_MASK_TXIFLSEL_ST, 10);
1650 } else {
1651 SSP_WRITE_BITS(chip->cr0, chip_info->data_size,
1652 SSP_CR0_MASK_DSS, 0);
1653 SSP_WRITE_BITS(chip->cr0, chip_info->iface,
1654 SSP_CR0_MASK_FRF, 4);
1655 }
1656 /* Stuff that is common for all versions */
1586 SSP_WRITE_BITS(chip->cr0, chip_info->clk_pol, SSP_CR0_MASK_SPO, 6); 1657 SSP_WRITE_BITS(chip->cr0, chip_info->clk_pol, SSP_CR0_MASK_SPO, 6);
1587 SSP_WRITE_BITS(chip->cr0, chip_info->clk_phase, SSP_CR0_MASK_SPH, 7); 1658 SSP_WRITE_BITS(chip->cr0, chip_info->clk_phase, SSP_CR0_MASK_SPH, 7);
1588 SSP_WRITE_BITS(chip->cr0, chip_info->clk_freq.scr, SSP_CR0_MASK_SCR, 8); 1659 SSP_WRITE_BITS(chip->cr0, chip_info->clk_freq.scr, SSP_CR0_MASK_SCR, 8);
1589 SSP_WRITE_BITS(chip->cr0, chip_info->ctrl_len, SSP_CR0_MASK_CSS, 16);
1590 SSP_WRITE_BITS(chip->cr0, chip_info->iface, SSP_CR0_MASK_FRF, 21);
1591 SSP_WRITE_BITS(chip->cr1, chip_info->lbm, SSP_CR1_MASK_LBM, 0); 1660 SSP_WRITE_BITS(chip->cr1, chip_info->lbm, SSP_CR1_MASK_LBM, 0);
1592 SSP_WRITE_BITS(chip->cr1, SSP_DISABLED, SSP_CR1_MASK_SSE, 1); 1661 SSP_WRITE_BITS(chip->cr1, SSP_DISABLED, SSP_CR1_MASK_SSE, 1);
1593 SSP_WRITE_BITS(chip->cr1, chip_info->hierarchy, SSP_CR1_MASK_MS, 2); 1662 SSP_WRITE_BITS(chip->cr1, chip_info->hierarchy, SSP_CR1_MASK_MS, 2);
1594 SSP_WRITE_BITS(chip->cr1, chip_info->slave_tx_disable, SSP_CR1_MASK_SOD, 3); 1663 SSP_WRITE_BITS(chip->cr1, chip_info->slave_tx_disable, SSP_CR1_MASK_SOD, 3);
1595 SSP_WRITE_BITS(chip->cr1, chip_info->endian_rx, SSP_CR1_MASK_RENDN, 4);
1596 SSP_WRITE_BITS(chip->cr1, chip_info->endian_tx, SSP_CR1_MASK_TENDN, 5);
1597 SSP_WRITE_BITS(chip->cr1, chip_info->wait_state, SSP_CR1_MASK_MWAIT, 6);
1598 SSP_WRITE_BITS(chip->cr1, chip_info->rx_lev_trig, SSP_CR1_MASK_RXIFLSEL, 7);
1599 SSP_WRITE_BITS(chip->cr1, chip_info->tx_lev_trig, SSP_CR1_MASK_TXIFLSEL, 10);
1600 1664
1601 /* Save controller_state */ 1665 /* Save controller_state */
1602 spi_set_ctldata(spi, chip); 1666 spi_set_ctldata(spi, chip);
@@ -1809,6 +1873,7 @@ static struct vendor_data vendor_arm = {
1809 .fifodepth = 8, 1873 .fifodepth = 8,
1810 .max_bpw = 16, 1874 .max_bpw = 16,
1811 .unidir = false, 1875 .unidir = false,
1876 .extended_cr = false,
1812}; 1877};
1813 1878
1814 1879
@@ -1816,6 +1881,7 @@ static struct vendor_data vendor_st = {
1816 .fifodepth = 32, 1881 .fifodepth = 32,
1817 .max_bpw = 32, 1882 .max_bpw = 32,
1818 .unidir = false, 1883 .unidir = false,
1884 .extended_cr = true,
1819}; 1885};
1820 1886
1821static struct amba_id pl022_ids[] = { 1887static struct amba_id pl022_ids[] = {
diff --git a/include/linux/amba/pl022.h b/include/linux/amba/pl022.h
index e4836c6b3dd7..612f39913340 100644
--- a/include/linux/amba/pl022.h
+++ b/include/linux/amba/pl022.h
@@ -71,6 +71,7 @@ struct ssp_clock_params {
71 71
72/** 72/**
73 * enum ssp_rx_endian - endianess of Rx FIFO Data 73 * enum ssp_rx_endian - endianess of Rx FIFO Data
74 * this feature is only available in ST versionf of PL022
74 */ 75 */
75enum ssp_rx_endian { 76enum ssp_rx_endian {
76 SSP_RX_MSB, 77 SSP_RX_MSB,
@@ -181,7 +182,8 @@ enum ssp_microwire_wait_state {
181}; 182};
182 183
183/** 184/**
184 * enum Microwire - whether Full/Half Duplex 185 * enum Microwire - whether Full/Half Duplex, only available
186 * in the ST Micro variant.
185 * @SSP_MICROWIRE_CHANNEL_FULL_DUPLEX: SSPTXD becomes bi-directional, 187 * @SSP_MICROWIRE_CHANNEL_FULL_DUPLEX: SSPTXD becomes bi-directional,
186 * SSPRXD not used 188 * SSPRXD not used
187 * @SSP_MICROWIRE_CHANNEL_HALF_DUPLEX: SSPTXD is an output, SSPRXD is 189 * @SSP_MICROWIRE_CHANNEL_HALF_DUPLEX: SSPTXD is an output, SSPRXD is