u-boot/board/nm/nmhw21/da9063.c

163 lines
2.4 KiB
C

/*
* da9063.c
*
* Dialog DA9063 PMIC
*
* Copyright (C) 2018 NetModule AG - http://www.netmodule.com/
*
* SPDX-License-Identifier: GPL-2.0+
*/
#include <common.h>
#include <errno.h>
#include <i2c.h>
#include "da9063.h"
static int da9063_i2c_bus = 0;
static int bus_claimed = 0;
static int switch_i2c_bus(void)
{
int old_bus;
old_bus = i2c_get_bus_num();
if (old_bus != da9063_i2c_bus) {
i2c_set_bus_num(da9063_i2c_bus);
}
bus_claimed++;
return old_bus;
}
static void revert_i2c_bus(int bus)
{
if (da9063_i2c_bus != bus) {
i2c_set_bus_num(bus);
}
bus_claimed--;
}
void da9063_init(int i2c_bus)
{
da9063_i2c_bus = i2c_bus;
}
int da9063_claim_i2c_bus(void)
{
return switch_i2c_bus();
}
void da9063_release_i2c_bus(int bus)
{
revert_i2c_bus(bus);
}
int da9063_get_reg(uint32_t reg, u8* val)
{
int ret;
u8 temp;
/* Argument check */
if ((reg >= 0x200) || (val==0)) {
return -1;
}
/* State check. Has bus been claimed */
if (bus_claimed == 0) {
return -2;
}
*val = 0;
if (reg < 0x100) {
ret = i2c_read(CONFIG_PMIC_I2C_ADDR+0, reg & 0xFF, 1, &temp, 1);
} else {
ret = i2c_read(CONFIG_PMIC_I2C_ADDR+1, reg & 0xFF, 1, &temp, 1);
}
if (ret == 0)
*val = temp;
return ret;
}
int da9063_set_reg(uint32_t reg, u8 val)
{
int ret;
/* Argument check */
if ((reg >= 0x200) || (val==0)) {
return -1;
}
/* State check. Has bus been claimed */
if (bus_claimed == 0) {
return -2;
}
if (reg < 0x100) {
ret = i2c_write(CONFIG_PMIC_I2C_ADDR+0, reg & 0xFF, 1, &val, 1);
} else {
ret = i2c_write(CONFIG_PMIC_I2C_ADDR+1, reg & 0xFF, 1, &val, 1);
}
if (ret != 0)
puts("da9063 write error\n");
return ret;
}
void da9063_set_gpio(unsigned bit, int state)
{
int pmic_reg;
int ret;
u8 bitmask;
u8 reg = 0x00;
if (bit <= 7) {
pmic_reg = PMIC_REG_GPIO_MODE0_7;
bitmask = 1U << (bit-0);
}
else {
pmic_reg = PMIC_REG_GPIO_MODE8_15;
bitmask = 1U << (bit-8);
}
/* printf("da9063_set_gpio %d 0x%04x\n", pmic_reg, bitmask); */
ret = da9063_get_reg(pmic_reg, &reg);
if (ret == 0) {
if (state) reg |= bitmask;
else reg &= ~bitmask;
(void)da9063_set_reg(pmic_reg, reg);
}
}
static int do_pmic(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
uint8_t val = 0;
int bus;
int rc;
bus = da9063_claim_i2c_bus();
rc = da9063_get_reg(0x2c, &val);
printf("%d: %02x\n", rc, val);
da9063_release_i2c_bus(bus);
return 0;
}
U_BOOT_CMD(
pmic, 1, 1, do_pmic,
"pmic",
""
);