diff options
Diffstat (limited to 'drivers/spi/pxa2xx_spi.c')
-rw-r--r-- | drivers/spi/pxa2xx_spi.c | 52 |
1 files changed, 28 insertions, 24 deletions
diff --git a/drivers/spi/pxa2xx_spi.c b/drivers/spi/pxa2xx_spi.c index 147e26a78d64..654bb58be630 100644 --- a/drivers/spi/pxa2xx_spi.c +++ b/drivers/spi/pxa2xx_spi.c | |||
@@ -67,8 +67,11 @@ MODULE_ALIAS("platform:pxa2xx-spi"); | |||
67 | | SSCR1_SPH | SSCR1_SPO | SSCR1_LBM) | 67 | | SSCR1_SPH | SSCR1_SPO | SSCR1_LBM) |
68 | 68 | ||
69 | #define DEFINE_SSP_REG(reg, off) \ | 69 | #define DEFINE_SSP_REG(reg, off) \ |
70 | static inline u32 read_##reg(void *p) { return __raw_readl(p + (off)); } \ | 70 | static inline u32 read_##reg(void const __iomem *p) \ |
71 | static inline void write_##reg(u32 v, void *p) { __raw_writel(v, p + (off)); } | 71 | { return __raw_readl(p + (off)); } \ |
72 | \ | ||
73 | static inline void write_##reg(u32 v, void __iomem *p) \ | ||
74 | { __raw_writel(v, p + (off)); } | ||
72 | 75 | ||
73 | DEFINE_SSP_REG(SSCR0, 0x00) | 76 | DEFINE_SSP_REG(SSCR0, 0x00) |
74 | DEFINE_SSP_REG(SSCR1, 0x04) | 77 | DEFINE_SSP_REG(SSCR1, 0x04) |
@@ -106,7 +109,7 @@ struct driver_data { | |||
106 | u32 *null_dma_buf; | 109 | u32 *null_dma_buf; |
107 | 110 | ||
108 | /* SSP register addresses */ | 111 | /* SSP register addresses */ |
109 | void *ioaddr; | 112 | void __iomem *ioaddr; |
110 | u32 ssdr_physical; | 113 | u32 ssdr_physical; |
111 | 114 | ||
112 | /* SSP masks*/ | 115 | /* SSP masks*/ |
@@ -173,7 +176,7 @@ static int flush(struct driver_data *drv_data) | |||
173 | { | 176 | { |
174 | unsigned long limit = loops_per_jiffy << 1; | 177 | unsigned long limit = loops_per_jiffy << 1; |
175 | 178 | ||
176 | void *reg = drv_data->ioaddr; | 179 | void __iomem *reg = drv_data->ioaddr; |
177 | 180 | ||
178 | do { | 181 | do { |
179 | while (read_SSSR(reg) & SSSR_RNE) { | 182 | while (read_SSSR(reg) & SSSR_RNE) { |
@@ -191,7 +194,7 @@ static void null_cs_control(u32 command) | |||
191 | 194 | ||
192 | static int null_writer(struct driver_data *drv_data) | 195 | static int null_writer(struct driver_data *drv_data) |
193 | { | 196 | { |
194 | void *reg = drv_data->ioaddr; | 197 | void __iomem *reg = drv_data->ioaddr; |
195 | u8 n_bytes = drv_data->n_bytes; | 198 | u8 n_bytes = drv_data->n_bytes; |
196 | 199 | ||
197 | if (((read_SSSR(reg) & 0x00000f00) == 0x00000f00) | 200 | if (((read_SSSR(reg) & 0x00000f00) == 0x00000f00) |
@@ -206,7 +209,7 @@ static int null_writer(struct driver_data *drv_data) | |||
206 | 209 | ||
207 | static int null_reader(struct driver_data *drv_data) | 210 | static int null_reader(struct driver_data *drv_data) |
208 | { | 211 | { |
209 | void *reg = drv_data->ioaddr; | 212 | void __iomem *reg = drv_data->ioaddr; |
210 | u8 n_bytes = drv_data->n_bytes; | 213 | u8 n_bytes = drv_data->n_bytes; |
211 | 214 | ||
212 | while ((read_SSSR(reg) & SSSR_RNE) | 215 | while ((read_SSSR(reg) & SSSR_RNE) |
@@ -220,7 +223,7 @@ static int null_reader(struct driver_data *drv_data) | |||
220 | 223 | ||
221 | static int u8_writer(struct driver_data *drv_data) | 224 | static int u8_writer(struct driver_data *drv_data) |
222 | { | 225 | { |
223 | void *reg = drv_data->ioaddr; | 226 | void __iomem *reg = drv_data->ioaddr; |
224 | 227 | ||
225 | if (((read_SSSR(reg) & 0x00000f00) == 0x00000f00) | 228 | if (((read_SSSR(reg) & 0x00000f00) == 0x00000f00) |
226 | || (drv_data->tx == drv_data->tx_end)) | 229 | || (drv_data->tx == drv_data->tx_end)) |
@@ -234,7 +237,7 @@ static int u8_writer(struct driver_data *drv_data) | |||
234 | 237 | ||
235 | static int u8_reader(struct driver_data *drv_data) | 238 | static int u8_reader(struct driver_data *drv_data) |
236 | { | 239 | { |
237 | void *reg = drv_data->ioaddr; | 240 | void __iomem *reg = drv_data->ioaddr; |
238 | 241 | ||
239 | while ((read_SSSR(reg) & SSSR_RNE) | 242 | while ((read_SSSR(reg) & SSSR_RNE) |
240 | && (drv_data->rx < drv_data->rx_end)) { | 243 | && (drv_data->rx < drv_data->rx_end)) { |
@@ -247,7 +250,7 @@ static int u8_reader(struct driver_data *drv_data) | |||
247 | 250 | ||
248 | static int u16_writer(struct driver_data *drv_data) | 251 | static int u16_writer(struct driver_data *drv_data) |
249 | { | 252 | { |
250 | void *reg = drv_data->ioaddr; | 253 | void __iomem *reg = drv_data->ioaddr; |
251 | 254 | ||
252 | if (((read_SSSR(reg) & 0x00000f00) == 0x00000f00) | 255 | if (((read_SSSR(reg) & 0x00000f00) == 0x00000f00) |
253 | || (drv_data->tx == drv_data->tx_end)) | 256 | || (drv_data->tx == drv_data->tx_end)) |
@@ -261,7 +264,7 @@ static int u16_writer(struct driver_data *drv_data) | |||
261 | 264 | ||
262 | static int u16_reader(struct driver_data *drv_data) | 265 | static int u16_reader(struct driver_data *drv_data) |
263 | { | 266 | { |
264 | void *reg = drv_data->ioaddr; | 267 | void __iomem *reg = drv_data->ioaddr; |
265 | 268 | ||
266 | while ((read_SSSR(reg) & SSSR_RNE) | 269 | while ((read_SSSR(reg) & SSSR_RNE) |
267 | && (drv_data->rx < drv_data->rx_end)) { | 270 | && (drv_data->rx < drv_data->rx_end)) { |
@@ -274,7 +277,7 @@ static int u16_reader(struct driver_data *drv_data) | |||
274 | 277 | ||
275 | static int u32_writer(struct driver_data *drv_data) | 278 | static int u32_writer(struct driver_data *drv_data) |
276 | { | 279 | { |
277 | void *reg = drv_data->ioaddr; | 280 | void __iomem *reg = drv_data->ioaddr; |
278 | 281 | ||
279 | if (((read_SSSR(reg) & 0x00000f00) == 0x00000f00) | 282 | if (((read_SSSR(reg) & 0x00000f00) == 0x00000f00) |
280 | || (drv_data->tx == drv_data->tx_end)) | 283 | || (drv_data->tx == drv_data->tx_end)) |
@@ -288,7 +291,7 @@ static int u32_writer(struct driver_data *drv_data) | |||
288 | 291 | ||
289 | static int u32_reader(struct driver_data *drv_data) | 292 | static int u32_reader(struct driver_data *drv_data) |
290 | { | 293 | { |
291 | void *reg = drv_data->ioaddr; | 294 | void __iomem *reg = drv_data->ioaddr; |
292 | 295 | ||
293 | while ((read_SSSR(reg) & SSSR_RNE) | 296 | while ((read_SSSR(reg) & SSSR_RNE) |
294 | && (drv_data->rx < drv_data->rx_end)) { | 297 | && (drv_data->rx < drv_data->rx_end)) { |
@@ -412,7 +415,7 @@ static void giveback(struct driver_data *drv_data) | |||
412 | msg->complete(msg->context); | 415 | msg->complete(msg->context); |
413 | } | 416 | } |
414 | 417 | ||
415 | static int wait_ssp_rx_stall(void *ioaddr) | 418 | static int wait_ssp_rx_stall(void const __iomem *ioaddr) |
416 | { | 419 | { |
417 | unsigned long limit = loops_per_jiffy << 1; | 420 | unsigned long limit = loops_per_jiffy << 1; |
418 | 421 | ||
@@ -432,9 +435,9 @@ static int wait_dma_channel_stop(int channel) | |||
432 | return limit; | 435 | return limit; |
433 | } | 436 | } |
434 | 437 | ||
435 | void dma_error_stop(struct driver_data *drv_data, const char *msg) | 438 | static void dma_error_stop(struct driver_data *drv_data, const char *msg) |
436 | { | 439 | { |
437 | void *reg = drv_data->ioaddr; | 440 | void __iomem *reg = drv_data->ioaddr; |
438 | 441 | ||
439 | /* Stop and reset */ | 442 | /* Stop and reset */ |
440 | DCSR(drv_data->rx_channel) = RESET_DMA_CHANNEL; | 443 | DCSR(drv_data->rx_channel) = RESET_DMA_CHANNEL; |
@@ -456,7 +459,7 @@ void dma_error_stop(struct driver_data *drv_data, const char *msg) | |||
456 | 459 | ||
457 | static void dma_transfer_complete(struct driver_data *drv_data) | 460 | static void dma_transfer_complete(struct driver_data *drv_data) |
458 | { | 461 | { |
459 | void *reg = drv_data->ioaddr; | 462 | void __iomem *reg = drv_data->ioaddr; |
460 | struct spi_message *msg = drv_data->cur_msg; | 463 | struct spi_message *msg = drv_data->cur_msg; |
461 | 464 | ||
462 | /* Clear and disable interrupts on SSP and DMA channels*/ | 465 | /* Clear and disable interrupts on SSP and DMA channels*/ |
@@ -536,7 +539,7 @@ static void dma_handler(int channel, void *data) | |||
536 | static irqreturn_t dma_transfer(struct driver_data *drv_data) | 539 | static irqreturn_t dma_transfer(struct driver_data *drv_data) |
537 | { | 540 | { |
538 | u32 irq_status; | 541 | u32 irq_status; |
539 | void *reg = drv_data->ioaddr; | 542 | void __iomem *reg = drv_data->ioaddr; |
540 | 543 | ||
541 | irq_status = read_SSSR(reg) & drv_data->mask_sr; | 544 | irq_status = read_SSSR(reg) & drv_data->mask_sr; |
542 | if (irq_status & SSSR_ROR) { | 545 | if (irq_status & SSSR_ROR) { |
@@ -570,7 +573,7 @@ static irqreturn_t dma_transfer(struct driver_data *drv_data) | |||
570 | 573 | ||
571 | static void int_error_stop(struct driver_data *drv_data, const char* msg) | 574 | static void int_error_stop(struct driver_data *drv_data, const char* msg) |
572 | { | 575 | { |
573 | void *reg = drv_data->ioaddr; | 576 | void __iomem *reg = drv_data->ioaddr; |
574 | 577 | ||
575 | /* Stop and reset SSP */ | 578 | /* Stop and reset SSP */ |
576 | write_SSSR(drv_data->clear_sr, reg); | 579 | write_SSSR(drv_data->clear_sr, reg); |
@@ -588,7 +591,7 @@ static void int_error_stop(struct driver_data *drv_data, const char* msg) | |||
588 | 591 | ||
589 | static void int_transfer_complete(struct driver_data *drv_data) | 592 | static void int_transfer_complete(struct driver_data *drv_data) |
590 | { | 593 | { |
591 | void *reg = drv_data->ioaddr; | 594 | void __iomem *reg = drv_data->ioaddr; |
592 | 595 | ||
593 | /* Stop SSP */ | 596 | /* Stop SSP */ |
594 | write_SSSR(drv_data->clear_sr, reg); | 597 | write_SSSR(drv_data->clear_sr, reg); |
@@ -614,7 +617,7 @@ static void int_transfer_complete(struct driver_data *drv_data) | |||
614 | 617 | ||
615 | static irqreturn_t interrupt_transfer(struct driver_data *drv_data) | 618 | static irqreturn_t interrupt_transfer(struct driver_data *drv_data) |
616 | { | 619 | { |
617 | void *reg = drv_data->ioaddr; | 620 | void __iomem *reg = drv_data->ioaddr; |
618 | 621 | ||
619 | u32 irq_mask = (read_SSCR1(reg) & SSCR1_TIE) ? | 622 | u32 irq_mask = (read_SSCR1(reg) & SSCR1_TIE) ? |
620 | drv_data->mask_sr : drv_data->mask_sr & ~SSSR_TFS; | 623 | drv_data->mask_sr : drv_data->mask_sr & ~SSSR_TFS; |
@@ -675,7 +678,7 @@ static irqreturn_t interrupt_transfer(struct driver_data *drv_data) | |||
675 | static irqreturn_t ssp_int(int irq, void *dev_id) | 678 | static irqreturn_t ssp_int(int irq, void *dev_id) |
676 | { | 679 | { |
677 | struct driver_data *drv_data = dev_id; | 680 | struct driver_data *drv_data = dev_id; |
678 | void *reg = drv_data->ioaddr; | 681 | void __iomem *reg = drv_data->ioaddr; |
679 | 682 | ||
680 | if (!drv_data->cur_msg) { | 683 | if (!drv_data->cur_msg) { |
681 | 684 | ||
@@ -695,7 +698,8 @@ static irqreturn_t ssp_int(int irq, void *dev_id) | |||
695 | return drv_data->transfer_handler(drv_data); | 698 | return drv_data->transfer_handler(drv_data); |
696 | } | 699 | } |
697 | 700 | ||
698 | int set_dma_burst_and_threshold(struct chip_data *chip, struct spi_device *spi, | 701 | static int set_dma_burst_and_threshold(struct chip_data *chip, |
702 | struct spi_device *spi, | ||
699 | u8 bits_per_word, u32 *burst_code, | 703 | u8 bits_per_word, u32 *burst_code, |
700 | u32 *threshold) | 704 | u32 *threshold) |
701 | { | 705 | { |
@@ -809,7 +813,7 @@ static void pump_transfers(unsigned long data) | |||
809 | struct spi_transfer *previous = NULL; | 813 | struct spi_transfer *previous = NULL; |
810 | struct chip_data *chip = NULL; | 814 | struct chip_data *chip = NULL; |
811 | struct ssp_device *ssp = drv_data->ssp; | 815 | struct ssp_device *ssp = drv_data->ssp; |
812 | void *reg = drv_data->ioaddr; | 816 | void __iomem *reg = drv_data->ioaddr; |
813 | u32 clk_div = 0; | 817 | u32 clk_div = 0; |
814 | u8 bits = 0; | 818 | u8 bits = 0; |
815 | u32 speed = 0; | 819 | u32 speed = 0; |
@@ -1338,7 +1342,7 @@ static int __init pxa2xx_spi_probe(struct platform_device *pdev) | |||
1338 | struct device *dev = &pdev->dev; | 1342 | struct device *dev = &pdev->dev; |
1339 | struct pxa2xx_spi_master *platform_info; | 1343 | struct pxa2xx_spi_master *platform_info; |
1340 | struct spi_master *master; | 1344 | struct spi_master *master; |
1341 | struct driver_data *drv_data = 0; | 1345 | struct driver_data *drv_data = NULL; |
1342 | struct ssp_device *ssp; | 1346 | struct ssp_device *ssp; |
1343 | int status = 0; | 1347 | int status = 0; |
1344 | 1348 | ||