aboutsummaryrefslogtreecommitdiff
path: root/include/linux/spi/pxa2xx_spi.h
blob: c73d1445c77ecfc13a4867f60444f6c3a1adc183 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
/*
 * Copyright (C) 2005 Stephen Street / StreetFire Sound Labs
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */
#ifndef __linux_pxa2xx_spi_h
#define __linux_pxa2xx_spi_h

#include <linux/pxa2xx_ssp.h>

#define PXA2XX_CS_ASSERT (0x01)
#define PXA2XX_CS_DEASSERT (0x02)

/* device.platform_data for SSP controller devices */
struct pxa2xx_spi_master {
	u32 clock_enable;
	u16 num_chipselect;
	u8 enable_dma;
};

/* spi_board_info.controller_data for SPI slave devices,
 * copied to spi_device.platform_data ... mostly for dma tuning
 */
struct pxa2xx_spi_chip {
	u8 tx_threshold;
	u8 rx_threshold;
	u8 dma_burst_size;
	u32 timeout;
	u8 enable_loopback;
	int gpio_cs;
	void (*cs_control)(u32 command);
};

#if defined(CONFIG_ARCH_PXA) || defined(CONFIG_ARCH_MMP)

#include <linux/clk.h>
#include <mach/dma.h>

extern void pxa2xx_set_spi_info(unsigned id, struct pxa2xx_spi_master *info);

#else
/*
 * This is the implemtation for CE4100 on x86. ARM defines them in mach/ or
 * plat/ include path.
 * The CE4100 does not provide DMA support. This bits are here to let the driver
 * compile and will never be used. Maybe we get DMA support at a later point in
 * time.
 */

#define DCSR(n)         (n)
#define DSADR(n)        (n)
#define DTADR(n)        (n)
#define DCMD(n)         (n)
#define DRCMR(n)        (n)

#define DCSR_RUN	(1 << 31)	/* Run Bit */
#define DCSR_NODESC	(1 << 30)	/* No-Descriptor Fetch */
#define DCSR_STOPIRQEN	(1 << 29)	/* Stop Interrupt Enable */
#define DCSR_REQPEND	(1 << 8)	/* Request Pending (read-only) */
#define DCSR_STOPSTATE	(1 << 3)	/* Stop State (read-only) */
#define DCSR_ENDINTR	(1 << 2)	/* End Interrupt */
#define DCSR_STARTINTR	(1 << 1)	/* Start Interrupt */
#define DCSR_BUSERR	(1 << 0)	/* Bus Error Interrupt */

#define DCSR_EORIRQEN	(1 << 28)	/* End of Receive Interrupt Enable */
#define DCSR_EORJMPEN	(1 << 27)	/* Jump to next descriptor on EOR */
#define DCSR_EORSTOPEN	(1 << 26)	/* STOP on an EOR */
#define DCSR_SETCMPST	(1 << 25)	/* Set Descriptor Compare Status */
#define DCSR_CLRCMPST	(1 << 24)	/* Clear Descriptor Compare Status */
#define DCSR_CMPST	(1 << 10)	/* The Descriptor Compare Status */
#define DCSR_EORINTR	(1 << 9)	/* The end of Receive */

#define DRCMR_MAPVLD	(1 << 7)	/* Map Valid */
#define DRCMR_CHLNUM	0x1f		/* mask for Channel Number */

#define DDADR_DESCADDR	0xfffffff0	/* Address of next descriptor */
#define DDADR_STOP	(1 << 0)	/* Stop */

#define DCMD_INCSRCADDR	(1 << 31)	/* Source Address Increment Setting. */
#define DCMD_INCTRGADDR	(1 << 30)	/* Target Address Increment Setting. */
#define DCMD_FLOWSRC	(1 << 29)	/* Flow Control by the source. */
#define DCMD_FLOWTRG	(1 << 28)	/* Flow Control by the target. */
#define DCMD_STARTIRQEN	(1 << 22)	/* Start Interrupt Enable */
#define DCMD_ENDIRQEN	(1 << 21)	/* End Interrupt Enable */
#define DCMD_ENDIAN	(1 << 18)	/* Device Endian-ness. */
#define DCMD_BURST8	(1 << 16)	/* 8 byte burst */
#define DCMD_BURST16	(2 << 16)	/* 16 byte burst */
#define DCMD_BURST32	(3 << 16)	/* 32 byte burst */
#define DCMD_WIDTH1	(1 << 14)	/* 1 byte width */
#define DCMD_WIDTH2	(2 << 14)	/* 2 byte width (HalfWord) */
#define DCMD_WIDTH4	(3 << 14)	/* 4 byte width (Word) */
#define DCMD_LENGTH	0x01fff		/* length mask (max = 8K - 1) */

/*
 * Descriptor structure for PXA's DMA engine
 * Note: this structure must always be aligned to a 16-byte boundary.
 */

typedef enum {
	DMA_PRIO_HIGH = 0,
	DMA_PRIO_MEDIUM = 1,
	DMA_PRIO_LOW = 2
} pxa_dma_prio;

/*
 * DMA registration
 */

static inline int pxa_request_dma(char *name,
		pxa_dma_prio prio,
		void (*irq_handler)(int, void *),
		void *data)
{
	return -ENODEV;
}

static inline void pxa_free_dma(int dma_ch)
{
}

/*
 * The CE4100 does not have the clk framework implemented and SPI clock can
 * not be switched on/off or the divider changed.
 */
static inline void clk_disable(struct clk *clk)
{
}

static inline int clk_enable(struct clk *clk)
{
	return 0;
}

static inline unsigned long clk_get_rate(struct clk *clk)
{
	return 3686400;
}

#endif
#endif