Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit bf02dca9 authored by Andreas Dannenberg's avatar Andreas Dannenberg Committed by Sebastian Reichel
Browse files

power: bq24257: Add basic support for bq24250/bq24251



This patch adds basic support for bq24250 and bq24251 which are very
similar to the bq24257 the driver was originally written for. Basic
support means the ability to select a device through Kconfig, DT and
ACPI, an instance variable allowing to check which chip is active, and
the reporting back of the selected device through the model_name power
supply sysfs property.

This patch by itself is not sufficient to actually use those two added
devices in a real-world setting due to some feature differences which
are addressed by other patches in this series.

Signed-off-by: default avatarAndreas Dannenberg <dannenberg@ti.com>
Reviewed-by: default avatarKrzysztof Kozlowski <k.kozlowski@samsung.com>
Signed-off-by: default avatarSebastian Reichel <sre@kernel.org>
parent fff59df1
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -409,12 +409,13 @@ config CHARGER_BQ24190
	  Say Y to enable support for the TI BQ24190 battery charger.

config CHARGER_BQ24257
	tristate "TI BQ24257 battery charger driver"
	tristate "TI BQ24250/24251/24257 battery charger driver"
	depends on I2C
	depends on GPIOLIB || COMPILE_TEST
	depends on REGMAP_I2C
	help
	  Say Y to enable support for the TI BQ24257 battery charger.
	  Say Y to enable support for the TI BQ24250, BQ24251, and BQ24257 battery
	  chargers.

config CHARGER_BQ24735
	tristate "TI BQ24735 battery charger support"
+49 −3
Original line number Diff line number Diff line
@@ -13,6 +13,10 @@
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * Datasheets:
 * http://www.ti.com/product/bq24250
 * http://www.ti.com/product/bq24251
 * http://www.ti.com/product/bq24257
 */

#include <linux/module.h>
@@ -40,6 +44,22 @@

#define BQ24257_ILIM_SET_DELAY		1000	/* msec */

/*
 * When adding support for new devices make sure that enum bq2425x_chip and
 * bq2425x_chip_name[] always stay in sync!
 */
enum bq2425x_chip {
	BQ24250,
	BQ24251,
	BQ24257,
};

static const char *const bq2425x_chip_name[] = {
	"bq24250",
	"bq24251",
	"bq24257",
};

enum bq24257_fields {
	F_WD_FAULT, F_WD_EN, F_STAT, F_FAULT,			    /* REG 1 */
	F_RESET, F_IILIMIT, F_EN_STAT, F_EN_TERM, F_CE, F_HZ_MODE,  /* REG 2 */
@@ -70,6 +90,8 @@ struct bq24257_device {
	struct device *dev;
	struct power_supply *charger;

	enum bq2425x_chip chip;

	struct regmap *rmap;
	struct regmap_field *rmap_fields[F_MAX_FIELDS];

@@ -248,6 +270,10 @@ static int bq24257_power_supply_get_property(struct power_supply *psy,
		val->strval = BQ24257_MANUFACTURER;
		break;

	case POWER_SUPPLY_PROP_MODEL_NAME:
		val->strval = bq2425x_chip_name[bq->chip];
		break;

	case POWER_SUPPLY_PROP_ONLINE:
		val->intval = state.power_good;
		break;
@@ -561,6 +587,7 @@ static int bq24257_hw_init(struct bq24257_device *bq)

static enum power_supply_property bq24257_power_supply_props[] = {
	POWER_SUPPLY_PROP_MANUFACTURER,
	POWER_SUPPLY_PROP_MODEL_NAME,
	POWER_SUPPLY_PROP_STATUS,
	POWER_SUPPLY_PROP_ONLINE,
	POWER_SUPPLY_PROP_HEALTH,
@@ -644,6 +671,7 @@ static int bq24257_probe(struct i2c_client *client,
{
	struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent);
	struct device *dev = &client->dev;
	const struct acpi_device_id *acpi_id;
	struct bq24257_device *bq;
	int ret;
	int i;
@@ -660,6 +688,18 @@ static int bq24257_probe(struct i2c_client *client,
	bq->client = client;
	bq->dev = dev;

	if (ACPI_HANDLE(dev)) {
		acpi_id = acpi_match_device(dev->driver->acpi_match_table,
					    &client->dev);
		if (!acpi_id) {
			dev_err(dev, "Failed to match ACPI device\n");
			return -ENODEV;
		}
		bq->chip = (enum bq2425x_chip)acpi_id->driver_data;
	} else {
		bq->chip = (enum bq2425x_chip)id->driver_data;
	}

	mutex_init(&bq->lock);

	bq->rmap = devm_regmap_init_i2c(client, &bq24257_regmap_config);
@@ -722,7 +762,7 @@ static int bq24257_probe(struct i2c_client *client,
					bq24257_irq_handler_thread,
					IRQF_TRIGGER_FALLING |
					IRQF_TRIGGER_RISING | IRQF_ONESHOT,
					"bq24257", bq);
					bq2425x_chip_name[bq->chip], bq);
	if (ret) {
		dev_err(dev, "Failed to request IRQ #%d\n", client->irq);
		return ret;
@@ -793,19 +833,25 @@ static const struct dev_pm_ops bq24257_pm = {
};

static const struct i2c_device_id bq24257_i2c_ids[] = {
	{ "bq24257", 0 },
	{ "bq24250", BQ24250 },
	{ "bq24251", BQ24251 },
	{ "bq24257", BQ24257 },
	{},
};
MODULE_DEVICE_TABLE(i2c, bq24257_i2c_ids);

static const struct of_device_id bq24257_of_match[] = {
	{ .compatible = "ti,bq24250", },
	{ .compatible = "ti,bq24251", },
	{ .compatible = "ti,bq24257", },
	{ },
};
MODULE_DEVICE_TABLE(of, bq24257_of_match);

static const struct acpi_device_id bq24257_acpi_match[] = {
	{"BQ242570", 0},
	{ "BQ242500", BQ24250 },
	{ "BQ242510", BQ24251 },
	{ "BQ242570", BQ24257 },
	{},
};
MODULE_DEVICE_TABLE(acpi, bq24257_acpi_match);