mcpField
P
platform-device-model

platform-device-model

github.com/mohitmishra786Development269298 installsUpdated 18w ago
Repository

About platform-device-model

A skill for Linux driver developers working with platform devices. It explains the device-driver lifecycle, resource handling, sysfs, and deferred probe, connecting device-tree descriptions to driver code.

Key features

  1. 01Platform device and driver lifecycle
  2. 02Probe and remove handling
  3. 03Resource acquisition with devm helpers
  4. 04Device properties from DT and ACPI
  5. 05Sysfs attributes and deferred probe
  6. 06Debugging with sysfs and udevadm

Use cases

  1. 01Implementing or debugging a platform_driver
  2. 02Converting a board-file driver to a DT platform driver
  3. 03Exposing driver state through sysfs
  4. 04Diagnosing deferred probes and resource conflicts

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/mohitmishra786/low-level-dev-skills --skill platform-device-model

After installing, type/platform-device-modelin Claude Code to confirm it loaded.

Details

From the project README

Platform Device Model

Purpose

Explain the Linux driver model for platform (and similar) buses: struct device, device_driver, probe/remove, resource acquisition, sysfs, and deferred probe — the glue between device tree and driver code.

When to Use

  • Implementing or debugging platform_driver lifecycle
  • Exposing driver state via sysfs
  • Understanding uevent / udev device node creation
  • Before skills/kernel-dev/writing-char-drivers

Workflow

1. Object hierarchy
bus_type (platform, amba, pci, i2c, spi)
├── struct device        — hardware instance
└── struct device_driver — driver logic
        └── probe(dev) / remove(dev)

Platform devices often come from DT (of_platform) or legacy board files.

2. Platform driver skeleton
static int my_probe(struct platform_device *pdev)
{
    struct resource *res;
    void __iomem *base;

    res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
    base = devm_ioremap_resource(&pdev->dev, res);
    if (IS_ERR(base))
        return PTR_ERR(base);

    platform_set_drvdata(pdev, priv);
    return 0;
}

static void my_remove(struct platform_device *pdev)
{
    /* devm_* auto-cleanup on remove */
}

static struct platform_driver my_pdrv = {
    .probe  = my_probe,
    .remove = my_remove,
    .driver = {
        .name = "my-dev",
        .of_match_table = my_of_match,
    },
};
module_platform_driver(my_pdrv);

Prefer devm_* helpers for automatic unwind.

3. Device properties (DT / ACPI)
u32 speed;
device_property_read_u32(&pdev->dev, "clock-speed", &speed);
bool flag = device_property_present(&pdev->dev, "feature-x");
4. Sysfs (driver visibility)
static ssize_t status_show(struct device *dev,
                           struct device_attribute *attr, char *buf)
{
    return sysfs_emit(buf, "ok\n");
}
static DEVICE_ATTR_RO(status);

/* in probe */
device_create_file(&pdev->dev, &dev_attr_status);
5. Deferred probe

Return -EPROBE_DEFER when a clock, regulator, or bus is not ready — core retries later.

6. Debug
ls /sys/bus/platform/devices/
ls /sys/bus/platform/drivers/
cat /sys/kernel/debug/devices_deferred  # if debugfs enabled
udevadm monitor
7. Agent usage
/platform-device-model Convert legacy board file driver to DT platform_driver with devm_ioremap

Common Problems

SymptomCauseFix
-EBUSY on probeResource claimed twiceCheck status / duplicate nodes
No /dev nodeChar device not registeredSee writing-char-drivers
Deferred foreverSupplier driver missingFix DT dependency chain
Remove crashManual free vs devm mismatchUse devm consistently
Name mismatch.name vs compatibleOF uses of_match_table

Related Skills

  • skills/kernel-dev/device-tree — hardware description
  • skills/kernel/device-drivers — IRQ, DMA, regmap depth
  • skills/kernel-dev/writing-char-drivers — userspace interface
  • skills/kernel-dev/bus-drivers-i2c-spi — other bus types
  • skills/low-level-programming/linux-kernel-modules — module loading

Comments

Markdown supported