18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0+ 28c2ecf20Sopenharmony_ci 38c2ecf20Sopenharmony_ci#include <linux/module.h> 48c2ecf20Sopenharmony_ci#include <asm/hardware.h> /* for register_parisc_driver() stuff */ 58c2ecf20Sopenharmony_ci#include <asm/parisc-device.h> 68c2ecf20Sopenharmony_ci#include "ipmi_si.h" 78c2ecf20Sopenharmony_ci 88c2ecf20Sopenharmony_cistatic bool parisc_registered; 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_cistatic int __init ipmi_parisc_probe(struct parisc_device *dev) 118c2ecf20Sopenharmony_ci{ 128c2ecf20Sopenharmony_ci struct si_sm_io io; 138c2ecf20Sopenharmony_ci 148c2ecf20Sopenharmony_ci memset(&io, 0, sizeof(io)); 158c2ecf20Sopenharmony_ci 168c2ecf20Sopenharmony_ci io.si_type = SI_KCS; 178c2ecf20Sopenharmony_ci io.addr_source = SI_DEVICETREE; 188c2ecf20Sopenharmony_ci io.addr_space = IPMI_MEM_ADDR_SPACE; 198c2ecf20Sopenharmony_ci io.addr_data = dev->hpa.start; 208c2ecf20Sopenharmony_ci io.regsize = 1; 218c2ecf20Sopenharmony_ci io.regspacing = 1; 228c2ecf20Sopenharmony_ci io.regshift = 0; 238c2ecf20Sopenharmony_ci io.irq = 0; /* no interrupt */ 248c2ecf20Sopenharmony_ci io.irq_setup = NULL; 258c2ecf20Sopenharmony_ci io.dev = &dev->dev; 268c2ecf20Sopenharmony_ci 278c2ecf20Sopenharmony_ci dev_dbg(&dev->dev, "addr 0x%lx\n", io.addr_data); 288c2ecf20Sopenharmony_ci 298c2ecf20Sopenharmony_ci return ipmi_si_add_smi(&io); 308c2ecf20Sopenharmony_ci} 318c2ecf20Sopenharmony_ci 328c2ecf20Sopenharmony_cistatic int __exit ipmi_parisc_remove(struct parisc_device *dev) 338c2ecf20Sopenharmony_ci{ 348c2ecf20Sopenharmony_ci return ipmi_si_remove_by_dev(&dev->dev); 358c2ecf20Sopenharmony_ci} 368c2ecf20Sopenharmony_ci 378c2ecf20Sopenharmony_cistatic const struct parisc_device_id ipmi_parisc_tbl[] __initconst = { 388c2ecf20Sopenharmony_ci { HPHW_MC, HVERSION_REV_ANY_ID, 0x004, 0xC0 }, 398c2ecf20Sopenharmony_ci { 0, } 408c2ecf20Sopenharmony_ci}; 418c2ecf20Sopenharmony_ci 428c2ecf20Sopenharmony_ciMODULE_DEVICE_TABLE(parisc, ipmi_parisc_tbl); 438c2ecf20Sopenharmony_ci 448c2ecf20Sopenharmony_cistatic struct parisc_driver ipmi_parisc_driver __refdata = { 458c2ecf20Sopenharmony_ci .name = "ipmi", 468c2ecf20Sopenharmony_ci .id_table = ipmi_parisc_tbl, 478c2ecf20Sopenharmony_ci .probe = ipmi_parisc_probe, 488c2ecf20Sopenharmony_ci .remove = __exit_p(ipmi_parisc_remove), 498c2ecf20Sopenharmony_ci}; 508c2ecf20Sopenharmony_ci 518c2ecf20Sopenharmony_civoid ipmi_si_parisc_init(void) 528c2ecf20Sopenharmony_ci{ 538c2ecf20Sopenharmony_ci register_parisc_driver(&ipmi_parisc_driver); 548c2ecf20Sopenharmony_ci parisc_registered = true; 558c2ecf20Sopenharmony_ci} 568c2ecf20Sopenharmony_ci 578c2ecf20Sopenharmony_civoid ipmi_si_parisc_shutdown(void) 588c2ecf20Sopenharmony_ci{ 598c2ecf20Sopenharmony_ci if (parisc_registered) 608c2ecf20Sopenharmony_ci unregister_parisc_driver(&ipmi_parisc_driver); 618c2ecf20Sopenharmony_ci} 62