summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/spi/spi-pxa2xx.c21
-rw-r--r--include/linux/pxa2xx_ssp.h1
2 files changed, 21 insertions, 1 deletions
diff --git a/drivers/spi/spi-pxa2xx.c b/drivers/spi/spi-pxa2xx.c
index 81d68e01046a..0eb79368eabc 100644
--- a/drivers/spi/spi-pxa2xx.c
+++ b/drivers/spi/spi-pxa2xx.c
@@ -83,6 +83,7 @@ struct lpss_config {
83 /* Chip select control */ 83 /* Chip select control */
84 unsigned cs_sel_shift; 84 unsigned cs_sel_shift;
85 unsigned cs_sel_mask; 85 unsigned cs_sel_mask;
86 unsigned cs_num;
86}; 87};
87 88
88/* Keep these sorted with enum pxa_ssp_type */ 89/* Keep these sorted with enum pxa_ssp_type */
@@ -107,6 +108,19 @@ static const struct lpss_config lpss_platforms[] = {
107 .tx_threshold_lo = 160, 108 .tx_threshold_lo = 160,
108 .tx_threshold_hi = 224, 109 .tx_threshold_hi = 224,
109 }, 110 },
111 { /* LPSS_BSW_SSP */
112 .offset = 0x400,
113 .reg_general = 0x08,
114 .reg_ssp = 0x0c,
115 .reg_cs_ctrl = 0x18,
116 .reg_capabilities = -1,
117 .rx_threshold = 64,
118 .tx_threshold_lo = 160,
119 .tx_threshold_hi = 224,
120 .cs_sel_shift = 2,
121 .cs_sel_mask = 1 << 2,
122 .cs_num = 2,
123 },
110 { /* LPSS_SPT_SSP */ 124 { /* LPSS_SPT_SSP */
111 .offset = 0x200, 125 .offset = 0x200,
112 .reg_general = -1, 126 .reg_general = -1,
@@ -142,6 +156,7 @@ static bool is_lpss_ssp(const struct driver_data *drv_data)
142 switch (drv_data->ssp_type) { 156 switch (drv_data->ssp_type) {
143 case LPSS_LPT_SSP: 157 case LPSS_LPT_SSP:
144 case LPSS_BYT_SSP: 158 case LPSS_BYT_SSP:
159 case LPSS_BSW_SSP:
145 case LPSS_SPT_SSP: 160 case LPSS_SPT_SSP:
146 case LPSS_BXT_SSP: 161 case LPSS_BXT_SSP:
147 return true; 162 return true;
@@ -1189,6 +1204,7 @@ static int setup(struct spi_device *spi)
1189 break; 1204 break;
1190 case LPSS_LPT_SSP: 1205 case LPSS_LPT_SSP:
1191 case LPSS_BYT_SSP: 1206 case LPSS_BYT_SSP:
1207 case LPSS_BSW_SSP:
1192 case LPSS_SPT_SSP: 1208 case LPSS_SPT_SSP:
1193 case LPSS_BXT_SSP: 1209 case LPSS_BXT_SSP:
1194 config = lpss_get_config(drv_data); 1210 config = lpss_get_config(drv_data);
@@ -1336,7 +1352,7 @@ static const struct acpi_device_id pxa2xx_spi_acpi_match[] = {
1336 { "INT3430", LPSS_LPT_SSP }, 1352 { "INT3430", LPSS_LPT_SSP },
1337 { "INT3431", LPSS_LPT_SSP }, 1353 { "INT3431", LPSS_LPT_SSP },
1338 { "80860F0E", LPSS_BYT_SSP }, 1354 { "80860F0E", LPSS_BYT_SSP },
1339 { "8086228E", LPSS_BYT_SSP }, 1355 { "8086228E", LPSS_BSW_SSP },
1340 { }, 1356 { },
1341}; 1357};
1342MODULE_DEVICE_TABLE(acpi, pxa2xx_spi_acpi_match); 1358MODULE_DEVICE_TABLE(acpi, pxa2xx_spi_acpi_match);
@@ -1473,6 +1489,7 @@ static int pxa2xx_spi_fw_translate_cs(struct spi_master *master, unsigned cs)
1473 * to match what Linux expects. 1489 * to match what Linux expects.
1474 */ 1490 */
1475 case LPSS_BYT_SSP: 1491 case LPSS_BYT_SSP:
1492 case LPSS_BSW_SSP:
1476 return cs - 1; 1493 return cs - 1;
1477 1494
1478 default: 1495 default:
@@ -1622,6 +1639,8 @@ static int pxa2xx_spi_probe(struct platform_device *pdev)
1622 tmp &= LPSS_CAPS_CS_EN_MASK; 1639 tmp &= LPSS_CAPS_CS_EN_MASK;
1623 tmp >>= LPSS_CAPS_CS_EN_SHIFT; 1640 tmp >>= LPSS_CAPS_CS_EN_SHIFT;
1624 platform_info->num_chipselect = ffz(tmp); 1641 platform_info->num_chipselect = ffz(tmp);
1642 } else if (config->cs_num) {
1643 platform_info->num_chipselect = config->cs_num;
1625 } 1644 }
1626 } 1645 }
1627 master->num_chipselect = platform_info->num_chipselect; 1646 master->num_chipselect = platform_info->num_chipselect;
diff --git a/include/linux/pxa2xx_ssp.h b/include/linux/pxa2xx_ssp.h
index c2f2574ff61c..2a097d176ba9 100644
--- a/include/linux/pxa2xx_ssp.h
+++ b/include/linux/pxa2xx_ssp.h
@@ -197,6 +197,7 @@ enum pxa_ssp_type {
197 QUARK_X1000_SSP, 197 QUARK_X1000_SSP,
198 LPSS_LPT_SSP, /* Keep LPSS types sorted with lpss_platforms[] */ 198 LPSS_LPT_SSP, /* Keep LPSS types sorted with lpss_platforms[] */
199 LPSS_BYT_SSP, 199 LPSS_BYT_SSP,
200 LPSS_BSW_SSP,
200 LPSS_SPT_SSP, 201 LPSS_SPT_SSP,
201 LPSS_BXT_SSP, 202 LPSS_BXT_SSP,
202}; 203};