将自己的sysfs设备属性组添加到现有标准设备类属性

时间:2018-09-12 21:43:33

标签: linux-kernel linux-device-driver sysfs

Linux内核培训课程的任务之一是向先前编写的设备驱动程序之一添加sysfs支持。我选择ds1307 rtc驱动程序,并想添加设备属性,而不是驱动程序属性。

但是我不确定我的解决方案是否正确。

在调用探测功能时,已经创建了i2c客户端设备,因此,任何对设备属性的操作都将导致竞争状态。 因此,我决定在设备注册之前将我的属性添加到rtc设备。我只计算默认的rtc属性组,为属性组分配一个额外的位置来分配新数组,然后用分配的数组替换rtc设备组指针。

static int ds1307x_probe(struct i2c_client *client,
    const struct i2c_device_id *id)
{
    struct device *dev;
    const struct attribute_group **grp, **ngrp;
    struct rtc_device *rtc;
    int ret, cnt;

    /* device presence check code skipped */

    dev = &client->dev;
    rtc = devm_rtc_allocate_device(dev);
    if (!rtc)
        return -ENOMEM;

    dev = &rtc->dev;
    grp = dev->groups;
    if (!grp) {
        /* no default groups, just use own groups array */
        dev->groups = ds1307x_groups;
    } else {
        /* copy rtc groups array, add own group at end */
        cnt = 0;
        while (grp[cnt])
            ++cnt;

        ngrp = devm_kmalloc(&rtc->dev, (cnt+2) * sizeof(*ngrp),
                            GFP_KERNEL);
        if (!ngrp)
            return -ENOMEM;

        memcpy(ngrp, grp, cnt * sizeof(*ngrp));
        ngrp[cnt] = &ds1307x_group;
        ngrp[cnt+1] = NULL;
        dev->groups = ngrp;
    }

    rtc->uie_unsupported = 1;
    rtc->ops = &ds1307x_ops;

    ret = rtc_register_device(rtc);

    /* remaining of code skipped */
}

具有属性ds1307x_controlclock_halt的属性组out_ctrl出现在标准rtc类属性中的rtc0设备目录中:

~ # ls /sys/class/rtc/rtc0/
date             ds1307x_control  name             subsystem
dev              hctosys          power            time
device           max_user_freq    since_epoch      uevent
~ # ls /sys/class/rtc/rtc0/ds1307x_control/
clock_halt  out_ctrl

此解决方案对我有用,我希望它对培训课程足够好。

那现实生活呢?有隐藏的问题吗?

0 个答案:

没有答案