linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Dragan Cvetic <dragan.cvetic@xilinx.com>
To: <arnd@arndb.de>, <gregkh@linuxfoundation.org>,
	<michal.simek@xilinx.com>, <linux-arm-kernel@lists.infradead.org>
Cc: <linux-kernel@vger.kernel.org>,
	Dragan Cvetic <dragan.cvetic@xilinx.com>,
	Derek Kiernan <derek.kiernan@xilinx.com>
Subject: [PATCH 04/12] misc: xilinx_sdfec: Add open, close and ioctl
Date: Tue, 19 Mar 2019 12:04:16 +0000	[thread overview]
Message-ID: <1552997064-432700-5-git-send-email-dragan.cvetic@xilinx.com> (raw)
In-Reply-To: <1552997064-432700-1-git-send-email-dragan.cvetic@xilinx.com>

Add char device interface per DT node present and support
file operations:
- open(), which keeps only one open per device at a time,
- close(), which release the open for this device,
- ioctl(), which provides infrastructure for a specific driver
control.

Reviewed-by: Michal Simek <michal.simek@xilinx.com>
Tested-by: Dragan Cvetic <dragan.cvetic@xilinx.com>
Signed-off-by: Derek Kiernan <derek.kiernan@xilinx.com>
Signed-off-by: Dragan Cvetic <dragan.cvetic@xilinx.com>
---
 drivers/misc/xilinx_sdfec.c      | 79 ++++++++++++++++++++++++++++++++++++++++
 include/uapi/misc/xilinx_sdfec.h |  4 ++
 2 files changed, 83 insertions(+)

diff --git a/drivers/misc/xilinx_sdfec.c b/drivers/misc/xilinx_sdfec.c
index a52a5c6..3407de4 100644
--- a/drivers/misc/xilinx_sdfec.c
+++ b/drivers/misc/xilinx_sdfec.c
@@ -81,8 +81,87 @@ struct xsdfec_dev {
        struct xsdfec_clks clks;
 };

