mfd: sy7636a: Initial commit
Initial support for the Silergy SY7636A Power Management chip. Signed-off-by: Alistair Francis <alistair@alistair23.me>rM2-mainline
parent
fe49bc87de
commit
2f65f5321f
|
@ -1351,6 +1351,15 @@ config MFD_SYSCON
|
|||
Select this option to enable accessing system control registers
|
||||
via regmap.
|
||||
|
||||
config MFD_SY7636A
|
||||
tristate "Silergy SY7636A Power Management chip"
|
||||
select MFD_CORE
|
||||
select REGMAP_I2C
|
||||
depends on I2C
|
||||
help
|
||||
Select this option to enable support for the Silergy SY7636A
|
||||
Power Management chip.
|
||||
|
||||
config MFD_DAVINCI_VOICECODEC
|
||||
tristate
|
||||
select MFD_CORE
|
||||
|
|
|
@ -265,6 +265,7 @@ obj-$(CONFIG_MFD_STMFX) += stmfx.o
|
|||
obj-$(CONFIG_MFD_KHADAS_MCU) += khadas-mcu.o
|
||||
obj-$(CONFIG_MFD_ACER_A500_EC) += acer-ec-a500.o
|
||||
|
||||
obj-$(CONFIG_MFD_SY7636A) += sy7636a.o
|
||||
obj-$(CONFIG_SGI_MFD_IOC3) += ioc3.o
|
||||
obj-$(CONFIG_MFD_SIMPLE_MFD_I2C) += simple-mfd-i2c.o
|
||||
obj-$(CONFIG_MFD_INTEL_M10_BMC) += intel-m10-bmc.o
|
||||
|
|
|
@ -0,0 +1,82 @@
|
|||
// SPDX-License-Identifier: GPL-2.0+
|
||||
//
|
||||
// MFD parent driver for SY7636A chip
|
||||
//
|
||||
// Copyright (C) 2021 reMarkable AS - http://www.remarkable.com/
|
||||
//
|
||||
// Authors: Lars Ivar Miljeteig <lars.ivar.miljeteig@remarkable.com>
|
||||
// Alistair Francis <alistair@alistair23.me>
|
||||
//
|
||||
// Based on the lp87565 driver by Keerthy <j-keerthy@ti.com>
|
||||
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/mfd/core.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/of_device.h>
|
||||
|
||||
#include <linux/mfd/sy7636a.h>
|
||||
|
||||
static const struct regmap_config sy7636a_regmap_config = {
|
||||
.reg_bits = 8,
|
||||
.val_bits = 8,
|
||||
};
|
||||
|
||||
static const struct mfd_cell sy7636a_cells[] = {
|
||||
{ .name = "sy7636a-regulator", },
|
||||
{ .name = "sy7636a-temperature", },
|
||||
{ .name = "sy7636a-thermal", },
|
||||
};
|
||||
|
||||
static const struct of_device_id of_sy7636a_match_table[] = {
|
||||
{ .compatible = "silergy,sy7636a", },
|
||||
{}
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, of_sy7636a_match_table);
|
||||
|
||||
static int sy7636a_probe(struct i2c_client *client,
|
||||
const struct i2c_device_id *ids)
|
||||
{
|
||||
struct sy7636a *sy7636a;
|
||||
int ret;
|
||||
|
||||
sy7636a = devm_kzalloc(&client->dev, sizeof(*sy7636a), GFP_KERNEL);
|
||||
if (!sy7636a)
|
||||
return -ENOMEM;
|
||||
|
||||
sy7636a->dev = &client->dev;
|
||||
|
||||
sy7636a->regmap = devm_regmap_init_i2c(client, &sy7636a_regmap_config);
|
||||
if (IS_ERR(sy7636a->regmap)) {
|
||||
ret = PTR_ERR(sy7636a->regmap);
|
||||
dev_err(sy7636a->dev,
|
||||
"Failed to initialize register map: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
i2c_set_clientdata(client, sy7636a);
|
||||
|
||||
ret = devm_mfd_add_devices(sy7636a->dev, PLATFORM_DEVID_AUTO,
|
||||
sy7636a_cells, ARRAY_SIZE(sy7636a_cells),
|
||||
NULL, 0, NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct i2c_device_id sy7636a_id_table[] = {
|
||||
{ "sy7636a", 0 },
|
||||
{ },
|
||||
};
|
||||
MODULE_DEVICE_TABLE(i2c, sy7636a_id_table);
|
||||
|
||||
static struct i2c_driver sy7636a_driver = {
|
||||
.driver = {
|
||||
.name = "sy7636a",
|
||||
.of_match_table = of_sy7636a_match_table,
|
||||
},
|
||||
.probe = sy7636a_probe,
|
||||
.id_table = sy7636a_id_table,
|
||||
};
|
||||
module_i2c_driver(sy7636a_driver);
|
||||
|
||||
MODULE_AUTHOR("Lars Ivar Miljeteig <lars.ivar.miljeteig@remarkable.com>");
|
||||
MODULE_DESCRIPTION("Silergy SY7636A Multi-Function Device Driver");
|
||||
MODULE_LICENSE("GPL v2");
|
|
@ -0,0 +1,46 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*
|
||||
* Functions to access SY3686A power management chip.
|
||||
*
|
||||
* Copyright (C) 2021 reMarkable AS - http://www.remarkable.com/
|
||||
*/
|
||||
|
||||
#ifndef __MFD_SY7636A_H
|
||||
#define __MFD_SY7636A_H
|
||||
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/regmap.h>
|
||||
#include <linux/regulator/driver.h>
|
||||
#include <linux/regulator/machine.h>
|
||||
|
||||
#define SY7636A_REG_OPERATION_MODE_CRL 0x00
|
||||
#define SY7636A_OPERATION_MODE_CRL_VCOMCTL BIT(6)
|
||||
#define SY7636A_OPERATION_MODE_CRL_ONOFF BIT(7)
|
||||
#define SY7636A_REG_VCOM_ADJUST_CTRL_L 0x01
|
||||
#define SY7636A_REG_VCOM_ADJUST_CTRL_H 0x02
|
||||
#define SY7636A_REG_VCOM_ADJUST_CTRL_MASK 0x01ff
|
||||
#define SY7636A_REG_VLDO_VOLTAGE_ADJULST_CTRL 0x03
|
||||
#define SY7636A_REG_POWER_ON_DELAY_TIME 0x06
|
||||
#define SY7636A_REG_FAULT_FLAG 0x07
|
||||
#define SY7636A_FAULT_FLAG_PG BIT(0)
|
||||
#define SY7636A_REG_TERMISTOR_READOUT 0x08
|
||||
|
||||
#define SY7636A_REG_MAX 0x08
|
||||
|
||||
#define VCOM_MIN 0
|
||||
#define VCOM_MAX 5000
|
||||
|
||||
#define VCOM_ADJUST_CTRL_MASK 0x1ff
|
||||
// Used to shift the high byte
|
||||
#define VCOM_ADJUST_CTRL_SHIFT 8
|
||||
// Used to scale from VCOM_ADJUST_CTRL to mv
|
||||
#define VCOM_ADJUST_CTRL_SCAL 10
|
||||
|
||||
#define FAULT_FLAG_SHIFT 1
|
||||
|
||||
struct sy7636a {
|
||||
struct device *dev;
|
||||
struct regmap *regmap;
|
||||
};
|
||||
|
||||
#endif /* __LINUX_MFD_SY7636A_H */
|
Loading…
Reference in New Issue