Skip to content
Snippets Groups Projects
pcie40_driver_common.c 1.01 KiB
#define P40_FMT "P40:%s(): "

#include "pcie40_driver_common.h"

int pcie40_setup_cdev(struct class *cls, struct cdev *cdev, dev_t dev_num, int minor, int bar, const char *dev_name, int dev_id, struct file_operations *fops)
{
  int rc = 0;
  char dev_name_full[16] = {0};

  snprintf(dev_name_full, sizeof(dev_name_full), "pcie40_%d_%s", dev_id, dev_name);

  pr_devel(P40_FMT "device_create /dev/%s BAR=%d MAJ=%d, MIN=%d\n", P40_PARM, dev_name_full, bar, MAJOR(dev_num), MINOR(dev_num)+minor);

  if (device_create(cls, NULL, MKDEV(MAJOR(dev_num), MINOR(dev_num)+minor), NULL, dev_name_full) == NULL){
    rc = -1;
    pr_devel(P40_FMT "device_create()\n", P40_PARM);
    goto err_device_create;
  }

  cdev_init(cdev, fops);
 
  rc = cdev_add(cdev, MKDEV(MAJOR(dev_num), MINOR(dev_num)+minor), 1);
  if (rc < 0){
    pr_devel(P40_FMT "cdev_add()\n", P40_PARM);
    goto err_cdev_add;
  }

  return 0;

err_cdev_add:
  device_destroy(cls, MKDEV(MAJOR(dev_num), MINOR(dev_num)+minor));
err_device_create:
//err_no_bar:
  return rc;
}