static void k3g_work_func(struct work_struct *work) { int res; struct k3g_data *k3g_data = container_of(work, struct k3g_data, work); if(DEBUG_FUNC_TRACE & debug_mask) printk(KERN_INFO "%s: line %d\n", __func__, __LINE__); if(k3g_data->enable == 0) { return; } do { res = k3g_read_fifo_status(k3g_data); if (res < 0) return; if (res < k3g_data->entries) { pr_warn("%s: fifo entries are less than we want\n", __func__); goto timer_set; } res = k3g_report_gyro_values(k3g_data); if (res < 0) return; timer_set: set_polling_delay(k3g_data, res); } while (!ktime_to_ns(k3g_data->polling_delay)); hrtimer_start(&k3g_data->timer, k3g_data->polling_delay, HRTIMER_MODE_REL); }
static void k3g_work_func(struct work_struct *work) { int res; struct k3g_data *k3g_data = container_of(work, struct k3g_data, work); gyro_debug("GYRO sensor enter function %s\n",__FUNCTION__); do { res = k3g_read_fifo_status(k3g_data); if (res < 0) return; if (res < k3g_data->entries) { pr_warn("%s: fifo entries are less than we want\n", __func__); goto timer_set; } res = k3g_report_gyro_values(k3g_data); if (res < 0) return; timer_set: set_polling_delay(k3g_data, res); } while (!ktime_to_ns(k3g_data->polling_delay)); if(likely(k3g_data->work_enable)) hrtimer_start(&k3g_data->timer, k3g_data->polling_delay, HRTIMER_MODE_REL); }
static int k3g_report_gyro_values(struct k3g_data *k3g_data) { int res; struct k3g_t data; gyro_debug("GYRO sensor enter function %s\n",__FUNCTION__); res = k3g_read_gyro_values(k3g_data->client, &data, k3g_data->entries + k3g_data->drop_next_event); if (res < 0) return res; res = k3g_read_fifo_status(k3g_data); k3g_data->drop_next_event = !res; if (res >= 31 - k3g_data->entries) { /* reset fifo to start again - data isn't trustworthy, * our locked read might not have worked and we * could have done i2c read in mid register update */ return k3g_restart_fifo(k3g_data); } input_report_rel(k3g_data->input_dev, REL_RX, data.x); input_report_rel(k3g_data->input_dev, REL_RY, data.y); input_report_rel(k3g_data->input_dev, REL_RZ, data.z); input_sync(k3g_data->input_dev); gyro_debug("GYRO sensor report x %d\n",data.x); gyro_debug("GYRO sensor report y %d\n",data.y); gyro_debug("GYRO sensor report z %d\n",data.z); return res; }
static int k3g_report_gyro_values(struct k3g_data *k3g_data) { int res; struct k3g_t data; if(DEBUG_FUNC_TRACE & debug_mask) printk(KERN_INFO "%s: line %d\n", __func__, __LINE__); res = k3g_read_gyro_values(k3g_data->client, &data, k3g_data->entries + k3g_data->drop_next_event); if (res < 0) return res; res = k3g_read_fifo_status(k3g_data); if(DEBUG_DEV_STATUS& debug_mask) printk(KERN_INFO "[k3g] read_fifo_status(%d)\n", res); k3g_data->drop_next_event = !res; if(DEBUG_DEV_STATUS& debug_mask) printk(KERN_INFO "[k3g] entries=%d\n", k3g_data->entries); if (res >= 31 - k3g_data->entries) { /* reset fifo to start again - data isn't trustworthy, * our locked read might not have worked and we * could have done i2c read in mid register update */ if(DEBUG_DEV_STATUS& debug_mask) printk(KERN_INFO "[k3g] call restart_fifo, entries=%d\n", k3g_data->entries); return k3g_restart_fifo(k3g_data); } #ifndef CONFIG_LGE_SENSOR_FUSION input_report_rel(k3g_data->input_dev, REL_RX, data.x); input_report_rel(k3g_data->input_dev, REL_RY, data.y); input_report_rel(k3g_data->input_dev, REL_RZ, data.z); input_sync(k3g_data->input_dev); #else k3g_gyro_data[0] = (int) data.x; k3g_gyro_data[1] = (int) data.y; k3g_gyro_data[2] = (int) data.z; #endif #ifdef CONFIG_MACH_LGE_I_BOARD_VZW //BEGIN:seungkwan.jung gyro_xyz[0] = data.x; gyro_xyz[1] = data.y; gyro_xyz[2] = data.z; //END:seungkwan.jung #endif if(DEBUG_DEV_DEBOUNCE & debug_mask) printk(KERN_INFO "%s: [k3g] x(%d), y(%d), z(%d)\n", __func__, data.x, data.y, data.z); report_cnt++; return res; }