device_attr创建组用法

文章描述了一个与SC8989x芯片相关的驱动程序,涉及device_attribute中的addr_value读写功能,以及使用sysfs进行设备属性注册和注销的过程。
摘要由CSDN通过智能技术生成
 #define ip_debug(fmt, args...) do { \
    printk(KERN_INFO "[ip5310/E]%s:line: %d:"fmt"\n", __func__,__LINE__, ##args); \
} while (0)


static ssize_t addr_value_show(struct device *dev, struct device_attribute *attr, char *buf)
{
    struct sc8989x *sc = dev_get_drvdata(dev);
    u8 val;

    if (!sc)
        return -ENODEV;

    if (sc8989x_read_byte(sc, buf, &val))
        return -EIO;

    return sprintf(buf, "0x%X\n", val);
}


static ssize_t addr_value_store(struct device *dev,
            struct device_attribute *attr, const char *buf,
            size_t count)
{
    struct sc8989x *sc = dev_get_drvdata(dev);

    uint8_t reg_addr, data;
    ssize_t ret;


    if (sscanf(buf, "0x%hhx+0x%hhx", &reg_addr, &data) != 2) {
        fgu_err(" addr_value_store  Failed\n");
        return -EINVAL;
    }

    fgu_err("Register Address: 0x%x, Data: 0x%x\n", reg_addr, data);
    ret = sc8989x_write_byte(sc, reg_addr, data);
    if (ret < 0) {
        fgu_err(" addr_value write   Failed\n");
        return ret;
    }

    return count;
}

static DEVICE_ATTR(addr_value, S_IRUGO | S_IWUSR, addr_value_show, addr_value_store);

static struct attribute *sc8989x_attributes[] = {
    &dev_attr_addr_value.attr,
    NULL,
};


static const struct attribute_group sc8989x_attr_group = {
	.attrs = sc8989x_attributes,
};


ret = sysfs_create_group(&sc->dev->kobj, &sc8989x_attr_group);
if (ret){
    dev_err(sc->dev, "failed to register sysfs. err: %d\n", ret);
}


sysfs_remove_group(&sc->dev->kobj, &sc8989x_attr_group);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值