Merge branch 'master'
[pandora-kernel.git] / drivers / macintosh / macio_asic.c
1 /*
2  * Bus & driver management routines for devices within
3  * a MacIO ASIC. Interface to new driver model mostly
4  * stolen from the PCI version.
5  * 
6  * TODO:
7  * 
8  *  - Don't probe below media bay by default, but instead provide
9  *    some hooks for media bay to dynamically add/remove it's own
10  *    sub-devices.
11  */
12  
13 #include <linux/config.h>
14 #include <linux/string.h>
15 #include <linux/kernel.h>
16 #include <linux/pci.h>
17 #include <linux/pci_ids.h>
18 #include <linux/init.h>
19 #include <linux/module.h>
20 #include <linux/slab.h>
21
22 #include <asm/machdep.h>
23 #include <asm/macio.h>
24 #include <asm/pmac_feature.h>
25 #include <asm/prom.h>
26 #include <asm/pci-bridge.h>
27
28 #undef DEBUG
29
30 #define MAX_NODE_NAME_SIZE (BUS_ID_SIZE - 12)
31
32 static struct macio_chip      *macio_on_hold;
33
34 static int macio_bus_match(struct device *dev, struct device_driver *drv) 
35 {
36         struct macio_dev * macio_dev = to_macio_device(dev);
37         struct macio_driver * macio_drv = to_macio_driver(drv);
38         const struct of_device_id * matches = macio_drv->match_table;
39
40         if (!matches) 
41                 return 0;
42
43         return of_match_device(matches, &macio_dev->ofdev) != NULL;
44 }
45
46 struct macio_dev *macio_dev_get(struct macio_dev *dev)
47 {
48         struct device *tmp;
49
50         if (!dev)
51                 return NULL;
52         tmp = get_device(&dev->ofdev.dev);
53         if (tmp)
54                 return to_macio_device(tmp);
55         else
56                 return NULL;
57 }
58
59 void macio_dev_put(struct macio_dev *dev)
60 {
61         if (dev)
62                 put_device(&dev->ofdev.dev);
63 }
64
65
66 static int macio_device_probe(struct device *dev)
67 {
68         int error = -ENODEV;
69         struct macio_driver *drv;
70         struct macio_dev *macio_dev;
71         const struct of_device_id *match;
72
73         drv = to_macio_driver(dev->driver);
74         macio_dev = to_macio_device(dev);
75
76         if (!drv->probe)
77                 return error;
78
79         macio_dev_get(macio_dev);
80
81         match = of_match_device(drv->match_table, &macio_dev->ofdev);
82         if (match)
83                 error = drv->probe(macio_dev, match);
84         if (error)
85                 macio_dev_put(macio_dev);
86
87         return error;
88 }
89
90 static int macio_device_remove(struct device *dev)
91 {
92         struct macio_dev * macio_dev = to_macio_device(dev);
93         struct macio_driver * drv = to_macio_driver(dev->driver);
94
95         if (dev->driver && drv->remove)
96                 drv->remove(macio_dev);
97         macio_dev_put(macio_dev);
98
99         return 0;
100 }
101
102 static void macio_device_shutdown(struct device *dev)
103 {
104         struct macio_dev * macio_dev = to_macio_device(dev);
105         struct macio_driver * drv = to_macio_driver(dev->driver);
106
107         if (dev->driver && drv->shutdown)
108                 drv->shutdown(macio_dev);
109 }
110
111 static int macio_device_suspend(struct device *dev, pm_message_t state)
112 {
113         struct macio_dev * macio_dev = to_macio_device(dev);
114         struct macio_driver * drv = to_macio_driver(dev->driver);
115
116         if (dev->driver && drv->suspend)
117                 return drv->suspend(macio_dev, state);
118         return 0;
119 }
120
121 static int macio_device_resume(struct device * dev)
122 {
123         struct macio_dev * macio_dev = to_macio_device(dev);
124         struct macio_driver * drv = to_macio_driver(dev->driver);
125
126         if (dev->driver && drv->resume)
127                 return drv->resume(macio_dev);
128         return 0;
129 }
130
131 static int macio_hotplug (struct device *dev, char **envp, int num_envp,
132                           char *buffer, int buffer_size)
133 {
134         struct macio_dev * macio_dev;
135         struct of_device * of;
136         char *scratch, *compat;
137         int i = 0;
138         int length = 0;
139         int cplen, seen = 0;
140
141         if (!dev)
142                 return -ENODEV;
143
144         macio_dev = to_macio_device(dev);
145         if (!macio_dev)
146                 return -ENODEV;
147
148         of = &macio_dev->ofdev;
149         scratch = buffer;
150
151         /* stuff we want to pass to /sbin/hotplug */
152         envp[i++] = scratch;
153         length += scnprintf (scratch, buffer_size - length, "OF_NAME=%s",
154                              of->node->name);
155         if ((buffer_size - length <= 0) || (i >= num_envp))
156                 return -ENOMEM;
157         ++length;
158         scratch += length;
159
160         envp[i++] = scratch;
161         length += scnprintf (scratch, buffer_size - length, "OF_TYPE=%s",
162                              of->node->type);
163         if ((buffer_size - length <= 0) || (i >= num_envp))
164                 return -ENOMEM;
165         ++length;
166         scratch += length;
167
168         /* Since the compatible field can contain pretty much anything
169          * it's not really legal to split it out with commas. We split it
170          * up using a number of environment variables instead. */
171
172         compat = (char *) get_property(of->node, "compatible", &cplen);
173         while (compat && cplen > 0) {
174                 int l;
175                 envp[i++] = scratch;
176                 length += scnprintf (scratch, buffer_size - length,
177                                      "OF_COMPATIBLE_%d=%s", seen, compat);
178                 if ((buffer_size - length <= 0) || (i >= num_envp))
179                         return -ENOMEM;
180                 length++;
181                 scratch += length;
182                 l = strlen (compat) + 1;
183                 compat += l;
184                 cplen -= l;
185                 seen++;
186         }
187
188         envp[i++] = scratch;
189         length += scnprintf (scratch, buffer_size - length,
190                              "OF_COMPATIBLE_N=%d", seen);
191         if ((buffer_size - length <= 0) || (i >= num_envp))
192                 return -ENOMEM;
193         ++length;
194         scratch += length;
195
196         envp[i] = NULL;
197
198         return 0;
199 }
200
201 extern struct device_attribute macio_dev_attrs[];
202
203 struct bus_type macio_bus_type = {
204        .name    = "macio",
205        .match   = macio_bus_match,
206        .hotplug = macio_hotplug,
207        .suspend = macio_device_suspend,
208        .resume  = macio_device_resume,
209        .dev_attrs = macio_dev_attrs,
210 };
211
212 static int __init macio_bus_driver_init(void)
213 {
214         return bus_register(&macio_bus_type);
215 }
216
217 postcore_initcall(macio_bus_driver_init);
218
219
220 /**
221  * macio_release_dev - free a macio device structure when all users of it are finished.
222  * @dev: device that's been disconnected
223  *
224  * Will be called only by the device core when all users of this macio device are
225  * done. This currently means never as we don't hot remove any macio device yet,
226  * though that will happen with mediabay based devices in a later implementation.
227  */
228 static void macio_release_dev(struct device *dev)
229 {
230         struct macio_dev *mdev;
231
232         mdev = to_macio_device(dev);
233         kfree(mdev);
234 }
235
236 /**
237  * macio_resource_quirks - tweak or skip some resources for a device
238  * @np: pointer to the device node
239  * @res: resulting resource
240  * @index: index of resource in node
241  *
242  * If this routine returns non-null, then the resource is completely
243  * skipped.
244  */
245 static int macio_resource_quirks(struct device_node *np, struct resource *res, int index)
246 {
247         if (res->flags & IORESOURCE_MEM) {
248                 /* Grand Central has too large resource 0 on some machines */
249                 if (index == 0 && !strcmp(np->name, "gc")) {
250                         np->addrs[0].size = 0x20000;
251                         res->end = res->start + 0x1ffff;
252                 }
253                 /* Airport has bogus resource 2 */
254                 if (index >= 2 && !strcmp(np->name, "radio"))
255                         return 1;
256                 /* DBDMAs may have bogus sizes */
257                 if ((res->start & 0x0001f000) == 0x00008000) {
258                         np->addrs[index].size = 0x100;
259                         res->end = res->start + 0xff;
260                 }
261                 /* ESCC parent eats child resources. We could have added a level of hierarchy,
262                  * but I don't really feel the need for it */
263                 if (!strcmp(np->name, "escc"))
264                         return 1;
265                 /* ESCC has bogus resources >= 3 */
266                 if (index >= 3 && !(strcmp(np->name, "ch-a") && strcmp(np->name, "ch-b")))
267                         return 1;
268                 /* Media bay has too many resources, keep only first one */
269                 if (index > 0 && !strcmp(np->name, "media-bay"))
270                         return 1;
271                 /* Some older IDE resources have bogus sizes */
272                 if (!(strcmp(np->name, "IDE") && strcmp(np->name, "ATA") &&
273                       strcmp(np->type, "ide") && strcmp(np->type, "ata"))) {
274                         if (index == 0 && np->addrs[0].size > 0x1000) {
275                                 np->addrs[0].size = 0x1000;
276                                 res->end = res->start + 0xfff;
277                         }
278                         if (index == 1 && np->addrs[1].size > 0x100) {
279                                 np->addrs[1].size = 0x100;
280                                 res->end = res->start + 0xff;
281                         }
282                 }
283         }
284         return 0;
285 }
286
287
288 /**
289  * macio_add_one_device - Add one device from OF node to the device tree
290  * @chip: pointer to the macio_chip holding the device
291  * @np: pointer to the device node in the OF tree
292  * @in_bay: set to 1 if device is part of a media-bay
293  *
294  * When media-bay is changed to hotswap drivers, this function will
295  * be exposed to the bay driver some way...
296  */
297 static struct macio_dev * macio_add_one_device(struct macio_chip *chip, struct device *parent,
298                                                struct device_node *np, struct macio_dev *in_bay,
299                                                struct resource *parent_res)
300 {
301         struct macio_dev *dev;
302         int i, j;
303         u32 *reg;
304         
305         if (np == NULL)
306                 return NULL;
307
308         dev = kmalloc(sizeof(*dev), GFP_KERNEL);
309         if (!dev)
310                 return NULL;
311         memset(dev, 0, sizeof(*dev));
312
313         dev->bus = &chip->lbus;
314         dev->media_bay = in_bay;
315         dev->ofdev.node = np;
316         dev->ofdev.dma_mask = 0xffffffffUL;
317         dev->ofdev.dev.dma_mask = &dev->ofdev.dma_mask;
318         dev->ofdev.dev.parent = parent;
319         dev->ofdev.dev.bus = &macio_bus_type;
320         dev->ofdev.dev.release = macio_release_dev;
321
322 #ifdef DEBUG
323         printk("preparing mdev @%p, ofdev @%p, dev @%p, kobj @%p\n",
324                dev, &dev->ofdev, &dev->ofdev.dev, &dev->ofdev.dev.kobj);
325 #endif
326
327         /* MacIO itself has a different reg, we use it's PCI base */
328         if (np == chip->of_node) {
329                 sprintf(dev->ofdev.dev.bus_id, "%1d.%08lx:%.*s", chip->lbus.index,
330 #ifdef CONFIG_PCI
331                         pci_resource_start(chip->lbus.pdev, 0),
332 #else
333                         0, /* NuBus may want to do something better here */
334 #endif
335                         MAX_NODE_NAME_SIZE, np->name);
336         } else {
337                 reg = (u32 *)get_property(np, "reg", NULL);
338                 sprintf(dev->ofdev.dev.bus_id, "%1d.%08x:%.*s", chip->lbus.index,
339                         reg ? *reg : 0, MAX_NODE_NAME_SIZE, np->name);
340         }
341
342         /* For now, we use pre-parsed entries in the device-tree for
343          * interrupt routing and addresses, but we should change that
344          * to dynamically parsed entries and so get rid of most of the
345          * clutter in struct device_node
346          */
347         for (i = j = 0; i < np->n_intrs; i++) {
348                 struct resource *res = &dev->interrupt[j];
349
350                 if (j >= MACIO_DEV_COUNT_IRQS)
351                         break;
352                 res->start = np->intrs[i].line;
353                 res->flags = IORESOURCE_IO;
354                 if (np->intrs[j].sense)
355                         res->flags |= IORESOURCE_IRQ_LOWLEVEL;
356                 else
357                         res->flags |= IORESOURCE_IRQ_HIGHEDGE;
358                 res->name = dev->ofdev.dev.bus_id;
359                 if (macio_resource_quirks(np, res, i))
360                         memset(res, 0, sizeof(struct resource));
361                 else
362                         j++;
363         }
364         dev->n_interrupts = j;
365         for (i = j = 0; i < np->n_addrs; i++) {
366                 struct resource *res = &dev->resource[j];
367                 
368                 if (j >= MACIO_DEV_COUNT_RESOURCES)
369                         break;
370                 res->start = np->addrs[i].address;
371                 res->end = np->addrs[i].address + np->addrs[i].size - 1;
372                 res->flags = IORESOURCE_MEM;
373                 res->name = dev->ofdev.dev.bus_id;
374                 if (macio_resource_quirks(np, res, i))
375                         memset(res, 0, sizeof(struct resource));
376                 else {
377                         j++;
378                         /* Currently, we consider failure as harmless, this may
379                          * change in the future, once I've found all the device
380                          * tree bugs in older machines & worked around them
381                          */
382                         if (insert_resource(parent_res, res))
383                                 printk(KERN_WARNING "Can't request resource %d for MacIO"
384                                        " device %s\n", i, dev->ofdev.dev.bus_id);
385                 }
386         }
387         dev->n_resources = j;
388
389         if (of_device_register(&dev->ofdev) != 0) {
390                 printk(KERN_DEBUG"macio: device registration error for %s!\n",
391                        dev->ofdev.dev.bus_id);
392                 kfree(dev);
393                 return NULL;
394         }
395
396         return dev;
397 }
398
399 static int macio_skip_device(struct device_node *np)
400 {
401         if (strncmp(np->name, "battery", 7) == 0)
402                 return 1;
403         if (strncmp(np->name, "escc-legacy", 11) == 0)
404                 return 1;
405         return 0;
406 }
407
408 /**
409  * macio_pci_add_devices - Adds sub-devices of mac-io to the device tree
410  * @chip: pointer to the macio_chip holding the devices
411  * 
412  * This function will do the job of extracting devices from the
413  * Open Firmware device tree, build macio_dev structures and add
414  * them to the Linux device tree.
415  * 
416  * For now, childs of media-bay are added now as well. This will
417  * change rsn though.
418  */
419 static void macio_pci_add_devices(struct macio_chip *chip)
420 {
421         struct device_node *np, *pnode;
422         struct macio_dev *rdev, *mdev, *mbdev = NULL, *sdev = NULL;
423         struct device *parent = NULL;
424         struct resource *root_res = &iomem_resource;
425         
426         /* Add a node for the macio bus itself */
427 #ifdef CONFIG_PCI
428         if (chip->lbus.pdev) {
429                 parent = &chip->lbus.pdev->dev;
430                 root_res = &chip->lbus.pdev->resource[0];
431         }
432 #endif
433         pnode = of_node_get(chip->of_node);
434         if (pnode == NULL)
435                 return;
436
437         /* Add macio itself to hierarchy */
438         rdev = macio_add_one_device(chip, parent, pnode, NULL, root_res);
439         if (rdev == NULL)
440                 return;
441         root_res = &rdev->resource[0];
442
443         /* First scan 1st level */
444         for (np = NULL; (np = of_get_next_child(pnode, np)) != NULL;) {
445                 if (!macio_skip_device(np)) {
446                         of_node_get(np);
447                         mdev = macio_add_one_device(chip, &rdev->ofdev.dev, np, NULL, root_res);
448                         if (mdev == NULL)
449                                 of_node_put(np);
450                         else if (strncmp(np->name, "media-bay", 9) == 0)
451                                 mbdev = mdev;
452                         else if (strncmp(np->name, "escc", 4) == 0)
453                                 sdev = mdev;
454                 }
455         }
456
457         /* Add media bay devices if any */
458         if (mbdev)
459                 for (np = NULL; (np = of_get_next_child(mbdev->ofdev.node, np)) != NULL;)
460                         if (!macio_skip_device(np)) {
461                                 of_node_get(np);
462                                 if (macio_add_one_device(chip, &mbdev->ofdev.dev, np, mbdev,
463                                                          root_res) == NULL)
464                                         of_node_put(np);
465                         }
466         /* Add serial ports if any */
467         if (sdev) {
468                 for (np = NULL; (np = of_get_next_child(sdev->ofdev.node, np)) != NULL;)
469                         if (!macio_skip_device(np)) {
470                                 of_node_get(np);
471                                 if (macio_add_one_device(chip, &sdev->ofdev.dev, np, NULL,
472                                                          root_res) == NULL)
473                                         of_node_put(np);
474                         }
475         }
476 }
477
478
479 /**
480  * macio_register_driver - Registers a new MacIO device driver
481  * @drv: pointer to the driver definition structure
482  */
483 int macio_register_driver(struct macio_driver *drv)
484 {
485         int count = 0;
486
487         /* initialize common driver fields */
488         drv->driver.name = drv->name;
489         drv->driver.bus = &macio_bus_type;
490         drv->driver.probe = macio_device_probe;
491         drv->driver.remove = macio_device_remove;
492         drv->driver.shutdown = macio_device_shutdown;
493
494         /* register with core */
495         count = driver_register(&drv->driver);
496         return count ? count : 1;
497 }
498
499 /**
500  * macio_unregister_driver - Unregisters a new MacIO device driver
501  * @drv: pointer to the driver definition structure
502  */
503 void macio_unregister_driver(struct macio_driver *drv)
504 {
505         driver_unregister(&drv->driver);
506 }
507
508 /**
509  *      macio_request_resource - Request an MMIO resource
510  *      @dev: pointer to the device holding the resource
511  *      @resource_no: resource number to request
512  *      @name: resource name
513  *
514  *      Mark  memory region number @resource_no associated with MacIO
515  *      device @dev as being reserved by owner @name.  Do not access
516  *      any address inside the memory regions unless this call returns
517  *      successfully.
518  *
519  *      Returns 0 on success, or %EBUSY on error.  A warning
520  *      message is also printed on failure.
521  */
522 int macio_request_resource(struct macio_dev *dev, int resource_no, const char *name)
523 {
524         if (macio_resource_len(dev, resource_no) == 0)
525                 return 0;
526                 
527         if (!request_mem_region(macio_resource_start(dev, resource_no),
528                                 macio_resource_len(dev, resource_no),
529                                 name))
530                 goto err_out;
531         
532         return 0;
533
534 err_out:
535         printk (KERN_WARNING "MacIO: Unable to reserve resource #%d:%lx@%lx"
536                 " for device %s\n",
537                 resource_no,
538                 macio_resource_len(dev, resource_no),
539                 macio_resource_start(dev, resource_no),
540                 dev->ofdev.dev.bus_id);
541         return -EBUSY;
542 }
543
544 /**
545  * macio_release_resource - Release an MMIO resource
546  * @dev: pointer to the device holding the resource
547  * @resource_no: resource number to release
548  */
549 void macio_release_resource(struct macio_dev *dev, int resource_no)
550 {
551         if (macio_resource_len(dev, resource_no) == 0)
552                 return;
553         release_mem_region(macio_resource_start(dev, resource_no),
554                            macio_resource_len(dev, resource_no));
555 }
556
557 /**
558  *      macio_request_resources - Reserve all memory resources
559  *      @dev: MacIO device whose resources are to be reserved
560  *      @name: Name to be associated with resource.
561  *
562  *      Mark all memory regions associated with MacIO device @dev as
563  *      being reserved by owner @name.  Do not access any address inside
564  *      the memory regions unless this call returns successfully.
565  *
566  *      Returns 0 on success, or %EBUSY on error.  A warning
567  *      message is also printed on failure.
568  */
569 int macio_request_resources(struct macio_dev *dev, const char *name)
570 {
571         int i;
572         
573         for (i = 0; i < dev->n_resources; i++)
574                 if (macio_request_resource(dev, i, name))
575                         goto err_out;
576         return 0;
577
578 err_out:
579         while(--i >= 0)
580                 macio_release_resource(dev, i);
581                 
582         return -EBUSY;
583 }
584
585 /**
586  *      macio_release_resources - Release reserved memory resources
587  *      @dev: MacIO device whose resources were previously reserved
588  */
589
590 void macio_release_resources(struct macio_dev *dev)
591 {
592         int i;
593         
594         for (i = 0; i < dev->n_resources; i++)
595                 macio_release_resource(dev, i);
596 }
597
598
599 #ifdef CONFIG_PCI
600
601 static int __devinit macio_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
602 {
603         struct device_node* np;
604         struct macio_chip* chip;
605         
606         if (ent->vendor != PCI_VENDOR_ID_APPLE)
607                 return -ENODEV;
608
609         /* Note regarding refcounting: We assume pci_device_to_OF_node() is ported
610          * to new OF APIs and returns a node with refcount incremented. This isn't
611          * the case today, but on the other hand ppc32 doesn't do refcounting. This
612          * will have to be fixed when going to ppc64. --BenH.
613          */
614         np = pci_device_to_OF_node(pdev);
615         if (np == NULL)
616                 return -ENODEV;
617
618         /* This assumption is wrong, fix that here for now until I fix the arch */
619         of_node_get(np);
620
621         /* We also assume that pmac_feature will have done a get() on nodes stored
622          * in the macio chips array
623          */
624         chip = macio_find(np, macio_unknown);
625         of_node_put(np);
626         if (chip == NULL)
627                 return -ENODEV;
628
629         /* XXX Need locking ??? */
630         if (chip->lbus.pdev == NULL) {
631                 chip->lbus.pdev = pdev;
632                 chip->lbus.chip = chip;
633                 pci_set_drvdata(pdev, &chip->lbus);
634                 pci_set_master(pdev);
635         }
636
637         printk(KERN_INFO "MacIO PCI driver attached to %s chipset\n",
638                 chip->name);
639
640         /*
641          * HACK ALERT: The WallStreet PowerBook and some OHare based machines
642          * have 2 macio ASICs. I must probe the "main" one first or IDE ordering
643          * will be incorrect. So I put on "hold" the second one since it seem to
644          * appear first on PCI
645          */
646         if (chip->type == macio_gatwick || chip->type == macio_ohareII)
647                 if (macio_chips[0].lbus.pdev == NULL) {
648                         macio_on_hold = chip;
649                         return 0;
650                 }
651
652         macio_pci_add_devices(chip);
653         if (macio_on_hold && macio_chips[0].lbus.pdev != NULL) {
654                 macio_pci_add_devices(macio_on_hold);
655                 macio_on_hold = NULL;
656         }
657
658         return 0;
659 }
660
661 static void __devexit macio_pci_remove(struct pci_dev* pdev)
662 {
663         panic("removing of macio-asic not supported !\n");
664 }
665
666 /*
667  * MacIO is matched against any Apple ID, it's probe() function
668  * will then decide wether it applies or not
669  */
670 static const struct pci_device_id __devinitdata pci_ids [] = { {
671         .vendor         = PCI_VENDOR_ID_APPLE,
672         .device         = PCI_ANY_ID,
673         .subvendor      = PCI_ANY_ID,
674         .subdevice      = PCI_ANY_ID,
675
676         }, { /* end: all zeroes */ }
677 };
678 MODULE_DEVICE_TABLE (pci, pci_ids);
679
680 /* pci driver glue; this is a "new style" PCI driver module */
681 static struct pci_driver macio_pci_driver = {
682         .name           = (char *) "macio",
683         .id_table       = pci_ids,
684
685         .probe          = macio_pci_probe,
686         .remove         = macio_pci_remove,
687 };
688
689 #endif /* CONFIG_PCI */
690
691 static int __init macio_module_init (void) 
692 {
693 #ifdef CONFIG_PCI
694         int rc;
695
696         rc = pci_register_driver(&macio_pci_driver);
697         if (rc)
698                 return rc;
699 #endif /* CONFIG_PCI */
700         return 0;
701 }
702
703 module_init(macio_module_init);
704
705 EXPORT_SYMBOL(macio_register_driver);
706 EXPORT_SYMBOL(macio_unregister_driver);
707 EXPORT_SYMBOL(macio_dev_get);
708 EXPORT_SYMBOL(macio_dev_put);
709 EXPORT_SYMBOL(macio_request_resource);
710 EXPORT_SYMBOL(macio_release_resource);
711 EXPORT_SYMBOL(macio_request_resources);
712 EXPORT_SYMBOL(macio_release_resources);