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