370 lines
12 KiB
C
370 lines
12 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
/*
|
|
* Copyright (c) 2021 MediaTek Inc.
|
|
*/
|
|
|
|
#ifndef __LINUX_PROP_CHGALGO_CLASS_H
|
|
#define __LINUX_PROP_CHGALGO_CLASS_H
|
|
|
|
#include <linux/device.h>
|
|
#include <linux/notifier.h>
|
|
|
|
#define PCA_DBG_EN 1
|
|
#define PCA_INFO_EN 1
|
|
#define PCA_ERR_EN 1
|
|
|
|
#define PCA_DBG(fmt, ...) \
|
|
do { \
|
|
if (PCA_DBG_EN) \
|
|
pr_info("[PCA]%s " fmt, __func__, ##__VA_ARGS__); \
|
|
} while (0)
|
|
|
|
#define PCA_INFO(fmt, ...) \
|
|
do { \
|
|
if (PCA_INFO_EN) \
|
|
pr_info("[PCA]%s " fmt, __func__, ##__VA_ARGS__); \
|
|
} while (0)
|
|
|
|
#define PCA_ERR(fmt, ...) \
|
|
do { \
|
|
if (PCA_ERR_EN) \
|
|
pr_info("[PCA]%s " fmt, __func__, ##__VA_ARGS__); \
|
|
} while (0)
|
|
|
|
#define SIMPLE_PCA_TA_DESC(_name, ops) \
|
|
const struct prop_chgalgo_desc _name##_desc = { \
|
|
.name = #_name, \
|
|
.type = PCA_DEVTYPE_TA, \
|
|
.ta_ops = &ops, \
|
|
.chg_ops = NULL, \
|
|
.algo_ops = NULL, \
|
|
}
|
|
|
|
#define SIMPLE_PCA_CHG_DESC(_name, ops) \
|
|
const struct prop_chgalgo_desc _name##_desc = { \
|
|
.name = #_name, \
|
|
.type = PCA_DEVTYPE_CHARGER, \
|
|
.ta_ops = NULL, \
|
|
.chg_ops = &ops, \
|
|
.algo_ops = NULL, \
|
|
}
|
|
|
|
#define SIMPLE_PCA_ALGO_DESC(_name, ops) \
|
|
const struct prop_chgalgo_desc _name##_desc = { \
|
|
.name = #_name, \
|
|
.type = PCA_DEVTYPE_ALGO, \
|
|
.ta_ops = NULL, \
|
|
.chg_ops = NULL, \
|
|
.algo_ops = &ops, \
|
|
}
|
|
|
|
struct prop_chgalgo_ta_status {
|
|
int temp1;
|
|
int temp2;
|
|
u8 temp_level;
|
|
u8 present_input;
|
|
u8 present_battery_input;
|
|
bool ocp;
|
|
bool otp;
|
|
bool ovp;
|
|
};
|
|
|
|
struct prop_chgalgo_ta_auth_data {
|
|
int vcap_min;
|
|
int vcap_max;
|
|
int icap_min;
|
|
int vta_min;
|
|
int vta_max;
|
|
int ita_max;
|
|
int ita_min;
|
|
bool pwr_lmt;
|
|
u8 pdp;
|
|
bool support_meas_cap;
|
|
bool support_status;
|
|
bool support_cc;
|
|
u32 vta_step;
|
|
u32 ita_step;
|
|
u32 ita_gap_per_vstep;
|
|
};
|
|
|
|
enum prop_chgalgo_notify_source {
|
|
PCA_NOTISRC_TCP,
|
|
PCA_NOTISRC_CHG,
|
|
PCA_NOTISRC_ALGO,
|
|
PCA_NOTISRC_MAX,
|
|
};
|
|
|
|
enum prop_chgalgo_notify_evt {
|
|
PCA_NOTIEVT_DETACH,
|
|
PCA_NOTIEVT_HARDRESET,
|
|
PCA_NOTIEVT_VBUSOVP,
|
|
PCA_NOTIEVT_IBUSOCP,
|
|
PCA_NOTIEVT_IBUSUCP_FALL,
|
|
PCA_NOTIEVT_VBATOVP,
|
|
PCA_NOTIEVT_IBATOCP,
|
|
PCA_NOTIEVT_VOUTOVP,
|
|
PCA_NOTIEVT_VDROVP,
|
|
PCA_NOTIEVT_VBATOVP_ALARM,
|
|
PCA_NOTIEVT_VBUSOVP_ALARM,
|
|
PCA_NOTIEVT_ALGO_STOP,
|
|
PCA_NOTIEVT_MAX,
|
|
};
|
|
|
|
struct prop_chgalgo_notify {
|
|
enum prop_chgalgo_notify_source src;
|
|
enum prop_chgalgo_notify_evt evt;
|
|
};
|
|
|
|
enum prop_chgalgo_adc_channel {
|
|
PCA_ADCCHAN_VBUS = 0,
|
|
PCA_ADCCHAN_IBUS,
|
|
PCA_ADCCHAN_VBAT,
|
|
PCA_ADCCHAN_IBAT,
|
|
PCA_ADCCHAN_TBAT,
|
|
PCA_ADCCHAN_TCHG,
|
|
PCA_ADCCHAN_VOUT,
|
|
PCA_ADCCHAN_VSYS,
|
|
PCA_ADCCHAN_MAX,
|
|
};
|
|
|
|
struct prop_chgalgo_device;
|
|
|
|
struct prop_chgalgo_ta_ops {
|
|
int (*enable_charging)(struct prop_chgalgo_device *pca, bool en, u32 mV,
|
|
u32 mA);
|
|
int (*set_cap)(struct prop_chgalgo_device *pca, u32 mV, u32 mA);
|
|
int (*get_measure_cap)(struct prop_chgalgo_device *pca, u32 *mV,
|
|
u32 *mA);
|
|
int (*get_temperature)(struct prop_chgalgo_device *pca, int *degree);
|
|
int (*get_status)(struct prop_chgalgo_device *pca,
|
|
struct prop_chgalgo_ta_status *status);
|
|
int (*is_cc)(struct prop_chgalgo_device *pca, bool *cc);
|
|
int (*send_hardreset)(struct prop_chgalgo_device *pca);
|
|
int (*authenticate_ta)(struct prop_chgalgo_device *pca,
|
|
struct prop_chgalgo_ta_auth_data *data);
|
|
int (*enable_wdt)(struct prop_chgalgo_device *pca, bool en);
|
|
int (*set_wdt)(struct prop_chgalgo_device *pca, u32 ms);
|
|
int (*sync_vta)(struct prop_chgalgo_device *pca, u32 vta);
|
|
};
|
|
|
|
struct prop_chgalgo_chg_ops {
|
|
int (*enable_power_path)(struct prop_chgalgo_device *pca, bool en);
|
|
int (*enable_charging)(struct prop_chgalgo_device *pca, bool en);
|
|
int (*enable_chip)(struct prop_chgalgo_device *pca, bool en);
|
|
int (*enable_hz)(struct prop_chgalgo_device *pca, bool en);
|
|
int (*set_vbusovp)(struct prop_chgalgo_device *pca, u32 mV);
|
|
int (*set_ibusocp)(struct prop_chgalgo_device *pca, u32 mA);
|
|
int (*set_vbatovp)(struct prop_chgalgo_device *pca, u32 mV);
|
|
int (*set_ibatocp)(struct prop_chgalgo_device *pca, u32 mA);
|
|
int (*set_vbatovp_alarm)(struct prop_chgalgo_device *pca, u32 mV);
|
|
int (*reset_vbatovp_alarm)(struct prop_chgalgo_device *pca);
|
|
int (*set_vbusovp_alarm)(struct prop_chgalgo_device *pca, u32 mV);
|
|
int (*reset_vbusovp_alarm)(struct prop_chgalgo_device *pca);
|
|
int (*set_aicr)(struct prop_chgalgo_device *pca, u32 mA);
|
|
int (*set_ichg)(struct prop_chgalgo_device *pca, u32 mA);
|
|
int (*get_adc)(struct prop_chgalgo_device *pca,
|
|
enum prop_chgalgo_adc_channel chan, int *min, int *max);
|
|
int (*get_soc)(struct prop_chgalgo_device *pca, u32 *soc);
|
|
int (*is_vbuslowerr)(struct prop_chgalgo_device *pca, bool *err);
|
|
int (*is_charging_enabled)(struct prop_chgalgo_device *pca, bool *en);
|
|
int (*get_adc_accuracy)(struct prop_chgalgo_device *pca,
|
|
enum prop_chgalgo_adc_channel chan, int *min,
|
|
int *max);
|
|
int (*init_chip)(struct prop_chgalgo_device *pca);
|
|
int (*enable_auto_trans)(struct prop_chgalgo_device *pca, bool en);
|
|
int (*set_auto_trans)(struct prop_chgalgo_device *pca, u32 mV, bool en);
|
|
int (*dump_registers)(struct prop_chgalgo_device *pca);
|
|
};
|
|
|
|
struct prop_chgalgo_algo_ops {
|
|
int (*init_algo)(struct prop_chgalgo_device *pca);
|
|
bool (*is_algo_ready)(struct prop_chgalgo_device *pca);
|
|
int (*start_algo)(struct prop_chgalgo_device *pca);
|
|
bool (*is_algo_running)(struct prop_chgalgo_device *pca);
|
|
int (*plugout_reset)(struct prop_chgalgo_device *pca);
|
|
int (*stop_algo)(struct prop_chgalgo_device *pca, bool rerun);
|
|
int (*thermal_throttling)(struct prop_chgalgo_device *pca, int mA);
|
|
int (*set_jeita_vbat_cv)(struct prop_chgalgo_device *pca, int mV);
|
|
int (*notifier_call)(struct prop_chgalgo_device *pca,
|
|
struct prop_chgalgo_notify *notify);
|
|
};
|
|
|
|
enum prop_chgalgo_dev_type {
|
|
PCA_DEVTYPE_TA = 0,
|
|
PCA_DEVTYPE_CHARGER,
|
|
PCA_DEVTYPE_ALGO,
|
|
PCA_DEVTYPE_MAX,
|
|
};
|
|
|
|
struct prop_chgalgo_desc {
|
|
const char *name;
|
|
enum prop_chgalgo_dev_type type;
|
|
const struct prop_chgalgo_ta_ops *ta_ops;
|
|
const struct prop_chgalgo_chg_ops *chg_ops;
|
|
const struct prop_chgalgo_algo_ops *algo_ops;
|
|
};
|
|
|
|
struct prop_chgalgo_device {
|
|
struct device dev;
|
|
const struct prop_chgalgo_desc *desc;
|
|
struct srcu_notifier_head nh;
|
|
void *drv_data;
|
|
int (*suspend)(struct prop_chgalgo_device *pca);
|
|
int (*resume)(struct prop_chgalgo_device *pca);
|
|
};
|
|
|
|
extern struct prop_chgalgo_device *
|
|
prop_chgalgo_device_register(struct device *parent,
|
|
const struct prop_chgalgo_desc *desc,
|
|
void *drv_data);
|
|
extern void prop_chgalgo_device_unregister(struct prop_chgalgo_device *pca);
|
|
extern struct prop_chgalgo_device *
|
|
prop_chgalgo_dev_get_by_name(const char *name);
|
|
extern const char *
|
|
prop_chgalgo_notify_evt_tostring(enum prop_chgalgo_notify_evt evt);
|
|
|
|
static inline int prop_chgalgo_get_devtype(struct prop_chgalgo_device *pca)
|
|
{
|
|
return pca->desc->type;
|
|
}
|
|
|
|
static inline void *prop_chgalgo_get_drvdata(struct prop_chgalgo_device *pca)
|
|
{
|
|
return pca->drv_data;
|
|
}
|
|
|
|
static inline int
|
|
prop_chgalgo_notifier_register(struct prop_chgalgo_device *pca,
|
|
struct notifier_block *nb)
|
|
{
|
|
return srcu_notifier_chain_register(&pca->nh, nb);
|
|
}
|
|
|
|
static inline int
|
|
prop_chgalgo_notifier_unregister(struct prop_chgalgo_device *pca,
|
|
struct notifier_block *nb)
|
|
{
|
|
return srcu_notifier_chain_unregister(&pca->nh, nb);
|
|
}
|
|
|
|
/* Richtek pca TA interface */
|
|
extern int prop_chgalgo_enable_ta_charging(struct prop_chgalgo_device *pca,
|
|
bool en, u32 mV, u32 mA);
|
|
extern int prop_chgalgo_set_ta_cap(struct prop_chgalgo_device *pca, u32 mV,
|
|
u32 mA);
|
|
extern int prop_chgalgo_get_ta_measure_cap(struct prop_chgalgo_device *pca,
|
|
u32 *mV, u32 *mA);
|
|
extern int prop_chgalgo_get_ta_temperature(struct prop_chgalgo_device *pca,
|
|
int *degree);
|
|
extern int prop_chgalgo_get_ta_status(struct prop_chgalgo_device *pca,
|
|
struct prop_chgalgo_ta_status *status);
|
|
extern int prop_chgalgo_is_ta_cc(struct prop_chgalgo_device *pca, bool *cc);
|
|
extern int prop_chgalgo_send_ta_hardreset(struct prop_chgalgo_device *pca);
|
|
extern int prop_chgalgo_authenticate_ta(struct prop_chgalgo_device *pca,
|
|
struct prop_chgalgo_ta_auth_data *data);
|
|
extern int prop_chgalgo_enable_ta_wdt(struct prop_chgalgo_device *pca, bool en);
|
|
extern int prop_chgalgo_set_ta_wdt(struct prop_chgalgo_device *pca, u32 ms);
|
|
extern int prop_chgalgo_sync_ta_volt(struct prop_chgalgo_device *pca, u32 vta);
|
|
|
|
/* Richtek pca charger interface */
|
|
extern int prop_chgalgo_enable_power_path(struct prop_chgalgo_device *pca,
|
|
bool en);
|
|
extern int prop_chgalgo_enable_charging(struct prop_chgalgo_device *pca,
|
|
bool en);
|
|
extern int prop_chgalgo_enable_chip(struct prop_chgalgo_device *pca, bool en);
|
|
extern int prop_chgalgo_enable_hz(struct prop_chgalgo_device *pca, bool en);
|
|
extern int prop_chgalgo_set_vbusovp(struct prop_chgalgo_device *pca, u32 mV);
|
|
extern int prop_chgalgo_set_ibusocp(struct prop_chgalgo_device *pca, u32 mA);
|
|
extern int prop_chgalgo_set_vbatovp(struct prop_chgalgo_device *pca, u32 mV);
|
|
extern int prop_chgalgo_set_ibatocp(struct prop_chgalgo_device *pca, u32 mA);
|
|
extern int prop_chgalgo_set_vbatovp_alarm(struct prop_chgalgo_device *pca,
|
|
u32 mV);
|
|
extern int prop_chgalgo_reset_vbatovp_alarm(struct prop_chgalgo_device *pca);
|
|
extern int prop_chgalgo_set_vbusovp_alarm(struct prop_chgalgo_device *pca,
|
|
u32 mV);
|
|
extern int prop_chgalgo_reset_vbusovp_alarm(struct prop_chgalgo_device *pca);
|
|
extern int prop_chgalgo_get_adc(struct prop_chgalgo_device *pca,
|
|
enum prop_chgalgo_adc_channel chan, int *min,
|
|
int *max);
|
|
extern int prop_chgalgo_get_soc(struct prop_chgalgo_device *pca, u32 *soc);
|
|
extern int prop_chgalgo_set_ichg(struct prop_chgalgo_device *pca, u32 mA);
|
|
extern int prop_chgalgo_set_aicr(struct prop_chgalgo_device *pca, u32 mA);
|
|
extern int prop_chgalgo_is_vbuslowerr(struct prop_chgalgo_device *pca,
|
|
bool *err);
|
|
extern int prop_chgalgo_is_charging_enabled(struct prop_chgalgo_device *pca,
|
|
bool *en);
|
|
extern int prop_chgalgo_get_adc_accuracy(struct prop_chgalgo_device *pca,
|
|
enum prop_chgalgo_adc_channel chan,
|
|
int *min, int *max);
|
|
extern int prop_chgalgo_init_chip(struct prop_chgalgo_device *pca);
|
|
extern int prop_chgalgo_enable_auto_trans(struct prop_chgalgo_device *pca,
|
|
bool en);
|
|
extern int prop_chgalgo_set_auto_trans(struct prop_chgalgo_device *pca, u32 mV, bool en);
|
|
extern int prop_chgalgo_dump_registers(struct prop_chgalgo_device *pca);
|
|
|
|
/* Richtek pca algorithm interface */
|
|
#ifdef CONFIG_RT_PROP_CHGALGO
|
|
extern int prop_chgalgo_init_algo(struct prop_chgalgo_device *pca);
|
|
extern bool prop_chgalgo_is_algo_ready(struct prop_chgalgo_device *pca);
|
|
extern int prop_chgalgo_start_algo(struct prop_chgalgo_device *pca);
|
|
extern bool prop_chgalgo_is_algo_running(struct prop_chgalgo_device *pca);
|
|
extern int prop_chgalgo_plugout_reset(struct prop_chgalgo_device *pca);
|
|
extern int prop_chgalgo_stop_algo(struct prop_chgalgo_device *pca, bool rerun);
|
|
extern int prop_chgalgo_notifier_call(struct prop_chgalgo_device *pca,
|
|
struct prop_chgalgo_notify *notify);
|
|
extern int prop_chgalgo_thermal_throttling(struct prop_chgalgo_device *pca,
|
|
int mA);
|
|
extern int prop_chgalgo_set_jeita_vbat_cv(struct prop_chgalgo_device *pca,
|
|
int mV);
|
|
#else
|
|
static inline int prop_chgalgo_init_algo(struct prop_chgalgo_device *pca)
|
|
{
|
|
return -ENOTSUPP;
|
|
}
|
|
|
|
static inline bool prop_chgalgo_is_algo_ready(struct prop_chgalgo_device *pca)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
static inline int prop_chgalgo_start_algo(struct prop_chgalgo_device *pca)
|
|
{
|
|
return -ENOTSUPP;
|
|
}
|
|
|
|
static inline bool prop_chgalgo_is_algo_running(struct prop_chgalgo_device *pca)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
static inline int prop_chgalgo_plugout_reset(struct prop_chgalgo_device *pca)
|
|
{
|
|
return -ENOTSUPP;
|
|
}
|
|
|
|
static inline int prop_chgalgo_stop_algo(struct prop_chgalgo_device *pca,
|
|
bool rerun)
|
|
{
|
|
return -ENOTSUPP;
|
|
}
|
|
|
|
static inline int prop_chgalgo_notifier_call(struct prop_chgalgo_device *pca,
|
|
struct prop_chgalgo_notify *notify)
|
|
{
|
|
return -ENOTSUPP;
|
|
}
|
|
|
|
static inline int
|
|
prop_chgalgo_thermal_throttling(struct prop_chgalgo_device *pca, int mA)
|
|
{
|
|
return -ENOTSUPP;
|
|
}
|
|
|
|
static inline int
|
|
prop_chgalgo_set_jeita_vbat_cv(struct prop_chgalgo_device *pca, int mV)
|
|
{
|
|
return -ENOTSUPP;
|
|
}
|
|
#endif /* CONFIG_RT_PROP_CHGALGO */
|
|
#endif /* __LINUX_PROP_CHGALGO_CLASS_H */
|