aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWeike Chen <alvin.chen@intel.com>2014-10-08 11:50:22 -0400
committerMark Brown <broonie@kernel.org>2014-11-24 14:00:01 -0500
commit4fdb2424cc4499237197a8c9d35b34d68c750475 (patch)
tree7752eaffb5df46255a2016a2f7d8af35c9d101fd
parent5d01410fe4d92081f349b013a2e7a95429e4f2c9 (diff)
spi: spi-pxa2xx: Add helpers for regiseters' accessing
There are several registers for SPI, and the registers of 'SSCR0' and 'SSCR1' are accessed frequently. This path is to introduce helper functions to simplify the accessing of 'SSCR0' and 'SSCR1'. Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> Acked-by: Mika Westerberg <mika.westerberg@linux.intel.com> Signed-off-by: Weike Chen <alvin.chen@intel.com> Signed-off-by: Mark Brown <broonie@kernel.org>
-rw-r--r--drivers/spi/spi-pxa2xx.c107
1 files changed, 84 insertions, 23 deletions
diff --git a/drivers/spi/spi-pxa2xx.c b/drivers/spi/spi-pxa2xx.c
index 9e9e0f971e6c..d4d29c594156 100644
--- a/drivers/spi/spi-pxa2xx.c
+++ b/drivers/spi/spi-pxa2xx.c
@@ -80,6 +80,73 @@ static bool is_lpss_ssp(const struct driver_data *drv_data)
80 return drv_data->ssp_type == LPSS_SSP; 80 return drv_data->ssp_type == LPSS_SSP;
81} 81}
82 82
83static u32 pxa2xx_spi_get_ssrc1_change_mask(const struct driver_data *drv_data)
84{
85 switch (drv_data->ssp_type) {
86 default:
87 return SSCR1_CHANGE_MASK;
88 }
89}
90
91static u32
92pxa2xx_spi_get_rx_default_thre(const struct driver_data *drv_data)
93{
94 switch (drv_data->ssp_type) {
95 default:
96 return RX_THRESH_DFLT;
97 }
98}
99
100static bool pxa2xx_spi_txfifo_full(const struct driver_data *drv_data)
101{
102 void __iomem *reg = drv_data->ioaddr;
103 u32 mask;
104
105 switch (drv_data->ssp_type) {
106 default:
107 mask = SSSR_TFL_MASK;
108 break;
109 }
110
111 return (read_SSSR(reg) & mask) == mask;
112}
113
114static void pxa2xx_spi_clear_rx_thre(const struct driver_data *drv_data,
115 u32 *sccr1_reg)
116{
117 u32 mask;
118
119 switch (drv_data->ssp_type) {
120 default:
121 mask = SSCR1_RFT;
122 break;
123 }
124 *sccr1_reg &= ~mask;
125}
126
127static void pxa2xx_spi_set_rx_thre(const struct driver_data *drv_data,
128 u32 *sccr1_reg, u32 threshold)
129{
130 switch (drv_data->ssp_type) {
131 default:
132 *sccr1_reg |= SSCR1_RxTresh(threshold);
133 break;
134 }
135}
136
137static u32 pxa2xx_configure_sscr0(const struct driver_data *drv_data,
138 u32 clk_div, u8 bits)
139{
140 switch (drv_data->ssp_type) {
141 default:
142 return clk_div
143 | SSCR0_Motorola
144 | SSCR0_DataSize(bits > 16 ? bits - 16 : bits)
145 | SSCR0_SSE
146 | (bits > 16 ? SSCR0_EDSS : 0);
147 }
148}
149
83/* 150/*
84 * Read and write LPSS SSP private registers. Caller must first check that 151 * Read and write LPSS SSP private registers. Caller must first check that
85 * is_lpss_ssp() returns true before these can be called. 152 * is_lpss_ssp() returns true before these can be called.
@@ -234,7 +301,7 @@ static int null_writer(struct driver_data *drv_data)
234 void __iomem *reg = drv_data->ioaddr; 301 void __iomem *reg = drv_data->ioaddr;
235 u8 n_bytes = drv_data->n_bytes; 302 u8 n_bytes = drv_data->n_bytes;
236 303
237 if (((read_SSSR(reg) & SSSR_TFL_MASK) == SSSR_TFL_MASK) 304 if (pxa2xx_spi_txfifo_full(drv_data)
238 || (drv_data->tx == drv_data->tx_end)) 305 || (drv_data->tx == drv_data->tx_end))
239 return 0; 306 return 0;
240 307
@@ -262,7 +329,7 @@ static int u8_writer(struct driver_data *drv_data)
262{ 329{
263 void __iomem *reg = drv_data->ioaddr; 330 void __iomem *reg = drv_data->ioaddr;
264 331
265 if (((read_SSSR(reg) & SSSR_TFL_MASK) == SSSR_TFL_MASK) 332 if (pxa2xx_spi_txfifo_full(drv_data)
266 || (drv_data->tx == drv_data->tx_end)) 333 || (drv_data->tx == drv_data->tx_end))
267 return 0; 334 return 0;
268 335
@@ -289,7 +356,7 @@ static int u16_writer(struct driver_data *drv_data)
289{ 356{
290 void __iomem *reg = drv_data->ioaddr; 357 void __iomem *reg = drv_data->ioaddr;
291 358
292 if (((read_SSSR(reg) & SSSR_TFL_MASK) == SSSR_TFL_MASK) 359 if (pxa2xx_spi_txfifo_full(drv_data)
293 || (drv_data->tx == drv_data->tx_end)) 360 || (drv_data->tx == drv_data->tx_end))
294 return 0; 361 return 0;
295 362
@@ -316,7 +383,7 @@ static int u32_writer(struct driver_data *drv_data)
316{ 383{
317 void __iomem *reg = drv_data->ioaddr; 384 void __iomem *reg = drv_data->ioaddr;
318 385
319 if (((read_SSSR(reg) & SSSR_TFL_MASK) == SSSR_TFL_MASK) 386 if (pxa2xx_spi_txfifo_full(drv_data)
320 || (drv_data->tx == drv_data->tx_end)) 387 || (drv_data->tx == drv_data->tx_end))
321 return 0; 388 return 0;
322 389
@@ -508,8 +575,9 @@ static irqreturn_t interrupt_transfer(struct driver_data *drv_data)
508 * remaining RX bytes. 575 * remaining RX bytes.
509 */ 576 */
510 if (pxa25x_ssp_comp(drv_data)) { 577 if (pxa25x_ssp_comp(drv_data)) {
578 u32 rx_thre;
511 579
512 sccr1_reg &= ~SSCR1_RFT; 580 pxa2xx_spi_clear_rx_thre(drv_data, &sccr1_reg);
513 581
514 bytes_left = drv_data->rx_end - drv_data->rx; 582 bytes_left = drv_data->rx_end - drv_data->rx;
515 switch (drv_data->n_bytes) { 583 switch (drv_data->n_bytes) {
@@ -519,10 +587,11 @@ static irqreturn_t interrupt_transfer(struct driver_data *drv_data)
519 bytes_left >>= 1; 587 bytes_left >>= 1;
520 } 588 }
521 589
522 if (bytes_left > RX_THRESH_DFLT) 590 rx_thre = pxa2xx_spi_get_rx_default_thre(drv_data);
523 bytes_left = RX_THRESH_DFLT; 591 if (rx_thre > bytes_left)
592 rx_thre = bytes_left;
524 593
525 sccr1_reg |= SSCR1_RxTresh(bytes_left); 594 pxa2xx_spi_set_rx_thre(drv_data, &sccr1_reg, rx_thre);
526 } 595 }
527 write_SSCR1(sccr1_reg, reg); 596 write_SSCR1(sccr1_reg, reg);
528 } 597 }
@@ -613,6 +682,7 @@ static void pump_transfers(unsigned long data)
613 u32 cr1; 682 u32 cr1;
614 u32 dma_thresh = drv_data->cur_chip->dma_threshold; 683 u32 dma_thresh = drv_data->cur_chip->dma_threshold;
615 u32 dma_burst = drv_data->cur_chip->dma_burst_size; 684 u32 dma_burst = drv_data->cur_chip->dma_burst_size;
685 u32 change_mask = pxa2xx_spi_get_ssrc1_change_mask(drv_data);
616 686
617 /* Get current state information */ 687 /* Get current state information */
618 message = drv_data->cur_msg; 688 message = drv_data->cur_msg;
@@ -731,11 +801,7 @@ static void pump_transfers(unsigned long data)
731 "pump_transfers: DMA burst size reduced to match bits_per_word\n"); 801 "pump_transfers: DMA burst size reduced to match bits_per_word\n");
732 } 802 }
733 803
734 cr0 = clk_div 804 cr0 = pxa2xx_configure_sscr0(drv_data, clk_div, bits);
735 | SSCR0_Motorola
736 | SSCR0_DataSize(bits > 16 ? bits - 16 : bits)
737 | SSCR0_SSE
738 | (bits > 16 ? SSCR0_EDSS : 0);
739 } 805 }
740 806
741 message->state = RUNNING_STATE; 807 message->state = RUNNING_STATE;
@@ -772,16 +838,15 @@ static void pump_transfers(unsigned long data)
772 } 838 }
773 839
774 /* see if we need to reload the config registers */ 840 /* see if we need to reload the config registers */
775 if ((read_SSCR0(reg) != cr0) 841 if ((read_SSCR0(reg) != cr0) ||
776 || (read_SSCR1(reg) & SSCR1_CHANGE_MASK) != 842 (read_SSCR1(reg) & change_mask) != (cr1 & change_mask)) {
777 (cr1 & SSCR1_CHANGE_MASK)) {
778 843
779 /* stop the SSP, and update the other bits */ 844 /* stop the SSP, and update the other bits */
780 write_SSCR0(cr0 & ~SSCR0_SSE, reg); 845 write_SSCR0(cr0 & ~SSCR0_SSE, reg);
781 if (!pxa25x_ssp_comp(drv_data)) 846 if (!pxa25x_ssp_comp(drv_data))
782 write_SSTO(chip->timeout, reg); 847 write_SSTO(chip->timeout, reg);
783 /* first set CR1 without interrupt and service enables */ 848 /* first set CR1 without interrupt and service enables */
784 write_SSCR1(cr1 & SSCR1_CHANGE_MASK, reg); 849 write_SSCR1(cr1 & change_mask, reg);
785 /* restart the SSP */ 850 /* restart the SSP */
786 write_SSCR0(cr0, reg); 851 write_SSCR0(cr0, reg);
787 852
@@ -959,12 +1024,8 @@ static int setup(struct spi_device *spi)
959 clk_div = ssp_get_clk_div(drv_data, spi->max_speed_hz); 1024 clk_div = ssp_get_clk_div(drv_data, spi->max_speed_hz);
960 chip->speed_hz = spi->max_speed_hz; 1025 chip->speed_hz = spi->max_speed_hz;
961 1026
962 chip->cr0 = clk_div 1027 chip->cr0 = pxa2xx_configure_sscr0(drv_data, clk_div,
963 | SSCR0_Motorola 1028 spi->bits_per_word);
964 | SSCR0_DataSize(spi->bits_per_word > 16 ?
965 spi->bits_per_word - 16 : spi->bits_per_word)
966 | SSCR0_SSE
967 | (spi->bits_per_word > 16 ? SSCR0_EDSS : 0);
968 chip->cr1 &= ~(SSCR1_SPO | SSCR1_SPH); 1029 chip->cr1 &= ~(SSCR1_SPO | SSCR1_SPH);
969 chip->cr1 |= (((spi->mode & SPI_CPHA) != 0) ? SSCR1_SPH : 0) 1030 chip->cr1 |= (((spi->mode & SPI_CPHA) != 0) ? SSCR1_SPH : 0)
970 | (((spi->mode & SPI_CPOL) != 0) ? SSCR1_SPO : 0); 1031 | (((spi->mode & SPI_CPOL) != 0) ? SSCR1_SPO : 0);