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; }
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; }