1d1d24ed4SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only
21da177e4SLinus Torvalds /*
31da177e4SLinus Torvalds * Virtual EISA root driver.
41da177e4SLinus Torvalds * Acts as a placeholder if we don't have a proper EISA bridge.
51da177e4SLinus Torvalds *
61da177e4SLinus Torvalds * (C) 2003 Marc Zyngier <maz@wild-wind.fr.eu.org>
71da177e4SLinus Torvalds */
81da177e4SLinus Torvalds
91da177e4SLinus Torvalds #include <linux/kernel.h>
10d052d1beSRussell King #include <linux/platform_device.h>
111da177e4SLinus Torvalds #include <linux/eisa.h>
121da177e4SLinus Torvalds #include <linux/module.h>
131da177e4SLinus Torvalds #include <linux/moduleparam.h>
141da177e4SLinus Torvalds #include <linux/init.h>
151da177e4SLinus Torvalds
161da177e4SLinus Torvalds #if defined(CONFIG_ALPHA_JENSEN) || defined(CONFIG_EISA_VLB_PRIMING)
171da177e4SLinus Torvalds #define EISA_FORCE_PROBE_DEFAULT 1
181da177e4SLinus Torvalds #else
191da177e4SLinus Torvalds #define EISA_FORCE_PROBE_DEFAULT 0
201da177e4SLinus Torvalds #endif
211da177e4SLinus Torvalds
221da177e4SLinus Torvalds static int force_probe = EISA_FORCE_PROBE_DEFAULT;
231da177e4SLinus Torvalds static void virtual_eisa_release (struct device *);
241da177e4SLinus Torvalds
251da177e4SLinus Torvalds /* The default EISA device parent (virtual root device).
261da177e4SLinus Torvalds * Now use a platform device, since that's the obvious choice. */
271da177e4SLinus Torvalds
281da177e4SLinus Torvalds static struct platform_device eisa_root_dev = {
291da177e4SLinus Torvalds .name = "eisa",
301da177e4SLinus Torvalds .id = 0,
311da177e4SLinus Torvalds .dev = {
321da177e4SLinus Torvalds .release = virtual_eisa_release,
331da177e4SLinus Torvalds },
341da177e4SLinus Torvalds };
351da177e4SLinus Torvalds
361da177e4SLinus Torvalds static struct eisa_root_device eisa_bus_root = {
371da177e4SLinus Torvalds .dev = &eisa_root_dev.dev,
381da177e4SLinus Torvalds .bus_base_addr = 0,
391da177e4SLinus Torvalds .res = &ioport_resource,
401da177e4SLinus Torvalds .slots = EISA_MAX_SLOTS,
411da177e4SLinus Torvalds .dma_mask = 0xffffffff,
421da177e4SLinus Torvalds };
431da177e4SLinus Torvalds
virtual_eisa_release(struct device * dev)441da177e4SLinus Torvalds static void virtual_eisa_release (struct device *dev)
451da177e4SLinus Torvalds {
461da177e4SLinus Torvalds /* nothing really to do here */
471da177e4SLinus Torvalds }
481da177e4SLinus Torvalds
virtual_eisa_root_init(void)494a1ccb5bSAndrew Morton static int __init virtual_eisa_root_init (void)
501da177e4SLinus Torvalds {
511da177e4SLinus Torvalds int r;
521da177e4SLinus Torvalds
5391809d22SLadislav Michl if ((r = platform_device_register (&eisa_root_dev)))
541da177e4SLinus Torvalds return r;
551da177e4SLinus Torvalds
561da177e4SLinus Torvalds eisa_bus_root.force_probe = force_probe;
571da177e4SLinus Torvalds
584b9d0d3bSGreg Kroah-Hartman dev_set_drvdata(&eisa_root_dev.dev, &eisa_bus_root);
591da177e4SLinus Torvalds
601da177e4SLinus Torvalds if (eisa_root_register (&eisa_bus_root)) {
611da177e4SLinus Torvalds /* A real bridge may have been registered before
621da177e4SLinus Torvalds * us. So quietly unregister. */
631da177e4SLinus Torvalds platform_device_unregister (&eisa_root_dev);
641da177e4SLinus Torvalds return -1;
651da177e4SLinus Torvalds }
661da177e4SLinus Torvalds
671da177e4SLinus Torvalds return 0;
681da177e4SLinus Torvalds }
691da177e4SLinus Torvalds
701da177e4SLinus Torvalds module_param (force_probe, int, 0444);
711da177e4SLinus Torvalds
721da177e4SLinus Torvalds device_initcall (virtual_eisa_root_init);
73