Linux 内核设备驱动之GPIO驱动之GPIO GPIO字符设备初始化

 
 
 

static void gpiochip_setup_devs(void) {  struct gpio_device *gdev;  int err;

 list_for_each_entry(gdev, &gpio_devices, list) {   err = gpiochip_setup_dev(gdev);   if (err)    pr_err("%s: Failed to initialize gpio device (%d)\n",           dev_name(&gdev->dev), err);  } }

 
static const struct file_operations gpio_fileops = {
 .release = gpio_chrdev_release,
 .open = gpio_chrdev_open,
 .owner = THIS_MODULE,
 .llseek = noop_llseek,
 .unlocked_ioctl = gpio_ioctl,
#ifdef CONFIG_COMPAT
 .compat_ioctl = gpio_ioctl_compat,
#endif
};
 

static int gpiochip_setup_dev(struct gpio_device *gdev) {  int status;

 cdev_init(&gdev->chrdev, &gpio_fileops);  gdev->chrdev.owner = THIS_MODULE;  gdev->chrdev.kobj.parent = &gdev->dev.kobj;  gdev->dev.devt = MKDEV(MAJOR(gpio_devt), gdev->id);  status = cdev_add(&gdev->chrdev, gdev->dev.devt, 1);  if (status < 0)   chip_warn(gdev->chip, "failed to add char device %d:%d\n",      MAJOR(gpio_devt), gdev->id);  else   chip_dbg(gdev->chip, "added GPIO chardev (%d:%d)\n",     MAJOR(gpio_devt), gdev->id);  status = device_add(&gdev->dev);  if (status)   goto err_remove_chardev;

 status = gpiochip_sysfs_register(gdev);  if (status)   goto err_remove_device;

 /* From this point, the .release() function cleans up gpio_device */  gdev->dev.release = gpiodevice_release;  pr_debug("%s: registered GPIOs %d to %d on device: %s (%s)\n",    __func__, gdev->base, gdev->base + gdev->ngpio - 1,    dev_name(&gdev->dev), gdev->chip->label ? : "generic");

 return 0;

err_remove_device:  device_del(&gdev->dev); err_remove_chardev:  cdev_del(&gdev->chrdev);  return status; }

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值