diff options
author | Philipp Zabel <philipp.zabel@gmail.com> | 2009-06-04 14:12:32 -0400 |
---|---|---|
committer | Pierre Ossman <pierre@ossman.eu> | 2009-06-13 16:43:00 -0400 |
commit | 5e74672c0925335bb00772530634ac70179e8a19 (patch) | |
tree | 79439c648df81cd2fdce4e4fc50d90ff6ba20e04 /drivers/mmc/host/tmio_mmc.h | |
parent | f0e46cc4971f6be96010d9248e0fc076b229d989 (diff) |
tmio_mmc: add bus_shift support
Some ASIC3 devices in the wild are connected with the address bus shifted
by one line, so that its 16-bit registers appear 32-bit aligned in host
memory space.
Signed-off-by: Philipp Zabel <philipp.zabel@gmail.com>
Acked-by: Ian Molton <ian@mnementh.co.uk>
Signed-off-by: Pierre Ossman <pierre@ossman.eu>
Diffstat (limited to 'drivers/mmc/host/tmio_mmc.h')
-rw-r--r-- | drivers/mmc/host/tmio_mmc.h | 77 |
1 files changed, 68 insertions, 9 deletions
diff --git a/drivers/mmc/host/tmio_mmc.h b/drivers/mmc/host/tmio_mmc.h index 9c831ab2ece6..9fa998594974 100644 --- a/drivers/mmc/host/tmio_mmc.h +++ b/drivers/mmc/host/tmio_mmc.h | |||
@@ -83,34 +83,36 @@ | |||
83 | TMIO_STAT_CARD_REMOVE | TMIO_STAT_CARD_INSERT) | 83 | TMIO_STAT_CARD_REMOVE | TMIO_STAT_CARD_INSERT) |
84 | #define TMIO_MASK_IRQ (TMIO_MASK_READOP | TMIO_MASK_WRITEOP | TMIO_MASK_CMD) | 84 | #define TMIO_MASK_IRQ (TMIO_MASK_READOP | TMIO_MASK_WRITEOP | TMIO_MASK_CMD) |
85 | 85 | ||
86 | #define enable_mmc_irqs(ctl, i) \ | 86 | |
87 | #define enable_mmc_irqs(host, i) \ | ||
87 | do { \ | 88 | do { \ |
88 | u32 mask;\ | 89 | u32 mask;\ |
89 | mask = tmio_ioread32((ctl) + CTL_IRQ_MASK); \ | 90 | mask = sd_ctrl_read32((host), CTL_IRQ_MASK); \ |
90 | mask &= ~((i) & TMIO_MASK_IRQ); \ | 91 | mask &= ~((i) & TMIO_MASK_IRQ); \ |
91 | tmio_iowrite32(mask, (ctl) + CTL_IRQ_MASK); \ | 92 | sd_ctrl_write32((host), CTL_IRQ_MASK, mask); \ |
92 | } while (0) | 93 | } while (0) |
93 | 94 | ||
94 | #define disable_mmc_irqs(ctl, i) \ | 95 | #define disable_mmc_irqs(host, i) \ |
95 | do { \ | 96 | do { \ |
96 | u32 mask;\ | 97 | u32 mask;\ |
97 | mask = tmio_ioread32((ctl) + CTL_IRQ_MASK); \ | 98 | mask = sd_ctrl_read32((host), CTL_IRQ_MASK); \ |
98 | mask |= ((i) & TMIO_MASK_IRQ); \ | 99 | mask |= ((i) & TMIO_MASK_IRQ); \ |
99 | tmio_iowrite32(mask, (ctl) + CTL_IRQ_MASK); \ | 100 | sd_ctrl_write32((host), CTL_IRQ_MASK, mask); \ |
100 | } while (0) | 101 | } while (0) |
101 | 102 | ||
102 | #define ack_mmc_irqs(ctl, i) \ | 103 | #define ack_mmc_irqs(host, i) \ |
103 | do { \ | 104 | do { \ |
104 | u32 mask;\ | 105 | u32 mask;\ |
105 | mask = tmio_ioread32((ctl) + CTL_STATUS); \ | 106 | mask = sd_ctrl_read32((host), CTL_STATUS); \ |
106 | mask &= ~((i) & TMIO_MASK_IRQ); \ | 107 | mask &= ~((i) & TMIO_MASK_IRQ); \ |
107 | tmio_iowrite32(mask, (ctl) + CTL_STATUS); \ | 108 | sd_ctrl_write32((host), CTL_STATUS, mask); \ |
108 | } while (0) | 109 | } while (0) |
109 | 110 | ||
110 | 111 | ||
111 | struct tmio_mmc_host { | 112 | struct tmio_mmc_host { |
112 | void __iomem *cnf; | 113 | void __iomem *cnf; |
113 | void __iomem *ctl; | 114 | void __iomem *ctl; |
115 | unsigned long bus_shift; | ||
114 | struct mmc_command *cmd; | 116 | struct mmc_command *cmd; |
115 | struct mmc_request *mrq; | 117 | struct mmc_request *mrq; |
116 | struct mmc_data *data; | 118 | struct mmc_data *data; |
@@ -123,6 +125,63 @@ struct tmio_mmc_host { | |||
123 | unsigned int sg_off; | 125 | unsigned int sg_off; |
124 | }; | 126 | }; |
125 | 127 | ||
128 | #include <linux/io.h> | ||
129 | |||
130 | static inline u16 sd_ctrl_read16(struct tmio_mmc_host *host, int addr) | ||
131 | { | ||
132 | return readw(host->ctl + (addr << host->bus_shift)); | ||
133 | } | ||
134 | |||
135 | static inline void sd_ctrl_read16_rep(struct tmio_mmc_host *host, int addr, | ||
136 | u16 *buf, int count) | ||
137 | { | ||
138 | readsw(host->ctl + (addr << host->bus_shift), buf, count); | ||
139 | } | ||
140 | |||
141 | static inline u32 sd_ctrl_read32(struct tmio_mmc_host *host, int addr) | ||
142 | { | ||
143 | return readw(host->ctl + (addr << host->bus_shift)) | | ||
144 | readw(host->ctl + ((addr + 2) << host->bus_shift)) << 16; | ||
145 | } | ||
146 | |||
147 | static inline void sd_ctrl_write16(struct tmio_mmc_host *host, int addr, | ||
148 | u16 val) | ||
149 | { | ||
150 | writew(val, host->ctl + (addr << host->bus_shift)); | ||
151 | } | ||
152 | |||
153 | static inline void sd_ctrl_write16_rep(struct tmio_mmc_host *host, int addr, | ||
154 | u16 *buf, int count) | ||
155 | { | ||
156 | writesw(host->ctl + (addr << host->bus_shift), buf, count); | ||
157 | } | ||
158 | |||
159 | static inline void sd_ctrl_write32(struct tmio_mmc_host *host, int addr, | ||
160 | u32 val) | ||
161 | { | ||
162 | writew(val, host->ctl + (addr << host->bus_shift)); | ||
163 | writew(val >> 16, host->ctl + ((addr + 2) << host->bus_shift)); | ||
164 | } | ||
165 | |||
166 | static inline void sd_config_write8(struct tmio_mmc_host *host, int addr, | ||
167 | u8 val) | ||
168 | { | ||
169 | writeb(val, host->cnf + (addr << host->bus_shift)); | ||
170 | } | ||
171 | |||
172 | static inline void sd_config_write16(struct tmio_mmc_host *host, int addr, | ||
173 | u16 val) | ||
174 | { | ||
175 | writew(val, host->cnf + (addr << host->bus_shift)); | ||
176 | } | ||
177 | |||
178 | static inline void sd_config_write32(struct tmio_mmc_host *host, int addr, | ||
179 | u32 val) | ||
180 | { | ||
181 | writew(val, host->cnf + (addr << host->bus_shift)); | ||
182 | writew(val >> 16, host->cnf + ((addr + 2) << host->bus_shift)); | ||
183 | } | ||
184 | |||
126 | #include <linux/scatterlist.h> | 185 | #include <linux/scatterlist.h> |
127 | #include <linux/blkdev.h> | 186 | #include <linux/blkdev.h> |
128 | 187 | ||