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