blob: c45a257fc8a19b8bd885c828fcf1434ee8ddf7d4 [file] [log] [blame] [edit]
/*
* Copyright (c) 2021-2022 Amlogic, Inc. All rights reserved.
*
* SPDX-License-Identifier: MIT
*/
#ifndef __PMIC_H__
#define __PMIC_H__
//#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
#define NULL1 ((void *)0)
#define PMIC_ENBALE 1
#define PMIC_DISABLE 0
#define PMIC_OSC_ENABLE 1
#define PMIC_OSC_DISENABLE 0
#define PMIC_MAXNUM 5
#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, \
}
/*
* Regulators can either control voltage or current.
*/
enum regulator_type {
REGULATOR_VOLTAGE,
REGULATOR_CURRENT,
};
struct regulator_desc {
const char *name;
int id;
const struct regulator_ops *ops;
/* buck ctrl reg */
unsigned int enable_reg;
unsigned int enable_mask;
unsigned int enable_val;
unsigned int disable_val;
/* buck out */
unsigned int vsel_reg;
unsigned int vsel_mask;
/* ldo ctrl */
unsigned int ldo_reg;
unsigned int ldo_mask_ctrl;
unsigned int ldo_val_ctrl;
unsigned int ldo_val_ctrl_disable;
unsigned int ldo_out_mask;
unsigned int n_linear_ranges;
const struct regulator_linear_range *linear_ranges;
const unsigned int *volt_table;
unsigned int n_voltages;
};
struct regulator_ops {
/* enable/disable regulator */
int (*ctrl)(struct regulator_desc *rdev, int status);
/* get/set regulator voltage */
int (*set_voltage)(struct regulator_desc *rdev, unsigned int sel);
};
struct regulator_linear_range {
unsigned int min_uV;
unsigned int min_sel;
unsigned int max_sel;
unsigned int uV_step;
};
struct pmic_i2c {
char *name;
int scl;
int scl_value;
int sda;
int sda_value;
int port;
};
struct pmic_regulator {
void (*pmic_i2c_config)(struct pmic_i2c *pmic_i2c);
/* set pmic enable/disable */
void (*osc_ctrl)(int status);
struct regulator_desc *rdev;
unsigned int num;
};
/**
*@ pmic_regulators_register() - Pmic i2c config and enable
*@ dev_id: regulator dev_id
*/
extern void pmic_i2c_init(int dev_id, struct pmic_i2c *pmic_i2c);
/**
* pmic_regulators_register() - Pmic regulators register
* @PmicRegulator: regulator device
* @dev_id: regulator dev_id
*/
extern int pmic_regulators_register(struct pmic_regulator *PmicRegulator, int *dev_id);
/**
* pmic_regulator_ctrl() - Pmic regulators enable/disable
* @dev_id: regulator dev_id
* @id: buck/ldo id
* @status: regulators status, enable/disable
*/
extern int pmic_regulator_ctrl(int dev_id, int id, int status);
/**
* pmic_regulator_set_voltage() - Pmic regulators set voltage
* @dev_id: regulator dev_id
* @id: buck/ldo id
* @sel: buck/ldo voltage(uv)
*/
extern int pmic_regulator_set_voltage(int dev_id, int id, int sel);
/**
* pmic_osc() - Pmic Crystal oscillator
* @dev_id: regulator dev_id
* @status: regulators status, enable/disable
*/
extern void pmic_osc(int dev_id, int status);
#endif /* __PMIC_H__ */