162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright 2016 Broadcom
462306a36Sopenharmony_ci */
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci#ifndef __SPI_BCM_QSPI_H__
762306a36Sopenharmony_ci#define __SPI_BCM_QSPI_H__
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#include <linux/types.h>
1062306a36Sopenharmony_ci#include <linux/io.h>
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci/* BSPI interrupt masks */
1362306a36Sopenharmony_ci#define INTR_BSPI_LR_OVERREAD_MASK		BIT(4)
1462306a36Sopenharmony_ci#define INTR_BSPI_LR_SESSION_DONE_MASK		BIT(3)
1562306a36Sopenharmony_ci#define INTR_BSPI_LR_IMPATIENT_MASK		BIT(2)
1662306a36Sopenharmony_ci#define INTR_BSPI_LR_SESSION_ABORTED_MASK	BIT(1)
1762306a36Sopenharmony_ci#define INTR_BSPI_LR_FULLNESS_REACHED_MASK	BIT(0)
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci#define BSPI_LR_INTERRUPTS_DATA		       \
2062306a36Sopenharmony_ci	(INTR_BSPI_LR_SESSION_DONE_MASK |	       \
2162306a36Sopenharmony_ci	 INTR_BSPI_LR_FULLNESS_REACHED_MASK)
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ci#define BSPI_LR_INTERRUPTS_ERROR               \
2462306a36Sopenharmony_ci	(INTR_BSPI_LR_OVERREAD_MASK |	       \
2562306a36Sopenharmony_ci	 INTR_BSPI_LR_IMPATIENT_MASK |	       \
2662306a36Sopenharmony_ci	 INTR_BSPI_LR_SESSION_ABORTED_MASK)
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_ci#define BSPI_LR_INTERRUPTS_ALL                 \
2962306a36Sopenharmony_ci	(BSPI_LR_INTERRUPTS_ERROR |	       \
3062306a36Sopenharmony_ci	 BSPI_LR_INTERRUPTS_DATA)
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ci/* MSPI Interrupt masks */
3362306a36Sopenharmony_ci#define INTR_MSPI_HALTED_MASK			BIT(6)
3462306a36Sopenharmony_ci#define INTR_MSPI_DONE_MASK			BIT(5)
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ci#define MSPI_INTERRUPTS_ALL		       \
3762306a36Sopenharmony_ci	(INTR_MSPI_DONE_MASK |		       \
3862306a36Sopenharmony_ci	 INTR_MSPI_HALTED_MASK)
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci#define QSPI_INTERRUPTS_ALL                    \
4162306a36Sopenharmony_ci	(MSPI_INTERRUPTS_ALL |		       \
4262306a36Sopenharmony_ci	 BSPI_LR_INTERRUPTS_ALL)
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_cistruct platform_device;
4562306a36Sopenharmony_cistruct dev_pm_ops;
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_cienum {
4862306a36Sopenharmony_ci	MSPI_DONE = 0x1,
4962306a36Sopenharmony_ci	BSPI_DONE = 0x2,
5062306a36Sopenharmony_ci	BSPI_ERR = 0x4,
5162306a36Sopenharmony_ci	MSPI_BSPI_DONE = 0x7
5262306a36Sopenharmony_ci};
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_cistruct bcm_qspi_soc_intc {
5562306a36Sopenharmony_ci	void (*bcm_qspi_int_ack)(struct bcm_qspi_soc_intc *soc_intc, int type);
5662306a36Sopenharmony_ci	void (*bcm_qspi_int_set)(struct bcm_qspi_soc_intc *soc_intc, int type,
5762306a36Sopenharmony_ci				 bool en);
5862306a36Sopenharmony_ci	u32 (*bcm_qspi_get_int_status)(struct bcm_qspi_soc_intc *soc_intc);
5962306a36Sopenharmony_ci};
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_ci/* Read controller register*/
6262306a36Sopenharmony_cistatic inline u32 bcm_qspi_readl(bool be, void __iomem *addr)
6362306a36Sopenharmony_ci{
6462306a36Sopenharmony_ci	if (be)
6562306a36Sopenharmony_ci		return ioread32be(addr);
6662306a36Sopenharmony_ci	else
6762306a36Sopenharmony_ci		return readl_relaxed(addr);
6862306a36Sopenharmony_ci}
6962306a36Sopenharmony_ci
7062306a36Sopenharmony_ci/* Write controller register*/
7162306a36Sopenharmony_cistatic inline void bcm_qspi_writel(bool be,
7262306a36Sopenharmony_ci				   unsigned int data, void __iomem *addr)
7362306a36Sopenharmony_ci{
7462306a36Sopenharmony_ci	if (be)
7562306a36Sopenharmony_ci		iowrite32be(data, addr);
7662306a36Sopenharmony_ci	else
7762306a36Sopenharmony_ci		writel_relaxed(data, addr);
7862306a36Sopenharmony_ci}
7962306a36Sopenharmony_ci
8062306a36Sopenharmony_cistatic inline u32 get_qspi_mask(int type)
8162306a36Sopenharmony_ci{
8262306a36Sopenharmony_ci	switch (type) {
8362306a36Sopenharmony_ci	case MSPI_DONE:
8462306a36Sopenharmony_ci		return INTR_MSPI_DONE_MASK;
8562306a36Sopenharmony_ci	case BSPI_DONE:
8662306a36Sopenharmony_ci		return BSPI_LR_INTERRUPTS_ALL;
8762306a36Sopenharmony_ci	case MSPI_BSPI_DONE:
8862306a36Sopenharmony_ci		return QSPI_INTERRUPTS_ALL;
8962306a36Sopenharmony_ci	case BSPI_ERR:
9062306a36Sopenharmony_ci		return BSPI_LR_INTERRUPTS_ERROR;
9162306a36Sopenharmony_ci	}
9262306a36Sopenharmony_ci
9362306a36Sopenharmony_ci	return 0;
9462306a36Sopenharmony_ci}
9562306a36Sopenharmony_ci
9662306a36Sopenharmony_ci/* The common driver functions to be called by the SoC platform driver */
9762306a36Sopenharmony_ciint bcm_qspi_probe(struct platform_device *pdev,
9862306a36Sopenharmony_ci		   struct bcm_qspi_soc_intc *soc_intc);
9962306a36Sopenharmony_civoid bcm_qspi_remove(struct platform_device *pdev);
10062306a36Sopenharmony_ci
10162306a36Sopenharmony_ci/* pm_ops used by the SoC platform driver called on PM suspend/resume */
10262306a36Sopenharmony_ciextern const struct dev_pm_ops bcm_qspi_pm_ops;
10362306a36Sopenharmony_ci
10462306a36Sopenharmony_ci#endif /* __SPI_BCM_QSPI_H__ */
105