1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (c) 2010 ASIX Electronics Corporation
4 * Copyright (c) 2020 Samsung Electronics Co., Ltd.
6 * ASIX AX88796C SPI Fast Ethernet Linux driver
9 #define pr_fmt(fmt) "ax88796c: " fmt
11 #include <linux/string.h>
12 #include <linux/spi/spi.h>
14 #include "ax88796c_spi.h"
16 const u8 ax88796c_rx_cmd_buf
[5] = {AX_SPICMD_READ_RXQ
, 0xFF, 0xFF, 0xFF, 0xFF};
17 const u8 ax88796c_tx_cmd_buf
[4] = {AX_SPICMD_WRITE_TXQ
, 0xFF, 0xFF, 0xFF};
19 /* driver bus management functions */
20 int axspi_wakeup(struct axspi_data
*ax_spi
)
24 ax_spi
->cmd_buf
[0] = AX_SPICMD_EXIT_PWD
; /* OP */
25 ret
= spi_write(ax_spi
->spi
, ax_spi
->cmd_buf
, 1);
27 dev_err(&ax_spi
->spi
->dev
, "%s() failed: ret = %d\n", __func__
, ret
);
31 int axspi_read_status(struct axspi_data
*ax_spi
, struct spi_status
*status
)
36 ax_spi
->cmd_buf
[0] = AX_SPICMD_READ_STATUS
;
37 ret
= spi_write_then_read(ax_spi
->spi
, ax_spi
->cmd_buf
, 1, (u8
*)status
, 3);
39 dev_err(&ax_spi
->spi
->dev
, "%s() failed: ret = %d\n", __func__
, ret
);
41 le16_to_cpus(&status
->isr
);
46 int axspi_read_rxq(struct axspi_data
*ax_spi
, void *data
, int len
)
48 struct spi_transfer
*xfer
= ax_spi
->spi_rx_xfer
;
51 memcpy(ax_spi
->cmd_buf
, ax88796c_rx_cmd_buf
, 5);
53 xfer
->tx_buf
= ax_spi
->cmd_buf
;
55 xfer
->len
= ax_spi
->comp
? 2 : 5;
56 xfer
->bits_per_word
= 8;
57 spi_message_add_tail(xfer
, &ax_spi
->rx_msg
);
63 xfer
->bits_per_word
= 8;
64 spi_message_add_tail(xfer
, &ax_spi
->rx_msg
);
65 ret
= spi_sync(ax_spi
->spi
, &ax_spi
->rx_msg
);
67 dev_err(&ax_spi
->spi
->dev
, "%s() failed: ret = %d\n", __func__
, ret
);
72 int axspi_write_txq(const struct axspi_data
*ax_spi
, void *data
, int len
)
74 return spi_write(ax_spi
->spi
, data
, len
);
77 u16
axspi_read_reg(struct axspi_data
*ax_spi
, u8 reg
)
80 int len
= ax_spi
->comp
? 3 : 4;
82 ax_spi
->cmd_buf
[0] = 0x03; /* OP code read register */
83 ax_spi
->cmd_buf
[1] = reg
; /* register address */
84 ax_spi
->cmd_buf
[2] = 0xFF; /* dumy cycle */
85 ax_spi
->cmd_buf
[3] = 0xFF; /* dumy cycle */
86 ret
= spi_write_then_read(ax_spi
->spi
,
90 dev_err(&ax_spi
->spi
->dev
,
91 "%s() failed: ret = %d\n", __func__
, ret
);
95 le16_to_cpus((u16
*)ax_spi
->rx_buf
);
97 return *(u16
*)ax_spi
->rx_buf
;
100 int axspi_write_reg(struct axspi_data
*ax_spi
, u8 reg
, u16 value
)
104 memset(ax_spi
->cmd_buf
, 0, sizeof(ax_spi
->cmd_buf
));
105 ax_spi
->cmd_buf
[0] = AX_SPICMD_WRITE_REG
; /* OP code read register */
106 ax_spi
->cmd_buf
[1] = reg
; /* register address */
107 ax_spi
->cmd_buf
[2] = value
;
108 ax_spi
->cmd_buf
[3] = value
>> 8;
110 ret
= spi_write(ax_spi
->spi
, ax_spi
->cmd_buf
, 4);
112 dev_err(&ax_spi
->spi
->dev
, "%s() failed: ret = %d\n", __func__
, ret
);