dev_get_platdata dev_get_drvdata

  1. //dev_get_platdata和dev_get_drvdata获取的对象是不同的。

  2. //dev_get_platdata获取的是device结构体成员变量的void * platform_data。

  3. dev_get_drvdata获取的是device结构体void * driver_data。

  4. 另外有与dev_get_drvdata相对应的set函数dev_set_drvdata

  5. 只能直接给该platform_data赋值。

dev_get_drvdata(dev)用法1

  1. struct synaptics_rmi4_data *rmi4_data1 = dev_get_drvdata(dev);调用的如下函数

  2. static inline void *dev_get_drvdata(const struct device *dev)
    {
        return dev->driver_data;
    }

  3. 在这之前首先调用的如下函数进行设置的

  4.  

    static int synaptics_rmi4_probe(struct platform_device *pdev)
    {
        

        rmi4_data = kzalloc(sizeof(*rmi4_data), GFP_KERNEL);

        platform_set_drvdata(pdev, rmi4_data);

  5. ...................................................

  6. static inline void platform_set_drvdata(struct platform_device *pdev,
                        void *data)
    {
        dev_set_drvdata(&pdev->dev, data);
    }调用的如下函数

  7. static inline void dev_set_drvdata(struct device *dev, void *data)
    {
        dev->driver_data = data;
    }

dev_get_drvdata(dev)用法2

          struct led_classdev *led_cdev = dev_get_drvdata(dev);

  1. 在这之前首先调用的如下函数进行设置的

  2. int led_classdev_register(struct device *parent, struct led_classdev *led_cdev)
    {
        char name[64];
        int ret;

        ret = led_classdev_next_name(led_cdev->name, name, sizeof(name));
        if (ret < 0)
            return ret;

        led_cdev->dev = device_create_with_groups(leds_class, parent, 0,
                    led_cdev, led_cdev->groups, "%s", name);

  3. ............................................................

  4. struct device *device_create_with_groups(struct class *class,
                         struct device *parent, dev_t devt,
                         void *drvdata,
                         const struct attribute_group **groups,
                         const char *fmt, ...)
    {
        va_list vargs;
        struct device *dev;

        va_start(vargs, fmt);
        dev = device_create_groups_vargs(class, parent, devt, drvdata, groups,
                         fmt, vargs);
        va_end(vargs);
        return dev;
    }
    EXPORT_SYMBOL_GPL(device_create_with_groups);

  5. static struct device *device_create_groups_vargs(struct class *class, struct device *parent,
                   dev_t devt, void *drvdata,
                   const struct attribute_group **groups,
                   const char *fmt, va_list args)
    {
        struct device *dev = NULL;
        int retval = -ENODEV;

        if (class == NULL || IS_ERR(class))
            goto error;

        dev = kzalloc(sizeof(*dev), GFP_KERNEL);
        if (!dev) {
            retval = -ENOMEM;
            goto error;
        }

        device_initialize(dev);
        dev->devt = devt;
        dev->class = class;
        dev->parent = parent;
        dev->groups = groups;
        dev->release = device_create_release;
        dev_set_drvdata(dev, drvdata);

        retval = kobject_set_name_vargs(&dev->kobj, fmt, args);
        if (retval)
            goto error;

        retval = device_add(dev);
        if (retval)
            goto error;

        return dev;

    error:
        put_device(dev);
        return ERR_PTR(retval);
    }

     

     

  6.  

  7.  

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值