confused by char dev registration in a gpio driver
Greg KH
greg at kroah.com
Tue May 3 18:06:00 EDT 2011
On Tue, May 03, 2011 at 05:21:11PM -0400, Robert P. J. Day wrote:
>
> i'm sure i'm going to embarrass myself here but i was perusing the
> char drivers for nice examples, and i ran across this excerpt in
> pc8736x_gpio.c:
>
> ===== begin =====
>
> if (major) {
> devid = MKDEV(major, 0);
> rc = register_chrdev_region(devid, PC8736X_GPIO_CT, DEVNAME);
> } else {
> rc = alloc_chrdev_region(&devid, 0, PC8736X_GPIO_CT, DEVNAME);
> major = MAJOR(devid);
> }
>
> if (rc < 0) {
> dev_err(&pdev->dev, "register-chrdev failed: %d\n", rc);
> goto undo_request_region;
> }
> if (!major) {
> major = rc;
> dev_dbg(&pdev->dev, "got dynamic major %d\n", major);
> }
>
> ===== end =====
>
> i'm good with most of that -- if the (parameter) major is explicit,
> then a dev_t of "devid" is created and register_chrdev_region() is
> used.
>
> on the other hand, if major is zero, then alloc_chrdev_region() is
> used for *dynamic* allocation of the major number. in both cases, the
> return code "rc" is saved and, if it's < 0, we have an error. and
> that's where the confusion comes in.
>
> i always thought both of those routines returned a simple zero to
> indicate success. but look at those last few lines -- that return
> code is assigned to "major", at which point it's *that* value that's
> printed. wouldn't that just be zero all the time?
>
> and wouldn't it also print that this was a "dynamic" major even if
> the user specified an explicit major number at load time? this second
> point is more nitpicky, but what about that first point? wouldn't a
> successful registration always print an allocated major number of
> zero?
I think you are right in that this code is wrong.
The chardev stuff is a mess, I keep meaning for years to clean it up.
Any proposals on a sane interface for this stuff is greatly appreciated.
thanks,
greg k-h
More information about the Kernelnewbies
mailing list