armada100_spi.c 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. /*
  2. * (C) Copyright 2011
  3. * eInfochips Ltd. <www.einfochips.com>
  4. * Written-by: Ajay Bhargav <ajay.bhargav@einfochips.com>
  5. *
  6. * (C) Copyright 2009
  7. * Marvell Semiconductor <www.marvell.com>
  8. * Based on SSP driver
  9. * Written-by: Lei Wen <leiwen@marvell.com>
  10. *
  11. * SPDX-License-Identifier: GPL-2.0+
  12. */
  13. #include <common.h>
  14. #include <malloc.h>
  15. #include <spi.h>
  16. #include <asm/io.h>
  17. #include <asm/arch/spi.h>
  18. #include <asm/gpio.h>
  19. #define to_armd_spi_slave(s) container_of(s, struct armd_spi_slave, slave)
  20. struct armd_spi_slave {
  21. struct spi_slave slave;
  22. struct ssp_reg *spi_reg;
  23. u32 cr0, cr1;
  24. u32 int_cr1;
  25. u32 clear_sr;
  26. const void *tx;
  27. void *rx;
  28. int gpio_cs_inverted;
  29. };
  30. static int spi_armd_write(struct armd_spi_slave *pss)
  31. {
  32. int wait_timeout = SSP_FLUSH_NUM;
  33. while (--wait_timeout && !(readl(&pss->spi_reg->sssr) & SSSR_TNF))
  34. ;
  35. if (!wait_timeout) {
  36. debug("%s: timeout error\n", __func__);
  37. return -1;
  38. }
  39. if (pss->tx != NULL) {
  40. writel(*(u8 *)pss->tx, &pss->spi_reg->ssdr);
  41. ++pss->tx;
  42. } else {
  43. writel(0, &pss->spi_reg->ssdr);
  44. }
  45. return 0;
  46. }
  47. static int spi_armd_read(struct armd_spi_slave *pss)
  48. {
  49. int wait_timeout = SSP_FLUSH_NUM;
  50. while (--wait_timeout && !(readl(&pss->spi_reg->sssr) & SSSR_RNE))
  51. ;
  52. if (!wait_timeout) {
  53. debug("%s: timeout error\n", __func__);
  54. return -1;
  55. }
  56. if (pss->rx != NULL) {
  57. *(u8 *)pss->rx = readl(&pss->spi_reg->ssdr);
  58. ++pss->rx;
  59. } else {
  60. readl(&pss->spi_reg->ssdr);
  61. }
  62. return 0;
  63. }
  64. static int spi_armd_flush(struct armd_spi_slave *pss)
  65. {
  66. unsigned long limit = SSP_FLUSH_NUM;
  67. do {
  68. while (readl(&pss->spi_reg->sssr) & SSSR_RNE)
  69. readl(&pss->spi_reg->ssdr);
  70. } while ((readl(&pss->spi_reg->sssr) & SSSR_BSY) && limit--);
  71. writel(SSSR_ROR, &pss->spi_reg->sssr);
  72. return limit;
  73. }
  74. void spi_cs_activate(struct spi_slave *slave)
  75. {
  76. struct armd_spi_slave *pss = to_armd_spi_slave(slave);
  77. gpio_set_value(slave->cs, pss->gpio_cs_inverted);
  78. }
  79. void spi_cs_deactivate(struct spi_slave *slave)
  80. {
  81. struct armd_spi_slave *pss = to_armd_spi_slave(slave);
  82. gpio_set_value(slave->cs, !pss->gpio_cs_inverted);
  83. }
  84. struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs,
  85. unsigned int max_hz, unsigned int mode)
  86. {
  87. struct armd_spi_slave *pss;
  88. pss = spi_alloc_slave(struct armd_spi_slave, bus, cs);
  89. if (!pss)
  90. return NULL;
  91. pss->spi_reg = (struct ssp_reg *)SSP_REG_BASE(CONFIG_SYS_SSP_PORT);
  92. pss->cr0 = SSCR0_MOTO | SSCR0_DATASIZE(DEFAULT_WORD_LEN) | SSCR0_SSE;
  93. pss->cr1 = (SSCR1_RXTRESH(RX_THRESH_DEF) & SSCR1_RFT) |
  94. (SSCR1_TXTRESH(TX_THRESH_DEF) & SSCR1_TFT);
  95. pss->cr1 &= ~(SSCR1_SPO | SSCR1_SPH);
  96. pss->cr1 |= (((mode & SPI_CPHA) != 0) ? SSCR1_SPH : 0)
  97. | (((mode & SPI_CPOL) != 0) ? SSCR1_SPO : 0);
  98. pss->int_cr1 = SSCR1_TIE | SSCR1_RIE | SSCR1_TINTE;
  99. pss->clear_sr = SSSR_ROR | SSSR_TINT;
  100. pss->gpio_cs_inverted = mode & SPI_CS_HIGH;
  101. gpio_set_value(cs, !pss->gpio_cs_inverted);
  102. return &pss->slave;
  103. }
  104. void spi_free_slave(struct spi_slave *slave)
  105. {
  106. struct armd_spi_slave *pss = to_armd_spi_slave(slave);
  107. free(pss);
  108. }
  109. int spi_claim_bus(struct spi_slave *slave)
  110. {
  111. struct armd_spi_slave *pss = to_armd_spi_slave(slave);
  112. debug("%s: bus:%i cs:%i\n", __func__, slave->bus, slave->cs);
  113. if (spi_armd_flush(pss) == 0)
  114. return -1;
  115. return 0;
  116. }
  117. void spi_release_bus(struct spi_slave *slave)
  118. {
  119. }
  120. int spi_xfer(struct spi_slave *slave, unsigned int bitlen, const void *dout,
  121. void *din, unsigned long flags)
  122. {
  123. struct armd_spi_slave *pss = to_armd_spi_slave(slave);
  124. uint bytes = bitlen / 8;
  125. unsigned long limit;
  126. int ret = 0;
  127. if (bitlen == 0)
  128. goto done;
  129. /* we can only do 8 bit transfers */
  130. if (bitlen % 8) {
  131. flags |= SPI_XFER_END;
  132. goto done;
  133. }
  134. pss->tx = dout;
  135. pss->rx = din;
  136. if (flags & SPI_XFER_BEGIN) {
  137. spi_cs_activate(slave);
  138. writel(pss->cr1 | pss->int_cr1, &pss->spi_reg->sscr1);
  139. writel(TIMEOUT_DEF, &pss->spi_reg->ssto);
  140. writel(pss->cr0, &pss->spi_reg->sscr0);
  141. }
  142. while (bytes--) {
  143. limit = SSP_FLUSH_NUM;
  144. ret = spi_armd_write(pss);
  145. if (ret)
  146. break;
  147. while ((readl(&pss->spi_reg->sssr) & SSSR_BSY) && limit--)
  148. udelay(1);
  149. ret = spi_armd_read(pss);
  150. if (ret)
  151. break;
  152. }
  153. done:
  154. if (flags & SPI_XFER_END) {
  155. /* Stop SSP */
  156. writel(pss->clear_sr, &pss->spi_reg->sssr);
  157. clrbits_le32(&pss->spi_reg->sscr1, pss->int_cr1);
  158. writel(0, &pss->spi_reg->ssto);
  159. spi_cs_deactivate(slave);
  160. }
  161. return ret;
  162. }