linux/drivers/spi/spi-bcm-qspi.h
<<
>>
Prefs
   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);
  99int 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