diff options
| author | Mister Oyster <oysterized@gmail.com> | 2017-08-20 16:03:51 +0200 |
|---|---|---|
| committer | Mister Oyster <oysterized@gmail.com> | 2017-08-20 16:06:15 +0200 |
| commit | b535f8d4492281beda130ae865cc4c021737b282 (patch) | |
| tree | 5388fda065c229a73d0afd1e4073c26a53fa9c24 | |
| parent | 436d8fbbd678c1cb755c744e7176e83786fac28c (diff) | |
| download | android_kernel_m2note-b535f8d4492281beda130ae865cc4c021737b282.tar.gz | |
mtk: gps: upstream changes
| -rw-r--r-- | drivers/misc/mediatek/connectivity/gps/gps.c | 4 | ||||
| -rw-r--r-- | drivers/misc/mediatek/connectivity/gps/stp_chrdev_gps.c | 46 |
2 files changed, 46 insertions, 4 deletions
diff --git a/drivers/misc/mediatek/connectivity/gps/gps.c b/drivers/misc/mediatek/connectivity/gps/gps.c index 15a6a7124..f161c2389 100644 --- a/drivers/misc/mediatek/connectivity/gps/gps.c +++ b/drivers/misc/mediatek/connectivity/gps/gps.c @@ -851,7 +851,7 @@ static ssize_t mt3326_gps_write(struct file *file, const char __user *buf, size_ { struct gps_data *dev = file->private_data; ssize_t ret = 0; - size_t copy_size = 0; + int copy_size = 0; GPS_TRC(); @@ -867,7 +867,7 @@ static ssize_t mt3326_gps_write(struct file *file, const char __user *buf, size_ if (down_interruptible(&dev->sem)) return -ERESTARTSYS; - copy_size = min(count, sizeof(dev->dat_buf)); + copy_size = (count < 4096) ? count : 4096; if (copy_from_user(dev->dat_buf, buf, copy_size)) { GPS_DBG("copy_from_user error"); ret = -EFAULT; diff --git a/drivers/misc/mediatek/connectivity/gps/stp_chrdev_gps.c b/drivers/misc/mediatek/connectivity/gps/stp_chrdev_gps.c index e0f51c5cc..b0916272e 100644 --- a/drivers/misc/mediatek/connectivity/gps/stp_chrdev_gps.c +++ b/drivers/misc/mediatek/connectivity/gps/stp_chrdev_gps.c @@ -18,6 +18,7 @@ #include <linux/fs.h> #include <linux/cdev.h> #include <linux/sched.h> +#include <linux/wakelock.h> #include <asm/current.h> #include <asm/uaccess.h> #include <linux/skbuff.h> @@ -49,7 +50,7 @@ MODULE_LICENSE("GPL"); #define COMBO_IOC_D1_EFUSE_GET 9 #define COMBO_IOC_RTC_FLAG 10 #define COMBO_IOC_CO_CLOCK_FLAG 11 - +#define COMBO_IOC_TRIGGER_WMT_ASSERT 12 static UINT32 gDbgLevel = GPS_LOG_DBG; @@ -79,6 +80,9 @@ static int GPS_major = GPS_DEV_MAJOR; /* dynamic allocation */ module_param(GPS_major, uint, 0); static struct cdev GPS_cdev; +static struct wakeup_source gps_wake_lock; +static unsigned char wake_lock_acquired; /* default: 0 */ + #if (defined(CONFIG_MTK_GMO_RAM_OPTIMIZE) && !defined(CONFIG_MT_ENG_BUILD)) #define STP_GPS_BUFFER_SIZE 2048 #else @@ -93,6 +97,23 @@ static volatile int retflag; static void GPS_event_cb(void); +static void gps_hold_wake_lock(int hold) +{ + if (hold == 1) { + if (!wake_lock_acquired) { + GPS_DBG_FUNC("acquire gps wake_lock acquired = %d\n", wake_lock_acquired); + __pm_stay_awake(&gps_wake_lock); + wake_lock_acquired = 1; + } + } else if (hold == 0) { + if (wake_lock_acquired) { + GPS_DBG_FUNC("release gps wake_lock acquired = %d\n", wake_lock_acquired); + __pm_relax(&gps_wake_lock); + wake_lock_acquired = 0; + } + } +} + bool rtc_GPS_low_power_detected(void) { static bool first_query = true; @@ -232,7 +253,7 @@ ssize_t GPS_read(struct file *filp, char __user *buf, size_t count, loff_t *f_po } #endif - if (retval) { + if (retval > 0) { /* we got something from STP driver */ if (copy_to_user(buf, i_buf, retval)) { retval = -EFAULT; @@ -332,6 +353,19 @@ long GPS_unlocked_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) #endif break; + case COMBO_IOC_TRIGGER_WMT_ASSERT: + /* Trigger FW assert for debug */ + GPS_INFO_FUNC("%s: Host trigger FW assert......, reason:%lu\n", __func__, arg); + retval = mtk_wcn_wmt_assert(WMTDRV_TYPE_GPS, arg); + if (retval == MTK_WCN_BOOL_TRUE) { + GPS_INFO_FUNC("Host trigger FW assert succeed\n"); + retval = 0; + } else { + GPS_ERR_FUNC("Host trigger FW assert Failed\n"); + retval = (-EBUSY); + } + break; + default: retval = -EFAULT; GPS_DBG_FUNC("GPS_ioctl(): unknown cmd (%d)\n", cmd); @@ -424,6 +458,8 @@ static int GPS_open(struct inode *inode, struct file *file) /*return error code */ return -ENODEV; } + gps_hold_wake_lock(1); + GPS_DBG_FUNC("gps_hold_wake_lock(1)\n"); #if defined(CONFIG_ARCH_MT6580) clk_buf_ctrl(CLK_BUF_AUDIO, 1); #endif @@ -456,6 +492,10 @@ static int GPS_close(struct inode *inode, struct file *file) } GPS_DBG_FUNC("WMT turn off GPS OK!\n"); + + gps_hold_wake_lock(0); + GPS_DBG_FUNC("gps_hold_wake_lock(0)\n"); + #if defined(CONFIG_ARCH_MT6580) clk_buf_ctrl(CLK_BUF_AUDIO, 0); #endif @@ -551,6 +591,8 @@ static void GPS_exit(void) unregister_chrdev_region(dev, GPS_devs); pr_warn("%s driver removed.\n", GPS_DRIVER_NAME); + + wakeup_source_trash(&gps_wake_lock); } #ifdef MTK_WCN_REMOVE_KERNEL_MODULE |
