sdk-hwV1.3/lichee/rtos-hal/include/hal/sunxi_hal_regulator.h

251 lines
6.6 KiB
C
Executable File

/*
* Copyright (c) 2020 Allwinner Technology Co., Ltd. ALL rights reserved.
*/
#ifndef __SUNXI_HAL_REGULATOR_H__
#define __SUNXI_HAL_REGULATOR_H__
#include <hal_debug.h>
#include <hal_log.h>
#ifdef __cplusplus
extern "C" {
#endif
struct regulator_dev;
struct regulator_ops{
int (*enable) (struct regulator_dev *);
int (*disable) (struct regulator_dev *);
int (*set_voltage) (struct regulator_dev *, int target_uV);
int (*get_voltage) (struct regulator_dev *, int *vol_uV);
};
struct regulator_dev{
unsigned int flag;
struct regulator_ops *ops;
void *private;
};
struct regulator_linear_range {
unsigned int min_uV;
unsigned int min_sel;
unsigned int max_sel;
unsigned int uV_step;
};
struct regulator_desc {
int min_uv;
int max_uv;
int step1_uv;
int vol_reg;
int vol_mask;
int enable_reg;
int enable_mask;
int enable_val;
int disable_val;
const struct regulator_linear_range *linear_ranges;
int n_linear_ranges;
int *vtable;
};
#define AXP_DESC(min, max, step1, vreg, vmask, ereg, emask)\
{ \
.min_uv = (min) * 1000, \
.max_uv = (max) * 1000, \
.step1_uv = (step1) * 1000, \
.vol_reg = vreg, \
.vol_mask = (vmask), \
.enable_reg = ereg, \
.enable_mask = (emask), \
}
#define AXP_DESC_FIXED(volt)\
{ \
.min_uv = (volt) * 1000, \
.max_uv = (volt) * 1000, \
}
#define AXP_IO(min, max, step1, vreg, vmask, ereg, emask, eval, disval)\
{ \
.min_uv = (min) * 1000, \
.max_uv = (max) * 1000, \
.step1_uv = (step1) * 1000, \
.vol_reg = vreg, \
.vol_mask = (vmask), \
.enable_reg = ereg, \
.enable_mask = (emask), \
.enable_val = eval, \
.disable_val = disval, \
}
#define AXP_DESC_RANGES(_ranges, vreg, vmask, ereg, emask)\
{ \
.vol_reg = vreg, \
.vol_mask = (vmask), \
.enable_reg = ereg, \
.enable_mask = (emask), \
.linear_ranges = (_ranges), \
.n_linear_ranges = ARRAY_SIZE(_ranges), \
}
#define AXP_SW(ereg, emask)\
{ \
.enable_reg = ereg, \
.enable_mask = (emask), \
}
#define AXP_SEL(min, max, vreg, vmask, ereg, emask, table_name)\
{ \
.min_uv = (min) * 1000, \
.max_uv = (max) * 1000, \
.vol_reg = vreg, \
.vol_mask = (vmask), \
.enable_reg = ereg, \
.enable_mask = (emask), \
.vtable = (int *)&table_name##_table, \
}
/* Initialize struct regulator_linear_range */
#define REGULATOR_LINEAR_RANGE(_min_uV, _min_sel, _max_sel, _step_uV) \
{ \
.min_uV = _min_uV, \
.min_sel = _min_sel, \
.max_sel = _max_sel, \
.uV_step = _step_uV, \
}
/* for request_flag */
#define TWI_PORT_SHIFT 8
#define AXP_ADDR_SHIFT 12
#define REGULATOR_TYPE_SHIFT 28
#define REGULATOR_ID(x) ((x) & AXP_ID_MASK)
#define TWI_PORT(x) (((x) & TWI_PORT_MASK) >> TWI_PORT_SHIFT)
#define AXP_ADDR(x) (((x) & AXP_ADDR_MASK) >> AXP_ADDR_SHIFT)
#define REGULATOR_TYPE(x) ((x) >> REGULATOR_TYPE_SHIFT)
#define AXP_ID_MASK 0x000ff
#define TWI_PORT_MASK 0x00f00
#define AXP_ADDR_MASK 0xff000
#define REGULATOR_GET(x, y) (((x) << REGULATOR_TYPE_SHIFT) | (y))
enum REGULATOR_TYPE_ENUM{
AXP2101_REGULATOR,
PWM_REGULATOR,
GPIO_REGULATOR,
};
/*
* +---> regulator type
* |
* | --->Rsv
* | / --->pmu addr
* | / / --->twi port
* | / / / --->regulator id
* | / / / /
* +--------------------------------------------------------+
* |31 28|27 20|19 12|11 8|7 0|
* +--------------------------------------------------------+
*/
//FIXME
/*
typedef short s16;
typedef long long int s64;
typedef unsigned char u8;
typedef unsigned short u16;
typedef unsigned long long int u64;
*/
static inline int hal_regulator_get_voltage(struct regulator_dev *rdev,
int *vol_uV)
{
if(rdev && rdev->ops && rdev->ops->get_voltage)
{
return rdev->ops->get_voltage(rdev, vol_uV);
}
else
{
hal_soft_break();
hal_log_err("fatal error.");
}
return 0;
}
static inline int hal_regulator_set_voltage(struct regulator_dev *rdev,
int target_uV)
{
if(rdev && rdev->ops && rdev->ops->set_voltage)
{
return rdev->ops->set_voltage(rdev, target_uV);
}
else
{
hal_soft_break();
hal_log_err("fatal error.");
}
return 0;
}
static inline int hal_regulator_enable(struct regulator_dev *rdev)
{
if(rdev && rdev->ops && rdev->ops->enable)
{
return rdev->ops->enable(rdev);
}
else
{
hal_soft_break();
hal_log_err("fatal error.");
}
return 0;
}
static inline int hal_regulator_disable(struct regulator_dev *rdev)
{
if(rdev && rdev->ops && rdev->ops->disable)
{
return rdev->ops->disable(rdev);
}
else
{
hal_soft_break();
hal_log_err("fatal error.");
}
return 0;
}
int hal_regulator_get(unsigned int request_flag, struct regulator_dev *rdev);
/* TODO fix void type */
/* TODO fix void type */
enum REGULATOR_ID_ENUM {
AXP2101_ID_DCDC1 = 0,
AXP2101_ID_DCDC2,
AXP2101_ID_DCDC3,
AXP2101_ID_DCDC4,
AXP2101_ID_DCDC5,
AXP2101_ID_ALDO1,
AXP2101_ID_ALDO2,
AXP2101_ID_ALDO3,
AXP2101_ID_ALDO4,
AXP2101_ID_BLDO1,
AXP2101_ID_BLDO2,
AXP2101_ID_DLDO1,
AXP2101_ID_DLDO2,
AXP2101_ID_CPUSLDO,
AXP2101_ID_MAX,
};
extern const struct regulator_desc axp2101_regulators[];
int hal_axp_twi_init(struct regulator_dev *rdev);
/*int hal_axp_byte_read(struct regulator_dev *rdev, u8 reg, u8 *reg_val);
int hal_axp_byte_write(struct regulator_dev *rdev, u8 reg, u8 reg_val);
int hal_axp_byte_update(struct regulator_dev *rdev, u8 reg, u8 val, u8 mask);
*/
#ifdef __cplusplus
}
#endif
#endif /* __SUNXI_HAL_REGULATOR_H__ */