aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/spi/spi-pxa2xx.c
diff options
context:
space:
mode:
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>2016-09-07 08:43:22 -0400
committerMark Brown <broonie@kernel.org>2016-09-12 15:01:43 -0400
commit7c7289a40425d48bbfcaacc454a8caf5b47f63b0 (patch)
tree5b7789114fb9ae509a231e6f0d9b460ec7652378 /drivers/spi/spi-pxa2xx.c
parent96579a4e56bdecfb4642cfb68eb85d079acb9d28 (diff)
spi: pxa2xx: Default thresholds to PXA configuration
Most of the devices in the supported list have PXA configuration of FIFO. In particularly Intel Medfield and Merrifield have bigger FIFO, than it's defined for CE4100. Split CE4100 in the similar way how it was done for Intel Quark, i.e. prefix definitions by CE4100 and append necessary pieces of code to switch case conditions. We are on safe side since those bits are ignored on all LPSS IPs. Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> Reviewed-by: Jarkko Nikula <jarkko.nikula@linux.intel.com> Signed-off-by: Mark Brown <broonie@kernel.org>
Diffstat (limited to 'drivers/spi/spi-pxa2xx.c')
-rw-r--r--drivers/spi/spi-pxa2xx.c47
1 files changed, 42 insertions, 5 deletions
diff --git a/drivers/spi/spi-pxa2xx.c b/drivers/spi/spi-pxa2xx.c
index 6a0eb32408b6..cab39b06bc89 100644
--- a/drivers/spi/spi-pxa2xx.c
+++ b/drivers/spi/spi-pxa2xx.c
@@ -62,6 +62,13 @@ MODULE_ALIAS("platform:pxa2xx-spi");
62 | QUARK_X1000_SSCR1_TFT \ 62 | QUARK_X1000_SSCR1_TFT \
63 | SSCR1_SPH | SSCR1_SPO | SSCR1_LBM) 63 | SSCR1_SPH | SSCR1_SPO | SSCR1_LBM)
64 64
65#define CE4100_SSCR1_CHANGE_MASK (SSCR1_TTELP | SSCR1_TTE | SSCR1_SCFR \
66 | SSCR1_ECRA | SSCR1_ECRB | SSCR1_SCLKDIR \
67 | SSCR1_SFRMDIR | SSCR1_RWOT | SSCR1_TRAIL \
68 | SSCR1_IFS | SSCR1_STRF | SSCR1_EFWR \
69 | CE4100_SSCR1_RFT | CE4100_SSCR1_TFT | SSCR1_MWDS \
70 | SSCR1_SPH | SSCR1_SPO | SSCR1_LBM)
71
65#define LPSS_GENERAL_REG_RXTO_HOLDOFF_DISABLE BIT(24) 72#define LPSS_GENERAL_REG_RXTO_HOLDOFF_DISABLE BIT(24)
66#define LPSS_CS_CONTROL_SW_MODE BIT(0) 73#define LPSS_CS_CONTROL_SW_MODE BIT(0)
67#define LPSS_CS_CONTROL_CS_HIGH BIT(1) 74#define LPSS_CS_CONTROL_CS_HIGH BIT(1)
@@ -175,6 +182,8 @@ static u32 pxa2xx_spi_get_ssrc1_change_mask(const struct driver_data *drv_data)
175 switch (drv_data->ssp_type) { 182 switch (drv_data->ssp_type) {
176 case QUARK_X1000_SSP: 183 case QUARK_X1000_SSP:
177 return QUARK_X1000_SSCR1_CHANGE_MASK; 184 return QUARK_X1000_SSCR1_CHANGE_MASK;
185 case CE4100_SSP:
186 return CE4100_SSCR1_CHANGE_MASK;
178 default: 187 default:
179 return SSCR1_CHANGE_MASK; 188 return SSCR1_CHANGE_MASK;
180 } 189 }
@@ -186,6 +195,8 @@ pxa2xx_spi_get_rx_default_thre(const struct driver_data *drv_data)
186 switch (drv_data->ssp_type) { 195 switch (drv_data->ssp_type) {
187 case QUARK_X1000_SSP: 196 case QUARK_X1000_SSP:
188 return RX_THRESH_QUARK_X1000_DFLT; 197 return RX_THRESH_QUARK_X1000_DFLT;
198 case CE4100_SSP:
199 return RX_THRESH_CE4100_DFLT;
189 default: 200 default:
190 return RX_THRESH_DFLT; 201 return RX_THRESH_DFLT;
191 } 202 }
@@ -199,6 +210,9 @@ static bool pxa2xx_spi_txfifo_full(const struct driver_data *drv_data)
199 case QUARK_X1000_SSP: 210 case QUARK_X1000_SSP:
200 mask = QUARK_X1000_SSSR_TFL_MASK; 211 mask = QUARK_X1000_SSSR_TFL_MASK;
201 break; 212 break;
213 case CE4100_SSP:
214 mask = CE4100_SSSR_TFL_MASK;
215 break;
202 default: 216 default:
203 mask = SSSR_TFL_MASK; 217 mask = SSSR_TFL_MASK;
204 break; 218 break;
@@ -216,6 +230,9 @@ static void pxa2xx_spi_clear_rx_thre(const struct driver_data *drv_data,
216 case QUARK_X1000_SSP: 230 case QUARK_X1000_SSP:
217 mask = QUARK_X1000_SSCR1_RFT; 231 mask = QUARK_X1000_SSCR1_RFT;
218 break; 232 break;
233 case CE4100_SSP:
234 mask = CE4100_SSCR1_RFT;
235 break;
219 default: 236 default:
220 mask = SSCR1_RFT; 237 mask = SSCR1_RFT;
221 break; 238 break;
@@ -230,6 +247,9 @@ static void pxa2xx_spi_set_rx_thre(const struct driver_data *drv_data,
230 case QUARK_X1000_SSP: 247 case QUARK_X1000_SSP:
231 *sccr1_reg |= QUARK_X1000_SSCR1_RxTresh(threshold); 248 *sccr1_reg |= QUARK_X1000_SSCR1_RxTresh(threshold);
232 break; 249 break;
250 case CE4100_SSP:
251 *sccr1_reg |= CE4100_SSCR1_RxTresh(threshold);
252 break;
233 default: 253 default:
234 *sccr1_reg |= SSCR1_RxTresh(threshold); 254 *sccr1_reg |= SSCR1_RxTresh(threshold);
235 break; 255 break;
@@ -590,6 +610,9 @@ static void reset_sccr1(struct driver_data *drv_data)
590 case QUARK_X1000_SSP: 610 case QUARK_X1000_SSP:
591 sccr1_reg &= ~QUARK_X1000_SSCR1_RFT; 611 sccr1_reg &= ~QUARK_X1000_SSCR1_RFT;
592 break; 612 break;
613 case CE4100_SSP:
614 sccr1_reg &= ~CE4100_SSCR1_RFT;
615 break;
593 default: 616 default:
594 sccr1_reg &= ~SSCR1_RFT; 617 sccr1_reg &= ~SSCR1_RFT;
595 break; 618 break;
@@ -1220,6 +1243,11 @@ static int setup(struct spi_device *spi)
1220 tx_hi_thres = 0; 1243 tx_hi_thres = 0;
1221 rx_thres = RX_THRESH_QUARK_X1000_DFLT; 1244 rx_thres = RX_THRESH_QUARK_X1000_DFLT;
1222 break; 1245 break;
1246 case CE4100_SSP:
1247 tx_thres = TX_THRESH_CE4100_DFLT;
1248 tx_hi_thres = 0;
1249 rx_thres = RX_THRESH_CE4100_DFLT;
1250 break;
1223 case LPSS_LPT_SSP: 1251 case LPSS_LPT_SSP:
1224 case LPSS_BYT_SSP: 1252 case LPSS_BYT_SSP:
1225 case LPSS_BSW_SSP: 1253 case LPSS_BSW_SSP:
@@ -1304,6 +1332,10 @@ static int setup(struct spi_device *spi)
1304 | (QUARK_X1000_SSCR1_TxTresh(tx_thres) 1332 | (QUARK_X1000_SSCR1_TxTresh(tx_thres)
1305 & QUARK_X1000_SSCR1_TFT); 1333 & QUARK_X1000_SSCR1_TFT);
1306 break; 1334 break;
1335 case CE4100_SSP:
1336 chip->threshold = (CE4100_SSCR1_RxTresh(rx_thres) & CE4100_SSCR1_RFT) |
1337 (CE4100_SSCR1_TxTresh(tx_thres) & CE4100_SSCR1_TFT);
1338 break;
1307 default: 1339 default:
1308 chip->threshold = (SSCR1_RxTresh(rx_thres) & SSCR1_RFT) | 1340 chip->threshold = (SSCR1_RxTresh(rx_thres) & SSCR1_RFT) |
1309 (SSCR1_TxTresh(tx_thres) & SSCR1_TFT); 1341 (SSCR1_TxTresh(tx_thres) & SSCR1_TFT);
@@ -1625,15 +1657,20 @@ static int pxa2xx_spi_probe(struct platform_device *pdev)
1625 pxa2xx_spi_write(drv_data, SSCR0, 0); 1657 pxa2xx_spi_write(drv_data, SSCR0, 0);
1626 switch (drv_data->ssp_type) { 1658 switch (drv_data->ssp_type) {
1627 case QUARK_X1000_SSP: 1659 case QUARK_X1000_SSP:
1628 tmp = QUARK_X1000_SSCR1_RxTresh(RX_THRESH_QUARK_X1000_DFLT) 1660 tmp = QUARK_X1000_SSCR1_RxTresh(RX_THRESH_QUARK_X1000_DFLT) |
1629 | QUARK_X1000_SSCR1_TxTresh(TX_THRESH_QUARK_X1000_DFLT); 1661 QUARK_X1000_SSCR1_TxTresh(TX_THRESH_QUARK_X1000_DFLT);
1630 pxa2xx_spi_write(drv_data, SSCR1, tmp); 1662 pxa2xx_spi_write(drv_data, SSCR1, tmp);
1631 1663
1632 /* using the Motorola SPI protocol and use 8 bit frame */ 1664 /* using the Motorola SPI protocol and use 8 bit frame */
1633 pxa2xx_spi_write(drv_data, SSCR0, 1665 tmp = QUARK_X1000_SSCR0_Motorola | QUARK_X1000_SSCR0_DataSize(8);
1634 QUARK_X1000_SSCR0_Motorola 1666 pxa2xx_spi_write(drv_data, SSCR0, tmp);
1635 | QUARK_X1000_SSCR0_DataSize(8));
1636 break; 1667 break;
1668 case CE4100_SSP:
1669 tmp = CE4100_SSCR1_RxTresh(RX_THRESH_CE4100_DFLT) |
1670 CE4100_SSCR1_TxTresh(TX_THRESH_CE4100_DFLT);
1671 pxa2xx_spi_write(drv_data, SSCR1, tmp);
1672 tmp = SSCR0_SCR(2) | SSCR0_Motorola | SSCR0_DataSize(8);
1673 pxa2xx_spi_write(drv_data, SSCR0, tmp);
1637 default: 1674 default:
1638 tmp = SSCR1_RxTresh(RX_THRESH_DFLT) | 1675 tmp = SSCR1_RxTresh(RX_THRESH_DFLT) |
1639 SSCR1_TxTresh(TX_THRESH_DFLT); 1676 SSCR1_TxTresh(TX_THRESH_DFLT);