18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * Copyright 2016 Broadcom
48c2ecf20Sopenharmony_ci */
58c2ecf20Sopenharmony_ci
68c2ecf20Sopenharmony_ci#ifndef __SPI_BCM_QSPI_H__
78c2ecf20Sopenharmony_ci#define __SPI_BCM_QSPI_H__
88c2ecf20Sopenharmony_ci
98c2ecf20Sopenharmony_ci#include <linux/types.h>
108c2ecf20Sopenharmony_ci#include <linux/io.h>
118c2ecf20Sopenharmony_ci
128c2ecf20Sopenharmony_ci/* BSPI interrupt masks */
138c2ecf20Sopenharmony_ci#define INTR_BSPI_LR_OVERREAD_MASK		BIT(4)
148c2ecf20Sopenharmony_ci#define INTR_BSPI_LR_SESSION_DONE_MASK		BIT(3)
158c2ecf20Sopenharmony_ci#define INTR_BSPI_LR_IMPATIENT_MASK		BIT(2)
168c2ecf20Sopenharmony_ci#define INTR_BSPI_LR_SESSION_ABORTED_MASK	BIT(1)
178c2ecf20Sopenharmony_ci#define INTR_BSPI_LR_FULLNESS_REACHED_MASK	BIT(0)
188c2ecf20Sopenharmony_ci
198c2ecf20Sopenharmony_ci#define BSPI_LR_INTERRUPTS_DATA		       \
208c2ecf20Sopenharmony_ci	(INTR_BSPI_LR_SESSION_DONE_MASK |	       \
218c2ecf20Sopenharmony_ci	 INTR_BSPI_LR_FULLNESS_REACHED_MASK)
228c2ecf20Sopenharmony_ci
238c2ecf20Sopenharmony_ci#define BSPI_LR_INTERRUPTS_ERROR               \
248c2ecf20Sopenharmony_ci	(INTR_BSPI_LR_OVERREAD_MASK |	       \
258c2ecf20Sopenharmony_ci	 INTR_BSPI_LR_IMPATIENT_MASK |	       \
268c2ecf20Sopenharmony_ci	 INTR_BSPI_LR_SESSION_ABORTED_MASK)
278c2ecf20Sopenharmony_ci
288c2ecf20Sopenharmony_ci#define BSPI_LR_INTERRUPTS_ALL                 \
298c2ecf20Sopenharmony_ci	(BSPI_LR_INTERRUPTS_ERROR |	       \
308c2ecf20Sopenharmony_ci	 BSPI_LR_INTERRUPTS_DATA)
318c2ecf20Sopenharmony_ci
328c2ecf20Sopenharmony_ci/* MSPI Interrupt masks */
338c2ecf20Sopenharmony_ci#define INTR_MSPI_HALTED_MASK			BIT(6)
348c2ecf20Sopenharmony_ci#define INTR_MSPI_DONE_MASK			BIT(5)
358c2ecf20Sopenharmony_ci
368c2ecf20Sopenharmony_ci#define MSPI_INTERRUPTS_ALL		       \
378c2ecf20Sopenharmony_ci	(INTR_MSPI_DONE_MASK |		       \
388c2ecf20Sopenharmony_ci	 INTR_MSPI_HALTED_MASK)
398c2ecf20Sopenharmony_ci
408c2ecf20Sopenharmony_ci#define QSPI_INTERRUPTS_ALL                    \
418c2ecf20Sopenharmony_ci	(MSPI_INTERRUPTS_ALL |		       \
428c2ecf20Sopenharmony_ci	 BSPI_LR_INTERRUPTS_ALL)
438c2ecf20Sopenharmony_ci
448c2ecf20Sopenharmony_cistruct platform_device;
458c2ecf20Sopenharmony_cistruct dev_pm_ops;
468c2ecf20Sopenharmony_ci
478c2ecf20Sopenharmony_cienum {
488c2ecf20Sopenharmony_ci	MSPI_DONE = 0x1,
498c2ecf20Sopenharmony_ci	BSPI_DONE = 0x2,
508c2ecf20Sopenharmony_ci	BSPI_ERR = 0x4,
518c2ecf20Sopenharmony_ci	MSPI_BSPI_DONE = 0x7
528c2ecf20Sopenharmony_ci};
538c2ecf20Sopenharmony_ci
548c2ecf20Sopenharmony_cistruct bcm_qspi_soc_intc {
558c2ecf20Sopenharmony_ci	void (*bcm_qspi_int_ack)(struct bcm_qspi_soc_intc *soc_intc, int type);
568c2ecf20Sopenharmony_ci	void (*bcm_qspi_int_set)(struct bcm_qspi_soc_intc *soc_intc, int type,
578c2ecf20Sopenharmony_ci				 bool en);
588c2ecf20Sopenharmony_ci	u32 (*bcm_qspi_get_int_status)(struct bcm_qspi_soc_intc *soc_intc);
598c2ecf20Sopenharmony_ci};
608c2ecf20Sopenharmony_ci
618c2ecf20Sopenharmony_ci/* Read controller register*/
628c2ecf20Sopenharmony_cistatic inline u32 bcm_qspi_readl(bool be, void __iomem *addr)
638c2ecf20Sopenharmony_ci{
648c2ecf20Sopenharmony_ci	if (be)
658c2ecf20Sopenharmony_ci		return ioread32be(addr);
668c2ecf20Sopenharmony_ci	else
678c2ecf20Sopenharmony_ci		return readl_relaxed(addr);
688c2ecf20Sopenharmony_ci}
698c2ecf20Sopenharmony_ci
708c2ecf20Sopenharmony_ci/* Write controller register*/
718c2ecf20Sopenharmony_cistatic inline void bcm_qspi_writel(bool be,
728c2ecf20Sopenharmony_ci				   unsigned int data, void __iomem *addr)
738c2ecf20Sopenharmony_ci{
748c2ecf20Sopenharmony_ci	if (be)
758c2ecf20Sopenharmony_ci		iowrite32be(data, addr);
768c2ecf20Sopenharmony_ci	else
778c2ecf20Sopenharmony_ci		writel_relaxed(data, addr);
788c2ecf20Sopenharmony_ci}
798c2ecf20Sopenharmony_ci
808c2ecf20Sopenharmony_cistatic inline u32 get_qspi_mask(int type)
818c2ecf20Sopenharmony_ci{
828c2ecf20Sopenharmony_ci	switch (type) {
838c2ecf20Sopenharmony_ci	case MSPI_DONE:
848c2ecf20Sopenharmony_ci		return INTR_MSPI_DONE_MASK;
858c2ecf20Sopenharmony_ci	case BSPI_DONE:
868c2ecf20Sopenharmony_ci		return BSPI_LR_INTERRUPTS_ALL;
878c2ecf20Sopenharmony_ci	case MSPI_BSPI_DONE:
888c2ecf20Sopenharmony_ci		return QSPI_INTERRUPTS_ALL;
898c2ecf20Sopenharmony_ci	case BSPI_ERR:
908c2ecf20Sopenharmony_ci		return BSPI_LR_INTERRUPTS_ERROR;
918c2ecf20Sopenharmony_ci	}
928c2ecf20Sopenharmony_ci
938c2ecf20Sopenharmony_ci	return 0;
948c2ecf20Sopenharmony_ci}
958c2ecf20Sopenharmony_ci
968c2ecf20Sopenharmony_ci/* The common driver functions to be called by the SoC platform driver */
978c2ecf20Sopenharmony_ciint bcm_qspi_probe(struct platform_device *pdev,
988c2ecf20Sopenharmony_ci		   struct bcm_qspi_soc_intc *soc_intc);
998c2ecf20Sopenharmony_ciint bcm_qspi_remove(struct platform_device *pdev);
1008c2ecf20Sopenharmony_ci
1018c2ecf20Sopenharmony_ci/* pm_ops used by the SoC platform driver called on PM suspend/resume */
1028c2ecf20Sopenharmony_ciextern const struct dev_pm_ops bcm_qspi_pm_ops;
1038c2ecf20Sopenharmony_ci
1048c2ecf20Sopenharmony_ci#endif /* __SPI_BCM_QSPI_H__ */
105