Re: [PATCH v5 06/16] rpmsg: move the rpmsg control device from rpmsg_char to rpmsg_ctrl

2021-03-03 Thread Mathieu Poirier
On Wed, Mar 03, 2021 at 03:59:34PM +0100, Arnaud POULIQUEN wrote:
> 
> 
> On 3/2/21 7:35 PM, Mathieu Poirier wrote:
> > On Fri, Feb 19, 2021 at 12:14:51PM +0100, Arnaud Pouliquen wrote:
> >> Move the code related to the rpmsg_ctrl char device to the new
> >> rpmsg_ctrl.c module.
> >> Manage the dependency in the kconfig.
> >>
> >> Signed-off-by: Arnaud Pouliquen 
> >> ---
> >>  drivers/rpmsg/Kconfig  |   9 ++
> >>  drivers/rpmsg/Makefile |   1 +
> >>  drivers/rpmsg/rpmsg_char.c | 163 
> >>  drivers/rpmsg/rpmsg_ctrl.c | 216 +
> >>  4 files changed, 226 insertions(+), 163 deletions(-)
> >>  create mode 100644 drivers/rpmsg/rpmsg_ctrl.c
> >>
> >> diff --git a/drivers/rpmsg/Kconfig b/drivers/rpmsg/Kconfig
> >> index 0b4407abdf13..2d0cd7fdd710 100644
> >> --- a/drivers/rpmsg/Kconfig
> >> +++ b/drivers/rpmsg/Kconfig
> >> @@ -10,11 +10,20 @@ config RPMSG_CHAR
> >>tristate "RPMSG device interface"
> >>depends on RPMSG
> >>depends on NET
> >> +  select RPMSG_CTRL
> >>help
> >>  Say Y here to export rpmsg endpoints as device files, usually found
> >>  in /dev. They make it possible for user-space programs to send and
> >>  receive rpmsg packets.
> >>  
> >> +config RPMSG_CTRL
> >> +  tristate "RPMSG control interface"
> >> +  depends on RPMSG
> >> +  help
> >> +Say Y here to enable the support of the /dev/rpmsg_ctlX API. This API
> > 
> > s/rpmsg_ctlX/rpmsg_ctrlX
> 
> Good catch!
> 
> > 
> >> +allows user-space programs to create endpoints with specific service 
> >> name,
> >> +source and destination addresses.
> >> +
> >>  config RPMSG_NS
> >>tristate "RPMSG name service announcement"
> >>depends on RPMSG
> >> diff --git a/drivers/rpmsg/Makefile b/drivers/rpmsg/Makefile
> >> index 8d452656f0ee..58e3b382e316 100644
> >> --- a/drivers/rpmsg/Makefile
> >> +++ b/drivers/rpmsg/Makefile
> >> @@ -1,6 +1,7 @@
> >>  # SPDX-License-Identifier: GPL-2.0
> >>  obj-$(CONFIG_RPMSG)   += rpmsg_core.o
> >>  obj-$(CONFIG_RPMSG_CHAR)  += rpmsg_char.o
> >> +obj-$(CONFIG_RPMSG_CTRL)  += rpmsg_ctrl.o
> >>  obj-$(CONFIG_RPMSG_NS)+= rpmsg_ns.o
> >>  obj-$(CONFIG_RPMSG_MTK_SCP)   += mtk_rpmsg.o
> >>  qcom_glink-objs   := qcom_glink_native.o qcom_glink_ssr.o
> >> diff --git a/drivers/rpmsg/rpmsg_char.c b/drivers/rpmsg/rpmsg_char.c
> >> index 23e369a00531..83c10b39b139 100644
> >> --- a/drivers/rpmsg/rpmsg_char.c
> >> +++ b/drivers/rpmsg/rpmsg_char.c
> >> @@ -31,28 +31,12 @@
> >>  static dev_t rpmsg_major;
> >>  static struct class *rpmsg_class;
> >>  
> >> -static DEFINE_IDA(rpmsg_ctrl_ida);
> >>  static DEFINE_IDA(rpmsg_ept_ida);
> >>  static DEFINE_IDA(rpmsg_minor_ida);
> >>  
> >>  #define dev_to_eptdev(dev) container_of(dev, struct rpmsg_eptdev, dev)
> >>  #define cdev_to_eptdev(i_cdev) container_of(i_cdev, struct rpmsg_eptdev, 
> >> cdev)
> >>  
> >> -#define dev_to_ctrldev(dev) container_of(dev, struct rpmsg_ctrldev, dev)
> >> -#define cdev_to_ctrldev(i_cdev) container_of(i_cdev, struct 
> >> rpmsg_ctrldev, cdev)
> >> -
> >> -/**
> >> - * struct rpmsg_ctrldev - control device for instantiating endpoint 
> >> devices
> >> - * @rpdev:underlaying rpmsg device
> >> - * @cdev: cdev for the ctrl device
> >> - * @dev:  device for the ctrl device
> >> - */
> >> -struct rpmsg_ctrldev {
> >> -  struct rpmsg_device *rpdev;
> >> -  struct cdev cdev;
> >> -  struct device dev;
> >> -};
> > 
> > This showed up in rpmsg_ctrl.c as rpmsg_ctrl.  The same goes for many 
> > functions
> > names - they are removed here and re-introduced under a different name, 
> > which
> > makes it very hard to follow.  What ends up in the new file should be a 
> > carbon
> > copy of what was moved.
> 
> Ok i will split it in 2 steps.

