root/drivers/net/wireless/intersil/p54/p54spi.h
/* SPDX-License-Identifier: GPL-2.0-only */
/*
 * Copyright (C) 2008 Christian Lamparter <chunkeey@web.de>
 *
 * This driver is a port from stlc45xx:
 *      Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
 */

#ifndef P54SPI_H
#define P54SPI_H

#include <linux/mutex.h>
#include <linux/list.h>
#include <net/mac80211.h>

#include "p54.h"

/* Bit 15 is read/write bit; ON = READ, OFF = WRITE */
#define SPI_ADRS_READ_BIT_15            0x8000

#define SPI_ADRS_ARM_INTERRUPTS         0x00
#define SPI_ADRS_ARM_INT_EN             0x04

#define SPI_ADRS_HOST_INTERRUPTS        0x08
#define SPI_ADRS_HOST_INT_EN            0x0c
#define SPI_ADRS_HOST_INT_ACK           0x10

#define SPI_ADRS_GEN_PURP_1             0x14
#define SPI_ADRS_GEN_PURP_2             0x18

#define SPI_ADRS_DEV_CTRL_STAT          0x26    /* high word */

#define SPI_ADRS_DMA_DATA               0x28

#define SPI_ADRS_DMA_WRITE_CTRL         0x2c
#define SPI_ADRS_DMA_WRITE_LEN          0x2e
#define SPI_ADRS_DMA_WRITE_BASE         0x30

#define SPI_ADRS_DMA_READ_CTRL          0x34
#define SPI_ADRS_DMA_READ_LEN           0x36
#define SPI_ADRS_DMA_READ_BASE          0x38

#define SPI_CTRL_STAT_HOST_OVERRIDE     0x8000
#define SPI_CTRL_STAT_START_HALTED      0x4000
#define SPI_CTRL_STAT_RAM_BOOT          0x2000
#define SPI_CTRL_STAT_HOST_RESET        0x1000
#define SPI_CTRL_STAT_HOST_CPU_EN       0x0800

#define SPI_DMA_WRITE_CTRL_ENABLE       0x0001
#define SPI_DMA_READ_CTRL_ENABLE        0x0001
#define HOST_ALLOWED                    (1 << 7)

#define SPI_TIMEOUT                     100         /* msec */

#define SPI_MAX_TX_PACKETS              32

#define SPI_MAX_PACKET_SIZE             32767

#define SPI_TARGET_INT_WAKEUP           0x00000001
#define SPI_TARGET_INT_SLEEP            0x00000002
#define SPI_TARGET_INT_RDDONE           0x00000004

#define SPI_TARGET_INT_CTS              0x00004000
#define SPI_TARGET_INT_DR               0x00008000

#define SPI_HOST_INT_READY              0x00000001
#define SPI_HOST_INT_WR_READY           0x00000002
#define SPI_HOST_INT_SW_UPDATE          0x00000004
#define SPI_HOST_INT_UPDATE             0x10000000

/* clear to send */
#define SPI_HOST_INT_CR                 0x00004000

/* data ready */
#define SPI_HOST_INT_DR                 0x00008000

#define SPI_HOST_INTS_DEFAULT                                               \
        (SPI_HOST_INT_READY | SPI_HOST_INT_UPDATE | SPI_HOST_INT_SW_UPDATE)

#define TARGET_BOOT_SLEEP 50

struct p54s_dma_regs {
        __le16 cmd;
        __le16 len;
        __le32 addr;
} __packed;

struct p54s_tx_info {
        struct list_head tx_list;
};

struct p54s_priv {
        /* p54_common has to be the first entry */
        struct p54_common common;
        struct ieee80211_hw *hw;
        struct spi_device *spi;

        struct work_struct work;

        struct mutex mutex;
        struct completion fw_comp;

        spinlock_t tx_lock;

        /* protected by tx_lock */
        struct list_head tx_pending;

        enum fw_state fw_state;
        const struct firmware *firmware;
};

#endif /* P54SPI_H */