dm: pmic: add max77686 pmic driver
This is the implementation of driver model PMIC driver. The max77686 PMIC driver implements read/write operations and driver bind method - to bind its childs. This driver will try to bind the regulator devices by using it's child info array with regulator prefixes and driver names. This should succeed when compatible regulator driver is compiled. If no regulator driver found, then the pmic can still provide read/write operations, and can be used with PMIC function calls. Signed-off-by: Przemyslaw Marczak <p.marczak@samsung.com> Acked-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
committed by
Simon Glass
parent
f37df0f877
commit
52a3de5e12
@@ -9,3 +9,10 @@ config DM_PMIC
|
||||
for read/write. For detailed description, please refer to the files:
|
||||
- 'drivers/power/pmic/pmic-uclass.c'
|
||||
- 'include/power/pmic.h'
|
||||
|
||||
config DM_PMIC_MAX77686
|
||||
bool "Enable Driver Model for PMIC MAX77686"
|
||||
depends on DM_PMIC
|
||||
---help---
|
||||
This config enables implementation of driver-model pmic uclass features
|
||||
for PMIC MAX77686. The driver implements read/write operations.
|
||||
@@ -11,6 +11,7 @@ obj-$(CONFIG_POWER_MAX8998) += pmic_max8998.o
|
||||
obj-$(CONFIG_POWER_MAX8997) += pmic_max8997.o
|
||||
obj-$(CONFIG_POWER_MUIC_MAX8997) += muic_max8997.o
|
||||
obj-$(CONFIG_POWER_MAX77686) += pmic_max77686.o
|
||||
obj-$(CONFIG_DM_PMIC_MAX77686) += max77686.o
|
||||
obj-$(CONFIG_POWER_PFUZE100) += pmic_pfuze100.o
|
||||
obj-$(CONFIG_POWER_TPS65090_I2C) += pmic_tps65090.o
|
||||
obj-$(CONFIG_POWER_TPS65090_EC) += pmic_tps65090_ec.o
|
||||
|
||||
87
drivers/power/pmic/max77686.c
Normal file
87
drivers/power/pmic/max77686.c
Normal file
@@ -0,0 +1,87 @@
|
||||
/*
|
||||
* Copyright (C) 2014-2015 Samsung Electronics
|
||||
* Przemyslaw Marczak <p.marczak@samsung.com>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <fdtdec.h>
|
||||
#include <errno.h>
|
||||
#include <dm.h>
|
||||
#include <i2c.h>
|
||||
#include <power/pmic.h>
|
||||
#include <power/regulator.h>
|
||||
#include <power/max77686_pmic.h>
|
||||
|
||||
DECLARE_GLOBAL_DATA_PTR;
|
||||
|
||||
static const struct pmic_child_info pmic_childs_info[] = {
|
||||
{ .prefix = "ldo", .driver = MAX77686_LDO_DRIVER },
|
||||
{ .prefix = "buck", .driver = MAX77686_BUCK_DRIVER },
|
||||
{ },
|
||||
};
|
||||
|
||||
static int max77686_write(struct udevice *dev, uint reg, const uint8_t *buff,
|
||||
int len)
|
||||
{
|
||||
if (dm_i2c_write(dev, reg, buff, len)) {
|
||||
error("write error to device: %p register: %#x!", dev, reg);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int max77686_read(struct udevice *dev, uint reg, uint8_t *buff, int len)
|
||||
{
|
||||
if (dm_i2c_read(dev, reg, buff, len)) {
|
||||
error("read error from device: %p register: %#x!", dev, reg);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int max77686_bind(struct udevice *dev)
|
||||
{
|
||||
int regulators_node;
|
||||
const void *blob = gd->fdt_blob;
|
||||
int childs;
|
||||
|
||||
regulators_node = fdt_subnode_offset(blob, dev->of_offset,
|
||||
"voltage-regulators");
|
||||
if (regulators_node <= 0) {
|
||||
debug("%s: %s regulators subnode not found!", __func__,
|
||||
dev->name);
|
||||
return -ENXIO;
|
||||
}
|
||||
|
||||
debug("%s: '%s' - found regulators subnode\n", __func__, dev->name);
|
||||
|
||||
childs = pmic_bind_childs(dev, regulators_node, pmic_childs_info);
|
||||
if (!childs)
|
||||
debug("%s: %s - no child found\n", __func__, dev->name);
|
||||
|
||||
/* Always return success for this device */
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct dm_pmic_ops max77686_ops = {
|
||||
.reg_count = MAX77686_NUM_OF_REGS,
|
||||
.read = max77686_read,
|
||||
.write = max77686_write,
|
||||
};
|
||||
|
||||
static const struct udevice_id max77686_ids[] = {
|
||||
{ .compatible = "maxim,max77686" },
|
||||
{ }
|
||||
};
|
||||
|
||||
U_BOOT_DRIVER(pmic_max77686) = {
|
||||
.name = "max77686 pmic",
|
||||
.id = UCLASS_PMIC,
|
||||
.of_match = max77686_ids,
|
||||
.bind = max77686_bind,
|
||||
.ops = &max77686_ops,
|
||||
};
|
||||
@@ -295,7 +295,7 @@ int pmic_init(unsigned char bus)
|
||||
|
||||
p->name = name;
|
||||
p->interface = PMIC_I2C;
|
||||
p->number_of_regs = PMIC_NUM_OF_REGS;
|
||||
p->number_of_regs = MAX77686_NUM_OF_REGS;
|
||||
p->hw.i2c.tx_num = 1;
|
||||
|
||||
puts("Board PMIC init\n");
|
||||
|
||||
Reference in New Issue
Block a user