+static int xsdfec_dev_open(struct inode *iptr, struct file *fptr)
+{
+       struct xsdfec_dev *xsdfec;
+
+       xsdfec = container_of(iptr->i_cdev, struct xsdfec_dev, xsdfec_cdev);
+       if (!xsdfec)
+               return -EAGAIN;
+
+       /* Only one open per device at a time */
+       if (!atomic_dec_and_test(&xsdfec->open_count)) {
+               atomic_inc(&xsdfec->open_count);
+               return -EBUSY;
+       }
+
+       fptr->private_data = xsdfec;
+       return 0;
+}
+
+static int xsdfec_dev_release(struct inode *iptr, struct file *fptr)
+{
+       struct xsdfec_dev *xsdfec;
+
+       xsdfec = container_of(iptr->i_cdev, struct xsdfec_dev, xsdfec_cdev);
+       if (!xsdfec)
+               return -EAGAIN;
+
+       atomic_inc(&xsdfec->open_count);
+       return 0;
+}
+
+static long xsdfec_dev_ioctl(struct file *fptr, unsigned int cmd,
+                            unsigned long data)
+{
+       struct xsdfec_dev *xsdfec = fptr->private_data;
+       void __user *arg = NULL;
+       int rval = -EINVAL;
+       int err = 0;
+
+       if (!xsdfec)
+               return rval;
+
+       if (_IOC_TYPE(cmd) != XSDFEC_MAGIC) {
+               dev_err(xsdfec->dev, "Not a xilinx sdfec ioctl");
+               return -ENOTTY;
+       }
+
+       /* check if ioctl argument is present and valid */
+       if (_IOC_DIR(cmd) != _IOC_NONE) {
+               arg = (void __user *)data;
+               if (!arg) {
+                       dev_err(xsdfec->dev,
+                               "xilinx sdfec ioctl argument is NULL Pointer");
+                       return rval;
+               }
+       }
+
+       /* Access check of the argument if present */
+       if (_IOC_DIR(cmd) & _IOC_READ)
+               err = !access_ok((void *)arg, _IOC_SIZE(cmd));
+       else if (_IOC_DIR(cmd) & _IOC_WRITE)
+               err = !access_ok((void *)arg, _IOC_SIZE(cmd));
+
+       if (err) {
+               dev_err(xsdfec->dev, "Invalid xilinx sdfec ioctl argument");
+               return -EFAULT;
+       }
+
+       switch (cmd) {
+       default:
+               /* Should not get here */
+               dev_err(xsdfec->dev, "Undefined SDFEC IOCTL");
+               break;
+       }
+       return rval;
+}
+
 static const struct file_operations xsdfec_fops = {
        .owner = THIS_MODULE,
+       .open = xsdfec_dev_open,
+       .release = xsdfec_dev_release,
+       .unlocked_ioctl = xsdfec_dev_ioctl,
 };

 static int xsdfec_clk_init(struct platform_device *pdev,
diff --git a/include/uapi/misc/xilinx_sdfec.h b/include/uapi/misc/xilinx_sdfec.h
index 5543163..5de0add 100644
--- a/include/uapi/misc/xilinx_sdfec.h
+++ b/include/uapi/misc/xilinx_sdfec.h
@@ -39,4 +39,8 @@ struct xsdfec_config {
        s32 fec_id;
 };

+/*
+ * XSDFEC IOCTL List
+ */
+#define XSDFEC_MAGIC 'f'
 #endif /* __XILINX_SDFEC_H__ */
--
2.7.4

This email and any attachments are intended for the sole use of the named recipient(s) and contain(s) confidential information that may be proprietary, privileged or copyrighted under applicable law. If you are not the intended recipient, do not read, copy, or forward this email message or any attachments. Delete this email message and any attachments immediately.

  parent reply	other threads:[~2019-03-19 12:04 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-03-19 12:04 [PATCH 00/12] misc: xilinx sd-fec driver Dragan Cvetic
2019-03-19 12:04 ` [PATCH 01/12] dt-bindings: xilinx-sdfec: Add SDFEC binding Dragan Cvetic
2019-03-19 12:04 ` [PATCH 02/12] misc: xilinx-sdfec: add core driver Dragan Cvetic
2019-03-19 12:04 ` [PATCH 03/12] misc: xilinx_sdfec: Add CCF support Dragan Cvetic
2019-03-19 12:04 ` Dragan Cvetic [this message]
2019-03-19 13:17   ` [PATCH 04/12] misc: xilinx_sdfec: Add open, close and ioctl Arnd Bergmann
2019-03-19 14:59     ` Dragan Cvetic
2019-03-19 15:36       ` Arnd Bergmann
2019-03-19 18:10         ` Dragan Cvetic
2019-03-19 19:46           ` Arnd Bergmann
2019-04-09  8:35             ` Dragan Cvetic
2019-03-19 12:04 ` [PATCH 05/12] misc: xilinx_sdfec: Store driver config and state Dragan Cvetic
2019-03-19 12:04 ` [PATCH 06/12] misc: xilinx_sdfec: Add ability to configure turbo mode Dragan Cvetic
2019-03-19 12:04 ` [PATCH 07/12] misc: xilinx_sdfec: Add ability to configure LDPC Dragan Cvetic
2019-03-19 12:04 ` [PATCH 08/12] misc: xilinx_sdfec: Add ability to get/set config Dragan Cvetic
2019-03-19 13:05   ` Arnd Bergmann
2019-03-19 14:02     ` Dragan Cvetic
2019-03-19 12:04 ` [PATCH 09/12] misc: xilinx_sdfec: Support poll file operation Dragan Cvetic
2019-03-19 12:04 ` [PATCH 10/12] misc: xilinx_sdfec: Add stats & status ioctls Dragan Cvetic
2019-03-19 12:04 ` [PATCH 11/12] Docs: misc: xilinx_sdfec: Add documentation Dragan Cvetic
2019-03-19 12:04 ` [PATCH 12/12] MAINTAINERS: add maintainer for SD-FEC support Dragan Cvetic
2019-03-19 12:17 ` [PATCH 00/12] misc: xilinx sd-fec driver Michal Simek
2019-03-19 13:44   ` Dragan Cvetic
2019-03-19 13:51     ` Michal Simek
2019-03-19 13:55       ` Dragan Cvetic

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1552997064-432700-5-git-send-email-dragan.cvetic@xilinx.com \
    --to=dragan.cvetic@xilinx.com \
    --cc=arnd@arndb.de \
    --cc=derek.kiernan@xilinx.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=michal.simek@xilinx.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).