From 9a753c5ebcee6b105996496ac0ec2ab863a050e5 Mon Sep 17 00:00:00 2001 From: Rene Straub Date: Fri, 16 Mar 2018 13:37:23 +0100 Subject: [PATCH] nrhw20: set da9063 current limits - factor out da9063 function from board.c --- board/nm/nrhw20/board.c | 128 ++++++++++----------------------------- board/nm/nrhw20/da9063.c | 92 ++++++++++++++++++++++++++++ board/nm/nrhw20/da9063.h | 36 +++++++++++ 3 files changed, 159 insertions(+), 97 deletions(-) create mode 100644 board/nm/nrhw20/da9063.c create mode 100644 board/nm/nrhw20/da9063.h diff --git a/board/nm/nrhw20/board.c b/board/nm/nrhw20/board.c index 054591b30e..82980c41b0 100644 --- a/board/nm/nrhw20/board.c +++ b/board/nm/nrhw20/board.c @@ -36,6 +36,7 @@ #include "../common/bdparser.h" #include "../common/board_descriptor.h" #include "board.h" +#include "da9063.h" #include "shield.h" #include "shield_can.h" #include "shield_comio.h" @@ -154,6 +155,16 @@ static struct ctrl_dev *cdev = (struct ctrl_dev *)CTRL_DEVICE_BASE; static BD_Context bdctx[3]; /* The descriptor contexts */ + +static void init_i2c(void) +{ + i2c_set_bus_num(0); + i2c_init(CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE); + i2c_set_bus_num(2); + i2c_init(CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE); + i2c_set_bus_num(0); +} + static int _bd_init(void) { int old_bus; @@ -183,7 +194,6 @@ static int _bd_init(void) return 0; } - static void init_indicator_leds(void) { int old_bus; @@ -294,7 +304,22 @@ void am33xx_spl_board_init(void) /* Set CORE Frequencies to OPP100 (600MHz) */ do_setup_dpll(&dpll_core_regs, &dpll_core_opp100); - /* TODO: Modify PMIC settings if required */ + /* Configure both I2C buses used in NRHW20 */ + init_i2c(); + + /* Configure default PMIC current limits. Will be overridden in Linux. + * MEM = 1.5A (0.55A) + * IO = 1.5A (0.5A) + * PERI = 2.0A (1.0A) + * PRO = 0.5A (unused) + * CORE2 = 2.0A (0.55A) + * CORE1 = 2.0A (0.25A, seems too low) + */ + da9063_init(CONFIG_PMIC_I2C_BUS); + da9063_set_reg(PMIC_REG_BUCK_ILIM_A, 0x00); + da9063_set_reg(PMIC_REG_BUCK_ILIM_B, 0x50); + da9063_set_reg(PMIC_REG_BUCK_ILIM_C, 0xFF); + init_indicator_leds(); set_indicator(0, 1, 1); /* Orange */ @@ -397,92 +422,6 @@ err_free_gpio: #endif -/* TODO: Create DA9063 Accessor Module */ -#define CONFIG_PMIC_I2C_BUS 0 -#define CONFIG_PMIC_I2C_ADDR 0x58 /* Pages 0 and 1, Pages 2 and 3 -> 0x59 */ - -#define PMIC_REG_STATUS_A 0x01 /* Status of ON_KEY, WAKE, COMP1V2, DVC */ -#define PMIC_REG_GPIO_MODE0_7 0x1D /* Control register for GPIOs 0..7 */ -#define PMIC_REG_GPIO_MODE8_15 0x1E /* Control register for GPIOs 8..15 */ - -#define PMIC_REG_BBAT_CONT 0xC5 /* Control register for backup battery */ - - -static int da9063_i2c_bus = 0; - -void da9063_init(int i2c_bus) -{ - da9063_i2c_bus = i2c_bus; -} - -int da9093_get_reg(int reg, u8* val) -{ - int ret; - int old_bus; - u8 temp; - - /* TODO: Check whether switching is required */ - old_bus = i2c_get_bus_num(); - i2c_set_bus_num(da9063_i2c_bus); - - /* TODO: Use CONFIG_PMIC_I2C_ADDR+1 if reg > 0xFF */ - *val = 0; - ret = i2c_read(CONFIG_PMIC_I2C_ADDR, reg, 1, &temp, 1); - if (ret == 0) - *val = temp; - - i2c_set_bus_num(old_bus); - - return ret; -} - -int da9093_set_reg(int reg, u8 val) -{ - int ret; - int old_bus; - - /* TODO: Check whether switching is required */ - old_bus = i2c_get_bus_num(); - i2c_set_bus_num(da9063_i2c_bus); - - /* TODO: Use CONFIG_PMIC_I2C_ADDR+1 if reg > 0xFF */ - ret = i2c_write(CONFIG_PMIC_I2C_ADDR, reg, 1, &val, 1); - if (ret != 0) - puts("da9063 write error\n"); - - i2c_set_bus_num(old_bus); - - 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 = da9093_get_reg(pmic_reg, ®); - - if (ret == 0) { - if (state) reg |= bitmask; - else reg &= ~bitmask; - - (void)da9093_set_reg(pmic_reg, reg); - } -} - - static void set_status_led(int red, int green) { /* LED outputs are active low, invert state */ @@ -580,19 +519,14 @@ int board_init(void) gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100; /* Configure both I2C buses used in NRHW20 */ - i2c_set_bus_num(0); - i2c_init(CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE); - i2c_set_bus_num(2); - i2c_init(CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE); - i2c_set_bus_num(0); + init_i2c(); da9063_init(CONFIG_PMIC_I2C_BUS); /* Let user know we're starting */ init_indicator_leds(); set_status_led(1, 1); /* Orange */ - set_indicator(0, 0, 1); /* Green */ - set_indicator(1, 0, 1); /* Green */ +/* set_indicator(0, 0, 1); *//* Green */ /* Initialize pins */ REQUEST_AND_CLEAR_GPIO(NETBIRD_GPIO_WLAN_EN); @@ -606,7 +540,7 @@ int board_init(void) init_gsm(); /* Enable charging of RTC backup capacitor (1mA, 3.1V) */ - (void)da9093_set_reg(PMIC_REG_BBAT_CONT, 0xCF); + (void)da9063_set_reg(PMIC_REG_BBAT_CONT, 0xCF); printf("OSC: %lu MHz\n", get_osclk()/1000000); @@ -797,7 +731,7 @@ static bool get_button_state(void) { u8 state = 0x00; - (void)da9093_get_reg(PMIC_REG_STATUS_A, &state); + (void)da9063_get_reg(PMIC_REG_STATUS_A, &state); return (state & 0x01) == 0x01; } diff --git a/board/nm/nrhw20/da9063.c b/board/nm/nrhw20/da9063.c new file mode 100644 index 0000000000..092ebb074c --- /dev/null +++ b/board/nm/nrhw20/da9063.c @@ -0,0 +1,92 @@ +/* + * da9063.c + * + * Dialog DA9063 PMIC + * + * Copyright (C) 2018 NetModule AG - http://www.netmodule.com/ + * + * SPDX-License-Identifier: GPL-2.0+ + */ + +#include +#include +#include + +#include "da9063.h" + + +static int da9063_i2c_bus = 0; + + +void da9063_init(int i2c_bus) +{ + da9063_i2c_bus = i2c_bus; +} + +int da9063_get_reg(int reg, u8* val) +{ + int ret; + int old_bus; + u8 temp; + + /* TODO: Check whether switching is required */ + old_bus = i2c_get_bus_num(); + i2c_set_bus_num(da9063_i2c_bus); + + /* TODO: Use CONFIG_PMIC_I2C_ADDR+1 if reg > 0xFF */ + *val = 0; + ret = i2c_read(CONFIG_PMIC_I2C_ADDR, reg, 1, &temp, 1); + if (ret == 0) + *val = temp; + + i2c_set_bus_num(old_bus); + + return ret; +} + +int da9063_set_reg(int reg, u8 val) +{ + int ret; + int old_bus; + + /* TODO: Check whether switching is required */ + old_bus = i2c_get_bus_num(); + i2c_set_bus_num(da9063_i2c_bus); + + /* TODO: Use CONFIG_PMIC_I2C_ADDR+1 if reg > 0xFF */ + ret = i2c_write(CONFIG_PMIC_I2C_ADDR, reg, 1, &val, 1); + if (ret != 0) + puts("da9063 write error\n"); + + i2c_set_bus_num(old_bus); + + 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, ®); + + if (ret == 0) { + if (state) reg |= bitmask; + else reg &= ~bitmask; + + (void)da9063_set_reg(pmic_reg, reg); + } +} + diff --git a/board/nm/nrhw20/da9063.h b/board/nm/nrhw20/da9063.h new file mode 100644 index 0000000000..481e7e4280 --- /dev/null +++ b/board/nm/nrhw20/da9063.h @@ -0,0 +1,36 @@ +/* + * da9063.c + * + * Dialog DA9063 PMIC + * + * Copyright (C) 2018 NetModule AG - http://www.netmodule.com/ + * + * SPDX-License-Identifier: GPL-2.0+ + */ + +#ifndef DA9063_H +#define DA9063_H + + +#define CONFIG_PMIC_I2C_BUS 0 +#define CONFIG_PMIC_I2C_ADDR 0x58 /* Pages 0 and 1, Pages 2 and 3 -> 0x59 */ + +#define PMIC_REG_STATUS_A 0x01 /* Status of ON_KEY, WAKE, COMP1V2, DVC */ +#define PMIC_REG_GPIO_MODE0_7 0x1D /* Control register for GPIOs 0..7 */ +#define PMIC_REG_GPIO_MODE8_15 0x1E /* Control register for GPIOs 8..15 */ + +#define PMIC_REG_BBAT_CONT 0xC5 /* Control register for backup battery */ + +#define PMIC_REG_BUCK_ILIM_A 0x9A +#define PMIC_REG_BUCK_ILIM_B 0x9B +#define PMIC_REG_BUCK_ILIM_C 0x9C + + +extern void da9063_init(int i2c_bus); +extern int da9063_get_reg(int reg, u8* val); +extern int da9063_set_reg(int reg, u8 val); + +extern void da9063_set_gpio(unsigned bit, int state); + + +#endif /* DA9063_H */