2  * Bus & driver management routines for devices within
 
   3  * a MacIO ASIC. Interface to new driver model mostly
 
   4  * stolen from the PCI version.
 
   6  *  Copyright (C) 2005 Ben. Herrenschmidt (benh@kernel.crashing.org)
 
   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.
 
  15  *  - Don't probe below media bay by default, but instead provide
 
  16  *    some hooks for media bay to dynamically add/remove it's own
 
  20 #include <linux/config.h>
 
  21 #include <linux/string.h>
 
  22 #include <linux/kernel.h>
 
  23 #include <linux/pci.h>
 
  24 #include <linux/pci_ids.h>
 
  25 #include <linux/init.h>
 
  26 #include <linux/module.h>
 
  27 #include <linux/slab.h>
 
  29 #include <asm/machdep.h>
 
  30 #include <asm/macio.h>
 
  31 #include <asm/pmac_feature.h>
 
  33 #include <asm/pci-bridge.h>
 
  37 #define MAX_NODE_NAME_SIZE (BUS_ID_SIZE - 12)
 
  39 static struct macio_chip      *macio_on_hold;
 
  41 static int macio_bus_match(struct device *dev, struct device_driver *drv) 
 
  43         struct macio_dev * macio_dev = to_macio_device(dev);
 
  44         struct macio_driver * macio_drv = to_macio_driver(drv);
 
  45         const struct of_device_id * matches = macio_drv->match_table;
 
  50         return of_match_device(matches, &macio_dev->ofdev) != NULL;
 
  53 struct macio_dev *macio_dev_get(struct macio_dev *dev)
 
  59         tmp = get_device(&dev->ofdev.dev);
 
  61                 return to_macio_device(tmp);
 
  66 void macio_dev_put(struct macio_dev *dev)
 
  69                 put_device(&dev->ofdev.dev);
 
  73 static int macio_device_probe(struct device *dev)
 
  76         struct macio_driver *drv;
 
  77         struct macio_dev *macio_dev;
 
  78         const struct of_device_id *match;
 
  80         drv = to_macio_driver(dev->driver);
 
  81         macio_dev = to_macio_device(dev);
 
  86         macio_dev_get(macio_dev);
 
  88         match = of_match_device(drv->match_table, &macio_dev->ofdev);
 
  90                 error = drv->probe(macio_dev, match);
 
  92                 macio_dev_put(macio_dev);
 
  97 static int macio_device_remove(struct device *dev)
 
  99         struct macio_dev * macio_dev = to_macio_device(dev);
 
 100         struct macio_driver * drv = to_macio_driver(dev->driver);
 
 102         if (dev->driver && drv->remove)
 
 103                 drv->remove(macio_dev);
 
 104         macio_dev_put(macio_dev);
 
 109 static void macio_device_shutdown(struct device *dev)
 
 111         struct macio_dev * macio_dev = to_macio_device(dev);
 
 112         struct macio_driver * drv = to_macio_driver(dev->driver);
 
 114         if (dev->driver && drv->shutdown)
 
 115                 drv->shutdown(macio_dev);
 
 118 static int macio_device_suspend(struct device *dev, pm_message_t state)
 
 120         struct macio_dev * macio_dev = to_macio_device(dev);
 
 121         struct macio_driver * drv = to_macio_driver(dev->driver);
 
 123         if (dev->driver && drv->suspend)
 
 124                 return drv->suspend(macio_dev, state);
 
 128 static int macio_device_resume(struct device * dev)
 
 130         struct macio_dev * macio_dev = to_macio_device(dev);
 
 131         struct macio_driver * drv = to_macio_driver(dev->driver);
 
 133         if (dev->driver && drv->resume)
 
 134                 return drv->resume(macio_dev);
 
 138 static int macio_uevent(struct device *dev, char **envp, int num_envp,
 
 139                           char *buffer, int buffer_size)
 
 141         struct macio_dev * macio_dev;
 
 142         struct of_device * of;
 
 143         char *scratch, *compat, *compat2;
 
 145         int length, cplen, cplen2, seen = 0;
 
 150         macio_dev = to_macio_device(dev);
 
 154         of = &macio_dev->ofdev;
 
 156         /* stuff we want to pass to /sbin/hotplug */
 
 157         envp[i++] = scratch = buffer;
 
 158         length = scnprintf (scratch, buffer_size, "OF_NAME=%s", of->node->name);
 
 160         buffer_size -= length;
 
 161         if ((buffer_size <= 0) || (i >= num_envp))
 
 166         length = scnprintf (scratch, buffer_size, "OF_TYPE=%s", of->node->type);
 
 168         buffer_size -= length;
 
 169         if ((buffer_size <= 0) || (i >= num_envp))
 
 173         /* Since the compatible field can contain pretty much anything
 
 174          * it's not really legal to split it out with commas. We split it
 
 175          * up using a number of environment variables instead. */
 
 177         compat = (char *) get_property(of->node, "compatible", &cplen);
 
 180         while (compat && cplen > 0) {
 
 182                 length = scnprintf (scratch, buffer_size,
 
 183                                      "OF_COMPATIBLE_%d=%s", seen, compat);
 
 185                 buffer_size -= length;
 
 186                 if ((buffer_size <= 0) || (i >= num_envp))
 
 189                 length = strlen (compat) + 1;
 
 196         length = scnprintf (scratch, buffer_size, "OF_COMPATIBLE_N=%d", seen);
 
 198         buffer_size -= length;
 
 199         if ((buffer_size <= 0) || (i >= num_envp))
 
 204         length = scnprintf (scratch, buffer_size, "MODALIAS=of:N%sT%s",
 
 205                         of->node->name, of->node->type);
 
 207         buffer_size -= length;
 
 208         if ((buffer_size <= 0) || (i >= num_envp))
 
 217                 length = snprintf (scratch, buffer_size, "C%s", compat2);
 
 218                 buffer_size -= length;
 
 219                 if (buffer_size <= 0)
 
 222                 length = strlen (compat2) + 1;
 
 232 extern struct device_attribute macio_dev_attrs[];
 
 234 struct bus_type macio_bus_type = {
 
 236        .match   = macio_bus_match,
 
 237        .uevent = macio_uevent,
 
 238        .probe   = macio_device_probe,
 
 239        .remove  = macio_device_remove,
 
 240        .shutdown = macio_device_shutdown,
 
 241        .suspend = macio_device_suspend,
 
 242        .resume  = macio_device_resume,
 
 243        .dev_attrs = macio_dev_attrs,
 
 246 static int __init macio_bus_driver_init(void)
 
 248         return bus_register(&macio_bus_type);
 
 251 postcore_initcall(macio_bus_driver_init);
 
 255  * macio_release_dev - free a macio device structure when all users of it are
 
 257  * @dev: device that's been disconnected
 
 259  * Will be called only by the device core when all users of this macio device
 
 260  * are done. This currently means never as we don't hot remove any macio
 
 261  * device yet, though that will happen with mediabay based devices in a later
 
 264 static void macio_release_dev(struct device *dev)
 
 266         struct macio_dev *mdev;
 
 268         mdev = to_macio_device(dev);
 
 273  * macio_resource_quirks - tweak or skip some resources for a device
 
 274  * @np: pointer to the device node
 
 275  * @res: resulting resource
 
 276  * @index: index of resource in node
 
 278  * If this routine returns non-null, then the resource is completely
 
 281 static int macio_resource_quirks(struct device_node *np, struct resource *res,
 
 284         if (res->flags & IORESOURCE_MEM) {
 
 285                 /* Grand Central has too large resource 0 on some machines */
 
 286                 if (index == 0 && !strcmp(np->name, "gc"))
 
 287                         res->end = res->start + 0x1ffff;
 
 289                 /* Airport has bogus resource 2 */
 
 290                 if (index >= 2 && !strcmp(np->name, "radio"))
 
 294                 /* DBDMAs may have bogus sizes */
 
 295                 if ((res->start & 0x0001f000) == 0x00008000)
 
 296                         res->end = res->start + 0xff;
 
 297 #endif /* CONFIG_PPC64 */
 
 299                 /* ESCC parent eats child resources. We could have added a
 
 300                  * level of hierarchy, but I don't really feel the need
 
 303                 if (!strcmp(np->name, "escc"))
 
 306                 /* ESCC has bogus resources >= 3 */
 
 307                 if (index >= 3 && !(strcmp(np->name, "ch-a") &&
 
 308                                     strcmp(np->name, "ch-b")))
 
 311                 /* Media bay has too many resources, keep only first one */
 
 312                 if (index > 0 && !strcmp(np->name, "media-bay"))
 
 315                 /* Some older IDE resources have bogus sizes */
 
 316                 if (!(strcmp(np->name, "IDE") && strcmp(np->name, "ATA") &&
 
 317                       strcmp(np->type, "ide") && strcmp(np->type, "ata"))) {
 
 318                         if (index == 0 && (res->end - res->start) > 0xfff)
 
 319                                 res->end = res->start + 0xfff;
 
 320                         if (index == 1 && (res->end - res->start) > 0xff)
 
 321                                 res->end = res->start + 0xff;
 
 328 static void macio_setup_interrupts(struct macio_dev *dev)
 
 330         struct device_node *np = dev->ofdev.node;
 
 333         /* For now, we use pre-parsed entries in the device-tree for
 
 334          * interrupt routing and addresses, but we should change that
 
 335          * to dynamically parsed entries and so get rid of most of the
 
 336          * clutter in struct device_node
 
 338         for (i = j = 0; i < np->n_intrs; i++) {
 
 339                 struct resource *res = &dev->interrupt[j];
 
 341                 if (j >= MACIO_DEV_COUNT_IRQS)
 
 343                 res->start = np->intrs[i].line;
 
 344                 res->flags = IORESOURCE_IO;
 
 345                 if (np->intrs[j].sense)
 
 346                         res->flags |= IORESOURCE_IRQ_LOWLEVEL;
 
 348                         res->flags |= IORESOURCE_IRQ_HIGHEDGE;
 
 349                 res->name = dev->ofdev.dev.bus_id;
 
 350                 if (macio_resource_quirks(np, res, i))
 
 351                         memset(res, 0, sizeof(struct resource));
 
 355         dev->n_interrupts = j;
 
 358 static void macio_setup_resources(struct macio_dev *dev,
 
 359                                   struct resource *parent_res)
 
 361         struct device_node *np = dev->ofdev.node;
 
 365         for (index = 0; of_address_to_resource(np, index, &r) == 0; index++) {
 
 366                 struct resource *res = &dev->resource[index];
 
 367                 if (index >= MACIO_DEV_COUNT_RESOURCES)
 
 370                 res->name = dev->ofdev.dev.bus_id;
 
 372                 if (macio_resource_quirks(np, res, index)) {
 
 373                         memset(res, 0, sizeof(struct resource));
 
 376                 /* Currently, we consider failure as harmless, this may
 
 377                  * change in the future, once I've found all the device
 
 378                  * tree bugs in older machines & worked around them
 
 380                 if (insert_resource(parent_res, res)) {
 
 381                         printk(KERN_WARNING "Can't request resource "
 
 382                                "%d for MacIO device %s\n",
 
 383                                index, dev->ofdev.dev.bus_id);
 
 386         dev->n_resources = index;
 
 390  * macio_add_one_device - Add one device from OF node to the device tree
 
 391  * @chip: pointer to the macio_chip holding the device
 
 392  * @np: pointer to the device node in the OF tree
 
 393  * @in_bay: set to 1 if device is part of a media-bay
 
 395  * When media-bay is changed to hotswap drivers, this function will
 
 396  * be exposed to the bay driver some way...
 
 398 static struct macio_dev * macio_add_one_device(struct macio_chip *chip,
 
 399                                                struct device *parent,
 
 400                                                struct device_node *np,
 
 401                                                struct macio_dev *in_bay,
 
 402                                                struct resource *parent_res)
 
 404         struct macio_dev *dev;
 
 410         dev = kmalloc(sizeof(*dev), GFP_KERNEL);
 
 413         memset(dev, 0, sizeof(*dev));
 
 415         dev->bus = &chip->lbus;
 
 416         dev->media_bay = in_bay;
 
 417         dev->ofdev.node = np;
 
 418         dev->ofdev.dma_mask = 0xffffffffUL;
 
 419         dev->ofdev.dev.dma_mask = &dev->ofdev.dma_mask;
 
 420         dev->ofdev.dev.parent = parent;
 
 421         dev->ofdev.dev.bus = &macio_bus_type;
 
 422         dev->ofdev.dev.release = macio_release_dev;
 
 425         printk("preparing mdev @%p, ofdev @%p, dev @%p, kobj @%p\n",
 
 426                dev, &dev->ofdev, &dev->ofdev.dev, &dev->ofdev.dev.kobj);
 
 429         /* MacIO itself has a different reg, we use it's PCI base */
 
 430         if (np == chip->of_node) {
 
 431                 sprintf(dev->ofdev.dev.bus_id, "%1d.%08lx:%.*s",
 
 434                         pci_resource_start(chip->lbus.pdev, 0),
 
 436                         0, /* NuBus may want to do something better here */
 
 438                         MAX_NODE_NAME_SIZE, np->name);
 
 440                 reg = (u32 *)get_property(np, "reg", NULL);
 
 441                 sprintf(dev->ofdev.dev.bus_id, "%1d.%08x:%.*s",
 
 443                         reg ? *reg : 0, MAX_NODE_NAME_SIZE, np->name);
 
 446         /* Setup interrupts & resources */
 
 447         macio_setup_interrupts(dev);
 
 448         macio_setup_resources(dev, parent_res);
 
 450         /* Register with core */
 
 451         if (of_device_register(&dev->ofdev) != 0) {
 
 452                 printk(KERN_DEBUG"macio: device registration error for %s!\n",
 
 453                        dev->ofdev.dev.bus_id);
 
 461 static int macio_skip_device(struct device_node *np)
 
 463         if (strncmp(np->name, "battery", 7) == 0)
 
 465         if (strncmp(np->name, "escc-legacy", 11) == 0)
 
 471  * macio_pci_add_devices - Adds sub-devices of mac-io to the device tree
 
 472  * @chip: pointer to the macio_chip holding the devices
 
 474  * This function will do the job of extracting devices from the
 
 475  * Open Firmware device tree, build macio_dev structures and add
 
 476  * them to the Linux device tree.
 
 478  * For now, childs of media-bay are added now as well. This will
 
 481 static void macio_pci_add_devices(struct macio_chip *chip)
 
 483         struct device_node *np, *pnode;
 
 484         struct macio_dev *rdev, *mdev, *mbdev = NULL, *sdev = NULL;
 
 485         struct device *parent = NULL;
 
 486         struct resource *root_res = &iomem_resource;
 
 488         /* Add a node for the macio bus itself */
 
 490         if (chip->lbus.pdev) {
 
 491                 parent = &chip->lbus.pdev->dev;
 
 492                 root_res = &chip->lbus.pdev->resource[0];
 
 495         pnode = of_node_get(chip->of_node);
 
 499         /* Add macio itself to hierarchy */
 
 500         rdev = macio_add_one_device(chip, parent, pnode, NULL, root_res);
 
 503         root_res = &rdev->resource[0];
 
 505         /* First scan 1st level */
 
 506         for (np = NULL; (np = of_get_next_child(pnode, np)) != NULL;) {
 
 507                 if (macio_skip_device(np))
 
 510                 mdev = macio_add_one_device(chip, &rdev->ofdev.dev, np, NULL,
 
 514                 else if (strncmp(np->name, "media-bay", 9) == 0)
 
 516                 else if (strncmp(np->name, "escc", 4) == 0)
 
 520         /* Add media bay devices if any */
 
 522                 for (np = NULL; (np = of_get_next_child(mbdev->ofdev.node, np))
 
 524                         if (macio_skip_device(np))
 
 527                         if (macio_add_one_device(chip, &mbdev->ofdev.dev, np,
 
 528                                                  mbdev,  root_res) == NULL)
 
 532         /* Add serial ports if any */
 
 534                 for (np = NULL; (np = of_get_next_child(sdev->ofdev.node, np))
 
 536                         if (macio_skip_device(np))
 
 539                         if (macio_add_one_device(chip, &sdev->ofdev.dev, np,
 
 540                                                  NULL, root_res) == NULL)
 
 548  * macio_register_driver - Registers a new MacIO device driver
 
 549  * @drv: pointer to the driver definition structure
 
 551 int macio_register_driver(struct macio_driver *drv)
 
 553         /* initialize common driver fields */
 
 554         drv->driver.name = drv->name;
 
 555         drv->driver.bus = &macio_bus_type;
 
 557         /* register with core */
 
 558         return driver_register(&drv->driver);
 
 562  * macio_unregister_driver - Unregisters a new MacIO device driver
 
 563  * @drv: pointer to the driver definition structure
 
 565 void macio_unregister_driver(struct macio_driver *drv)
 
 567         driver_unregister(&drv->driver);
 
 571  *      macio_request_resource - Request an MMIO resource
 
 572  *      @dev: pointer to the device holding the resource
 
 573  *      @resource_no: resource number to request
 
 574  *      @name: resource name
 
 576  *      Mark  memory region number @resource_no associated with MacIO
 
 577  *      device @dev as being reserved by owner @name.  Do not access
 
 578  *      any address inside the memory regions unless this call returns
 
 581  *      Returns 0 on success, or %EBUSY on error.  A warning
 
 582  *      message is also printed on failure.
 
 584 int macio_request_resource(struct macio_dev *dev, int resource_no,
 
 587         if (macio_resource_len(dev, resource_no) == 0)
 
 590         if (!request_mem_region(macio_resource_start(dev, resource_no),
 
 591                                 macio_resource_len(dev, resource_no),
 
 598         printk (KERN_WARNING "MacIO: Unable to reserve resource #%d:%lx@%lx"
 
 601                 macio_resource_len(dev, resource_no),
 
 602                 macio_resource_start(dev, resource_no),
 
 603                 dev->ofdev.dev.bus_id);
 
 608  * macio_release_resource - Release an MMIO resource
 
 609  * @dev: pointer to the device holding the resource
 
 610  * @resource_no: resource number to release
 
 612 void macio_release_resource(struct macio_dev *dev, int resource_no)
 
 614         if (macio_resource_len(dev, resource_no) == 0)
 
 616         release_mem_region(macio_resource_start(dev, resource_no),
 
 617                            macio_resource_len(dev, resource_no));
 
 621  *      macio_request_resources - Reserve all memory resources
 
 622  *      @dev: MacIO device whose resources are to be reserved
 
 623  *      @name: Name to be associated with resource.
 
 625  *      Mark all memory regions associated with MacIO device @dev as
 
 626  *      being reserved by owner @name.  Do not access any address inside
 
 627  *      the memory regions unless this call returns successfully.
 
 629  *      Returns 0 on success, or %EBUSY on error.  A warning
 
 630  *      message is also printed on failure.
 
 632 int macio_request_resources(struct macio_dev *dev, const char *name)
 
 636         for (i = 0; i < dev->n_resources; i++)
 
 637                 if (macio_request_resource(dev, i, name))
 
 643                 macio_release_resource(dev, i);
 
 649  *      macio_release_resources - Release reserved memory resources
 
 650  *      @dev: MacIO device whose resources were previously reserved
 
 653 void macio_release_resources(struct macio_dev *dev)
 
 657         for (i = 0; i < dev->n_resources; i++)
 
 658                 macio_release_resource(dev, i);
 
 664 static int __devinit macio_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 
 666         struct device_node* np;
 
 667         struct macio_chip* chip;
 
 669         if (ent->vendor != PCI_VENDOR_ID_APPLE)
 
 672         /* Note regarding refcounting: We assume pci_device_to_OF_node() is
 
 673          * ported to new OF APIs and returns a node with refcount incremented.
 
 675         np = pci_device_to_OF_node(pdev);
 
 679         /* The above assumption is wrong !!!
 
 680          * fix that here for now until I fix the arch code
 
 684         /* We also assume that pmac_feature will have done a get() on nodes
 
 685          * stored in the macio chips array
 
 687         chip = macio_find(np, macio_unknown);
 
 692         /* XXX Need locking ??? */
 
 693         if (chip->lbus.pdev == NULL) {
 
 694                 chip->lbus.pdev = pdev;
 
 695                 chip->lbus.chip = chip;
 
 696                 pci_set_drvdata(pdev, &chip->lbus);
 
 697                 pci_set_master(pdev);
 
 700         printk(KERN_INFO "MacIO PCI driver attached to %s chipset\n",
 
 704          * HACK ALERT: The WallStreet PowerBook and some OHare based machines
 
 705          * have 2 macio ASICs. I must probe the "main" one first or IDE
 
 706          * ordering will be incorrect. So I put on "hold" the second one since
 
 707          * it seem to appear first on PCI
 
 709         if (chip->type == macio_gatwick || chip->type == macio_ohareII)
 
 710                 if (macio_chips[0].lbus.pdev == NULL) {
 
 711                         macio_on_hold = chip;
 
 715         macio_pci_add_devices(chip);
 
 716         if (macio_on_hold && macio_chips[0].lbus.pdev != NULL) {
 
 717                 macio_pci_add_devices(macio_on_hold);
 
 718                 macio_on_hold = NULL;
 
 724 static void __devexit macio_pci_remove(struct pci_dev* pdev)
 
 726         panic("removing of macio-asic not supported !\n");
 
 730  * MacIO is matched against any Apple ID, it's probe() function
 
 731  * will then decide wether it applies or not
 
 733 static const struct pci_device_id __devinitdata pci_ids [] = { {
 
 734         .vendor         = PCI_VENDOR_ID_APPLE,
 
 735         .device         = PCI_ANY_ID,
 
 736         .subvendor      = PCI_ANY_ID,
 
 737         .subdevice      = PCI_ANY_ID,
 
 739         }, { /* end: all zeroes */ }
 
 741 MODULE_DEVICE_TABLE (pci, pci_ids);
 
 743 /* pci driver glue; this is a "new style" PCI driver module */
 
 744 static struct pci_driver macio_pci_driver = {
 
 745         .name           = (char *) "macio",
 
 748         .probe          = macio_pci_probe,
 
 749         .remove         = macio_pci_remove,
 
 752 #endif /* CONFIG_PCI */
 
 754 static int __init macio_module_init (void) 
 
 759         rc = pci_register_driver(&macio_pci_driver);
 
 762 #endif /* CONFIG_PCI */
 
 766 module_init(macio_module_init);
 
 768 EXPORT_SYMBOL(macio_register_driver);
 
 769 EXPORT_SYMBOL(macio_unregister_driver);
 
 770 EXPORT_SYMBOL(macio_dev_get);
 
 771 EXPORT_SYMBOL(macio_dev_put);
 
 772 EXPORT_SYMBOL(macio_request_resource);
 
 773 EXPORT_SYMBOL(macio_release_resource);
 
 774 EXPORT_SYMBOL(macio_request_resources);
 
 775 EXPORT_SYMBOL(macio_release_resources);