diff --git a/Makefile b/Makefile index fb1799fa49d1..147d51d12825 100644 --- a/Makefile +++ b/Makefile @@ -377,7 +377,7 @@ CHECKFLAGS := -D__linux__ -Dlinux -D__STDC__ -Dunix -D__unix__ \ -Wbitwise -Wno-return-void $(CF) CFLAGS_MODULE = AFLAGS_MODULE = -LDFLAGS_MODULE = +LDFLAGS_MODULE = --strip-debug CFLAGS_KERNEL = AFLAGS_KERNEL = CFLAGS_GCOV = -fprofile-arcs -ftest-coverage @@ -406,6 +406,7 @@ KBUILD_CFLAGS := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \ -fno-strict-aliasing -fno-common \ -Werror-implicit-function-declaration \ -Wno-format-security \ + -mcpu=cortex-a57 -mtune=cortex-a57 \ -std=gnu89 KBUILD_AFLAGS_KERNEL := @@ -626,7 +627,7 @@ KBUILD_CFLAGS += $(call cc-option,-fno-delete-null-pointer-checks,) ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE KBUILD_CFLAGS += -Os $(call cc-disable-warning,maybe-uninitialized,) else -KBUILD_CFLAGS += -O2 +KBUILD_CFLAGS += -O2 $(call cc-disable-warning,maybe-uninitialized,) endif # Tell gcc to never replace conditional load with a non-conditional one diff --git a/arch/arm64/boot/qcom/Makefile b/arch/arm64/boot/qcom/Makefile new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/drivers/base/power/main.c b/drivers/base/power/main.c index ef5d2797fceb..230ab8d0ce67 100644 --- a/drivers/base/power/main.c +++ b/drivers/base/power/main.c @@ -30,7 +30,6 @@ #include #include #include -#include #include #include @@ -606,7 +605,6 @@ void dpm_resume_noirq(pm_message_t state) async_synchronize_full(); dpm_show_time(starttime, state, "noirq"); resume_device_irqs(); - cpuidle_resume(); trace_suspend_resume(TPS("dpm_resume_noirq"), state.event, false); } @@ -1142,7 +1140,6 @@ int dpm_suspend_noirq(pm_message_t state) int error = 0; trace_suspend_resume(TPS("dpm_suspend_noirq"), state.event, true); - cpuidle_pause(); suspend_device_irqs(); mutex_lock(&dpm_list_mtx); pm_transition = state; diff --git a/drivers/gpu/msm/adreno_dispatch.c b/drivers/gpu/msm/adreno_dispatch.c index 522c32743d3d..b519405175fc 100644 --- a/drivers/gpu/msm/adreno_dispatch.c +++ b/drivers/gpu/msm/adreno_dispatch.c @@ -2096,7 +2096,7 @@ static void _dispatcher_power_down(struct adreno_device *adreno_dev) mutex_unlock(&device->mutex); } -static void adreno_dispatcher_work(struct work_struct *work) +static void adreno_dispatcher_work(struct kthread_work *work) { struct adreno_dispatcher *dispatcher = container_of(work, struct adreno_dispatcher, work); @@ -2156,7 +2156,7 @@ void adreno_dispatcher_schedule(struct kgsl_device *device) struct adreno_device *adreno_dev = ADRENO_DEVICE(device); struct adreno_dispatcher *dispatcher = &adreno_dev->dispatcher; - kgsl_schedule_work(&dispatcher->work); + queue_kthread_work(&kgsl_driver.worker, &dispatcher->work); } /** @@ -2438,7 +2438,7 @@ int adreno_dispatcher_init(struct adreno_device *adreno_dev) setup_timer(&dispatcher->fault_timer, adreno_dispatcher_fault_timer, (unsigned long) adreno_dev); - INIT_WORK(&dispatcher->work, adreno_dispatcher_work); + init_kthread_work(&dispatcher->work, adreno_dispatcher_work); init_completion(&dispatcher->idle_gate); complete_all(&dispatcher->idle_gate); diff --git a/drivers/gpu/msm/adreno_dispatch.h b/drivers/gpu/msm/adreno_dispatch.h index 699c3e4adb27..fee4317916e3 100644 --- a/drivers/gpu/msm/adreno_dispatch.h +++ b/drivers/gpu/msm/adreno_dispatch.h @@ -91,7 +91,7 @@ struct adreno_dispatcher { atomic_t fault; struct plist_head pending; spinlock_t plist_lock; - struct work_struct work; + struct kthread_work work; struct kobject kobj; struct completion idle_gate; unsigned int disp_preempt_fair_sched; diff --git a/drivers/gpu/msm/kgsl.c b/drivers/gpu/msm/kgsl.c index c06a9fdc4892..554ae40ef594 100644 --- a/drivers/gpu/msm/kgsl.c +++ b/drivers/gpu/msm/kgsl.c @@ -4036,6 +4036,8 @@ static void kgsl_core_exit(void) static int __init kgsl_core_init(void) { int result = 0; + struct sched_param param = { .sched_priority = 2 }; + /* alloc major and minor device numbers */ result = alloc_chrdev_region(&kgsl_driver.major, 0, KGSL_DEVICE_MAX, "kgsl"); @@ -4101,6 +4103,18 @@ static int __init kgsl_core_init(void) kgsl_driver.mem_workqueue = alloc_workqueue("kgsl-mementry", WQ_UNBOUND | WQ_MEM_RECLAIM, 0); + init_kthread_worker(&kgsl_driver.worker); + + kgsl_driver.worker_thread = kthread_run(kthread_worker_fn, + &kgsl_driver.worker, "kgsl_worker_thread"); + + if (IS_ERR(kgsl_driver.worker_thread)) { + pr_err("unable to start kgsl thread\n"); + goto err; + } + + sched_setscheduler(kgsl_driver.worker_thread, SCHED_FIFO, ¶m); + kgsl_events_init(); result = kgsl_cmdbatch_init(); diff --git a/drivers/gpu/msm/kgsl.h b/drivers/gpu/msm/kgsl.h index 4c46af637f63..77194689adfc 100644 --- a/drivers/gpu/msm/kgsl.h +++ b/drivers/gpu/msm/kgsl.h @@ -27,6 +27,7 @@ #include #include #include +#include /* The number of memstore arrays limits the number of contexts allowed. * If more contexts are needed, update multiple for MEMSTORE_SIZE @@ -132,6 +133,9 @@ struct kgsl_driver { unsigned int full_cache_threshold; struct workqueue_struct *workqueue; struct workqueue_struct *mem_workqueue; + + struct kthread_worker worker; + struct task_struct *worker_thread; }; extern struct kgsl_driver kgsl_driver; @@ -275,7 +279,7 @@ struct kgsl_event { void *priv; struct list_head node; unsigned int created; - struct work_struct work; + struct kthread_work work; int result; struct kgsl_event_group *group; }; diff --git a/drivers/gpu/msm/kgsl_events.c b/drivers/gpu/msm/kgsl_events.c index 6e8abf36c50f..859511baba12 100644 --- a/drivers/gpu/msm/kgsl_events.c +++ b/drivers/gpu/msm/kgsl_events.c @@ -32,7 +32,7 @@ static inline void signal_event(struct kgsl_device *device, { list_del(&event->node); event->result = result; - queue_work(device->events_wq, &event->work); + queue_kthread_work(&kgsl_driver.worker, &event->work); } /** @@ -42,7 +42,7 @@ static inline void signal_event(struct kgsl_device *device, * Each event callback has its own work struct and is run on a event specific * workqeuue. This is the worker that queues up the event callback function. */ -static void _kgsl_event_worker(struct work_struct *work) +static void _kgsl_event_worker(struct kthread_work *work) { struct kgsl_event *event = container_of(work, struct kgsl_event, work); int id = KGSL_CONTEXT_ID(event->context); @@ -282,7 +282,7 @@ int kgsl_add_event(struct kgsl_device *device, struct kgsl_event_group *group, event->created = jiffies; event->group = group; - INIT_WORK(&event->work, _kgsl_event_worker); + init_kthread_work(&event->work, _kgsl_event_worker); trace_kgsl_register_event(KGSL_CONTEXT_ID(context), timestamp, func); @@ -297,7 +297,7 @@ int kgsl_add_event(struct kgsl_device *device, struct kgsl_event_group *group, if (timestamp_cmp(retired, timestamp) >= 0) { event->result = KGSL_EVENT_RETIRED; - queue_work(device->events_wq, &event->work); + queue_kthread_work(&kgsl_driver.worker, &event->work); spin_unlock(&group->lock); return 0; } diff --git a/drivers/input/keyboard/gpio_keys.c b/drivers/input/keyboard/gpio_keys.c index a9b64e9a2eb0..47011bb0a594 100644 --- a/drivers/input/keyboard/gpio_keys.c +++ b/drivers/input/keyboard/gpio_keys.c @@ -343,8 +343,6 @@ static void gpio_keys_gpio_report_event(struct gpio_button_data *bdata) state = (__gpio_get_value(button->gpio) ? 1 : 0) ^ button->active_low; - oem_check_force_dump_key(button->code,state); - if (type == EV_ABS) { if (state) input_event(input, type, button->code, button->value); @@ -352,6 +350,8 @@ static void gpio_keys_gpio_report_event(struct gpio_button_data *bdata) input_event(input, type, button->code, !!state); } input_sync(input); + + oem_check_force_dump_key(button->code,state); } static void gpio_keys_gpio_work_func(struct work_struct *work) diff --git a/drivers/input/misc/fpc1020_tee.c b/drivers/input/misc/fpc1020_tee.c index 5471b03f55ba..90d54530f12b 100755 --- a/drivers/input/misc/fpc1020_tee.c +++ b/drivers/input/misc/fpc1020_tee.c @@ -280,6 +280,7 @@ static DEVICE_ATTR(irq, S_IRUSR | S_IWUSR, irq_get, irq_ack); extern void int_touch(void); extern struct completion key_cm; extern bool virtual_key_enable; +extern bool s1302_is_keypad_stopped(void); bool key_home_pressed = false; EXPORT_SYMBOL(key_home_pressed); @@ -289,12 +290,18 @@ static ssize_t report_home_set(struct device *dev, { struct fpc1020_data *fpc1020 = dev_get_drvdata(dev); unsigned long time; + bool ignore_keypad; + + if (s1302_is_keypad_stopped() || virtual_key_enable) + ignore_keypad = true; + else + ignore_keypad = false; if(ignor_home_for_ESD) return -EINVAL; if (!strncmp(buf, "down", strlen("down"))) { - if(virtual_key_enable){ + if(ignore_keypad){ key_home_pressed = true; }else{ input_report_key(fpc1020->input_dev, @@ -304,7 +311,7 @@ static ssize_t report_home_set(struct device *dev, } else if (!strncmp(buf, "up", strlen("up"))) { - if(virtual_key_enable){ + if(ignore_keypad){ key_home_pressed = false; }else{ input_report_key(fpc1020->input_dev, @@ -314,7 +321,7 @@ static ssize_t report_home_set(struct device *dev, } else return -EINVAL; - if(virtual_key_enable){ + if(ignore_keypad){ if(!key_home_pressed){ reinit_completion(&key_cm); time = wait_for_completion_timeout(&key_cm,msecs_to_jiffies(60)); diff --git a/drivers/input/touchscreen/synaptics_driver_s1302.c b/drivers/input/touchscreen/synaptics_driver_s1302.c index 2a274bf34895..db74050cfda3 100644 --- a/drivers/input/touchscreen/synaptics_driver_s1302.c +++ b/drivers/input/touchscreen/synaptics_driver_s1302.c @@ -298,6 +298,8 @@ struct synaptics_ts_data { char fw_name[TP_FW_NAME_MAX_LEN]; char fw_id[12]; char manu_name[12]; + + bool stop_keypad; }; static int tc_hw_pwron(struct synaptics_ts_data *ts) @@ -920,7 +922,7 @@ static void synaptics_ts_report(struct synaptics_ts_data *ts ) #elif (defined SUPPORT_VIRTUAL_KEY) if (virtual_key_enable) int_virtual_key(ts); - else + else if (!ts->stop_keypad) int_key(ts); #endif } @@ -2022,6 +2024,80 @@ static int choice_gpio_function(struct synaptics_ts_data *ts) return ret; } +bool s1302_is_keypad_stopped(void) +{ + struct synaptics_ts_data *ts = tc_g; + + return ts->stop_keypad; +} + +static void synaptics_input_event(struct input_handle *handle, + unsigned int type, unsigned int code, int value) +{ + struct synaptics_ts_data *ts = tc_g; + + if (code != BTN_TOOL_FINGER) + return; + + /* Disable capacitive keys when user's finger is on touchscreen */ + ts->stop_keypad = value; +} + +static int synaptics_input_connect(struct input_handler *handler, + struct input_dev *dev, const struct input_device_id *id) +{ + struct input_handle *handle; + int ret; + + handle = kzalloc(sizeof(*handle), GFP_KERNEL); + if (!handle) + return -ENOMEM; + + handle->dev = dev; + handle->handler = handler; + handle->name = "s1302_handle"; + + ret = input_register_handle(handle); + if (ret) + goto err2; + + ret = input_open_device(handle); + if (ret) + goto err1; + + return 0; + +err1: + input_unregister_handle(handle); +err2: + kfree(handle); + return ret; +} + +static void synaptics_input_disconnect(struct input_handle *handle) +{ + input_close_device(handle); + input_unregister_handle(handle); + kfree(handle); +} + +static const struct input_device_id synaptics_input_ids[] = { + { + .flags = INPUT_DEVICE_ID_MATCH_KEYBIT, + .keybit = { [BIT_WORD(BTN_TOOL_FINGER)] = + BIT_MASK(BTN_TOOL_FINGER) }, + }, + { }, +}; + +static struct input_handler synaptics_input_handler = { + .event = synaptics_input_event, + .connect = synaptics_input_connect, + .disconnect = synaptics_input_disconnect, + .name = "syna_input_handler", + .id_table = synaptics_input_ids, +}; + static int synaptics_ts_probe(struct i2c_client *client, const struct i2c_device_id *id) { #ifdef CONFIG_SYNAPTIC_RED @@ -2086,7 +2162,7 @@ static int synaptics_ts_probe(struct i2c_client *client, const struct i2c_device TPD_ERR("CURRENT_FIRMWARE_ID = 0x%x\n", CURRENT_FIRMWARE_ID); sprintf(ts->fw_id,"0x%x",CURRENT_FIRMWARE_ID); - memset(ts->fw_name,TP_FW_NAME_MAX_LEN,0); + memset(ts->fw_name,0,TP_FW_NAME_MAX_LEN); strcpy(ts->fw_name,"tp/fw_synaptics_touchkey.img"); TPD_DEBUG("synatpitcs_fw: fw_name = %s \n",ts->fw_name); @@ -2155,6 +2231,11 @@ static int synaptics_ts_probe(struct i2c_client *client, const struct i2c_device register_remote_device_s1302(premote_data); } #endif + + ret = input_register_handler(&synaptics_input_handler); + if (ret) + TPD_ERR("%s: Failed to register input handler\n", __func__); + TPDTM_DMESG("synaptics_ts_probe s1302: normal end\n"); return 0; diff --git a/drivers/input/touchscreen/synaptics_driver_s3320.c b/drivers/input/touchscreen/synaptics_driver_s3320.c index 2e1772449d74..b40f6455ad68 100644 --- a/drivers/input/touchscreen/synaptics_driver_s3320.c +++ b/drivers/input/touchscreen/synaptics_driver_s3320.c @@ -180,7 +180,7 @@ static int gesture_switch = 0; static int baseline_ret = 0; static int TP_FW; static int tp_dev = 6; -static unsigned int tp_debug = 1; +static unsigned int tp_debug = 0; static int button_map[3]; static int tx_rx_num[2]; static int16_t Rxdata[30][30]; @@ -209,7 +209,6 @@ static int sleep_enable; static struct synaptics_ts_data *ts_g = NULL; static struct workqueue_struct *synaptics_wq = NULL; -static struct workqueue_struct *synaptics_report = NULL; static struct workqueue_struct *get_base_report = NULL; static struct proc_dir_entry *prEntry_tp = NULL; @@ -446,7 +445,6 @@ struct synaptics_ts_data { uint32_t pre_finger_state; uint32_t pre_btn_state; struct delayed_work base_work; - struct work_struct report_work; struct delayed_work speed_up_work; struct input_dev *input_dev; struct hrtimer timer; @@ -1180,7 +1178,7 @@ static void gesture_judge(struct synaptics_ts_data *ts) (gesture_buffer[2] == 0x6d) ? Mgestrue : UnkownGestrue; } - +/* keyCode = UnkownGestrue; // Get key code based on registered gesture. switch (gesture) { @@ -1208,7 +1206,7 @@ static void gesture_judge(struct synaptics_ts_data *ts) default: break; } - +*/ TPD_ERR("detect %s gesture\n", gesture == DouTap ? "(double tap)" : gesture == UpVee ? "(V)" : gesture == DownVee ? "(^)" : @@ -1250,7 +1248,6 @@ static void gesture_judge(struct synaptics_ts_data *ts) } #endif /***************end****************/ -static char prlog_count = 0; #ifdef REPORT_2D_PRESSURE static unsigned char pres_value = 1; #endif @@ -1416,8 +1413,6 @@ void int_touch(void) if (finger_num == 0/* && last_status && (check_key <= 1)*/) { - if (3 == (++prlog_count % 6)) - TPD_ERR("all finger up\n"); input_report_key(ts->input_dev, BTN_TOOL_FINGER, 0); #ifndef TYPE_B_PROTOCOL input_mt_sync(ts->input_dev); @@ -1440,6 +1435,7 @@ void int_touch(void) mutex_unlock(&ts->mutexreport); } +#ifndef TPD_USE_EINT static void synaptics_ts_work_func(struct work_struct *work) { int ret,status_check; @@ -1495,7 +1491,6 @@ static void synaptics_ts_work_func(struct work_struct *work) return; } -#ifndef TPD_USE_EINT static enum hrtimer_restart synaptics_ts_timer_func(struct hrtimer *timer) { struct synaptics_ts_data *ts = container_of(timer, struct synaptics_ts_data, timer); @@ -1509,10 +1504,50 @@ static enum hrtimer_restart synaptics_ts_timer_func(struct hrtimer *timer) static irqreturn_t synaptics_irq_thread_fn(int irq, void *dev_id) { struct synaptics_ts_data *ts = (struct synaptics_ts_data *)dev_id; - mutex_lock(&ts->mutex); - touch_disable(ts); - queue_work(synaptics_report, &ts->report_work); - mutex_unlock(&ts->mutex); + int ret,status_check; + uint8_t status = 0; + uint8_t inte = 0; + + if (atomic_read(&ts->is_stop) == 1) + { + return IRQ_HANDLED; + } + + if( ts->enable_remote) { + return IRQ_HANDLED; + } + + ret = synaptics_rmi4_i2c_write_byte(ts->client, 0xff, 0x00 ); + ret = synaptics_rmi4_i2c_read_word(ts->client, F01_RMI_DATA_BASE); + + if( ret < 0 ) { + TPDTM_DMESG("Synaptic:ret = %d\n", ret); + synaptics_hard_reset(ts); + return IRQ_HANDLED; + } + status = ret & 0xff; + inte = (ret & 0x7f00)>>8; + //TPD_ERR("%s status[0x%x],inte[0x%x]\n",__func__,status,inte); + if(status & 0x80){ + TPD_DEBUG("enter reset tp status,and ts->in_gesture_mode is:%d\n",ts->in_gesture_mode); + status_check = synaptics_init_panel(ts); + if (status_check < 0) { + TPD_ERR("synaptics_init_panel failed\n"); + } + if ((ts->is_suspended == 1) && (ts->gesture_enable == 1)){ + synaptics_enable_interrupt_for_gesture(ts, 1); + } + } +/* + if(0 != status && 1 != status) {//0:no error;1: after hard reset;the two state don't need soft reset + TPD_ERR("%s status[0x%x],inte[0x%x]\n",__func__,status,inte); + int_state(ts); + goto END; + } +*/ + if ( inte & 0x04 ) + int_touch(); + return IRQ_HANDLED; } #endif @@ -2423,6 +2458,7 @@ static int synaptics_input_init(struct synaptics_ts_data *ts) set_bit(KEY_GESTURE_LEFT_V, ts->input_dev->keybit); set_bit(KEY_GESTURE_RIGHT_V, ts->input_dev->keybit); #endif + set_bit(BTN_TOOL_FINGER, ts->input_dev->keybit); /* For multi touch */ input_set_abs_params(ts->input_dev, ABS_MT_TOUCH_MAJOR, 0, 255, 0, 0); input_set_abs_params(ts->input_dev, ABS_MT_TOUCH_MINOR, 0,255, 0, 0); @@ -3952,8 +3988,8 @@ static int synaptics_ts_probe(struct i2c_client *client, const struct i2c_device TP_FW = CURRENT_FIRMWARE_ID; sprintf(ts->fw_id,"0x%x",TP_FW); - memset(ts->fw_name,TP_FW_NAME_MAX_LEN,0); - memset(ts->test_limit_name,TP_FW_NAME_MAX_LEN,0); + memset(ts->fw_name,0,TP_FW_NAME_MAX_LEN); + memset(ts->test_limit_name,0,TP_FW_NAME_MAX_LEN); //sprintf(ts->manu_name, "TP_SYNAPTICS"); synaptics_rmi4_i2c_read_block(ts->client, F01_RMI_QUERY11,10, ts->manu_name); @@ -3977,18 +4013,11 @@ static int synaptics_ts_probe(struct i2c_client *client, const struct i2c_device } INIT_DELAYED_WORK(&ts->speed_up_work,speedup_synaptics_resume); - synaptics_report = create_singlethread_workqueue("synaptics_report"); - if( !synaptics_report ){ - ret = -ENOMEM; - goto exit_createworkqueue_failed; - } - get_base_report = create_singlethread_workqueue("get_base_report"); if( !get_base_report ){ ret = -ENOMEM; goto exit_createworkqueue_failed; } - INIT_WORK(&ts->report_work,synaptics_ts_work_func); INIT_DELAYED_WORK(&ts->base_work,tp_baseline_get_work); ret = synaptics_init_panel(ts); /* will also switch back to page 0x04 */ @@ -4110,8 +4139,6 @@ static int synaptics_ts_probe(struct i2c_client *client, const struct i2c_device exit_createworkqueue_failed: destroy_workqueue(synaptics_wq); synaptics_wq = NULL; - destroy_workqueue(synaptics_report); - synaptics_report = NULL; destroy_workqueue(get_base_report); get_base_report = NULL; @@ -4310,6 +4337,21 @@ static int synaptics_mode_change(int mode) TPD_ERR("%s: set dose mode[0x%x] err!!\n", __func__,tmp_mode); return ret; } + +static void set_fingerprintd_nice(int nice) +{ + struct task_struct *p; + + read_lock(&tasklist_lock); + for_each_process(p) { + if (!memcmp(p->comm, "fingerprintd", 13)) { + set_user_nice(p, nice); + break; + } + } + read_unlock(&tasklist_lock); +} + #if defined(CONFIG_FB) static int fb_notifier_callback(struct notifier_block *self, unsigned long event, void *data) { @@ -4338,6 +4380,7 @@ static int fb_notifier_callback(struct notifier_block *self, unsigned long event synaptics_ts_resume(&ts->client->dev); //atomic_set(&ts->is_stop,0); TPD_DEBUG("%s going TP resume end\n", __func__); + set_fingerprintd_nice(0); } }else if( *blank == FB_BLANK_POWERDOWN && (event == FB_EARLY_EVENT_BLANK )) { @@ -4351,6 +4394,8 @@ static int fb_notifier_callback(struct notifier_block *self, unsigned long event } synaptics_ts_suspend(&ts->client->dev); TPD_DEBUG("%s : going TP suspend end\n", __func__); + set_fingerprintd_nice(MIN_NICE); + } } } diff --git a/drivers/media/platform/msm/vidc/msm_v4l2_vidc.c b/drivers/media/platform/msm/vidc/msm_v4l2_vidc.c index 9d6f325d5a36..c47e4a858faa 100644 --- a/drivers/media/platform/msm/vidc/msm_v4l2_vidc.c +++ b/drivers/media/platform/msm/vidc/msm_v4l2_vidc.c @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include @@ -34,6 +35,7 @@ #define BASE_DEVICE_NUMBER 32 +static struct pm_qos_request msm_v4l2_vidc_pm_qos_request; struct msm_vidc_drv *vidc_driver; uint32_t msm_vidc_pwr_collapse_delay = 2000; @@ -60,6 +62,11 @@ static int msm_v4l2_open(struct file *filp) core->id, vid_dev->type); return -ENOMEM; } + + dprintk(VIDC_DBG, "pm_qos_add with latency 1000usec\n"); + pm_qos_add_request(&msm_v4l2_vidc_pm_qos_request, + PM_QOS_CPU_DMA_LATENCY, 1000); + clear_bit(V4L2_FL_USES_V4L2_FH, &vdev->flags); filp->private_data = &(vidc_inst->event_handler); trace_msm_v4l2_vidc_open_end("msm_v4l2_open end"); @@ -80,6 +87,12 @@ static int msm_v4l2_close(struct file *filp) "Failed in %s for release output buffers\n", __func__); rc = msm_vidc_close(vidc_inst); + + dprintk(VIDC_DBG, "pm_qos_update and remove\n"); + pm_qos_update_request(&msm_v4l2_vidc_pm_qos_request, + PM_QOS_DEFAULT_VALUE); + pm_qos_remove_request(&msm_v4l2_vidc_pm_qos_request); + trace_msm_v4l2_vidc_close_end("msm_v4l2_close end"); return rc; } diff --git a/drivers/mmc/card/queue.c b/drivers/mmc/card/queue.c index f3ac99d7b7eb..1369484d5c44 100644 --- a/drivers/mmc/card/queue.c +++ b/drivers/mmc/card/queue.c @@ -21,6 +21,7 @@ #include #include +#include #include "queue.h" #define MMC_QUEUE_BOUNCESZ 65536 @@ -146,6 +147,11 @@ static int mmc_queue_thread(void *d) struct request_queue *q = mq->queue; struct mmc_card *card = mq->card; + struct sched_param scheduler_params = {0}; + scheduler_params.sched_priority = 1; + + sched_setscheduler(current, SCHED_FIFO, &scheduler_params); + current->flags |= PF_MEMALLOC; if (card->host->wakeup_on_idle) set_wake_up_idle(true); diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c index b07abf866170..fe6e0ed72604 100644 --- a/drivers/mmc/core/core.c +++ b/drivers/mmc/core/core.c @@ -67,7 +67,7 @@ static const unsigned freqs[] = { 400000, 300000, 200000, 100000 }; * performance cost, and for other reasons may not always be desired. * So we allow it it to be disabled. */ -bool use_spi_crc = 1; +bool use_spi_crc = 0; module_param(use_spi_crc, bool, 0); /* diff --git a/drivers/net/ethernet/msm/rndis_ipa.c b/drivers/net/ethernet/msm/rndis_ipa.c index 3e0b83f8ddaa..9144ea2dea38 100644 --- a/drivers/net/ethernet/msm/rndis_ipa.c +++ b/drivers/net/ethernet/msm/rndis_ipa.c @@ -29,7 +29,7 @@ #include #define CREATE_TRACE_POINTS -#include "rndis_ipa_trace.h" +#include #define DRV_NAME "RNDIS_IPA" #define DEBUGFS_DIR_NAME "rndis_ipa" diff --git a/drivers/platform/msm/ipa/ipa_common b/drivers/platform/msm/ipa/ipa_common new file mode 100644 index 000000000000..c3ecc753834d Binary files /dev/null and b/drivers/platform/msm/ipa/ipa_common differ diff --git a/drivers/platform/msm/ipa/ipa_v2/ipa.c b/drivers/platform/msm/ipa/ipa_v2/ipa.c index d35140e138bc..93a939a87fd9 100644 --- a/drivers/platform/msm/ipa/ipa_v2/ipa.c +++ b/drivers/platform/msm/ipa/ipa_v2/ipa.c @@ -38,7 +38,7 @@ #include "../ipa_rm_i.h" #define CREATE_TRACE_POINTS -#include "ipa_trace.h" +#include #define IPA_SUMMING_THRESHOLD (0x10) #define IPA_PIPE_MEM_START_OFST (0x0) diff --git a/drivers/platform/msm/ipa/ipa_v2/ipa_dp.c b/drivers/platform/msm/ipa/ipa_v2/ipa_dp.c index 5b867727bb3d..ab0558e0ea14 100644 --- a/drivers/platform/msm/ipa/ipa_v2/ipa_dp.c +++ b/drivers/platform/msm/ipa/ipa_v2/ipa_dp.c @@ -16,7 +16,7 @@ #include #include #include "ipa_i.h" -#include "ipa_trace.h" +#include #define IPA_LAST_DESC_CNT 0xFFFF #define POLLING_INACTIVITY_RX 40 diff --git a/drivers/platform/msm/ipa/ipa_v2/rmnet_ipa.c b/drivers/platform/msm/ipa/ipa_v2/rmnet_ipa.c index 7b16b51ff72c..1f3b149845d4 100644 --- a/drivers/platform/msm/ipa/ipa_v2/rmnet_ipa.c +++ b/drivers/platform/msm/ipa/ipa_v2/rmnet_ipa.c @@ -35,7 +35,7 @@ #include #include -#include "ipa_trace.h" +#include #define WWAN_METADATA_SHFT 24 #define WWAN_METADATA_MASK 0xFF000000 diff --git a/drivers/platform/msm/mhi/mhi_ssr.c b/drivers/platform/msm/mhi/mhi_ssr.c index 8ee3deddbb95..b6446935f9fd 100644 --- a/drivers/platform/msm/mhi/mhi_ssr.c +++ b/drivers/platform/msm/mhi/mhi_ssr.c @@ -10,10 +10,10 @@ * GNU General Public License for more details. */ -#include -#include -#include -#include +#include "mhi_sys.h" +#include "mhi.h" +#include "mhi_bhi.h" +#include "mhi_hwio.h" #include #include diff --git a/drivers/power/bq27541_fuelgauger.c b/drivers/power/bq27541_fuelgauger.c index b11688f1f2ed..e7fdf0879c80 100755 --- a/drivers/power/bq27541_fuelgauger.c +++ b/drivers/power/bq27541_fuelgauger.c @@ -1357,18 +1357,12 @@ static int bq27541_battery_resume(struct i2c_client *client) pr_info("suspend_time=%d\n", suspend_time); update_pre_capacity_data.suspend_time = suspend_time; - for (ret = 0; ret < NR_CPUS; ret++) { - if (cpu_online(ret) && (ret != raw_smp_processor_id())) - break; - } - if (di->rtc_resume_time - di->lcd_off_time >= TWO_POINT_FIVE_MINUTES) { pr_err("di->rtc_resume_time - di->lcd_off_time=%ld\n", di->rtc_resume_time - di->lcd_off_time); wake_lock(&di->update_soc_wake_lock); get_current_time(&di->lcd_off_time); - queue_delayed_work_on(ret != NR_CPUS ? ret : 0, - update_pre_capacity_data.workqueue, + queue_delayed_work(update_pre_capacity_data.workqueue, &(update_pre_capacity_data.work), msecs_to_jiffies(1000)); } schedule_delayed_work(&bq27541_di->battery_soc_work, diff --git a/drivers/power/qcom/msm-core.c b/drivers/power/qcom/msm-core.c index fa46b507ab30..c93aa0058745 100644 --- a/drivers/power/qcom/msm-core.c +++ b/drivers/power/qcom/msm-core.c @@ -308,7 +308,7 @@ static __ref int do_sampling(void *data) static int prev_temp[NR_CPUS]; while (!kthread_should_stop()) { - wait_for_completion(&sampling_completion); + wait_for_completion_interruptible(&sampling_completion); cancel_delayed_work(&sampling_work); mutex_lock(&kthread_update_mutex); diff --git a/drivers/power/qpnp-smbcharger.c b/drivers/power/qpnp-smbcharger.c index e613e4b83351..6cf58f4b2504 100755 --- a/drivers/power/qpnp-smbcharger.c +++ b/drivers/power/qpnp-smbcharger.c @@ -2071,7 +2071,7 @@ static int smbchg_set_usb_current_max(struct smbchg_chip *chip, } chip->usb_max_current_ma = 500; } - if (current_ma == CURRENT_900_MA) { + if ((current_ma == CURRENT_500_MA) || (current_ma == CURRENT_900_MA)) { // AP: Fast charge for USB rc = smbchg_sec_masked_write(chip, chip->usb_chgpth_base + CHGPTH_CFG, CFG_USB_2_3_SEL_BIT, CFG_USB_3); diff --git a/drivers/slimbus/slim-msm-ngd.c b/drivers/slimbus/slim-msm-ngd.c index d5d9c140ae79..bcedcdf72b61 100644 --- a/drivers/slimbus/slim-msm-ngd.c +++ b/drivers/slimbus/slim-msm-ngd.c @@ -1400,7 +1400,7 @@ static int ngd_slim_rx_msgq_thread(void *data) u8 wbuf[8]; set_current_state(TASK_INTERRUPTIBLE); - wait_for_completion(notify); + wait_for_completion_interruptible(notify); txn.dt = SLIM_MSG_DEST_LOGICALADDR; txn.ec = 0; @@ -1462,7 +1462,7 @@ static int ngd_notify_slaves(void *data) while (!kthread_should_stop()) { set_current_state(TASK_INTERRUPTIBLE); - wait_for_completion(&dev->qmi.slave_notify); + wait_for_completion_interruptible(&dev->qmi.slave_notify); /* Probe devices for first notification */ if (!i) { i++; diff --git a/drivers/soc/qcom/mpm-of.c b/drivers/soc/qcom/mpm-of.c index 97e03253b59e..c3eb5ac0add0 100644 --- a/drivers/soc/qcom/mpm-of.c +++ b/drivers/soc/qcom/mpm-of.c @@ -136,7 +136,7 @@ enum { MSM_MPM_DEBUG_NON_DETECTABLE_IRQ_IDLE = BIT(3), }; -static int msm_mpm_debug_mask = 1; +static int msm_mpm_debug_mask = 0; module_param_named( debug_mask, msm_mpm_debug_mask, int, S_IRUGO | S_IWUSR | S_IWGRP ); @@ -682,7 +682,7 @@ static void msm_mpm_work_fn(struct work_struct *work) unsigned long flags; while (1) { bool allow; - wait_for_completion(&wake_wq); + wait_for_completion_interruptible(&wake_wq); spin_lock_irqsave(&msm_mpm_lock, flags); allow = msm_mpm_irqs_detectable(true) && msm_mpm_gpio_irqs_detectable(true); diff --git a/drivers/soc/qcom/tracer_pkt.c b/drivers/soc/qcom/tracer_pkt.c index 49c9d27cbbcb..9fcdd2ca1a4b 100644 --- a/drivers/soc/qcom/tracer_pkt.c +++ b/drivers/soc/qcom/tracer_pkt.c @@ -15,7 +15,7 @@ #include #include #define CREATE_TRACE_POINTS -#include "tracer_pkt_private.h" +#include static unsigned qdss_tracing; module_param_named(qdss_tracing_enable, qdss_tracing, diff --git a/drivers/usb/gadget/function/f_gsi.c b/drivers/usb/gadget/function/f_gsi.c index 380f62f52949..09014379a667 100644 --- a/drivers/usb/gadget/function/f_gsi.c +++ b/drivers/usb/gadget/function/f_gsi.c @@ -18,7 +18,7 @@ #include #include "f_gsi.h" #include "rndis.h" -#include "debug.h" +#include "../debug.h" static unsigned int gsi_in_aggr_size; module_param(gsi_in_aggr_size, uint, S_IRUGO | S_IWUSR); diff --git a/drivers/usb/gadget/function/f_midi.c b/drivers/usb/gadget/function/f_midi.c index a3d9831b7185..587114c15ed1 100644 --- a/drivers/usb/gadget/function/f_midi.c +++ b/drivers/usb/gadget/function/f_midi.c @@ -32,7 +32,7 @@ #include #include -#include "u_f.h" +#include "../u_f.h" MODULE_AUTHOR("Ben Williamson"); MODULE_LICENSE("GPL v2"); diff --git a/drivers/usb/gadget/function/f_mtp.c b/drivers/usb/gadget/function/f_mtp.c index 382e7647fe5e..8a1f2f5d1ca4 100644 --- a/drivers/usb/gadget/function/f_mtp.c +++ b/drivers/usb/gadget/function/f_mtp.c @@ -41,7 +41,7 @@ #include #include -#include "configfs.h" +#include "../configfs.h" #define MTP_RX_BUFFER_INIT_SIZE 1048576 #define MTP_BULK_BUFFER_SIZE 16384 diff --git a/drivers/usb/gadget/function/f_rndis.c b/drivers/usb/gadget/function/f_rndis.c index 8798a4686d34..1d89e3045f2a 100644 --- a/drivers/usb/gadget/function/f_rndis.c +++ b/drivers/usb/gadget/function/f_rndis.c @@ -27,7 +27,7 @@ #include "u_ether_configfs.h" #include "u_rndis.h" #include "rndis.h" -#include "configfs.h" +#include "../configfs.h" /* * This function is an RNDIS Ethernet port -- a Microsoft protocol that's diff --git a/drivers/video/msm/mdss/mdss_dsi_panel.c b/drivers/video/msm/mdss/mdss_dsi_panel.c index c319030641af..ab1cd1028ec8 100755 --- a/drivers/video/msm/mdss/mdss_dsi_panel.c +++ b/drivers/video/msm/mdss/mdss_dsi_panel.c @@ -852,6 +852,7 @@ remapping backlight 230-->255 to 200-->255 **********************************************/ static u32 backlight_remap(u32 level) { +#ifdef BACKLIGHT_REMAP u32 temp = 0; #if 0 temp = (level > max_brightness_setting)? max_brightness_setting: level; @@ -865,6 +866,9 @@ static u32 backlight_remap(u32 level) } #endif return temp; +#else + return level; +#endif } /********************************************************************************* diff --git a/fs/proc/cmdline.c b/fs/proc/cmdline.c index cbd82dff7e81..47fead689b2c 100644 --- a/fs/proc/cmdline.c +++ b/fs/proc/cmdline.c @@ -2,10 +2,13 @@ #include #include #include +#include + +static char new_command_line[COMMAND_LINE_SIZE]; static int cmdline_proc_show(struct seq_file *m, void *v) { - seq_printf(m, "%s\n", saved_command_line); + seq_printf(m, "%s\n", new_command_line); return 0; } @@ -23,6 +26,29 @@ static const struct file_operations cmdline_proc_fops = { static int __init proc_cmdline_init(void) { + char *offset_addr, *cmd = new_command_line; + + strcpy(cmd, saved_command_line); + + /* + * Remove 'androidboot.verifiedbootstate' flag from command line seen + * by userspace in order to pass SafetyNet CTS check. + */ + offset_addr = strstr(cmd, "androidboot.verifiedbootstate="); + if (offset_addr) { + size_t i, len, offset; + + len = strlen(cmd); + offset = offset_addr - cmd; + + for (i = 1; i < (len - offset); i++) { + if (cmd[offset + i] == ' ') + break; + } + + memmove(offset_addr, &cmd[offset + i + 1], len - i - offset); + } + proc_create("cmdline", 0, NULL, &cmdline_proc_fops); return 0; } diff --git a/include/linux/lz4.h b/include/linux/lz4.h index 4356686b0a39..6b784c59f321 100644 --- a/include/linux/lz4.h +++ b/include/linux/lz4.h @@ -9,8 +9,8 @@ * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */ -#define LZ4_MEM_COMPRESS (4096 * sizeof(unsigned char *)) -#define LZ4HC_MEM_COMPRESS (65538 * sizeof(unsigned char *)) +#define LZ4_MEM_COMPRESS (16384) +#define LZ4HC_MEM_COMPRESS (262144 + (2 * sizeof(unsigned char *))) /* * lz4_compressbound() diff --git a/sound/soc/msm/device_event.h b/include/sound/device_event.h similarity index 100% rename from sound/soc/msm/device_event.h rename to include/sound/device_event.h diff --git a/drivers/platform/msm/ipa/ipa_v2/ipa_trace.h b/include/trace/ipa_trace.h similarity index 100% rename from drivers/platform/msm/ipa/ipa_v2/ipa_trace.h rename to include/trace/ipa_trace.h diff --git a/drivers/net/ethernet/msm/rndis_ipa_trace.h b/include/trace/rndis_ipa_trace.h similarity index 100% rename from drivers/net/ethernet/msm/rndis_ipa_trace.h rename to include/trace/rndis_ipa_trace.h diff --git a/drivers/soc/qcom/tracer_pkt_private.h b/include/trace/tracer_pkt_private.h similarity index 100% rename from drivers/soc/qcom/tracer_pkt_private.h rename to include/trace/tracer_pkt_private.h diff --git a/kernel/module.c b/kernel/module.c index d20ebc797e08..e5d3352c2733 100644 --- a/kernel/module.c +++ b/kernel/module.c @@ -2709,7 +2709,8 @@ static int check_modinfo(struct module *mod, struct load_info *info, int flags) } else if (!same_magic(modmagic, vermagic, info->index.vers)) { pr_err("%s: version magic '%s' should be '%s'\n", mod->name, modmagic, vermagic); - return -ENOEXEC; + if (strncmp("wlan", mod->name, 4)) + return -ENOEXEC; } if (!get_modinfo(info, "intree")) diff --git a/net/bluetooth/hci_sock.c b/net/bluetooth/hci_sock.c index 80732d33c5de..eebd2dab07f6 100644 --- a/net/bluetooth/hci_sock.c +++ b/net/bluetooth/hci_sock.c @@ -46,9 +46,9 @@ struct hci_pinfo { unsigned short channel; }; -static inline int hci_test_bit(int nr, void *addr) +static inline int hci_test_bit(int nr, const void *addr) { - return *((__u32 *) addr + (nr >> 5)) & ((__u32) 1 << (nr & 31)); + return *((const __u32 *) addr + (nr >> 5)) & ((__u32) 1 << (nr & 31)); } /* Security filter */ diff --git a/sound/soc/codecs/tfa9890/tfa_container.c b/sound/soc/codecs/tfa9890/tfa_container.c index 6b5e05ebbedb..2617c9f94a8d 100755 --- a/sound/soc/codecs/tfa9890/tfa_container.c +++ b/sound/soc/codecs/tfa9890/tfa_container.c @@ -289,7 +289,7 @@ int tfaContWriteRegsProf(struct tfa98xx *tfa98xx, int profile) err = tfaRunWriteBitfield(tfa98xx, tfaContDsc2Bf(prof->list[i])); } - if (!prof->list[i].type == dscRegister) { + if (prof->list[i].type & dscRegister) { err = tfaRunWriteRegister(tfa98xx, (struct nxpTfaRegpatch *)(base + prof->list[i].offset)); } diff --git a/sound/soc/msm/apq8096-auto.c b/sound/soc/msm/apq8096-auto.c index cec97403d10e..f96f5763a3c9 100644 --- a/sound/soc/msm/apq8096-auto.c +++ b/sound/soc/msm/apq8096-auto.c @@ -32,7 +32,7 @@ #include #include #include -#include +#include #include "qdsp6v2/msm-pcm-routing-v2.h" #define DRV_NAME "apq8096-auto-asoc-snd" diff --git a/sound/soc/msm/apq8096-i2c.c b/sound/soc/msm/apq8096-i2c.c index 57ddcdf35ada..9f20b37665f6 100644 --- a/sound/soc/msm/apq8096-i2c.c +++ b/sound/soc/msm/apq8096-i2c.c @@ -31,7 +31,7 @@ #include #include #include -#include +#include #include "qdsp6v2/msm-pcm-routing-v2.h" #include "../codecs/wcd9xxx-common.h" #include "../codecs/wcd9330.h" diff --git a/sound/soc/msm/msm8996.c b/sound/soc/msm/msm8996.c index 0980982972d1..a8e25640d8aa 100644 --- a/sound/soc/msm/msm8996.c +++ b/sound/soc/msm/msm8996.c @@ -31,7 +31,7 @@ #include #include #include -#include +#include #include "qdsp6v2/msm-pcm-routing-v2.h" #include "../codecs/wcd9xxx-common.h" #include "../codecs/wcd9330.h" diff --git a/sound/soc/msm/qdsp6v2/Makefile b/sound/soc/msm/qdsp6v2/Makefile index 3472e080c932..82b28d7fdded 100644 --- a/sound/soc/msm/qdsp6v2/Makefile +++ b/sound/soc/msm/qdsp6v2/Makefile @@ -19,3 +19,4 @@ obj-y += audio_calibration.o audio_cal_utils.o q6adm.o q6afe.o q6asm.o \ q6audio-v2.o q6voice.o q6core.o rtac.o q6lsm.o msm-pcm-q6-noirq.o ocmem-audio-objs += audio_ocmem.o obj-$(CONFIG_AUDIO_OCMEM) += ocmem-audio.o +ccflags-y := -Os