162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0+ 262306a36Sopenharmony_ci 362306a36Sopenharmony_ci#include <linux/module.h> 462306a36Sopenharmony_ci#include <asm/hardware.h> /* for register_parisc_driver() stuff */ 562306a36Sopenharmony_ci#include <asm/parisc-device.h> 662306a36Sopenharmony_ci#include "ipmi_si.h" 762306a36Sopenharmony_ci 862306a36Sopenharmony_cistatic bool parisc_registered; 962306a36Sopenharmony_ci 1062306a36Sopenharmony_cistatic int __init ipmi_parisc_probe(struct parisc_device *dev) 1162306a36Sopenharmony_ci{ 1262306a36Sopenharmony_ci struct si_sm_io io; 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci memset(&io, 0, sizeof(io)); 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci io.si_type = SI_KCS; 1762306a36Sopenharmony_ci io.addr_source = SI_DEVICETREE; 1862306a36Sopenharmony_ci io.addr_space = IPMI_MEM_ADDR_SPACE; 1962306a36Sopenharmony_ci io.addr_data = dev->hpa.start; 2062306a36Sopenharmony_ci io.regsize = 1; 2162306a36Sopenharmony_ci io.regspacing = 1; 2262306a36Sopenharmony_ci io.regshift = 0; 2362306a36Sopenharmony_ci io.irq = 0; /* no interrupt */ 2462306a36Sopenharmony_ci io.irq_setup = NULL; 2562306a36Sopenharmony_ci io.dev = &dev->dev; 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci dev_dbg(&dev->dev, "addr 0x%lx\n", io.addr_data); 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci return ipmi_si_add_smi(&io); 3062306a36Sopenharmony_ci} 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_cistatic void __exit ipmi_parisc_remove(struct parisc_device *dev) 3362306a36Sopenharmony_ci{ 3462306a36Sopenharmony_ci ipmi_si_remove_by_dev(&dev->dev); 3562306a36Sopenharmony_ci} 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_cistatic const struct parisc_device_id ipmi_parisc_tbl[] __initconst = { 3862306a36Sopenharmony_ci { HPHW_MC, HVERSION_REV_ANY_ID, 0x004, 0xC0 }, 3962306a36Sopenharmony_ci { 0, } 4062306a36Sopenharmony_ci}; 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_ciMODULE_DEVICE_TABLE(parisc, ipmi_parisc_tbl); 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_cistatic struct parisc_driver ipmi_parisc_driver __refdata = { 4562306a36Sopenharmony_ci .name = "ipmi", 4662306a36Sopenharmony_ci .id_table = ipmi_parisc_tbl, 4762306a36Sopenharmony_ci .probe = ipmi_parisc_probe, 4862306a36Sopenharmony_ci .remove = __exit_p(ipmi_parisc_remove), 4962306a36Sopenharmony_ci}; 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_civoid ipmi_si_parisc_init(void) 5262306a36Sopenharmony_ci{ 5362306a36Sopenharmony_ci register_parisc_driver(&ipmi_parisc_driver); 5462306a36Sopenharmony_ci parisc_registered = true; 5562306a36Sopenharmony_ci} 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_civoid ipmi_si_parisc_shutdown(void) 5862306a36Sopenharmony_ci{ 5962306a36Sopenharmony_ci if (parisc_registered) 6062306a36Sopenharmony_ci unregister_parisc_driver(&ipmi_parisc_driver); 6162306a36Sopenharmony_ci} 62