In most cases I don't think there is a need for a wholesale renaming exercise.
To me having a struct rpmsg_ctrldev and functions names such as
rpmsg_ctrldev_open() in a file called rpmsg_ctrl.c is perfectly acceptable.

> 
> Thanks
> Arnaud
> 
> > 
> > I'm out of time for today, more comments tomorrow.
> > 
> > Thanks,
> > Mathieu
> > 
> >> -
> >>  /**
> >>   * struct rpmsg_eptdev - endpoint device context
> >>   * @dev:  endpoint device
> >> @@ -411,145 +395,6 @@ int rpmsg_chrdev_create_eptdev(struct rpmsg_device 
> >> *rpdev, struct device *parent
> >>  }
> >>  EXPORT_SYMBOL(rpmsg_chrdev_create_eptdev);
> >>  
> >> -static int rpmsg_ctrldev_open(struct inode *inode, struct file *filp)
> >> -{
> >> -  struct rpmsg_ctrldev *ctrldev = cdev_to_ctrldev(inode->i_cdev);
> >> -
> >> -  get_device(&ctrldev->dev);
> >> -  filp->private_data = ctrldev;
> >> -
> >> -  return 0;
> >> -}
> >> -
> >> -static int rpmsg_ctrldev_release(struct inode *inode, struct file *filp)
> >> -{
> >> -  struct rpmsg_ctrldev *ctrldev = cdev_to_ctrldev(inode->i_cdev);
> >> -
> >> -  put_device(&ctrldev->dev);
> >> -
> >> -  return 0;
> >> -}
> >> -
> >> -static long rpmsg_ctrldev_ioctl(struct file 

Re: [PATCH v5 06/16] rpmsg: move the rpmsg control device from rpmsg_char to rpmsg_ctrl

2021-03-03 Thread Arnaud POULIQUEN



On 3/2/21 7:35 PM, Mathieu Poirier wrote:
> On Fri, Feb 19, 2021 at 12:14:51PM +0100, Arnaud Pouliquen wrote:
>> Move the code related to the rpmsg_ctrl char device to the new
>> rpmsg_ctrl.c module.
>> Manage the dependency in the kconfig.
>>
>> Signed-off-by: Arnaud Pouliquen 
>> ---
>>  drivers/rpmsg/Kconfig  |   9 ++
>>  drivers/rpmsg/Makefile |   1 +
>>  drivers/rpmsg/rpmsg_char.c | 163 
>>  drivers/rpmsg/rpmsg_ctrl.c | 216 +
>>  4 files changed, 226 insertions(+), 163 deletions(-)
>>  create mode 100644 drivers/rpmsg/rpmsg_ctrl.c
>>
>> diff --git a/drivers/rpmsg/Kconfig b/drivers/rpmsg/Kconfig
>> index 0b4407abdf13..2d0cd7fdd710 100644
>> --- a/drivers/rpmsg/Kconfig
>> +++ b/drivers/rpmsg/Kconfig
>> @@ -10,11 +10,20 @@ config RPMSG_CHAR
>>  tristate "RPMSG device interface"
>>  depends on RPMSG
>>  depends on NET
>> +select RPMSG_CTRL
>>  help
>>Say Y here to export rpmsg endpoints as device files, usually found
>>in /dev. They make it possible for user-space programs to send and
>>receive rpmsg packets.
>>  
>> +config RPMSG_CTRL
>> +tristate "RPMSG control interface"
>> +depends on RPMSG
>> +help
>> +  Say Y here to enable the support of the /dev/rpmsg_ctlX API. This API
> 
> s/rpmsg_ctlX/rpmsg_ctrlX

Good catch!

> 
>> +  allows user-space programs to create endpoints with specific service 
>> name,
>> +  source and destination addresses.
>> +
>>  config RPMSG_NS
>>  tristate "RPMSG name service announcement"
>>  depends on RPMSG
>> diff --git a/drivers/rpmsg/Makefile b/drivers/rpmsg/Makefile
>> index 8d452656f0ee..58e3b382e316 100644
>> --- a/drivers/rpmsg/Makefile
>> +++ b/drivers/rpmsg/Makefile
>> @@ -1,6 +1,7 @@
>>  # SPDX-License-Identifier: GPL-2.0
>>  obj-$(CONFIG_RPMSG) += rpmsg_core.o
>>  obj-$(CONFIG_RPMSG_CHAR)+= rpmsg_char.o
>> +obj-$(CONFIG_RPMSG_CTRL)+= rpmsg_ctrl.o
>>  obj-$(CONFIG_RPMSG_NS)  += rpmsg_ns.o
>>  obj-$(CONFIG_RPMSG_MTK_SCP) += mtk_rpmsg.o
>>  qcom_glink-objs := qcom_glink_native.o qcom_glink_ssr.o
>> diff --git a/drivers/rpmsg/rpmsg_char.c b/drivers/rpmsg/rpmsg_char.c
>> index 23e369a00531..83c10b39b139 100644
>> --- a/drivers/rpmsg/rpmsg_char.c
>> +++ b/drivers/rpmsg/rpmsg_char.c
>> @@ -31,28 +31,12 @@
>>  static dev_t rpmsg_major;
>>  static struct class *rpmsg_class;
>>  
>> -static DEFINE_IDA(rpmsg_ctrl_ida);
>>  static DEFINE_IDA(rpmsg_ept_ida);
>>  static DEFINE_IDA(rpmsg_minor_ida);
>>  
>>  #define dev_to_eptdev(dev) container_of(dev, struct rpmsg_eptdev, dev)
>>  #define cdev_to_eptdev(i_cdev) container_of(i_cdev, struct rpmsg_eptdev, 
>> cdev)
>>  
>> -#define dev_to_ctrldev(dev) container_of(dev, struct rpmsg_ctrldev, dev)
>> -#define cdev_to_ctrldev(i_cdev) container_of(i_cdev, struct rpmsg_ctrldev, 
>> cdev)
>> -
>> -/**
>> - * struct rpmsg_ctrldev - control device for instantiating endpoint devices
>> - * @rpdev:  underlaying rpmsg device
>> - * @cdev:   cdev for the ctrl device
>> - * @dev:device for the ctrl device
>> - */
>> -struct rpmsg_ctrldev {
>> -struct rpmsg_device *rpdev;
>> -struct cdev cdev;
>> -struct device dev;
>> -};
> 
> This showed up in rpmsg_ctrl.c as rpmsg_ctrl.  The same goes for many 
> functions
> names - they are removed here and re-introduced under a different name, which
> makes it very hard to follow.  What ends up in the new file should be a carbon
> copy of what was moved.

