On Tue, Nov 28, 2017 at 08:29:22AM +0100, Christophe LEROY wrote: > Hi, thanks for your answwer, > > Le 27/11/2017 à 17:38, Matthew Wilcox a écrit : > > On Mon, Nov 27, 2017 at 04:18:42PM +0100, Christophe LEROY wrote: > > > When registering a device node with device_create(), it is possible to pass > > > a drvdata pointer. > > > > > > How can I retrieve that drvdata pointer from the open() fops ? I've not been > > > able to find any exemple. > > > > You're not supposed to do it that way ... assuming you're talking about > > a character device, you embed the cdev in your own data structure and > > do this: > > > > struct my_struct *my = container_of(inode->i_cdev, struct my_struct, cdev); > > > > after calling: > > > > cdev_init(&my->cdev, &my_dev_fops); > > > > You'll use the drvdata when trying to go from the struct device to > > 'my_struct'. There's no struct device in struct cdev. I mean, you > > could probably get to it, but it's easier if you just do it the way that > > everybody else does it. > > > > I see, you are right I'm talking about a character device. > > The driver I'm trying to clean is using __register_chrdev() which hides cdev > and cdev operations. Does it mean it has to be changed to do cdev operations > explicitely ? If you want to get access to that, probably. The cdev interface is messy and tricky and can be used in about 5 different ways right now. It's all up to what you need to do with it as to how to use it. Have a pointer to your code somewhere? thanks, greg k-h