Example #1
0
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(&notifier_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(&notifier_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;
}