can't find device_create funtion in a driver containing cdev (habanalabs)
Hello list members, In habanalabs' goya chip driver, (https://elixir.bootlin.com/linux/v5.4.21/source/drivers/misc/habanalabs/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?) Thank you! Chan Kim
On Wed, Apr 28, 2021 at 10:46:21PM +0900, ckim@etri.re.kr wrote:
Hello list members,
In habanalabs' goya chip driver, (https://elixir.bootlin.com/linux/v5.4.21/source/drivers/misc/habanalabs/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()
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@kroah.com> Sent: Thursday, April 29, 2021 3:32 AM To: ckim@etri.re.kr Cc: kernelnewbies@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@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()
On Thu, Apr 29, 2021 at 09:56:09AM +0900, ckim@etri.re.kr wrote:
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);
Right here is the line you are looking for. device_create() is a wrapper around a call to device_initialize() and device_add(). To use cdev_device_add() you have to have already called device_initialize() which the habannalabs code already did. Only on device_add() is the device really "added" to the driver core, and the uevents are sent out and lots of other stuff happens. device_create() wraps a lot of housekeeping logic up into a simpler call if your driver doesn't need that level of flexibility, but there is no requirement to call only it at all. Hope this helps, greg k-h
participants (3)
-
'Greg KH' -
ckim@etri.re.kr -
Greg KH