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