]> rtime.felk.cvut.cz Git - zynq/linux.git/commitdiff
misc: xilinx-sdfec: Add IOCTL XSDFEC_SET_ORDER
authorDerek Kiernan <Derek.Kiernan@xilinx.com>
Thu, 15 Mar 2018 17:39:15 +0000 (17:39 +0000)
committerMichal Simek <michal.simek@xilinx.com>
Fri, 23 Mar 2018 14:52:02 +0000 (15:52 +0100)
Gives user ability to set the order, i.e. if data blocks sequence can
change from input to output.

Signed-off-by: Derek Kiernan <Derek.Kiernan@xilinx.com>
Signed-off-by: Michal Simek <michal.simek@xilinx.com>
drivers/misc/xilinx_sdfec.c
include/uapi/misc/xilinx_sdfec.h

index dcd29692b23dbe35ebfb9120655fdf6894ee1b2a..7b9fcff55f847cfb0d0f588a25c494c3d3e4ae77 100644 (file)
@@ -1030,6 +1030,35 @@ err_out:
        return err;
 }
 
+static int
+xsdfec_set_order(struct xsdfec_dev *xsdfec, enum xsdfec_order __user order)
+{
+       bool order_out_of_range;
+
+       order_out_of_range = (order <= XSDFEC_INVALID_ORDER) ||
+                            (order >= XSDFEC_ORDER_MAX);
+       if (order_out_of_range) {
+               dev_err(xsdfec->dev,
+                       "%s invalid order value %d for SDFEC%d",
+                       __func__, order, xsdfec->fec_id);
+               return -EINVAL;
+       }
+
+       /* Verify Device has not started */
+       if (xsdfec->state == XSDFEC_STARTED) {
+               dev_err(xsdfec->dev,
+                       "%s attempting to set Order while started for SDFEC%d",
+                       __func__, xsdfec->fec_id);
+               return -EIO;
+       }
+
+       xsdfec_regwrite(xsdfec, XSDFEC_ORDER_ADDR, (order - 1));
+
+       xsdfec->order = order;
+
+       return 0;
+}
+
 static int xsdfec_start(struct xsdfec_dev *xsdfec)
 {
        u32 regread;
@@ -1176,6 +1205,9 @@ xsdfec_dev_ioctl(struct file *fptr, unsigned int cmd, unsigned long data)
                        return rval;
                rval = xsdfec_get_ldpc_code_params(xsdfec, arg);
                break;
+       case XSDFEC_SET_ORDER:
+               rval = xsdfec_set_order(xsdfec, (enum xsdfec_order)data);
+               break;
        default:
                /* Should not get here */
                dev_err(xsdfec->dev, "Undefined SDFEC IOCTL");
index 1ef0b4fe16ee23f191e916dc0941895c5f64449c..7e1ca2081b412983594fd6a38613bee16ebb2e5a 100644 (file)
@@ -41,6 +41,7 @@ enum xsdfec_order {
        XSDFEC_INVALID_ORDER = 0,
        XSDFEC_MAINTAIN_ORDER,
        XSDFEC_OUT_OF_ORDER,
+       XSDFEC_ORDER_MAX,
 };
 
 enum xsdfec_state {
@@ -189,5 +190,7 @@ struct xsdfec_irq {
 /* ioctl that returns sdfec LDPC code param values, code_id must be specified */
 #define XSDFEC_GET_LDPC_CODE_PARAMS \
        _IOWR(XSDFEC_MAGIC, 9, struct xsdfec_ldpc_params *)
+/* ioctl that sets order, if order of blocks can change from input to output */
+#define XSDFEC_SET_ORDER       _IOW(XSDFEC_MAGIC, 10, enum xsdfec_order)
 
 #endif /* __XILINX_SDFEC_H__ */