]> rtime.felk.cvut.cz Git - zynq/linux.git/blobdiff - drivers/misc/xilinx_sdfec.c
misc: xilinx-sdfec: Add BYPASS IOCTLs
[zynq/linux.git] / drivers / misc / xilinx_sdfec.c
index 4587903cbb3f12adbe9d45ca52663a694669ec36..ee26e941d0501dcacd747c794714f4abef012218 100644 (file)
@@ -1061,6 +1061,29 @@ xsdfec_set_order(struct xsdfec_dev *xsdfec, enum xsdfec_order __user order)
        return 0;
 }
 
+static int
+xsdfec_set_bypass(struct xsdfec_dev *xsdfec, unsigned long bypass)
+{
+       if (bypass > 1) {
+               dev_err(xsdfec->dev,
+                       "%s invalid bypass value %ld for SDFEC%d",
+                       __func__, bypass, xsdfec->fec_id);
+               return -EINVAL;
+       }
+
+       /* Verify Device has not started */
+       if (xsdfec->state == XSDFEC_STARTED) {
+               dev_err(xsdfec->dev,
+                       "%s attempting to set bypass while started for SDFEC%d",
+                       __func__, xsdfec->fec_id);
+               return -EIO;
+       }
+
+       xsdfec_regwrite(xsdfec, XSDFEC_BYPASS_ADDR, bypass);
+
+       return 0;
+}
+
 static int xsdfec_start(struct xsdfec_dev *xsdfec)
 {
        u32 regread;
@@ -1216,6 +1239,9 @@ xsdfec_dev_ioctl(struct file *fptr, unsigned int cmd, unsigned long data)
        case XSDFEC_SET_ORDER:
                rval = xsdfec_set_order(xsdfec, (enum xsdfec_order)data);
                break;
+       case XSDFEC_SET_BYPASS:
+               rval = xsdfec_set_bypass(xsdfec, data);
+               break;
        default:
                /* Should not get here */
                dev_err(xsdfec->dev, "Undefined SDFEC IOCTL");