static int bq27x00_powersupply_init(struct bq27x00_device_info *di) { int ret; di->bat.type = POWER_SUPPLY_TYPE_BATTERY; di->chip = BQ27425; if (di->chip == BQ27425) { di->bat.properties = bq27425_battery_props; di->bat.num_properties = ARRAY_SIZE(bq27425_battery_props); } else { di->bat.properties = bq27x00_battery_props; di->bat.num_properties = ARRAY_SIZE(bq27x00_battery_props); } di->bat.get_property = bq27x00_battery_get_property; di->bat.external_power_changed = bq27x00_external_power_changed; INIT_DELAYED_WORK(&di->work, bq27x00_battery_poll); mutex_init(&di->lock); ret = power_supply_register(di->dev, &di->bat); if (ret) { dev_err(di->dev, "failed to register battery: %d\n", ret); return ret; } dev_info(di->dev, "support ver. %s enabled\n", DRIVER_VERSION); bq27x00_update(di); return 0; }
static irqreturn_t bq27425_irq_handler(int irq, void *data) { struct bq27x00_device_info *di = data; dev_dbg(di->dev, "battery ISR is touched...\n"); bq27x00_update(di); return IRQ_HANDLED; }
static void bq27x00_battery_poll(struct work_struct *work) { struct bq27x00_device_info *di = container_of(work, struct bq27x00_device_info, work.work); bq27x00_update(di); if (poll_interval > 0) { /* The timer does not have to be accurate. */ set_timer_slack(&di->work.timer, poll_interval * HZ / 4); schedule_delayed_work(&di->work, poll_interval * HZ); } }
static int bq27x00_powersupply_init(struct bq27x00_device_info *di, const char *name) { int ret; struct power_supply_desc *psy_desc; struct power_supply_config psy_cfg = { .drv_data = di, }; psy_desc = devm_kzalloc(di->dev, sizeof(*psy_desc), GFP_KERNEL); if (!psy_desc) return -ENOMEM; psy_desc->name = name; psy_desc->type = POWER_SUPPLY_TYPE_BATTERY; if (di->chip == BQ27425) { psy_desc->properties = bq27425_battery_props; psy_desc->num_properties = ARRAY_SIZE(bq27425_battery_props); } else if (di->chip == BQ27742) { psy_desc->properties = bq27742_battery_props; psy_desc->num_properties = ARRAY_SIZE(bq27742_battery_props); } else if (di->chip == BQ27510) { psy_desc->properties = bq27510_battery_props; psy_desc->num_properties = ARRAY_SIZE(bq27510_battery_props); } else { psy_desc->properties = bq27x00_battery_props; psy_desc->num_properties = ARRAY_SIZE(bq27x00_battery_props); } psy_desc->get_property = bq27x00_battery_get_property; psy_desc->external_power_changed = bq27x00_external_power_changed; INIT_DELAYED_WORK(&di->work, bq27x00_battery_poll); mutex_init(&di->lock); di->bat = power_supply_register_no_ws(di->dev, psy_desc, &psy_cfg); if (IS_ERR(di->bat)) { ret = PTR_ERR(di->bat); dev_err(di->dev, "failed to register battery: %d\n", ret); return ret; } dev_info(di->dev, "support ver. %s enabled\n", DRIVER_VERSION); bq27x00_update(di); return 0; }