162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (c) 2010 ASIX Electronics Corporation
462306a36Sopenharmony_ci * Copyright (c) 2020 Samsung Electronics Co., Ltd.
562306a36Sopenharmony_ci *
662306a36Sopenharmony_ci * ASIX AX88796C SPI Fast Ethernet Linux driver
762306a36Sopenharmony_ci */
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#ifndef _AX88796C_SPI_H
1062306a36Sopenharmony_ci#define _AX88796C_SPI_H
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#include <linux/spi/spi.h>
1362306a36Sopenharmony_ci#include <linux/types.h>
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci/* Definition of SPI command */
1662306a36Sopenharmony_ci#define AX_SPICMD_WRITE_TXQ		0x02
1762306a36Sopenharmony_ci#define AX_SPICMD_READ_REG		0x03
1862306a36Sopenharmony_ci#define AX_SPICMD_READ_STATUS		0x05
1962306a36Sopenharmony_ci#define AX_SPICMD_READ_RXQ		0x0B
2062306a36Sopenharmony_ci#define AX_SPICMD_BIDIR_WRQ		0xB2
2162306a36Sopenharmony_ci#define AX_SPICMD_WRITE_REG		0xD8
2262306a36Sopenharmony_ci#define AX_SPICMD_EXIT_PWD		0xAB
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ciextern const u8 ax88796c_rx_cmd_buf[];
2562306a36Sopenharmony_ciextern const u8 ax88796c_tx_cmd_buf[];
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_cistruct axspi_data {
2862306a36Sopenharmony_ci	struct spi_device	*spi;
2962306a36Sopenharmony_ci	struct spi_message	rx_msg;
3062306a36Sopenharmony_ci	struct spi_transfer	spi_rx_xfer[2];
3162306a36Sopenharmony_ci	u8			cmd_buf[6];
3262306a36Sopenharmony_ci	u8			rx_buf[6];
3362306a36Sopenharmony_ci	u8			comp;
3462306a36Sopenharmony_ci};
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_cistruct spi_status {
3762306a36Sopenharmony_ci	u16 isr;
3862306a36Sopenharmony_ci	u8 status;
3962306a36Sopenharmony_ci#	define AX_STATUS_READY		0x80
4062306a36Sopenharmony_ci};
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ciint axspi_read_rxq(struct axspi_data *ax_spi, void *data, int len);
4362306a36Sopenharmony_ciint axspi_write_txq(const struct axspi_data *ax_spi, void *data, int len);
4462306a36Sopenharmony_ciu16 axspi_read_reg(struct axspi_data *ax_spi, u8 reg);
4562306a36Sopenharmony_ciint axspi_write_reg(struct axspi_data *ax_spi, u8 reg, u16 value);
4662306a36Sopenharmony_ciint axspi_read_status(struct axspi_data *ax_spi, struct spi_status *status);
4762306a36Sopenharmony_ciint axspi_wakeup(struct axspi_data *ax_spi);
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_cistatic inline u16 AX_READ(struct axspi_data *ax_spi, u8 offset)
5062306a36Sopenharmony_ci{
5162306a36Sopenharmony_ci	return axspi_read_reg(ax_spi, offset);
5262306a36Sopenharmony_ci}
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_cistatic inline int AX_WRITE(struct axspi_data *ax_spi, u16 value, u8 offset)
5562306a36Sopenharmony_ci{
5662306a36Sopenharmony_ci	return axspi_write_reg(ax_spi, offset, value);
5762306a36Sopenharmony_ci}
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_cistatic inline int AX_READ_STATUS(struct axspi_data *ax_spi,
6062306a36Sopenharmony_ci				 struct spi_status *status)
6162306a36Sopenharmony_ci{
6262306a36Sopenharmony_ci	return axspi_read_status(ax_spi, status);
6362306a36Sopenharmony_ci}
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_cistatic inline int AX_WAKEUP(struct axspi_data *ax_spi)
6662306a36Sopenharmony_ci{
6762306a36Sopenharmony_ci	return axspi_wakeup(ax_spi);
6862306a36Sopenharmony_ci}
6962306a36Sopenharmony_ci#endif
70