blob: 3ed34e5662c4a4b720161f05d76a4e1e5355b3b5 [file] [log] [blame]
/* SPDX-License-Identifier: GPL-2.0
* Copyright 2015 Broadcom Corporation
*
* The Broadcom GPS SPI driver
*
*/
#ifndef __BCM_GPS_SPI_H__
#define __BCM_GPS_SPI_H__
#define WORD_BURST_SIZE 4
#define CONFIG_SPI_DMA_BYTES_PER_WORD 4
#define CONFIG_SPI_DMA_BITS_PER_WORD (CONFIG_SPI_DMA_BYTES_PER_WORD * 8)
#define MIN_DMA_SIZE 64
#define DELAY_FOR_SYSTEM_OVERLOADED_MS 100
#define READ_SIZE_FOR_SYSTEM_OVERLOADED 1024
#define SSI_MODE_STREAM 0x00
#define SSI_MODE_DEBUG 0x80
#define SSI_MODE_HALF_DUPLEX 0x00
#define SSI_MODE_FULL_DUPLEX 0x40
#define SSI_WRITE_TRANS 0x00
#define SSI_READ_TRANS 0x20
#define SSI_PCKT_1B_LENGTH 0
#define SSI_PCKT_2B_LENGTH 0x10
#define SSI_FLOW_CONTROL_DISABLED 0
#define SSI_FLOW_CONTROL_ENABLED 0x08
#define SSI_WRITE_HD (SSI_WRITE_TRANS | SSI_MODE_HALF_DUPLEX)
#define SSI_READ_HD (SSI_READ_TRANS | SSI_MODE_HALF_DUPLEX)
#define HSI_F_MOSI_CTRL_CNT_SHIFT 0
#define HSI_F_MOSI_CTRL_CNT_SIZE 3
#define HSI_F_MOSI_CTRL_CNT_MASK 0x07
#define HSI_F_MOSI_CTRL_SZE_SHIFT 3
#define HSI_F_MOSI_CTRL_SZE_SIZE 2
#define HSI_F_MOSI_CTRL_SZE_MASK 0x18
#define HSI_F_MOSI_CTRL_RSV_SHIFT 5
#define HSI_F_MOSI_CTRL_RSV_SIZE 1
#define HSI_F_MOSI_CTRL_RSV_MASK 0x20
#define HSI_F_MOSI_CTRL_PE_SHIFT 6
#define HSI_F_MOSI_CTRL_PE_SIZE 1
#define HSI_F_MOSI_CTRL_PE_MASK 0x40
#define HSI_F_MOSI_CTRL_PZC_SHIFT 0
#define HSI_F_MOSI_CTRL_PZC_SIZE (HSI_F_MOSI_CTRL_CNT_SIZE + \
HSI_F_MOSI_CTRL_SZE_SIZE + HSI_F_MOSI_CTRL_PE_SIZE)
#define HSI_F_MOSI_CTRL_PZC_MASK (HSI_F_MOSI_CTRL_CNT_MASK | \
HSI_F_MOSI_CTRL_SZE_MASK | HSI_F_MOSI_CTRL_PE_MASK)
/*
* Transport receive buffer size, bytes
* #define TRANSPORT_RX_BUFFER_SIZE 6144
*/
#define HSI_PZC_MAX_RX_BUFFER 6144
#define DEBUG_TIME_STAT
/* #define CONFIG_TRANSFER_STAT */
/* #define CONFIG_REG_IO */
#define CONFIG_PACKET_RECEIVED (31*1024)
/* rngdma_tx_end_addr_ptr */
#define CONFIG_RNGDMA_TX_END_ADDR_PTR_MIN (128)
#define WORK_TYPE_RX 1
#define WORK_TYPE_TX 2
#define WORK_TYPE_RXTX 3
#define CONFIG_MCU_WAKEUP
/* TODO: Use proper kerenl type */
struct bcm_spi_strm_protocol {
int pckt_len;
int fc_len;
int ctrl_len;
unsigned char ctrl_byte;
unsigned short frame_len;
} __attribute__((__packed__));
#ifdef CONFIG_TRANSFER_STAT
struct bcm_spi_transfer_stat {
int len_255;
int len_1K;
int len_2K;
int len_4K;
int len_8K;
int len_16K;
int len_32K;
int len_64K;
unsigned long len_total;
unsigned long len_max;
unsigned long len_min;
} __attribute__((__packed__));
#endif
/* class FailSafe : struct DataRecordList */
struct bcm_failsafe_data_recordlist {
unsigned long start_addr;
unsigned int size;
int mem_type;
};
/*******************
*
* Structs
*
*******************/
#define BCM_SPI_READ_BUF_SIZE (16 * PAGE_SIZE)
#define BCM_SPI_WRITE_BUF_SIZE (16 * PAGE_SIZE)
/* TODO: limit max payload to 254 because of exynos3 bug */
#define MAX_SPI_DREG_FRAME_LEN 254
/*
* TODO: MAX_SPI_FRAME_LEN = 8K should be less TRANSPORT_RX_BUFFER_SIZE,
* Now it is 12K (SWGNSSAND-1647)
* #define MAX_SPI_FRAME_LEN (BCM_SPI_READ_BUF_SIZE / 8)
*
* TODO : hardcoded because of Tizen has PAGE_SIZE == 8K not 4K
* as it is expected. Need to confirm.
*/
#define MAX_SPI_FRAME_LEN (1024 * 8)
struct bcm_ssi_tx_frame {
unsigned char cmd;
unsigned char data[MAX_SPI_FRAME_LEN-1];
} __attribute__((__packed__));
struct bcm_ssi_rx_frame {
unsigned char status;
unsigned char data[MAX_SPI_FRAME_LEN-1];
} __attribute__((__packed__));
struct bbd_device;
struct bcm_spi_priv {
struct spi_device *spi;
/* Char device stuff */
struct miscdevice misc;
bool busy;
struct circ_buf read_buf;
struct circ_buf write_buf;
struct mutex rlock; /* Lock for read_buf */
struct mutex wlock; /* Lock for write_buf */
char _read_buf[BCM_SPI_READ_BUF_SIZE];
char _write_buf[BCM_SPI_WRITE_BUF_SIZE];
wait_queue_head_t poll_wait; /* for poll */
/* GPIO pins */
int host_req;
int mcu_req;
int mcu_resp;
int nstandby;
/* IRQ and its control */
atomic_t irq_enabled;
spinlock_t irq_lock;
/* Work */
struct work_struct rxtx_work;
struct workqueue_struct *serial_wq;
atomic_t suspending;
/* SPI tx/rx buf */
struct bcm_ssi_tx_frame *tx_buf;
struct bcm_ssi_rx_frame *rx_buf;
/* 4775 SPI tx/rx strm protocol */
struct bcm_spi_strm_protocol tx_strm;
struct bcm_spi_strm_protocol rx_strm;
#ifdef CONFIG_TRANSFER_STAT
struct bcm_spi_transfer_stat trans_stat[2];
#endif
struct pinctrl *ts_pinctrl;
struct pinctrl_state *gpio_state_active;
struct pinctrl_state *gpio_state_suspend;
/* some chip-set(BCM4775) needs to skip validity check */
bool skip_validity_check;
bool irq_wakeup_enabled;
/* struct wake_lock bcm_wake_lock; */
/* To make sure that interface is detected on chip side !=0 */
unsigned long packet_received;
/* Suspend/Resume semaphore */
int ssi_pm_semaphore;
/* Overrun counter */
unsigned long skip_count;
unsigned long last_tick;
bool ssi_dbg;
bool ssi_dbg_pzc;
bool ssi_dbg_rng;
/*
* Calculating TX transfer failure operation in bus driver,
* reset in bcm_ssi_open()
*/
int ssi_tx_fail;
/* Calculating TX pzc retries, reset in bcm_ssi_open() */
int ssi_tx_pzc_retries;
/* Calculating TX pzc retry delays, reset in bcm_ssi_open() */
int ssi_tx_pzc_retry_delays;
unsigned long rx_buffer_avail_bytes;// = HSI_PZC_MAX_RX_BUFFER;
/* Should be more MAX_SPI_FRAME_LEN. See below */
struct bbd_device *bbd;
};
/* bcm_gps_regs.cpp */
int bcm_dreg_write(struct bcm_spi_priv *priv, char *id, u8 offset, u8 *buf,
u8 size);
int bcm_dreg_read(struct bcm_spi_priv *priv, char *id, u8 offset, u8 *buf,
u8 size);
int bcm_ireg_write(struct bcm_spi_priv *priv, char *id, unsigned int regaddr,
unsigned int regval);
int bcm_ireg_read(struct bcm_spi_priv *priv, char *id, unsigned int regaddr,
unsigned int *regval, int n);
/* bcm_gps_spi.cpp */
int bcm_spi_sync(struct bcm_spi_priv *priv, void *tx_buf, void *rx_buf,
int len, int bits_per_word);
#endif /* __BBD_H__ */