misc: tegra_cec: add recover IOCTL
Chun XU [Tue, 7 Feb 2017 11:19:12 +0000 (19:19 +0800)]
Provide error recovery from IOCTL to user space.

Bug 1866338

Change-Id: I705ada6c8d4cb13f1c882993468f467da2908fdf
Signed-off-by: Chun XU <chunx@nvidia.com>
Reviewed-on: http://git-master/r/1300499
(cherry picked from commit a646f4903c8794641432fa838a27ee5584944eb5)
Reviewed-on: http://git-master/r/1316756
(cherry picked from commit 92307b94a5c4d771134f6209818211988e64d58d)
Reviewed-on: http://git-master/r/1457558
Reviewed-by: Manish Tuteja <mtuteja@nvidia.com>
Tested-by: Manish Tuteja <mtuteja@nvidia.com>

drivers/misc/tegra-cec/tegra_cec.c
drivers/misc/tegra-cec/tegra_cec.h

index 4d1a092..717f7c0 100644 (file)
@@ -277,12 +277,38 @@ out:
        return IRQ_HANDLED;
 }
 
+static long tegra_cec_ioctl(struct file *file, unsigned int cmd,
+                unsigned long arg)
+{
+       struct tegra_cec *cec = file->private_data;
+
+       if (_IOC_TYPE(cmd) != TEGRA_CEC_IOC_MAGIC)
+               return  -EINVAL;
+
+       switch (cmd) {
+       case TEGRA_CEC_IOCTL_ERROR_RECOVERY:
+               mutex_lock(&cec->recovery_lock);
+               tegra_cec_error_recovery(cec);
+               mutex_unlock(&cec->recovery_lock);
+               break;
+       default:
+               dev_err(cec->dev, "unsupported ioctl\n");
+               return -EINVAL;
+       }
+
+       return 0;
+}
+
 static const struct file_operations tegra_cec_fops = {
        .owner = THIS_MODULE,
        .open = tegra_cec_open,
        .release = tegra_cec_release,
        .read = tegra_cec_read,
        .write = tegra_cec_write,
+       .unlocked_ioctl = tegra_cec_ioctl,
+#ifdef CONFIG_COMPAT
+       .compat_ioctl =  tegra_cec_ioctl,
+#endif
 };
 
 static void tegra_cec_init(struct tegra_cec *cec)
@@ -466,6 +492,7 @@ static int tegra_cec_probe(struct platform_device *pdev)
 
        atomic_set(&cec->init_done, 0);
        mutex_init(&cec->tx_lock);
+       mutex_init(&cec->recovery_lock);
 
        cec->clk = clk_get(&pdev->dev, "cec");
 
index 12913a2..ec3927e 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * drivers/misc/tegra-cec/tegra_cec.h
  *
- * Copyright (c) 2012-2015, NVIDIA CORPORATION.  All rights reserved.
+ * Copyright (c) 2012-2017, NVIDIA CORPORATION.  All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms and conditions of the GNU General Public License,
@@ -29,6 +29,7 @@ struct tegra_cec {
        struct miscdevice       misc_dev;
        struct clk              *clk;
        struct mutex            tx_lock;
+       struct mutex            recovery_lock;
        void __iomem            *cec_base;
        int                     tegra_cec_irq;
        wait_queue_head_t       rx_waitq;
@@ -160,4 +161,8 @@ static int tegra_cec_remove(struct platform_device *pdev);
 
 #define TEGRA_CEC_NAME "tegra_cec"
 
+#define TEGRA_CEC_IOC_MAGIC 'C'
+
+#define TEGRA_CEC_IOCTL_ERROR_RECOVERY _IO(TEGRA_CEC_IOC_MAGIC, 1)
+
 #endif /* TEGRA_CEC_H */