• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src-rt-6.x.4708/linux/linux-2.6/arch/parisc/kernel/
1/*
2 * drivers.c
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation; either version
7 * 2 of the License, or (at your option) any later version.
8 *
9 * Copyright (c) 1999 The Puffin Group
10 * Copyright (c) 2001 Matthew Wilcox for Hewlett Packard
11 * Copyright (c) 2001 Helge Deller <deller@gmx.de>
12 * Copyright (c) 2001,2002 Ryan Bradetich
13 * Copyright (c) 2004-2005 Thibaut VARENE <varenet@parisc-linux.org>
14 *
15 * The file handles registering devices and drivers, then matching them.
16 * It's the closest we get to a dating agency.
17 *
18 * If you're thinking about modifying this file, here are some gotchas to
19 * bear in mind:
20 *  - 715/Mirage device paths have a dummy device between Lasi and its children
21 *  - The EISA adapter may show up as a sibling or child of Wax
22 *  - Dino has an optionally functional serial port.  If firmware enables it,
23 *    it shows up as a child of Dino.  If firmware disables it, the buswalk
24 *    finds it and it shows up as a child of Cujo
25 *  - Dino has both parisc and pci devices as children
26 *  - parisc devices are discovered in a random order, including children
27 *    before parents in some cases.
28 */
29
30#include <linux/slab.h>
31#include <linux/types.h>
32#include <linux/kernel.h>
33#include <linux/pci.h>
34#include <linux/spinlock.h>
35#include <linux/string.h>
36#include <asm/hardware.h>
37#include <asm/io.h>
38#include <asm/pdc.h>
39#include <asm/parisc-device.h>
40
41/* See comments in include/asm-parisc/pci.h */
42struct hppa_dma_ops *hppa_dma_ops __read_mostly;
43EXPORT_SYMBOL(hppa_dma_ops);
44
45static struct device root = {
46	.init_name = "parisc",
47};
48
49static inline int check_dev(struct device *dev)
50{
51	if (dev->bus == &parisc_bus_type) {
52		struct parisc_device *pdev;
53		pdev = to_parisc_device(dev);
54		return pdev->id.hw_type != HPHW_FAULTY;
55	}
56	return 1;
57}
58
59static struct device *
60parse_tree_node(struct device *parent, int index, struct hardware_path *modpath);
61
62struct recurse_struct {
63	void * obj;
64	int (*fn)(struct device *, void *);
65};
66
67static int descend_children(struct device * dev, void * data)
68{
69	struct recurse_struct * recurse_data = (struct recurse_struct *)data;
70
71	if (recurse_data->fn(dev, recurse_data->obj))
72		return 1;
73	else
74		return device_for_each_child(dev, recurse_data, descend_children);
75}
76
77/**
78 *	for_each_padev - Iterate over all devices in the tree
79 *	@fn:	Function to call for each device.
80 *	@data:	Data to pass to the called function.
81 *
82 *	This performs a depth-first traversal of the tree, calling the
83 *	function passed for each node.  It calls the function for parents
84 *	before children.
85 */
86
87static int for_each_padev(int (*fn)(struct device *, void *), void * data)
88{
89	struct recurse_struct recurse_data = {
90		.obj	= data,
91		.fn	= fn,
92	};
93	return device_for_each_child(&root, &recurse_data, descend_children);
94}
95
96/**
97 * match_device - Report whether this driver can handle this device
98 * @driver: the PA-RISC driver to try
99 * @dev: the PA-RISC device to try
100 */
101static int match_device(struct parisc_driver *driver, struct parisc_device *dev)
102{
103	const struct parisc_device_id *ids;
104
105	for (ids = driver->id_table; ids->sversion; ids++) {
106		if ((ids->sversion != SVERSION_ANY_ID) &&
107		    (ids->sversion != dev->id.sversion))
108			continue;
109
110		if ((ids->hw_type != HWTYPE_ANY_ID) &&
111		    (ids->hw_type != dev->id.hw_type))
112			continue;
113
114		if ((ids->hversion != HVERSION_ANY_ID) &&
115		    (ids->hversion != dev->id.hversion))
116			continue;
117
118		return 1;
119	}
120	return 0;
121}
122
123static int parisc_driver_probe(struct device *dev)
124{
125	int rc;
126	struct parisc_device *pa_dev = to_parisc_device(dev);
127	struct parisc_driver *pa_drv = to_parisc_driver(dev->driver);
128
129	rc = pa_drv->probe(pa_dev);
130
131	if (!rc)
132		pa_dev->driver = pa_drv;
133
134	return rc;
135}
136
137static int parisc_driver_remove(struct device *dev)
138{
139	struct parisc_device *pa_dev = to_parisc_device(dev);
140	struct parisc_driver *pa_drv = to_parisc_driver(dev->driver);
141	if (pa_drv->remove)
142		pa_drv->remove(pa_dev);
143
144	return 0;
145}
146
147
148/**
149 * register_parisc_driver - Register this driver if it can handle a device
150 * @driver: the PA-RISC driver to try
151 */
152int register_parisc_driver(struct parisc_driver *driver)
153{
154	if(driver->drv.name) {
155		printk(KERN_WARNING
156		       "BUG: skipping previously registered driver %s\n",
157		       driver->name);
158		return 1;
159	}
160
161	if (!driver->probe) {
162		printk(KERN_WARNING
163		       "BUG: driver %s has no probe routine\n",
164		       driver->name);
165		return 1;
166	}
167
168	driver->drv.bus = &parisc_bus_type;
169
170	/* We install our own probe and remove routines */
171	WARN_ON(driver->drv.probe != NULL);
172	WARN_ON(driver->drv.remove != NULL);
173
174	driver->drv.name = driver->name;
175
176	return driver_register(&driver->drv);
177}
178EXPORT_SYMBOL(register_parisc_driver);
179
180
181struct match_count {
182	struct parisc_driver * driver;
183	int count;
184};
185
186static int match_and_count(struct device * dev, void * data)
187{
188	struct match_count * m = data;
189	struct parisc_device * pdev = to_parisc_device(dev);
190
191	if (check_dev(dev)) {
192		if (match_device(m->driver, pdev))
193			m->count++;
194	}
195	return 0;
196}
197
198/**
199 * count_parisc_driver - count # of devices this driver would match
200 * @driver: the PA-RISC driver to try
201 *
202 * Use by IOMMU support to "guess" the right size IOPdir.
203 * Formula is something like memsize/(num_iommu * entry_size).
204 */
205int count_parisc_driver(struct parisc_driver *driver)
206{
207	struct match_count m = {
208		.driver	= driver,
209		.count	= 0,
210	};
211
212	for_each_padev(match_and_count, &m);
213
214	return m.count;
215}
216
217
218
219/**
220 * unregister_parisc_driver - Unregister this driver from the list of drivers
221 * @driver: the PA-RISC driver to unregister
222 */
223int unregister_parisc_driver(struct parisc_driver *driver)
224{
225	driver_unregister(&driver->drv);
226	return 0;
227}
228EXPORT_SYMBOL(unregister_parisc_driver);
229
230struct find_data {
231	unsigned long hpa;
232	struct parisc_device * dev;
233};
234
235static int find_device(struct device * dev, void * data)
236{
237	struct parisc_device * pdev = to_parisc_device(dev);
238	struct find_data * d = (struct find_data*)data;
239
240	if (check_dev(dev)) {
241		if (pdev->hpa.start == d->hpa) {
242			d->dev = pdev;
243			return 1;
244		}
245	}
246	return 0;
247}
248
249static struct parisc_device *find_device_by_addr(unsigned long hpa)
250{
251	struct find_data d = {
252		.hpa	= hpa,
253	};
254	int ret;
255
256	ret = for_each_padev(find_device, &d);
257	return ret ? d.dev : NULL;
258}
259
260/**
261 * find_pa_parent_type - Find a parent of a specific type
262 * @dev: The device to start searching from
263 * @type: The device type to search for.
264 *
265 * Walks up the device tree looking for a device of the specified type.
266 * If it finds it, it returns it.  If not, it returns NULL.
267 */
268const struct parisc_device *
269find_pa_parent_type(const struct parisc_device *padev, int type)
270{
271	const struct device *dev = &padev->dev;
272	while (dev != &root) {
273		struct parisc_device *candidate = to_parisc_device(dev);
274		if (candidate->id.hw_type == type)
275			return candidate;
276		dev = dev->parent;
277	}
278
279	return NULL;
280}
281
282#ifdef CONFIG_PCI
283static inline int is_pci_dev(struct device *dev)
284{
285	return dev->bus == &pci_bus_type;
286}
287#else
288static inline int is_pci_dev(struct device *dev)
289{
290	return 0;
291}
292#endif
293
294/*
295 * get_node_path fills in @path with the firmware path to the device.
296 * Note that if @node is a parisc device, we don't fill in the 'mod' field.
297 * This is because both callers pass the parent and fill in the mod
298 * themselves.  If @node is a PCI device, we do fill it in, even though this
299 * is inconsistent.
300 */
301static void get_node_path(struct device *dev, struct hardware_path *path)
302{
303	int i = 5;
304	memset(&path->bc, -1, 6);
305
306	if (is_pci_dev(dev)) {
307		unsigned int devfn = to_pci_dev(dev)->devfn;
308		path->mod = PCI_FUNC(devfn);
309		path->bc[i--] = PCI_SLOT(devfn);
310		dev = dev->parent;
311	}
312
313	while (dev != &root) {
314		if (is_pci_dev(dev)) {
315			unsigned int devfn = to_pci_dev(dev)->devfn;
316			path->bc[i--] = PCI_SLOT(devfn) | (PCI_FUNC(devfn)<< 5);
317		} else if (dev->bus == &parisc_bus_type) {
318			path->bc[i--] = to_parisc_device(dev)->hw_path;
319		}
320		dev = dev->parent;
321	}
322}
323
324static char *print_hwpath(struct hardware_path *path, char *output)
325{
326	int i;
327	for (i = 0; i < 6; i++) {
328		if (path->bc[i] == -1)
329			continue;
330		output += sprintf(output, "%u/", (unsigned char) path->bc[i]);
331	}
332	output += sprintf(output, "%u", (unsigned char) path->mod);
333	return output;
334}
335
336/**
337 * print_pa_hwpath - Returns hardware path for PA devices
338 * dev: The device to return the path for
339 * output: Pointer to a previously-allocated array to place the path in.
340 *
341 * This function fills in the output array with a human-readable path
342 * to a PA device.  This string is compatible with that used by PDC, and
343 * may be printed on the outside of the box.
344 */
345char *print_pa_hwpath(struct parisc_device *dev, char *output)
346{
347	struct hardware_path path;
348
349	get_node_path(dev->dev.parent, &path);
350	path.mod = dev->hw_path;
351	return print_hwpath(&path, output);
352}
353EXPORT_SYMBOL(print_pa_hwpath);
354
355#if defined(CONFIG_PCI) || defined(CONFIG_ISA)
356/**
357 * get_pci_node_path - Determines the hardware path for a PCI device
358 * @pdev: The device to return the path for
359 * @path: Pointer to a previously-allocated array to place the path in.
360 *
361 * This function fills in the hardware_path structure with the route to
362 * the specified PCI device.  This structure is suitable for passing to
363 * PDC calls.
364 */
365void get_pci_node_path(struct pci_dev *pdev, struct hardware_path *path)
366{
367	get_node_path(&pdev->dev, path);
368}
369EXPORT_SYMBOL(get_pci_node_path);
370
371/**
372 * print_pci_hwpath - Returns hardware path for PCI devices
373 * dev: The device to return the path for
374 * output: Pointer to a previously-allocated array to place the path in.
375 *
376 * This function fills in the output array with a human-readable path
377 * to a PCI device.  This string is compatible with that used by PDC, and
378 * may be printed on the outside of the box.
379 */
380char *print_pci_hwpath(struct pci_dev *dev, char *output)
381{
382	struct hardware_path path;
383
384	get_pci_node_path(dev, &path);
385	return print_hwpath(&path, output);
386}
387EXPORT_SYMBOL(print_pci_hwpath);
388
389#endif /* defined(CONFIG_PCI) || defined(CONFIG_ISA) */
390
391static void setup_bus_id(struct parisc_device *padev)
392{
393	struct hardware_path path;
394	char name[20];
395	char *output = name;
396	int i;
397
398	get_node_path(padev->dev.parent, &path);
399
400	for (i = 0; i < 6; i++) {
401		if (path.bc[i] == -1)
402			continue;
403		output += sprintf(output, "%u:", (unsigned char) path.bc[i]);
404	}
405	sprintf(output, "%u", (unsigned char) padev->hw_path);
406	dev_set_name(&padev->dev, name);
407}
408
409struct parisc_device * create_tree_node(char id, struct device *parent)
410{
411	struct parisc_device *dev = kzalloc(sizeof(*dev), GFP_KERNEL);
412	if (!dev)
413		return NULL;
414
415	dev->hw_path = id;
416	dev->id.hw_type = HPHW_FAULTY;
417
418	dev->dev.parent = parent;
419	setup_bus_id(dev);
420
421	dev->dev.bus = &parisc_bus_type;
422	dev->dma_mask = 0xffffffffUL;	/* PARISC devices are 32-bit */
423
424	/* make the generic dma mask a pointer to the parisc one */
425	dev->dev.dma_mask = &dev->dma_mask;
426	dev->dev.coherent_dma_mask = dev->dma_mask;
427	if (device_register(&dev->dev)) {
428		kfree(dev);
429		return NULL;
430	}
431
432	return dev;
433}
434
435struct match_id_data {
436	char id;
437	struct parisc_device * dev;
438};
439
440static int match_by_id(struct device * dev, void * data)
441{
442	struct parisc_device * pdev = to_parisc_device(dev);
443	struct match_id_data * d = data;
444
445	if (pdev->hw_path == d->id) {
446		d->dev = pdev;
447		return 1;
448	}
449	return 0;
450}
451
452/**
453 * alloc_tree_node - returns a device entry in the iotree
454 * @parent: the parent node in the tree
455 * @id: the element of the module path for this entry
456 *
457 * Checks all the children of @parent for a matching @id.  If none
458 * found, it allocates a new device and returns it.
459 */
460static struct parisc_device * alloc_tree_node(struct device *parent, char id)
461{
462	struct match_id_data d = {
463		.id = id,
464	};
465	if (device_for_each_child(parent, &d, match_by_id))
466		return d.dev;
467	else
468		return create_tree_node(id, parent);
469}
470
471static struct parisc_device *create_parisc_device(struct hardware_path *modpath)
472{
473	int i;
474	struct device *parent = &root;
475	for (i = 0; i < 6; i++) {
476		if (modpath->bc[i] == -1)
477			continue;
478		parent = &alloc_tree_node(parent, modpath->bc[i])->dev;
479	}
480	return alloc_tree_node(parent, modpath->mod);
481}
482
483struct parisc_device *
484alloc_pa_dev(unsigned long hpa, struct hardware_path *mod_path)
485{
486	int status;
487	unsigned long bytecnt;
488	u8 iodc_data[32];
489	struct parisc_device *dev;
490	const char *name;
491
492	/* Check to make sure this device has not already been added - Ryan */
493	if (find_device_by_addr(hpa) != NULL)
494		return NULL;
495
496	status = pdc_iodc_read(&bytecnt, hpa, 0, &iodc_data, 32);
497	if (status != PDC_OK)
498		return NULL;
499
500	dev = create_parisc_device(mod_path);
501	if (dev->id.hw_type != HPHW_FAULTY) {
502		printk(KERN_ERR "Two devices have hardware path [%s].  "
503				"IODC data for second device: "
504				"%02x%02x%02x%02x%02x%02x\n"
505				"Rearranging GSC cards sometimes helps\n",
506			parisc_pathname(dev), iodc_data[0], iodc_data[1],
507			iodc_data[3], iodc_data[4], iodc_data[5], iodc_data[6]);
508		return NULL;
509	}
510
511	dev->id.hw_type = iodc_data[3] & 0x1f;
512	dev->id.hversion = (iodc_data[0] << 4) | ((iodc_data[1] & 0xf0) >> 4);
513	dev->id.hversion_rev = iodc_data[1] & 0x0f;
514	dev->id.sversion = ((iodc_data[4] & 0x0f) << 16) |
515			(iodc_data[5] << 8) | iodc_data[6];
516	dev->hpa.name = parisc_pathname(dev);
517	dev->hpa.start = hpa;
518	/* This is awkward.  The STI spec says that gfx devices may occupy
519	 * 32MB or 64MB.  Unfortunately, we don't know how to tell whether
520	 * it's the former or the latter.  Assumptions either way can hurt us.
521	 */
522	if (hpa == 0xf4000000 || hpa == 0xf8000000) {
523		dev->hpa.end = hpa + 0x03ffffff;
524	} else if (hpa == 0xf6000000 || hpa == 0xfa000000) {
525		dev->hpa.end = hpa + 0x01ffffff;
526	} else {
527		dev->hpa.end = hpa + 0xfff;
528	}
529	dev->hpa.flags = IORESOURCE_MEM;
530	name = parisc_hardware_description(&dev->id);
531	if (name) {
532		strlcpy(dev->name, name, sizeof(dev->name));
533	}
534
535	/* Silently fail things like mouse ports which are subsumed within
536	 * the keyboard controller
537	 */
538	if ((hpa & 0xfff) == 0 && insert_resource(&iomem_resource, &dev->hpa))
539		printk("Unable to claim HPA %lx for device %s\n",
540				hpa, name);
541
542	return dev;
543}
544
545static int parisc_generic_match(struct device *dev, struct device_driver *drv)
546{
547	return match_device(to_parisc_driver(drv), to_parisc_device(dev));
548}
549
550static ssize_t make_modalias(struct device *dev, char *buf)
551{
552	const struct parisc_device *padev = to_parisc_device(dev);
553	const struct parisc_device_id *id = &padev->id;
554
555	return sprintf(buf, "parisc:t%02Xhv%04Xrev%02Xsv%08X\n",
556		(u8)id->hw_type, (u16)id->hversion, (u8)id->hversion_rev,
557		(u32)id->sversion);
558}
559
560static int parisc_uevent(struct device *dev, struct kobj_uevent_env *env)
561{
562	const struct parisc_device *padev;
563	char modalias[40];
564
565	if (!dev)
566		return -ENODEV;
567
568	padev = to_parisc_device(dev);
569	if (!padev)
570		return -ENODEV;
571
572	if (add_uevent_var(env, "PARISC_NAME=%s", padev->name))
573		return -ENOMEM;
574
575	make_modalias(dev, modalias);
576	if (add_uevent_var(env, "MODALIAS=%s", modalias))
577		return -ENOMEM;
578
579	return 0;
580}
581
582#define pa_dev_attr(name, field, format_string)				\
583static ssize_t name##_show(struct device *dev, struct device_attribute *attr, char *buf)		\
584{									\
585	struct parisc_device *padev = to_parisc_device(dev);		\
586	return sprintf(buf, format_string, padev->field);		\
587}
588
589#define pa_dev_attr_id(field, format) pa_dev_attr(field, id.field, format)
590
591pa_dev_attr(irq, irq, "%u\n");
592pa_dev_attr_id(hw_type, "0x%02x\n");
593pa_dev_attr(rev, id.hversion_rev, "0x%x\n");
594pa_dev_attr_id(hversion, "0x%03x\n");
595pa_dev_attr_id(sversion, "0x%05x\n");
596
597static ssize_t modalias_show(struct device *dev, struct device_attribute *attr, char *buf)
598{
599	return make_modalias(dev, buf);
600}
601
602static struct device_attribute parisc_device_attrs[] = {
603	__ATTR_RO(irq),
604	__ATTR_RO(hw_type),
605	__ATTR_RO(rev),
606	__ATTR_RO(hversion),
607	__ATTR_RO(sversion),
608	__ATTR_RO(modalias),
609	__ATTR_NULL,
610};
611
612struct bus_type parisc_bus_type = {
613	.name = "parisc",
614	.match = parisc_generic_match,
615	.uevent = parisc_uevent,
616	.dev_attrs = parisc_device_attrs,
617	.probe = parisc_driver_probe,
618	.remove = parisc_driver_remove,
619};
620
621/**
622 * register_parisc_device - Locate a driver to manage this device.
623 * @dev: The parisc device.
624 *
625 * Search the driver list for a driver that is willing to manage
626 * this device.
627 */
628int register_parisc_device(struct parisc_device *dev)
629{
630	if (!dev)
631		return 0;
632
633	if (dev->driver)
634		return 1;
635
636	return 0;
637}
638
639/**
640 * match_pci_device - Matches a pci device against a given hardware path
641 * entry.
642 * @dev: the generic device (known to be contained by a pci_dev).
643 * @index: the current BC index
644 * @modpath: the hardware path.
645 * @return: true if the device matches the hardware path.
646 */
647static int match_pci_device(struct device *dev, int index,
648		struct hardware_path *modpath)
649{
650	struct pci_dev *pdev = to_pci_dev(dev);
651	int id;
652
653	if (index == 5) {
654		/* we are at the end of the path, and on the actual device */
655		unsigned int devfn = pdev->devfn;
656		return ((modpath->bc[5] == PCI_SLOT(devfn)) &&
657					(modpath->mod == PCI_FUNC(devfn)));
658	}
659
660	id = PCI_SLOT(pdev->devfn) | (PCI_FUNC(pdev->devfn) << 5);
661	return (modpath->bc[index] == id);
662}
663
664/**
665 * match_parisc_device - Matches a parisc device against a given hardware
666 * path entry.
667 * @dev: the generic device (known to be contained by a parisc_device).
668 * @index: the current BC index
669 * @modpath: the hardware path.
670 * @return: true if the device matches the hardware path.
671 */
672static int match_parisc_device(struct device *dev, int index,
673		struct hardware_path *modpath)
674{
675	struct parisc_device *curr = to_parisc_device(dev);
676	char id = (index == 6) ? modpath->mod : modpath->bc[index];
677
678	return (curr->hw_path == id);
679}
680
681struct parse_tree_data {
682	int index;
683	struct hardware_path * modpath;
684	struct device * dev;
685};
686
687static int check_parent(struct device * dev, void * data)
688{
689	struct parse_tree_data * d = data;
690
691	if (check_dev(dev)) {
692		if (dev->bus == &parisc_bus_type) {
693			if (match_parisc_device(dev, d->index, d->modpath))
694				d->dev = dev;
695		} else if (is_pci_dev(dev)) {
696			if (match_pci_device(dev, d->index, d->modpath))
697				d->dev = dev;
698		} else if (dev->bus == NULL) {
699			/* we are on a bus bridge */
700			struct device *new = parse_tree_node(dev, d->index, d->modpath);
701			if (new)
702				d->dev = new;
703		}
704	}
705	return d->dev != NULL;
706}
707
708/**
709 * parse_tree_node - returns a device entry in the iotree
710 * @parent: the parent node in the tree
711 * @index: the current BC index
712 * @modpath: the hardware_path struct to match a device against
713 * @return: The corresponding device if found, NULL otherwise.
714 *
715 * Checks all the children of @parent for a matching @id.  If none
716 * found, it returns NULL.
717 */
718static struct device *
719parse_tree_node(struct device *parent, int index, struct hardware_path *modpath)
720{
721	struct parse_tree_data d = {
722		.index          = index,
723		.modpath        = modpath,
724	};
725
726	struct recurse_struct recurse_data = {
727		.obj	= &d,
728		.fn	= check_parent,
729	};
730
731	if (device_for_each_child(parent, &recurse_data, descend_children))
732		/* nothing */;
733
734	return d.dev;
735}
736
737/**
738 * hwpath_to_device - Finds the generic device corresponding to a given hardware path.
739 * @modpath: the hardware path.
740 * @return: The target device, NULL if not found.
741 */
742struct device *hwpath_to_device(struct hardware_path *modpath)
743{
744	int i;
745	struct device *parent = &root;
746	for (i = 0; i < 6; i++) {
747		if (modpath->bc[i] == -1)
748			continue;
749		parent = parse_tree_node(parent, i, modpath);
750		if (!parent)
751			return NULL;
752	}
753	if (is_pci_dev(parent)) /* pci devices already parse MOD */
754		return parent;
755	else
756		return parse_tree_node(parent, 6, modpath);
757}
758EXPORT_SYMBOL(hwpath_to_device);
759
760/**
761 * device_to_hwpath - Populates the hwpath corresponding to the given device.
762 * @param dev the target device
763 * @param path pointer to a previously allocated hwpath struct to be filled in
764 */
765void device_to_hwpath(struct device *dev, struct hardware_path *path)
766{
767	struct parisc_device *padev;
768	if (dev->bus == &parisc_bus_type) {
769		padev = to_parisc_device(dev);
770		get_node_path(dev->parent, path);
771		path->mod = padev->hw_path;
772	} else if (is_pci_dev(dev)) {
773		get_node_path(dev, path);
774	}
775}
776EXPORT_SYMBOL(device_to_hwpath);
777
778#define BC_PORT_MASK 0x8
779#define BC_LOWER_PORT 0x8
780
781#define BUS_CONVERTER(dev) \
782        ((dev->id.hw_type == HPHW_IOA) || (dev->id.hw_type == HPHW_BCPORT))
783
784#define IS_LOWER_PORT(dev) \
785        ((gsc_readl(dev->hpa.start + offsetof(struct bc_module, io_status)) \
786                & BC_PORT_MASK) == BC_LOWER_PORT)
787
788#define MAX_NATIVE_DEVICES 64
789#define NATIVE_DEVICE_OFFSET 0x1000
790
791#define FLEX_MASK 	F_EXTEND(0xfffc0000)
792#define IO_IO_LOW	offsetof(struct bc_module, io_io_low)
793#define IO_IO_HIGH	offsetof(struct bc_module, io_io_high)
794#define READ_IO_IO_LOW(dev)  (unsigned long)(signed int)gsc_readl(dev->hpa.start + IO_IO_LOW)
795#define READ_IO_IO_HIGH(dev) (unsigned long)(signed int)gsc_readl(dev->hpa.start + IO_IO_HIGH)
796
797static void walk_native_bus(unsigned long io_io_low, unsigned long io_io_high,
798                            struct device *parent);
799
800void walk_lower_bus(struct parisc_device *dev)
801{
802	unsigned long io_io_low, io_io_high;
803
804	if (!BUS_CONVERTER(dev) || IS_LOWER_PORT(dev))
805		return;
806
807	if (dev->id.hw_type == HPHW_IOA) {
808		io_io_low = (unsigned long)(signed int)(READ_IO_IO_LOW(dev) << 16);
809		io_io_high = io_io_low + MAX_NATIVE_DEVICES * NATIVE_DEVICE_OFFSET;
810	} else {
811		io_io_low = (READ_IO_IO_LOW(dev) + ~FLEX_MASK) & FLEX_MASK;
812		io_io_high = (READ_IO_IO_HIGH(dev)+ ~FLEX_MASK) & FLEX_MASK;
813	}
814
815	walk_native_bus(io_io_low, io_io_high, &dev->dev);
816}
817
818/**
819 * walk_native_bus -- Probe a bus for devices
820 * @io_io_low: Base address of this bus.
821 * @io_io_high: Last address of this bus.
822 * @parent: The parent bus device.
823 *
824 * A native bus (eg Runway or GSC) may have up to 64 devices on it,
825 * spaced at intervals of 0x1000 bytes.  PDC may not inform us of these
826 * devices, so we have to probe for them.  Unfortunately, we may find
827 * devices which are not physically connected (such as extra serial &
828 * keyboard ports).  This problem is not yet solved.
829 */
830static void walk_native_bus(unsigned long io_io_low, unsigned long io_io_high,
831                            struct device *parent)
832{
833	int i, devices_found = 0;
834	unsigned long hpa = io_io_low;
835	struct hardware_path path;
836
837	get_node_path(parent, &path);
838	do {
839		for(i = 0; i < MAX_NATIVE_DEVICES; i++, hpa += NATIVE_DEVICE_OFFSET) {
840			struct parisc_device *dev;
841
842			/* Was the device already added by Firmware? */
843			dev = find_device_by_addr(hpa);
844			if (!dev) {
845				path.mod = i;
846				dev = alloc_pa_dev(hpa, &path);
847				if (!dev)
848					continue;
849
850				register_parisc_device(dev);
851				devices_found++;
852			}
853			walk_lower_bus(dev);
854		}
855	} while(!devices_found && hpa < io_io_high);
856}
857
858#define CENTRAL_BUS_ADDR F_EXTEND(0xfff80000)
859
860/**
861 * walk_central_bus - Find devices attached to the central bus
862 *
863 * PDC doesn't tell us about all devices in the system.  This routine
864 * finds devices connected to the central bus.
865 */
866void walk_central_bus(void)
867{
868	walk_native_bus(CENTRAL_BUS_ADDR,
869			CENTRAL_BUS_ADDR + (MAX_NATIVE_DEVICES * NATIVE_DEVICE_OFFSET),
870			&root);
871}
872
873static void print_parisc_device(struct parisc_device *dev)
874{
875	char hw_path[64];
876	static int count;
877
878	print_pa_hwpath(dev, hw_path);
879	printk(KERN_INFO "%d. %s at 0x%p [%s] { %d, 0x%x, 0x%.3x, 0x%.5x }",
880		++count, dev->name, (void*) dev->hpa.start, hw_path, dev->id.hw_type,
881		dev->id.hversion_rev, dev->id.hversion, dev->id.sversion);
882
883	if (dev->num_addrs) {
884		int k;
885		printk(", additional addresses: ");
886		for (k = 0; k < dev->num_addrs; k++)
887			printk("0x%lx ", dev->addr[k]);
888	}
889	printk("\n");
890}
891
892/**
893 * init_parisc_bus - Some preparation to be done before inventory
894 */
895void init_parisc_bus(void)
896{
897	if (bus_register(&parisc_bus_type))
898		panic("Could not register PA-RISC bus type\n");
899	if (device_register(&root))
900		panic("Could not register PA-RISC root device\n");
901	get_device(&root);
902}
903
904
905static int print_one_device(struct device * dev, void * data)
906{
907	struct parisc_device * pdev = to_parisc_device(dev);
908
909	if (check_dev(dev))
910		print_parisc_device(pdev);
911	return 0;
912}
913
914/**
915 * print_parisc_devices - Print out a list of devices found in this system
916 */
917void print_parisc_devices(void)
918{
919	for_each_padev(print_one_device, NULL);
920}
921