Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[PATCH] pc8736x_gpio: fix re-modprobe errors: fix/finish cdev-init

- Switch from register_chrdev() to (register|alloc)_chrdev_region().

- use a cdev. This was intended for original patchset, but was
overlooked.

We use a single cdev for all pins (minor device-numbers), as gleaned
from cs5535_gpio, and in contrast to whats currently done in scx200_gpio
(which I'll fix soon)

Signed-off-by: Jim Cromie <jim.cromie@gmail.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>

authored by

Jim Cromie and committed by
Linus Torvalds
babcfade 27385085

+15 -2
+15 -2
drivers/char/pc8736x_gpio.c
··· 259 259 260 260 static int __init pc8736x_gpio_init(void) 261 261 { 262 - int rc = 0; 262 + int rc; 263 + dev_t devid; 263 264 264 265 pdev = platform_device_alloc(DEVNAME, 0); 265 266 if (!pdev) ··· 308 307 } 309 308 dev_info(&pdev->dev, "GPIO ioport %x reserved\n", pc8736x_gpio_base); 310 309 311 - rc = register_chrdev(major, DEVNAME, &pc8736x_gpio_fops); 310 + if (major) { 311 + devid = MKDEV(major, 0); 312 + rc = register_chrdev_region(devid, PC8736X_GPIO_CT, DEVNAME); 313 + } else { 314 + rc = alloc_chrdev_region(&devid, 0, PC8736X_GPIO_CT, DEVNAME); 315 + major = MAJOR(devid); 316 + } 317 + 312 318 if (rc < 0) { 313 319 dev_err(&pdev->dev, "register-chrdev failed: %d\n", rc); 314 320 goto undo_request_region; ··· 326 318 } 327 319 328 320 pc8736x_init_shadow(); 321 + 322 + /* ignore minor errs, and succeed */ 323 + cdev_init(&pc8736x_gpio_cdev, &pc8736x_gpio_fops); 324 + cdev_add(&pc8736x_gpio_cdev, devid, PC8736X_GPIO_CT); 325 + 329 326 return 0; 330 327 331 328 undo_request_region: