root/drivers/net/ethernet/asix/ax88796c_spi.h
/* SPDX-License-Identifier: GPL-2.0-only */
/*
 * Copyright (c) 2010 ASIX Electronics Corporation
 * Copyright (c) 2020 Samsung Electronics Co., Ltd.
 *
 * ASIX AX88796C SPI Fast Ethernet Linux driver
 */

#ifndef _AX88796C_SPI_H
#define _AX88796C_SPI_H

#include <linux/spi/spi.h>
#include <linux/types.h>

/* Definition of SPI command */
#define AX_SPICMD_WRITE_TXQ             0x02
#define AX_SPICMD_READ_REG              0x03
#define AX_SPICMD_READ_STATUS           0x05
#define AX_SPICMD_READ_RXQ              0x0B
#define AX_SPICMD_BIDIR_WRQ             0xB2
#define AX_SPICMD_WRITE_REG             0xD8
#define AX_SPICMD_EXIT_PWD              0xAB

extern const u8 ax88796c_rx_cmd_buf[];
extern const u8 ax88796c_tx_cmd_buf[];

struct axspi_data {
        struct spi_device       *spi;
        struct spi_message      rx_msg;
        struct spi_transfer     spi_rx_xfer[2];
        u8                      cmd_buf[6];
        u8                      rx_buf[6];
        u8                      comp;
};

struct spi_status {
        u16 isr;
        u8 status;
#       define AX_STATUS_READY          0x80
};

int axspi_read_rxq(struct axspi_data *ax_spi, void *data, int len);
int axspi_write_txq(const struct axspi_data *ax_spi, void *data, int len);
u16 axspi_read_reg(struct axspi_data *ax_spi, u8 reg);
int axspi_write_reg(struct axspi_data *ax_spi, u8 reg, u16 value);
int axspi_read_status(struct axspi_data *ax_spi, struct spi_status *status);
int axspi_wakeup(struct axspi_data *ax_spi);

static inline u16 AX_READ(struct axspi_data *ax_spi, u8 offset)
{
        return axspi_read_reg(ax_spi, offset);
}

static inline int AX_WRITE(struct axspi_data *ax_spi, u16 value, u8 offset)
{
        return axspi_write_reg(ax_spi, offset, value);
}

static inline int AX_READ_STATUS(struct axspi_data *ax_spi,
                                 struct spi_status *status)
{
        return axspi_read_status(ax_spi, status);
}

static inline int AX_WAKEUP(struct axspi_data *ax_spi)
{
        return axspi_wakeup(ax_spi);
}
#endif