1/* SPDX-License-Identifier: GPL-2.0-only */
2/*
3 * Copyright 2016 Broadcom
4 */
5
6#ifndef __SPI_BCM_QSPI_H__
7#define __SPI_BCM_QSPI_H__
8
9#include <linux/types.h>
10#include <linux/io.h>
11
12/* BSPI interrupt masks */
13#define INTR_BSPI_LR_OVERREAD_MASK		BIT(4)
14#define INTR_BSPI_LR_SESSION_DONE_MASK		BIT(3)
15#define INTR_BSPI_LR_IMPATIENT_MASK		BIT(2)
16#define INTR_BSPI_LR_SESSION_ABORTED_MASK	BIT(1)
17#define INTR_BSPI_LR_FULLNESS_REACHED_MASK	BIT(0)
18
19#define BSPI_LR_INTERRUPTS_DATA		       \
20	(INTR_BSPI_LR_SESSION_DONE_MASK |	       \
21	 INTR_BSPI_LR_FULLNESS_REACHED_MASK)
22
23#define BSPI_LR_INTERRUPTS_ERROR               \
24	(INTR_BSPI_LR_OVERREAD_MASK |	       \
25	 INTR_BSPI_LR_IMPATIENT_MASK |	       \
26	 INTR_BSPI_LR_SESSION_ABORTED_MASK)
27
28#define BSPI_LR_INTERRUPTS_ALL                 \
29	(BSPI_LR_INTERRUPTS_ERROR |	       \
30	 BSPI_LR_INTERRUPTS_DATA)
31
32/* MSPI Interrupt masks */
33#define INTR_MSPI_HALTED_MASK			BIT(6)
34#define INTR_MSPI_DONE_MASK			BIT(5)
35
36#define MSPI_INTERRUPTS_ALL		       \
37	(INTR_MSPI_DONE_MASK |		       \
38	 INTR_MSPI_HALTED_MASK)
39
40#define QSPI_INTERRUPTS_ALL                    \
41	(MSPI_INTERRUPTS_ALL |		       \
42	 BSPI_LR_INTERRUPTS_ALL)
43
44struct platform_device;
45struct dev_pm_ops;
46
47enum {
48	MSPI_DONE = 0x1,
49	BSPI_DONE = 0x2,
50	BSPI_ERR = 0x4,
51	MSPI_BSPI_DONE = 0x7
52};
53
54struct bcm_qspi_soc_intc {
55	void (*bcm_qspi_int_ack)(struct bcm_qspi_soc_intc *soc_intc, int type);
56	void (*bcm_qspi_int_set)(struct bcm_qspi_soc_intc *soc_intc, int type,
57				 bool en);
58	u32 (*bcm_qspi_get_int_status)(struct bcm_qspi_soc_intc *soc_intc);
59};
60
61/* Read controller register*/
62static inline u32 bcm_qspi_readl(bool be, void __iomem *addr)
63{
64	if (be)
65		return ioread32be(addr);
66	else
67		return readl_relaxed(addr);
68}
69
70/* Write controller register*/
71static inline void bcm_qspi_writel(bool be,
72				   unsigned int data, void __iomem *addr)
73{
74	if (be)
75		iowrite32be(data, addr);
76	else
77		writel_relaxed(data, addr);
78}
79
80static inline u32 get_qspi_mask(int type)
81{
82	switch (type) {
83	case MSPI_DONE:
84		return INTR_MSPI_DONE_MASK;
85	case BSPI_DONE:
86		return BSPI_LR_INTERRUPTS_ALL;
87	case MSPI_BSPI_DONE:
88		return QSPI_INTERRUPTS_ALL;
89	case BSPI_ERR:
90		return BSPI_LR_INTERRUPTS_ERROR;
91	}
92
93	return 0;
94}
95
96/* The common driver functions to be called by the SoC platform driver */
97int bcm_qspi_probe(struct platform_device *pdev,
98		   struct bcm_qspi_soc_intc *soc_intc);
99void bcm_qspi_remove(struct platform_device *pdev);
100
101/* pm_ops used by the SoC platform driver called on PM suspend/resume */
102extern const struct dev_pm_ops bcm_qspi_pm_ops;
103
104#endif /* __SPI_BCM_QSPI_H__ */
105