Ok i will split it in 2 steps.

Thanks
Arnaud

> 
> I'm out of time for today, more comments tomorrow.
> 
> Thanks,
> Mathieu
> 
>> -
>>  /**
>>   * struct rpmsg_eptdev - endpoint device context
>>   * @dev:endpoint device
>> @@ -411,145 +395,6 @@ int rpmsg_chrdev_create_eptdev(struct rpmsg_device 
>> *rpdev, struct device *parent
>>  }
>>  EXPORT_SYMBOL(rpmsg_chrdev_create_eptdev);
>>  
>> -static int rpmsg_ctrldev_open(struct inode *inode, struct file *filp)
>> -{
>> -struct rpmsg_ctrldev *ctrldev = cdev_to_ctrldev(inode->i_cdev);
>> -
>> -get_device(&ctrldev->dev);
>> -filp->private_data = ctrldev;
>> -
>> -return 0;
>> -}
>> -
>> -static int rpmsg_ctrldev_release(struct inode *inode, struct file *filp)
>> -{
>> -struct rpmsg_ctrldev *ctrldev = cdev_to_ctrldev(inode->i_cdev);
>> -
>> -put_device(&ctrldev->dev);
>> -
>> -return 0;
>> -}
>> -
>> -static long rpmsg_ctrldev_ioctl(struct file *fp, unsigned int cmd,
>> -unsigned long arg)
>> -{
>> -struct rpmsg_ctrldev *ctrldev = fp->private_data;
>> -void __user *argp = (void __user *)arg;
>> -struct rpmsg_endpoint_info eptinfo;
>> -struct rpmsg_channel_info chinfo;
>> -
>> -if (cmd != RPMSG_CREATE_EPT_IOCTL)
>> -return -EINVAL;
>> -
>> -if (copy_from_user(&eptinfo, argp, sizeof(eptinfo)))
>> -return -EFAULT;
>> -
>> -memcpy(chinfo.name, eptinfo.name, RPMSG_NAME_SIZE);
>> -chinfo.na

Re: [PATCH v5 06/16] rpmsg: move the rpmsg control device from rpmsg_char to rpmsg_ctrl

2021-03-02 Thread Mathieu Poirier
On Fri, Feb 19, 2021 at 12:14:51PM +0100, Arnaud Pouliquen wrote:
> Move the code related to the rpmsg_ctrl char device to the new
> rpmsg_ctrl.c module.
> Manage the dependency in the kconfig.
> 
> Signed-off-by: Arnaud Pouliquen 
> ---
>  drivers/rpmsg/Kconfig  |   9 ++
>  drivers/rpmsg/Makefile |   1 +
>  drivers/rpmsg/rpmsg_char.c | 163 
>  drivers/rpmsg/rpmsg_ctrl.c | 216 +
>  4 files changed, 226 insertions(+), 163 deletions(-)
>  create mode 100644 drivers/rpmsg/rpmsg_ctrl.c
> 
> diff --git a/drivers/rpmsg/Kconfig b/drivers/rpmsg/Kconfig
> index 0b4407abdf13..2d0cd7fdd710 100644
> --- a/drivers/rpmsg/Kconfig
> +++ b/drivers/rpmsg/Kconfig
> @@ -10,11 +10,20 @@ config RPMSG_CHAR
>   tristate "RPMSG device interface"
>   depends on RPMSG
>   depends on NET
> + select RPMSG_CTRL
>   help
> Say Y here to export rpmsg endpoints as device files, usually found
> in /dev. They make it possible for user-space programs to send and
> receive rpmsg packets.
>  
> +config RPMSG_CTRL
> + tristate "RPMSG control interface"
> + depends on RPMSG
> + help
> +   Say Y here to enable the support of the /dev/rpmsg_ctlX API. This API

s/rpmsg_ctlX/rpmsg_ctrlX

> +   allows user-space programs to create endpoints with specific service 
> name,
> +   source and destination addresses.
> +
>  config RPMSG_NS
>   tristate "RPMSG name service announcement"
>   depends on RPMSG
> diff --git a/drivers/rpmsg/Makefile b/drivers/rpmsg/Makefile
> index 8d452656f0ee..58e3b382e316 100644
> --- a/drivers/rpmsg/Makefile
> +++ b/drivers/rpmsg/Makefile
> @@ -1,6 +1,7 @@
>  # SPDX-License-Identifier: GPL-2.0
>  obj-$(CONFIG_RPMSG)  += rpmsg_core.o
>  obj-$(CONFIG_RPMSG_CHAR) += rpmsg_char.o
> +obj-$(CONFIG_RPMSG_CTRL) += rpmsg_ctrl.o
>  obj-$(CONFIG_RPMSG_NS)   += rpmsg_ns.o
>  obj-$(CONFIG_RPMSG_MTK_SCP)  += mtk_rpmsg.o
>  qcom_glink-objs  := qcom_glink_native.o qcom_glink_ssr.o
> diff --git a/drivers/rpmsg/rpmsg_char.c b/drivers/rpmsg/rpmsg_char.c
> index 23e369a00531..83c10b39b139 100644
> --- a/drivers/rpmsg/rpmsg_char.c
> +++ b/drivers/rpmsg/rpmsg_char.c
> @@ -31,28 +31,12 @@
>  static dev_t rpmsg_major;
>  static struct class *rpmsg_class;
>  
> -static DEFINE_IDA(rpmsg_ctrl_ida);
>  static DEFINE_IDA(rpmsg_ept_ida);
>  static DEFINE_IDA(rpmsg_minor_ida);
>  
>  #define dev_to_eptdev(dev) container_of(dev, struct rpmsg_eptdev, dev)
>  #define cdev_to_eptdev(i_cdev) container_of(i_cdev, struct rpmsg_eptdev, 
> cdev)
>  
> -#define dev_to_ctrldev(dev) container_of(dev, struct rpmsg_ctrldev, dev)
> -#define cdev_to_ctrldev(i_cdev) container_of(i_cdev, struct rpmsg_ctrldev, 
> cdev)
> -
> -/**
> - * struct rpmsg_ctrldev - control device for instantiating endpoint devices
> - * @rpdev:   underlaying rpmsg device
> - * @cdev:cdev for the ctrl device
> - * @dev: device for the ctrl device
> - */
> -struct rpmsg_ctrldev {
> - struct rpmsg_device *rpdev;
> - struct cdev cdev;
> - struct device dev;
> -};

