162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Freescale SPI/eSPI controller driver library. 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Maintainer: Kumar Gala 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci * Copyright 2010 Freescale Semiconductor, Inc. 862306a36Sopenharmony_ci * Copyright (C) 2006 Polycom, Inc. 962306a36Sopenharmony_ci * 1062306a36Sopenharmony_ci * CPM SPI and QE buffer descriptors mode support: 1162306a36Sopenharmony_ci * Copyright (c) 2009 MontaVista Software, Inc. 1262306a36Sopenharmony_ci * Author: Anton Vorontsov <avorontsov@ru.mvista.com> 1362306a36Sopenharmony_ci */ 1462306a36Sopenharmony_ci#ifndef __SPI_FSL_LIB_H__ 1562306a36Sopenharmony_ci#define __SPI_FSL_LIB_H__ 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci#include <asm/io.h> 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci/* SPI/eSPI Controller driver's private data. */ 2062306a36Sopenharmony_cistruct mpc8xxx_spi { 2162306a36Sopenharmony_ci struct device *dev; 2262306a36Sopenharmony_ci void __iomem *reg_base; 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci /* rx & tx bufs from the spi_transfer */ 2562306a36Sopenharmony_ci const void *tx; 2662306a36Sopenharmony_ci void *rx; 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci int subblock; 2962306a36Sopenharmony_ci struct spi_pram __iomem *pram; 3062306a36Sopenharmony_ci#ifdef CONFIG_FSL_SOC 3162306a36Sopenharmony_ci struct cpm_buf_desc __iomem *tx_bd; 3262306a36Sopenharmony_ci struct cpm_buf_desc __iomem *rx_bd; 3362306a36Sopenharmony_ci#endif 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci struct spi_transfer *xfer_in_progress; 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ci /* dma addresses for CPM transfers */ 3862306a36Sopenharmony_ci dma_addr_t tx_dma; 3962306a36Sopenharmony_ci dma_addr_t rx_dma; 4062306a36Sopenharmony_ci bool map_tx_dma; 4162306a36Sopenharmony_ci bool map_rx_dma; 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ci dma_addr_t dma_dummy_tx; 4462306a36Sopenharmony_ci dma_addr_t dma_dummy_rx; 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_ci /* functions to deal with different sized buffers */ 4762306a36Sopenharmony_ci void (*get_rx) (u32 rx_data, struct mpc8xxx_spi *); 4862306a36Sopenharmony_ci u32(*get_tx) (struct mpc8xxx_spi *); 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_ci unsigned int count; 5162306a36Sopenharmony_ci unsigned int irq; 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_ci unsigned nsecs; /* (clock cycle time)/2 */ 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_ci u32 spibrg; /* SPIBRG input clock */ 5662306a36Sopenharmony_ci u32 rx_shift; /* RX data reg shift when in qe mode */ 5762306a36Sopenharmony_ci u32 tx_shift; /* TX data reg shift when in qe mode */ 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_ci unsigned int flags; 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_ci#if IS_ENABLED(CONFIG_SPI_FSL_SPI) 6262306a36Sopenharmony_ci int type; 6362306a36Sopenharmony_ci int native_chipselects; 6462306a36Sopenharmony_ci u8 max_bits_per_word; 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_ci void (*set_shifts)(u32 *rx_shift, u32 *tx_shift, 6762306a36Sopenharmony_ci int bits_per_word, int msb_first); 6862306a36Sopenharmony_ci#endif 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_ci struct completion done; 7162306a36Sopenharmony_ci}; 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_cistruct spi_mpc8xxx_cs { 7462306a36Sopenharmony_ci /* functions to deal with different sized buffers */ 7562306a36Sopenharmony_ci void (*get_rx) (u32 rx_data, struct mpc8xxx_spi *); 7662306a36Sopenharmony_ci u32 (*get_tx) (struct mpc8xxx_spi *); 7762306a36Sopenharmony_ci u32 rx_shift; /* RX data reg shift when in qe mode */ 7862306a36Sopenharmony_ci u32 tx_shift; /* TX data reg shift when in qe mode */ 7962306a36Sopenharmony_ci u32 hw_mode; /* Holds HW mode register settings */ 8062306a36Sopenharmony_ci}; 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_cistatic inline void mpc8xxx_spi_write_reg(__be32 __iomem *reg, u32 val) 8362306a36Sopenharmony_ci{ 8462306a36Sopenharmony_ci iowrite32be(val, reg); 8562306a36Sopenharmony_ci} 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_cistatic inline u32 mpc8xxx_spi_read_reg(__be32 __iomem *reg) 8862306a36Sopenharmony_ci{ 8962306a36Sopenharmony_ci return ioread32be(reg); 9062306a36Sopenharmony_ci} 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_cistruct mpc8xxx_spi_probe_info { 9362306a36Sopenharmony_ci struct fsl_spi_platform_data pdata; 9462306a36Sopenharmony_ci __be32 __iomem *immr_spi_cs; 9562306a36Sopenharmony_ci}; 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_ciextern u32 mpc8xxx_spi_tx_buf_u8(struct mpc8xxx_spi *mpc8xxx_spi); 9862306a36Sopenharmony_ciextern u32 mpc8xxx_spi_tx_buf_u16(struct mpc8xxx_spi *mpc8xxx_spi); 9962306a36Sopenharmony_ciextern u32 mpc8xxx_spi_tx_buf_u32(struct mpc8xxx_spi *mpc8xxx_spi); 10062306a36Sopenharmony_ciextern void mpc8xxx_spi_rx_buf_u8(u32 data, struct mpc8xxx_spi *mpc8xxx_spi); 10162306a36Sopenharmony_ciextern void mpc8xxx_spi_rx_buf_u16(u32 data, struct mpc8xxx_spi *mpc8xxx_spi); 10262306a36Sopenharmony_ciextern void mpc8xxx_spi_rx_buf_u32(u32 data, struct mpc8xxx_spi *mpc8xxx_spi); 10362306a36Sopenharmony_ci 10462306a36Sopenharmony_ciextern struct mpc8xxx_spi_probe_info *to_of_pinfo( 10562306a36Sopenharmony_ci struct fsl_spi_platform_data *pdata); 10662306a36Sopenharmony_ciextern const char *mpc8xxx_spi_strmode(unsigned int flags); 10762306a36Sopenharmony_ciextern void mpc8xxx_spi_probe(struct device *dev, struct resource *mem, 10862306a36Sopenharmony_ci unsigned int irq); 10962306a36Sopenharmony_ciextern int of_mpc8xxx_spi_probe(struct platform_device *ofdev); 11062306a36Sopenharmony_ci 11162306a36Sopenharmony_ci#endif /* __SPI_FSL_LIB_H__ */ 112