mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-16 13:34:30 +00:00
e0f8ad2a70
The AXP15060 is a PMIC chip produced by X-Powers, and could be connected via an I2C bus. Describe the regmap and the MFD bits, along with the registers exposed via I2C. Eventually advertise the device using a new compatible string and add support for power off the system. The driver would disable PEK function if IRQ is not configured in device tree, since some boards (For example, Starfive Visionfive 2) didn't connect IRQ line of PMIC to SOC. GPIO function isn't enabled in this commit, since its configuration operation is different from any existing AXP PMICs and needs logic modification on existing driver. GPIO support might come in later patches. Signed-off-by: Shengyu Qu <wiagn233@outlook.com> Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org> Signed-off-by: Lee Jones <lee@kernel.org> Link: https://lore.kernel.org/r/TY3P286MB261162D57695AC8164ED50E298609@TY3P286MB2611.JPNP286.PROD.OUTLOOK.COM
114 lines
2.9 KiB
C
114 lines
2.9 KiB
C
// SPDX-License-Identifier: GPL-2.0-only
|
|
/*
|
|
* I2C driver for the X-Powers' Power Management ICs
|
|
*
|
|
* AXP20x typically comprises an adaptive USB-Compatible PWM charger, BUCK DC-DC
|
|
* converters, LDOs, multiple 12-bit ADCs of voltage, current and temperature
|
|
* as well as configurable GPIOs.
|
|
*
|
|
* This driver supports the I2C variants.
|
|
*
|
|
* Copyright (C) 2014 Carlo Caione
|
|
*
|
|
* Author: Carlo Caione <carlo@caione.org>
|
|
*/
|
|
|
|
#include <linux/acpi.h>
|
|
#include <linux/err.h>
|
|
#include <linux/i2c.h>
|
|
#include <linux/module.h>
|
|
#include <linux/mfd/axp20x.h>
|
|
#include <linux/of.h>
|
|
#include <linux/regmap.h>
|
|
#include <linux/slab.h>
|
|
|
|
static int axp20x_i2c_probe(struct i2c_client *i2c)
|
|
{
|
|
struct axp20x_dev *axp20x;
|
|
int ret;
|
|
|
|
axp20x = devm_kzalloc(&i2c->dev, sizeof(*axp20x), GFP_KERNEL);
|
|
if (!axp20x)
|
|
return -ENOMEM;
|
|
|
|
axp20x->dev = &i2c->dev;
|
|
axp20x->irq = i2c->irq;
|
|
dev_set_drvdata(axp20x->dev, axp20x);
|
|
|
|
ret = axp20x_match_device(axp20x);
|
|
if (ret)
|
|
return ret;
|
|
|
|
axp20x->regmap = devm_regmap_init_i2c(i2c, axp20x->regmap_cfg);
|
|
if (IS_ERR(axp20x->regmap)) {
|
|
ret = PTR_ERR(axp20x->regmap);
|
|
dev_err(&i2c->dev, "regmap init failed: %d\n", ret);
|
|
return ret;
|
|
}
|
|
|
|
return axp20x_device_probe(axp20x);
|
|
}
|
|
|
|
static void axp20x_i2c_remove(struct i2c_client *i2c)
|
|
{
|
|
struct axp20x_dev *axp20x = i2c_get_clientdata(i2c);
|
|
|
|
axp20x_device_remove(axp20x);
|
|
}
|
|
|
|
#ifdef CONFIG_OF
|
|
static const struct of_device_id axp20x_i2c_of_match[] = {
|
|
{ .compatible = "x-powers,axp152", .data = (void *)AXP152_ID },
|
|
{ .compatible = "x-powers,axp202", .data = (void *)AXP202_ID },
|
|
{ .compatible = "x-powers,axp209", .data = (void *)AXP209_ID },
|
|
{ .compatible = "x-powers,axp221", .data = (void *)AXP221_ID },
|
|
{ .compatible = "x-powers,axp223", .data = (void *)AXP223_ID },
|
|
{ .compatible = "x-powers,axp803", .data = (void *)AXP803_ID },
|
|
{ .compatible = "x-powers,axp806", .data = (void *)AXP806_ID },
|
|
{ .compatible = "x-powers,axp15060", .data = (void *)AXP15060_ID },
|
|
{ },
|
|
};
|
|
MODULE_DEVICE_TABLE(of, axp20x_i2c_of_match);
|
|
#endif
|
|
|
|
static const struct i2c_device_id axp20x_i2c_id[] = {
|
|
{ "axp152", 0 },
|
|
{ "axp202", 0 },
|
|
{ "axp209", 0 },
|
|
{ "axp221", 0 },
|
|
{ "axp223", 0 },
|
|
{ "axp803", 0 },
|
|
{ "axp806", 0 },
|
|
{ "axp15060", 0 },
|
|
{ },
|
|
};
|
|
MODULE_DEVICE_TABLE(i2c, axp20x_i2c_id);
|
|
|
|
#ifdef CONFIG_ACPI
|
|
static const struct acpi_device_id axp20x_i2c_acpi_match[] = {
|
|
{
|
|
.id = "INT33F4",
|
|
.driver_data = AXP288_ID,
|
|
},
|
|
{ },
|
|
};
|
|
MODULE_DEVICE_TABLE(acpi, axp20x_i2c_acpi_match);
|
|
#endif
|
|
|
|
static struct i2c_driver axp20x_i2c_driver = {
|
|
.driver = {
|
|
.name = "axp20x-i2c",
|
|
.of_match_table = of_match_ptr(axp20x_i2c_of_match),
|
|
.acpi_match_table = ACPI_PTR(axp20x_i2c_acpi_match),
|
|
},
|
|
.probe_new = axp20x_i2c_probe,
|
|
.remove = axp20x_i2c_remove,
|
|
.id_table = axp20x_i2c_id,
|
|
};
|
|
|
|
module_i2c_driver(axp20x_i2c_driver);
|
|
|
|
MODULE_DESCRIPTION("PMIC MFD I2C driver for AXP20X");
|
|
MODULE_AUTHOR("Carlo Caione <carlo@caione.org>");
|
|
MODULE_LICENSE("GPL");
|