platform device as parent of a miscdevice

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi all,

I have a driver that is bound to a platform device. It creates a
miscdevice to interact with user space. And it has a "global" structure
that stores info which are used throughout the driver. 

This works ok as far as I can see. The only issue is how to make the
"global" struct available to the miscdevice's file operations. Of
course, I can make the struct a global variable.

Recently, I realized that I could make the platform device the parent of
the miscdevice. I came up with something like

static int example_open(struct inode *inode, struct file *file)
{
    struct miscdevice *m = file->private_data;
    struct example_global_info *gbl =  dev_get_drvdata(m->parent);
    ...
}

static struct file_operations example_fops =
{
    .owner   = THIS_MODULE,
    .open    = example_open,
    ...
};

static struct miscdevice example_miscdev = {
    ...
    .fops  = &example_fops,
};

static int example_probe(struct platform_device *pdev)
{
    struct example_global_info *gbl = devm_kzalloc(&pdev->dev, ....);

    platform_set_drvdata(pdev, gbl);

    example_miscdev.parent = &pdev->dev;
    ret = misc_register(&example_miscdev);
    ...
}


Yet again, this seems to work ok. I was surprised to see that there's
very few (if any) mainline drivers that do something similar. Does this
approach make sense? Does it have any implications that I should be
aware of (e.g.  does the link between pdev and miscdevice cause problems
for suspend/resume)?

Thanks,
   Martin

_______________________________________________
Kernelnewbies mailing list
Kernelnewbies@xxxxxxxxxxxxxxxxx
https://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies



[Index of Archives]     [Newbies FAQ]     [Linux Kernel Mentors]     [Linux Kernel Development]     [IETF Annouce]     [Git]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux SCSI]     [Linux ACPI]

  Powered by Linux