ax88796c_spi.c 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2010 ASIX Electronics Corporation
  4. * Copyright (c) 2020 Samsung Electronics Co., Ltd.
  5. *
  6. * ASIX AX88796C SPI Fast Ethernet Linux driver
  7. */
  8. #define pr_fmt(fmt) "ax88796c: " fmt
  9. #include <linux/string.h>
  10. #include <linux/spi/spi.h>
  11. #include "ax88796c_spi.h"
  12. const u8 ax88796c_rx_cmd_buf[5] = {AX_SPICMD_READ_RXQ, 0xFF, 0xFF, 0xFF, 0xFF};
  13. const u8 ax88796c_tx_cmd_buf[4] = {AX_SPICMD_WRITE_TXQ, 0xFF, 0xFF, 0xFF};
  14. /* driver bus management functions */
  15. int axspi_wakeup(struct axspi_data *ax_spi)
  16. {
  17. int ret;
  18. ax_spi->cmd_buf[0] = AX_SPICMD_EXIT_PWD; /* OP */
  19. ret = spi_write(ax_spi->spi, ax_spi->cmd_buf, 1);
  20. if (ret)
  21. dev_err(&ax_spi->spi->dev, "%s() failed: ret = %d\n", __func__, ret);
  22. return ret;
  23. }
  24. int axspi_read_status(struct axspi_data *ax_spi, struct spi_status *status)
  25. {
  26. int ret;
  27. /* OP */
  28. ax_spi->cmd_buf[0] = AX_SPICMD_READ_STATUS;
  29. ret = spi_write_then_read(ax_spi->spi, ax_spi->cmd_buf, 1, (u8 *)status, 3);
  30. if (ret)
  31. dev_err(&ax_spi->spi->dev, "%s() failed: ret = %d\n", __func__, ret);
  32. else
  33. le16_to_cpus(&status->isr);
  34. return ret;
  35. }
  36. int axspi_read_rxq(struct axspi_data *ax_spi, void *data, int len)
  37. {
  38. struct spi_transfer *xfer = ax_spi->spi_rx_xfer;
  39. int ret;
  40. memcpy(ax_spi->cmd_buf, ax88796c_rx_cmd_buf, 5);
  41. xfer->tx_buf = ax_spi->cmd_buf;
  42. xfer->rx_buf = NULL;
  43. xfer->len = ax_spi->comp ? 2 : 5;
  44. xfer->bits_per_word = 8;
  45. spi_message_add_tail(xfer, &ax_spi->rx_msg);
  46. xfer++;
  47. xfer->rx_buf = data;
  48. xfer->tx_buf = NULL;
  49. xfer->len = len;
  50. xfer->bits_per_word = 8;
  51. spi_message_add_tail(xfer, &ax_spi->rx_msg);
  52. ret = spi_sync(ax_spi->spi, &ax_spi->rx_msg);
  53. if (ret)
  54. dev_err(&ax_spi->spi->dev, "%s() failed: ret = %d\n", __func__, ret);
  55. return ret;
  56. }
  57. int axspi_write_txq(const struct axspi_data *ax_spi, void *data, int len)
  58. {
  59. return spi_write(ax_spi->spi, data, len);
  60. }
  61. u16 axspi_read_reg(struct axspi_data *ax_spi, u8 reg)
  62. {
  63. int ret;
  64. int len = ax_spi->comp ? 3 : 4;
  65. ax_spi->cmd_buf[0] = 0x03; /* OP code read register */
  66. ax_spi->cmd_buf[1] = reg; /* register address */
  67. ax_spi->cmd_buf[2] = 0xFF; /* dumy cycle */
  68. ax_spi->cmd_buf[3] = 0xFF; /* dumy cycle */
  69. ret = spi_write_then_read(ax_spi->spi,
  70. ax_spi->cmd_buf, len,
  71. ax_spi->rx_buf, 2);
  72. if (ret) {
  73. dev_err(&ax_spi->spi->dev,
  74. "%s() failed: ret = %d\n", __func__, ret);
  75. return 0xFFFF;
  76. }
  77. le16_to_cpus((u16 *)ax_spi->rx_buf);
  78. return *(u16 *)ax_spi->rx_buf;
  79. }
  80. int axspi_write_reg(struct axspi_data *ax_spi, u8 reg, u16 value)
  81. {
  82. int ret;
  83. memset(ax_spi->cmd_buf, 0, sizeof(ax_spi->cmd_buf));
  84. ax_spi->cmd_buf[0] = AX_SPICMD_WRITE_REG; /* OP code read register */
  85. ax_spi->cmd_buf[1] = reg; /* register address */
  86. ax_spi->cmd_buf[2] = value;
  87. ax_spi->cmd_buf[3] = value >> 8;
  88. ret = spi_write(ax_spi->spi, ax_spi->cmd_buf, 4);
  89. if (ret)
  90. dev_err(&ax_spi->spi->dev, "%s() failed: ret = %d\n", __func__, ret);
  91. return ret;
  92. }