This showed up in rpmsg_ctrl.c as rpmsg_ctrl.  The same goes for many functions
names - they are removed here and re-introduced under a different name, which
makes it very hard to follow.  What ends up in the new file should be a carbon
copy of what was moved.

I'm out of time for today, more comments tomorrow.

Thanks,
Mathieu

> -
>  /**
>   * struct rpmsg_eptdev - endpoint device context
>   * @dev: endpoint device
> @@ -411,145 +395,6 @@ int rpmsg_chrdev_create_eptdev(struct rpmsg_device 
> *rpdev, struct device *parent
>  }
>  EXPORT_SYMBOL(rpmsg_chrdev_create_eptdev);
>  
> -static int rpmsg_ctrldev_open(struct inode *inode, struct file *filp)
> -{
> - struct rpmsg_ctrldev *ctrldev = cdev_to_ctrldev(inode->i_cdev);
> -
> - get_device(&ctrldev->dev);
> - filp->private_data = ctrldev;
> -
> - return 0;
> -}
> -
> -static int rpmsg_ctrldev_release(struct inode *inode, struct file *filp)
> -{
> - struct rpmsg_ctrldev *ctrldev = cdev_to_ctrldev(inode->i_cdev);
> -
> - put_device(&ctrldev->dev);
> -
> - return 0;
> -}
> -
> -static long rpmsg_ctrldev_ioctl(struct file *fp, unsigned int cmd,
> - unsigned long arg)
> -{
> - struct rpmsg_ctrldev *ctrldev = fp->private_data;
> - void __user *argp = (void __user *)arg;
> - struct rpmsg_endpoint_info eptinfo;
> - struct rpmsg_channel_info chinfo;
> -
> - if (cmd != RPMSG_CREATE_EPT_IOCTL)
> - return -EINVAL;
> -
> - if (copy_from_user(&eptinfo, argp, sizeof(eptinfo)))
> - return -EFAULT;
> -
> - memcpy(chinfo.name, eptinfo.name, RPMSG_NAME_SIZE);
> - chinfo.name[RPMSG_NAME_SIZE-1] = '\0';
> - chinfo.src = eptinfo.src;
> - chinfo.dst = eptinfo.dst;
> -
> - return rpmsg_chrdev_create_eptdev(ctrldev->rpdev, &ctrldev->dev, 
> chinfo);
> -};
> -
> -static const stru

[PATCH v5 06/16] rpmsg: move the rpmsg control device from rpmsg_char to rpmsg_ctrl

2021-02-19 Thread Arnaud Pouliquen
Move the code related to the rpmsg_ctrl char device to the new
rpmsg_ctrl.c module.
Manage the dependency in the kconfig.

Signed-off-by: Arnaud Pouliquen 
---
 drivers/rpmsg/Kconfig  |   9 ++
 drivers/rpmsg/Makefile |   1 +
 drivers/rpmsg/rpmsg_char.c | 163 
 drivers/rpmsg/rpmsg_ctrl.c | 216 +
 4 files changed, 226 insertions(+), 163 deletions(-)
 create mode 100644 drivers/rpmsg/rpmsg_ctrl.c

diff --git a/drivers/rpmsg/Kconfig b/drivers/rpmsg/Kconfig
index 0b4407abdf13..2d0cd7fdd710 100644
--- a/drivers/rpmsg/Kconfig
+++ b/drivers/rpmsg/Kconfig
@@ -10,11 +10,20 @@ config RPMSG_CHAR
tristate "RPMSG device interface"
depends on RPMSG
depends on NET
+   select RPMSG_CTRL
help
  Say Y here to export rpmsg endpoints as device files, usually found
  in /dev. They make it possible for user-space programs to send and
  receive rpmsg packets.
 
+config RPMSG_CTRL
+   tristate "RPMSG control interface"
+   depends on RPMSG
+   help
+ Say Y here to enable the support of the /dev/rpmsg_ctlX API. This API
+ allows user-space programs to create endpoints with specific service 
name,
+ source and destination addresses.
+
 config RPMSG_NS
tristate "RPMSG name service announcement"
depends on RPMSG
diff --git a/drivers/rpmsg/Makefile b/drivers/rpmsg/Makefile
index 8d452656f0ee..58e3b382e316 100644
--- a/drivers/rpmsg/Makefile
+++ b/drivers/rpmsg/Makefile
@@ -1,6 +1,7 @@
 # SPDX-License-Identifier: GPL-2.0
 obj-$(CONFIG_RPMSG)+= rpmsg_core.o
 obj-$(CONFIG_RPMSG_CHAR)   += rpmsg_char.o
+obj-$(CONFIG_RPMSG_CTRL)   += rpmsg_ctrl.o
 obj-$(CONFIG_RPMSG_NS) += rpmsg_ns.o
 obj-$(CONFIG_RPMSG_MTK_SCP)+= mtk_rpmsg.o
 qcom_glink-objs:= qcom_glink_native.o qcom_glink_ssr.o
diff --git a/drivers/rpmsg/rpmsg_char.c b/drivers/rpmsg/rpmsg_char.c
index 23e369a00531..83c10b39b139 100644
--- a/drivers/rpmsg/rpmsg_char.c
+++ b/drivers/rpmsg/rpmsg_char.c
@@ -31,28 +31,12 @@
 static dev_t rpmsg_major;
 static struct class *rpmsg_class;
 
-static DEFINE_IDA(rpmsg_ctrl_ida);
 static DEFINE_IDA(rpmsg_ept_ida);
 static DEFINE_IDA(rpmsg_minor_ida);
 
 #define dev_to_eptdev(dev) container_of(dev, struct rpmsg_eptdev, dev)
 #define cdev_to_eptdev(i_cdev) container_of(i_cdev, struct rpmsg_eptdev, cdev)
 
-#define dev_to_ctrldev(dev) container_of(dev, struct rpmsg_ctrldev, dev)
-#define cdev_to_ctrldev(i_cdev) container_of(i_cdev, struct rpmsg_ctrldev, 
cdev)
-
-/**
- * struct rpmsg_ctrldev - control device for instantiating endpoint devices
- * @rpdev: underlaying rpmsg device
- * @cdev:  cdev for the ctrl device
- * @dev:   device for the ctrl device
- */
-struct rpmsg_ctrldev {
-   struct rpmsg_device *rpdev;
-   struct cdev cdev;
-   struct device dev;
-};
-
 /**
  * struct rpmsg_eptdev - endpoint device context
  * @dev:   endpoint device
@@ -411,145 +395,6 @@ int rpmsg_chrdev_create_eptdev(struct rpmsg_device 
*rpdev, struct device *parent
 }
 EXPORT_SYMBOL(rpmsg_chrdev_create_eptdev);
 
-static int rpmsg_ctrldev_open(struct inode *inode, struct file *filp)
-{
-   struct rpmsg_ctrldev *ctrldev = cdev_to_ctrldev(inode->i_cdev);
-
-   get_device(&ctrldev->dev);
-   filp->private_data = ctrldev;
-
-   return 0;
-}
-
-static int rpmsg_ctrldev_release(struct inode *inode, struct file *filp)
-{
-   struct rpmsg_ctrldev *ctrldev = cdev_to_ctrldev(inode->i_cdev);
-
-   put_device(&ctrldev->dev);
-
-   return 0;
-}
-
-static long rpmsg_ctrldev_ioctl(struct file *fp, unsigned int cmd,
-   unsigned long arg)
-{
-   struct rpmsg_ctrldev *ctrldev = fp->private_data;
-   void __user *argp = (void __user *)arg;
-   struct rpmsg_endpoint_info eptinfo;
-   struct rpmsg_channel_info chinfo;
-
-   if (cmd != RPMSG_CREATE_EPT_IOCTL)
-   return -EINVAL;
-
-   if (copy_from_user(&eptinfo, argp, sizeof(eptinfo)))
-   return -EFAULT;
-
-   memcpy(chinfo.name, eptinfo.name, RPMSG_NAME_SIZE);
-   chinfo.name[RPMSG_NAME_SIZE-1] = '\0';
-   chinfo.src = eptinfo.src;
-   chinfo.dst = eptinfo.dst;
-
-   return rpmsg_chrdev_create_eptdev(ctrldev->rpdev, &ctrldev->dev, 
chinfo);
-};
-
-static const struct file_operations rpmsg_ctrldev_fops = {
-   .owner = THIS_MODULE,
-   .open = rpmsg_ctrldev_open,
-   .release = rpmsg_ctrldev_release,
-   .unlocked_ioctl = rpmsg_ctrldev_ioctl,
-   .compat_ioctl = compat_ptr_ioctl,
-};
-
-static void rpmsg_ctrldev_release_device(struct device *dev)
-{
-   struct rpmsg_ctrldev *ctrldev = dev_to_ctrldev(dev);
-
-   ida_simple_remove(&rpmsg_ctrl_ida, dev->id);
-   ida_simple_remove(&rpmsg_minor_ida, MINOR(dev->devt));
-   cdev_del(&ctrldev->cdev);
-   kfree(ctrldev);
-}
-
-static int rpmsg_chrdev_probe(struct rpmsg_device