mirror of
https://github.com/ARM-software/arm-trusted-firmware.git
synced 2025-04-27 15:24:54 +00:00

1. Add PMIC shutdown API 2. Add PMIC low power settings Change-Id: I634a60fa3e2a74a6031df9fe59e2f52956ef7114 Signed-off-by: Hope Wang <hope.wang@mediatek.corp-partner.google.com>
206 lines
5 KiB
C
206 lines
5 KiB
C
/*
|
|
* Copyright (c) 2025, Mediatek Inc. All rights reserved.
|
|
*
|
|
* SPDX-License-Identifier: BSD-3-Clause
|
|
*/
|
|
|
|
#ifndef PMIC_SET_LOWPOWER_H
|
|
#define PMIC_SET_LOWPOWER_H
|
|
|
|
#include <stdint.h>
|
|
|
|
#include <drivers/spmi_api.h>
|
|
|
|
#include "mt6316_lowpower_reg.h"
|
|
#include "mt6363_lowpower_reg.h"
|
|
#include "mt6373_lowpower_reg.h"
|
|
|
|
#define OP_MODE_MU 0
|
|
#define OP_MODE_LP 1
|
|
|
|
#define HW_OFF 0
|
|
#define HW_ON 0
|
|
#define HW_LP 1
|
|
#define HW_ONLV (0x10 | 1)
|
|
#define NORMAL_OP_CFG 0x10
|
|
|
|
enum {
|
|
RC0 = 0,
|
|
RC1,
|
|
RC2,
|
|
RC3,
|
|
RC4,
|
|
RC5,
|
|
RC6,
|
|
RC7,
|
|
RC8 = 0,
|
|
RC9,
|
|
RC10,
|
|
RC11,
|
|
RC12,
|
|
RC13,
|
|
HW0 = 0,
|
|
HW1,
|
|
HW2,
|
|
HW3,
|
|
HW4,
|
|
HW5,
|
|
HW6,
|
|
HW7,
|
|
HW8 = 0,
|
|
HW9,
|
|
HW10,
|
|
HW11,
|
|
HW12,
|
|
HW13,
|
|
};
|
|
|
|
#define VOTER_EN_SET 1
|
|
#define VOTER_EN_CLR 2
|
|
|
|
enum {
|
|
VOTER_EN_LO_BIT0 = 0,
|
|
VOTER_EN_LO_BIT1,
|
|
VOTER_EN_LO_BIT2,
|
|
VOTER_EN_LO_BIT3,
|
|
VOTER_EN_LO_BIT4,
|
|
VOTER_EN_LO_BIT5,
|
|
VOTER_EN_LO_BIT6,
|
|
VOTER_EN_LO_BIT7,
|
|
VOTER_EN_HI_BIT0 = 0,
|
|
VOTER_EN_HI_BIT1,
|
|
VOTER_EN_HI_BIT2,
|
|
VOTER_EN_HI_BIT3,
|
|
};
|
|
|
|
enum {
|
|
MT6363_SLAVE = SPMI_SLAVE_4,
|
|
MT6368_SLAVE = SPMI_SLAVE_5,
|
|
MT6369_SLAVE = SPMI_SLAVE_5,
|
|
MT6373_SLAVE = SPMI_SLAVE_5,
|
|
MT6316_S6_SLAVE = SPMI_SLAVE_6,
|
|
MT6316_S7_SLAVE = SPMI_SLAVE_7,
|
|
MT6316_S8_SLAVE = SPMI_SLAVE_8,
|
|
MT6316_S15_SLAVE = SPMI_SLAVE_15,
|
|
MT6319_S6_SLAVE = SPMI_SLAVE_6,
|
|
MT6319_S7_SLAVE = SPMI_SLAVE_7,
|
|
MT6319_S8_SLAVE = SPMI_SLAVE_8,
|
|
MT6319_S15_SLAVE = SPMI_SLAVE_15,
|
|
};
|
|
|
|
extern struct spmi_device *lowpower_sdev[SPMI_MAX_SLAVE_ID];
|
|
|
|
#define PMIC_BUCK_SET_LP(_chip, _name, _user, _en, _mode, _cfg) \
|
|
{ \
|
|
uint8_t val = 0; \
|
|
struct spmi_device *sdev = lowpower_sdev[_chip##_SLAVE]; \
|
|
if (sdev && \
|
|
!spmi_ext_register_readl(sdev, _chip##_RG_BUCK_##_name##_HW0_OP_CFG_ADDR, &val, 1) && \
|
|
!(val & NORMAL_OP_CFG)) {\
|
|
if ((_cfg) == HW_ONLV) { \
|
|
pmic_spmi_update_bits(sdev, \
|
|
_chip##_RG_BUCK_##_name##_ONLV_EN_ADDR, \
|
|
(1 << _chip##_RG_BUCK_##_name##_ONLV_EN_SHIFT), \
|
|
(1 << _chip##_RG_BUCK_##_name##_ONLV_EN_SHIFT)); \
|
|
} else if ((_cfg) == HW_LP) { \
|
|
pmic_spmi_update_bits(sdev, \
|
|
_chip##_RG_BUCK_##_name##_ONLV_EN_ADDR, \
|
|
(1 << _chip##_RG_BUCK_##_name##_ONLV_EN_SHIFT), \
|
|
0); \
|
|
} \
|
|
pmic_spmi_update_bits(sdev, \
|
|
_chip##_RG_BUCK_##_name##_##_user##_OP_CFG_ADDR, \
|
|
1 << (_user), \
|
|
((_cfg) & 0x1) ? 1 << (_user) : 0); \
|
|
pmic_spmi_update_bits(sdev, \
|
|
_chip##_RG_BUCK_##_name##_##_user##_OP_MODE_ADDR, \
|
|
1 << (_user), \
|
|
(_mode) ? 1 << (_user) : 0); \
|
|
pmic_spmi_update_bits(sdev, \
|
|
_chip##_RG_BUCK_##_name##_##_user##_OP_EN_ADDR, \
|
|
1 << (_user), \
|
|
(_en) ? 1 << (_user) : 0); \
|
|
} \
|
|
}
|
|
|
|
#define PMIC_LDO_SET_LP(_chip, _name, _user, _en, _mode, _cfg) \
|
|
{ \
|
|
uint8_t val = 0; \
|
|
struct spmi_device *sdev = lowpower_sdev[_chip##_SLAVE]; \
|
|
if (sdev && \
|
|
!spmi_ext_register_readl(sdev, _chip##_RG_LDO_##_name##_HW0_OP_CFG_ADDR, &val, 1) && \
|
|
!(val & NORMAL_OP_CFG)) {\
|
|
if ((_cfg) == HW_ONLV) { \
|
|
pmic_spmi_update_bits(sdev, \
|
|
_chip##_RG_LDO_##_name##_ONLV_EN_ADDR, \
|
|
(1 << _chip##_RG_LDO_##_name##_ONLV_EN_SHIFT), \
|
|
(1 << _chip##_RG_LDO_##_name##_ONLV_EN_SHIFT)); \
|
|
} else { \
|
|
pmic_spmi_update_bits(sdev, \
|
|
_chip##_RG_LDO_##_name##_ONLV_EN_ADDR, \
|
|
(1 << _chip##_RG_LDO_##_name##_ONLV_EN_SHIFT), \
|
|
0); \
|
|
} \
|
|
pmic_spmi_update_bits(sdev, \
|
|
_chip##_RG_LDO_##_name##_##_user##_OP_CFG_ADDR, \
|
|
1 << (_user), \
|
|
((_cfg) & 0x1) ? 1 << (_user) : 0); \
|
|
pmic_spmi_update_bits(sdev, \
|
|
_chip##_RG_LDO_##_name##_##_user##_OP_MODE_ADDR, \
|
|
1 << (_user), \
|
|
(_mode) ? 1 << (_user) : 0); \
|
|
pmic_spmi_update_bits(sdev, \
|
|
_chip##_RG_LDO_##_name##_##_user##_OP_EN_ADDR, \
|
|
1 << (_user), \
|
|
(_en) ? 1 << (_user) : 0); \
|
|
} \
|
|
}
|
|
|
|
#define PMIC_SLVID_BUCK_SET_LP(_chip, _slvid, _name, _user, _en, _mode, _cfg) \
|
|
{ \
|
|
struct spmi_device *sdev = lowpower_sdev[_chip##_##_slvid##_SLAVE]; \
|
|
if (sdev) {\
|
|
pmic_spmi_update_bits(sdev, \
|
|
_chip##_RG_BUCK_##_name##_##_user##_OP_CFG_ADDR, \
|
|
1 << (_user), \
|
|
(_cfg) ? 1 << (_user) : 0); \
|
|
pmic_spmi_update_bits(sdev, \
|
|
_chip##_RG_BUCK_##_name##_##_user##_OP_MODE_ADDR, \
|
|
1 << (_user), \
|
|
(_mode) ? 1 << (_user) : 0); \
|
|
pmic_spmi_update_bits(sdev, \
|
|
_chip##_RG_BUCK_##_name##_##_user##_OP_EN_ADDR, \
|
|
1 << (_user), \
|
|
(_en) ? 1 << (_user) : 0); \
|
|
} \
|
|
}
|
|
|
|
#define PMIC_BUCK_VOTER_EN(_chip, _name, _user, _cfg) \
|
|
{ \
|
|
struct spmi_device *sdev = lowpower_sdev[_chip##_SLAVE]; \
|
|
if (sdev) {\
|
|
pmic_spmi_update_bits(sdev, \
|
|
_chip##_RG_BUCK_##_name##_##_user##_ADDR + (_cfg), \
|
|
1 << (_user), \
|
|
1 << (_user)); \
|
|
} \
|
|
}
|
|
|
|
static inline int pmic_spmi_update_bits(struct spmi_device *sdev, uint16_t reg,
|
|
uint8_t mask, uint8_t val)
|
|
{
|
|
uint8_t org = 0;
|
|
int ret = 0;
|
|
|
|
ret = spmi_ext_register_readl(sdev, reg, &org, 1);
|
|
if (ret < 0)
|
|
return ret;
|
|
|
|
org &= ~mask;
|
|
org |= val & mask;
|
|
|
|
ret = spmi_ext_register_writel(sdev, reg, &org, 1);
|
|
return ret;
|
|
}
|
|
|
|
#endif /* PMIC_SET_LOWPOWER_H */
|