]> rtime.felk.cvut.cz Git - sojka/nv-tegra/linux-3.10.git/commitdiff
drivers: media: platform: tegra: get gpio pwr info
authorAnurag Dosapati <adosapati@nvidia.com>
Mon, 9 Nov 2015 23:57:03 +0000 (15:57 -0800)
committermobile promotions <svcmobile_promotions@nvidia.com>
Fri, 13 Nov 2015 03:06:42 +0000 (19:06 -0800)
Add support to get power status (on/off) of a GPIO used by isc-mgr to
turn on/off isc devices

Bug 1698463

Change-Id: I6a01c610a2bd41027eb04158514887ae5ed67234
Signed-off-by: Anurag Dosapati <adosapati@nvidia.com>
Reviewed-on: http://git-master/r/830964
Reviewed-by: Automatic_Commit_Validation_User
GVS: Gerrit_Virtual_Submit
Reviewed-by: Songhee Baek <sbaek@nvidia.com>
Reviewed-by: Arun Shamanna Lakshmi <aruns@nvidia.com>
drivers/media/platform/tegra/auto/isc_mgr.c
include/media/isc-mgr.h

index 2da29ab0cd1668180f33429981d31e6c056651dc..82536e38dc3241daf65905c32c3baf264c056d44 100644 (file)
@@ -236,6 +236,47 @@ static int isc_mgr_write_pid(struct file *file, const void __user *arg)
        return 0;
 }
 
+static int isc_mgr_get_pwr_info(struct isc_mgr_priv *isc_mgr,
+                               void __user *arg)
+{
+       struct isc_mgr_platform_data *pd = isc_mgr->pdata;
+       struct isc_mgr_pwr_info pinfo;
+       int err;
+
+       if (copy_from_user(&pinfo, arg, sizeof(pinfo))) {
+               dev_err(isc_mgr->dev,
+                       "%s: failed to copy from user\n", __func__);
+               return -EFAULT;
+       }
+
+       if (!pd->num_pwr_gpios) {
+               dev_err(isc_mgr->dev,
+                       "%s: no power gpios\n", __func__);
+               pinfo.pwr_status = -1;
+               err = -ENODEV;
+               goto pwr_info_end;
+       }
+
+       if (pinfo.pwr_gpio >= pd->num_pwr_gpios) {
+               dev_err(isc_mgr->dev,
+                       "%s: invalid power gpio provided\n", __func__);
+               pinfo.pwr_status = -1;
+               err = -EINVAL;
+               goto pwr_info_end;
+       }
+
+       pinfo.pwr_status  = gpio_get_value(pd->pwr_gpios[pinfo.pwr_gpio]);
+       err = 0;
+
+pwr_info_end:
+       if (copy_to_user(arg, &pinfo, sizeof(pinfo))) {
+               dev_err(isc_mgr->dev,
+                       "%s: failed to copy to user\n", __func__);
+               return -EFAULT;
+       }
+       return err;
+}
+
 int isc_mgr_power_up(struct isc_mgr_priv *isc_mgr, unsigned long arg)
 {
        struct isc_mgr_platform_data *pd = isc_mgr->pdata;
@@ -378,6 +419,9 @@ static long isc_mgr_ioctl(
                                __func__, arg);
                }
                break;
+       case ISC_MGR_IOCTL_PWR_INFO:
+               err = isc_mgr_get_pwr_info(isc_mgr, (void __user *)arg);
+               break;
        default:
                dev_err(isc_mgr->dev, "%s unsupported ioctl: %x\n",
                        __func__, cmd);
index 3176102b2ff6d144039bde0ee4eab9c24e828cf1..ef77760920ef8eed7818196a27fb14a806b974ed 100644 (file)
 #ifndef __TEGRA_ISC_MGR_H__
 #define __TEGRA_ISC_MGR_H__
 
-#define ISC_MGR_IOCTL_PWR_DN   _IOW('o', 1, __s16)
-#define ISC_MGR_IOCTL_PWR_UP   _IOR('o', 2, __s16)
-#define ISC_MGR_IOCTL_SET_PID  _IOW('o', 3, struct isc_mgr_sinfo)
-#define ISC_MGR_IOCTL_SIGNAL   _IOW('o', 4, int)
-#define ISC_MGR_IOCTL_DEV_ADD  _IOW('o', 5, struct isc_mgr_new_dev)
-#define ISC_MGR_IOCTL_DEV_DEL  _IOW('o', 6, int)
-
+#define ISC_MGR_IOCTL_PWR_DN           _IOW('o', 1, __s16)
+#define ISC_MGR_IOCTL_PWR_UP           _IOR('o', 2, __s16)
+#define ISC_MGR_IOCTL_SET_PID          _IOW('o', 3, struct isc_mgr_sinfo)
+#define ISC_MGR_IOCTL_SIGNAL           _IOW('o', 4, int)
+#define ISC_MGR_IOCTL_DEV_ADD          _IOW('o', 5, struct isc_mgr_new_dev)
+#define ISC_MGR_IOCTL_DEV_DEL          _IOW('o', 6, int)
+#define ISC_MGR_IOCTL_PWR_INFO         _IOW('o', 7, struct isc_mgr_pwr_info)
 #define ISC_MGR_POWER_ALL      5
 #define MAX_ISC_NAME_LENGTH    32
 
@@ -40,6 +40,11 @@ struct isc_mgr_sinfo {
        __u64 context;
 };
 
+struct isc_mgr_pwr_info {
+       __s32 pwr_gpio;
+       __s32 pwr_status;
+};
+
 enum {
        ISC_MGR_SIGNAL_RESUME = 0,
        ISC_MGR_SIGNAL_SUSPEND,