can't find device_create funtion in a driver containing cdev (habanalabs)

ckim at etri.re.kr ckim at etri.re.kr
Wed Apr 28 20:56:09 EDT 2021


Hi, Greg KH,

To me cdev_device_add seems to be calling only cdev_add(below). 
In this case since dev->devt already holds dev_t value ("hl%d"), it just
sets cdev_set_parent and cdev_add. 

int cdev_device_add(struct cdev *cdev, struct device *dev)
{       
    int rc = 0;
        
    if (dev->devt) {
        cdev_set_parent(cdev, &dev->kobj);

        rc = cdev_add(cdev, dev->devt, 1);
        if (rc)
            return rc;
    }   
    
    rc = device_add(dev);
    if (rc)
        cdev_del(cdev);

    return rc;
}

Are you sure cdev_device_add contains "device_create function"? Shouldn't
device_create be called after class_create?
Class_create is called much later inside the function device_cdev_sysfs_add
later in hl_device_init function(line 1238).

And device_cdev_sysfs_add contains this code. The hl_sysfs_init calls
device_add_groups which calls sysfs_create_groups.
Isn't this sysfs_create_groups function by any chance a group equivalent of
device_create function?

/* hl_sysfs_init() must be done after adding the device to the system */
    rc = hl_sysfs_init(hdev);
    if (rc) {
        dev_err(hdev->dev, "failed to initialize sysfs\n");
        goto delete_ctrl_cdev_device;
    }

    hdev->cdev_sysfs_created = true;

Thanks for helps and regards,

Chan Kim

> -----Original Message-----
> From: Greg KH <greg at kroah.com>
> Sent: Thursday, April 29, 2021 3:32 AM
> To: ckim at etri.re.kr
> Cc: kernelnewbies at kernelnewbies.org
> Subject: Re: can't find device_create funtion in a driver containing cdev
> (habanalabs)
> 
> On Wed, Apr 28, 2021 at 10:46:21PM +0900, ckim at etri.re.kr wrote:
> > Hello list members,
> >
> > In habanalabs' goya chip driver,
> > (https://elixir.bootlin.com/linux/v5.4.21/source/drivers/misc/habanala
> > bs/dev
> > ice.c#L1057)
> >
> > I can see cdev_init, cdev_add and class_create functions.
> >
> > Cdev_init is called insde device_init_cdev and cdev_add is called from
> > device_cdev_sysfs_add -> cdev_device_add.
> >
> > I can see class_create being called too. But I couldn't find
> > device_create function (which is used to make sysfs entry?)
> >
> > Can anyone tell me where device_create is called? (or where
> > alternative method is being used?)
> 
> Happens in the call to cdev_device_add()
> 







More information about the Kernelnewbies mailing list