1889Ssundar/* SPDX-License-Identifier: GPL-2.0-only */
2889Ssundar/*
3889Ssundar * Copyright 2016 Broadcom
4970Sattila */
5889Ssundar
6889Ssundar#ifndef __SPI_BCM_QSPI_H__
7889Ssundar#define __SPI_BCM_QSPI_H__
8970Sattila
9889Ssundar#include <linux/types.h>
10889Ssundar#include <linux/io.h>
11889Ssundar
12889Ssundar/* BSPI interrupt masks */
13889Ssundar#define INTR_BSPI_LR_OVERREAD_MASK		BIT(4)
14970Sattila#define INTR_BSPI_LR_SESSION_DONE_MASK		BIT(3)
15889Ssundar#define INTR_BSPI_LR_IMPATIENT_MASK		BIT(2)
16889Ssundar#define INTR_BSPI_LR_SESSION_ABORTED_MASK	BIT(1)
17889Ssundar#define INTR_BSPI_LR_FULLNESS_REACHED_MASK	BIT(0)
18970Sattila
19889Ssundar#define BSPI_LR_INTERRUPTS_DATA		       \
20889Ssundar	(INTR_BSPI_LR_SESSION_DONE_MASK |	       \
21889Ssundar	 INTR_BSPI_LR_FULLNESS_REACHED_MASK)
22889Ssundar
23889Ssundar#define BSPI_LR_INTERRUPTS_ERROR               \
24889Ssundar	(INTR_BSPI_LR_OVERREAD_MASK |	       \
25889Ssundar	 INTR_BSPI_LR_IMPATIENT_MASK |	       \
26889Ssundar	 INTR_BSPI_LR_SESSION_ABORTED_MASK)
27889Ssundar
281057Ssundar#define BSPI_LR_INTERRUPTS_ALL                 \
291057Ssundar	(BSPI_LR_INTERRUPTS_ERROR |	       \
30889Ssundar	 BSPI_LR_INTERRUPTS_DATA)
31889Ssundar
32889Ssundar/* MSPI Interrupt masks */
33889Ssundar#define INTR_MSPI_HALTED_MASK			BIT(6)
34889Ssundar#define INTR_MSPI_DONE_MASK			BIT(5)
35889Ssundar
361829Salanb#define MSPI_INTERRUPTS_ALL		       \
37889Ssundar	(INTR_MSPI_DONE_MASK |		       \
38889Ssundar	 INTR_MSPI_HALTED_MASK)
39889Ssundar
40889Ssundar#define QSPI_INTERRUPTS_ALL                    \
41889Ssundar	(MSPI_INTERRUPTS_ALL |		       \
42889Ssundar	 BSPI_LR_INTERRUPTS_ALL)
431829Salanb
44889Ssundarstruct platform_device;
45889Ssundarstruct dev_pm_ops;
46889Ssundar
47889Ssundarenum {
48889Ssundar	MSPI_DONE = 0x1,
49889Ssundar	BSPI_DONE = 0x2,
50889Ssundar	BSPI_ERR = 0x4,
51889Ssundar	MSPI_BSPI_DONE = 0x7
52889Ssundar};
531829Salanb
54889Ssundarstruct bcm_qspi_soc_intc {
55889Ssundar	void (*bcm_qspi_int_ack)(struct bcm_qspi_soc_intc *soc_intc, int type);
56889Ssundar	void (*bcm_qspi_int_set)(struct bcm_qspi_soc_intc *soc_intc, int type,
57889Ssundar				 bool en);
58889Ssundar	u32 (*bcm_qspi_get_int_status)(struct bcm_qspi_soc_intc *soc_intc);
59889Ssundar};
60889Ssundar
61889Ssundar/* Read controller register*/
62889Ssundarstatic inline u32 bcm_qspi_readl(bool be, void __iomem *addr)
63889Ssundar{
64889Ssundar	if (be)
65889Ssundar		return ioread32be(addr);
66889Ssundar	else
67889Ssundar		return readl_relaxed(addr);
68889Ssundar}
69889Ssundar
70889Ssundar/* Write controller register*/
71889Ssundarstatic inline void bcm_qspi_writel(bool be,
72889Ssundar				   unsigned int data, void __iomem *addr)
73889Ssundar{
74889Ssundar	if (be)
75889Ssundar		iowrite32be(data, addr);
76889Ssundar	else
77889Ssundar		writel_relaxed(data, addr);
78889Ssundar}
79889Ssundar
80889Ssundarstatic inline u32 get_qspi_mask(int type)
81889Ssundar{
82889Ssundar	switch (type) {
83889Ssundar	case MSPI_DONE:
84889Ssundar		return INTR_MSPI_DONE_MASK;
85889Ssundar	case BSPI_DONE:
86889Ssundar		return BSPI_LR_INTERRUPTS_ALL;
87889Ssundar	case MSPI_BSPI_DONE:
88889Ssundar		return QSPI_INTERRUPTS_ALL;
89889Ssundar	case BSPI_ERR:
90889Ssundar		return BSPI_LR_INTERRUPTS_ERROR;
91889Ssundar	}
92889Ssundar
93889Ssundar	return 0;
94889Ssundar}
95889Ssundar
96970Sattila/* The common driver functions to be called by the SoC platform driver */
97889Ssundarint bcm_qspi_probe(struct platform_device *pdev,
98889Ssundar		   struct bcm_qspi_soc_intc *soc_intc);
99889Ssundarvoid bcm_qspi_remove(struct platform_device *pdev);
100889Ssundar
101889Ssundar/* pm_ops used by the SoC platform driver called on PM suspend/resume */
102889Ssundarextern const struct dev_pm_ops bcm_qspi_pm_ops;
103889Ssundar
104970Sattila#endif /* __SPI_BCM_QSPI_H__ */
105889Ssundar