kernel_samsung_a34x-permissive/drivers/power/supply/charger_class.h
2024-04-28 15:51:13 +02:00

321 lines
11 KiB
C

/* SPDX-License-Identifier: GPL-2.0 */
/*
* Copyright (c) 2019 MediaTek Inc.
*/
#ifndef LINUX_POWER_CHARGER_CLASS_H
#define LINUX_POWER_CHARGER_CLASS_H
#include <linux/kernel.h>
#include <linux/device.h>
#include <linux/mutex.h>
enum adc_channel {
ADC_CHANNEL_VBUS,
ADC_CHANNEL_VSYS,
ADC_CHANNEL_VBAT,
ADC_CHANNEL_IBUS,
ADC_CHANNEL_IBAT,
ADC_CHANNEL_TEMP_JC,
ADC_CHANNEL_USBID,
ADC_CHANNEL_TS,
};
struct charger_properties {
const char *alias_name;
};
/* Data of notifier from charger device */
struct chgdev_notify {
bool vbusov_stat;
};
/* charger_dev notify */
enum {
CHARGER_DEV_NOTIFY_VBUS_OVP,
CHARGER_DEV_NOTIFY_BAT_OVP,
CHARGER_DEV_NOTIFY_EOC,
CHARGER_DEV_NOTIFY_RECHG,
CHARGER_DEV_NOTIFY_SAFETY_TIMEOUT,
};
struct charger_device {
struct charger_properties props;
struct chgdev_notify noti;
const struct charger_ops *ops;
struct mutex ops_lock;
struct device dev;
struct srcu_notifier_head evt_nh;
void *driver_data;
bool is_polling_mode;
};
struct charger_ops {
int (*suspend)(struct charger_device *dev, pm_message_t state);
int (*resume)(struct charger_device *dev);
/* cable plug in/out */
int (*plug_in)(struct charger_device *dev);
int (*plug_out)(struct charger_device *dev);
/* enable/disable charger */
int (*enable)(struct charger_device *dev, bool en);
int (*is_enabled)(struct charger_device *dev, bool *en);
/* enable/disable chip */
int (*enable_chip)(struct charger_device *dev, bool en);
int (*is_chip_enabled)(struct charger_device *dev, bool *en);
/* get/set charging current*/
int (*get_charging_current)(struct charger_device *dev, u32 *uA);
int (*set_charging_current)(struct charger_device *dev, u32 uA);
int (*get_min_charging_current)(struct charger_device *dev, u32 *uA);
/* set cv */
int (*set_constant_voltage)(struct charger_device *dev, u32 uV);
int (*get_constant_voltage)(struct charger_device *dev, u32 *uV);
/* set input_current */
int (*get_input_current)(struct charger_device *dev, u32 *uA);
int (*set_input_current)(struct charger_device *dev, u32 uA);
int (*get_min_input_current)(struct charger_device *dev, u32 *uA);
/* set termination current */
int (*get_eoc_current)(struct charger_device *dev, u32 *uA);
int (*set_eoc_current)(struct charger_device *dev, u32 uA);
/* kick wdt */
int (*kick_wdt)(struct charger_device *dev);
int (*event)(struct charger_device *dev, u32 event, u32 args);
/* PE+/PE+2.0 */
int (*send_ta_current_pattern)(struct charger_device *dev, bool is_inc);
int (*send_ta20_current_pattern)(struct charger_device *dev, u32 uV);
int (*reset_ta)(struct charger_device *dev);
int (*enable_cable_drop_comp)(struct charger_device *dev, bool en);
int (*set_mivr)(struct charger_device *dev, u32 uV);
int (*get_mivr)(struct charger_device *dev, u32 *uV);
int (*get_mivr_state)(struct charger_device *dev, bool *in_loop);
/* enable/disable powerpath */
int (*is_powerpath_enabled)(struct charger_device *dev, bool *en);
int (*enable_powerpath)(struct charger_device *dev, bool en);
/* enable/disable vbus ovp */
int (*enable_vbus_ovp)(struct charger_device *dev, bool en);
/* enable/disable charging safety timer */
int (*is_safety_timer_enabled)(struct charger_device *dev, bool *en);
int (*enable_safety_timer)(struct charger_device *dev, bool en);
/* enable term */
int (*enable_termination)(struct charger_device *dev, bool en);
/* direct charging */
int (*enable_direct_charging)(struct charger_device *dev, bool en);
int (*kick_direct_charging_wdt)(struct charger_device *dev);
int (*set_direct_charging_ibusoc)(struct charger_device *dev, u32 uA);
int (*set_direct_charging_vbusov)(struct charger_device *dev, u32 uV);
/* OTG */
int (*enable_otg)(struct charger_device *dev, bool en);
int (*enable_discharge)(struct charger_device *dev, bool en);
int (*set_boost_current_limit)(struct charger_device *dev, u32 uA);
/* charger type detection */
int (*enable_chg_type_det)(struct charger_device *dev, bool en);
/* run AICL */
int (*run_aicl)(struct charger_device *dev, u32 *uA);
/* reset EOC state */
int (*reset_eoc_state)(struct charger_device *dev);
int (*safety_check)(struct charger_device *dev, u32 polling_ieoc);
int (*is_charging_done)(struct charger_device *dev, bool *done);
int (*set_pe20_efficiency_table)(struct charger_device *dev);
int (*dump_registers)(struct charger_device *dev);
int (*get_adc)(struct charger_device *dev, enum adc_channel chan,
int *min, int *max);
int (*get_vbus_adc)(struct charger_device *dev, u32 *vbus);
int (*get_ibus_adc)(struct charger_device *dev, u32 *ibus);
int (*get_ibat_adc)(struct charger_device *dev, u32 *ibat);
int (*get_tchg_adc)(struct charger_device *dev, int *tchg_min,
int *tchg_max);
int (*get_zcv)(struct charger_device *dev, u32 *uV);
/* TypeC */
int (*enable_usbid)(struct charger_device *dev, bool en);
int (*set_usbid_rup)(struct charger_device *dev, u32 rup);
int (*set_usbid_src_ton)(struct charger_device *dev, u32 src_ton);
int (*enable_usbid_floating)(struct charger_device *dev, bool en);
int (*enable_force_typec_otp)(struct charger_device *dev, bool en);
int (*enable_hidden_mode)(struct charger_device *dev, bool en);
int (*get_ctd_dischg_status)(struct charger_device *dev, u8 *status);
};
static inline void *charger_dev_get_drvdata(
const struct charger_device *charger_dev)
{
return charger_dev->driver_data;
}
static inline void charger_dev_set_drvdata(
struct charger_device *charger_dev, void *data)
{
charger_dev->driver_data = data;
}
extern struct charger_device *charger_device_register(
const char *name,
struct device *parent, void *devdata, const struct charger_ops *ops,
const struct charger_properties *props);
extern void charger_device_unregister(
struct charger_device *charger_dev);
extern struct charger_device *get_charger_by_name(
const char *name);
#define to_charger_device(obj) container_of(obj, struct charger_device, dev)
static inline void *charger_get_data(
struct charger_device *charger_dev)
{
return dev_get_drvdata(&charger_dev->dev);
}
extern int charger_dev_enable(struct charger_device *charger_dev, bool en);
extern int charger_dev_is_enabled(struct charger_device *charger_dev, bool *en);
extern int charger_dev_plug_in(struct charger_device *charger_dev);
extern int charger_dev_plug_out(struct charger_device *charger_dev);
extern int charger_dev_set_charging_current(
struct charger_device *charger_dev, u32 uA);
extern int charger_dev_get_charging_current(
struct charger_device *charger_dev, u32 *uA);
extern int charger_dev_get_min_charging_current(
struct charger_device *charger_dev, u32 *uA);
extern int charger_dev_set_input_current(
struct charger_device *charger_dev, u32 uA);
extern int charger_dev_get_input_current(
struct charger_device *charger_dev, u32 *uA);
extern int charger_dev_get_min_input_current(
struct charger_device *charger_dev, u32 *uA);
extern int charger_dev_set_eoc_current(
struct charger_device *charger_dev, u32 uA);
extern int charger_dev_get_eoc_current(
struct charger_device *charger_dev, u32 *uA);
extern int charger_dev_kick_wdt(
struct charger_device *charger_dev);
extern int charger_dev_set_constant_voltage(
struct charger_device *charger_dev, u32 uV);
extern int charger_dev_get_constant_voltage(
struct charger_device *charger_dev, u32 *uV);
extern int charger_dev_dump_registers(
struct charger_device *charger_dev);
extern int charger_dev_enable_vbus_ovp(
struct charger_device *charger_dev, bool en);
extern int charger_dev_set_mivr(
struct charger_device *charger_dev, u32 uV);
extern int charger_dev_get_mivr(
struct charger_device *charger_dev, u32 *uV);
extern int charger_dev_get_mivr_state(
struct charger_device *charger_dev, bool *in_loop);
extern int charger_dev_do_event(
struct charger_device *charger_dev, u32 event, u32 args);
extern int charger_dev_is_powerpath_enabled(
struct charger_device *charger_dev, bool *en);
extern int charger_dev_is_safety_timer_enabled(
struct charger_device *charger_dev, bool *en);
extern int charger_dev_enable_termination(
struct charger_device *charger_dev, bool en);
extern int charger_dev_is_charging_done(
struct charger_device *charger_dev, bool *done);
extern int charger_dev_enable_powerpath(
struct charger_device *charger_dev, bool en);
extern int charger_dev_enable_safety_timer(
struct charger_device *charger_dev, bool en);
extern int charger_dev_enable_chg_type_det(
struct charger_device *charger_dev, bool en);
extern int charger_dev_enable_otg(
struct charger_device *charger_dev, bool en);
extern int charger_dev_enable_discharge(
struct charger_device *charger_dev, bool en);
extern int charger_dev_set_boost_current_limit(
struct charger_device *charger_dev, u32 uA);
extern int charger_dev_get_zcv(
struct charger_device *charger_dev, u32 *uV);
extern int charger_dev_run_aicl(
struct charger_device *charger_dev, u32 *uA);
extern int charger_dev_reset_eoc_state(
struct charger_device *charger_dev);
extern int charger_dev_safety_check(
struct charger_device *charger_dev, u32 polling_ieoc);
/* PE+/PE+2.0 */
extern int charger_dev_send_ta_current_pattern(
struct charger_device *charger_dev, bool is_increase);
extern int charger_dev_send_ta20_current_pattern(
struct charger_device *charger_dev, u32 uV);
extern int charger_dev_reset_ta(
struct charger_device *charger_dev);
extern int charger_dev_set_pe20_efficiency_table(
struct charger_device *charger_dev);
extern int charger_dev_enable_cable_drop_comp(
struct charger_device *charger_dev, bool en);
/* PE 3.0 */
extern int charger_dev_enable_chip(
struct charger_device *charger_dev, bool en);
extern int charger_dev_is_chip_enabled(
struct charger_device *charger_dev, bool *en);
extern int charger_dev_enable_direct_charging(
struct charger_device *charger_dev, bool en);
extern int charger_dev_kick_direct_charging_wdt(
struct charger_device *charger_dev);
extern int charger_dev_get_adc(struct charger_device *charger_dev,
enum adc_channel chan, int *min, int *max);
/* Prefer use charger_dev_get_adc api */
extern int charger_dev_get_vbus(
struct charger_device *charger_dev, u32 *vbus);
extern int charger_dev_get_ibus(
struct charger_device *charger_dev, u32 *ibus);
extern int charger_dev_get_ibat(
struct charger_device *charger_dev, u32 *ibat);
extern int charger_dev_get_temperature(
struct charger_device *charger_dev, int *tchg_min,
int *tchg_max);
extern int charger_dev_set_direct_charging_ibusoc(
struct charger_device *charger_dev, u32 ua);
extern int charger_dev_set_direct_charging_vbusov(
struct charger_device *charger_dev, u32 uv);
/* TypeC */
extern int charger_dev_enable_usbid(struct charger_device *dev, bool en);
extern int charger_dev_set_usbid_rup(struct charger_device *dev, u32 rup);
extern int charger_dev_set_usbid_src_ton(struct charger_device *dev,
u32 src_ton);
extern int charger_dev_enable_usbid_floating(struct charger_device *dev,
bool en);
extern int charger_dev_enable_force_typec_otp(struct charger_device *dev,
bool en);
extern int charger_dev_get_ctd_dischg_status(struct charger_device *dev,
u8 *status);
/* For buck1 FPWM */
extern int charger_dev_enable_hidden_mode(struct charger_device *dev, bool en);
extern int register_charger_device_notifier(
struct charger_device *charger_dev,
struct notifier_block *nb);
extern int unregister_charger_device_notifier(
struct charger_device *charger_dev,
struct notifier_block *nb);
extern int charger_dev_notify(
struct charger_device *charger_dev, int event);
#endif /*LINUX_POWER_CHARGER_CLASS_H*/