aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKamal Dasu <kdasu.kdev@gmail.com>2017-01-30 16:11:16 -0500
committerMark Brown <broonie@kernel.org>2017-01-31 16:03:44 -0500
commit81ab52fd94f32aaa8a9c27b41934e4ae932ca106 (patch)
tree1371759e56a09a486a83d6bb7ed18c641a12c018
parent279e4af7b4bebc6a5bf2d0e5b3209f3dcea94a19 (diff)
spi: bcm-qspi: Added mspi read fallback in bcm_qspi_flash_read()
Added mspi read fallback under certain circumstances like unaligned buffer, address on short reads. Also takes care of version 3.0 spi controller where flash address crosses 4MB boundary on transfers the driver resorts to mspi reads. Signed-off-by: Kamal Dasu <kdasu.kdev@gmail.com> Signed-off-by: Mark Brown <broonie@kernel.org>
-rw-r--r--drivers/spi/spi-bcm-qspi.c116
1 files changed, 85 insertions, 31 deletions
diff --git a/drivers/spi/spi-bcm-qspi.c b/drivers/spi/spi-bcm-qspi.c
index 14f9dea3173f..b50b6dfc8c48 100644
--- a/drivers/spi/spi-bcm-qspi.c
+++ b/drivers/spi/spi-bcm-qspi.c
@@ -192,9 +192,11 @@ struct bcm_qspi_dev_id {
192 void *dev; 192 void *dev;
193}; 193};
194 194
195
195struct qspi_trans { 196struct qspi_trans {
196 struct spi_transfer *trans; 197 struct spi_transfer *trans;
197 int byte; 198 int byte;
199 bool mspi_last_trans;
198}; 200};
199 201
200struct bcm_qspi { 202struct bcm_qspi {
@@ -616,6 +618,16 @@ static int bcm_qspi_setup(struct spi_device *spi)
616 return 0; 618 return 0;
617} 619}
618 620
621static bool bcm_qspi_mspi_transfer_is_last(struct bcm_qspi *qspi,
622 struct qspi_trans *qt)
623{
624 if (qt->mspi_last_trans &&
625 spi_transfer_is_last(qspi->master, qt->trans))
626 return true;
627 else
628 return false;
629}
630
619static int update_qspi_trans_byte_count(struct bcm_qspi *qspi, 631static int update_qspi_trans_byte_count(struct bcm_qspi *qspi,
620 struct qspi_trans *qt, int flags) 632 struct qspi_trans *qt, int flags)
621{ 633{
@@ -629,7 +641,6 @@ static int update_qspi_trans_byte_count(struct bcm_qspi *qspi,
629 641
630 if (qt->byte >= qt->trans->len) { 642 if (qt->byte >= qt->trans->len) {
631 /* we're at the end of the spi_transfer */ 643 /* we're at the end of the spi_transfer */
632
633 /* in TX mode, need to pause for a delay or CS change */ 644 /* in TX mode, need to pause for a delay or CS change */
634 if (qt->trans->delay_usecs && 645 if (qt->trans->delay_usecs &&
635 (flags & TRANS_STATUS_BREAK_DELAY)) 646 (flags & TRANS_STATUS_BREAK_DELAY))
@@ -641,7 +652,7 @@ static int update_qspi_trans_byte_count(struct bcm_qspi *qspi,
641 goto done; 652 goto done;
642 653
643 dev_dbg(&qspi->pdev->dev, "advance msg exit\n"); 654 dev_dbg(&qspi->pdev->dev, "advance msg exit\n");
644 if (spi_transfer_is_last(qspi->master, qt->trans)) 655 if (bcm_qspi_mspi_transfer_is_last(qspi, qt))
645 ret = TRANS_STATUS_BREAK_EOM; 656 ret = TRANS_STATUS_BREAK_EOM;
646 else 657 else
647 ret = TRANS_STATUS_BREAK_NO_BYTES; 658 ret = TRANS_STATUS_BREAK_NO_BYTES;
@@ -885,6 +896,76 @@ static int bcm_qspi_bspi_flash_read(struct spi_device *spi,
885 return ret; 896 return ret;
886} 897}
887 898
899static int bcm_qspi_transfer_one(struct spi_master *master,
900 struct spi_device *spi,
901 struct spi_transfer *trans)
902{
903 struct bcm_qspi *qspi = spi_master_get_devdata(master);
904 int slots;
905 unsigned long timeo = msecs_to_jiffies(100);
906
907 bcm_qspi_chip_select(qspi, spi->chip_select);
908 qspi->trans_pos.trans = trans;
909 qspi->trans_pos.byte = 0;
910
911 while (qspi->trans_pos.byte < trans->len) {
912 reinit_completion(&qspi->mspi_done);
913
914 slots = write_to_hw(qspi, spi);
915 if (!wait_for_completion_timeout(&qspi->mspi_done, timeo)) {
916 dev_err(&qspi->pdev->dev, "timeout waiting for MSPI\n");
917 return -ETIMEDOUT;
918 }
919
920 read_from_hw(qspi, slots);
921 }
922
923 return 0;
924}
925
926static int bcm_qspi_mspi_flash_read(struct spi_device *spi,
927 struct spi_flash_read_message *msg)
928{
929 struct bcm_qspi *qspi = spi_master_get_devdata(spi->master);
930 struct spi_transfer t[2];
931 u8 cmd[6];
932 int ret;
933
934 memset(cmd, 0, sizeof(cmd));
935 memset(t, 0, sizeof(t));
936
937 /* tx */
938 /* opcode is in cmd[0] */
939 cmd[0] = msg->read_opcode;
940 cmd[1] = msg->from >> (msg->addr_width * 8 - 8);
941 cmd[2] = msg->from >> (msg->addr_width * 8 - 16);
942 cmd[3] = msg->from >> (msg->addr_width * 8 - 24);
943 cmd[4] = msg->from >> (msg->addr_width * 8 - 32);
944 t[0].tx_buf = cmd;
945 t[0].len = msg->addr_width + msg->dummy_bytes + 1;
946 t[0].bits_per_word = spi->bits_per_word;
947 t[0].tx_nbits = msg->opcode_nbits;
948 /* lets mspi know that this is not last transfer */
949 qspi->trans_pos.mspi_last_trans = false;
950 ret = bcm_qspi_transfer_one(spi->master, spi, &t[0]);
951
952 /* rx */
953 qspi->trans_pos.mspi_last_trans = true;
954 if (!ret) {
955 /* rx */
956 t[1].rx_buf = msg->buf;
957 t[1].len = msg->len;
958 t[1].rx_nbits = msg->data_nbits;
959 t[1].bits_per_word = spi->bits_per_word;
960 ret = bcm_qspi_transfer_one(spi->master, spi, &t[1]);
961 }
962
963 if (!ret)
964 msg->retlen = msg->len;
965
966 return ret;
967}
968
888static int bcm_qspi_flash_read(struct spi_device *spi, 969static int bcm_qspi_flash_read(struct spi_device *spi,
889 struct spi_flash_read_message *msg) 970 struct spi_flash_read_message *msg)
890{ 971{
@@ -918,8 +999,7 @@ static int bcm_qspi_flash_read(struct spi_device *spi,
918 mspi_read = true; 999 mspi_read = true;
919 1000
920 if (mspi_read) 1001 if (mspi_read)
921 /* this will make the m25p80 read to fallback to mspi read */ 1002 return bcm_qspi_mspi_flash_read(spi, msg);
922 return -EAGAIN;
923 1003
924 io_width = msg->data_nbits ? msg->data_nbits : SPI_NBITS_SINGLE; 1004 io_width = msg->data_nbits ? msg->data_nbits : SPI_NBITS_SINGLE;
925 addrlen = msg->addr_width; 1005 addrlen = msg->addr_width;
@@ -931,33 +1011,6 @@ static int bcm_qspi_flash_read(struct spi_device *spi,
931 return ret; 1011 return ret;
932} 1012}
933 1013
934static int bcm_qspi_transfer_one(struct spi_master *master,
935 struct spi_device *spi,
936 struct spi_transfer *trans)
937{
938 struct bcm_qspi *qspi = spi_master_get_devdata(master);
939 int slots;
940 unsigned long timeo = msecs_to_jiffies(100);
941
942 bcm_qspi_chip_select(qspi, spi->chip_select);
943 qspi->trans_pos.trans = trans;
944 qspi->trans_pos.byte = 0;
945
946 while (qspi->trans_pos.byte < trans->len) {
947 reinit_completion(&qspi->mspi_done);
948
949 slots = write_to_hw(qspi, spi);
950 if (!wait_for_completion_timeout(&qspi->mspi_done, timeo)) {
951 dev_err(&qspi->pdev->dev, "timeout waiting for MSPI\n");
952 return -ETIMEDOUT;
953 }
954
955 read_from_hw(qspi, slots);
956 }
957
958 return 0;
959}
960
961static void bcm_qspi_cleanup(struct spi_device *spi) 1014static void bcm_qspi_cleanup(struct spi_device *spi)
962{ 1015{
963 struct bcm_qspi_parms *xp = spi_get_ctldata(spi); 1016 struct bcm_qspi_parms *xp = spi_get_ctldata(spi);
@@ -1187,6 +1240,7 @@ int bcm_qspi_probe(struct platform_device *pdev,
1187 qspi->pdev = pdev; 1240 qspi->pdev = pdev;
1188 qspi->trans_pos.trans = NULL; 1241 qspi->trans_pos.trans = NULL;
1189 qspi->trans_pos.byte = 0; 1242 qspi->trans_pos.byte = 0;
1243 qspi->trans_pos.mspi_last_trans = true;
1190 qspi->master = master; 1244 qspi->master = master;
1191 1245
1192 master->bus_num = -1; 1246 master->bus_num = -1;