diff options
author | Bryan Wu <bryan.wu@analog.com> | 2007-12-05 02:45:18 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-12-05 12:21:19 -0500 |
commit | bb90eb00b6c28c8be5a69c6b58d5a6924f6f2ad7 (patch) | |
tree | 946d2f6eb925a8d614e049a6e5157a543a4b0081 /drivers | |
parent | 3f479a65b3f49ee4f058a965e6e33d97ee467b68 (diff) |
spi: spi_bfin: handle multiple spi_masters
Move global SPI regs_base and dma_ch to struct driver_data. Test on BF54x SPI
Flash with 2 spi_master devices enabled.
Signed-off-by: Bryan Wu <bryan.wu@analog.com>
Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/spi/spi_bfin5xx.c | 371 |
1 files changed, 189 insertions, 182 deletions
diff --git a/drivers/spi/spi_bfin5xx.c b/drivers/spi/spi_bfin5xx.c index c7cfd95fa8ec..c4c4905e0aa1 100644 --- a/drivers/spi/spi_bfin5xx.c +++ b/drivers/spi/spi_bfin5xx.c | |||
@@ -61,31 +61,14 @@ MODULE_AUTHOR(DRV_AUTHOR); | |||
61 | MODULE_DESCRIPTION(DRV_DESC); | 61 | MODULE_DESCRIPTION(DRV_DESC); |
62 | MODULE_LICENSE("GPL"); | 62 | MODULE_LICENSE("GPL"); |
63 | 63 | ||
64 | #define IS_DMA_ALIGNED(x) (((u32)(x)&0x07)==0) | 64 | #define IS_DMA_ALIGNED(x) (((u32)(x)&0x07) == 0) |
65 | 65 | ||
66 | static u32 spi_dma_ch; | 66 | #define START_STATE ((void *)0) |
67 | static u32 spi_regs_base; | 67 | #define RUNNING_STATE ((void *)1) |
68 | 68 | #define DONE_STATE ((void *)2) | |
69 | #define DEFINE_SPI_REG(reg, off) \ | 69 | #define ERROR_STATE ((void *)-1) |
70 | static inline u16 read_##reg(void) \ | 70 | #define QUEUE_RUNNING 0 |
71 | { return bfin_read16(spi_regs_base + off); } \ | 71 | #define QUEUE_STOPPED 1 |
72 | static inline void write_##reg(u16 v) \ | ||
73 | {bfin_write16(spi_regs_base + off, v); } | ||
74 | |||
75 | DEFINE_SPI_REG(CTRL, 0x00) | ||
76 | DEFINE_SPI_REG(FLAG, 0x04) | ||
77 | DEFINE_SPI_REG(STAT, 0x08) | ||
78 | DEFINE_SPI_REG(TDBR, 0x0C) | ||
79 | DEFINE_SPI_REG(RDBR, 0x10) | ||
80 | DEFINE_SPI_REG(BAUD, 0x14) | ||
81 | DEFINE_SPI_REG(SHAW, 0x18) | ||
82 | #define START_STATE ((void*)0) | ||
83 | #define RUNNING_STATE ((void*)1) | ||
84 | #define DONE_STATE ((void*)2) | ||
85 | #define ERROR_STATE ((void*)-1) | ||
86 | #define QUEUE_RUNNING 0 | ||
87 | #define QUEUE_STOPPED 1 | ||
88 | int dma_requested; | ||
89 | 72 | ||
90 | struct driver_data { | 73 | struct driver_data { |
91 | /* Driver model hookup */ | 74 | /* Driver model hookup */ |
@@ -94,6 +77,9 @@ struct driver_data { | |||
94 | /* SPI framework hookup */ | 77 | /* SPI framework hookup */ |
95 | struct spi_master *master; | 78 | struct spi_master *master; |
96 | 79 | ||
80 | /* Regs base of SPI controller */ | ||
81 | u32 regs_base; | ||
82 | |||
97 | /* BFIN hookup */ | 83 | /* BFIN hookup */ |
98 | struct bfin5xx_spi_master *master_info; | 84 | struct bfin5xx_spi_master *master_info; |
99 | 85 | ||
@@ -118,9 +104,14 @@ struct driver_data { | |||
118 | void *tx_end; | 104 | void *tx_end; |
119 | void *rx; | 105 | void *rx; |
120 | void *rx_end; | 106 | void *rx_end; |
107 | |||
108 | /* DMA stuffs */ | ||
109 | int dma_channel; | ||
121 | int dma_mapped; | 110 | int dma_mapped; |
111 | int dma_requested; | ||
122 | dma_addr_t rx_dma; | 112 | dma_addr_t rx_dma; |
123 | dma_addr_t tx_dma; | 113 | dma_addr_t tx_dma; |
114 | |||
124 | size_t rx_map_len; | 115 | size_t rx_map_len; |
125 | size_t tx_map_len; | 116 | size_t tx_map_len; |
126 | u8 n_bytes; | 117 | u8 n_bytes; |
@@ -147,20 +138,34 @@ struct chip_data { | |||
147 | void (*duplex) (struct driver_data *); | 138 | void (*duplex) (struct driver_data *); |
148 | }; | 139 | }; |
149 | 140 | ||
141 | #define DEFINE_SPI_REG(reg, off) \ | ||
142 | static inline u16 read_##reg(struct driver_data *drv_data) \ | ||
143 | { return bfin_read16(drv_data->regs_base + off); } \ | ||
144 | static inline void write_##reg(struct driver_data *drv_data, u16 v) \ | ||
145 | { bfin_write16(drv_data->regs_base + off, v); } | ||
146 | |||
147 | DEFINE_SPI_REG(CTRL, 0x00) | ||
148 | DEFINE_SPI_REG(FLAG, 0x04) | ||
149 | DEFINE_SPI_REG(STAT, 0x08) | ||
150 | DEFINE_SPI_REG(TDBR, 0x0C) | ||
151 | DEFINE_SPI_REG(RDBR, 0x10) | ||
152 | DEFINE_SPI_REG(BAUD, 0x14) | ||
153 | DEFINE_SPI_REG(SHAW, 0x18) | ||
154 | |||
150 | static void bfin_spi_enable(struct driver_data *drv_data) | 155 | static void bfin_spi_enable(struct driver_data *drv_data) |
151 | { | 156 | { |
152 | u16 cr; | 157 | u16 cr; |
153 | 158 | ||
154 | cr = read_CTRL(); | 159 | cr = read_CTRL(drv_data); |
155 | write_CTRL(cr | BIT_CTL_ENABLE); | 160 | write_CTRL(drv_data, (cr | BIT_CTL_ENABLE)); |
156 | } | 161 | } |
157 | 162 | ||
158 | static void bfin_spi_disable(struct driver_data *drv_data) | 163 | static void bfin_spi_disable(struct driver_data *drv_data) |
159 | { | 164 | { |
160 | u16 cr; | 165 | u16 cr; |
161 | 166 | ||
162 | cr = read_CTRL(); | 167 | cr = read_CTRL(drv_data); |
163 | write_CTRL(cr & (~BIT_CTL_ENABLE)); | 168 | write_CTRL(drv_data, (cr & (~BIT_CTL_ENABLE))); |
164 | } | 169 | } |
165 | 170 | ||
166 | /* Caculate the SPI_BAUD register value based on input HZ */ | 171 | /* Caculate the SPI_BAUD register value based on input HZ */ |
@@ -180,32 +185,32 @@ static int flush(struct driver_data *drv_data) | |||
180 | unsigned long limit = loops_per_jiffy << 1; | 185 | unsigned long limit = loops_per_jiffy << 1; |
181 | 186 | ||
182 | /* wait for stop and clear stat */ | 187 | /* wait for stop and clear stat */ |
183 | while (!(read_STAT() & BIT_STAT_SPIF) && limit--) | 188 | while (!(read_STAT(drv_data) & BIT_STAT_SPIF) && limit--) |
184 | continue; | 189 | continue; |
185 | 190 | ||
186 | write_STAT(BIT_STAT_CLR); | 191 | write_STAT(drv_data, BIT_STAT_CLR); |
187 | 192 | ||
188 | return limit; | 193 | return limit; |
189 | } | 194 | } |
190 | 195 | ||
191 | /* Chip select operation functions for cs_change flag */ | 196 | /* Chip select operation functions for cs_change flag */ |
192 | static void cs_active(struct chip_data *chip) | 197 | static void cs_active(struct driver_data *drv_data, struct chip_data *chip) |
193 | { | 198 | { |
194 | u16 flag = read_FLAG(); | 199 | u16 flag = read_FLAG(drv_data); |
195 | 200 | ||
196 | flag |= chip->flag; | 201 | flag |= chip->flag; |
197 | flag &= ~(chip->flag << 8); | 202 | flag &= ~(chip->flag << 8); |
198 | 203 | ||
199 | write_FLAG(flag); | 204 | write_FLAG(drv_data, flag); |
200 | } | 205 | } |
201 | 206 | ||
202 | static void cs_deactive(struct chip_data *chip) | 207 | static void cs_deactive(struct driver_data *drv_data, struct chip_data *chip) |
203 | { | 208 | { |
204 | u16 flag = read_FLAG(); | 209 | u16 flag = read_FLAG(drv_data); |
205 | 210 | ||
206 | flag |= (chip->flag << 8); | 211 | flag |= (chip->flag << 8); |
207 | 212 | ||
208 | write_FLAG(flag); | 213 | write_FLAG(drv_data, flag); |
209 | } | 214 | } |
210 | 215 | ||
211 | #define MAX_SPI_SSEL 7 | 216 | #define MAX_SPI_SSEL 7 |
@@ -217,16 +222,16 @@ static int restore_state(struct driver_data *drv_data) | |||
217 | int ret = 0; | 222 | int ret = 0; |
218 | 223 | ||
219 | /* Clear status and disable clock */ | 224 | /* Clear status and disable clock */ |
220 | write_STAT(BIT_STAT_CLR); | 225 | write_STAT(drv_data, BIT_STAT_CLR); |
221 | bfin_spi_disable(drv_data); | 226 | bfin_spi_disable(drv_data); |
222 | dev_dbg(&drv_data->pdev->dev, "restoring spi ctl state\n"); | 227 | dev_dbg(&drv_data->pdev->dev, "restoring spi ctl state\n"); |
223 | 228 | ||
224 | /* Load the registers */ | 229 | /* Load the registers */ |
225 | cs_deactive(chip); | 230 | cs_deactive(drv_data, chip); |
226 | write_BAUD(chip->baud); | 231 | write_BAUD(drv_data, chip->baud); |
227 | chip->ctl_reg &= (~BIT_CTL_TIMOD); | 232 | chip->ctl_reg &= (~BIT_CTL_TIMOD); |
228 | chip->ctl_reg |= (chip->width << 8); | 233 | chip->ctl_reg |= (chip->width << 8); |
229 | write_CTRL(chip->ctl_reg); | 234 | write_CTRL(drv_data, chip->ctl_reg); |
230 | 235 | ||
231 | bfin_spi_enable(drv_data); | 236 | bfin_spi_enable(drv_data); |
232 | 237 | ||
@@ -239,10 +244,10 @@ static int restore_state(struct driver_data *drv_data) | |||
239 | } | 244 | } |
240 | 245 | ||
241 | /* used to kick off transfer in rx mode */ | 246 | /* used to kick off transfer in rx mode */ |
242 | static unsigned short dummy_read(void) | 247 | static unsigned short dummy_read(struct driver_data *drv_data) |
243 | { | 248 | { |
244 | unsigned short tmp; | 249 | unsigned short tmp; |
245 | tmp = read_RDBR(); | 250 | tmp = read_RDBR(drv_data); |
246 | return tmp; | 251 | return tmp; |
247 | } | 252 | } |
248 | 253 | ||
@@ -251,8 +256,8 @@ static void null_writer(struct driver_data *drv_data) | |||
251 | u8 n_bytes = drv_data->n_bytes; | 256 | u8 n_bytes = drv_data->n_bytes; |
252 | 257 | ||
253 | while (drv_data->tx < drv_data->tx_end) { | 258 | while (drv_data->tx < drv_data->tx_end) { |
254 | write_TDBR(0); | 259 | write_TDBR(drv_data, 0); |
255 | while ((read_STAT() & BIT_STAT_TXS)) | 260 | while ((read_STAT(drv_data) & BIT_STAT_TXS)) |
256 | continue; | 261 | continue; |
257 | drv_data->tx += n_bytes; | 262 | drv_data->tx += n_bytes; |
258 | } | 263 | } |
@@ -261,12 +266,12 @@ static void null_writer(struct driver_data *drv_data) | |||
261 | static void null_reader(struct driver_data *drv_data) | 266 | static void null_reader(struct driver_data *drv_data) |
262 | { | 267 | { |
263 | u8 n_bytes = drv_data->n_bytes; | 268 | u8 n_bytes = drv_data->n_bytes; |
264 | dummy_read(); | 269 | dummy_read(drv_data); |
265 | 270 | ||
266 | while (drv_data->rx < drv_data->rx_end) { | 271 | while (drv_data->rx < drv_data->rx_end) { |
267 | while (!(read_STAT() & BIT_STAT_RXS)) | 272 | while (!(read_STAT(drv_data) & BIT_STAT_RXS)) |
268 | continue; | 273 | continue; |
269 | dummy_read(); | 274 | dummy_read(drv_data); |
270 | drv_data->rx += n_bytes; | 275 | drv_data->rx += n_bytes; |
271 | } | 276 | } |
272 | } | 277 | } |
@@ -274,15 +279,15 @@ static void null_reader(struct driver_data *drv_data) | |||
274 | static void u8_writer(struct driver_data *drv_data) | 279 | static void u8_writer(struct driver_data *drv_data) |
275 | { | 280 | { |
276 | dev_dbg(&drv_data->pdev->dev, | 281 | dev_dbg(&drv_data->pdev->dev, |
277 | "cr8-s is 0x%x\n", read_STAT()); | 282 | "cr8-s is 0x%x\n", read_STAT(drv_data)); |
278 | 283 | ||
279 | /* poll for SPI completion before start */ | 284 | /* poll for SPI completion before start */ |
280 | while (!(read_STAT() & BIT_STAT_SPIF)) | 285 | while (!(read_STAT(drv_data) & BIT_STAT_SPIF)) |
281 | continue; | 286 | continue; |
282 | 287 | ||
283 | while (drv_data->tx < drv_data->tx_end) { | 288 | while (drv_data->tx < drv_data->tx_end) { |
284 | write_TDBR(*(u8 *) (drv_data->tx)); | 289 | write_TDBR(drv_data, (*(u8 *) (drv_data->tx))); |
285 | while (read_STAT() & BIT_STAT_TXS) | 290 | while (read_STAT(drv_data) & BIT_STAT_TXS) |
286 | continue; | 291 | continue; |
287 | ++drv_data->tx; | 292 | ++drv_data->tx; |
288 | } | 293 | } |
@@ -293,16 +298,16 @@ static void u8_cs_chg_writer(struct driver_data *drv_data) | |||
293 | struct chip_data *chip = drv_data->cur_chip; | 298 | struct chip_data *chip = drv_data->cur_chip; |
294 | 299 | ||
295 | /* poll for SPI completion before start */ | 300 | /* poll for SPI completion before start */ |
296 | while (!(read_STAT() & BIT_STAT_SPIF)) | 301 | while (!(read_STAT(drv_data) & BIT_STAT_SPIF)) |
297 | continue; | 302 | continue; |
298 | 303 | ||
299 | while (drv_data->tx < drv_data->tx_end) { | 304 | while (drv_data->tx < drv_data->tx_end) { |
300 | cs_active(chip); | 305 | cs_active(drv_data, chip); |
301 | 306 | ||
302 | write_TDBR(*(u8 *) (drv_data->tx)); | 307 | write_TDBR(drv_data, (*(u8 *) (drv_data->tx))); |
303 | while (read_STAT() & BIT_STAT_TXS) | 308 | while (read_STAT(drv_data) & BIT_STAT_TXS) |
304 | continue; | 309 | continue; |
305 | cs_deactive(chip); | 310 | cs_deactive(drv_data, chip); |
306 | 311 | ||
307 | if (chip->cs_chg_udelay) | 312 | if (chip->cs_chg_udelay) |
308 | udelay(chip->cs_chg_udelay); | 313 | udelay(chip->cs_chg_udelay); |
@@ -313,27 +318,27 @@ static void u8_cs_chg_writer(struct driver_data *drv_data) | |||
313 | static void u8_reader(struct driver_data *drv_data) | 318 | static void u8_reader(struct driver_data *drv_data) |
314 | { | 319 | { |
315 | dev_dbg(&drv_data->pdev->dev, | 320 | dev_dbg(&drv_data->pdev->dev, |
316 | "cr-8 is 0x%x\n", read_STAT()); | 321 | "cr-8 is 0x%x\n", read_STAT(drv_data)); |
317 | 322 | ||
318 | /* poll for SPI completion before start */ | 323 | /* poll for SPI completion before start */ |
319 | while (!(read_STAT() & BIT_STAT_SPIF)) | 324 | while (!(read_STAT(drv_data) & BIT_STAT_SPIF)) |
320 | continue; | 325 | continue; |
321 | 326 | ||
322 | /* clear TDBR buffer before read(else it will be shifted out) */ | 327 | /* clear TDBR buffer before read(else it will be shifted out) */ |
323 | write_TDBR(0xFFFF); | 328 | write_TDBR(drv_data, 0xFFFF); |
324 | 329 | ||
325 | dummy_read(); | 330 | dummy_read(drv_data); |
326 | 331 | ||
327 | while (drv_data->rx < drv_data->rx_end - 1) { | 332 | while (drv_data->rx < drv_data->rx_end - 1) { |
328 | while (!(read_STAT() & BIT_STAT_RXS)) | 333 | while (!(read_STAT(drv_data) & BIT_STAT_RXS)) |
329 | continue; | 334 | continue; |
330 | *(u8 *) (drv_data->rx) = read_RDBR(); | 335 | *(u8 *) (drv_data->rx) = read_RDBR(drv_data); |
331 | ++drv_data->rx; | 336 | ++drv_data->rx; |
332 | } | 337 | } |
333 | 338 | ||
334 | while (!(read_STAT() & BIT_STAT_RXS)) | 339 | while (!(read_STAT(drv_data) & BIT_STAT_RXS)) |
335 | continue; | 340 | continue; |
336 | *(u8 *) (drv_data->rx) = read_SHAW(); | 341 | *(u8 *) (drv_data->rx) = read_SHAW(drv_data); |
337 | ++drv_data->rx; | 342 | ++drv_data->rx; |
338 | } | 343 | } |
339 | 344 | ||
@@ -342,49 +347,49 @@ static void u8_cs_chg_reader(struct driver_data *drv_data) | |||
342 | struct chip_data *chip = drv_data->cur_chip; | 347 | struct chip_data *chip = drv_data->cur_chip; |
343 | 348 | ||
344 | /* poll for SPI completion before start */ | 349 | /* poll for SPI completion before start */ |
345 | while (!(read_STAT() & BIT_STAT_SPIF)) | 350 | while (!(read_STAT(drv_data) & BIT_STAT_SPIF)) |
346 | continue; | 351 | continue; |
347 | 352 | ||
348 | /* clear TDBR buffer before read(else it will be shifted out) */ | 353 | /* clear TDBR buffer before read(else it will be shifted out) */ |
349 | write_TDBR(0xFFFF); | 354 | write_TDBR(drv_data, 0xFFFF); |
350 | 355 | ||
351 | cs_active(chip); | 356 | cs_active(drv_data, chip); |
352 | dummy_read(); | 357 | dummy_read(drv_data); |
353 | 358 | ||
354 | while (drv_data->rx < drv_data->rx_end - 1) { | 359 | while (drv_data->rx < drv_data->rx_end - 1) { |
355 | cs_deactive(chip); | 360 | cs_deactive(drv_data, chip); |
356 | 361 | ||
357 | if (chip->cs_chg_udelay) | 362 | if (chip->cs_chg_udelay) |
358 | udelay(chip->cs_chg_udelay); | 363 | udelay(chip->cs_chg_udelay); |
359 | 364 | ||
360 | while (!(read_STAT() & BIT_STAT_RXS)) | 365 | while (!(read_STAT(drv_data) & BIT_STAT_RXS)) |
361 | continue; | 366 | continue; |
362 | cs_active(chip); | 367 | cs_active(drv_data, chip); |
363 | *(u8 *) (drv_data->rx) = read_RDBR(); | 368 | *(u8 *) (drv_data->rx) = read_RDBR(drv_data); |
364 | ++drv_data->rx; | 369 | ++drv_data->rx; |
365 | } | 370 | } |
366 | cs_deactive(chip); | 371 | cs_deactive(drv_data, chip); |
367 | 372 | ||
368 | while (!(read_STAT() & BIT_STAT_RXS)) | 373 | while (!(read_STAT(drv_data) & BIT_STAT_RXS)) |
369 | continue; | 374 | continue; |
370 | *(u8 *) (drv_data->rx) = read_SHAW(); | 375 | *(u8 *) (drv_data->rx) = read_SHAW(drv_data); |
371 | ++drv_data->rx; | 376 | ++drv_data->rx; |
372 | } | 377 | } |
373 | 378 | ||
374 | static void u8_duplex(struct driver_data *drv_data) | 379 | static void u8_duplex(struct driver_data *drv_data) |
375 | { | 380 | { |
376 | /* poll for SPI completion before start */ | 381 | /* poll for SPI completion before start */ |
377 | while (!(read_STAT() & BIT_STAT_SPIF)) | 382 | while (!(read_STAT(drv_data) & BIT_STAT_SPIF)) |
378 | continue; | 383 | continue; |
379 | 384 | ||
380 | /* in duplex mode, clk is triggered by writing of TDBR */ | 385 | /* in duplex mode, clk is triggered by writing of TDBR */ |
381 | while (drv_data->rx < drv_data->rx_end) { | 386 | while (drv_data->rx < drv_data->rx_end) { |
382 | write_TDBR(*(u8 *) (drv_data->tx)); | 387 | write_TDBR(drv_data, (*(u8 *) (drv_data->tx))); |
383 | while (read_STAT() & BIT_STAT_TXS) | 388 | while (read_STAT(drv_data) & BIT_STAT_TXS) |
384 | continue; | 389 | continue; |
385 | while (!(read_STAT() & BIT_STAT_RXS)) | 390 | while (!(read_STAT(drv_data) & BIT_STAT_RXS)) |
386 | continue; | 391 | continue; |
387 | *(u8 *) (drv_data->rx) = read_RDBR(); | 392 | *(u8 *) (drv_data->rx) = read_RDBR(drv_data); |
388 | ++drv_data->rx; | 393 | ++drv_data->rx; |
389 | ++drv_data->tx; | 394 | ++drv_data->tx; |
390 | } | 395 | } |
@@ -395,19 +400,19 @@ static void u8_cs_chg_duplex(struct driver_data *drv_data) | |||
395 | struct chip_data *chip = drv_data->cur_chip; | 400 | struct chip_data *chip = drv_data->cur_chip; |
396 | 401 | ||
397 | /* poll for SPI completion before start */ | 402 | /* poll for SPI completion before start */ |
398 | while (!(read_STAT() & BIT_STAT_SPIF)) | 403 | while (!(read_STAT(drv_data) & BIT_STAT_SPIF)) |
399 | continue; | 404 | continue; |
400 | 405 | ||
401 | while (drv_data->rx < drv_data->rx_end) { | 406 | while (drv_data->rx < drv_data->rx_end) { |
402 | cs_active(chip); | 407 | cs_active(drv_data, chip); |
403 | 408 | ||
404 | write_TDBR(*(u8 *) (drv_data->tx)); | 409 | write_TDBR(drv_data, (*(u8 *) (drv_data->tx))); |
405 | while (read_STAT() & BIT_STAT_TXS) | 410 | while (read_STAT(drv_data) & BIT_STAT_TXS) |
406 | continue; | 411 | continue; |
407 | while (!(read_STAT() & BIT_STAT_RXS)) | 412 | while (!(read_STAT(drv_data) & BIT_STAT_RXS)) |
408 | continue; | 413 | continue; |
409 | *(u8 *) (drv_data->rx) = read_RDBR(); | 414 | *(u8 *) (drv_data->rx) = read_RDBR(drv_data); |
410 | cs_deactive(chip); | 415 | cs_deactive(drv_data, chip); |
411 | 416 | ||
412 | if (chip->cs_chg_udelay) | 417 | if (chip->cs_chg_udelay) |
413 | udelay(chip->cs_chg_udelay); | 418 | udelay(chip->cs_chg_udelay); |
@@ -419,15 +424,15 @@ static void u8_cs_chg_duplex(struct driver_data *drv_data) | |||
419 | static void u16_writer(struct driver_data *drv_data) | 424 | static void u16_writer(struct driver_data *drv_data) |
420 | { | 425 | { |
421 | dev_dbg(&drv_data->pdev->dev, | 426 | dev_dbg(&drv_data->pdev->dev, |
422 | "cr16 is 0x%x\n", read_STAT()); | 427 | "cr16 is 0x%x\n", read_STAT(drv_data)); |
423 | 428 | ||
424 | /* poll for SPI completion before start */ | 429 | /* poll for SPI completion before start */ |
425 | while (!(read_STAT() & BIT_STAT_SPIF)) | 430 | while (!(read_STAT(drv_data) & BIT_STAT_SPIF)) |
426 | continue; | 431 | continue; |
427 | 432 | ||
428 | while (drv_data->tx < drv_data->tx_end) { | 433 | while (drv_data->tx < drv_data->tx_end) { |
429 | write_TDBR(*(u16 *) (drv_data->tx)); | 434 | write_TDBR(drv_data, (*(u16 *) (drv_data->tx))); |
430 | while ((read_STAT() & BIT_STAT_TXS)) | 435 | while ((read_STAT(drv_data) & BIT_STAT_TXS)) |
431 | continue; | 436 | continue; |
432 | drv_data->tx += 2; | 437 | drv_data->tx += 2; |
433 | } | 438 | } |
@@ -438,16 +443,16 @@ static void u16_cs_chg_writer(struct driver_data *drv_data) | |||
438 | struct chip_data *chip = drv_data->cur_chip; | 443 | struct chip_data *chip = drv_data->cur_chip; |
439 | 444 | ||
440 | /* poll for SPI completion before start */ | 445 | /* poll for SPI completion before start */ |
441 | while (!(read_STAT() & BIT_STAT_SPIF)) | 446 | while (!(read_STAT(drv_data) & BIT_STAT_SPIF)) |
442 | continue; | 447 | continue; |
443 | 448 | ||
444 | while (drv_data->tx < drv_data->tx_end) { | 449 | while (drv_data->tx < drv_data->tx_end) { |
445 | cs_active(chip); | 450 | cs_active(drv_data, chip); |
446 | 451 | ||
447 | write_TDBR(*(u16 *) (drv_data->tx)); | 452 | write_TDBR(drv_data, (*(u16 *) (drv_data->tx))); |
448 | while ((read_STAT() & BIT_STAT_TXS)) | 453 | while ((read_STAT(drv_data) & BIT_STAT_TXS)) |
449 | continue; | 454 | continue; |
450 | cs_deactive(chip); | 455 | cs_deactive(drv_data, chip); |
451 | 456 | ||
452 | if (chip->cs_chg_udelay) | 457 | if (chip->cs_chg_udelay) |
453 | udelay(chip->cs_chg_udelay); | 458 | udelay(chip->cs_chg_udelay); |
@@ -458,27 +463,27 @@ static void u16_cs_chg_writer(struct driver_data *drv_data) | |||
458 | static void u16_reader(struct driver_data *drv_data) | 463 | static void u16_reader(struct driver_data *drv_data) |
459 | { | 464 | { |
460 | dev_dbg(&drv_data->pdev->dev, | 465 | dev_dbg(&drv_data->pdev->dev, |
461 | "cr-16 is 0x%x\n", read_STAT()); | 466 | "cr-16 is 0x%x\n", read_STAT(drv_data)); |
462 | 467 | ||
463 | /* poll for SPI completion before start */ | 468 | /* poll for SPI completion before start */ |
464 | while (!(read_STAT() & BIT_STAT_SPIF)) | 469 | while (!(read_STAT(drv_data) & BIT_STAT_SPIF)) |
465 | continue; | 470 | continue; |
466 | 471 | ||
467 | /* clear TDBR buffer before read(else it will be shifted out) */ | 472 | /* clear TDBR buffer before read(else it will be shifted out) */ |
468 | write_TDBR(0xFFFF); | 473 | write_TDBR(drv_data, 0xFFFF); |
469 | 474 | ||
470 | dummy_read(); | 475 | dummy_read(drv_data); |
471 | 476 | ||
472 | while (drv_data->rx < (drv_data->rx_end - 2)) { | 477 | while (drv_data->rx < (drv_data->rx_end - 2)) { |
473 | while (!(read_STAT() & BIT_STAT_RXS)) | 478 | while (!(read_STAT(drv_data) & BIT_STAT_RXS)) |
474 | continue; | 479 | continue; |
475 | *(u16 *) (drv_data->rx) = read_RDBR(); | 480 | *(u16 *) (drv_data->rx) = read_RDBR(drv_data); |
476 | drv_data->rx += 2; | 481 | drv_data->rx += 2; |
477 | } | 482 | } |
478 | 483 | ||
479 | while (!(read_STAT() & BIT_STAT_RXS)) | 484 | while (!(read_STAT(drv_data) & BIT_STAT_RXS)) |
480 | continue; | 485 | continue; |
481 | *(u16 *) (drv_data->rx) = read_SHAW(); | 486 | *(u16 *) (drv_data->rx) = read_SHAW(drv_data); |
482 | drv_data->rx += 2; | 487 | drv_data->rx += 2; |
483 | } | 488 | } |
484 | 489 | ||
@@ -487,49 +492,49 @@ static void u16_cs_chg_reader(struct driver_data *drv_data) | |||
487 | struct chip_data *chip = drv_data->cur_chip; | 492 | struct chip_data *chip = drv_data->cur_chip; |
488 | 493 | ||
489 | /* poll for SPI completion before start */ | 494 | /* poll for SPI completion before start */ |
490 | while (!(read_STAT() & BIT_STAT_SPIF)) | 495 | while (!(read_STAT(drv_data) & BIT_STAT_SPIF)) |
491 | continue; | 496 | continue; |
492 | 497 | ||
493 | /* clear TDBR buffer before read(else it will be shifted out) */ | 498 | /* clear TDBR buffer before read(else it will be shifted out) */ |
494 | write_TDBR(0xFFFF); | 499 | write_TDBR(drv_data, 0xFFFF); |
495 | 500 | ||
496 | cs_active(chip); | 501 | cs_active(drv_data, chip); |
497 | dummy_read(); | 502 | dummy_read(drv_data); |
498 | 503 | ||
499 | while (drv_data->rx < drv_data->rx_end) { | 504 | while (drv_data->rx < drv_data->rx_end) { |
500 | cs_deactive(chip); | 505 | cs_deactive(drv_data, chip); |
501 | 506 | ||
502 | if (chip->cs_chg_udelay) | 507 | if (chip->cs_chg_udelay) |
503 | udelay(chip->cs_chg_udelay); | 508 | udelay(chip->cs_chg_udelay); |
504 | 509 | ||
505 | while (!(read_STAT() & BIT_STAT_RXS)) | 510 | while (!(read_STAT(drv_data) & BIT_STAT_RXS)) |
506 | continue; | 511 | continue; |
507 | cs_active(chip); | 512 | cs_active(drv_data, chip); |
508 | *(u16 *) (drv_data->rx) = read_RDBR(); | 513 | *(u16 *) (drv_data->rx) = read_RDBR(drv_data); |
509 | drv_data->rx += 2; | 514 | drv_data->rx += 2; |
510 | } | 515 | } |
511 | cs_deactive(chip); | 516 | cs_deactive(drv_data, chip); |
512 | 517 | ||
513 | while (!(read_STAT() & BIT_STAT_RXS)) | 518 | while (!(read_STAT(drv_data) & BIT_STAT_RXS)) |
514 | continue; | 519 | continue; |
515 | *(u16 *) (drv_data->rx) = read_SHAW(); | 520 | *(u16 *) (drv_data->rx) = read_SHAW(drv_data); |
516 | drv_data->rx += 2; | 521 | drv_data->rx += 2; |
517 | } | 522 | } |
518 | 523 | ||
519 | static void u16_duplex(struct driver_data *drv_data) | 524 | static void u16_duplex(struct driver_data *drv_data) |
520 | { | 525 | { |
521 | /* poll for SPI completion before start */ | 526 | /* poll for SPI completion before start */ |
522 | while (!(read_STAT() & BIT_STAT_SPIF)) | 527 | while (!(read_STAT(drv_data) & BIT_STAT_SPIF)) |
523 | continue; | 528 | continue; |
524 | 529 | ||
525 | /* in duplex mode, clk is triggered by writing of TDBR */ | 530 | /* in duplex mode, clk is triggered by writing of TDBR */ |
526 | while (drv_data->tx < drv_data->tx_end) { | 531 | while (drv_data->tx < drv_data->tx_end) { |
527 | write_TDBR(*(u16 *) (drv_data->tx)); | 532 | write_TDBR(drv_data, (*(u16 *) (drv_data->tx))); |
528 | while (read_STAT() & BIT_STAT_TXS) | 533 | while (read_STAT(drv_data) & BIT_STAT_TXS) |
529 | continue; | 534 | continue; |
530 | while (!(read_STAT() & BIT_STAT_RXS)) | 535 | while (!(read_STAT(drv_data) & BIT_STAT_RXS)) |
531 | continue; | 536 | continue; |
532 | *(u16 *) (drv_data->rx) = read_RDBR(); | 537 | *(u16 *) (drv_data->rx) = read_RDBR(drv_data); |
533 | drv_data->rx += 2; | 538 | drv_data->rx += 2; |
534 | drv_data->tx += 2; | 539 | drv_data->tx += 2; |
535 | } | 540 | } |
@@ -540,19 +545,19 @@ static void u16_cs_chg_duplex(struct driver_data *drv_data) | |||
540 | struct chip_data *chip = drv_data->cur_chip; | 545 | struct chip_data *chip = drv_data->cur_chip; |
541 | 546 | ||
542 | /* poll for SPI completion before start */ | 547 | /* poll for SPI completion before start */ |
543 | while (!(read_STAT() & BIT_STAT_SPIF)) | 548 | while (!(read_STAT(drv_data) & BIT_STAT_SPIF)) |
544 | continue; | 549 | continue; |
545 | 550 | ||
546 | while (drv_data->tx < drv_data->tx_end) { | 551 | while (drv_data->tx < drv_data->tx_end) { |
547 | cs_active(chip); | 552 | cs_active(drv_data, chip); |
548 | 553 | ||
549 | write_TDBR(*(u16 *) (drv_data->tx)); | 554 | write_TDBR(drv_data, (*(u16 *) (drv_data->tx))); |
550 | while (read_STAT() & BIT_STAT_TXS) | 555 | while (read_STAT(drv_data) & BIT_STAT_TXS) |
551 | continue; | 556 | continue; |
552 | while (!(read_STAT() & BIT_STAT_RXS)) | 557 | while (!(read_STAT(drv_data) & BIT_STAT_RXS)) |
553 | continue; | 558 | continue; |
554 | *(u16 *) (drv_data->rx) = read_RDBR(); | 559 | *(u16 *) (drv_data->rx) = read_RDBR(drv_data); |
555 | cs_deactive(chip); | 560 | cs_deactive(drv_data, chip); |
556 | 561 | ||
557 | if (chip->cs_chg_udelay) | 562 | if (chip->cs_chg_udelay) |
558 | udelay(chip->cs_chg_udelay); | 563 | udelay(chip->cs_chg_udelay); |
@@ -603,12 +608,12 @@ static void giveback(struct driver_data *drv_data) | |||
603 | 608 | ||
604 | /* disable chip select signal. And not stop spi in autobuffer mode */ | 609 | /* disable chip select signal. And not stop spi in autobuffer mode */ |
605 | if (drv_data->tx_dma != 0xFFFF) { | 610 | if (drv_data->tx_dma != 0xFFFF) { |
606 | cs_deactive(chip); | 611 | cs_deactive(drv_data, chip); |
607 | bfin_spi_disable(drv_data); | 612 | bfin_spi_disable(drv_data); |
608 | } | 613 | } |
609 | 614 | ||
610 | if (!drv_data->cs_change) | 615 | if (!drv_data->cs_change) |
611 | cs_deactive(chip); | 616 | cs_deactive(drv_data, chip); |
612 | 617 | ||
613 | if (msg->complete) | 618 | if (msg->complete) |
614 | msg->complete(msg->context); | 619 | msg->complete(msg->context); |
@@ -617,14 +622,14 @@ static void giveback(struct driver_data *drv_data) | |||
617 | static irqreturn_t dma_irq_handler(int irq, void *dev_id) | 622 | static irqreturn_t dma_irq_handler(int irq, void *dev_id) |
618 | { | 623 | { |
619 | struct driver_data *drv_data = (struct driver_data *)dev_id; | 624 | struct driver_data *drv_data = (struct driver_data *)dev_id; |
620 | struct spi_message *msg = drv_data->cur_msg; | ||
621 | struct chip_data *chip = drv_data->cur_chip; | 625 | struct chip_data *chip = drv_data->cur_chip; |
626 | struct spi_message *msg = drv_data->cur_msg; | ||
622 | 627 | ||
623 | dev_dbg(&drv_data->pdev->dev, "in dma_irq_handler\n"); | 628 | dev_dbg(&drv_data->pdev->dev, "in dma_irq_handler\n"); |
624 | clear_dma_irqstat(spi_dma_ch); | 629 | clear_dma_irqstat(drv_data->dma_channel); |
625 | 630 | ||
626 | /* Wait for DMA to complete */ | 631 | /* Wait for DMA to complete */ |
627 | while (get_dma_curr_irqstat(spi_dma_ch) & DMA_RUN) | 632 | while (get_dma_curr_irqstat(drv_data->dma_channel) & DMA_RUN) |
628 | continue; | 633 | continue; |
629 | 634 | ||
630 | /* | 635 | /* |
@@ -634,18 +639,18 @@ static irqreturn_t dma_irq_handler(int irq, void *dev_id) | |||
634 | * register until it goes low for 2 successive reads | 639 | * register until it goes low for 2 successive reads |
635 | */ | 640 | */ |
636 | if (drv_data->tx != NULL) { | 641 | if (drv_data->tx != NULL) { |
637 | while ((read_STAT() & TXS) || | 642 | while ((read_STAT(drv_data) & TXS) || |
638 | (read_STAT() & TXS)) | 643 | (read_STAT(drv_data) & TXS)) |
639 | continue; | 644 | continue; |
640 | } | 645 | } |
641 | 646 | ||
642 | while (!(read_STAT() & SPIF)) | 647 | while (!(read_STAT(drv_data) & SPIF)) |
643 | continue; | 648 | continue; |
644 | 649 | ||
645 | msg->actual_length += drv_data->len_in_bytes; | 650 | msg->actual_length += drv_data->len_in_bytes; |
646 | 651 | ||
647 | if (drv_data->cs_change) | 652 | if (drv_data->cs_change) |
648 | cs_deactive(chip); | 653 | cs_deactive(drv_data, chip); |
649 | 654 | ||
650 | /* Move to next transfer */ | 655 | /* Move to next transfer */ |
651 | msg->state = next_transfer(drv_data); | 656 | msg->state = next_transfer(drv_data); |
@@ -656,8 +661,8 @@ static irqreturn_t dma_irq_handler(int irq, void *dev_id) | |||
656 | /* free the irq handler before next transfer */ | 661 | /* free the irq handler before next transfer */ |
657 | dev_dbg(&drv_data->pdev->dev, | 662 | dev_dbg(&drv_data->pdev->dev, |
658 | "disable dma channel irq%d\n", | 663 | "disable dma channel irq%d\n", |
659 | spi_dma_ch); | 664 | drv_data->dma_channel); |
660 | dma_disable_irq(spi_dma_ch); | 665 | dma_disable_irq(drv_data->dma_channel); |
661 | 666 | ||
662 | return IRQ_HANDLED; | 667 | return IRQ_HANDLED; |
663 | } | 668 | } |
@@ -751,9 +756,9 @@ static void pump_transfers(unsigned long data) | |||
751 | message->state = RUNNING_STATE; | 756 | message->state = RUNNING_STATE; |
752 | dma_config = 0; | 757 | dma_config = 0; |
753 | 758 | ||
754 | write_STAT(BIT_STAT_CLR); | 759 | write_STAT(drv_data, BIT_STAT_CLR); |
755 | cr = (read_CTRL() & (~BIT_CTL_TIMOD)); | 760 | cr = (read_CTRL(drv_data) & (~BIT_CTL_TIMOD)); |
756 | cs_active(chip); | 761 | cs_active(drv_data, chip); |
757 | 762 | ||
758 | dev_dbg(&drv_data->pdev->dev, | 763 | dev_dbg(&drv_data->pdev->dev, |
759 | "now pumping a transfer: width is %d, len is %d\n", | 764 | "now pumping a transfer: width is %d, len is %d\n", |
@@ -766,23 +771,23 @@ static void pump_transfers(unsigned long data) | |||
766 | */ | 771 | */ |
767 | if (drv_data->cur_chip->enable_dma && drv_data->len > 6) { | 772 | if (drv_data->cur_chip->enable_dma && drv_data->len > 6) { |
768 | 773 | ||
769 | disable_dma(spi_dma_ch); | 774 | disable_dma(drv_data->dma_channel); |
770 | clear_dma_irqstat(spi_dma_ch); | 775 | clear_dma_irqstat(drv_data->dma_channel); |
771 | 776 | ||
772 | /* config dma channel */ | 777 | /* config dma channel */ |
773 | dev_dbg(&drv_data->pdev->dev, "doing dma transfer\n"); | 778 | dev_dbg(&drv_data->pdev->dev, "doing dma transfer\n"); |
774 | if (width == CFG_SPI_WORDSIZE16) { | 779 | if (width == CFG_SPI_WORDSIZE16) { |
775 | set_dma_x_count(spi_dma_ch, drv_data->len); | 780 | set_dma_x_count(drv_data->dma_channel, drv_data->len); |
776 | set_dma_x_modify(spi_dma_ch, 2); | 781 | set_dma_x_modify(drv_data->dma_channel, 2); |
777 | dma_width = WDSIZE_16; | 782 | dma_width = WDSIZE_16; |
778 | } else { | 783 | } else { |
779 | set_dma_x_count(spi_dma_ch, drv_data->len); | 784 | set_dma_x_count(drv_data->dma_channel, drv_data->len); |
780 | set_dma_x_modify(spi_dma_ch, 1); | 785 | set_dma_x_modify(drv_data->dma_channel, 1); |
781 | dma_width = WDSIZE_8; | 786 | dma_width = WDSIZE_8; |
782 | } | 787 | } |
783 | 788 | ||
784 | /* poll for SPI completion before start */ | 789 | /* poll for SPI completion before start */ |
785 | while (!(read_STAT() & BIT_STAT_SPIF)) | 790 | while (!(read_STAT(drv_data) & BIT_STAT_SPIF)) |
786 | continue; | 791 | continue; |
787 | 792 | ||
788 | /* dirty hack for autobuffer DMA mode */ | 793 | /* dirty hack for autobuffer DMA mode */ |
@@ -791,15 +796,15 @@ static void pump_transfers(unsigned long data) | |||
791 | "doing autobuffer DMA out.\n"); | 796 | "doing autobuffer DMA out.\n"); |
792 | 797 | ||
793 | /* set SPI transfer mode */ | 798 | /* set SPI transfer mode */ |
794 | write_CTRL(cr | CFG_SPI_DMAWRITE); | 799 | write_CTRL(drv_data, (cr | CFG_SPI_DMAWRITE)); |
795 | 800 | ||
796 | /* no irq in autobuffer mode */ | 801 | /* no irq in autobuffer mode */ |
797 | dma_config = | 802 | dma_config = |
798 | (DMAFLOW_AUTO | RESTART | dma_width | DI_EN); | 803 | (DMAFLOW_AUTO | RESTART | dma_width | DI_EN); |
799 | set_dma_config(spi_dma_ch, dma_config); | 804 | set_dma_config(drv_data->dma_channel, dma_config); |
800 | set_dma_start_addr(spi_dma_ch, | 805 | set_dma_start_addr(drv_data->dma_channel, |
801 | (unsigned long)drv_data->tx); | 806 | (unsigned long)drv_data->tx); |
802 | enable_dma(spi_dma_ch); | 807 | enable_dma(drv_data->dma_channel); |
803 | 808 | ||
804 | /* just return here, there can only be one transfer in this mode */ | 809 | /* just return here, there can only be one transfer in this mode */ |
805 | message->status = 0; | 810 | message->status = 0; |
@@ -813,34 +818,34 @@ static void pump_transfers(unsigned long data) | |||
813 | dev_dbg(&drv_data->pdev->dev, "doing DMA in.\n"); | 818 | dev_dbg(&drv_data->pdev->dev, "doing DMA in.\n"); |
814 | 819 | ||
815 | /* set SPI transfer mode */ | 820 | /* set SPI transfer mode */ |
816 | write_CTRL(cr | CFG_SPI_DMAREAD); | 821 | write_CTRL(drv_data, (cr | CFG_SPI_DMAREAD)); |
817 | 822 | ||
818 | /* clear tx reg soformer data is not shifted out */ | 823 | /* clear tx reg soformer data is not shifted out */ |
819 | write_TDBR(0xFFFF); | 824 | write_TDBR(drv_data, 0xFFFF); |
820 | 825 | ||
821 | set_dma_x_count(spi_dma_ch, drv_data->len); | 826 | set_dma_x_count(drv_data->dma_channel, drv_data->len); |
822 | 827 | ||
823 | /* start dma */ | 828 | /* start dma */ |
824 | dma_enable_irq(spi_dma_ch); | 829 | dma_enable_irq(drv_data->dma_channel); |
825 | dma_config = (WNR | RESTART | dma_width | DI_EN); | 830 | dma_config = (WNR | RESTART | dma_width | DI_EN); |
826 | set_dma_config(spi_dma_ch, dma_config); | 831 | set_dma_config(drv_data->dma_channel, dma_config); |
827 | set_dma_start_addr(spi_dma_ch, | 832 | set_dma_start_addr(drv_data->dma_channel, |
828 | (unsigned long)drv_data->rx); | 833 | (unsigned long)drv_data->rx); |
829 | enable_dma(spi_dma_ch); | 834 | enable_dma(drv_data->dma_channel); |
830 | 835 | ||
831 | } else if (drv_data->tx != NULL) { | 836 | } else if (drv_data->tx != NULL) { |
832 | dev_dbg(&drv_data->pdev->dev, "doing DMA out.\n"); | 837 | dev_dbg(&drv_data->pdev->dev, "doing DMA out.\n"); |
833 | 838 | ||
834 | /* set SPI transfer mode */ | 839 | /* set SPI transfer mode */ |
835 | write_CTRL(cr | CFG_SPI_DMAWRITE); | 840 | write_CTRL(drv_data, (cr | CFG_SPI_DMAWRITE)); |
836 | 841 | ||
837 | /* start dma */ | 842 | /* start dma */ |
838 | dma_enable_irq(spi_dma_ch); | 843 | dma_enable_irq(drv_data->dma_channel); |
839 | dma_config = (RESTART | dma_width | DI_EN); | 844 | dma_config = (RESTART | dma_width | DI_EN); |
840 | set_dma_config(spi_dma_ch, dma_config); | 845 | set_dma_config(drv_data->dma_channel, dma_config); |
841 | set_dma_start_addr(spi_dma_ch, | 846 | set_dma_start_addr(drv_data->dma_channel, |
842 | (unsigned long)drv_data->tx); | 847 | (unsigned long)drv_data->tx); |
843 | enable_dma(spi_dma_ch); | 848 | enable_dma(drv_data->dma_channel); |
844 | } | 849 | } |
845 | } else { | 850 | } else { |
846 | /* IO mode write then read */ | 851 | /* IO mode write then read */ |
@@ -854,7 +859,7 @@ static void pump_transfers(unsigned long data) | |||
854 | "IO duplex: cr is 0x%x\n", cr); | 859 | "IO duplex: cr is 0x%x\n", cr); |
855 | 860 | ||
856 | /* set SPI transfer mode */ | 861 | /* set SPI transfer mode */ |
857 | write_CTRL(cr | CFG_SPI_WRITE); | 862 | write_CTRL(drv_data, (cr | CFG_SPI_WRITE)); |
858 | 863 | ||
859 | drv_data->duplex(drv_data); | 864 | drv_data->duplex(drv_data); |
860 | 865 | ||
@@ -866,7 +871,7 @@ static void pump_transfers(unsigned long data) | |||
866 | "IO write: cr is 0x%x\n", cr); | 871 | "IO write: cr is 0x%x\n", cr); |
867 | 872 | ||
868 | /* set SPI transfer mode */ | 873 | /* set SPI transfer mode */ |
869 | write_CTRL(cr | CFG_SPI_WRITE); | 874 | write_CTRL(drv_data, (cr | CFG_SPI_WRITE)); |
870 | 875 | ||
871 | drv_data->write(drv_data); | 876 | drv_data->write(drv_data); |
872 | 877 | ||
@@ -878,7 +883,7 @@ static void pump_transfers(unsigned long data) | |||
878 | "IO read: cr is 0x%x\n", cr); | 883 | "IO read: cr is 0x%x\n", cr); |
879 | 884 | ||
880 | /* set SPI transfer mode */ | 885 | /* set SPI transfer mode */ |
881 | write_CTRL(cr | CFG_SPI_READ); | 886 | write_CTRL(drv_data, (cr | CFG_SPI_READ)); |
882 | 887 | ||
883 | drv_data->read(drv_data); | 888 | drv_data->read(drv_data); |
884 | if (drv_data->rx != drv_data->rx_end) | 889 | if (drv_data->rx != drv_data->rx_end) |
@@ -1075,20 +1080,20 @@ static int setup(struct spi_device *spi) | |||
1075 | * if any one SPI chip is registered and wants DMA, request the | 1080 | * if any one SPI chip is registered and wants DMA, request the |
1076 | * DMA channel for it | 1081 | * DMA channel for it |
1077 | */ | 1082 | */ |
1078 | if (chip->enable_dma && !dma_requested) { | 1083 | if (chip->enable_dma && !drv_data->dma_requested) { |
1079 | /* register dma irq handler */ | 1084 | /* register dma irq handler */ |
1080 | if (request_dma(spi_dma_ch, "BF53x_SPI_DMA") < 0) { | 1085 | if (request_dma(drv_data->dma_channel, "BF53x_SPI_DMA") < 0) { |
1081 | dev_dbg(&spi->dev, | 1086 | dev_dbg(&spi->dev, |
1082 | "Unable to request BlackFin SPI DMA channel\n"); | 1087 | "Unable to request BlackFin SPI DMA channel\n"); |
1083 | return -ENODEV; | 1088 | return -ENODEV; |
1084 | } | 1089 | } |
1085 | if (set_dma_callback(spi_dma_ch, (void *)dma_irq_handler, | 1090 | if (set_dma_callback(drv_data->dma_channel, |
1086 | drv_data) < 0) { | 1091 | (void *)dma_irq_handler, drv_data) < 0) { |
1087 | dev_dbg(&spi->dev, "Unable to set dma callback\n"); | 1092 | dev_dbg(&spi->dev, "Unable to set dma callback\n"); |
1088 | return -EPERM; | 1093 | return -EPERM; |
1089 | } | 1094 | } |
1090 | dma_disable_irq(spi_dma_ch); | 1095 | dma_disable_irq(drv_data->dma_channel); |
1091 | dma_requested = 1; | 1096 | drv_data->dma_requested = 1; |
1092 | } | 1097 | } |
1093 | 1098 | ||
1094 | /* | 1099 | /* |
@@ -1304,15 +1309,16 @@ static int __init bfin5xx_spi_probe(struct platform_device *pdev) | |||
1304 | goto out_error_get_res; | 1309 | goto out_error_get_res; |
1305 | } | 1310 | } |
1306 | 1311 | ||
1307 | spi_regs_base = (u32) ioremap(res->start, (res->end - res->start)+1); | 1312 | drv_data->regs_base = (u32) ioremap(res->start, |
1308 | if (!spi_regs_base) { | 1313 | (res->end - res->start + 1)); |
1314 | if (!drv_data->regs_base) { | ||
1309 | dev_err(dev, "Cannot map IO\n"); | 1315 | dev_err(dev, "Cannot map IO\n"); |
1310 | status = -ENXIO; | 1316 | status = -ENXIO; |
1311 | goto out_error_ioremap; | 1317 | goto out_error_ioremap; |
1312 | } | 1318 | } |
1313 | 1319 | ||
1314 | spi_dma_ch = platform_get_irq(pdev, 0); | 1320 | drv_data->dma_channel = platform_get_irq(pdev, 0); |
1315 | if (spi_dma_ch < 0) { | 1321 | if (drv_data->dma_channel < 0) { |
1316 | dev_err(dev, "No DMA channel specified\n"); | 1322 | dev_err(dev, "No DMA channel specified\n"); |
1317 | status = -ENOENT; | 1323 | status = -ENOENT; |
1318 | goto out_error_no_dma_ch; | 1324 | goto out_error_no_dma_ch; |
@@ -1344,14 +1350,15 @@ static int __init bfin5xx_spi_probe(struct platform_device *pdev) | |||
1344 | goto out_error; | 1350 | goto out_error; |
1345 | } | 1351 | } |
1346 | 1352 | ||
1347 | dev_info(dev, "%s, Version %s, regs_base @ 0x%08x\n", | 1353 | dev_info(dev, "%s, Version %s, regs_base@0x%08x, dma channel@%d\n", |
1348 | DRV_DESC, DRV_VERSION, spi_regs_base); | 1354 | DRV_DESC, DRV_VERSION, drv_data->regs_base, |
1355 | drv_data->dma_channel); | ||
1349 | return status; | 1356 | return status; |
1350 | 1357 | ||
1351 | out_error_queue_alloc: | 1358 | out_error_queue_alloc: |
1352 | destroy_queue(drv_data); | 1359 | destroy_queue(drv_data); |
1353 | out_error_no_dma_ch: | 1360 | out_error_no_dma_ch: |
1354 | iounmap((void *) spi_regs_base); | 1361 | iounmap((void *) drv_data->regs_base); |
1355 | out_error_ioremap: | 1362 | out_error_ioremap: |
1356 | out_error_get_res: | 1363 | out_error_get_res: |
1357 | out_error: | 1364 | out_error: |
@@ -1379,8 +1386,8 @@ static int __devexit bfin5xx_spi_remove(struct platform_device *pdev) | |||
1379 | 1386 | ||
1380 | /* Release DMA */ | 1387 | /* Release DMA */ |
1381 | if (drv_data->master_info->enable_dma) { | 1388 | if (drv_data->master_info->enable_dma) { |
1382 | if (dma_channel_active(spi_dma_ch)) | 1389 | if (dma_channel_active(drv_data->dma_channel)) |
1383 | free_dma(spi_dma_ch); | 1390 | free_dma(drv_data->dma_channel); |
1384 | } | 1391 | } |
1385 | 1392 | ||
1386 | /* Disconnect from the SPI framework */ | 1393 | /* Disconnect from the SPI framework */ |