aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjiada wang <jiada_wang@mentor.com>2017-06-08 01:16:00 -0400
committerMark Brown <broonie@kernel.org>2017-07-17 07:09:47 -0400
commitfd8d4e2d1f20e9a5dbbdb16ee9b594726a7c5a2d (patch)
tree73dc3126e084db0aeb749036c046368c02876ed6
parent5771a8c08880cdca3bfb4a3fc6d309d6bba20877 (diff)
spi: imx: introduce fifo_size and has_dmamode in spi_imx_devtype_data
Different ECSPI controller has different fifosize and DMA capability, instead of calling functions to identify these information by check devtype. add fifo_size and has_dmamode to spi_imx_devtype_data. so that these information can be directly accessed. Signed-off-by: Jiada Wang <jiada_wang@mentor.com> Reviewed-by: Sascha Hauer <s.hauer@pengutronix.de> Signed-off-by: Mark Brown <broonie@kernel.org>
-rw-r--r--drivers/spi/spi-imx.c27
1 files changed, 18 insertions, 9 deletions
diff --git a/drivers/spi/spi-imx.c b/drivers/spi/spi-imx.c
index f9698b7aeb3b..d3093f355dfb 100644
--- a/drivers/spi/spi-imx.c
+++ b/drivers/spi/spi-imx.c
@@ -74,6 +74,8 @@ struct spi_imx_devtype_data {
74 void (*trigger)(struct spi_imx_data *); 74 void (*trigger)(struct spi_imx_data *);
75 int (*rx_available)(struct spi_imx_data *); 75 int (*rx_available)(struct spi_imx_data *);
76 void (*reset)(struct spi_imx_data *); 76 void (*reset)(struct spi_imx_data *);
77 bool has_dmamode;
78 unsigned int fifo_size;
77 enum spi_imx_devtype devtype; 79 enum spi_imx_devtype devtype;
78}; 80};
79 81
@@ -125,11 +127,6 @@ static inline int is_imx51_ecspi(struct spi_imx_data *d)
125 return d->devtype_data->devtype == IMX51_ECSPI; 127 return d->devtype_data->devtype == IMX51_ECSPI;
126} 128}
127 129
128static inline unsigned spi_imx_get_fifosize(struct spi_imx_data *d)
129{
130 return is_imx51_ecspi(d) ? 64 : 8;
131}
132
133#define MXC_SPI_BUF_RX(type) \ 130#define MXC_SPI_BUF_RX(type) \
134static void spi_imx_buf_rx_##type(struct spi_imx_data *spi_imx) \ 131static void spi_imx_buf_rx_##type(struct spi_imx_data *spi_imx) \
135{ \ 132{ \
@@ -219,7 +216,7 @@ static bool spi_imx_can_dma(struct spi_master *master, struct spi_device *spi,
219 if (bytes_per_word != 1 && bytes_per_word != 2 && bytes_per_word != 4) 216 if (bytes_per_word != 1 && bytes_per_word != 2 && bytes_per_word != 4)
220 return false; 217 return false;
221 218
222 for (i = spi_imx_get_fifosize(spi_imx) / 2; i > 0; i--) { 219 for (i = spi_imx->devtype_data->fifo_size / 2; i > 0; i--) {
223 if (!(transfer->len % (i * bytes_per_word))) 220 if (!(transfer->len % (i * bytes_per_word)))
224 break; 221 break;
225 } 222 }
@@ -693,6 +690,8 @@ static struct spi_imx_devtype_data imx1_cspi_devtype_data = {
693 .trigger = mx1_trigger, 690 .trigger = mx1_trigger,
694 .rx_available = mx1_rx_available, 691 .rx_available = mx1_rx_available,
695 .reset = mx1_reset, 692 .reset = mx1_reset,
693 .fifo_size = 8,
694 .has_dmamode = false,
696 .devtype = IMX1_CSPI, 695 .devtype = IMX1_CSPI,
697}; 696};
698 697
@@ -702,6 +701,8 @@ static struct spi_imx_devtype_data imx21_cspi_devtype_data = {
702 .trigger = mx21_trigger, 701 .trigger = mx21_trigger,
703 .rx_available = mx21_rx_available, 702 .rx_available = mx21_rx_available,
704 .reset = mx21_reset, 703 .reset = mx21_reset,
704 .fifo_size = 8,
705 .has_dmamode = false,
705 .devtype = IMX21_CSPI, 706 .devtype = IMX21_CSPI,
706}; 707};
707 708
@@ -712,6 +713,8 @@ static struct spi_imx_devtype_data imx27_cspi_devtype_data = {
712 .trigger = mx21_trigger, 713 .trigger = mx21_trigger,
713 .rx_available = mx21_rx_available, 714 .rx_available = mx21_rx_available,
714 .reset = mx21_reset, 715 .reset = mx21_reset,
716 .fifo_size = 8,
717 .has_dmamode = false,
715 .devtype = IMX27_CSPI, 718 .devtype = IMX27_CSPI,
716}; 719};
717 720
@@ -721,6 +724,8 @@ static struct spi_imx_devtype_data imx31_cspi_devtype_data = {
721 .trigger = mx31_trigger, 724 .trigger = mx31_trigger,
722 .rx_available = mx31_rx_available, 725 .rx_available = mx31_rx_available,
723 .reset = mx31_reset, 726 .reset = mx31_reset,
727 .fifo_size = 8,
728 .has_dmamode = false,
724 .devtype = IMX31_CSPI, 729 .devtype = IMX31_CSPI,
725}; 730};
726 731
@@ -731,6 +736,8 @@ static struct spi_imx_devtype_data imx35_cspi_devtype_data = {
731 .trigger = mx31_trigger, 736 .trigger = mx31_trigger,
732 .rx_available = mx31_rx_available, 737 .rx_available = mx31_rx_available,
733 .reset = mx31_reset, 738 .reset = mx31_reset,
739 .fifo_size = 8,
740 .has_dmamode = true,
734 .devtype = IMX35_CSPI, 741 .devtype = IMX35_CSPI,
735}; 742};
736 743
@@ -740,6 +747,8 @@ static struct spi_imx_devtype_data imx51_ecspi_devtype_data = {
740 .trigger = mx51_ecspi_trigger, 747 .trigger = mx51_ecspi_trigger,
741 .rx_available = mx51_ecspi_rx_available, 748 .rx_available = mx51_ecspi_rx_available,
742 .reset = mx51_ecspi_reset, 749 .reset = mx51_ecspi_reset,
750 .fifo_size = 64,
751 .has_dmamode = true,
743 .devtype = IMX51_ECSPI, 752 .devtype = IMX51_ECSPI,
744}; 753};
745 754
@@ -791,7 +800,7 @@ static void spi_imx_chipselect(struct spi_device *spi, int is_active)
791 800
792static void spi_imx_push(struct spi_imx_data *spi_imx) 801static void spi_imx_push(struct spi_imx_data *spi_imx)
793{ 802{
794 while (spi_imx->txfifo < spi_imx_get_fifosize(spi_imx)) { 803 while (spi_imx->txfifo < spi_imx->devtype_data->fifo_size) {
795 if (!spi_imx->count) 804 if (!spi_imx->count)
796 break; 805 break;
797 spi_imx->tx(spi_imx); 806 spi_imx->tx(spi_imx);
@@ -938,7 +947,7 @@ static int spi_imx_sdma_init(struct device *dev, struct spi_imx_data *spi_imx,
938 if (of_machine_is_compatible("fsl,imx6dl")) 947 if (of_machine_is_compatible("fsl,imx6dl"))
939 return 0; 948 return 0;
940 949
941 spi_imx->wml = spi_imx_get_fifosize(spi_imx) / 2; 950 spi_imx->wml = spi_imx->devtype_data->fifo_size / 2;
942 951
943 /* Prepare for TX DMA: */ 952 /* Prepare for TX DMA: */
944 master->dma_tx = dma_request_slave_channel_reason(dev, "tx"); 953 master->dma_tx = dma_request_slave_channel_reason(dev, "tx");
@@ -1262,7 +1271,7 @@ static int spi_imx_probe(struct platform_device *pdev)
1262 * Only validated on i.mx35 and i.mx6 now, can remove the constraint 1271 * Only validated on i.mx35 and i.mx6 now, can remove the constraint
1263 * if validated on other chips. 1272 * if validated on other chips.
1264 */ 1273 */
1265 if (is_imx35_cspi(spi_imx) || is_imx51_ecspi(spi_imx)) { 1274 if (spi_imx->devtype_data->has_dmamode) {
1266 ret = spi_imx_sdma_init(&pdev->dev, spi_imx, master); 1275 ret = spi_imx_sdma_init(&pdev->dev, spi_imx, master);
1267 if (ret == -EPROBE_DEFER) 1276 if (ret == -EPROBE_DEFER)
1268 goto out_clk_put; 1277 goto out_clk_put;