Blame view

drivers/spi/spi-pxa2xx.h 3.35 KB
d2912cb15   Thomas Gleixner   treewide: Replace...
1
  /* SPDX-License-Identifier: GPL-2.0-only */
cd7bed003   Mika Westerberg   spi/pxa2xx: break...
2
3
4
  /*
   * Copyright (C) 2005 Stephen Street / StreetFire Sound Labs
   * Copyright (C) 2013, Intel Corporation
cd7bed003   Mika Westerberg   spi/pxa2xx: break...
5
6
7
8
   */
  
  #ifndef SPI_PXA2XX_H
  #define SPI_PXA2XX_H
5928808ef   Mika Westerberg   spi/pxa2xx: add s...
9
10
  #include <linux/atomic.h>
  #include <linux/dmaengine.h>
cd7bed003   Mika Westerberg   spi/pxa2xx: break...
11
12
13
14
15
  #include <linux/errno.h>
  #include <linux/io.h>
  #include <linux/interrupt.h>
  #include <linux/platform_device.h>
  #include <linux/pxa2xx_ssp.h>
5928808ef   Mika Westerberg   spi/pxa2xx: add s...
16
17
  #include <linux/scatterlist.h>
  #include <linux/sizes.h>
cd7bed003   Mika Westerberg   spi/pxa2xx: break...
18
19
20
21
22
23
24
25
26
27
28
29
  #include <linux/spi/spi.h>
  #include <linux/spi/pxa2xx_spi.h>
  
  struct driver_data {
  	/* Driver model hookup */
  	struct platform_device *pdev;
  
  	/* SSP Info */
  	struct ssp_device *ssp;
  
  	/* SPI framework hookup */
  	enum pxa_ssp_type ssp_type;
51eea52d2   Lubomir Rintel   pxa2xx: replace s...
30
  	struct spi_controller *controller;
cd7bed003   Mika Westerberg   spi/pxa2xx: break...
31
32
  
  	/* PXA hookup */
51eea52d2   Lubomir Rintel   pxa2xx: replace s...
33
  	struct pxa2xx_spi_controller *controller_info;
cd7bed003   Mika Westerberg   spi/pxa2xx: break...
34

cd7bed003   Mika Westerberg   spi/pxa2xx: break...
35
36
  	/* SSP register addresses */
  	void __iomem *ioaddr;
7956fadd4   Andy Shevchenko   spi: pxa2xx: Allo...
37
  	phys_addr_t ssdr_physical;
cd7bed003   Mika Westerberg   spi/pxa2xx: break...
38
39
40
41
42
43
  
  	/* SSP masks*/
  	u32 dma_cr1;
  	u32 int_cr1;
  	u32 clear_sr;
  	u32 mask_sr;
5928808ef   Mika Westerberg   spi/pxa2xx: add s...
44
  	/* DMA engine support */
5928808ef   Mika Westerberg   spi/pxa2xx: add s...
45
  	atomic_t dma_running;
d5898e19c   Jarkko Nikula   spi: pxa2xx: Use ...
46
  	/* Current transfer state info */
cd7bed003   Mika Westerberg   spi/pxa2xx: break...
47
48
49
50
  	void *tx;
  	void *tx_end;
  	void *rx;
  	void *rx_end;
cd7bed003   Mika Westerberg   spi/pxa2xx: break...
51
52
53
54
55
  	u8 n_bytes;
  	int (*write)(struct driver_data *drv_data);
  	int (*read)(struct driver_data *drv_data);
  	irqreturn_t (*transfer_handler)(struct driver_data *drv_data);
  	void (*cs_control)(u32 command);
a0d2642e9   Mika Westerberg   spi/pxa2xx: add s...
56
57
  
  	void __iomem *lpss_base;
99f499cd6   Mika Westerberg   spi: pxa2xx: Add ...
58
59
60
  
  	/* GPIOs for chip selects */
  	struct gpio_desc **cs_gpiods;
77d33897c   Lubomir Rintel   spi: pxa2xx: Add ...
61
62
63
  
  	/* Optional slave FIFO ready signal */
  	struct gpio_desc *gpiod_ready;
cd7bed003   Mika Westerberg   spi/pxa2xx: break...
64
65
66
  };
  
  struct chip_data {
cd7bed003   Mika Westerberg   spi/pxa2xx: break...
67
  	u32 cr1;
e5262d056   Weike Chen   spi: spi-pxa2xx: ...
68
  	u32 dds_rate;
cd7bed003   Mika Westerberg   spi/pxa2xx: break...
69
70
71
72
73
  	u32 timeout;
  	u8 n_bytes;
  	u32 dma_burst_size;
  	u32 threshold;
  	u32 dma_threshold;
a0d2642e9   Mika Westerberg   spi/pxa2xx: add s...
74
75
  	u16 lpss_rx_threshold;
  	u16 lpss_tx_threshold;
cd7bed003   Mika Westerberg   spi/pxa2xx: break...
76
  	u8 enable_dma;
cd7bed003   Mika Westerberg   spi/pxa2xx: break...
77
  	union {
c18d925fc   Jan Kiszka   spi: pxa2xx: Conv...
78
  		struct gpio_desc *gpiod_cs;
cd7bed003   Mika Westerberg   spi/pxa2xx: break...
79
80
81
82
83
84
85
  		unsigned int frm;
  	};
  	int gpio_cs_inverted;
  	int (*write)(struct driver_data *drv_data);
  	int (*read)(struct driver_data *drv_data);
  	void (*cs_control)(u32 command);
  };
