static void ate_event(struct input_handle *handle, unsigned int type, unsigned int code, int value) { unsigned short i; struct input_event_data *ie_data = NULL; struct input_dev *dev = NULL; int value_temp = value; unsigned int code_temp = code; unsigned int type_temp = type; if (0 == ate_dt->is_record) { return; } #ifdef TI_OMAP_PLATFORM if(CONNECTED != get_plugin_device_status()) { ate_dt->has_usb_disconnect = true; } #endif #if defined MSM_8960_PLATFORM || defined HISI_K3_PLATFORM if(CONNECTED != ate_dt->usb_status) { ate_dt->has_usb_disconnect = true; } #endif for (i = 0; i < ate_dt->ate_dev.input_dev_sum; i++) { dev = ate_dt->ate_dev.input_dev_table[i]; if((true == ate_dt->ate_dev.valid[i]) && (0 == strcmp(handle->dev->name, dev->name))) { #ifdef ATE_DEBUG printk(KERN_DEBUG "index=%d, name=%s\n", i, dev->name); printk(KERN_DEBUG "type=%d, code=%d, value=%d\n",type_temp,code_temp,value_temp); #endif if(0 !=ate_dt->ie_times && true == ate_dt->has_usb_disconnect) { ie_data = ate_dt->ie_dt + ate_dt->ie_times - 1; if(POWER_KEY_EVENT == ate_dt->ate_dev.input_event_type[i] && EV_SYN == type_temp && POWER_KEY_EVENT == ie_data->dev_no && EV_SYN != ie_data->type) { ate_dt->pwrkey_jiffies_end_record = jiffies; ate_dt->pwrkey_step = ate_dt->ie_times; } } #ifdef COHERENCE_FLATFORM if(TOUCH_EVENT == ate_dt->ate_dev.input_event_type[i]) { if(EV_ABS == type_temp) { if(ABS_MT_TOUCH_MAJOR == code_temp) { #ifdef ATE_DEBUG printk("code_temp=%d\n",code_temp); #endif ate_dt->vlbutton.vlkey_dev.l.w = value_temp; ate_dt->vlbutton.first_step = ate_dt->ie_times; ate_dt->vlbutton.first_t = jiffies; } else if(ABS_MT_WIDTH_MAJOR== code_temp) { #ifdef ATE_DEBUG printk("code_temp=%d\n",code_temp); #endif ate_dt->vlbutton.vlkey_dev.l.h = value_temp; }else if(ABS_MT_POSITION_X== code_temp) { #ifdef ATE_DEBUG printk("code_temp=%d\n",code_temp); #endif ate_dt->vlbutton.vlkey_dev.l.x = value_temp; value_temp = MAX_VIRTUAL_SCREEN_SIZE*value_temp/(dev->absinfo[ABS_MT_POSITION_X].maximum); } else if (ABS_MT_POSITION_Y== code_temp ) { #ifdef ATE_DEBUG printk("code_temp=%d\n",code_temp); #endif if(value_temp <= dev->absinfo[ABS_MT_POSITION_Y].maximum) { value_temp = MAX_VIRTUAL_SCREEN_SIZE*value_temp/(dev->absinfo[ABS_MT_POSITION_Y].maximum); } else { #ifdef ATE_DEBUG printk("code_temp=%d\n",code_temp); #endif ate_dt->vlbutton.flag = true; ate_dt->vlbutton.vlkey_dev.l.y = value_temp; } } } else if (EV_SYN == type_temp) { if(true == ate_dt->vlbutton.flag) { ate_dt->vlbutton.end_step = ate_dt->ie_times; ate_dt->vlbutton.end_t = jiffies; } } } if(0 != ate_dt->ie_times && true == ate_dt->has_virtualkey) { ie_data = ate_dt->ie_dt + ate_dt->ie_times - 1; if(TOUCH_EVENT != ate_dt->ate_dev.input_event_type[i] || (EV_SYN == ie_data->type && EV_SYN != type_temp)) { if(true == ate_dt->vlbutton.flag) { ate_dt->vlbutton.flag = false; virtualbutton_to_realbutton(); } } } #endif store_input_event_data((unsigned short)ate_dt->ate_dev.input_event_type[i], (unsigned short)type_temp, code_temp, value_temp); if(1 == ate_dt->ie_times && true == ate_dt->has_usb_disconnect) { if(POWER_KEY_EVENT != ate_dt->ate_dev.input_event_type[i] || EV_SYN == type_temp ) { ate_dt->ie_times = 0; } } } } }
static int __devinit bq2416x_charger_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct bq2416x_device_info *di; struct bq2416x_platform_data *pdata = client->dev.platform_data; int ret; u8 read_reg = 0; enum plugin_status plugin_stat; di = kzalloc(sizeof(*di), GFP_KERNEL); if (!di) return -ENOMEM; di->dev = &client->dev; di->client = client; i2c_set_clientdata(client, di); ret = bq2416x_read_byte(di, &read_reg, REG_PART_REVISION); if (ret < 0) { dev_err(&client->dev, "chip not present at address %x\n", client->addr); ret = -EINVAL; goto err_kfree; } #if 0 if ((read_reg & 0x18) == 0x00 && (client->addr == 0x6a)) di->bqchip_version = BQ24156; #endif if ((read_reg & 0x18) == 0x00 && (client->addr == 0x6b)) di->bqchip_version = BQ24161; if (di->bqchip_version == 0) { dev_dbg(&client->dev, "unknown bq chip\n"); dev_dbg(&client->dev, "Chip address %x", client->addr); dev_dbg(&client->dev, "bq chip version reg value %x", read_reg); ret = -EINVAL; goto err_kfree; } // di->nb.notifier_call = bq2416x_charger_event; #if 0 bq2415x_config_safety_reg(di, pdata->max_charger_currentmA, pdata->max_charger_voltagemV); di->cin_limit = 900; di->term_currentmA = pdata->termination_currentmA; bq2415x_config_control_reg(di); bq2415x_config_voltage_reg(di); bq2415x_config_current_reg(di); #endif /*set gpio_174 to control CD pin to disable/enable bq24161 IC*/ gpio_request(BQ2416X_GPIO_174, "gpio_174_cd"); /* set charger CD pin to low level and enable it to supply power normally*/ gpio_direction_output(BQ2416X_GPIO_174, 0); ret = bq2416x_get_max_charge_voltage(di); if(!ret){ di->max_voltagemV = pdata->max_charger_voltagemV; } di->voltagemV = di->max_voltagemV; ret = bq2416x_get_max_charge_current(di); if(!ret){ di->max_currentmA = pdata->max_charger_currentmA; } di->currentmA = CURRENT_USB_CHARGE_IN ; di->term_currentmA = CURRENT_TERM_CHARGE_IN; di->dppm_voltagemV = VOLT_DPPM_ADJUST; di->cin_limit = CURRENT_USB_LIMIT_IN; di->enable_hotcold_temp_charge = set_one; di->enable_low_chg = DISABLE_LOW_CHG;/*set normally charge mode*/ di->enable_iterm = ENABLE_ITERM; /*enable charge current termination*/ di->factory_flag = 0; di->enable_ce = ENABLE_CE; di->hz_mode = 0; di->cd_active = 0; INIT_DELAYED_WORK_DEFERRABLE(&di->bq2416x_charger_work, bq2416x_charger_work); #if BQ2416X_USE_WAKE_LOCK wake_lock_init(&di->charger_wake_lock, WAKE_LOCK_SUSPEND, "charger_wake_lock"); #endif //BLOCKING_INIT_NOTIFIER_HEAD(¬ifier_list); di->active = 0; di->params.enable = 1; di->cfg_params = 1; bq2416x_config_control_reg(di); bq2416x_config_voltage_reg(di); bq2416x_config_current_reg(di); bq2416x_config_dppm_voltage_reg(di,di->dppm_voltagemV); bq2416x_config_safety_reg(di); #if 0 ret = bq2416x_read_byte(di, &read_reg, REG_SPECIAL_CHARGER_VOLTAGE); if (!(read_reg & 0x08)) { di->active = 1; schedule_delayed_work(&di->bq2415x_charger_work, 0); } #endif ret = sysfs_create_group(&client->dev.kobj, &bq2416x_attr_group); if (ret) dev_dbg(&client->dev, "could not create sysfs files\n"); //twl6030_register_notifier(&di->nb, 1); INIT_WORK(&di->usb_work, bq2416x_usb_charger_work); //r00186667, 2011/08/02, otg register for receive USB/AC plugin event.begin di->nb_otg.notifier_call = bq2416x_usb_notifier_call; di->otg = otg_get_transceiver(); ret = otg_register_notifier(di->otg, &di->nb_otg); if (ret) dev_err(&client->dev, "otg register notifier failed %d\n", ret); //r00186667, 2011/08/02, otg register for receive USB/AC plugin event.end //r00186667, 2011/08/02, get the boot event type.begin plugin_stat = get_plugin_device_status(); if( PLUGIN_USB_CHARGER == plugin_stat){ di->event = USB_EVENT_VBUS; }else if (PLUGIN_AC_CHARGER == plugin_stat){ di->event = USB_EVENT_CHARGER; }else{ di->event = USB_EVENT_NONE; } schedule_work(&di->usb_work); //r00186667, 2011/08/02, get the boot event type.end return 0; err_kfree: kfree(di); return ret; }
static int __devinit bq2416x_charger_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct bq2416x_device_info *di; struct bq2416x_platform_data *pdata = client->dev.platform_data; int ret; u8 read_reg = 0; enum plugin_status plugin_stat; di = kzalloc(sizeof(*di), GFP_KERNEL); if (!di) return -ENOMEM; di->dev = &client->dev; di->client = client; i2c_set_clientdata(client, di); ret = bq2416x_read_byte(di, &read_reg, REG_PART_REVISION_REG04); if (ret < 0) { dev_err(&client->dev, "chip not present at address %x\n", client->addr); ret = -EINVAL; goto err_kfree; } if ((read_reg & 0x18) == 0x00 && (client->addr == 0x6b)) di->bqchip_version = BQ24161; if (di->bqchip_version == 0) { dev_dbg(&client->dev, "unknown bq chip\n"); dev_dbg(&client->dev, "Chip address %x", client->addr); dev_dbg(&client->dev, "bq chip version reg value %x", read_reg); ret = -EINVAL; goto err_kfree; } // di->nb.notifier_call = bq2416x_charger_event; /*set gpio_174 to control CD pin to disable/enable bq24161 IC*/ gpio_request(ENABLE_BQ2416x_CHARGER, "gpio_174_cd"); /* set charger CD pin to low level and enable it to supply power normally*/ gpio_direction_output(ENABLE_BQ2416x_CHARGER, 0); ret = bq2416x_get_max_charge_voltage(di); if(!ret){ di->max_voltagemV = pdata->max_charger_voltagemV; } ret = bq2416x_get_max_charge_current(di); if(!ret){ di->max_currentmA = pdata->max_charger_currentmA; } di->max_cin_currentmA = IINLIM_1000; di->voltagemV = di->max_voltagemV; di->currentmA = ICHG_MIN_550 ; di->term_currentmA = ITERM_MIN_50; di->dppm_voltagemV = VINDPM_MIN_4200; di->cin_limit = IINLIM_500; di->safety_timer = TMR_X_9; di->enable_low_chg = DISABLE_LOW_CHG;/*set normally charge mode*/ di->enable_iterm = ENABLE_ITERM; /*enable charge current termination*/ di->supply_sel = SUPPLY_SEL_IN; di->factory_flag = 0; di->enable_ce = ENABLE_CHARGER; di->hz_mode = DIS_HIZ; di->cd_active = 0; INIT_DELAYED_WORK_DEFERRABLE(&di->bq2416x_charger_work, bq2416x_charger_work); wake_lock_init(&di->charger_wake_lock, WAKE_LOCK_SUSPEND, "charger_wake_lock"); //BLOCKING_INIT_NOTIFIER_HEAD(¬ifier_list); di->params.enable = 1; di->cfg_params = 1; bq2416x_config_control_reg(di); bq2416x_config_voltage_reg(di); bq2416x_config_current_reg(di); bq2416x_config_dppm_voltage_reg(di,di->dppm_voltagemV); bq2416x_config_safety_reg(di); ret = sysfs_create_group(&client->dev.kobj, &bq2416x_attr_group); if (ret) dev_dbg(&client->dev, "could not create sysfs files\n"); //twl6030_register_notifier(&di->nb, 1); INIT_WORK(&di->usb_work, bq2416x_usb_charger_work); di->nb_otg.notifier_call = bq2416x_usb_notifier_call; di->otg = otg_get_transceiver(); ret = otg_register_notifier(di->otg, &di->nb_otg); if (ret) dev_err(&client->dev, "otg register notifier failed %d\n", ret); plugin_stat = get_plugin_device_status(); if( PLUGIN_USB_CHARGER == plugin_stat){ di->event = USB_EVENT_VBUS; }else if (PLUGIN_AC_CHARGER == plugin_stat){ di->event = USB_EVENT_CHARGER; }else{ di->event = USB_EVENT_NONE; } schedule_work(&di->usb_work); return 0; err_kfree: kfree(di); return ret; }