210 lines
5.4 KiB
C
Executable file
210 lines
5.4 KiB
C
Executable file
/* SPDX-License-Identifier: GPL-2.0 */
|
|
/*
|
|
* Copyright (c) 2019 MediaTek Inc.
|
|
* Author Wy Chuang<wy.chuang@mediatek.com>
|
|
*/
|
|
|
|
#ifndef __MTK_CHARGER_ALGORITHM_CLASS_H__
|
|
#define __MTK_CHARGER_ALGORITHM_CLASS_H__
|
|
|
|
#include <linux/module.h>
|
|
#include <linux/stat.h>
|
|
#include <linux/init.h>
|
|
#include <linux/ctype.h>
|
|
#include <linux/err.h>
|
|
#include <linux/slab.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/device.h>
|
|
#include <linux/mutex.h>
|
|
|
|
#define PE_ID (1 << 0)
|
|
#define PE2_ID (1 << 1)
|
|
#define PDC_ID (1 << 2)
|
|
#define PE4_ID (1 << 3)
|
|
#define PE5_ID (1 << 4)
|
|
#define HVBP_ID (1 << 5)
|
|
#define PE5P_ID (1 << 6)
|
|
#define WL_ID (1 << 7) // drv add tankaikun, add facoryt charger class, 20231204
|
|
|
|
struct chg_alg_properties {
|
|
const char *alias_name;
|
|
};
|
|
|
|
/*
|
|
* ALG_INIT_FAIL: hw init fail
|
|
* ALG_TA_NOT_SUPPORT: TA does not support
|
|
* ALG_TA_CHECKING: checking TA
|
|
* ALG_NOT_READY: TA support & not meet the conditions
|
|
* ALG_WAIVER: alg waives being executed
|
|
* ALG_READY: TA support & meet the conditions
|
|
* ALG_RUNNING: alg is running
|
|
* ALG_DONE: alg done
|
|
*/
|
|
enum chg_alg_state {
|
|
ALG_INIT_FAIL,
|
|
ALG_TA_CHECKING,
|
|
ALG_TA_NOT_SUPPORT,
|
|
ALG_NOT_READY,
|
|
ALG_WAIVER,
|
|
ALG_READY,
|
|
ALG_RUNNING,
|
|
ALG_DONE,
|
|
};
|
|
|
|
enum chg_idx {
|
|
CHG1,
|
|
CHG2,
|
|
BUCKBSTCHG,
|
|
DVCHG1,
|
|
DVCHG2,
|
|
HVDVCHG1,
|
|
HVDVCHG2,
|
|
CHG_MAX,
|
|
};
|
|
|
|
enum charger_configuration {
|
|
SINGLE_CHARGER,
|
|
DUAL_CHARGERS_IN_SERIES,
|
|
DUAL_CHARGERS_IN_PARALLEL,
|
|
DIVIDER_CHARGER,
|
|
DUAL_DIVIDER_CHARGERS,
|
|
HVDIVIDER_CHARGER,
|
|
DUAL_HVDIVIDER_CHARGERS,
|
|
};
|
|
|
|
struct chg_alg_device {
|
|
struct chg_alg_properties props;
|
|
const struct chg_alg_ops *ops;
|
|
enum charger_configuration config;
|
|
struct mutex ops_lock;
|
|
struct device dev;
|
|
struct srcu_notifier_head evt_nh;
|
|
void *driver_data;
|
|
void *driver_hal_data;
|
|
bool is_polling_mode;
|
|
int alg_id;
|
|
bool pe_ready_check_done;//drv-mod, pe50 check, 20230913
|
|
};
|
|
|
|
enum chg_alg_notifier_events {
|
|
EVT_PLUG_IN,
|
|
EVT_PLUG_OUT,
|
|
EVT_FULL,
|
|
EVT_RECHARGE,
|
|
EVT_DETACH,
|
|
EVT_HARDRESET,
|
|
EVT_VBUSOVP,
|
|
EVT_IBUSOCP,
|
|
EVT_IBUSUCP_FALL,
|
|
EVT_VBATOVP,
|
|
EVT_IBATOCP,
|
|
EVT_VOUTOVP,
|
|
EVT_VDROVP,
|
|
EVT_VBATOVP_ALARM,
|
|
EVT_VBUSOVP_ALARM,
|
|
EVT_BATPRO_DONE,
|
|
EVT_ALGO_STOP,
|
|
EVT_MAX,
|
|
};
|
|
|
|
struct chg_alg_notify {
|
|
enum chg_alg_notifier_events evt;
|
|
int value;
|
|
};
|
|
|
|
struct chg_limit_setting {
|
|
int cv;
|
|
int input_current_limit1;
|
|
int input_current_limit2;
|
|
int input_current_limit_dvchg1;
|
|
int charging_current_limit1;
|
|
int charging_current_limit2;
|
|
// drv add tankaikun, add step charging, 20231130 start
|
|
int charging_current_cv_tapper;
|
|
int step_cv;
|
|
// drv add tankaikun, add step charging, 20231130 end
|
|
bool vbat_mon_en;
|
|
};
|
|
|
|
enum chg_alg_props {
|
|
ALG_MAX_VBUS,
|
|
ALG_LOG_LEVEL,
|
|
ALG_REF_VBAT,
|
|
ALG_CHARGE_PWR, // drv add tankikun, add algo get prop api, 20240118
|
|
};
|
|
|
|
struct chg_alg_ops {
|
|
int (*init_algo)(struct chg_alg_device *alg);
|
|
int (*is_algo_ready)(struct chg_alg_device *alg);
|
|
int (*start_algo)(struct chg_alg_device *alg);
|
|
bool (*is_algo_running)(struct chg_alg_device *alg);
|
|
int (*plugout_reset)(struct chg_alg_device *alg);
|
|
int (*stop_algo)(struct chg_alg_device *alg);
|
|
int (*notifier_call)(struct chg_alg_device *alg,
|
|
struct chg_alg_notify *notify);
|
|
int (*get_prop)(struct chg_alg_device *alg,
|
|
enum chg_alg_props s, int *value);
|
|
int (*set_prop)(struct chg_alg_device *alg,
|
|
enum chg_alg_props s, int value);
|
|
int (*set_current_limit)(struct chg_alg_device *alg_dev,
|
|
struct chg_limit_setting *setting);
|
|
|
|
};
|
|
|
|
#define to_chg_alg_dev(obj) container_of(obj, struct chg_alg_device, dev)
|
|
|
|
static inline void *chg_alg_dev_get_drvdata(
|
|
const struct chg_alg_device *chg_alg)
|
|
{
|
|
return chg_alg->driver_data;
|
|
}
|
|
|
|
static inline void chg_alg_dev_set_drvdata(
|
|
struct chg_alg_device *chg_alg, void *data)
|
|
{
|
|
chg_alg->driver_data = data;
|
|
}
|
|
|
|
static inline void *chg_alg_dev_get_drv_hal_data(
|
|
const struct chg_alg_device *chg_alg)
|
|
{
|
|
return chg_alg->driver_hal_data;
|
|
}
|
|
|
|
static inline void chg_alg_dev_set_drv_hal_data(
|
|
struct chg_alg_device *chg_alg, void *data)
|
|
{
|
|
chg_alg->driver_hal_data = data;
|
|
}
|
|
|
|
extern struct chg_alg_device *get_chg_alg_by_name(
|
|
const char *name);
|
|
extern struct chg_alg_device *chg_alg_device_register(
|
|
const char *name, struct device *parent,
|
|
void *devdata, const struct chg_alg_ops *ops,
|
|
const struct chg_alg_properties *props);
|
|
extern void chg_alg_device_unregister(
|
|
struct chg_alg_device *charger_dev);
|
|
extern int register_chg_alg_notifier(struct chg_alg_device *alg_dev,
|
|
struct notifier_block *nb);
|
|
extern int unregister_chg_alg_notifier(struct chg_alg_device *alg_dev,
|
|
struct notifier_block *nb);
|
|
|
|
extern int chg_alg_init_algo(struct chg_alg_device *alg_dev);
|
|
extern int chg_alg_is_algo_ready(struct chg_alg_device *alg_dev);
|
|
extern int chg_alg_start_algo(struct chg_alg_device *alg_dev);
|
|
extern int chg_alg_is_algo_running(struct chg_alg_device *alg_dev);
|
|
extern int chg_alg_plugout_reset(struct chg_alg_device *alg_dev);
|
|
extern int chg_alg_stop_algo(struct chg_alg_device *alg_dev);
|
|
extern int chg_alg_get_prop(struct chg_alg_device *alg_dev,
|
|
enum chg_alg_props s, int *value);
|
|
extern int chg_alg_set_prop(struct chg_alg_device *alg_dev,
|
|
enum chg_alg_props s, int value);
|
|
extern int chg_alg_set_current_limit(struct chg_alg_device *alg_dev,
|
|
struct chg_limit_setting *setting);
|
|
extern int chg_alg_notifier_call(struct chg_alg_device *alg_dev,
|
|
struct chg_alg_notify *notify);
|
|
extern char *chg_alg_state_to_str(int state);
|
|
extern const char *const
|
|
chg_alg_notify_evt_tostring(enum chg_alg_notifier_events evt);
|
|
#endif /* __MTK_CHARGER_ALGORITHM_CLASS_H__ */
|