c039dd275   Jarkko Nikula   spi: pxa2xx: Clea...
86
87
88
89
90
91
92
93
94
95
96
  static inline u32 pxa2xx_spi_read(const struct driver_data *drv_data,
  				  unsigned reg)
  {
  	return __raw_readl(drv_data->ioaddr + reg);
  }
  
  static  inline void pxa2xx_spi_write(const struct driver_data *drv_data,
  				     unsigned reg, u32 val)
  {
  	__raw_writel(val, drv_data->ioaddr + reg);
  }
cd7bed003   Mika Westerberg   spi/pxa2xx: break...
97

cd7bed003   Mika Westerberg   spi/pxa2xx: break...
98
99
100
101
  #define DMA_ALIGNMENT		8
  
  static inline int pxa25x_ssp_comp(struct driver_data *drv_data)
  {
e5262d056   Weike Chen   spi: spi-pxa2xx: ...
102
103
104
105
  	switch (drv_data->ssp_type) {
  	case PXA25x_SSP:
  	case CE4100_SSP:
  	case QUARK_X1000_SSP:
cd7bed003   Mika Westerberg   spi/pxa2xx: break...
106
  		return 1;
e5262d056   Weike Chen   spi: spi-pxa2xx: ...
107
108
109
  	default:
  		return 0;
  	}
cd7bed003   Mika Westerberg   spi/pxa2xx: break...
110
111
112
113
  }
  
  static inline void write_SSSR_CS(struct driver_data *drv_data, u32 val)
  {
e5262d056   Weike Chen   spi: spi-pxa2xx: ...
114
115
  	if (drv_data->ssp_type == CE4100_SSP ||
  	    drv_data->ssp_type == QUARK_X1000_SSP)
c039dd275   Jarkko Nikula   spi: pxa2xx: Clea...
116
  		val |= pxa2xx_spi_read(drv_data, SSSR) & SSSR_ALT_FRM_MASK;
cd7bed003   Mika Westerberg   spi/pxa2xx: break...
117

c039dd275   Jarkko Nikula   spi: pxa2xx: Clea...
118
  	pxa2xx_spi_write(drv_data, SSSR, val);
cd7bed003   Mika Westerberg   spi/pxa2xx: break...
119
120
121
  }
  
  extern int pxa2xx_spi_flush(struct driver_data *drv_data);
cd7bed003   Mika Westerberg   spi/pxa2xx: break...
122

5928808ef   Mika Westerberg   spi/pxa2xx: add s...
123
124
  #define MAX_DMA_LEN		SZ_64K
  #define DEFAULT_DMA_CR1		(SSCR1_TSRE | SSCR1_RSRE | SSCR1_TRAIL)
5928808ef   Mika Westerberg   spi/pxa2xx: add s...
125

cd7bed003   Mika Westerberg   spi/pxa2xx: break...
126
  extern irqreturn_t pxa2xx_spi_dma_transfer(struct driver_data *drv_data);
d5898e19c   Jarkko Nikula   spi: pxa2xx: Use ...
127
128
  extern int pxa2xx_spi_dma_prepare(struct driver_data *drv_data,
  				  struct spi_transfer *xfer);
cd7bed003   Mika Westerberg   spi/pxa2xx: break...
129
  extern void pxa2xx_spi_dma_start(struct driver_data *drv_data);
d5898e19c   Jarkko Nikula   spi: pxa2xx: Use ...
130
  extern void pxa2xx_spi_dma_stop(struct driver_data *drv_data);
cd7bed003   Mika Westerberg   spi/pxa2xx: break...
131
132
  extern int pxa2xx_spi_dma_setup(struct driver_data *drv_data);
  extern void pxa2xx_spi_dma_release(struct driver_data *drv_data);
cd7bed003   Mika Westerberg   spi/pxa2xx: break...
133
134
135
136
137
  extern int pxa2xx_spi_set_dma_burst_and_threshold(struct chip_data *chip,
  						  struct spi_device *spi,
  						  u8 bits_per_word,
  						  u32 *burst_code,
  						  u32 *threshold);
cd7bed003   Mika Westerberg   spi/pxa2xx: break...
138
139
  
  #endif /* SPI_PXA2XX_H */