Example #1
0
static int bq27541_battery_probe(struct i2c_client *client,
				 const struct i2c_device_id *id)
{
	struct bq27541_device_info *di;
	int retval = 0;
	struct bq27541_platform_data *pdata;
	int val =0;
	char buf[2];
	int volt;
	DBG("**********  bq27541_battery_probe**************  ");
	pdata = client->dev.platform_data;
	g_pdata = pdata;

	di = kzalloc(sizeof(*di), GFP_KERNEL);
	if (!di) {
		dev_err(&client->dev, "failed to allocate device info data\n");
		retval = -ENOMEM;
		goto batt_failed_2;
	}
	i2c_set_clientdata(client, di);
	di->dev = &client->dev;
	di->bat.name = "battery";
	di->client = client;
	/* 1 seconds between monotor runs interval */
	di->interval = msecs_to_jiffies(4 * 1000);
	
	di->bat_num = pdata->bat_num;
	di->dc_check_pin = pdata->dc_check_pin;
	di->bat_check_pin = pdata->bat_check_pin;
	
	if (pdata->init_dc_check_pin)
		pdata->init_dc_check_pin( );
	
	bq27541_powersupply_init(di);
	mutex_init(&g_bq27541_mutex);

	retval = bq27541_read(di->client,BQ27x00_REG_FLAGS, buf, 2);
	if (retval < 0) {
		printk("can't find bq27541\n");
		goto batt_failed_2;
	}else{
		rk30_bat_unregister();
		bq27541_init = 1;
	}
	
	retval = power_supply_register(&client->dev, &di->bat);
	if (retval) {
		dev_err(&client->dev, "failed to register battery\n");
		goto batt_failed_4;
	}
	bq27541_di = di;
#if 0
	retval = power_supply_register(&client->dev, &di->ac);
	if (retval) {
		dev_err(&client->dev, "failed to register ac\n");
		goto batt_failed_4;
	}
#endif

	INIT_DELAYED_WORK(&di->work, bq27541_battery_work);
	schedule_delayed_work(&di->work, di->interval);
	dev_info(&client->dev, "support ver. %s enabled\n", DRIVER_VERSION);

	battery_capacity_check(di);
#if defined(CONFIG_CHARGER_LIMITED_BY_TEMP)
	bq27541_sysfs_init();
#endif

	return 0;

batt_failed_4:
	kfree(di);
batt_failed_2:

err_batirq_failed:
	gpio_free(pdata->bat_check_pin);

	return retval;
}
Example #2
0
static int bq27541_battery_probe(struct i2c_client *client,
				 const struct i2c_device_id *id)
{
	struct bq27541_device_info *di;
	int retval = 0;
	struct bq27541_platform_data *pdata;
	int val =0;
	char buf[2];
	int volt;
	DBG("**********  bq27541_battery_probe**************  ");
	pdata = client->dev.platform_data;
	
	di = kzalloc(sizeof(*di), GFP_KERNEL);
	if (!di) {
		dev_err(&client->dev, "failed to allocate device info data\n");
		retval = -ENOMEM;
		goto batt_failed_2;
	}
	i2c_set_clientdata(client, di);
	di->dev = &client->dev;
	di->bat.name = "bq27541-battery";
	di->client = client;
	/* 4 seconds between monotor runs interval */
	di->interval = msecs_to_jiffies(4 * 1000);
	
	di->bat_num = pdata->bat_num;
	di->dc_check_pin = pdata->dc_check_pin;
	di->bat_check_pin = pdata->bat_check_pin;
	
	if (pdata->init_dc_check_pin)
		pdata->init_dc_check_pin( );
	
	bq27541_powersupply_init(di);

	
	
	retval = power_supply_register(&client->dev, &di->bat);
	if (retval) {
		dev_err(&client->dev, "failed to register battery\n");
		goto batt_failed_4;
	}
	bq27541_di = di;
	retval = power_supply_register(&client->dev, &di->ac);
	if (retval) {
		dev_err(&client->dev, "failed to register ac\n");
		goto batt_failed_4;
	}
	INIT_DELAYED_WORK(&di->work, bq27541_battery_work);
	schedule_delayed_work(&di->work, di->interval);
	dev_info(&client->dev, "support ver. %s enabled\n", DRIVER_VERSION);

#if  !defined (CONFIG_NO_BATTERY_IC)

	// no battery  , no power up
	gpio_request(POWER_ON_PIN, "poweronpin");
	gpio_request(pdata->bat_check_pin, NULL);
	gpio_direction_input(pdata->bat_check_pin);
	gpio_request(pdata->chgok_check_pin, "CHG_OK");
	gpio_direction_input(pdata->chgok_check_pin);

	val = gpio_get_value(pdata->bat_check_pin);
	if (val == 1){
		printk("\n\n!!! bat_low  high !!!\n\n");
		val = bq27541_read(di->client,BQ27x00_REG_VOLT,buf,2);
		if (val < 0){
			printk("\n\n!!! bq i2c err! no battery,  power down\n!!!\n\n");
			gpio_direction_output(POWER_ON_PIN, GPIO_LOW);	
			while(1){
				gpio_set_value(POWER_ON_PIN, GPIO_LOW);
				mdelay(100);
			}
		}

	}else{
			
		printk("\n\n!!! bat_low  low !!!\n\n");
		val = gpio_get_value(pdata->chgok_check_pin);
		if (val == 1){
			printk("no battery, power down \n");
			gpio_direction_output(POWER_ON_PIN, GPIO_LOW);
			while(1){
				gpio_set_value(POWER_ON_PIN, GPIO_LOW);
				mdelay(100);
			}
		}else{
			mdelay(1000);
			val = gpio_get_value(pdata->chgok_check_pin);
			if (val == 1){
				printk("no battery, power down \n");
				gpio_direction_output(POWER_ON_PIN, GPIO_LOW);			
				while(1){
					gpio_set_value(POWER_ON_PIN, GPIO_LOW);
					mdelay(100);
				}
			}
		}

	}

//	gpio_free(POWER_ON_PIN);
//	gpio_free(pdata->bat_check_pin);
	gpio_free(pdata->chgok_check_pin);


	//smaller  3.4V , no power up
	if (gpio_get_value(di->dc_check_pin) && (gpio_get_value(pdata->bat_check_pin) == 0)){
			printk("no AC && battery low ,so power down \n");
			gpio_direction_output(POWER_ON_PIN, GPIO_LOW);			
			while(1){
				printk("no AC && battery low ,so power down \n");
				gpio_set_value(POWER_ON_PIN, GPIO_LOW);
				mdelay(100);
			}
	}	

	
	// battery low irq
	di->wake_irq = gpio_to_irq(pdata->bat_check_pin);
	retval = request_irq(di->wake_irq, bq27541_bat_wakeup, IRQF_TRIGGER_FALLING, "bq27541_battery", di);
	if (retval) {
		printk("failed to request bat det irq\n");
		goto err_batirq_failed;
	}
	
	INIT_DELAYED_WORK(&di->wakeup_work, bq27541_battery_wake_work);
	enable_irq_wake(di->wake_irq);


#endif
	
	return 0;

batt_failed_4:
	kfree(di);
batt_failed_2:

err_batirq_failed:
	gpio_free(pdata->bat_check_pin);

	return retval;
}