diff options
Diffstat (limited to 'drivers/macintosh/mediabay.c')
| -rw-r--r-- | drivers/macintosh/mediabay.c | 328 |
1 files changed, 122 insertions, 206 deletions
diff --git a/drivers/macintosh/mediabay.c b/drivers/macintosh/mediabay.c index 029ad8ce8a7e..08002b88f342 100644 --- a/drivers/macintosh/mediabay.c +++ b/drivers/macintosh/mediabay.c | |||
| @@ -33,15 +33,6 @@ | |||
| 33 | #include <linux/adb.h> | 33 | #include <linux/adb.h> |
| 34 | #include <linux/pmu.h> | 34 | #include <linux/pmu.h> |
| 35 | 35 | ||
| 36 | |||
| 37 | #define MB_DEBUG | ||
| 38 | |||
| 39 | #ifdef MB_DEBUG | ||
| 40 | #define MBDBG(fmt, arg...) printk(KERN_INFO fmt , ## arg) | ||
| 41 | #else | ||
| 42 | #define MBDBG(fmt, arg...) do { } while (0) | ||
| 43 | #endif | ||
| 44 | |||
| 45 | #define MB_FCR32(bay, r) ((bay)->base + ((r) >> 2)) | 36 | #define MB_FCR32(bay, r) ((bay)->base + ((r) >> 2)) |
| 46 | #define MB_FCR8(bay, r) (((volatile u8 __iomem *)((bay)->base)) + (r)) | 37 | #define MB_FCR8(bay, r) (((volatile u8 __iomem *)((bay)->base)) + (r)) |
| 47 | 38 | ||
| @@ -76,28 +67,14 @@ struct media_bay_info { | |||
| 76 | int index; | 67 | int index; |
| 77 | int cached_gpio; | 68 | int cached_gpio; |
| 78 | int sleeping; | 69 | int sleeping; |
| 70 | int user_lock; | ||
| 79 | struct mutex lock; | 71 | struct mutex lock; |
| 80 | #ifdef CONFIG_BLK_DEV_IDE_PMAC | ||
| 81 | ide_hwif_t *cd_port; | ||
| 82 | void __iomem *cd_base; | ||
| 83 | int cd_irq; | ||
| 84 | int cd_retry; | ||
| 85 | #endif | ||
| 86 | #if defined(CONFIG_BLK_DEV_IDE_PMAC) | ||
| 87 | int cd_index; | ||
| 88 | #endif | ||
| 89 | }; | 72 | }; |
| 90 | 73 | ||
| 91 | #define MAX_BAYS 2 | 74 | #define MAX_BAYS 2 |
| 92 | 75 | ||
| 93 | static struct media_bay_info media_bays[MAX_BAYS]; | 76 | static struct media_bay_info media_bays[MAX_BAYS]; |
| 94 | int media_bay_count = 0; | 77 | static int media_bay_count = 0; |
| 95 | |||
| 96 | #ifdef CONFIG_BLK_DEV_IDE_PMAC | ||
| 97 | /* check the busy bit in the media-bay ide interface | ||
| 98 | (assumes the media-bay contains an ide device) */ | ||
| 99 | #define MB_IDE_READY(i) ((readb(media_bays[i].cd_base + 0x70) & 0x80) == 0) | ||
| 100 | #endif | ||
| 101 | 78 | ||
| 102 | /* | 79 | /* |
| 103 | * Wait that number of ms between each step in normal polling mode | 80 | * Wait that number of ms between each step in normal polling mode |
| @@ -130,21 +107,11 @@ int media_bay_count = 0; | |||
| 130 | 107 | ||
| 131 | /* | 108 | /* |
| 132 | * Wait this many ticks after an IDE device (e.g. CD-ROM) is inserted | 109 | * Wait this many ticks after an IDE device (e.g. CD-ROM) is inserted |
| 133 | * (or until the device is ready) before waiting for busy bit to disappear | 110 | * (or until the device is ready) before calling into the driver |
| 134 | */ | 111 | */ |
| 135 | #define MB_IDE_WAIT 1000 | 112 | #define MB_IDE_WAIT 1000 |
| 136 | 113 | ||
| 137 | /* | 114 | /* |
| 138 | * Timeout waiting for busy bit of an IDE device to go down | ||
| 139 | */ | ||
| 140 | #define MB_IDE_TIMEOUT 5000 | ||
| 141 | |||
| 142 | /* | ||
| 143 | * Max retries of the full power up/down sequence for an IDE device | ||
| 144 | */ | ||
| 145 | #define MAX_CD_RETRIES 3 | ||
| 146 | |||
| 147 | /* | ||
| 148 | * States of a media bay | 115 | * States of a media bay |
| 149 | */ | 116 | */ |
| 150 | enum { | 117 | enum { |
| @@ -153,7 +120,6 @@ enum { | |||
| 153 | mb_enabling_bay, /* enable bits set, waiting MB_RESET_DELAY */ | 120 | mb_enabling_bay, /* enable bits set, waiting MB_RESET_DELAY */ |
| 154 | mb_resetting, /* reset bit unset, waiting MB_SETUP_DELAY */ | 121 | mb_resetting, /* reset bit unset, waiting MB_SETUP_DELAY */ |
| 155 | mb_ide_resetting, /* IDE reset bit unser, waiting MB_IDE_WAIT */ | 122 | mb_ide_resetting, /* IDE reset bit unser, waiting MB_IDE_WAIT */ |
| 156 | mb_ide_waiting, /* Waiting for BUSY bit to go away until MB_IDE_TIMEOUT */ | ||
| 157 | mb_up, /* Media bay full */ | 123 | mb_up, /* Media bay full */ |
| 158 | mb_powering_down /* Powering down (avoid too fast down/up) */ | 124 | mb_powering_down /* Powering down (avoid too fast down/up) */ |
| 159 | }; | 125 | }; |
| @@ -373,12 +339,12 @@ static inline void set_mb_power(struct media_bay_info* bay, int onoff) | |||
| 373 | if (onoff) { | 339 | if (onoff) { |
| 374 | bay->ops->power(bay, 1); | 340 | bay->ops->power(bay, 1); |
| 375 | bay->state = mb_powering_up; | 341 | bay->state = mb_powering_up; |
| 376 | MBDBG("mediabay%d: powering up\n", bay->index); | 342 | pr_debug("mediabay%d: powering up\n", bay->index); |
| 377 | } else { | 343 | } else { |
| 378 | /* Make sure everything is powered down & disabled */ | 344 | /* Make sure everything is powered down & disabled */ |
| 379 | bay->ops->power(bay, 0); | 345 | bay->ops->power(bay, 0); |
| 380 | bay->state = mb_powering_down; | 346 | bay->state = mb_powering_down; |
| 381 | MBDBG("mediabay%d: powering down\n", bay->index); | 347 | pr_debug("mediabay%d: powering down\n", bay->index); |
| 382 | } | 348 | } |
| 383 | bay->timer = msecs_to_jiffies(MB_POWER_DELAY); | 349 | bay->timer = msecs_to_jiffies(MB_POWER_DELAY); |
| 384 | } | 350 | } |
| @@ -387,107 +353,118 @@ static void poll_media_bay(struct media_bay_info* bay) | |||
| 387 | { | 353 | { |
| 388 | int id = bay->ops->content(bay); | 354 | int id = bay->ops->content(bay); |
| 389 | 355 | ||
| 390 | if (id == bay->last_value) { | 356 | static char *mb_content_types[] = { |
| 391 | if (id != bay->content_id) { | 357 | "a floppy drive", |
| 392 | bay->value_count += msecs_to_jiffies(MB_POLL_DELAY); | 358 | "a floppy drive", |
| 393 | if (bay->value_count >= msecs_to_jiffies(MB_STABLE_DELAY)) { | 359 | "an unsuported audio device", |
| 394 | /* If the device type changes without going thru | 360 | "an ATA device", |
| 395 | * "MB_NO", we force a pass by "MB_NO" to make sure | 361 | "an unsupported PCI device", |
| 396 | * things are properly reset | 362 | "an unknown device", |
| 397 | */ | 363 | }; |
| 398 | if ((id != MB_NO) && (bay->content_id != MB_NO)) { | 364 | |
| 399 | id = MB_NO; | 365 | if (id != bay->last_value) { |
| 400 | MBDBG("mediabay%d: forcing MB_NO\n", bay->index); | ||
| 401 | } | ||
| 402 | MBDBG("mediabay%d: switching to %d\n", bay->index, id); | ||
| 403 | set_mb_power(bay, id != MB_NO); | ||
| 404 | bay->content_id = id; | ||
| 405 | if (id == MB_NO) { | ||
| 406 | #ifdef CONFIG_BLK_DEV_IDE_PMAC | ||
| 407 | bay->cd_retry = 0; | ||
| 408 | #endif | ||
| 409 | printk(KERN_INFO "media bay %d is empty\n", bay->index); | ||
| 410 | } | ||
| 411 | } | ||
| 412 | } | ||
| 413 | } else { | ||
| 414 | bay->last_value = id; | 366 | bay->last_value = id; |
| 415 | bay->value_count = 0; | 367 | bay->value_count = 0; |
| 368 | return; | ||
| 369 | } | ||
| 370 | if (id == bay->content_id) | ||
| 371 | return; | ||
| 372 | |||
| 373 | bay->value_count += msecs_to_jiffies(MB_POLL_DELAY); | ||
| 374 | if (bay->value_count >= msecs_to_jiffies(MB_STABLE_DELAY)) { | ||
| 375 | /* If the device type changes without going thru | ||
| 376 | * "MB_NO", we force a pass by "MB_NO" to make sure | ||
| 377 | * things are properly reset | ||
| 378 | */ | ||
| 379 | if ((id != MB_NO) && (bay->content_id != MB_NO)) { | ||
| 380 | id = MB_NO; | ||
| 381 | pr_debug("mediabay%d: forcing MB_NO\n", bay->index); | ||
| 382 | } | ||
| 383 | pr_debug("mediabay%d: switching to %d\n", bay->index, id); | ||
| 384 | set_mb_power(bay, id != MB_NO); | ||
| 385 | bay->content_id = id; | ||
| 386 | if (id >= MB_NO || id < 0) | ||
| 387 | printk(KERN_INFO "mediabay%d: Bay is now empty\n", bay->index); | ||
| 388 | else | ||
| 389 | printk(KERN_INFO "mediabay%d: Bay contains %s\n", | ||
| 390 | bay->index, mb_content_types[id]); | ||
| 416 | } | 391 | } |
| 417 | } | 392 | } |
| 418 | 393 | ||
| 419 | #ifdef CONFIG_BLK_DEV_IDE_PMAC | 394 | int check_media_bay(struct macio_dev *baydev) |
| 420 | int check_media_bay(struct device_node *which_bay, int what) | ||
| 421 | { | 395 | { |
| 422 | int i; | 396 | struct media_bay_info* bay; |
| 397 | int id; | ||
| 423 | 398 | ||
| 424 | for (i=0; i<media_bay_count; i++) | 399 | if (baydev == NULL) |
| 425 | if (media_bays[i].mdev && which_bay == media_bays[i].mdev->ofdev.node) { | 400 | return MB_NO; |
| 426 | if ((what == media_bays[i].content_id) && media_bays[i].state == mb_up) | 401 | |
| 427 | return 0; | 402 | /* This returns an instant snapshot, not locking, sine |
| 428 | media_bays[i].cd_index = -1; | 403 | * we may be called with the bay lock held. The resulting |
| 429 | return -EINVAL; | 404 | * fuzzyness of the result if called at the wrong time is |
| 430 | } | 405 | * not actually a huge deal |
| 431 | return -ENODEV; | 406 | */ |
| 407 | bay = macio_get_drvdata(baydev); | ||
| 408 | if (bay == NULL) | ||
| 409 | return MB_NO; | ||
| 410 | id = bay->content_id; | ||
| 411 | if (bay->state != mb_up) | ||
| 412 | return MB_NO; | ||
| 413 | if (id == MB_FD1) | ||
| 414 | return MB_FD; | ||
| 415 | return id; | ||
| 432 | } | 416 | } |
| 433 | EXPORT_SYMBOL(check_media_bay); | 417 | EXPORT_SYMBOL_GPL(check_media_bay); |
| 434 | 418 | ||
| 435 | int check_media_bay_by_base(unsigned long base, int what) | 419 | void lock_media_bay(struct macio_dev *baydev) |
| 436 | { | 420 | { |
| 437 | int i; | 421 | struct media_bay_info* bay; |
| 438 | |||
| 439 | for (i=0; i<media_bay_count; i++) | ||
| 440 | if (media_bays[i].mdev && base == (unsigned long) media_bays[i].cd_base) { | ||
| 441 | if ((what == media_bays[i].content_id) && media_bays[i].state == mb_up) | ||
| 442 | return 0; | ||
| 443 | media_bays[i].cd_index = -1; | ||
| 444 | return -EINVAL; | ||
| 445 | } | ||
| 446 | 422 | ||
| 447 | return -ENODEV; | 423 | if (baydev == NULL) |
| 424 | return; | ||
| 425 | bay = macio_get_drvdata(baydev); | ||
| 426 | if (bay == NULL) | ||
| 427 | return; | ||
| 428 | mutex_lock(&bay->lock); | ||
| 429 | bay->user_lock = 1; | ||
| 448 | } | 430 | } |
| 449 | EXPORT_SYMBOL_GPL(check_media_bay_by_base); | 431 | EXPORT_SYMBOL_GPL(lock_media_bay); |
| 450 | 432 | ||
| 451 | int media_bay_set_ide_infos(struct device_node* which_bay, unsigned long base, | 433 | void unlock_media_bay(struct macio_dev *baydev) |
| 452 | int irq, ide_hwif_t *hwif) | ||
| 453 | { | 434 | { |
| 454 | int i; | 435 | struct media_bay_info* bay; |
| 455 | 436 | ||
| 456 | for (i=0; i<media_bay_count; i++) { | 437 | if (baydev == NULL) |
| 457 | struct media_bay_info* bay = &media_bays[i]; | 438 | return; |
| 458 | 439 | bay = macio_get_drvdata(baydev); | |
| 459 | if (bay->mdev && which_bay == bay->mdev->ofdev.node) { | 440 | if (bay == NULL) |
| 460 | int timeout = 5000, index = hwif->index; | 441 | return; |
| 461 | 442 | if (bay->user_lock) { | |
| 462 | mutex_lock(&bay->lock); | 443 | bay->user_lock = 0; |
| 463 | 444 | mutex_unlock(&bay->lock); | |
| 464 | bay->cd_port = hwif; | ||
| 465 | bay->cd_base = (void __iomem *) base; | ||
| 466 | bay->cd_irq = irq; | ||
| 467 | |||
| 468 | if ((MB_CD != bay->content_id) || bay->state != mb_up) { | ||
| 469 | mutex_unlock(&bay->lock); | ||
| 470 | return 0; | ||
| 471 | } | ||
| 472 | printk(KERN_DEBUG "Registered ide%d for media bay %d\n", index, i); | ||
| 473 | do { | ||
| 474 | if (MB_IDE_READY(i)) { | ||
| 475 | bay->cd_index = index; | ||
| 476 | mutex_unlock(&bay->lock); | ||
| 477 | return 0; | ||
| 478 | } | ||
| 479 | mdelay(1); | ||
| 480 | } while(--timeout); | ||
| 481 | printk(KERN_DEBUG "Timeount waiting IDE in bay %d\n", i); | ||
| 482 | mutex_unlock(&bay->lock); | ||
| 483 | return -ENODEV; | ||
| 484 | } | ||
| 485 | } | 445 | } |
| 446 | } | ||
| 447 | EXPORT_SYMBOL_GPL(unlock_media_bay); | ||
| 486 | 448 | ||
| 487 | return -ENODEV; | 449 | static int mb_broadcast_hotplug(struct device *dev, void *data) |
| 450 | { | ||
| 451 | struct media_bay_info* bay = data; | ||
| 452 | struct macio_dev *mdev; | ||
| 453 | struct macio_driver *drv; | ||
| 454 | int state; | ||
| 455 | |||
| 456 | if (dev->bus != &macio_bus_type) | ||
| 457 | return 0; | ||
| 458 | |||
| 459 | state = bay->state == mb_up ? bay->content_id : MB_NO; | ||
| 460 | if (state == MB_FD1) | ||
| 461 | state = MB_FD; | ||
| 462 | mdev = to_macio_device(dev); | ||
| 463 | drv = to_macio_driver(dev->driver); | ||
| 464 | if (dev->driver && drv->mediabay_event) | ||
| 465 | drv->mediabay_event(mdev, state); | ||
| 466 | return 0; | ||
| 488 | } | 467 | } |
| 489 | EXPORT_SYMBOL_GPL(media_bay_set_ide_infos); | ||
| 490 | #endif /* CONFIG_BLK_DEV_IDE_PMAC */ | ||
| 491 | 468 | ||
| 492 | static void media_bay_step(int i) | 469 | static void media_bay_step(int i) |
| 493 | { | 470 | { |
| @@ -497,8 +474,8 @@ static void media_bay_step(int i) | |||
| 497 | if (bay->state != mb_powering_down) | 474 | if (bay->state != mb_powering_down) |
| 498 | poll_media_bay(bay); | 475 | poll_media_bay(bay); |
| 499 | 476 | ||
| 500 | /* If timer expired or polling IDE busy, run state machine */ | 477 | /* If timer expired run state machine */ |
| 501 | if ((bay->state != mb_ide_waiting) && (bay->timer != 0)) { | 478 | if (bay->timer != 0) { |
| 502 | bay->timer -= msecs_to_jiffies(MB_POLL_DELAY); | 479 | bay->timer -= msecs_to_jiffies(MB_POLL_DELAY); |
| 503 | if (bay->timer > 0) | 480 | if (bay->timer > 0) |
| 504 | return; | 481 | return; |
| @@ -508,100 +485,50 @@ static void media_bay_step(int i) | |||
| 508 | switch(bay->state) { | 485 | switch(bay->state) { |
| 509 | case mb_powering_up: | 486 | case mb_powering_up: |
| 510 | if (bay->ops->setup_bus(bay, bay->last_value) < 0) { | 487 | if (bay->ops->setup_bus(bay, bay->last_value) < 0) { |
| 511 | MBDBG("mediabay%d: device not supported (kind:%d)\n", i, bay->content_id); | 488 | pr_debug("mediabay%d: device not supported (kind:%d)\n", |
| 489 | i, bay->content_id); | ||
| 512 | set_mb_power(bay, 0); | 490 | set_mb_power(bay, 0); |
| 513 | break; | 491 | break; |
| 514 | } | 492 | } |
| 515 | bay->timer = msecs_to_jiffies(MB_RESET_DELAY); | 493 | bay->timer = msecs_to_jiffies(MB_RESET_DELAY); |
| 516 | bay->state = mb_enabling_bay; | 494 | bay->state = mb_enabling_bay; |
| 517 | MBDBG("mediabay%d: enabling (kind:%d)\n", i, bay->content_id); | 495 | pr_debug("mediabay%d: enabling (kind:%d)\n", i, bay->content_id); |
| 518 | break; | 496 | break; |
| 519 | case mb_enabling_bay: | 497 | case mb_enabling_bay: |
| 520 | bay->ops->un_reset(bay); | 498 | bay->ops->un_reset(bay); |
| 521 | bay->timer = msecs_to_jiffies(MB_SETUP_DELAY); | 499 | bay->timer = msecs_to_jiffies(MB_SETUP_DELAY); |
| 522 | bay->state = mb_resetting; | 500 | bay->state = mb_resetting; |
| 523 | MBDBG("mediabay%d: waiting reset (kind:%d)\n", i, bay->content_id); | 501 | pr_debug("mediabay%d: releasing bay reset (kind:%d)\n", |
| 502 | i, bay->content_id); | ||
| 524 | break; | 503 | break; |
| 525 | case mb_resetting: | 504 | case mb_resetting: |
| 526 | if (bay->content_id != MB_CD) { | 505 | if (bay->content_id != MB_CD) { |
| 527 | MBDBG("mediabay%d: bay is up (kind:%d)\n", i, bay->content_id); | 506 | pr_debug("mediabay%d: bay is up (kind:%d)\n", i, |
| 507 | bay->content_id); | ||
| 528 | bay->state = mb_up; | 508 | bay->state = mb_up; |
| 509 | device_for_each_child(&bay->mdev->ofdev.dev, | ||
| 510 | bay, mb_broadcast_hotplug); | ||
| 529 | break; | 511 | break; |
| 530 | } | 512 | } |
| 531 | #ifdef CONFIG_BLK_DEV_IDE_PMAC | 513 | pr_debug("mediabay%d: releasing ATA reset (kind:%d)\n", |
| 532 | MBDBG("mediabay%d: waiting IDE reset (kind:%d)\n", i, bay->content_id); | 514 | i, bay->content_id); |
| 533 | bay->ops->un_reset_ide(bay); | 515 | bay->ops->un_reset_ide(bay); |
| 534 | bay->timer = msecs_to_jiffies(MB_IDE_WAIT); | 516 | bay->timer = msecs_to_jiffies(MB_IDE_WAIT); |
| 535 | bay->state = mb_ide_resetting; | 517 | bay->state = mb_ide_resetting; |
| 536 | #else | ||
| 537 | printk(KERN_DEBUG "media-bay %d is ide (not compiled in kernel)\n", i); | ||
| 538 | set_mb_power(bay, 0); | ||
| 539 | #endif /* CONFIG_BLK_DEV_IDE_PMAC */ | ||
| 540 | break; | 518 | break; |
| 541 | #ifdef CONFIG_BLK_DEV_IDE_PMAC | 519 | |
| 542 | case mb_ide_resetting: | 520 | case mb_ide_resetting: |
| 543 | bay->timer = msecs_to_jiffies(MB_IDE_TIMEOUT); | 521 | pr_debug("mediabay%d: bay is up (kind:%d)\n", i, bay->content_id); |
| 544 | bay->state = mb_ide_waiting; | 522 | bay->state = mb_up; |
| 545 | MBDBG("mediabay%d: waiting IDE ready (kind:%d)\n", i, bay->content_id); | 523 | device_for_each_child(&bay->mdev->ofdev.dev, |
| 524 | bay, mb_broadcast_hotplug); | ||
| 546 | break; | 525 | break; |
| 547 | case mb_ide_waiting: | 526 | |
| 548 | if (bay->cd_base == NULL) { | ||
| 549 | bay->timer = 0; | ||
| 550 | bay->state = mb_up; | ||
| 551 | MBDBG("mediabay%d: up before IDE init\n", i); | ||
| 552 | break; | ||
| 553 | } else if (MB_IDE_READY(i)) { | ||
| 554 | bay->timer = 0; | ||
| 555 | bay->state = mb_up; | ||
| 556 | if (bay->cd_index < 0) { | ||
| 557 | printk("mediabay %d, registering IDE...\n", i); | ||
| 558 | pmu_suspend(); | ||
| 559 | ide_port_scan(bay->cd_port); | ||
| 560 | if (bay->cd_port->present) | ||
| 561 | bay->cd_index = bay->cd_port->index; | ||
| 562 | pmu_resume(); | ||
| 563 | } | ||
| 564 | if (bay->cd_index == -1) { | ||
| 565 | /* We eventually do a retry */ | ||
| 566 | bay->cd_retry++; | ||
| 567 | printk("IDE register error\n"); | ||
| 568 | set_mb_power(bay, 0); | ||
| 569 | } else { | ||
| 570 | printk(KERN_DEBUG "media-bay %d is ide%d\n", i, bay->cd_index); | ||
| 571 | MBDBG("mediabay %d IDE ready\n", i); | ||
| 572 | } | ||
| 573 | break; | ||
| 574 | } else if (bay->timer > 0) | ||
| 575 | bay->timer -= msecs_to_jiffies(MB_POLL_DELAY); | ||
| 576 | if (bay->timer <= 0) { | ||
| 577 | printk("\nIDE Timeout in bay %d !, IDE state is: 0x%02x\n", | ||
| 578 | i, readb(bay->cd_base + 0x70)); | ||
| 579 | MBDBG("mediabay%d: nIDE Timeout !\n", i); | ||
| 580 | set_mb_power(bay, 0); | ||
| 581 | bay->timer = 0; | ||
| 582 | } | ||
| 583 | break; | ||
| 584 | #endif /* CONFIG_BLK_DEV_IDE_PMAC */ | ||
| 585 | case mb_powering_down: | 527 | case mb_powering_down: |
| 586 | bay->state = mb_empty; | 528 | bay->state = mb_empty; |
| 587 | #ifdef CONFIG_BLK_DEV_IDE_PMAC | 529 | device_for_each_child(&bay->mdev->ofdev.dev, |
| 588 | if (bay->cd_index >= 0) { | 530 | bay, mb_broadcast_hotplug); |
| 589 | printk(KERN_DEBUG "Unregistering mb %d ide, index:%d\n", i, | 531 | pr_debug("mediabay%d: end of power down\n", i); |
| 590 | bay->cd_index); | ||
| 591 | ide_port_unregister_devices(bay->cd_port); | ||
| 592 | bay->cd_index = -1; | ||
| 593 | } | ||
| 594 | if (bay->cd_retry) { | ||
| 595 | if (bay->cd_retry > MAX_CD_RETRIES) { | ||
| 596 | /* Should add an error sound (sort of beep in dmasound) */ | ||
| 597 | printk("\nmedia-bay %d, IDE device badly inserted or unrecognised\n", i); | ||
| 598 | } else { | ||
| 599 | /* Force a new power down/up sequence */ | ||
| 600 | bay->content_id = MB_NO; | ||
| 601 | } | ||
| 602 | } | ||
| 603 | #endif /* CONFIG_BLK_DEV_IDE_PMAC */ | ||
| 604 | MBDBG("mediabay%d: end of power down\n", i); | ||
| 605 | break; | 532 | break; |
| 606 | } | 533 | } |
| 607 | } | 534 | } |
| @@ -676,11 +603,6 @@ static int __devinit media_bay_attach(struct macio_dev *mdev, const struct of_de | |||
| 676 | bay->last_value = bay->ops->content(bay); | 603 | bay->last_value = bay->ops->content(bay); |
| 677 | bay->value_count = msecs_to_jiffies(MB_STABLE_DELAY); | 604 | bay->value_count = msecs_to_jiffies(MB_STABLE_DELAY); |
| 678 | bay->state = mb_empty; | 605 | bay->state = mb_empty; |
| 679 | do { | ||
| 680 | msleep(MB_POLL_DELAY); | ||
| 681 | media_bay_step(i); | ||
| 682 | } while((bay->state != mb_empty) && | ||
| 683 | (bay->state != mb_up)); | ||
| 684 | 606 | ||
| 685 | /* Mark us ready by filling our mdev data */ | 607 | /* Mark us ready by filling our mdev data */ |
| 686 | macio_set_drvdata(mdev, bay); | 608 | macio_set_drvdata(mdev, bay); |
| @@ -725,7 +647,7 @@ static int media_bay_resume(struct macio_dev *mdev) | |||
| 725 | set_mb_power(bay, 0); | 647 | set_mb_power(bay, 0); |
| 726 | msleep(MB_POWER_DELAY); | 648 | msleep(MB_POWER_DELAY); |
| 727 | if (bay->ops->content(bay) != bay->content_id) { | 649 | if (bay->ops->content(bay) != bay->content_id) { |
| 728 | printk("mediabay%d: content changed during sleep...\n", bay->index); | 650 | printk("mediabay%d: Content changed during sleep...\n", bay->index); |
| 729 | mutex_unlock(&bay->lock); | 651 | mutex_unlock(&bay->lock); |
| 730 | return 0; | 652 | return 0; |
| 731 | } | 653 | } |
| @@ -733,9 +655,6 @@ static int media_bay_resume(struct macio_dev *mdev) | |||
| 733 | bay->last_value = bay->content_id; | 655 | bay->last_value = bay->content_id; |
| 734 | bay->value_count = msecs_to_jiffies(MB_STABLE_DELAY); | 656 | bay->value_count = msecs_to_jiffies(MB_STABLE_DELAY); |
| 735 | bay->timer = msecs_to_jiffies(MB_POWER_DELAY); | 657 | bay->timer = msecs_to_jiffies(MB_POWER_DELAY); |
| 736 | #ifdef CONFIG_BLK_DEV_IDE_PMAC | ||
| 737 | bay->cd_retry = 0; | ||
| 738 | #endif | ||
| 739 | do { | 658 | do { |
| 740 | msleep(MB_POLL_DELAY); | 659 | msleep(MB_POLL_DELAY); |
| 741 | media_bay_step(bay->index); | 660 | media_bay_step(bay->index); |
| @@ -823,9 +742,6 @@ static int __init media_bay_init(void) | |||
| 823 | for (i=0; i<MAX_BAYS; i++) { | 742 | for (i=0; i<MAX_BAYS; i++) { |
| 824 | memset((char *)&media_bays[i], 0, sizeof(struct media_bay_info)); | 743 | memset((char *)&media_bays[i], 0, sizeof(struct media_bay_info)); |
| 825 | media_bays[i].content_id = -1; | 744 | media_bays[i].content_id = -1; |
| 826 | #ifdef CONFIG_BLK_DEV_IDE_PMAC | ||
| 827 | media_bays[i].cd_index = -1; | ||
| 828 | #endif | ||
| 829 | } | 745 | } |
| 830 | if (!machine_is(powermac)) | 746 | if (!machine_is(powermac)) |
| 831 | return 0; | 747 | return 0; |
