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;
}
Esempio n. 3
0
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);
	}
}
Esempio n. 4
0
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;
}