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_control
和clock_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
此解决方案对我有用,我希望它对培训课程足够好。
那现实生活呢?有隐藏的问题吗?