39#include <sys/kernel.h>
40#include <sys/reboot.h>
41#include <sys/module.h>
46#include <dev/ofw/ofw_bus.h>
47#include <dev/ofw/ofw_bus_subr.h>
49#include <dev/extres/regulator/regulator.h>
55#define SEL_GO (1 << 7)
56#define SEL_VOLTAGE_MASK 0x7f
57#define SEL_VOLTAGE_BASE 680000
58#define SEL_VOLTAGE_STEP 10000
60#define COM_DISABLE (1 << 0)
61#define SYS_STATUS 0x06
64 {
"silergy,sy8106a", 1 },
72 struct regnode_std_param *
param;
88 sc = device_get_softc(
dev);
110 sc = device_get_softc(
dev);
135 sc = regnode_get_softc(
regnode);
144 *udelay = sc->
param->ramp_delay;
151 int max_uvolt,
int *udelay)
157 sc = regnode_get_softc(
regnode);
169 *udelay = sc->
param->ramp_delay *
181 sc = regnode_get_softc(
regnode);
205 struct regnode_init_def initdef;
206 struct regnode *regnode;
208 memset(&initdef, 0,
sizeof(initdef));
209 regulator_parse_ofw_stdparam(
dev, node, &initdef);
211 initdef.ofw_node = node;
212 regnode = regnode_create(
dev, &sy8106a_regnode_class, &initdef);
213 if (regnode == NULL) {
214 device_printf(
dev,
"cannot create regulator\n");
218 reg_sc = regnode_get_softc(regnode);
221 reg_sc->
xref = OF_xref_from_node(node);
222 reg_sc->
param = regnode_get_stdparam(regnode);
224 regnode_register(regnode);
235 sc = device_get_softc(
dev);
248 if (!ofw_bus_status_okay(
dev))
254 device_set_desc(
dev,
"Silergy SY8106A regulator");
256 return (BUS_PROBE_DEFAULT);
265 sc = device_get_softc(
dev);
266 node = ofw_bus_get_node(
dev);
268 sc->
addr = iicbus_get_addr(
dev);
271 if (sc->
reg == NULL) {
272 device_printf(
dev,
"cannot attach regulator\n");
int iicbus_transfer(device_t bus, struct iic_msg *msgs, uint32_t nmsgs)
struct regnode_std_param * param
struct sy8106a_reg_sc * reg
static int sy8106a_probe(device_t dev)
DEFINE_CLASS_1(sy8106a_regnode, sy8106a_regnode_class, sy8106a_regnode_methods, sizeof(struct sy8106a_reg_sc), regnode_class)
static int sy8106a_regdev_map(device_t dev, phandle_t xref, int ncells, pcell_t *cells, intptr_t *num)
static int sy8106a_write(device_t dev, uint8_t reg, uint8_t val)
static regnode_method_t sy8106a_regnode_methods[]
static int sy8106a_regnode_init(struct regnode *regnode)
MODULE_VERSION(sy8106a, 1)
static device_method_t sy8106a_methods[]
static int sy8106a_attach(device_t dev)
static struct sy8106a_reg_sc * sy8106a_reg_attach(device_t dev, phandle_t node)
EARLY_DRIVER_MODULE(sy8106a, iicbus, sy8106a_driver, sy8106a_devclass, 0, 0, BUS_PASS_RESOURCE)
IICBUS_FDT_PNP_INFO(compat_data)
static struct ofw_compat_data compat_data[]
static int sy8106a_regnode_set_voltage(struct regnode *regnode, int min_uvolt, int max_uvolt, int *udelay)
static int sy8106a_regnode_enable(struct regnode *regnode, bool enable, int *udelay)
static driver_t sy8106a_driver
MODULE_DEPEND(sy8106a, iicbus, 1, 1, 1)
static int sy8106a_regnode_get_voltage(struct regnode *regnode, int *uvolt)
static devclass_t sy8106a_devclass
static int sy8106a_read(device_t dev, uint8_t reg, uint8_t *data, uint8_t size)