2  * Driver for the media bay on the PowerBook 3400 and 2400.
 
   4  * Copyright (C) 1998 Paul Mackerras.
 
   6  * Various evolutions by Benjamin Herrenschmidt & Henry Worth
 
   8  *  This program is free software; you can redistribute it and/or
 
   9  *  modify it under the terms of the GNU General Public License
 
  10  *  as published by the Free Software Foundation; either version
 
  11  *  2 of the License, or (at your option) any later version.
 
  13 #include <linux/config.h>
 
  14 #include <linux/types.h>
 
  15 #include <linux/errno.h>
 
  16 #include <linux/kernel.h>
 
  17 #include <linux/delay.h>
 
  18 #include <linux/sched.h>
 
  19 #include <linux/timer.h>
 
  20 #include <linux/hdreg.h>
 
  21 #include <linux/stddef.h>
 
  22 #include <linux/init.h>
 
  23 #include <linux/ide.h>
 
  25 #include <asm/pgtable.h>
 
  27 #include <asm/machdep.h>
 
  28 #include <asm/pmac_feature.h>
 
  29 #include <asm/mediabay.h>
 
  30 #include <asm/sections.h>
 
  31 #include <asm/ohare.h>
 
  32 #include <asm/heathrow.h>
 
  33 #include <asm/keylargo.h>
 
  34 #include <linux/adb.h>
 
  35 #include <linux/pmu.h>
 
  39 #define MB_IGNORE_SIGNALS
 
  42 #define MBDBG(fmt, arg...)      printk(KERN_INFO fmt , ## arg)
 
  44 #define MBDBG(fmt, arg...)      do { } while (0)
 
  47 #define MB_FCR32(bay, r)        ((bay)->base + ((r) >> 2))
 
  48 #define MB_FCR8(bay, r)         (((volatile u8 __iomem *)((bay)->base)) + (r))
 
  50 #define MB_IN32(bay,r)          (in_le32(MB_FCR32(bay,r)))
 
  51 #define MB_OUT32(bay,r,v)       (out_le32(MB_FCR32(bay,r), (v)))
 
  52 #define MB_BIS(bay,r,v)         (MB_OUT32((bay), (r), MB_IN32((bay), r) | (v)))
 
  53 #define MB_BIC(bay,r,v)         (MB_OUT32((bay), (r), MB_IN32((bay), r) & ~(v)))
 
  54 #define MB_IN8(bay,r)           (in_8(MB_FCR8(bay,r)))
 
  55 #define MB_OUT8(bay,r,v)        (out_8(MB_FCR8(bay,r), (v)))
 
  57 struct media_bay_info;
 
  61         void    (*init)(struct media_bay_info *bay);
 
  62         u8      (*content)(struct media_bay_info *bay);
 
  63         void    (*power)(struct media_bay_info *bay, int on_off);
 
  64         int     (*setup_bus)(struct media_bay_info *bay, u8 device_id);
 
  65         void    (*un_reset)(struct media_bay_info *bay);
 
  66         void    (*un_reset_ide)(struct media_bay_info *bay);
 
  69 struct media_bay_info {
 
  76         struct macio_dev                *mdev;
 
  81         struct semaphore                lock;
 
  82 #ifdef CONFIG_BLK_DEV_IDE
 
  83         void __iomem                    *cd_base;
 
  92 static struct media_bay_info media_bays[MAX_BAYS];
 
  93 int media_bay_count = 0;
 
  95 #ifdef CONFIG_BLK_DEV_IDE
 
  96 /* check the busy bit in the media-bay ide interface
 
  97    (assumes the media-bay contains an ide device) */
 
  98 #define MB_IDE_READY(i) ((readb(media_bays[i].cd_base + 0x70) & 0x80) == 0)
 
 102  * Wait that number of ms between each step in normal polling mode
 
 104 #define MB_POLL_DELAY   25
 
 107  * Consider the media-bay ID value stable if it is the same for
 
 108  * this number of milliseconds
 
 110 #define MB_STABLE_DELAY 100
 
 112 /* Wait after powering up the media bay this delay in ms
 
 113  * timeout bumped for some powerbooks
 
 115 #define MB_POWER_DELAY  200
 
 118  * Hold the media-bay reset signal true for this many ticks
 
 119  * after a device is inserted before releasing it.
 
 121 #define MB_RESET_DELAY  50
 
 124  * Wait this long after the reset signal is released and before doing
 
 125  * further operations. After this delay, the IDE reset signal is released
 
 126  * too for an IDE device
 
 128 #define MB_SETUP_DELAY  100
 
 131  * Wait this many ticks after an IDE device (e.g. CD-ROM) is inserted
 
 132  * (or until the device is ready) before waiting for busy bit to disappear
 
 134 #define MB_IDE_WAIT     1000
 
 137  * Timeout waiting for busy bit of an IDE device to go down
 
 139 #define MB_IDE_TIMEOUT  5000
 
 142  * Max retries of the full power up/down sequence for an IDE device
 
 144 #define MAX_CD_RETRIES  3
 
 147  * States of a media bay
 
 150         mb_empty = 0,           /* Idle */
 
 151         mb_powering_up,         /* power bit set, waiting MB_POWER_DELAY */
 
 152         mb_enabling_bay,        /* enable bits set, waiting MB_RESET_DELAY */
 
 153         mb_resetting,           /* reset bit unset, waiting MB_SETUP_DELAY */
 
 154         mb_ide_resetting,       /* IDE reset bit unser, waiting MB_IDE_WAIT */
 
 155         mb_ide_waiting,         /* Waiting for BUSY bit to go away until MB_IDE_TIMEOUT */
 
 156         mb_up,                  /* Media bay full */
 
 157         mb_powering_down        /* Powering down (avoid too fast down/up) */
 
 160 #define MB_POWER_SOUND          0x08
 
 161 #define MB_POWER_FLOPPY         0x04
 
 162 #define MB_POWER_ATA            0x02
 
 163 #define MB_POWER_PCI            0x01
 
 164 #define MB_POWER_OFF            0x00
 
 167  * Functions for polling content of media bay
 
 171 ohare_mb_content(struct media_bay_info *bay)
 
 173         return (MB_IN32(bay, OHARE_MBCR) >> 12) & 7;
 
 177 heathrow_mb_content(struct media_bay_info *bay)
 
 179         return (MB_IN32(bay, HEATHROW_MBCR) >> 12) & 7;
 
 183 keylargo_mb_content(struct media_bay_info *bay)
 
 187         new_gpio = MB_IN8(bay, KL_GPIO_MEDIABAY_IRQ) & KEYLARGO_GPIO_INPUT_DATA;
 
 189                 bay->cached_gpio = new_gpio;
 
 191         } else if (bay->cached_gpio != new_gpio) {
 
 192                 MB_BIS(bay, KEYLARGO_MBCR, KL_MBCR_MB0_ENABLE);
 
 193                 (void)MB_IN32(bay, KEYLARGO_MBCR);
 
 195                 MB_BIC(bay, KEYLARGO_MBCR, 0x0000000F);
 
 196                 (void)MB_IN32(bay, KEYLARGO_MBCR);
 
 198                 bay->cached_gpio = new_gpio;
 
 200         return (MB_IN32(bay, KEYLARGO_MBCR) >> 4) & 7;
 
 204  * Functions for powering up/down the bay, puts the bay device
 
 205  * into reset state as well
 
 209 ohare_mb_power(struct media_bay_info* bay, int on_off)
 
 212                 /* Power up device, assert it's reset line */
 
 213                 MB_BIC(bay, OHARE_FCR, OH_BAY_RESET_N);
 
 214                 MB_BIC(bay, OHARE_FCR, OH_BAY_POWER_N);
 
 216                 /* Disable all devices */
 
 217                 MB_BIC(bay, OHARE_FCR, OH_BAY_DEV_MASK);
 
 218                 MB_BIC(bay, OHARE_FCR, OH_FLOPPY_ENABLE);
 
 219                 /* Cut power from bay, release reset line */
 
 220                 MB_BIS(bay, OHARE_FCR, OH_BAY_POWER_N);
 
 221                 MB_BIS(bay, OHARE_FCR, OH_BAY_RESET_N);
 
 222                 MB_BIS(bay, OHARE_FCR, OH_IDE1_RESET_N);
 
 224         MB_BIC(bay, OHARE_MBCR, 0x00000F00);
 
 228 heathrow_mb_power(struct media_bay_info* bay, int on_off)
 
 231                 /* Power up device, assert it's reset line */
 
 232                 MB_BIC(bay, HEATHROW_FCR, HRW_BAY_RESET_N);
 
 233                 MB_BIC(bay, HEATHROW_FCR, HRW_BAY_POWER_N);
 
 235                 /* Disable all devices */
 
 236                 MB_BIC(bay, HEATHROW_FCR, HRW_BAY_DEV_MASK);
 
 237                 MB_BIC(bay, HEATHROW_FCR, HRW_SWIM_ENABLE);
 
 238                 /* Cut power from bay, release reset line */
 
 239                 MB_BIS(bay, HEATHROW_FCR, HRW_BAY_POWER_N);
 
 240                 MB_BIS(bay, HEATHROW_FCR, HRW_BAY_RESET_N);
 
 241                 MB_BIS(bay, HEATHROW_FCR, HRW_IDE1_RESET_N);
 
 243         MB_BIC(bay, HEATHROW_MBCR, 0x00000F00);
 
 247 keylargo_mb_power(struct media_bay_info* bay, int on_off)
 
 250                 /* Power up device, assert it's reset line */
 
 251                 MB_BIC(bay, KEYLARGO_MBCR, KL_MBCR_MB0_DEV_RESET);
 
 252                 MB_BIC(bay, KEYLARGO_MBCR, KL_MBCR_MB0_DEV_POWER);
 
 254                 /* Disable all devices */
 
 255                 MB_BIC(bay, KEYLARGO_MBCR, KL_MBCR_MB0_DEV_MASK);
 
 256                 MB_BIC(bay, KEYLARGO_FCR1, KL1_EIDE0_ENABLE);
 
 257                 /* Cut power from bay, release reset line */
 
 258                 MB_BIS(bay, KEYLARGO_MBCR, KL_MBCR_MB0_DEV_POWER);
 
 259                 MB_BIS(bay, KEYLARGO_MBCR, KL_MBCR_MB0_DEV_RESET);
 
 260                 MB_BIS(bay, KEYLARGO_FCR1, KL1_EIDE0_RESET_N);
 
 262         MB_BIC(bay, KEYLARGO_MBCR, 0x0000000F);
 
 266  * Functions for configuring the media bay for a given type of device,
 
 267  * enable the related busses
 
 271 ohare_mb_setup_bus(struct media_bay_info* bay, u8 device_id)
 
 276                         MB_BIS(bay, OHARE_FCR, OH_BAY_FLOPPY_ENABLE);
 
 277                         MB_BIS(bay, OHARE_FCR, OH_FLOPPY_ENABLE);
 
 280                         MB_BIC(bay, OHARE_FCR, OH_IDE1_RESET_N);
 
 281                         MB_BIS(bay, OHARE_FCR, OH_BAY_IDE_ENABLE);
 
 284                         MB_BIS(bay, OHARE_FCR, OH_BAY_PCI_ENABLE);
 
 291 heathrow_mb_setup_bus(struct media_bay_info* bay, u8 device_id)
 
 296                         MB_BIS(bay, HEATHROW_FCR, HRW_BAY_FLOPPY_ENABLE);
 
 297                         MB_BIS(bay, HEATHROW_FCR, HRW_SWIM_ENABLE);
 
 300                         MB_BIC(bay, HEATHROW_FCR, HRW_IDE1_RESET_N);
 
 301                         MB_BIS(bay, HEATHROW_FCR, HRW_BAY_IDE_ENABLE);
 
 304                         MB_BIS(bay, HEATHROW_FCR, HRW_BAY_PCI_ENABLE);
 
 311 keylargo_mb_setup_bus(struct media_bay_info* bay, u8 device_id)
 
 315                         MB_BIS(bay, KEYLARGO_MBCR, KL_MBCR_MB0_IDE_ENABLE);
 
 316                         MB_BIC(bay, KEYLARGO_FCR1, KL1_EIDE0_RESET_N);
 
 317                         MB_BIS(bay, KEYLARGO_FCR1, KL1_EIDE0_ENABLE);
 
 320                         MB_BIS(bay, KEYLARGO_MBCR, KL_MBCR_MB0_PCI_ENABLE);
 
 323                         MB_BIS(bay, KEYLARGO_MBCR, KL_MBCR_MB0_SOUND_ENABLE);
 
 330  * Functions for tweaking resets
 
 334 ohare_mb_un_reset(struct media_bay_info* bay)
 
 336         MB_BIS(bay, OHARE_FCR, OH_BAY_RESET_N);
 
 339 static void __pmac keylargo_mb_init(struct media_bay_info *bay)
 
 341         MB_BIS(bay, KEYLARGO_MBCR, KL_MBCR_MB0_ENABLE);
 
 344 static void __pmac heathrow_mb_un_reset(struct media_bay_info* bay)
 
 346         MB_BIS(bay, HEATHROW_FCR, HRW_BAY_RESET_N);
 
 349 static void __pmac keylargo_mb_un_reset(struct media_bay_info* bay)
 
 351         MB_BIS(bay, KEYLARGO_MBCR, KL_MBCR_MB0_DEV_RESET);
 
 354 static void __pmac ohare_mb_un_reset_ide(struct media_bay_info* bay)
 
 356         MB_BIS(bay, OHARE_FCR, OH_IDE1_RESET_N);
 
 359 static void __pmac heathrow_mb_un_reset_ide(struct media_bay_info* bay)
 
 361         MB_BIS(bay, HEATHROW_FCR, HRW_IDE1_RESET_N);
 
 364 static void __pmac keylargo_mb_un_reset_ide(struct media_bay_info* bay)
 
 366         MB_BIS(bay, KEYLARGO_FCR1, KL1_EIDE0_RESET_N);
 
 369 static inline void __pmac set_mb_power(struct media_bay_info* bay, int onoff)
 
 371         /* Power up up and assert the bay reset line */
 
 373                 bay->ops->power(bay, 1);
 
 374                 bay->state = mb_powering_up;
 
 375                 MBDBG("mediabay%d: powering up\n", bay->index);
 
 377                 /* Make sure everything is powered down & disabled */
 
 378                 bay->ops->power(bay, 0);
 
 379                 bay->state = mb_powering_down;
 
 380                 MBDBG("mediabay%d: powering down\n", bay->index);
 
 382         bay->timer = msecs_to_jiffies(MB_POWER_DELAY);
 
 385 static void __pmac poll_media_bay(struct media_bay_info* bay)
 
 387         int id = bay->ops->content(bay);
 
 389         if (id == bay->last_value) {
 
 390                 if (id != bay->content_id) {
 
 391                         bay->value_count += msecs_to_jiffies(MB_POLL_DELAY);
 
 392                         if (bay->value_count >= msecs_to_jiffies(MB_STABLE_DELAY)) {
 
 393                                 /* If the device type changes without going thru
 
 394                                  * "MB_NO", we force a pass by "MB_NO" to make sure
 
 395                                  * things are properly reset
 
 397                                 if ((id != MB_NO) && (bay->content_id != MB_NO)) {
 
 399                                         MBDBG("mediabay%d: forcing MB_NO\n", bay->index);
 
 401                                 MBDBG("mediabay%d: switching to %d\n", bay->index, id);
 
 402                                 set_mb_power(bay, id != MB_NO);
 
 403                                 bay->content_id = id;
 
 405 #ifdef CONFIG_BLK_DEV_IDE
 
 408                                         printk(KERN_INFO "media bay %d is empty\n", bay->index);
 
 413                 bay->last_value = id;
 
 414                 bay->value_count = 0;
 
 418 int __pmac check_media_bay(struct device_node *which_bay, int what)
 
 420 #ifdef CONFIG_BLK_DEV_IDE
 
 423         for (i=0; i<media_bay_count; i++)
 
 424                 if (media_bays[i].mdev && which_bay == media_bays[i].mdev->ofdev.node) {
 
 425                         if ((what == media_bays[i].content_id) && media_bays[i].state == mb_up)
 
 427                         media_bays[i].cd_index = -1;
 
 430 #endif /* CONFIG_BLK_DEV_IDE */
 
 433 EXPORT_SYMBOL(check_media_bay);
 
 435 int __pmac check_media_bay_by_base(unsigned long base, int what)
 
 437 #ifdef CONFIG_BLK_DEV_IDE
 
 440         for (i=0; i<media_bay_count; i++)
 
 441                 if (media_bays[i].mdev && base == (unsigned long) media_bays[i].cd_base) {
 
 442                         if ((what == media_bays[i].content_id) && media_bays[i].state == mb_up)
 
 444                         media_bays[i].cd_index = -1;
 
 452 int __pmac media_bay_set_ide_infos(struct device_node* which_bay, unsigned long base,
 
 455 #ifdef CONFIG_BLK_DEV_IDE
 
 458         for (i=0; i<media_bay_count; i++) {
 
 459                 struct media_bay_info* bay = &media_bays[i];
 
 461                 if (bay->mdev && which_bay == bay->mdev->ofdev.node) {
 
 466                         bay->cd_base    = (void __iomem *) base;
 
 469                         if ((MB_CD != bay->content_id) || bay->state != mb_up) {
 
 473                         printk(KERN_DEBUG "Registered ide%d for media bay %d\n", index, i);
 
 475                                 if (MB_IDE_READY(i)) {
 
 476                                         bay->cd_index   = index;
 
 482                         printk(KERN_DEBUG "Timeount waiting IDE in bay %d\n", i);
 
 487 #endif /* CONFIG_BLK_DEV_IDE */
 
 492 static void __pmac media_bay_step(int i)
 
 494         struct media_bay_info* bay = &media_bays[i];
 
 496         /* We don't poll when powering down */
 
 497         if (bay->state != mb_powering_down)
 
 500         /* If timer expired or polling IDE busy, run state machine */
 
 501         if ((bay->state != mb_ide_waiting) && (bay->timer != 0)) {
 
 502                 bay->timer -= msecs_to_jiffies(MB_POLL_DELAY);
 
 510                 if (bay->ops->setup_bus(bay, bay->last_value) < 0) {
 
 511                         MBDBG("mediabay%d: device not supported (kind:%d)\n", i, bay->content_id);
 
 512                         set_mb_power(bay, 0);
 
 515                 bay->timer = msecs_to_jiffies(MB_RESET_DELAY);
 
 516                 bay->state = mb_enabling_bay;
 
 517                 MBDBG("mediabay%d: enabling (kind:%d)\n", i, bay->content_id);
 
 519         case mb_enabling_bay:
 
 520                 bay->ops->un_reset(bay);
 
 521                 bay->timer = msecs_to_jiffies(MB_SETUP_DELAY);
 
 522                 bay->state = mb_resetting;
 
 523                 MBDBG("mediabay%d: waiting reset (kind:%d)\n", i, bay->content_id);
 
 527                 if (bay->content_id != MB_CD) {
 
 528                         MBDBG("mediabay%d: bay is up (kind:%d)\n", i, bay->content_id);
 
 532 #ifdef CONFIG_BLK_DEV_IDE
 
 533                 MBDBG("mediabay%d: waiting IDE reset (kind:%d)\n", i, bay->content_id);
 
 534                 bay->ops->un_reset_ide(bay);
 
 535                 bay->timer = msecs_to_jiffies(MB_IDE_WAIT);
 
 536                 bay->state = mb_ide_resetting;
 
 538                 printk(KERN_DEBUG "media-bay %d is ide (not compiled in kernel)\n", i);
 
 539                 set_mb_power(bay, 0);
 
 540 #endif /* CONFIG_BLK_DEV_IDE */
 
 543 #ifdef CONFIG_BLK_DEV_IDE
 
 544         case mb_ide_resetting:
 
 545                 bay->timer = msecs_to_jiffies(MB_IDE_TIMEOUT);
 
 546                 bay->state = mb_ide_waiting;
 
 547                 MBDBG("mediabay%d: waiting IDE ready (kind:%d)\n", i, bay->content_id);
 
 551                 if (bay->cd_base == NULL) {
 
 554                         MBDBG("mediabay%d: up before IDE init\n", i);
 
 556                 } else if (MB_IDE_READY(i)) {
 
 559                         if (bay->cd_index < 0) {
 
 562                                 printk("mediabay %d, registering IDE...\n", i);
 
 564                                 ide_init_hwif_ports(&hw, (unsigned long) bay->cd_base, (unsigned long) 0, NULL);
 
 565                                 hw.irq = bay->cd_irq;
 
 566                                 hw.chipset = ide_pmac;
 
 567                                 bay->cd_index = ide_register_hw(&hw, NULL);
 
 570                         if (bay->cd_index == -1) {
 
 571                                 /* We eventually do a retry */
 
 573                                 printk("IDE register error\n");
 
 574                                 set_mb_power(bay, 0);
 
 576                                 printk(KERN_DEBUG "media-bay %d is ide%d\n", i, bay->cd_index);
 
 577                                 MBDBG("mediabay %d IDE ready\n", i);
 
 580                 } else if (bay->timer > 0)
 
 581                         bay->timer -= msecs_to_jiffies(MB_POLL_DELAY);
 
 582                 if (bay->timer <= 0) {
 
 583                         printk("\nIDE Timeout in bay %d !, IDE state is: 0x%02x\n",
 
 584                                i, readb(bay->cd_base + 0x70));
 
 585                         MBDBG("mediabay%d: nIDE Timeout !\n", i);
 
 586                         set_mb_power(bay, 0);
 
 590 #endif /* CONFIG_BLK_DEV_IDE */
 
 592         case mb_powering_down:
 
 593                 bay->state = mb_empty;
 
 594 #ifdef CONFIG_BLK_DEV_IDE
 
 595                 if (bay->cd_index >= 0) {
 
 596                         printk(KERN_DEBUG "Unregistering mb %d ide, index:%d\n", i,
 
 598                         ide_unregister(bay->cd_index);
 
 602                         if (bay->cd_retry > MAX_CD_RETRIES) {
 
 603                                 /* Should add an error sound (sort of beep in dmasound) */
 
 604                                 printk("\nmedia-bay %d, IDE device badly inserted or unrecognised\n", i);
 
 606                                 /* Force a new power down/up sequence */
 
 607                                 bay->content_id = MB_NO;
 
 610 #endif /* CONFIG_BLK_DEV_IDE */    
 
 611                 MBDBG("mediabay%d: end of power down\n", i);
 
 617  * This procedure runs as a kernel thread to poll the media bay
 
 618  * once each tick and register and unregister the IDE interface
 
 619  * with the IDE driver.  It needs to be a thread because
 
 620  * ide_register can't be called from interrupt context.
 
 622 static int __pmac media_bay_task(void *x)
 
 626         strcpy(current->comm, "media-bay");
 
 627 #ifdef MB_IGNORE_SIGNALS
 
 628         sigfillset(¤t->blocked);
 
 632                 for (i = 0; i < media_bay_count; ++i) {
 
 633                         down(&media_bays[i].lock);
 
 634                         if (!media_bays[i].sleeping)
 
 636                         up(&media_bays[i].lock);
 
 639                 msleep_interruptible(MB_POLL_DELAY);
 
 640                 if (signal_pending(current))
 
 645 static int __devinit media_bay_attach(struct macio_dev *mdev, const struct of_device_id *match)
 
 647         struct media_bay_info* bay;
 
 648         u32 __iomem *regbase;
 
 649         struct device_node *ofnode;
 
 652         ofnode = mdev->ofdev.node;
 
 654         if (macio_resource_count(mdev) < 1)
 
 656         if (macio_request_resources(mdev, "media-bay"))
 
 658         /* Media bay registers are located at the beginning of the
 
 659          * mac-io chip, we get the parent address for now (hrm...)
 
 661         regbase = (u32 __iomem *)
 
 662                 ioremap(ofnode->parent->addrs[0].address, 0x100);
 
 663         if (regbase == NULL) {
 
 664                 macio_release_resources(mdev);
 
 668         i = media_bay_count++;
 
 669         bay = &media_bays[i];
 
 673         bay->ops = match->data;
 
 675         init_MUTEX(&bay->lock);
 
 677         /* Init HW probing */
 
 681         printk(KERN_INFO "mediabay%d: Registered %s media-bay\n", i, bay->ops->name);
 
 683         /* Force an immediate detect */
 
 684         set_mb_power(bay, 0);
 
 685         msleep(MB_POWER_DELAY);
 
 686         bay->content_id = MB_NO;
 
 687         bay->last_value = bay->ops->content(bay);
 
 688         bay->value_count = msecs_to_jiffies(MB_STABLE_DELAY);
 
 689         bay->state = mb_empty;
 
 691                 msleep(MB_POLL_DELAY);
 
 693         } while((bay->state != mb_empty) &&
 
 694                 (bay->state != mb_up));
 
 696         /* Mark us ready by filling our mdev data */
 
 697         macio_set_drvdata(mdev, bay);
 
 699         /* Startup kernel thread */
 
 701                 kernel_thread(media_bay_task, NULL, CLONE_KERNEL);
 
 707 static int __pmac media_bay_suspend(struct macio_dev *mdev, pm_message_t state)
 
 709         struct media_bay_info   *bay = macio_get_drvdata(mdev);
 
 711         if (state != mdev->ofdev.dev.power.power_state && state == PM_SUSPEND_MEM) {
 
 714                 set_mb_power(bay, 0);
 
 716                 msleep(MB_POLL_DELAY);
 
 717                 mdev->ofdev.dev.power.power_state = state;
 
 722 static int __pmac media_bay_resume(struct macio_dev *mdev)
 
 724         struct media_bay_info   *bay = macio_get_drvdata(mdev);
 
 726         if (mdev->ofdev.dev.power.power_state != 0) {
 
 727                 mdev->ofdev.dev.power.power_state = 0;
 
 729                 /* We re-enable the bay using it's previous content
 
 730                    only if it did not change. Note those bozo timings,
 
 731                    they seem to help the 3400 get it right.
 
 733                 /* Force MB power to 0 */
 
 735                 set_mb_power(bay, 0);
 
 736                 msleep(MB_POWER_DELAY);
 
 737                 if (bay->ops->content(bay) != bay->content_id) {
 
 738                         printk("mediabay%d: content changed during sleep...\n", bay->index);
 
 742                 set_mb_power(bay, 1);
 
 743                 bay->last_value = bay->content_id;
 
 744                 bay->value_count = msecs_to_jiffies(MB_STABLE_DELAY);
 
 745                 bay->timer = msecs_to_jiffies(MB_POWER_DELAY);
 
 746 #ifdef CONFIG_BLK_DEV_IDE
 
 750                         msleep(MB_POLL_DELAY);
 
 751                         media_bay_step(bay->index);
 
 752                 } while((bay->state != mb_empty) &&
 
 753                         (bay->state != mb_up));
 
 761 /* Definitions of "ops" structures.
 
 763 static struct mb_ops ohare_mb_ops __pmacdata = {
 
 765         .content        = ohare_mb_content,
 
 766         .power          = ohare_mb_power,
 
 767         .setup_bus      = ohare_mb_setup_bus,
 
 768         .un_reset       = ohare_mb_un_reset,
 
 769         .un_reset_ide   = ohare_mb_un_reset_ide,
 
 772 static struct mb_ops heathrow_mb_ops __pmacdata = {
 
 774         .content        = heathrow_mb_content,
 
 775         .power          = heathrow_mb_power,
 
 776         .setup_bus      = heathrow_mb_setup_bus,
 
 777         .un_reset       = heathrow_mb_un_reset,
 
 778         .un_reset_ide   = heathrow_mb_un_reset_ide,
 
 781 static struct mb_ops keylargo_mb_ops __pmacdata = {
 
 783         .init           = keylargo_mb_init,
 
 784         .content        = keylargo_mb_content,
 
 785         .power          = keylargo_mb_power,
 
 786         .setup_bus      = keylargo_mb_setup_bus,
 
 787         .un_reset       = keylargo_mb_un_reset,
 
 788         .un_reset_ide   = keylargo_mb_un_reset_ide,
 
 792  * It seems that the bit for the media-bay interrupt in the IRQ_LEVEL
 
 793  * register is always set when there is something in the media bay.
 
 794  * This causes problems for the interrupt code if we attach an interrupt
 
 795  * handler to the media-bay interrupt, because it tends to go into
 
 796  * an infinite loop calling the media bay interrupt handler.
 
 797  * Therefore we do it all by polling the media bay once each tick.
 
 800 static struct of_device_id media_bay_match[] =
 
 804         .compatible     = "keylargo-media-bay",
 
 805         .data           = &keylargo_mb_ops,
 
 809         .compatible     = "heathrow-media-bay",
 
 810         .data           = &heathrow_mb_ops,
 
 814         .compatible     = "ohare-media-bay",
 
 815         .data           = &ohare_mb_ops,
 
 820 static struct macio_driver media_bay_driver =
 
 823         .match_table    = media_bay_match,
 
 824         .probe          = media_bay_attach,
 
 825         .suspend        = media_bay_suspend,
 
 826         .resume         = media_bay_resume
 
 829 static int __init media_bay_init(void)
 
 833         for (i=0; i<MAX_BAYS; i++) {
 
 834                 memset((char *)&media_bays[i], 0, sizeof(struct media_bay_info));
 
 835                 media_bays[i].content_id        = -1;
 
 836 #ifdef CONFIG_BLK_DEV_IDE
 
 837                 media_bays[i].cd_index          = -1;
 
 840         if (_machine != _MACH_Pmac)
 
 843         macio_register_driver(&media_bay_driver);       
 
 848 device_initcall(media_bay_init);