18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Virtual EISA root driver. 48c2ecf20Sopenharmony_ci * Acts as a placeholder if we don't have a proper EISA bridge. 58c2ecf20Sopenharmony_ci * 68c2ecf20Sopenharmony_ci * (C) 2003 Marc Zyngier <maz@wild-wind.fr.eu.org> 78c2ecf20Sopenharmony_ci */ 88c2ecf20Sopenharmony_ci 98c2ecf20Sopenharmony_ci#include <linux/kernel.h> 108c2ecf20Sopenharmony_ci#include <linux/platform_device.h> 118c2ecf20Sopenharmony_ci#include <linux/eisa.h> 128c2ecf20Sopenharmony_ci#include <linux/module.h> 138c2ecf20Sopenharmony_ci#include <linux/moduleparam.h> 148c2ecf20Sopenharmony_ci#include <linux/init.h> 158c2ecf20Sopenharmony_ci 168c2ecf20Sopenharmony_ci#if defined(CONFIG_ALPHA_JENSEN) || defined(CONFIG_EISA_VLB_PRIMING) 178c2ecf20Sopenharmony_ci#define EISA_FORCE_PROBE_DEFAULT 1 188c2ecf20Sopenharmony_ci#else 198c2ecf20Sopenharmony_ci#define EISA_FORCE_PROBE_DEFAULT 0 208c2ecf20Sopenharmony_ci#endif 218c2ecf20Sopenharmony_ci 228c2ecf20Sopenharmony_cistatic int force_probe = EISA_FORCE_PROBE_DEFAULT; 238c2ecf20Sopenharmony_cistatic void virtual_eisa_release (struct device *); 248c2ecf20Sopenharmony_ci 258c2ecf20Sopenharmony_ci/* The default EISA device parent (virtual root device). 268c2ecf20Sopenharmony_ci * Now use a platform device, since that's the obvious choice. */ 278c2ecf20Sopenharmony_ci 288c2ecf20Sopenharmony_cistatic struct platform_device eisa_root_dev = { 298c2ecf20Sopenharmony_ci .name = "eisa", 308c2ecf20Sopenharmony_ci .id = 0, 318c2ecf20Sopenharmony_ci .dev = { 328c2ecf20Sopenharmony_ci .release = virtual_eisa_release, 338c2ecf20Sopenharmony_ci }, 348c2ecf20Sopenharmony_ci}; 358c2ecf20Sopenharmony_ci 368c2ecf20Sopenharmony_cistatic struct eisa_root_device eisa_bus_root = { 378c2ecf20Sopenharmony_ci .dev = &eisa_root_dev.dev, 388c2ecf20Sopenharmony_ci .bus_base_addr = 0, 398c2ecf20Sopenharmony_ci .res = &ioport_resource, 408c2ecf20Sopenharmony_ci .slots = EISA_MAX_SLOTS, 418c2ecf20Sopenharmony_ci .dma_mask = 0xffffffff, 428c2ecf20Sopenharmony_ci}; 438c2ecf20Sopenharmony_ci 448c2ecf20Sopenharmony_cistatic void virtual_eisa_release (struct device *dev) 458c2ecf20Sopenharmony_ci{ 468c2ecf20Sopenharmony_ci /* nothing really to do here */ 478c2ecf20Sopenharmony_ci} 488c2ecf20Sopenharmony_ci 498c2ecf20Sopenharmony_cistatic int __init virtual_eisa_root_init (void) 508c2ecf20Sopenharmony_ci{ 518c2ecf20Sopenharmony_ci int r; 528c2ecf20Sopenharmony_ci 538c2ecf20Sopenharmony_ci if ((r = platform_device_register (&eisa_root_dev))) 548c2ecf20Sopenharmony_ci return r; 558c2ecf20Sopenharmony_ci 568c2ecf20Sopenharmony_ci eisa_bus_root.force_probe = force_probe; 578c2ecf20Sopenharmony_ci 588c2ecf20Sopenharmony_ci dev_set_drvdata(&eisa_root_dev.dev, &eisa_bus_root); 598c2ecf20Sopenharmony_ci 608c2ecf20Sopenharmony_ci if (eisa_root_register (&eisa_bus_root)) { 618c2ecf20Sopenharmony_ci /* A real bridge may have been registered before 628c2ecf20Sopenharmony_ci * us. So quietly unregister. */ 638c2ecf20Sopenharmony_ci platform_device_unregister (&eisa_root_dev); 648c2ecf20Sopenharmony_ci return -1; 658c2ecf20Sopenharmony_ci } 668c2ecf20Sopenharmony_ci 678c2ecf20Sopenharmony_ci return 0; 688c2ecf20Sopenharmony_ci} 698c2ecf20Sopenharmony_ci 708c2ecf20Sopenharmony_cimodule_param (force_probe, int, 0444); 718c2ecf20Sopenharmony_ci 728c2ecf20Sopenharmony_cidevice_initcall (virtual_eisa_root_init); 73