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