spi-sh-sci.c 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * SH SCI SPI interface
  4. *
  5. * Copyright (c) 2008 Magnus Damm
  6. *
  7. * Based on S3C24XX GPIO based SPI driver, which is:
  8. * Copyright (c) 2006 Ben Dooks
  9. * Copyright (c) 2006 Simtec Electronics
  10. */
  11. #include <linux/kernel.h>
  12. #include <linux/delay.h>
  13. #include <linux/spinlock.h>
  14. #include <linux/platform_device.h>
  15. #include <linux/spi/spi.h>
  16. #include <linux/spi/spi_bitbang.h>
  17. #include <linux/module.h>
  18. #include <asm/spi.h>
  19. #include <asm/io.h>
  20. struct sh_sci_spi {
  21. struct spi_bitbang bitbang;
  22. void __iomem *membase;
  23. unsigned char val;
  24. struct sh_spi_info *info;
  25. struct platform_device *dev;
  26. };
  27. #define SCSPTR(sp) (sp->membase + 0x1c)
  28. #define PIN_SCK (1 << 2)
  29. #define PIN_TXD (1 << 0)
  30. #define PIN_RXD PIN_TXD
  31. #define PIN_INIT ((1 << 1) | (1 << 3) | PIN_SCK | PIN_TXD)
  32. static inline void setbits(struct sh_sci_spi *sp, int bits, int on)
  33. {
  34. /*
  35. * We are the only user of SCSPTR so no locking is required.
  36. * Reading bit 2 and 0 in SCSPTR gives pin state as input.
  37. * Writing the same bits sets the output value.
  38. * This makes regular read-modify-write difficult so we
  39. * use sp->val to keep track of the latest register value.
  40. */
  41. if (on)
  42. sp->val |= bits;
  43. else
  44. sp->val &= ~bits;
  45. iowrite8(sp->val, SCSPTR(sp));
  46. }
  47. static inline void setsck(struct spi_device *dev, int on)
  48. {
  49. setbits(spi_master_get_devdata(dev->master), PIN_SCK, on);
  50. }
  51. static inline void setmosi(struct spi_device *dev, int on)
  52. {
  53. setbits(spi_master_get_devdata(dev->master), PIN_TXD, on);
  54. }
  55. static inline u32 getmiso(struct spi_device *dev)
  56. {
  57. struct sh_sci_spi *sp = spi_master_get_devdata(dev->master);
  58. return (ioread8(SCSPTR(sp)) & PIN_RXD) ? 1 : 0;
  59. }
  60. #define spidelay(x) ndelay(x)
  61. #include "spi-bitbang-txrx.h"
  62. static u32 sh_sci_spi_txrx_mode0(struct spi_device *spi,
  63. unsigned nsecs, u32 word, u8 bits,
  64. unsigned flags)
  65. {
  66. return bitbang_txrx_be_cpha0(spi, nsecs, 0, flags, word, bits);
  67. }
  68. static u32 sh_sci_spi_txrx_mode1(struct spi_device *spi,
  69. unsigned nsecs, u32 word, u8 bits,
  70. unsigned flags)
  71. {
  72. return bitbang_txrx_be_cpha1(spi, nsecs, 0, flags, word, bits);
  73. }
  74. static u32 sh_sci_spi_txrx_mode2(struct spi_device *spi,
  75. unsigned nsecs, u32 word, u8 bits,
  76. unsigned flags)
  77. {
  78. return bitbang_txrx_be_cpha0(spi, nsecs, 1, flags, word, bits);
  79. }
  80. static u32 sh_sci_spi_txrx_mode3(struct spi_device *spi,
  81. unsigned nsecs, u32 word, u8 bits,
  82. unsigned flags)
  83. {
  84. return bitbang_txrx_be_cpha1(spi, nsecs, 1, flags, word, bits);
  85. }
  86. static void sh_sci_spi_chipselect(struct spi_device *dev, int value)
  87. {
  88. struct sh_sci_spi *sp = spi_master_get_devdata(dev->master);
  89. if (sp->info->chip_select)
  90. (sp->info->chip_select)(sp->info, dev->chip_select, value);
  91. }
  92. static int sh_sci_spi_probe(struct platform_device *dev)
  93. {
  94. struct resource *r;
  95. struct spi_master *master;
  96. struct sh_sci_spi *sp;
  97. int ret;
  98. master = spi_alloc_master(&dev->dev, sizeof(struct sh_sci_spi));
  99. if (master == NULL) {
  100. dev_err(&dev->dev, "failed to allocate spi master\n");
  101. ret = -ENOMEM;
  102. goto err0;
  103. }
  104. sp = spi_master_get_devdata(master);
  105. platform_set_drvdata(dev, sp);
  106. sp->info = dev_get_platdata(&dev->dev);
  107. if (!sp->info) {
  108. dev_err(&dev->dev, "platform data is missing\n");
  109. ret = -ENOENT;
  110. goto err1;
  111. }
  112. /* setup spi bitbang adaptor */
  113. sp->bitbang.master = master;
  114. sp->bitbang.master->bus_num = sp->info->bus_num;
  115. sp->bitbang.master->num_chipselect = sp->info->num_chipselect;
  116. sp->bitbang.chipselect = sh_sci_spi_chipselect;
  117. sp->bitbang.txrx_word[SPI_MODE_0] = sh_sci_spi_txrx_mode0;
  118. sp->bitbang.txrx_word[SPI_MODE_1] = sh_sci_spi_txrx_mode1;
  119. sp->bitbang.txrx_word[SPI_MODE_2] = sh_sci_spi_txrx_mode2;
  120. sp->bitbang.txrx_word[SPI_MODE_3] = sh_sci_spi_txrx_mode3;
  121. r = platform_get_resource(dev, IORESOURCE_MEM, 0);
  122. if (r == NULL) {
  123. ret = -ENOENT;
  124. goto err1;
  125. }
  126. sp->membase = ioremap(r->start, resource_size(r));
  127. if (!sp->membase) {
  128. ret = -ENXIO;
  129. goto err1;
  130. }
  131. sp->val = ioread8(SCSPTR(sp));
  132. setbits(sp, PIN_INIT, 1);
  133. ret = spi_bitbang_start(&sp->bitbang);
  134. if (!ret)
  135. return 0;
  136. setbits(sp, PIN_INIT, 0);
  137. iounmap(sp->membase);
  138. err1:
  139. spi_master_put(sp->bitbang.master);
  140. err0:
  141. return ret;
  142. }
  143. static int sh_sci_spi_remove(struct platform_device *dev)
  144. {
  145. struct sh_sci_spi *sp = platform_get_drvdata(dev);
  146. spi_bitbang_stop(&sp->bitbang);
  147. setbits(sp, PIN_INIT, 0);
  148. iounmap(sp->membase);
  149. spi_master_put(sp->bitbang.master);
  150. return 0;
  151. }
  152. static struct platform_driver sh_sci_spi_drv = {
  153. .probe = sh_sci_spi_probe,
  154. .remove = sh_sci_spi_remove,
  155. .driver = {
  156. .name = "spi_sh_sci",
  157. },
  158. };
  159. module_platform_driver(sh_sci_spi_drv);
  160. MODULE_DESCRIPTION("SH SCI SPI Driver");
  161. MODULE_AUTHOR("Magnus Damm <damm@opensource.se>");
  162. MODULE_LICENSE("GPL");
  163. MODULE_ALIAS("platform:spi_sh_sci");