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;
__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);
#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
__u64 context;
};
+struct isc_mgr_pwr_info {
+ __s32 pwr_gpio;
+ __s32 pwr_status;
+};
+
enum {
ISC_MGR_SIGNAL_RESUME = 0,
ISC_MGR_SIGNAL_SUSPEND,