^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) * rk817 charger driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * Copyright (C) 2018 Rockchip Electronics Co., Ltd
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * xsf <xsf@rock-chips.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) * This program is free software; you can redistribute it and/or modify it
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) * under the terms and conditions of the GNU General Public License,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) * version 2, as published by the Free Software Foundation.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) * This program is distributed in the hope it will be useful, but WITHOUT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) * more details.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #include <linux/delay.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #include <linux/extcon.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #include <linux/gpio.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #include <linux/iio/consumer.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #include <linux/iio/iio.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #include <linux/irq.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #include <linux/jiffies.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #include <linux/mfd/rk808.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #include <linux/of_device.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #include <linux/of_gpio.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #include <linux/platform_device.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #include <linux/power_supply.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #include <linux/power/rk_usbbc.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) #include <linux/regmap.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) #include <linux/rtc.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) #include <linux/timer.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) #include <linux/workqueue.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) static int dbg_enable;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) module_param_named(dbg_level, dbg_enable, int, 0644);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) #define DBG(args...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) do { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) if (dbg_enable) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) pr_info(args); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) } \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) } while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) #define CHARGE_DRIVER_VERSION "1.0"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) #define DISABLE 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) #define ENABLE 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) #define OTG_SLP_ENABLE 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) #define OTG_SLP_DISABLE 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) #define OTG_ENABLE 0x11
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) #define OTG_DISABLE 0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) #define RK817_BOOST_ENABLE 0x11
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) #define RK817_BOOST_DISABLE 0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) #define OTG_MODE 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) #define OTG_MODE_ON 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) #define DEFAULT_INPUT_VOLTAGE 4500
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) #define DEFAULT_INPUT_CURRENT 2000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) #define DEFAULT_CHRG_VOLTAGE 4200
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) #define DEFAULT_CHRG_CURRENT 1400
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) #define DEFAULT_CHRG_TERM_MODE 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) #define DEFAULT_CHRG_TERM_CUR 150
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) #define SAMPLE_RES_10MR 10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) #define SAMPLE_RES_20MR 20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) #define SAMPLE_RES_DIV1 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) #define SAMPLE_RES_DIV2 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) #define INPUT_450MA 450
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) #define INPUT_1500MA 1500
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) #define CURRENT_TO_ADC(current, samp_res) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) (current * 1000 * samp_res / 172)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) enum charge_current {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) CHRG_CUR_1000MA,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) CHRG_CUR_1500MA,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) CHRG_CUR_2000MA,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) CHRG_CUR_2500MA,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) CHRG_CUR_2750MA,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) CHRG_CUR_3000MA,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) CHRG_CUR_3500MA,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) CHRG_CUR_500MA,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) enum charge_voltage {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) CHRG_VOL_4100MV,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) CHRG_VOL_4150MV,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) CHRG_VOL_4200MV,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) CHRG_VOL_4250MV,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) CHRG_VOL_4300MV,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) CHRG_VOL_4350MV,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) CHRG_VOL_4400MV,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) CHRG_VOL_4450MV,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) enum input_voltage {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) INPUT_VOL_4000MV,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) INPUT_VOL_4100MV,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) INPUT_VOL_4200MV,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) INPUT_VOL_4300MV,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) INPUT_VOL_4400MV,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) INPUT_VOL_4500MV,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) INPUT_VOL_4600MV,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) INPUT_VOL_4700MV,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) enum input_current {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) INPUT_CUR_450MA,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) INPUT_CUR_80MA,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) INPUT_CUR_850MA,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) INPUT_CUR_1500MA,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) INPUT_CUR_1750MA,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) INPUT_CUR_2000MA,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) INPUT_CUR_2500MA,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) INPUT_CUR_3000MA,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) enum charge_clk {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) CHRG_CLK_1M,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) CHRG_CLK_2M,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) enum charge_term_sel {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) CHRG_TERM_150MA,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) CHRG_TERM_200MA,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) CHRG_TERM_300MA,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) CHRG_TERM_400MA,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) enum charge_timer_trickle {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) CHRG_TIMER_TRIKL_30MIN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) CHRG_TIMER_TRIKL_45MIN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) CHRG_TIMER_TRIKL_60MIN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) CHRG_TIMER_TRIKL_90MIN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) CHRG_TIMER_TRIKL_120MIN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) CHRG_TIMER_TRIKL_150MIN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) CHRG_TIMER_TRIKL_180MIN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) CHRG_TIMER_TRIKL_210MIN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) enum charge_timer_cccv {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) CHRG_TIMER_CCCV_4H,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) CHRG_TIMER_CCCV_5H,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) CHRG_TIMER_CCCV_6H,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) CHRG_TIMER_CCCV_8H,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) CHRG_TIMER_CCCV_10H,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) CHRG_TIMER_CCCV_12H,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) CHRG_TIMER_CCCV_14H,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) CHRG_TIMER_CCCV_16H,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) enum charge_status {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) CHRG_OFF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) DEAD_CHRG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) TRICKLE_CHRG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) CC_OR_CV_CHRG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) CHRG_TERM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) USB_OVER_VOL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) BAT_TMP_ERR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) BAT_TIM_ERR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) enum discharge_ilimit {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) DISCHRG_2000MA,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) DISCHRG_2500MA,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) DISCHRG_3000MA,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) DISCHRG_3500MA,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) DISCHRG_4000MA,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) enum bat_system_comp_time {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) DLY_20US,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) DLY_10US,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) DLY_40US,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) DLY_20US_AGAIN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) enum charge_term_mode {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) CHRG_ANALOG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) CHRG_DIGITAL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) enum charger_t {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) USB_TYPE_UNKNOWN_CHARGER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) USB_TYPE_NONE_CHARGER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) USB_TYPE_USB_CHARGER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) USB_TYPE_AC_CHARGER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) USB_TYPE_CDP_CHARGER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) DC_TYPE_DC_CHARGER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) DC_TYPE_NONE_CHARGER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) enum charger_state {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) OFFLINE = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) ONLINE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) enum rk817_charge_fields {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) BOOST_EN, OTG_EN, OTG_SLP_EN, CHRG_CLK_SEL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) CHRG_EN, CHRG_VOL_SEL, CHRG_CT_EN, CHRG_CUR_SEL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) USB_VLIM_EN, USB_VLIM_SEL, USB_ILIM_EN, USB_ILIM_SEL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) SYS_CAN_SD, USB_SYS_EN, BAT_OVP_EN, CHRG_TERM_ANA_DIG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) CHRG_TERM_ANA_SEL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) CHRG_TERM_DIG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) BAT_HTS_TS, BAT_LTS_TS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) CHRG_TIMER_TRIKL_EN, CHRG_TIMER_TRIKL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) CHRG_TIMER_CCCV_EN, CHRG_TIMER_CCCV,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) BAT_EXS, CHG_STS, BAT_OVP_STS, CHRG_IN_CLAMP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) USB_EXS, USB_EFF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) BAT_DIS_ILIM_STS, BAT_SYS_CMP_DLY, BAT_DIS_ILIM_EN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) BAT_DISCHRG_ILIM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) PLUG_IN_STS, SOC_REG0, SOC_REG1, SOC_REG2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) F_MAX_FIELDS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) static const struct reg_field rk817_charge_reg_fields[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) [SOC_REG0] = REG_FIELD(0x9A, 0, 7),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) [SOC_REG1] = REG_FIELD(0x9B, 0, 7),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) [SOC_REG2] = REG_FIELD(0x9C, 0, 7),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) [BOOST_EN] = REG_FIELD(0xB4, 1, 5),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) [OTG_EN] = REG_FIELD(0xB4, 2, 6),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) [OTG_SLP_EN] = REG_FIELD(0xB5, 6, 6),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) [CHRG_EN] = REG_FIELD(0xE4, 7, 7),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) [CHRG_VOL_SEL] = REG_FIELD(0xE4, 4, 6),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) [CHRG_CT_EN] = REG_FIELD(0xE4, 3, 3),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) [CHRG_CUR_SEL] = REG_FIELD(0xE4, 0, 2),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) [USB_VLIM_EN] = REG_FIELD(0xE5, 7, 7),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) [USB_VLIM_SEL] = REG_FIELD(0xE5, 4, 6),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) [USB_ILIM_EN] = REG_FIELD(0xE5, 3, 3),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) [USB_ILIM_SEL] = REG_FIELD(0xE5, 0, 2),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) [SYS_CAN_SD] = REG_FIELD(0xE6, 7, 7),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) [USB_SYS_EN] = REG_FIELD(0xE6, 6, 6),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) [BAT_OVP_EN] = REG_FIELD(0xE6, 3, 3),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) [CHRG_TERM_ANA_DIG] = REG_FIELD(0xE6, 2, 2),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) [CHRG_TERM_ANA_SEL] = REG_FIELD(0xE6, 0, 1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) [CHRG_TERM_DIG] = REG_FIELD(0xE7, 0, 7),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) [BAT_HTS_TS] = REG_FIELD(0xE8, 0, 7),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) [BAT_LTS_TS] = REG_FIELD(0xE9, 0, 7),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) [CHRG_TIMER_TRIKL_EN] = REG_FIELD(0xEA, 7, 7),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) [CHRG_TIMER_TRIKL] = REG_FIELD(0xEA, 4, 6),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) [CHRG_TIMER_CCCV_EN] = REG_FIELD(0xEA, 3, 3),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) [CHRG_TIMER_CCCV] = REG_FIELD(0xEA, 0, 2),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) [BAT_EXS] = REG_FIELD(0xEB, 7, 7),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) [CHG_STS] = REG_FIELD(0xEB, 4, 6),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) [BAT_OVP_STS] = REG_FIELD(0xEB, 3, 3),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) [CHRG_IN_CLAMP] = REG_FIELD(0xEB, 2, 2),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) [USB_EXS] = REG_FIELD(0xEB, 1, 1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) [USB_EFF] = REG_FIELD(0xEB, 0, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) [BAT_DIS_ILIM_STS] = REG_FIELD(0xEC, 6, 6),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) [BAT_SYS_CMP_DLY] = REG_FIELD(0xEC, 4, 5),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) [BAT_DIS_ILIM_EN] = REG_FIELD(0xEC, 3, 3),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) [BAT_DISCHRG_ILIM] = REG_FIELD(0xEC, 0, 2),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) [PLUG_IN_STS] = REG_FIELD(0xf0, 6, 6),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) [CHRG_CLK_SEL] = REG_FIELD(0xF3, 6, 6),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) struct charger_platform_data {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) u32 max_input_current;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) u32 min_input_voltage;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) u32 max_chrg_current;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) u32 max_chrg_voltage;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) u32 chrg_finish_cur;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) u32 chrg_term_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) u32 power_dc2otg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) u32 dc_det_level;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) int dc_det_pin;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) bool support_dc_det;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) int virtual_power;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) int sample_res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) int otg5v_suspend_enable;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) bool extcon;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) int gate_function_disable;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) struct rk817_charger {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) struct i2c_client *client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) struct platform_device *pdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) struct device *dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) struct rk808 *rk817;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) struct regmap *regmap;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) struct regmap_field *rmap_fields[F_MAX_FIELDS];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) struct power_supply *ac_psy;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) struct power_supply *usb_psy;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) struct extcon_dev *cable_edev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) struct charger_platform_data *pdata;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) struct workqueue_struct *usb_charger_wq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) struct workqueue_struct *dc_charger_wq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) struct delayed_work dc_work;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) struct delayed_work usb_work;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) struct delayed_work host_work;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) struct delayed_work discnt_work;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) struct delayed_work irq_work;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) struct notifier_block bc_nb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) struct notifier_block cable_cg_nb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) struct notifier_block cable_host_nb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) struct notifier_block cable_discnt_nb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) unsigned int bc_event;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) enum charger_t usb_charger;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) enum charger_t dc_charger;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) struct regulator *otg5v_rdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) u8 ac_in;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) u8 usb_in;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) u8 otg_in;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) u8 dc_in;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) u8 prop_status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) u32 max_input_current;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) u32 min_input_voltage;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) u32 max_chrg_current;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) u32 max_chrg_voltage;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) u32 chrg_finish_cur;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) u32 chrg_term_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) u8 res_div;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) u8 otg_slp_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) u8 plugin_trigger;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) u8 plugout_trigger;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) int plugin_irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) int plugout_irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) static enum power_supply_property rk817_ac_props[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) POWER_SUPPLY_PROP_ONLINE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) POWER_SUPPLY_PROP_STATUS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) POWER_SUPPLY_PROP_VOLTAGE_MAX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) POWER_SUPPLY_PROP_CURRENT_MAX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) static enum power_supply_property rk817_usb_props[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) POWER_SUPPLY_PROP_ONLINE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) POWER_SUPPLY_PROP_STATUS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) POWER_SUPPLY_PROP_VOLTAGE_MAX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) POWER_SUPPLY_PROP_CURRENT_MAX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) static int rk817_charge_ac_get_property(struct power_supply *psy,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) enum power_supply_property psp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) union power_supply_propval *val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) struct rk817_charger *charge = power_supply_get_drvdata(psy);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) switch (psp) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) case POWER_SUPPLY_PROP_ONLINE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) if (charge->pdata->virtual_power)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) val->intval = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) val->intval = (charge->ac_in | charge->dc_in);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) DBG("ac report online: %d\n", val->intval);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) case POWER_SUPPLY_PROP_STATUS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) if (charge->pdata->virtual_power)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) val->intval = POWER_SUPPLY_STATUS_CHARGING;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) val->intval = charge->prop_status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) DBG("report prop: %d\n", val->intval);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) case POWER_SUPPLY_PROP_VOLTAGE_MAX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) val->intval = charge->max_chrg_voltage * 1000; /* uV */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) case POWER_SUPPLY_PROP_CURRENT_MAX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) val->intval = charge->max_chrg_current * 1000; /* uA */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) static int rk817_charge_usb_get_property(struct power_supply *psy,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) enum power_supply_property psp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) union power_supply_propval *val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) struct rk817_charger *charge = power_supply_get_drvdata(psy);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) switch (psp) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) case POWER_SUPPLY_PROP_ONLINE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) if (charge->pdata->virtual_power)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) val->intval = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) val->intval = charge->usb_in;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) DBG("usb report online: %d\n", val->intval);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) case POWER_SUPPLY_PROP_STATUS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) if (charge->pdata->virtual_power)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) val->intval = POWER_SUPPLY_STATUS_CHARGING;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) val->intval = charge->prop_status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) DBG("report prop: %d\n", val->intval);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) case POWER_SUPPLY_PROP_VOLTAGE_MAX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) val->intval = charge->max_chrg_voltage;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) case POWER_SUPPLY_PROP_CURRENT_MAX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) val->intval = charge->max_chrg_current;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) static const struct power_supply_desc rk817_ac_desc = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) .name = "ac",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) .type = POWER_SUPPLY_TYPE_MAINS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) .properties = rk817_ac_props,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) .num_properties = ARRAY_SIZE(rk817_ac_props),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) .get_property = rk817_charge_ac_get_property,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) static const struct power_supply_desc rk817_usb_desc = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) .name = "usb",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) .type = POWER_SUPPLY_TYPE_USB,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) .properties = rk817_usb_props,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) .num_properties = ARRAY_SIZE(rk817_usb_props),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) .get_property = rk817_charge_usb_get_property,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) static int rk817_charge_init_power_supply(struct rk817_charger *charge)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) struct power_supply_config psy_cfg = { .drv_data = charge, };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) charge->usb_psy = devm_power_supply_register(charge->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) &rk817_usb_desc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) &psy_cfg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) if (IS_ERR(charge->usb_psy)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) dev_err(charge->dev, "register usb power supply fail\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) return PTR_ERR(charge->usb_psy);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) charge->ac_psy = devm_power_supply_register(charge->dev, &rk817_ac_desc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) &psy_cfg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) if (IS_ERR(charge->ac_psy)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) dev_err(charge->dev, "register ac power supply fail\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) return PTR_ERR(charge->ac_psy);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) static int rk817_charge_field_read(struct rk817_charger *charge,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) enum rk817_charge_fields field_id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) int val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) ret = regmap_field_read(charge->rmap_fields[field_id], &val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) return val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) static int rk817_charge_field_write(struct rk817_charger *charge,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) enum rk817_charge_fields field_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) unsigned int val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) return regmap_field_write(charge->rmap_fields[field_id], val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) static int rk817_charge_get_otg_state(struct rk817_charger *charge)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) return regulator_is_enabled(charge->otg5v_rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) static void rk817_charge_boost_disable(struct rk817_charger *charge)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) rk817_charge_field_write(charge, BOOST_EN, RK817_BOOST_DISABLE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) static void rk817_charge_boost_enable(struct rk817_charger *charge)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) rk817_charge_field_write(charge, BOOST_EN, RK817_BOOST_ENABLE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) static void rk817_charge_otg_disable(struct rk817_charger *charge)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) ret = regulator_disable(charge->otg5v_rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) DBG("disable otg5v failed:%d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) static void rk817_charge_otg_enable(struct rk817_charger *charge)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) ret = regulator_enable(charge->otg5v_rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) DBG("enable otg5v failed:%d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) #ifdef CONFIG_PM_SLEEP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) static int rk817_charge_get_otg_slp_state(struct rk817_charger *charge)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) return (rk817_charge_field_read(charge, OTG_SLP_EN) & OTG_SLP_ENABLE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) static void rk817_charge_otg_slp_disable(struct rk817_charger *charge)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) rk817_charge_field_write(charge, OTG_SLP_EN, OTG_SLP_DISABLE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) static void rk817_charge_otg_slp_enable(struct rk817_charger *charge)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) rk817_charge_field_write(charge, OTG_SLP_EN, OTG_SLP_ENABLE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) static int rk817_charge_get_charge_state(struct rk817_charger *charge)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) return rk817_charge_field_read(charge, CHRG_EN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) static void rk817_charge_enable_charge(struct rk817_charger *charge)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) rk817_charge_field_write(charge, CHRG_EN, ENABLE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) static void rk817_charge_usb_to_sys_enable(struct rk817_charger *charge)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) rk817_charge_field_write(charge, USB_SYS_EN, ENABLE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) static void rk817_charge_sys_can_sd_disable(struct rk817_charger *charge)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) rk817_charge_field_write(charge, SYS_CAN_SD, DISABLE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) static int rk817_charge_get_charge_status(struct rk817_charger *charge)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) int status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) status = rk817_charge_field_read(charge, CHG_STS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) switch (status) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) case CHRG_OFF:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) DBG("charge off...\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) case DEAD_CHRG:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) DBG("dead charge...\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) case TRICKLE_CHRG:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) DBG("trickle charge...\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) case CC_OR_CV_CHRG:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) DBG("CC or CV charge...\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) case CHRG_TERM:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) DBG("charge TERM...\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) case USB_OVER_VOL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) DBG("USB over voltage...\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) case BAT_TMP_ERR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) DBG("battery temperature error...\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) case BAT_TIM_ERR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) DBG("battery timer error..\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) static int rk817_charge_get_plug_in_status(struct rk817_charger *charge)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) return rk817_charge_field_read(charge, PLUG_IN_STS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) static void rk817_charge_set_charge_clock(struct rk817_charger *charge,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) enum charge_clk clock)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) rk817_charge_field_write(charge, CHRG_CLK_SEL, clock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) static int is_battery_exist(struct rk817_charger *charge)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) return rk817_charge_field_read(charge, BAT_EXS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) static void rk817_charge_set_chrg_voltage(struct rk817_charger *charge,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) int chrg_vol)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) int voltage;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) if (chrg_vol < 4100 || chrg_vol > 4500) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) dev_err(charge->dev, "the charge voltage is error!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) voltage = (chrg_vol - 4100) / 50;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) rk817_charge_field_write(charge,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) CHRG_VOL_SEL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) CHRG_VOL_4100MV + voltage);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) static void rk817_charge_set_chrg_current(struct rk817_charger *charge,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) int chrg_current)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) if (chrg_current < 500 || chrg_current > 3500)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) dev_err(charge->dev, "the charge current is error!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) if (chrg_current < 1000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) rk817_charge_field_write(charge, CHRG_CUR_SEL, CHRG_CUR_500MA);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) else if (chrg_current < 1500)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) rk817_charge_field_write(charge, CHRG_CUR_SEL, CHRG_CUR_1000MA);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) else if (chrg_current < 2000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) rk817_charge_field_write(charge, CHRG_CUR_SEL, CHRG_CUR_1500MA);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) else if (chrg_current < 2500)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) rk817_charge_field_write(charge, CHRG_CUR_SEL, CHRG_CUR_2000MA);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) else if (chrg_current < 3000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) rk817_charge_field_write(charge, CHRG_CUR_SEL, CHRG_CUR_2500MA);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) else if (chrg_current < 3500)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) rk817_charge_field_write(charge, CHRG_CUR_SEL, CHRG_CUR_3000MA);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) rk817_charge_field_write(charge, CHRG_CUR_SEL, CHRG_CUR_3500MA);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) static void rk817_charge_vlimit_enable(struct rk817_charger *charge)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) rk817_charge_field_write(charge, USB_VLIM_EN, ENABLE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) static void rk817_charge_set_input_voltage(struct rk817_charger *charge,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) int input_voltage)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) int voltage;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) if (input_voltage < 4000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) dev_err(charge->dev, "the input voltage is error.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) voltage = INPUT_VOL_4000MV + (input_voltage - 4000) / 100;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) rk817_charge_field_write(charge, USB_VLIM_SEL, voltage);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) rk817_charge_vlimit_enable(charge);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) static void rk817_charge_ilimit_enable(struct rk817_charger *charge)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) rk817_charge_field_write(charge, USB_ILIM_EN, ENABLE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) static void rk817_charge_set_input_current(struct rk817_charger *charge,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) int input_current)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) if (input_current < 80 || input_current > 3000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) dev_err(charge->dev, "the input current is error.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) if (input_current < 450)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) rk817_charge_field_write(charge, USB_ILIM_SEL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) INPUT_CUR_80MA);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) else if (input_current < 850)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) rk817_charge_field_write(charge, USB_ILIM_SEL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) INPUT_CUR_450MA);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) else if (input_current < 1500)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) rk817_charge_field_write(charge, USB_ILIM_SEL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) INPUT_CUR_850MA);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) else if (input_current < 1750)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) rk817_charge_field_write(charge, USB_ILIM_SEL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) INPUT_CUR_1500MA);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) else if (input_current < 2000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) rk817_charge_field_write(charge, USB_ILIM_SEL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) INPUT_CUR_1750MA);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) else if (input_current < 2500)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) rk817_charge_field_write(charge, USB_ILIM_SEL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) INPUT_CUR_2000MA);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) else if (input_current < 3000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) rk817_charge_field_write(charge, USB_ILIM_SEL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) INPUT_CUR_2500MA);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) rk817_charge_field_write(charge, USB_ILIM_SEL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) INPUT_CUR_3000MA);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) rk817_charge_ilimit_enable(charge);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) static void rk817_charge_set_chrg_term_mod(struct rk817_charger *charge,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) int mode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) rk817_charge_field_write(charge, CHRG_TERM_ANA_DIG, mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) static void rk817_charge_set_term_current_analog(struct rk817_charger *charge,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) int chrg_current)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) int value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) if (chrg_current < 200)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) value = CHRG_TERM_150MA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) else if (chrg_current < 300)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) value = CHRG_TERM_200MA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) else if (chrg_current < 400)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) value = CHRG_TERM_300MA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) value = CHRG_TERM_400MA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) rk817_charge_field_write(charge,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) CHRG_TERM_ANA_SEL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) static void rk817_charge_set_term_current_digital(struct rk817_charger *charge,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) int chrg_current)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) int value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) u8 current_adc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) value = CURRENT_TO_ADC(chrg_current, charge->res_div);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) value &= (0xff << 5);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) current_adc = value >> 5;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) rk817_charge_field_write(charge, CHRG_TERM_DIG, current_adc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) static void rk817_charge_set_chrg_finish_condition(struct rk817_charger *charge)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) if (charge->chrg_term_mode == CHRG_ANALOG)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) rk817_charge_set_term_current_analog(charge,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) charge->chrg_finish_cur);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) rk817_charge_set_term_current_digital(charge,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) charge->chrg_finish_cur);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) rk817_charge_set_chrg_term_mod(charge, charge->chrg_term_mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) static int rk817_charge_online(struct rk817_charger *charge)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) return (charge->ac_in | charge->usb_in | charge->dc_in);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) static int rk817_charge_get_dsoc(struct rk817_charger *charge)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) int soc_save;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) soc_save = rk817_charge_field_read(charge, SOC_REG0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) soc_save |= (rk817_charge_field_read(charge, SOC_REG1) << 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) soc_save |= (rk817_charge_field_read(charge, SOC_REG2) << 16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) return soc_save / 1000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) static void rk817_charge_set_otg_in(struct rk817_charger *charge, int online)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) charge->otg_in = online;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) static void rk817_charge_set_chrg_param(struct rk817_charger *charge,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) enum charger_t charger)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) switch (charger) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) case USB_TYPE_NONE_CHARGER:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) charge->usb_in = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) charge->ac_in = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) if (charge->dc_in == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) charge->prop_status = POWER_SUPPLY_STATUS_DISCHARGING;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) rk817_charge_set_input_current(charge, INPUT_450MA);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) power_supply_changed(charge->usb_psy);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) power_supply_changed(charge->ac_psy);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) case USB_TYPE_USB_CHARGER:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801) charge->usb_in = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) charge->ac_in = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) charge->prop_status = POWER_SUPPLY_STATUS_CHARGING;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) if (charge->dc_in == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) rk817_charge_set_input_current(charge, INPUT_450MA);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) power_supply_changed(charge->usb_psy);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) power_supply_changed(charge->ac_psy);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) case USB_TYPE_AC_CHARGER:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810) case USB_TYPE_CDP_CHARGER:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) charge->ac_in = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) charge->usb_in = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) charge->prop_status = POWER_SUPPLY_STATUS_CHARGING;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) if (charger == USB_TYPE_AC_CHARGER)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815) rk817_charge_set_input_current(charge,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) charge->max_input_current);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) rk817_charge_set_input_current(charge,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819) INPUT_1500MA);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) power_supply_changed(charge->usb_psy);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821) power_supply_changed(charge->ac_psy);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) case DC_TYPE_DC_CHARGER:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) charge->dc_in = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) charge->prop_status = POWER_SUPPLY_STATUS_CHARGING;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) rk817_charge_set_input_current(charge,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) charge->max_input_current);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828) power_supply_changed(charge->usb_psy);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) power_supply_changed(charge->ac_psy);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) case DC_TYPE_NONE_CHARGER:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) charge->dc_in = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833) if (!rk817_charge_get_plug_in_status(charge)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) charge->ac_in = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835) charge->usb_in = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) charge->prop_status = POWER_SUPPLY_STATUS_DISCHARGING;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) rk817_charge_set_input_current(charge, INPUT_450MA);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838) } else if (charge->usb_in) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) rk817_charge_set_input_current(charge, INPUT_450MA);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) charge->prop_status = POWER_SUPPLY_STATUS_CHARGING;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) power_supply_changed(charge->usb_psy);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) power_supply_changed(charge->ac_psy);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846) charge->prop_status = POWER_SUPPLY_STATUS_DISCHARGING;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) rk817_charge_set_input_current(charge, INPUT_450MA);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) if (rk817_charge_online(charge) && rk817_charge_get_dsoc(charge) == 100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) charge->prop_status = POWER_SUPPLY_STATUS_FULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855) static void rk817_charge_set_otg_state(struct rk817_charger *charge, int state)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) switch (state) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858) case USB_OTG_POWER_ON:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859) if (charge->otg_in) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) DBG("otg5v is on yet, ignore..\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863) if (!rk817_charge_get_otg_state(charge)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864) rk817_charge_otg_enable(charge);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865) if (!rk817_charge_get_otg_state(charge)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) DBG("enable otg5v failed\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870) disable_irq(charge->plugin_irq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871) disable_irq(charge->plugout_irq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872) DBG("enable otg5v\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) case USB_OTG_POWER_OFF:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877) if (!charge->otg_in) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878) DBG("otg5v is off yet, ignore..\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881) if (rk817_charge_get_otg_state(charge)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882) rk817_charge_otg_disable(charge);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) if (rk817_charge_get_otg_state(charge)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884) DBG("disable otg5v failed\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888) enable_irq(charge->plugin_irq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889) enable_irq(charge->plugout_irq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890) DBG("disable otg5v\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894) dev_err(charge->dev, "error otg type\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899) static irqreturn_t rk817_charge_dc_det_isr(int irq, void *charger)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901) struct rk817_charger *charge = (struct rk817_charger *)charger;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903) if (gpio_get_value(charge->pdata->dc_det_pin))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) irq_set_irq_type(irq, IRQF_TRIGGER_LOW);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906) irq_set_irq_type(irq, IRQF_TRIGGER_HIGH);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908) queue_delayed_work(charge->dc_charger_wq, &charge->dc_work,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909) msecs_to_jiffies(10));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911) return IRQ_HANDLED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914) static enum charger_t rk817_charge_get_dc_state(struct rk817_charger *charge)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916) int level;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918) if (!gpio_is_valid(charge->pdata->dc_det_pin))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919) return DC_TYPE_NONE_CHARGER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921) level = gpio_get_value(charge->pdata->dc_det_pin);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923) return (level == charge->pdata->dc_det_level) ?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924) DC_TYPE_DC_CHARGER : DC_TYPE_NONE_CHARGER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927) static void rk817_charge_dc_det_worker(struct work_struct *work)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929) enum charger_t charger;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930) struct rk817_charger *charge = container_of(work,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931) struct rk817_charger, dc_work.work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933) charger = rk817_charge_get_dc_state(charge);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934) if (charger == DC_TYPE_DC_CHARGER) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935) DBG("detect dc charger in..\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936) rk817_charge_set_chrg_param(charge, DC_TYPE_DC_CHARGER);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 937) /* check otg supply */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 938) if (charge->otg_in && charge->pdata->power_dc2otg) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 939) DBG("otg power from dc adapter\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940) rk817_charge_set_otg_state(charge, USB_OTG_POWER_OFF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943) rk817_charge_boost_disable(charge);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945) DBG("detect dc charger out..\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946) rk817_charge_set_chrg_param(charge, DC_TYPE_NONE_CHARGER);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 947) rk817_charge_boost_enable(charge);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 948) /* check otg supply, power on anyway */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 949) if (charge->otg_in)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 950) rk817_charge_set_otg_state(charge, USB_OTG_POWER_ON);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 951) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 952) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 953)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 954) static int rk817_charge_init_dc(struct rk817_charger *charge)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 955) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 956) int ret, level;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 957) unsigned long irq_flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 958) unsigned int dc_det_irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 959)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 960) charge->dc_charger_wq = alloc_ordered_workqueue("%s",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 961) WQ_MEM_RECLAIM | WQ_FREEZABLE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 962) "rk817-dc-wq");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 963) INIT_DELAYED_WORK(&charge->dc_work, rk817_charge_dc_det_worker);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 964) charge->dc_charger = DC_TYPE_NONE_CHARGER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 965)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 966) if (!charge->pdata->support_dc_det)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 967) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 968)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 969) ret = devm_gpio_request(charge->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 970) charge->pdata->dc_det_pin,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 971) "rk817_dc_det");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 972) if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 973) dev_err(charge->dev, "failed to request gpio %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 974) charge->pdata->dc_det_pin);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 975) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 976) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 977)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 978) ret = gpio_direction_input(charge->pdata->dc_det_pin);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 979) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 980) dev_err(charge->dev, "failed to set gpio input\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 981) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 982) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 983)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 984) level = gpio_get_value(charge->pdata->dc_det_pin);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 985) if (level == charge->pdata->dc_det_level)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 986) charge->dc_charger = DC_TYPE_DC_CHARGER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 987) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 988) charge->dc_charger = DC_TYPE_NONE_CHARGER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 989)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 990) if (level)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 991) irq_flags = IRQF_TRIGGER_LOW;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 992) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 993) irq_flags = IRQF_TRIGGER_HIGH;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 994)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 995) dc_det_irq = gpio_to_irq(charge->pdata->dc_det_pin);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 996) ret = devm_request_irq(charge->dev, dc_det_irq, rk817_charge_dc_det_isr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 997) irq_flags, "rk817_dc_det", charge);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 998) if (ret != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 999) dev_err(charge->dev, "rk817_dc_det_irq request failed!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) enable_irq_wake(dc_det_irq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) if (charge->dc_charger != DC_TYPE_NONE_CHARGER)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) rk817_charge_set_chrg_param(charge, charge->dc_charger);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) static void rk817_charge_host_evt_worker(struct work_struct *work)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) struct rk817_charger *charge = container_of(work,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) struct rk817_charger, host_work.work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) struct extcon_dev *edev = charge->cable_edev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) /* Determine cable/charger type */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) if (extcon_get_state(edev, EXTCON_USB_VBUS_EN) > 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) DBG("receive type-c notifier event: OTG ON...\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) if (charge->dc_in && charge->pdata->power_dc2otg) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) if (charge->otg_in)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) rk817_charge_set_otg_state(charge,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) USB_OTG_POWER_OFF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) DBG("otg power from dc adapter\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026) rk817_charge_set_otg_state(charge, USB_OTG_POWER_ON);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) rk817_charge_set_otg_in(charge, ONLINE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) } else if (extcon_get_state(edev, EXTCON_USB_VBUS_EN) == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) DBG("receive type-c notifier event: OTG OFF...\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) rk817_charge_set_otg_state(charge, USB_OTG_POWER_OFF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) rk817_charge_set_otg_in(charge, OFFLINE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) static void rk817_charger_evt_worker(struct work_struct *work)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) struct rk817_charger *charge = container_of(work,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) struct rk817_charger, usb_work.work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) struct extcon_dev *edev = charge->cable_edev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) enum charger_t charger = USB_TYPE_UNKNOWN_CHARGER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042) static const char * const event[] = {"UN", "NONE", "USB",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) "AC", "CDP1.5A"};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) /* Determine cable/charger type */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046) if (extcon_get_state(edev, EXTCON_CHG_USB_SDP) > 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) charger = USB_TYPE_USB_CHARGER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) else if (extcon_get_state(edev, EXTCON_CHG_USB_DCP) > 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) charger = USB_TYPE_AC_CHARGER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) else if (extcon_get_state(edev, EXTCON_CHG_USB_CDP) > 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051) charger = USB_TYPE_CDP_CHARGER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053) if (charger != USB_TYPE_UNKNOWN_CHARGER) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) DBG("receive type-c notifier event: %s...\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) event[charger]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) charge->usb_charger = charger;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057) rk817_charge_set_chrg_param(charge, charger);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) static void rk817_charge_discnt_evt_worker(struct work_struct *work)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) struct rk817_charger *charge = container_of(work,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) struct rk817_charger, discnt_work.work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066) if (extcon_get_state(charge->cable_edev, EXTCON_USB) == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) DBG("receive type-c notifier event: DISCNT...\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) rk817_charge_set_chrg_param(charge, USB_TYPE_NONE_CHARGER);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) static void rk817_charge_bc_evt_worker(struct work_struct *work)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) struct rk817_charger *charge = container_of(work,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) struct rk817_charger,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077) usb_work.work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) static const char * const event_name[] = {"DISCNT", "USB", "AC",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) "CDP1.5A", "UNKNOWN",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) "OTG ON", "OTG OFF"};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) switch (charge->bc_event) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) case USB_BC_TYPE_DISCNT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) rk817_charge_set_chrg_param(charge, USB_TYPE_NONE_CHARGER);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) case USB_BC_TYPE_SDP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087) rk817_charge_set_chrg_param(charge, USB_TYPE_USB_CHARGER);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089) case USB_BC_TYPE_DCP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090) rk817_charge_set_chrg_param(charge, USB_TYPE_AC_CHARGER);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) case USB_BC_TYPE_CDP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) rk817_charge_set_chrg_param(charge, USB_TYPE_CDP_CHARGER);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) case USB_OTG_POWER_ON:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096) if (charge->pdata->power_dc2otg && charge->dc_in)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097) DBG("otg power from dc adapter\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099) rk817_charge_set_otg_state(charge, USB_OTG_POWER_ON);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) case USB_OTG_POWER_OFF:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102) rk817_charge_set_otg_state(charge, USB_OTG_POWER_OFF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) DBG("receive bc notifier event: %s..\n", event_name[charge->bc_event]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111) static int rk817_charger_evt_notifier(struct notifier_block *nb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) unsigned long event, void *ptr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114) struct rk817_charger *charge =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115) container_of(nb, struct rk817_charger, cable_cg_nb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117) queue_delayed_work(charge->usb_charger_wq, &charge->usb_work,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118) msecs_to_jiffies(10));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) return NOTIFY_DONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123) static int rk817_charge_host_evt_notifier(struct notifier_block *nb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124) unsigned long event, void *ptr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126) struct rk817_charger *charge =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127) container_of(nb, struct rk817_charger, cable_host_nb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) queue_delayed_work(charge->usb_charger_wq, &charge->host_work,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130) msecs_to_jiffies(10));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) return NOTIFY_DONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135) static int rk817_charge_discnt_evt_notfier(struct notifier_block *nb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136) unsigned long event, void *ptr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138) struct rk817_charger *charge =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139) container_of(nb, struct rk817_charger, cable_discnt_nb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) queue_delayed_work(charge->usb_charger_wq, &charge->discnt_work,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142) msecs_to_jiffies(10));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144) return NOTIFY_DONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147) static int rk817_charge_bc_evt_notifier(struct notifier_block *nb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148) unsigned long event, void *ptr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150) struct rk817_charger *charge =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151) container_of(nb, struct rk817_charger, bc_nb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153) charge->bc_event = event;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154) queue_delayed_work(charge->usb_charger_wq, &charge->usb_work,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155) msecs_to_jiffies(10));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157) return NOTIFY_DONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160) static int rk817_charge_usb_init(struct rk817_charger *charge)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162) enum charger_t charger;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163) enum bc_port_type bc_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164) struct extcon_dev *edev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165) struct device *dev = charge->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168) charge->usb_charger_wq = alloc_ordered_workqueue("%s",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169) WQ_MEM_RECLAIM | WQ_FREEZABLE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170) "rk817-usb-wq");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172) /* type-C */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173) if (charge->pdata->extcon) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174) edev = extcon_get_edev_by_phandle(dev, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175) if (IS_ERR(edev)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176) if (PTR_ERR(edev) != -EPROBE_DEFER)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177) dev_err(dev, "Invalid or missing extcon\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178) return PTR_ERR(edev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181) /* Register chargers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182) INIT_DELAYED_WORK(&charge->usb_work, rk817_charger_evt_worker);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183) charge->cable_cg_nb.notifier_call = rk817_charger_evt_notifier;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184) ret = extcon_register_notifier(edev, EXTCON_CHG_USB_SDP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185) &charge->cable_cg_nb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186) if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187) dev_err(dev, "failed to register notifier for SDP\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191) ret = extcon_register_notifier(edev, EXTCON_CHG_USB_DCP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192) &charge->cable_cg_nb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193) if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194) dev_err(dev, "failed to register notifier for DCP\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195) extcon_unregister_notifier(edev, EXTCON_CHG_USB_SDP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196) &charge->cable_cg_nb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200) ret = extcon_register_notifier(edev, EXTCON_CHG_USB_CDP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201) &charge->cable_cg_nb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202) if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203) dev_err(dev, "failed to register notifier for CDP\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204) extcon_unregister_notifier(edev, EXTCON_CHG_USB_SDP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205) &charge->cable_cg_nb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206) extcon_unregister_notifier(edev, EXTCON_CHG_USB_DCP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207) &charge->cable_cg_nb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211) /* Register host */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212) INIT_DELAYED_WORK(&charge->host_work,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213) rk817_charge_host_evt_worker);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214) charge->cable_host_nb.notifier_call =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215) rk817_charge_host_evt_notifier;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216) ret = extcon_register_notifier(edev, EXTCON_USB_VBUS_EN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217) &charge->cable_host_nb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218) if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219) dev_err(dev, "failed to register notifier for HOST\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220) extcon_unregister_notifier(edev, EXTCON_CHG_USB_SDP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221) &charge->cable_cg_nb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222) extcon_unregister_notifier(edev, EXTCON_CHG_USB_DCP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223) &charge->cable_cg_nb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224) extcon_unregister_notifier(edev, EXTCON_CHG_USB_CDP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225) &charge->cable_cg_nb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230) /* Register discnt usb */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231) INIT_DELAYED_WORK(&charge->discnt_work,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232) rk817_charge_discnt_evt_worker);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233) charge->cable_discnt_nb.notifier_call =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234) rk817_charge_discnt_evt_notfier;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235) ret = extcon_register_notifier(edev, EXTCON_USB,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236) &charge->cable_discnt_nb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237) if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238) dev_err(dev, "failed to register notifier for HOST\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239) extcon_unregister_notifier(edev, EXTCON_CHG_USB_SDP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240) &charge->cable_cg_nb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241) extcon_unregister_notifier(edev, EXTCON_CHG_USB_DCP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242) &charge->cable_cg_nb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243) extcon_unregister_notifier(edev, EXTCON_CHG_USB_CDP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244) &charge->cable_cg_nb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245) extcon_unregister_notifier(edev, EXTCON_USB_VBUS_EN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246) &charge->cable_host_nb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250) charge->cable_edev = edev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252) DBG("register typec extcon evt notifier\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254) INIT_DELAYED_WORK(&charge->usb_work,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255) rk817_charge_bc_evt_worker);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256) charge->bc_nb.notifier_call = rk817_charge_bc_evt_notifier;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257) ret = rk_bc_detect_notifier_register(&charge->bc_nb, &bc_type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259) dev_err(dev, "failed to register notifier for bc\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263) switch (bc_type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264) case USB_BC_TYPE_DISCNT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265) charger = USB_TYPE_NONE_CHARGER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267) case USB_BC_TYPE_SDP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268) case USB_BC_TYPE_CDP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269) charger = USB_TYPE_USB_CHARGER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271) case USB_BC_TYPE_DCP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272) charger = USB_TYPE_AC_CHARGER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275) charger = USB_TYPE_NONE_CHARGER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1277) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1278)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1279) charge->usb_charger = charger;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280) if (charge->dc_charger != DC_TYPE_NONE_CHARGER)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281) rk817_charge_set_chrg_param(charge,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282) charge->usb_charger);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284) DBG("register bc evt notifier\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1285) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1286)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1287) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1288) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1289)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1290) static void rk817_charge_pre_init(struct rk817_charger *charge)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1291) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1292) charge->max_chrg_current = charge->pdata->max_chrg_current;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1293) charge->max_input_current = charge->pdata->max_input_current;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1294) charge->max_chrg_voltage = charge->pdata->max_chrg_voltage;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1295) charge->min_input_voltage = charge->pdata->min_input_voltage;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1296) charge->chrg_finish_cur = charge->pdata->chrg_finish_cur;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1297) charge->chrg_term_mode = charge->pdata->chrg_term_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1298)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1299) rk817_charge_set_input_voltage(charge, charge->min_input_voltage);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1300)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1301) rk817_charge_set_chrg_voltage(charge, charge->max_chrg_voltage);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1302) rk817_charge_set_chrg_current(charge, charge->max_chrg_current);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1303)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1304) rk817_charge_set_chrg_finish_condition(charge);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1305)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1306) if (rk817_charge_get_otg_state(charge))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1307) rk817_charge_otg_disable(charge);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1308) rk817_charge_field_write(charge, OTG_EN, OTG_DISABLE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1309) rk817_charge_set_otg_in(charge, OFFLINE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1310)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1311) if (!charge->pdata->gate_function_disable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1312) rk817_charge_sys_can_sd_disable(charge);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1313) rk817_charge_usb_to_sys_enable(charge);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1314) rk817_charge_enable_charge(charge);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1315)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1316) rk817_charge_set_charge_clock(charge, CHRG_CLK_2M);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1317) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1318)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1319) static void rk817_chage_debug(struct rk817_charger *charge)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1320) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1321) rk817_charge_get_charge_status(charge);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1322) DBG("OTG state : %d\n", rk817_charge_get_otg_state(charge));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1323) DBG("charge state: %d\n", rk817_charge_get_charge_state(charge));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1324) DBG("max_chrg_current: %d\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1325) "max_input_current: %d\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1326) "min_input_voltage: %d\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1327) "max_chrg_voltage: %d\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1328) "max_chrg_finish_cur: %d\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1329) "chrg_term_mode: %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1330) charge->max_chrg_current,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1331) charge->max_input_current,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1332) charge->min_input_voltage,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1333) charge->max_chrg_voltage,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1334) charge->chrg_finish_cur,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1335) charge->chrg_term_mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1336) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1337)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1338) static int rk817_charge_get_otg5v_regulator(struct rk817_charger *charge)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1339) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1340) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1341)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1342) charge->otg5v_rdev = devm_regulator_get(charge->dev, "otg_switch");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1343) if (IS_ERR(charge->otg5v_rdev)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1344) ret = PTR_ERR(charge->otg5v_rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1345) dev_warn(charge->dev, "failed to get otg regulator: %d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1346) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1347)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1348) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1349) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1350)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1351) #ifdef CONFIG_OF
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1352) static int rk817_charge_parse_dt(struct rk817_charger *charge)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1353) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1354) struct charger_platform_data *pdata;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1355) enum of_gpio_flags flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1356) struct device *dev = charge->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1357) struct device_node *np = charge->dev->of_node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1358) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1359)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1360) pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1361) if (!pdata)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1362) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1363)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1364) charge->pdata = pdata;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1365) pdata->max_chrg_current = DEFAULT_CHRG_CURRENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1366) pdata->max_input_current = DEFAULT_INPUT_CURRENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1367) pdata->max_chrg_voltage = DEFAULT_CHRG_VOLTAGE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1368) pdata->min_input_voltage = DEFAULT_INPUT_VOLTAGE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1369) pdata->chrg_finish_cur = DEFAULT_CHRG_TERM_CUR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1370) pdata->chrg_term_mode = DEFAULT_CHRG_TERM_MODE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1371)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1372) pdata->extcon = of_property_read_bool(np, "extcon");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1373)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1374) ret = of_property_read_u32(np, "max_chrg_current",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1375) &pdata->max_chrg_current);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1376) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1377) dev_err(dev, "max_chrg_current missing!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1378)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1379) ret = of_property_read_u32(np, "max_input_current",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1380) &pdata->max_input_current);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1381) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1382) dev_err(dev, "max_input_current missing!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1383)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1384) ret = of_property_read_u32(np, "max_chrg_voltage",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1385) &pdata->max_chrg_voltage);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1386) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1387) dev_err(dev, "max_chrg_voltage missing!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1388)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1389) ret = of_property_read_u32(np, "min_input_voltage",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1390) &pdata->min_input_voltage);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1391) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1392) dev_WARN(dev, "min_input_voltage missing!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1393)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1394) ret = of_property_read_u32(np, "chrg_finish_cur",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1395) &pdata->chrg_finish_cur);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1396)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1397) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1398) dev_WARN(dev, "chrg_term_mode missing!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1399)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1400) ret = of_property_read_u32(np, "chrg_term_mode",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1401) &pdata->chrg_term_mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1402) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1403) dev_WARN(dev, "chrg_term_mode missing!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1404)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1405) ret = of_property_read_u32(np, "virtual_power", &pdata->virtual_power);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1406) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1407) dev_err(dev, "virtual_power missing!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1408)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1409) ret = of_property_read_u32(np, "power_dc2otg", &pdata->power_dc2otg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1410) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1411) dev_err(dev, "power_dc2otg missing!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1412)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1413) ret = of_property_read_u32(np, "sample_res", &pdata->sample_res);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1414) if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1415) pdata->sample_res = SAMPLE_RES_10MR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1416) dev_err(dev, "sample_res missing!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1417) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1418)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1419) ret = of_property_read_u32(np, "otg5v_suspend_enable",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1420) &pdata->otg5v_suspend_enable);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1421) if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1422) pdata->otg5v_suspend_enable = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1423) dev_err(dev, "otg5v_suspend_enable missing!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1424) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1425)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1426) ret = of_property_read_u32(np, "gate_function_disable",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1427) &pdata->gate_function_disable);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1428) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1429) dev_err(dev, "gate_function_disable missing!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1430)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1431) if (!is_battery_exist(charge))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1432) pdata->virtual_power = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1433)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1434) charge->res_div = (charge->pdata->sample_res == SAMPLE_RES_10MR) ?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1435) SAMPLE_RES_DIV1 : SAMPLE_RES_DIV2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1436)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1437) if (!of_find_property(np, "dc_det_gpio", &ret)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1438) pdata->support_dc_det = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1439) DBG("not support dc\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1440) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1441) pdata->support_dc_det = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1442) pdata->dc_det_pin = of_get_named_gpio_flags(np, "dc_det_gpio",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1443) 0, &flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1444) if (gpio_is_valid(pdata->dc_det_pin)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1445) DBG("support dc\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1446) pdata->dc_det_level = (flags & OF_GPIO_ACTIVE_LOW) ?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1447) 0 : 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1448) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1449) dev_err(dev, "invalid dc det gpio!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1450) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1451) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1452) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1453)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1454) DBG("input_current:%d\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1455) "input_min_voltage: %d\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1456) "chrg_current:%d\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1457) "chrg_voltage:%d\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1458) "sample_res:%d\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1459) "extcon:%d\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1460) "virtual_power:%d\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1461) "power_dc2otg:%d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1462) pdata->max_input_current, pdata->min_input_voltage,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1463) pdata->max_chrg_current, pdata->max_chrg_voltage,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1464) pdata->sample_res, pdata->extcon,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1465) pdata->virtual_power, pdata->power_dc2otg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1466)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1467) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1468) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1469) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1470) static int rk817_charge_parse_dt(struct rk817_charger *charge)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1471) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1472) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1473) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1474) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1475)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1476) static void rk817_charge_irq_delay_work(struct work_struct *work)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1477) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1478) struct rk817_charger *charge = container_of(work,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1479) struct rk817_charger, irq_work.work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1480)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1481) if (charge->plugin_trigger) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1482) DBG("pmic: plug in\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1483) charge->plugin_trigger = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1484) if (charge->pdata->extcon)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1485) queue_delayed_work(charge->usb_charger_wq, &charge->usb_work,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1486) msecs_to_jiffies(10));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1487) } else if (charge->plugout_trigger) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1488) DBG("pmic: plug out\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1489) charge->plugout_trigger = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1490) rk817_charge_set_chrg_param(charge, USB_TYPE_NONE_CHARGER);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1491) rk817_charge_set_chrg_param(charge, DC_TYPE_NONE_CHARGER);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1492) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1493) DBG("pmic: unknown irq\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1494) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1495) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1496)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1497) static irqreturn_t rk817_plug_in_isr(int irq, void *cg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1498) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1499) struct rk817_charger *charge;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1500)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1501) charge = (struct rk817_charger *)cg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1502) charge->plugin_trigger = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1503) queue_delayed_work(charge->usb_charger_wq, &charge->irq_work,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1504) msecs_to_jiffies(10));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1505)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1506) return IRQ_HANDLED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1507) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1508)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1509) static irqreturn_t rk817_plug_out_isr(int irq, void *cg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1510) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1511) struct rk817_charger *charge;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1512)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1513) charge = (struct rk817_charger *)cg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1514) charge->plugout_trigger = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1515) queue_delayed_work(charge->usb_charger_wq, &charge->irq_work,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1516) msecs_to_jiffies(10));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1517)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1518) return IRQ_HANDLED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1519) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1520)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1521) static int rk817_charge_init_irqs(struct rk817_charger *charge)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1522) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1523) struct rk808 *rk817 = charge->rk817;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1524) struct platform_device *pdev = charge->pdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1525) int ret, plug_in_irq, plug_out_irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1526)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1527) plug_in_irq = regmap_irq_get_virq(rk817->irq_data, RK817_IRQ_PLUG_IN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1528) if (plug_in_irq < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1529) dev_err(charge->dev, "plug_in_irq request failed!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1530) return plug_in_irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1531) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1532)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1533) plug_out_irq = regmap_irq_get_virq(rk817->irq_data, RK817_IRQ_PLUG_OUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1534) if (plug_out_irq < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1535) dev_err(charge->dev, "plug_out_irq request failed!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1536) return plug_out_irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1537) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1538)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1539) ret = devm_request_threaded_irq(charge->dev, plug_in_irq, NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1540) rk817_plug_in_isr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1541) IRQF_TRIGGER_RISING | IRQF_ONESHOT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1542) "rk817_plug_in", charge);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1543) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1544) dev_err(&pdev->dev, "plug_in_irq request failed!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1545) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1546) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1547)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1548) ret = devm_request_threaded_irq(charge->dev, plug_out_irq, NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1549) rk817_plug_out_isr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1550) IRQF_TRIGGER_RISING | IRQF_ONESHOT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1551) "rk817_plug_out", charge);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1552) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1553) dev_err(&pdev->dev, "plug_out_irq request failed!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1554) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1555) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1556)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1557) charge->plugin_irq = plug_in_irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1558) charge->plugout_irq = plug_out_irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1559)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1560) INIT_DELAYED_WORK(&charge->irq_work, rk817_charge_irq_delay_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1561)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1562) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1563) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1564)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1565) static const struct of_device_id rk817_charge_of_match[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1566) { .compatible = "rk817,charger", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1567) { },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1568) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1569)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1570) static int rk817_charge_probe(struct platform_device *pdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1571) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1572) struct rk808 *rk817 = dev_get_drvdata(pdev->dev.parent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1573) const struct of_device_id *of_id =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1574) of_match_device(rk817_charge_of_match, &pdev->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1575) struct i2c_client *client = rk817->i2c;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1576) struct rk817_charger *charge;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1577) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1578) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1579)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1580) if (!of_id) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1581) dev_err(&pdev->dev, "Failed to find matching dt id\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1582) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1583) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1584)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1585) charge = devm_kzalloc(&pdev->dev, sizeof(*charge), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1586) if (!charge)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1587) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1588)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1589) charge->rk817 = rk817;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1590) charge->pdev = pdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1591) charge->dev = &pdev->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1592) charge->client = client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1593) platform_set_drvdata(pdev, charge);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1594)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1595) charge->regmap = rk817->regmap;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1596) if (IS_ERR(charge->regmap)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1597) dev_err(charge->dev, "Failed to initialize regmap\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1598) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1599) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1600)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1601) for (i = 0; i < ARRAY_SIZE(rk817_charge_reg_fields); i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1602) const struct reg_field *reg_fields = rk817_charge_reg_fields;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1603)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1604) charge->rmap_fields[i] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1605) devm_regmap_field_alloc(charge->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1606) charge->regmap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1607) reg_fields[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1608) if (IS_ERR(charge->rmap_fields[i])) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1609) dev_err(charge->dev, "cannot allocate regmap field\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1610) return PTR_ERR(charge->rmap_fields[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1611) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1612) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1613)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1614) ret = rk817_charge_parse_dt(charge);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1615) if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1616) dev_err(charge->dev, "charge parse dt failed!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1617) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1618) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1619) rk817_charge_get_otg5v_regulator(charge);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1620)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1621) rk817_charge_pre_init(charge);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1622)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1623) ret = rk817_charge_init_power_supply(charge);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1624) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1625) dev_err(charge->dev, "init power supply fail!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1626) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1627) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1628)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1629) ret = rk817_charge_init_dc(charge);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1630) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1631) dev_err(charge->dev, "init dc failed!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1632) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1633) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1634)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1635) ret = rk817_charge_usb_init(charge);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1636) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1637) dev_err(charge->dev, "init usb failed!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1638) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1639) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1640)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1641) ret = rk817_charge_init_irqs(charge);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1642) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1643) dev_err(charge->dev, "init irqs failed!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1644) goto irq_fail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1645) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1646)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1647) if (charge->pdata->extcon) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1648) schedule_delayed_work(&charge->host_work, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1649) schedule_delayed_work(&charge->usb_work, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1650) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1651)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1652) rk817_chage_debug(charge);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1653) DBG("driver version: %s\n", CHARGE_DRIVER_VERSION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1654)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1655) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1656) irq_fail:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1657) if (charge->pdata->extcon) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1658) cancel_delayed_work_sync(&charge->host_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1659) cancel_delayed_work_sync(&charge->discnt_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1660) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1661)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1662) cancel_delayed_work_sync(&charge->usb_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1663) cancel_delayed_work_sync(&charge->dc_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1664) cancel_delayed_work_sync(&charge->irq_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1665) destroy_workqueue(charge->usb_charger_wq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1666) destroy_workqueue(charge->dc_charger_wq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1667)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1668) if (charge->pdata->extcon) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1669) extcon_unregister_notifier(charge->cable_edev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1670) EXTCON_CHG_USB_SDP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1671) &charge->cable_cg_nb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1672) extcon_unregister_notifier(charge->cable_edev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1673) EXTCON_CHG_USB_DCP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1674) &charge->cable_cg_nb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1675) extcon_unregister_notifier(charge->cable_edev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1676) EXTCON_CHG_USB_CDP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1677) &charge->cable_cg_nb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1678) extcon_unregister_notifier(charge->cable_edev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1679) EXTCON_USB_VBUS_EN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1680) &charge->cable_host_nb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1681) extcon_unregister_notifier(charge->cable_edev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1682) EXTCON_USB,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1683) &charge->cable_discnt_nb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1684) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1685) rk_bc_detect_notifier_unregister(&charge->bc_nb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1686) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1687)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1688) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1689) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1690)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1691) #ifdef CONFIG_PM_SLEEP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1692) static int rk817_charge_pm_suspend(struct device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1693) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1694) struct platform_device *pdev = to_platform_device(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1695) struct rk817_charger *charge = dev_get_drvdata(&pdev->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1696)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1697) charge->otg_slp_state = rk817_charge_get_otg_slp_state(charge);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1698)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1699) /* enable sleep boost5v and otg5v */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1700) if (charge->pdata->otg5v_suspend_enable) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1701) if ((charge->otg_in && !charge->dc_in) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1702) (charge->otg_in && charge->dc_in &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1703) !charge->pdata->power_dc2otg)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1704) rk817_charge_otg_slp_enable(charge);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1705) DBG("suspend: otg 5v on\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1706) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1707) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1708) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1709)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1710) /* disable sleep otg5v */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1711) rk817_charge_otg_slp_disable(charge);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1712) DBG("suspend: otg 5v off\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1713) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1714) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1715)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1716) static int rk817_charge_pm_resume(struct device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1717) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1718) struct platform_device *pdev = to_platform_device(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1719) struct rk817_charger *charge = dev_get_drvdata(&pdev->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1720)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1721) /* resume sleep boost5v and otg5v */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1722) if (charge->otg_slp_state)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1723) rk817_charge_otg_slp_enable(charge);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1724)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1725) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1726) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1727) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1728) static SIMPLE_DEV_PM_OPS(rk817_charge_pm_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1729) rk817_charge_pm_suspend, rk817_charge_pm_resume);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1730)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1731) static void rk817_charger_shutdown(struct platform_device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1732) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1733) struct rk817_charger *charge = platform_get_drvdata(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1734)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1735) /* type-c only */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1736) if (charge->pdata->extcon) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1737) cancel_delayed_work_sync(&charge->host_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1738) cancel_delayed_work_sync(&charge->discnt_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1739) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1740)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1741) rk817_charge_set_otg_state(charge, USB_OTG_POWER_OFF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1742) rk817_charge_boost_disable(charge);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1743) disable_irq(charge->plugin_irq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1744) disable_irq(charge->plugout_irq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1745)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1746) cancel_delayed_work_sync(&charge->usb_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1747) cancel_delayed_work_sync(&charge->dc_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1748) cancel_delayed_work_sync(&charge->irq_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1749) flush_workqueue(charge->usb_charger_wq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1750) flush_workqueue(charge->dc_charger_wq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1751)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1752) if (charge->pdata->extcon) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1753) extcon_unregister_notifier(charge->cable_edev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1754) EXTCON_CHG_USB_SDP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1755) &charge->cable_cg_nb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1756) extcon_unregister_notifier(charge->cable_edev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1757) EXTCON_CHG_USB_DCP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1758) &charge->cable_cg_nb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1759) extcon_unregister_notifier(charge->cable_edev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1760) EXTCON_CHG_USB_CDP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1761) &charge->cable_cg_nb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1762) extcon_unregister_notifier(charge->cable_edev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1763) EXTCON_USB_VBUS_EN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1764) &charge->cable_host_nb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1765) extcon_unregister_notifier(charge->cable_edev, EXTCON_USB,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1766) &charge->cable_discnt_nb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1767) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1768) rk_bc_detect_notifier_unregister(&charge->bc_nb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1769) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1770)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1771) DBG("shutdown: ac=%d usb=%d dc=%d otg=%d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1772) charge->ac_in, charge->usb_in, charge->dc_in, charge->otg_in);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1773) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1774)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1775) static struct platform_driver rk817_charge_driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1776) .probe = rk817_charge_probe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1777) .shutdown = rk817_charger_shutdown,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1778) .driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1779) .name = "rk817-charger",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1780) .pm = &rk817_charge_pm_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1781) .of_match_table = of_match_ptr(rk817_charge_of_match),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1782) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1783) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1784)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1785) static int __init rk817_charge_init(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1786) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1787) return platform_driver_register(&rk817_charge_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1788) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1789) fs_initcall_sync(rk817_charge_init);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1790)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1791) static void __exit rk817_charge_exit(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1792) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1793) platform_driver_unregister(&rk817_charge_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1794) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1795) module_exit(rk817_charge_exit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1796)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1797) MODULE_DESCRIPTION("RK817 Charge driver");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1798) MODULE_LICENSE("GPL");