mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-18 01:34:14 +08:00
9cc984e4bc
* add types for USB Type C and PD chargers * add act8945a charger driver * add ACPI/DT bindings for goldfish-battery * add support for versatile reset controller * misc. fixes -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAABCgAGBQJW6XstAAoJENju1/PIO/qaSmMP+gJY9U4yPscEoW2UkvKJ2y81 /Bxvy8GWSnnaFFPLMHYk/n53EPJbPnewETBftv1xRHzgJ6wQlgM/5EAEU2Qwud+A V8K3V8VStIZLIrQ1tU8r10UE5OW95lsupCAlFp9AHYrBgIiRDUHlqWtxuhwH12F2 uLZt7moLHJFZtvg3EWl4agsvoEWfqPOKwmOpda+PyIUOlZrAIu3nItvKwBKWdvr3 WuomqfknkekkvX2lSB8R4OfE+w4fkYTFak2+4ymNiaQWrLeEqLuJbICUNGMD+APb nX8TmQ8wmYYHLZTu455ctGJIdpYfrRI/IPAsdW/vMYnQ/8GiO0dgke5dfzZU08Du PAWb/NM2pjFfG76fqG46hQPq/Jsns9k/SM1e3Q6fCkwewqtx8P56vUML6FtomYe7 HP3oPqlNeEpcF/jMmxKfSNiF78pmRLpCkWuhhYaT4Suv8bJhoQRE7Ur00Y47hp9i taAIDE3HNFucqTEXMudBktEKsDPRpEx2K1fZEvZbCF8sOUK4xWPQr1yuPTXrM7jm sWl/T4s1tn9/P6esdZUTXGghBiehj71mCHsOfXBQZPifaB2s8uINEf+GHQyQcLL4 X2HiMWrv9Pyn+PLVVwWRmTpSVIFWrCHNQPQ1ofgsgWkrEqsAbdZ4O2srlCqg/4WL irCHBm6fbGpoVRQHg3xS =L4ho -----END PGP SIGNATURE----- Merge tag 'for-v4.6' of git://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply Pull power supply and reset changes from Sebastian Reichel: - add types for USB Type C and PD chargers - add act8945a charger driver - add ACPI/DT bindings for goldfish-battery - add support for versatile reset controller - misc fixes * tag 'for-v4.6' of git://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply: (24 commits) power: pm2301-charger: use __maybe_unused to hide pm functions power: ipaq-micro-battery: use __maybe_unused to hide pm functions power_supply: 88pm860x_charger: do not pass NULL to power_supply_put jz4740-battery: Correct voltage change check power_supply: lp8788-charger: initialize boolean 'found' goldfish: Enable ACPI-based enumeration for goldfish battery power: goldfish_battery: add devicetree bindings power: act8945a: add charger driver for ACT8945A power: add documentation for ACT8945A's charger DT bindings ARM: dts: n900: Rename isp1704 to isp1707 to match correct name power_supply: bq27xxx_battery: Add of modalias and match table when CONFIG_OF is enabled power_supply: bq2415x_charger: Add of modalias and match table when CONFIG_OF is enabled power_supply: bq2415x_charger: Do not add acpi modalias when CONFIG_ACPI is not enabled power_supply: isp1704_charger: Add compatible of match for nxp,isp1707 power_supply: isp1704_charger: Error messages when probe fail power_supply: Add types for USB Type C and PD chargers power: bq24735-charger: add 'ti,external-control' option power: bq24735-charger: document 'ti,external-control' option power: bq24735-charger: fix failed i2c with ac-detect power: reset: Fix dependencies for !HAS_IOMEM archs ...
206 lines
4.8 KiB
C
206 lines
4.8 KiB
C
/*
|
|
* SCI Reset driver for Keystone based devices
|
|
*
|
|
* Copyright (C) 2015 Texas Instruments Incorporated - http://www.ti.com/
|
|
* Andrew F. Davis <afd@ti.com>
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 as
|
|
* published by the Free Software Foundation.
|
|
*
|
|
* This program is distributed "as is" WITHOUT ANY WARRANTY of any
|
|
* kind, whether express or implied; without even the implied warranty
|
|
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*/
|
|
|
|
#include <linux/i2c.h>
|
|
#include <linux/interrupt.h>
|
|
#include <linux/module.h>
|
|
#include <asm/unaligned.h>
|
|
|
|
#include <linux/power/bq27xxx_battery.h>
|
|
|
|
static DEFINE_IDR(battery_id);
|
|
static DEFINE_MUTEX(battery_mutex);
|
|
|
|
static irqreturn_t bq27xxx_battery_irq_handler_thread(int irq, void *data)
|
|
{
|
|
struct bq27xxx_device_info *di = data;
|
|
|
|
bq27xxx_battery_update(di);
|
|
|
|
return IRQ_HANDLED;
|
|
}
|
|
|
|
static int bq27xxx_battery_i2c_read(struct bq27xxx_device_info *di, u8 reg,
|
|
bool single)
|
|
{
|
|
struct i2c_client *client = to_i2c_client(di->dev);
|
|
struct i2c_msg msg[2];
|
|
unsigned char data[2];
|
|
int ret;
|
|
|
|
if (!client->adapter)
|
|
return -ENODEV;
|
|
|
|
msg[0].addr = client->addr;
|
|
msg[0].flags = 0;
|
|
msg[0].buf = ®
|
|
msg[0].len = sizeof(reg);
|
|
msg[1].addr = client->addr;
|
|
msg[1].flags = I2C_M_RD;
|
|
msg[1].buf = data;
|
|
if (single)
|
|
msg[1].len = 1;
|
|
else
|
|
msg[1].len = 2;
|
|
|
|
ret = i2c_transfer(client->adapter, msg, ARRAY_SIZE(msg));
|
|
if (ret < 0)
|
|
return ret;
|
|
|
|
if (!single)
|
|
ret = get_unaligned_le16(data);
|
|
else
|
|
ret = data[0];
|
|
|
|
return ret;
|
|
}
|
|
|
|
static int bq27xxx_battery_i2c_probe(struct i2c_client *client,
|
|
const struct i2c_device_id *id)
|
|
{
|
|
struct bq27xxx_device_info *di;
|
|
int ret;
|
|
char *name;
|
|
int num;
|
|
|
|
/* Get new ID for the new battery device */
|
|
mutex_lock(&battery_mutex);
|
|
num = idr_alloc(&battery_id, client, 0, 0, GFP_KERNEL);
|
|
mutex_unlock(&battery_mutex);
|
|
if (num < 0)
|
|
return num;
|
|
|
|
name = devm_kasprintf(&client->dev, GFP_KERNEL, "%s-%d", id->name, num);
|
|
if (!name)
|
|
goto err_mem;
|
|
|
|
di = devm_kzalloc(&client->dev, sizeof(*di), GFP_KERNEL);
|
|
if (!di)
|
|
goto err_mem;
|
|
|
|
di->id = num;
|
|
di->dev = &client->dev;
|
|
di->chip = id->driver_data;
|
|
di->name = name;
|
|
di->bus.read = bq27xxx_battery_i2c_read;
|
|
|
|
ret = bq27xxx_battery_setup(di);
|
|
if (ret)
|
|
goto err_failed;
|
|
|
|
/* Schedule a polling after about 1 min */
|
|
schedule_delayed_work(&di->work, 60 * HZ);
|
|
|
|
i2c_set_clientdata(client, di);
|
|
|
|
if (client->irq) {
|
|
ret = devm_request_threaded_irq(&client->dev, client->irq,
|
|
NULL, bq27xxx_battery_irq_handler_thread,
|
|
IRQF_ONESHOT,
|
|
di->name, di);
|
|
if (ret) {
|
|
dev_err(&client->dev,
|
|
"Unable to register IRQ %d error %d\n",
|
|
client->irq, ret);
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
|
|
err_mem:
|
|
ret = -ENOMEM;
|
|
|
|
err_failed:
|
|
mutex_lock(&battery_mutex);
|
|
idr_remove(&battery_id, num);
|
|
mutex_unlock(&battery_mutex);
|
|
|
|
return ret;
|
|
}
|
|
|
|
static int bq27xxx_battery_i2c_remove(struct i2c_client *client)
|
|
{
|
|
struct bq27xxx_device_info *di = i2c_get_clientdata(client);
|
|
|
|
bq27xxx_battery_teardown(di);
|
|
|
|
mutex_lock(&battery_mutex);
|
|
idr_remove(&battery_id, di->id);
|
|
mutex_unlock(&battery_mutex);
|
|
|
|
return 0;
|
|
}
|
|
|
|
static const struct i2c_device_id bq27xxx_i2c_id_table[] = {
|
|
{ "bq27200", BQ27000 },
|
|
{ "bq27210", BQ27010 },
|
|
{ "bq27500", BQ27500 },
|
|
{ "bq27510", BQ27500 },
|
|
{ "bq27520", BQ27500 },
|
|
{ "bq27530", BQ27530 },
|
|
{ "bq27531", BQ27530 },
|
|
{ "bq27541", BQ27541 },
|
|
{ "bq27542", BQ27541 },
|
|
{ "bq27546", BQ27541 },
|
|
{ "bq27742", BQ27541 },
|
|
{ "bq27545", BQ27545 },
|
|
{ "bq27421", BQ27421 },
|
|
{ "bq27425", BQ27421 },
|
|
{ "bq27441", BQ27421 },
|
|
{ "bq27621", BQ27421 },
|
|
{},
|
|
};
|
|
MODULE_DEVICE_TABLE(i2c, bq27xxx_i2c_id_table);
|
|
|
|
#ifdef CONFIG_OF
|
|
static const struct of_device_id bq27xxx_battery_i2c_of_match_table[] = {
|
|
{ .compatible = "ti,bq27200" },
|
|
{ .compatible = "ti,bq27210" },
|
|
{ .compatible = "ti,bq27500" },
|
|
{ .compatible = "ti,bq27510" },
|
|
{ .compatible = "ti,bq27520" },
|
|
{ .compatible = "ti,bq27530" },
|
|
{ .compatible = "ti,bq27531" },
|
|
{ .compatible = "ti,bq27541" },
|
|
{ .compatible = "ti,bq27542" },
|
|
{ .compatible = "ti,bq27546" },
|
|
{ .compatible = "ti,bq27742" },
|
|
{ .compatible = "ti,bq27545" },
|
|
{ .compatible = "ti,bq27421" },
|
|
{ .compatible = "ti,bq27425" },
|
|
{ .compatible = "ti,bq27441" },
|
|
{ .compatible = "ti,bq27621" },
|
|
{},
|
|
};
|
|
MODULE_DEVICE_TABLE(of, bq27xxx_battery_i2c_of_match_table);
|
|
#endif
|
|
|
|
static struct i2c_driver bq27xxx_battery_i2c_driver = {
|
|
.driver = {
|
|
.name = "bq27xxx-battery",
|
|
.of_match_table = of_match_ptr(bq27xxx_battery_i2c_of_match_table),
|
|
},
|
|
.probe = bq27xxx_battery_i2c_probe,
|
|
.remove = bq27xxx_battery_i2c_remove,
|
|
.id_table = bq27xxx_i2c_id_table,
|
|
};
|
|
module_i2c_driver(bq27xxx_battery_i2c_driver);
|
|
|
|
MODULE_AUTHOR("Andrew F. Davis <afd@ti.com>");
|
|
MODULE_DESCRIPTION("BQ27xxx battery monitor i2c driver");
|
|
MODULE_LICENSE("GPL");
|