| Date: | 2010-06-21 00:15:11 (13 years 6 months ago) |
|---|---|
| Author: | Lars C. |
| Commit: | 002674ccdad60fb35481ea239df701449d236597 |
| Message: | use sg_mapping_iter to iterate over sg elements. |
| Files: |
drivers/mmc/host/jz4740_mmc.c (3 diffs) |
Change Details
| drivers/mmc/host/jz4740_mmc.c | ||
|---|---|---|
| 218 | 218 | static void jz4740_mmc_write_data(struct jz4740_mmc_host *host, |
| 219 | 219 | struct mmc_data *data) |
| 220 | 220 | { |
| 221 | struct scatterlist *sg; | |
| 222 | uint32_t *sg_pointer; | |
| 221 | struct sg_mapping_iter miter; | |
| 222 | uint32_t *buf; | |
| 223 | 223 | int status; |
| 224 | 224 | unsigned int timeout; |
| 225 | 225 | size_t i, j; |
| 226 | 226 | |
| 227 | for (sg = data->sg; sg; sg = sg_next(sg)) { | |
| 228 | sg_pointer = sg_virt(sg); | |
| 229 | i = sg->length / 4; | |
| 227 | sg_miter_start(&miter, data->sg, data->sg_len, SG_MITER_FROM_SG); | |
| 228 | while (sg_miter_next(&miter)) { | |
| 229 | buf = miter.addr; | |
| 230 | i = miter.length / 4; | |
| 230 | 231 | j = i >> 3; |
| 231 | 232 | i = i & 0x7; |
| 232 | 233 | while (j) { |
| 233 | 234 | timeout = jz4740_mmc_wait_irq(host, JZ_MMC_IRQ_TXFIFO_WR_REQ); |
| 234 | if (unlikely(timeout == 0)) | |
| 235 | if (unlikely(timeout == 0)) { | |
| 236 | sg_miter_stop(&miter); | |
| 235 | 237 | goto err_timeout; |
| 238 | } | |
| 236 | 239 | |
| 237 | writel(sg_pointer[0], host->base + JZ_REG_MMC_TXFIFO); | |
| 238 | writel(sg_pointer[1], host->base + JZ_REG_MMC_TXFIFO); | |
| 239 | writel(sg_pointer[2], host->base + JZ_REG_MMC_TXFIFO); | |
| 240 | writel(sg_pointer[3], host->base + JZ_REG_MMC_TXFIFO); | |
| 241 | writel(sg_pointer[4], host->base + JZ_REG_MMC_TXFIFO); | |
| 242 | writel(sg_pointer[5], host->base + JZ_REG_MMC_TXFIFO); | |
| 243 | writel(sg_pointer[6], host->base + JZ_REG_MMC_TXFIFO); | |
| 244 | writel(sg_pointer[7], host->base + JZ_REG_MMC_TXFIFO); | |
| 245 | sg_pointer += 8; | |
| 240 | writel(buf[0], host->base + JZ_REG_MMC_TXFIFO); | |
| 241 | writel(buf[1], host->base + JZ_REG_MMC_TXFIFO); | |
| 242 | writel(buf[2], host->base + JZ_REG_MMC_TXFIFO); | |
| 243 | writel(buf[3], host->base + JZ_REG_MMC_TXFIFO); | |
| 244 | writel(buf[4], host->base + JZ_REG_MMC_TXFIFO); | |
| 245 | writel(buf[5], host->base + JZ_REG_MMC_TXFIFO); | |
| 246 | writel(buf[6], host->base + JZ_REG_MMC_TXFIFO); | |
| 247 | writel(buf[7], host->base + JZ_REG_MMC_TXFIFO); | |
| 248 | buf += 8; | |
| 246 | 249 | --j; |
| 247 | 250 | } |
| 248 | if (i) { | |
| 251 | if (unlikely(i)) { | |
| 249 | 252 | timeout = jz4740_mmc_wait_irq(host, JZ_MMC_IRQ_TXFIFO_WR_REQ); |
| 250 | if (unlikely(timeout == 0)) | |
| 253 | if (unlikely(timeout == 0)) { | |
| 254 | sg_miter_stop(&miter); | |
| 251 | 255 | goto err_timeout; |
| 256 | } | |
| 252 | 257 | |
| 253 | 258 | while (i) { |
| 254 | writel(*sg_pointer, host->base + JZ_REG_MMC_TXFIFO); | |
| 255 | ++sg_pointer; | |
| 259 | writel(*buf, host->base + JZ_REG_MMC_TXFIFO); | |
| 260 | ++buf; | |
| 256 | 261 | --i; |
| 257 | 262 | } |
| 258 | 263 | } |
| 259 | data->bytes_xfered += sg->length; | |
| 264 | data->bytes_xfered += miter.length; | |
| 260 | 265 | } |
| 266 | sg_miter_stop(&miter); | |
| 261 | 267 | |
| 262 | 268 | status = readl(host->base + JZ_REG_MMC_STATUS); |
| 263 | 269 | if (status & JZ_MMC_STATUS_WRITE_ERROR_MASK) |
| ... | ... | |
| 287 | 293 | } |
| 288 | 294 | } |
| 289 | 295 | |
| 290 | static void jz4740_mmc_timeout(unsigned long data) | |
| 291 | { | |
| 292 | struct jz4740_mmc_host *host = (struct jz4740_mmc_host *)data; | |
| 293 | unsigned long flags; | |
| 294 | ||
| 295 | spin_lock_irqsave(&host->lock, flags); | |
| 296 | if (!host->waiting) { | |
| 297 | spin_unlock_irqrestore(&host->lock, flags); | |
| 298 | return; | |
| 299 | } | |
| 300 | ||
| 301 | host->waiting = 0; | |
| 302 | ||
| 303 | spin_unlock_irqrestore(&host->lock, flags); | |
| 304 | ||
| 305 | host->req->cmd->error = -ETIMEDOUT; | |
| 306 | jz4740_mmc_request_done(host); | |
| 307 | } | |
| 308 | ||
| 309 | 296 | static void jz4740_mmc_read_data(struct jz4740_mmc_host *host, |
| 310 | 297 | struct mmc_data *data) |
| 311 | 298 | { |
| 312 | struct scatterlist *sg; | |
| 313 | uint32_t *sg_pointer; | |
| 299 | struct sg_mapping_iter miter; | |
| 300 | uint32_t *buf; | |
| 314 | 301 | uint32_t d; |
| 315 | 302 | uint16_t status = 0; |
| 316 | 303 | size_t i, j; |
| 317 | 304 | unsigned int timeout; |
| 318 | 305 | |
| 319 | for (sg = data->sg; sg; sg = sg_next(sg)) { | |
| 320 | sg_pointer = sg_virt(sg); | |
| 321 | i = sg->length; | |
| 306 | sg_miter_start(&miter, data->sg, data->sg_len, SG_MITER_TO_SG); | |
| 307 | while (sg_miter_next(&miter)) { | |
| 308 | buf = miter.addr; | |
| 309 | i = miter.length; | |
| 322 | 310 | j = i >> 5; |
| 323 | 311 | i = i & 0x1f; |
| 324 | 312 | while (j) { |
| 325 | 313 | timeout = jz4740_mmc_wait_irq(host, JZ_MMC_IRQ_RXFIFO_RD_REQ); |
| 326 | if (unlikely(timeout == 0)) | |
| 314 | if (unlikely(timeout == 0)) { | |
| 315 | sg_miter_stop(&miter); | |
| 327 | 316 | goto err_timeout; |
| 317 | } | |
| 328 | 318 | |
| 329 | sg_pointer[0] = readl(host->base + JZ_REG_MMC_RXFIFO); | |
| 330 | sg_pointer[1] = readl(host->base + JZ_REG_MMC_RXFIFO); | |
| 331 | sg_pointer[2] = readl(host->base + JZ_REG_MMC_RXFIFO); | |
| 332 | sg_pointer[3] = readl(host->base + JZ_REG_MMC_RXFIFO); | |
| 333 | sg_pointer[4] = readl(host->base + JZ_REG_MMC_RXFIFO); | |
| 334 | sg_pointer[5] = readl(host->base + JZ_REG_MMC_RXFIFO); | |
| 335 | sg_pointer[6] = readl(host->base + JZ_REG_MMC_RXFIFO); | |
| 336 | sg_pointer[7] = readl(host->base + JZ_REG_MMC_RXFIFO); | |
| 319 | buf[0] = readl(host->base + JZ_REG_MMC_RXFIFO); | |
| 320 | buf[1] = readl(host->base + JZ_REG_MMC_RXFIFO); | |
| 321 | buf[2] = readl(host->base + JZ_REG_MMC_RXFIFO); | |
| 322 | buf[3] = readl(host->base + JZ_REG_MMC_RXFIFO); | |
| 323 | buf[4] = readl(host->base + JZ_REG_MMC_RXFIFO); | |
| 324 | buf[5] = readl(host->base + JZ_REG_MMC_RXFIFO); | |
| 325 | buf[6] = readl(host->base + JZ_REG_MMC_RXFIFO); | |
| 326 | buf[7] = readl(host->base + JZ_REG_MMC_RXFIFO); | |
| 337 | 327 | |
| 338 | sg_pointer += 8; | |
| 328 | buf += 8; | |
| 339 | 329 | --j; |
| 340 | 330 | } |
| 341 | 331 | |
| 342 | 332 | while (i >= 4) { |
| 343 | 333 | timeout = jz4740_mmc_wait_irq(host, JZ_MMC_IRQ_RXFIFO_RD_REQ); |
| 344 | if (unlikely(timeout == 0)) | |
| 334 | if (unlikely(timeout == 0)) { | |
| 335 | sg_miter_stop(&miter); | |
| 345 | 336 | goto err_timeout; |
| 337 | } | |
| 346 | 338 | |
| 347 | *sg_pointer = readl(host->base + JZ_REG_MMC_RXFIFO); | |
| 348 | ++sg_pointer; | |
| 339 | *buf++ = readl(host->base + JZ_REG_MMC_RXFIFO); | |
| 349 | 340 | i -= 4; |
| 350 | 341 | } |
| 351 | if (i > 0) { | |
| 342 | if (unlikely(i > 0)) { | |
| 352 | 343 | d = readl(host->base + JZ_REG_MMC_RXFIFO); |
| 353 | memcpy(sg_pointer, &d, i); | |
| 344 | memcpy(buf, &d, i); | |
| 354 | 345 | } |
| 355 | data->bytes_xfered += sg->length; | |
| 346 | data->bytes_xfered += miter.length; | |
| 356 | 347 | |
| 357 | flush_dcache_page(sg_page(sg)); | |
| 348 | /* This can go away once MIPS implements flush_kernel_dcache_page */ | |
| 349 | flush_dcache_page(miter.page); | |
| 358 | 350 | } |
| 351 | sg_miter_stop(&miter); | |
| 359 | 352 | |
| 360 | 353 | status = readl(host->base + JZ_REG_MMC_STATUS); |
| 361 | 354 | if (status & JZ_MMC_STATUS_READ_ERROR_MASK) |
| ... | ... | |
| 382 | 375 | } |
| 383 | 376 | } |
| 384 | 377 | |
| 378 | static void jz4740_mmc_timeout(unsigned long data) | |
| 379 | { | |
| 380 | struct jz4740_mmc_host *host = (struct jz4740_mmc_host *)data; | |
| 381 | unsigned long flags; | |
| 382 | ||
| 383 | spin_lock_irqsave(&host->lock, flags); | |
| 384 | if (!host->waiting) { | |
| 385 | spin_unlock_irqrestore(&host->lock, flags); | |
| 386 | return; | |
| 387 | } | |
| 388 | ||
| 389 | host->waiting = 0; | |
| 390 | ||
| 391 | spin_unlock_irqrestore(&host->lock, flags); | |
| 392 | ||
| 393 | host->req->cmd->error = -ETIMEDOUT; | |
| 394 | jz4740_mmc_request_done(host); | |
| 395 | } | |
| 396 | ||
| 385 | 397 | static irqreturn_t jz_mmc_irq_worker(int irq, void *devid) |
| 386 | 398 | { |
| 387 | 399 | struct jz4740_mmc_host *host = (struct jz4740_mmc_host *)devid; |
Branches:
ben-wpan
ben-wpan-stefan
5396a9238205f20f811ea57898980d3ca82df0b6
jz-2.6.34
jz-2.6.34-rc5
jz-2.6.34-rc6
jz-2.6.34-rc7
jz-2.6.35
jz-2.6.36
jz-2.6.37
jz-2.6.38
jz-2.6.39
jz-3.0
jz-3.1
jz-3.11
jz-3.12
jz-3.13
jz-3.15
jz-3.16
jz-3.18-dt
jz-3.2
jz-3.3
jz-3.4
jz-3.5
jz-3.6
jz-3.6-rc2-pwm
jz-3.9
jz-3.9-clk
jz-3.9-rc8
jz47xx
jz47xx-2.6.38
master
Tags:
od-2011-09-04
od-2011-09-18
v2.6.34-rc5
v2.6.34-rc6
v2.6.34-rc7
v3.9
