/* * 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__ */