mirror of
https://github.com/torvalds/linux.git
synced 2024-11-22 12:11:40 +00:00
mfd: Add device tree support for max77686
This patch adds device tree support for mfd driver and adds Documentation/devicetree/bindings/mfd/max77686.txt. This patch also intialize max77686 pointer to NULL in max77686_i2c_probe to silent a compile time warning. Signed-off-by: Yadwinder Singh Brar <yadi.brar@samsung.com> Reviwed-by: Mark Brown <broonie@opensource.wolfsonmicro.com> Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
This commit is contained in:
parent
2b40459b7e
commit
c1516f840d
59
Documentation/devicetree/bindings/mfd/max77686.txt
Normal file
59
Documentation/devicetree/bindings/mfd/max77686.txt
Normal file
@ -0,0 +1,59 @@
|
||||
Maxim MAX77686 multi-function device
|
||||
|
||||
MAX77686 is a Mulitifunction device with PMIC, RTC and Charger on chip. It is
|
||||
interfaced to host controller using i2c interface. PMIC and Charger submodules
|
||||
are addressed using same i2c slave address whereas RTC submodule uses
|
||||
different i2c slave address,presently for which we are statically creating i2c
|
||||
client while probing.This document describes the binding for mfd device and
|
||||
PMIC submodule.
|
||||
|
||||
Required properties:
|
||||
- compatible : Must be "maxim,max77686";
|
||||
- reg : Specifies the i2c slave address of PMIC block.
|
||||
- interrupts : This i2c device has an IRQ line connected to the main SoC.
|
||||
- interrupt-parent : The parent interrupt controller.
|
||||
|
||||
Optional node:
|
||||
- voltage-regulators : The regulators of max77686 have to be instantiated
|
||||
under subnode named "voltage-regulators" using the following format.
|
||||
|
||||
regulator_name {
|
||||
regulator-compatible = LDOn/BUCKn
|
||||
standard regulator constraints....
|
||||
};
|
||||
refer Documentation/devicetree/bindings/regulator/regulator.txt
|
||||
|
||||
The regulator-compatible property of regulator should initialized with string
|
||||
to get matched with their hardware counterparts as follow:
|
||||
|
||||
-LDOn : for LDOs, where n can lie in range 1 to 26.
|
||||
example: LDO1, LDO2, LDO26.
|
||||
-BUCKn : for BUCKs, where n can lie in range 1 to 9.
|
||||
example: BUCK1, BUCK5, BUCK9.
|
||||
|
||||
Example:
|
||||
|
||||
max77686@09 {
|
||||
compatible = "maxim,max77686";
|
||||
interrupt-parent = <&wakeup_eint>;
|
||||
interrupts = <26 0>;
|
||||
reg = <0x09>;
|
||||
|
||||
voltage-regulators {
|
||||
ldo11_reg {
|
||||
regulator-compatible = "LDO11";
|
||||
regulator-name = "vdd_ldo11";
|
||||
regulator-min-microvolt = <1900000>;
|
||||
regulator-max-microvolt = <1900000>;
|
||||
regulator-always-on;
|
||||
};
|
||||
|
||||
buck1_reg {
|
||||
regulator-compatible = "BUCK1";
|
||||
regulator-name = "vdd_mif";
|
||||
regulator-min-microvolt = <950000>;
|
||||
regulator-max-microvolt = <1300000>;
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
};
|
||||
}
|
@ -34,6 +34,11 @@
|
||||
|
||||
#define I2C_ADDR_RTC (0x0C >> 1)
|
||||
|
||||
static struct of_device_id __devinitdata max77686_pmic_dt_match[] = {
|
||||
{.compatible = "maxim,max77686", .data = 0},
|
||||
{},
|
||||
};
|
||||
|
||||
static struct mfd_cell max77686_devs[] = {
|
||||
{ .name = "max77686-pmic", },
|
||||
{ .name = "max77686-rtc", },
|
||||
@ -44,14 +49,46 @@ static struct regmap_config max77686_regmap_config = {
|
||||
.val_bits = 8,
|
||||
};
|
||||
|
||||
#ifdef CONFIG_OF
|
||||
static struct max77686_platform_data *max77686_i2c_parse_dt_pdata(struct device
|
||||
*dev)
|
||||
{
|
||||
struct max77686_platform_data *pd;
|
||||
|
||||
pd = devm_kzalloc(dev, sizeof(*pd), GFP_KERNEL);
|
||||
if (!pd) {
|
||||
dev_err(dev, "could not allocate memory for pdata\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
dev->platform_data = pd;
|
||||
return pd;
|
||||
}
|
||||
#else
|
||||
static struct max77686_platform_data *max77686_i2c_parse_dt_pdata(struct device
|
||||
*dev)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
static int max77686_i2c_probe(struct i2c_client *i2c,
|
||||
const struct i2c_device_id *id)
|
||||
{
|
||||
struct max77686_dev *max77686;
|
||||
struct max77686_dev *max77686 = NULL;
|
||||
struct max77686_platform_data *pdata = i2c->dev.platform_data;
|
||||
unsigned int data;
|
||||
int ret = 0;
|
||||
|
||||
if (i2c->dev.of_node)
|
||||
pdata = max77686_i2c_parse_dt_pdata(&i2c->dev);
|
||||
|
||||
if (!pdata) {
|
||||
ret = -EIO;
|
||||
dev_err(&i2c->dev, "No platform data found.\n");
|
||||
goto err;
|
||||
}
|
||||
|
||||
max77686 = kzalloc(sizeof(struct max77686_dev), GFP_KERNEL);
|
||||
if (max77686 == NULL)
|
||||
return -ENOMEM;
|
||||
@ -70,11 +107,6 @@ static int max77686_i2c_probe(struct i2c_client *i2c,
|
||||
max77686->i2c = i2c;
|
||||
max77686->type = id->driver_data;
|
||||
|
||||
if (!pdata) {
|
||||
ret = -EIO;
|
||||
goto err;
|
||||
}
|
||||
|
||||
max77686->wakeup = pdata->wakeup;
|
||||
max77686->irq_gpio = pdata->irq_gpio;
|
||||
max77686->irq = i2c->irq;
|
||||
@ -130,6 +162,7 @@ static struct i2c_driver max77686_i2c_driver = {
|
||||
.driver = {
|
||||
.name = "max77686",
|
||||
.owner = THIS_MODULE,
|
||||
.of_match_table = of_match_ptr(max77686_pmic_dt_match),
|
||||
},
|
||||
.probe = max77686_i2c_probe,
|
||||
.remove = max77686_i2c_remove,
|
||||
|
Loading…
Reference in New Issue
Block a user