162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (C) 2005 Stephen Street / StreetFire Sound Labs
462306a36Sopenharmony_ci * Copyright (C) 2013, 2021 Intel Corporation
562306a36Sopenharmony_ci */
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci#ifndef SPI_PXA2XX_H
862306a36Sopenharmony_ci#define SPI_PXA2XX_H
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#include <linux/interrupt.h>
1162306a36Sopenharmony_ci#include <linux/io.h>
1262306a36Sopenharmony_ci#include <linux/types.h>
1362306a36Sopenharmony_ci#include <linux/sizes.h>
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci#include <linux/pxa2xx_ssp.h>
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_cistruct gpio_desc;
1862306a36Sopenharmony_cistruct pxa2xx_spi_controller;
1962306a36Sopenharmony_cistruct spi_controller;
2062306a36Sopenharmony_cistruct spi_device;
2162306a36Sopenharmony_cistruct spi_transfer;
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_cistruct driver_data {
2462306a36Sopenharmony_ci	/* SSP Info */
2562306a36Sopenharmony_ci	struct ssp_device *ssp;
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_ci	/* SPI framework hookup */
2862306a36Sopenharmony_ci	enum pxa_ssp_type ssp_type;
2962306a36Sopenharmony_ci	struct spi_controller *controller;
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ci	/* PXA hookup */
3262306a36Sopenharmony_ci	struct pxa2xx_spi_controller *controller_info;
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci	/* SSP masks*/
3562306a36Sopenharmony_ci	u32 dma_cr1;
3662306a36Sopenharmony_ci	u32 int_cr1;
3762306a36Sopenharmony_ci	u32 clear_sr;
3862306a36Sopenharmony_ci	u32 mask_sr;
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci	/* DMA engine support */
4162306a36Sopenharmony_ci	atomic_t dma_running;
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_ci	/* Current transfer state info */
4462306a36Sopenharmony_ci	void *tx;
4562306a36Sopenharmony_ci	void *tx_end;
4662306a36Sopenharmony_ci	void *rx;
4762306a36Sopenharmony_ci	void *rx_end;
4862306a36Sopenharmony_ci	u8 n_bytes;
4962306a36Sopenharmony_ci	int (*write)(struct driver_data *drv_data);
5062306a36Sopenharmony_ci	int (*read)(struct driver_data *drv_data);
5162306a36Sopenharmony_ci	irqreturn_t (*transfer_handler)(struct driver_data *drv_data);
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ci	void __iomem *lpss_base;
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_ci	/* Optional slave FIFO ready signal */
5662306a36Sopenharmony_ci	struct gpio_desc *gpiod_ready;
5762306a36Sopenharmony_ci};
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_cistruct chip_data {
6062306a36Sopenharmony_ci	u32 cr1;
6162306a36Sopenharmony_ci	u32 dds_rate;
6262306a36Sopenharmony_ci	u32 timeout;
6362306a36Sopenharmony_ci	u8 enable_dma;
6462306a36Sopenharmony_ci	u32 dma_burst_size;
6562306a36Sopenharmony_ci	u32 dma_threshold;
6662306a36Sopenharmony_ci	u32 threshold;
6762306a36Sopenharmony_ci	u16 lpss_rx_threshold;
6862306a36Sopenharmony_ci	u16 lpss_tx_threshold;
6962306a36Sopenharmony_ci};
7062306a36Sopenharmony_ci
7162306a36Sopenharmony_cistatic inline u32 pxa2xx_spi_read(const struct driver_data *drv_data, u32 reg)
7262306a36Sopenharmony_ci{
7362306a36Sopenharmony_ci	return pxa_ssp_read_reg(drv_data->ssp, reg);
7462306a36Sopenharmony_ci}
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_cistatic inline void pxa2xx_spi_write(const struct driver_data *drv_data, u32 reg, u32 val)
7762306a36Sopenharmony_ci{
7862306a36Sopenharmony_ci	pxa_ssp_write_reg(drv_data->ssp, reg, val);
7962306a36Sopenharmony_ci}
8062306a36Sopenharmony_ci
8162306a36Sopenharmony_ci#define DMA_ALIGNMENT		8
8262306a36Sopenharmony_ci
8362306a36Sopenharmony_cistatic inline int pxa25x_ssp_comp(const struct driver_data *drv_data)
8462306a36Sopenharmony_ci{
8562306a36Sopenharmony_ci	switch (drv_data->ssp_type) {
8662306a36Sopenharmony_ci	case PXA25x_SSP:
8762306a36Sopenharmony_ci	case CE4100_SSP:
8862306a36Sopenharmony_ci	case QUARK_X1000_SSP:
8962306a36Sopenharmony_ci		return 1;
9062306a36Sopenharmony_ci	default:
9162306a36Sopenharmony_ci		return 0;
9262306a36Sopenharmony_ci	}
9362306a36Sopenharmony_ci}
9462306a36Sopenharmony_ci
9562306a36Sopenharmony_cistatic inline void clear_SSCR1_bits(const struct driver_data *drv_data, u32 bits)
9662306a36Sopenharmony_ci{
9762306a36Sopenharmony_ci	pxa2xx_spi_write(drv_data, SSCR1, pxa2xx_spi_read(drv_data, SSCR1) & ~bits);
9862306a36Sopenharmony_ci}
9962306a36Sopenharmony_ci
10062306a36Sopenharmony_cistatic inline u32 read_SSSR_bits(const struct driver_data *drv_data, u32 bits)
10162306a36Sopenharmony_ci{
10262306a36Sopenharmony_ci	return pxa2xx_spi_read(drv_data, SSSR) & bits;
10362306a36Sopenharmony_ci}
10462306a36Sopenharmony_ci
10562306a36Sopenharmony_cistatic inline void write_SSSR_CS(const struct driver_data *drv_data, u32 val)
10662306a36Sopenharmony_ci{
10762306a36Sopenharmony_ci	if (drv_data->ssp_type == CE4100_SSP ||
10862306a36Sopenharmony_ci	    drv_data->ssp_type == QUARK_X1000_SSP)
10962306a36Sopenharmony_ci		val |= read_SSSR_bits(drv_data, SSSR_ALT_FRM_MASK);
11062306a36Sopenharmony_ci
11162306a36Sopenharmony_ci	pxa2xx_spi_write(drv_data, SSSR, val);
11262306a36Sopenharmony_ci}
11362306a36Sopenharmony_ci
11462306a36Sopenharmony_ciextern int pxa2xx_spi_flush(struct driver_data *drv_data);
11562306a36Sopenharmony_ci
11662306a36Sopenharmony_ci#define MAX_DMA_LEN		SZ_64K
11762306a36Sopenharmony_ci#define DEFAULT_DMA_CR1		(SSCR1_TSRE | SSCR1_RSRE | SSCR1_TRAIL)
11862306a36Sopenharmony_ci
11962306a36Sopenharmony_ciextern irqreturn_t pxa2xx_spi_dma_transfer(struct driver_data *drv_data);
12062306a36Sopenharmony_ciextern int pxa2xx_spi_dma_prepare(struct driver_data *drv_data,
12162306a36Sopenharmony_ci				  struct spi_transfer *xfer);
12262306a36Sopenharmony_ciextern void pxa2xx_spi_dma_start(struct driver_data *drv_data);
12362306a36Sopenharmony_ciextern void pxa2xx_spi_dma_stop(struct driver_data *drv_data);
12462306a36Sopenharmony_ciextern int pxa2xx_spi_dma_setup(struct driver_data *drv_data);
12562306a36Sopenharmony_ciextern void pxa2xx_spi_dma_release(struct driver_data *drv_data);
12662306a36Sopenharmony_ciextern int pxa2xx_spi_set_dma_burst_and_threshold(struct chip_data *chip,
12762306a36Sopenharmony_ci						  struct spi_device *spi,
12862306a36Sopenharmony_ci						  u8 bits_per_word,
12962306a36Sopenharmony_ci						  u32 *burst_code,
13062306a36Sopenharmony_ci						  u32 *threshold);
13162306a36Sopenharmony_ci
13262306a36Sopenharmony_ci#endif /* SPI_PXA2XX_H */
133