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