162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Virtual EISA root driver. 462306a36Sopenharmony_ci * Acts as a placeholder if we don't have a proper EISA bridge. 562306a36Sopenharmony_ci * 662306a36Sopenharmony_ci * (C) 2003 Marc Zyngier <maz@wild-wind.fr.eu.org> 762306a36Sopenharmony_ci */ 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include <linux/kernel.h> 1062306a36Sopenharmony_ci#include <linux/platform_device.h> 1162306a36Sopenharmony_ci#include <linux/eisa.h> 1262306a36Sopenharmony_ci#include <linux/module.h> 1362306a36Sopenharmony_ci#include <linux/moduleparam.h> 1462306a36Sopenharmony_ci#include <linux/init.h> 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci#if defined(CONFIG_ALPHA_JENSEN) || defined(CONFIG_EISA_VLB_PRIMING) 1762306a36Sopenharmony_ci#define EISA_FORCE_PROBE_DEFAULT 1 1862306a36Sopenharmony_ci#else 1962306a36Sopenharmony_ci#define EISA_FORCE_PROBE_DEFAULT 0 2062306a36Sopenharmony_ci#endif 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_cistatic int force_probe = EISA_FORCE_PROBE_DEFAULT; 2362306a36Sopenharmony_cistatic void virtual_eisa_release (struct device *); 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ci/* The default EISA device parent (virtual root device). 2662306a36Sopenharmony_ci * Now use a platform device, since that's the obvious choice. */ 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_cistatic struct platform_device eisa_root_dev = { 2962306a36Sopenharmony_ci .name = "eisa", 3062306a36Sopenharmony_ci .id = 0, 3162306a36Sopenharmony_ci .dev = { 3262306a36Sopenharmony_ci .release = virtual_eisa_release, 3362306a36Sopenharmony_ci }, 3462306a36Sopenharmony_ci}; 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_cistatic struct eisa_root_device eisa_bus_root = { 3762306a36Sopenharmony_ci .dev = &eisa_root_dev.dev, 3862306a36Sopenharmony_ci .bus_base_addr = 0, 3962306a36Sopenharmony_ci .res = &ioport_resource, 4062306a36Sopenharmony_ci .slots = EISA_MAX_SLOTS, 4162306a36Sopenharmony_ci .dma_mask = 0xffffffff, 4262306a36Sopenharmony_ci}; 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_cistatic void virtual_eisa_release (struct device *dev) 4562306a36Sopenharmony_ci{ 4662306a36Sopenharmony_ci /* nothing really to do here */ 4762306a36Sopenharmony_ci} 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_cistatic int __init virtual_eisa_root_init (void) 5062306a36Sopenharmony_ci{ 5162306a36Sopenharmony_ci int r; 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_ci if ((r = platform_device_register (&eisa_root_dev))) 5462306a36Sopenharmony_ci return r; 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_ci eisa_bus_root.force_probe = force_probe; 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_ci dev_set_drvdata(&eisa_root_dev.dev, &eisa_bus_root); 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_ci if (eisa_root_register (&eisa_bus_root)) { 6162306a36Sopenharmony_ci /* A real bridge may have been registered before 6262306a36Sopenharmony_ci * us. So quietly unregister. */ 6362306a36Sopenharmony_ci platform_device_unregister (&eisa_root_dev); 6462306a36Sopenharmony_ci return -1; 6562306a36Sopenharmony_ci } 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_ci return 0; 6862306a36Sopenharmony_ci} 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_cimodule_param (force_probe, int, 0444); 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_cidevice_initcall (virtual_eisa_root_init); 73