xref: /openbmc/linux/drivers/mmc/host/tmio_mmc.h (revision b6147490)
1b6147490SGuennadi Liakhovetski /*
2b6147490SGuennadi Liakhovetski  * linux/drivers/mmc/host/tmio_mmc.h
3b6147490SGuennadi Liakhovetski  *
4b6147490SGuennadi Liakhovetski  * Copyright (C) 2007 Ian Molton
5b6147490SGuennadi Liakhovetski  * Copyright (C) 2004 Ian Molton
6b6147490SGuennadi Liakhovetski  *
7b6147490SGuennadi Liakhovetski  * This program is free software; you can redistribute it and/or modify
8b6147490SGuennadi Liakhovetski  * it under the terms of the GNU General Public License version 2 as
9b6147490SGuennadi Liakhovetski  * published by the Free Software Foundation.
10b6147490SGuennadi Liakhovetski  *
11b6147490SGuennadi Liakhovetski  * Driver for the MMC / SD / SDIO cell found in:
12b6147490SGuennadi Liakhovetski  *
13b6147490SGuennadi Liakhovetski  * TC6393XB TC6391XB TC6387XB T7L66XB ASIC3
14b6147490SGuennadi Liakhovetski  */
15b6147490SGuennadi Liakhovetski 
16b6147490SGuennadi Liakhovetski #ifndef TMIO_MMC_H
17b6147490SGuennadi Liakhovetski #define TMIO_MMC_H
18b6147490SGuennadi Liakhovetski 
19b6147490SGuennadi Liakhovetski #include <linux/highmem.h>
20b6147490SGuennadi Liakhovetski #include <linux/pagemap.h>
21b6147490SGuennadi Liakhovetski 
22b6147490SGuennadi Liakhovetski /* Definitions for values the CTRL_STATUS register can take. */
23b6147490SGuennadi Liakhovetski #define TMIO_STAT_CMDRESPEND    0x00000001
24b6147490SGuennadi Liakhovetski #define TMIO_STAT_DATAEND       0x00000004
25b6147490SGuennadi Liakhovetski #define TMIO_STAT_CARD_REMOVE   0x00000008
26b6147490SGuennadi Liakhovetski #define TMIO_STAT_CARD_INSERT   0x00000010
27b6147490SGuennadi Liakhovetski #define TMIO_STAT_SIGSTATE      0x00000020
28b6147490SGuennadi Liakhovetski #define TMIO_STAT_WRPROTECT     0x00000080
29b6147490SGuennadi Liakhovetski #define TMIO_STAT_CARD_REMOVE_A 0x00000100
30b6147490SGuennadi Liakhovetski #define TMIO_STAT_CARD_INSERT_A 0x00000200
31b6147490SGuennadi Liakhovetski #define TMIO_STAT_SIGSTATE_A    0x00000400
32b6147490SGuennadi Liakhovetski #define TMIO_STAT_CMD_IDX_ERR   0x00010000
33b6147490SGuennadi Liakhovetski #define TMIO_STAT_CRCFAIL       0x00020000
34b6147490SGuennadi Liakhovetski #define TMIO_STAT_STOPBIT_ERR   0x00040000
35b6147490SGuennadi Liakhovetski #define TMIO_STAT_DATATIMEOUT   0x00080000
36b6147490SGuennadi Liakhovetski #define TMIO_STAT_RXOVERFLOW    0x00100000
37b6147490SGuennadi Liakhovetski #define TMIO_STAT_TXUNDERRUN    0x00200000
38b6147490SGuennadi Liakhovetski #define TMIO_STAT_CMDTIMEOUT    0x00400000
39b6147490SGuennadi Liakhovetski #define TMIO_STAT_RXRDY         0x01000000
40b6147490SGuennadi Liakhovetski #define TMIO_STAT_TXRQ          0x02000000
41b6147490SGuennadi Liakhovetski #define TMIO_STAT_ILL_FUNC      0x20000000
42b6147490SGuennadi Liakhovetski #define TMIO_STAT_CMD_BUSY      0x40000000
43b6147490SGuennadi Liakhovetski #define TMIO_STAT_ILL_ACCESS    0x80000000
44b6147490SGuennadi Liakhovetski 
45b6147490SGuennadi Liakhovetski /* Definitions for values the CTRL_SDIO_STATUS register can take. */
46b6147490SGuennadi Liakhovetski #define TMIO_SDIO_STAT_IOIRQ		0x0001
47b6147490SGuennadi Liakhovetski #define TMIO_SDIO_STAT_EXPUB52	0x4000
48b6147490SGuennadi Liakhovetski #define TMIO_SDIO_STAT_EXWT		0x8000
49b6147490SGuennadi Liakhovetski #define TMIO_SDIO_MASK_ALL		0xc007
50b6147490SGuennadi Liakhovetski 
51b6147490SGuennadi Liakhovetski /* Define some IRQ masks */
52b6147490SGuennadi Liakhovetski /* This is the mask used at reset by the chip */
53b6147490SGuennadi Liakhovetski #define TMIO_MASK_ALL           0x837f031d
54b6147490SGuennadi Liakhovetski #define TMIO_MASK_READOP  (TMIO_STAT_RXRDY | TMIO_STAT_DATAEND)
55b6147490SGuennadi Liakhovetski #define TMIO_MASK_WRITEOP (TMIO_STAT_TXRQ | TMIO_STAT_DATAEND)
56b6147490SGuennadi Liakhovetski #define TMIO_MASK_CMD     (TMIO_STAT_CMDRESPEND | TMIO_STAT_CMDTIMEOUT | \
57b6147490SGuennadi Liakhovetski 		TMIO_STAT_CARD_REMOVE | TMIO_STAT_CARD_INSERT)
58b6147490SGuennadi Liakhovetski #define TMIO_MASK_IRQ     (TMIO_MASK_READOP | TMIO_MASK_WRITEOP | TMIO_MASK_CMD)
59b6147490SGuennadi Liakhovetski 
60b6147490SGuennadi Liakhovetski struct tmio_mmc_data;
61b6147490SGuennadi Liakhovetski 
62b6147490SGuennadi Liakhovetski struct tmio_mmc_host {
63b6147490SGuennadi Liakhovetski 	void __iomem *ctl;
64b6147490SGuennadi Liakhovetski 	unsigned long bus_shift;
65b6147490SGuennadi Liakhovetski 	struct mmc_command      *cmd;
66b6147490SGuennadi Liakhovetski 	struct mmc_request      *mrq;
67b6147490SGuennadi Liakhovetski 	struct mmc_data         *data;
68b6147490SGuennadi Liakhovetski 	struct mmc_host         *mmc;
69b6147490SGuennadi Liakhovetski 	int                     irq;
70b6147490SGuennadi Liakhovetski 	unsigned int		sdio_irq_enabled;
71b6147490SGuennadi Liakhovetski 
72b6147490SGuennadi Liakhovetski 	/* Callbacks for clock / power control */
73b6147490SGuennadi Liakhovetski 	void (*set_pwr)(struct platform_device *host, int state);
74b6147490SGuennadi Liakhovetski 	void (*set_clk_div)(struct platform_device *host, int state);
75b6147490SGuennadi Liakhovetski 
76b6147490SGuennadi Liakhovetski 	/* pio related stuff */
77b6147490SGuennadi Liakhovetski 	struct scatterlist      *sg_ptr;
78b6147490SGuennadi Liakhovetski 	struct scatterlist      *sg_orig;
79b6147490SGuennadi Liakhovetski 	unsigned int            sg_len;
80b6147490SGuennadi Liakhovetski 	unsigned int            sg_off;
81b6147490SGuennadi Liakhovetski 
82b6147490SGuennadi Liakhovetski 	struct platform_device *pdev;
83b6147490SGuennadi Liakhovetski 	struct tmio_mmc_data *pdata;
84b6147490SGuennadi Liakhovetski 
85b6147490SGuennadi Liakhovetski 	/* DMA support */
86b6147490SGuennadi Liakhovetski 	bool			force_pio;
87b6147490SGuennadi Liakhovetski 	struct dma_chan		*chan_rx;
88b6147490SGuennadi Liakhovetski 	struct dma_chan		*chan_tx;
89b6147490SGuennadi Liakhovetski 	struct tasklet_struct	dma_complete;
90b6147490SGuennadi Liakhovetski 	struct tasklet_struct	dma_issue;
91b6147490SGuennadi Liakhovetski 	struct scatterlist	bounce_sg;
92b6147490SGuennadi Liakhovetski 	u8			*bounce_buf;
93b6147490SGuennadi Liakhovetski 
94b6147490SGuennadi Liakhovetski 	/* Track lost interrupts */
95b6147490SGuennadi Liakhovetski 	struct delayed_work	delayed_reset_work;
96b6147490SGuennadi Liakhovetski 	spinlock_t		lock;
97b6147490SGuennadi Liakhovetski 	unsigned long		last_req_ts;
98b6147490SGuennadi Liakhovetski };
99b6147490SGuennadi Liakhovetski 
100b6147490SGuennadi Liakhovetski int tmio_mmc_host_probe(struct tmio_mmc_host **host,
101b6147490SGuennadi Liakhovetski 			struct platform_device *pdev,
102b6147490SGuennadi Liakhovetski 			struct tmio_mmc_data *pdata);
103b6147490SGuennadi Liakhovetski void tmio_mmc_host_remove(struct tmio_mmc_host *host);
104b6147490SGuennadi Liakhovetski void tmio_mmc_do_data_irq(struct tmio_mmc_host *host);
105b6147490SGuennadi Liakhovetski 
106b6147490SGuennadi Liakhovetski void tmio_mmc_enable_mmc_irqs(struct tmio_mmc_host *host, u32 i);
107b6147490SGuennadi Liakhovetski void tmio_mmc_disable_mmc_irqs(struct tmio_mmc_host *host, u32 i);
108b6147490SGuennadi Liakhovetski 
109b6147490SGuennadi Liakhovetski static inline char *tmio_mmc_kmap_atomic(struct scatterlist *sg,
110b6147490SGuennadi Liakhovetski 					 unsigned long *flags)
111b6147490SGuennadi Liakhovetski {
112b6147490SGuennadi Liakhovetski 	local_irq_save(*flags);
113b6147490SGuennadi Liakhovetski 	return kmap_atomic(sg_page(sg), KM_BIO_SRC_IRQ) + sg->offset;
114b6147490SGuennadi Liakhovetski }
115b6147490SGuennadi Liakhovetski 
116b6147490SGuennadi Liakhovetski static inline void tmio_mmc_kunmap_atomic(struct scatterlist *sg,
117b6147490SGuennadi Liakhovetski 					  unsigned long *flags, void *virt)
118b6147490SGuennadi Liakhovetski {
119b6147490SGuennadi Liakhovetski 	kunmap_atomic(virt - sg->offset, KM_BIO_SRC_IRQ);
120b6147490SGuennadi Liakhovetski 	local_irq_restore(*flags);
121b6147490SGuennadi Liakhovetski }
122b6147490SGuennadi Liakhovetski 
123b6147490SGuennadi Liakhovetski #ifdef CONFIG_TMIO_MMC_DMA
124b6147490SGuennadi Liakhovetski void tmio_mmc_start_dma(struct tmio_mmc_host *host, struct mmc_data *data);
125b6147490SGuennadi Liakhovetski void tmio_mmc_request_dma(struct tmio_mmc_host *host, struct tmio_mmc_data *pdata);
126b6147490SGuennadi Liakhovetski void tmio_mmc_release_dma(struct tmio_mmc_host *host);
127b6147490SGuennadi Liakhovetski #else
128b6147490SGuennadi Liakhovetski static inline void tmio_mmc_start_dma(struct tmio_mmc_host *host,
129b6147490SGuennadi Liakhovetski 			       struct mmc_data *data)
130b6147490SGuennadi Liakhovetski {
131b6147490SGuennadi Liakhovetski }
132b6147490SGuennadi Liakhovetski 
133b6147490SGuennadi Liakhovetski static inline void tmio_mmc_request_dma(struct tmio_mmc_host *host,
134b6147490SGuennadi Liakhovetski 				 struct tmio_mmc_data *pdata)
135b6147490SGuennadi Liakhovetski {
136b6147490SGuennadi Liakhovetski 	host->chan_tx = NULL;
137b6147490SGuennadi Liakhovetski 	host->chan_rx = NULL;
138b6147490SGuennadi Liakhovetski }
139b6147490SGuennadi Liakhovetski 
140b6147490SGuennadi Liakhovetski static inline void tmio_mmc_release_dma(struct tmio_mmc_host *host)
141b6147490SGuennadi Liakhovetski {
142b6147490SGuennadi Liakhovetski }
143b6147490SGuennadi Liakhovetski #endif
144b6147490SGuennadi Liakhovetski 
145b6147490SGuennadi Liakhovetski #endif
146