drivers/char/ipmi/ipmi_si_platform.c
Source file repositories/reference/linux-study-clean/drivers/char/ipmi/ipmi_si_platform.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/char/ipmi/ipmi_si_platform.c- Extension
.c- Size
- 11112 bytes
- Lines
- 467
- Domain
- Driver Families
- Bucket
- drivers/char
- Inferred role
- Driver Families: implementation source
- Status
- source implementation candidate
Why This File Exists
Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/types.hlinux/module.hlinux/of.hlinux/of_address.hlinux/of_irq.hlinux/platform_device.hlinux/property.hlinux/acpi.hipmi_si.hipmi_dmi.h
Detected Declarations
function ipmi_acpi_gpefunction acpi_gpe_irq_cleanupfunction acpi_gpe_irq_setupfunction ipmi_set_addr_data_and_spacefunction ipmi_get_info_from_resourcesfunction platform_ipmi_probefunction of_ipmi_probefunction of_ipmi_probefunction find_slave_addressfunction acpi_ipmi_probefunction acpi_ipmi_probefunction ipmi_probefunction ipmi_removefunction pdev_match_namefunction ipmi_remove_platform_device_by_namefunction ipmi_si_platform_initfunction ipmi_si_platform_shutdown
Annotated Snippet
if (irq > 0) {
io.irq = irq;
io.irq_setup = ipmi_std_irq_setup;
}
}
io.slave_addr = find_slave_address(&io, io.slave_addr);
dev_info(dev, "%pR regsize %d spacing %d irq %d\n",
res, io.regsize, io.regspacing, io.irq);
request_module_nowait("acpi_ipmi");
return ipmi_si_add_smi(&io);
}
static const struct acpi_device_id acpi_ipmi_match[] = {
{ "IPI0001", 0 },
{ },
};
MODULE_DEVICE_TABLE(acpi, acpi_ipmi_match);
#else
static int acpi_ipmi_probe(struct platform_device *dev)
{
return -ENODEV;
}
#endif
static int ipmi_probe(struct platform_device *pdev)
{
if (pdev->dev.of_node && of_ipmi_probe(pdev) == 0)
return 0;
if (acpi_ipmi_probe(pdev) == 0)
return 0;
return platform_ipmi_probe(pdev);
}
static void ipmi_remove(struct platform_device *pdev)
{
ipmi_si_remove_by_dev(&pdev->dev);
}
static int pdev_match_name(struct device *dev, const void *data)
{
struct platform_device *pdev = to_platform_device(dev);
const char *name = data;
return strcmp(pdev->name, name) == 0;
}
void ipmi_remove_platform_device_by_name(char *name)
{
struct device *dev;
while ((dev = bus_find_device(&platform_bus_type, NULL, name,
pdev_match_name))) {
struct platform_device *pdev = to_platform_device(dev);
platform_device_unregister(pdev);
put_device(dev);
}
}
static const struct platform_device_id si_plat_ids[] = {
{ "dmi-ipmi-si", 0 },
{ "hardcode-ipmi-si", 0 },
{ "hotmod-ipmi-si", 0 },
{ }
};
struct platform_driver ipmi_platform_driver = {
.driver = {
.name = SI_DEVICE_NAME,
.of_match_table = of_ipmi_match,
.acpi_match_table = ACPI_PTR(acpi_ipmi_match),
},
.probe = ipmi_probe,
.remove = ipmi_remove,
.id_table = si_plat_ids
};
void ipmi_si_platform_init(void)
{
int rv = platform_driver_register(&ipmi_platform_driver);
if (rv)
pr_err("Unable to register driver: %d\n", rv);
else
platform_registered = true;
Annotation
- Immediate include surface: `linux/types.h`, `linux/module.h`, `linux/of.h`, `linux/of_address.h`, `linux/of_irq.h`, `linux/platform_device.h`, `linux/property.h`, `linux/acpi.h`.
- Detected declarations: `function ipmi_acpi_gpe`, `function acpi_gpe_irq_cleanup`, `function acpi_gpe_irq_setup`, `function ipmi_set_addr_data_and_space`, `function ipmi_get_info_from_resources`, `function platform_ipmi_probe`, `function of_ipmi_probe`, `function of_ipmi_probe`, `function find_slave_address`, `function acpi_ipmi_probe`.
- Atlas domain: Driver Families / drivers/char.
- Implementation status: source implementation candidate.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.