^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Chrager driver for Sc8551
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Copyright (c) 2022 Rockchip Electronics Co., Ltd.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) * Author: Xu Shengfei <xsf@rock-chips.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include <linux/gpio.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <linux/i2c.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <linux/init.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <linux/interrupt.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <linux/power_supply.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #include <linux/sched.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #include <linux/kthread.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #include <linux/delay.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #include <linux/of.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #include <linux/of_device.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #include <linux/of_gpio.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #include <linux/err.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #include <linux/debugfs.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #include <linux/bitops.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) /* Register 00h */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #define SC8551_REG_00 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #define SC8551_BAT_OVP_DIS_MASK 0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #define SC8551_BAT_OVP_DIS_SHIFT 7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #define SC8551_BAT_OVP_ENABLE 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) #define SC8551_BAT_OVP_DISABLE 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) #define SC8551_BAT_OVP_MASK 0x3F
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) #define SC8551_BAT_OVP_SHIFT 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) #define SC8551_BAT_OVP_BASE 3500
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) #define SC8551_BAT_OVP_LSB 25
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) /* Register 02h */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) #define SC8551_REG_02 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) #define SC8551_BAT_OCP_DIS_MASK 0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) #define SC8551_BAT_OCP_DIS_SHIFT 7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) #define SC8551_BAT_OCP_ENABLE 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) #define SC8551_BAT_OCP_DISABLE 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) #define SC8551_BAT_OCP_MASK 0x7F
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) #define SC8551_BAT_OCP_SHIFT 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) #define SC8551_BAT_OCP_BASE 2000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) #define SC8551_BAT_OCP_LSB 100
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) /* Register 05h */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) #define SC8551_REG_05 0x05
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) #define SC8551_AC_OVP_STAT_MASK 0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) #define SC8551_AC_OVP_STAT_SHIFT 7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) #define SC8551_AC_OVP_FLAG_MASK 0x40
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) #define SC8551_AC_OVP_FLAG_SHIFT 6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) #define SC8551_AC_OVP_MASK_MASK 0x20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) #define SC8551_AC_OVP_MASK_SHIFT 5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) #define SC8551_VDROP_THRESHOLD_SET_MASK 0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) #define SC8551_VDROP_THRESHOLD_SET_SHIFT 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) #define SC8551_VDROP_THRESHOLD_300MV 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) #define SC8551_VDROP_THRESHOLD_400MV 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) #define SC8551_VDROP_DEGLITCH_SET_MASK 0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) #define SC8551_VDROP_DEGLITCH_SET_SHIFT 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) #define SC8551_VDROP_DEGLITCH_8US 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) #define SC8551_VDROP_DEGLITCH_5MS 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) #define SC8551_AC_OVP_MASK 0x07
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) #define SC8551_AC_OVP_SHIFT 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) #define SC8551_AC_OVP_BASE 11
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) #define SC8551_AC_OVP_LSB 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) #define SC8551_AC_OVP_6P5V 65
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) /* Register 06h */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) #define SC8551_REG_06 0x06
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) #define SC8551_VBUS_PD_EN_MASK 0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) #define SC8551_VBUS_PD_EN_SHIFT 7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) #define SC8551_VBUS_PD_ENABLE 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) #define SC8551_VBUS_PD_DISABLE 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) #define SC8551_BUS_OVP_MASK 0x7F
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) #define SC8551_BUS_OVP_SHIFT 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) #define SC8551_BUS_OVP_BASE 6000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) #define SC8551_BUS_OVP_LSB 50
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) /* Register 08h */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) #define SC8551_REG_08 0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) #define SC8551_BUS_OCP_DIS_MASK 0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) #define SC8551_BUS_OCP_DIS_SHIFT 7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) #define SC8551_BUS_OCP_ENABLE 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) #define SC8551_BUS_OCP_DISABLE 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) #define SC8551_IBUS_UCP_RISE_FLAG_MASK 0x40
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) #define SC8551_IBUS_UCP_RISE_FLAG_SHIFT 6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) #define SC8551_IBUS_UCP_RISE_MASK_MASK 0x20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) #define SC8551_IBUS_UCP_RISE_MASK_SHIFT 5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) #define SC8551_IBUS_UCP_RISE_MASK_ENABLE 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) #define SC8551_IBUS_UCP_RISE_MASK_DISABLE 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) #define SC8551_IBUS_UCP_FALL_FLAG_MASK 0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) #define SC8551_IBUS_UCP_FALL_FLAG_SHIFT 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) #define SC8551_BUS_OCP_MASK 0x0F
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) #define SC8551_BUS_OCP_SHIFT 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) #define SC8551_BUS_OCP_BASE 1000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) #define SC8551_BUS_OCP_LSB 250
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) /* Register 0Ah */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) #define SC8551_REG_0A 0x0A
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) #define SC8551_TSHUT_FLAG_MASK 0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) #define SC8551_TSHUT_FLAG_SHIFT 7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) #define SC8551_TSHUT_STAT_MASK 0x40
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) #define SC8551_TSHUT_STAT_SHIFT 6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) #define SC8551_VBUS_ERRORLO_STAT_MASK 0x20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) #define SC8551_VBUS_ERRORLO_STAT_SHIFT 5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) #define SC8551_VBUS_ERRORHI_STAT_MASK 0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) #define SC8551_VBUS_ERRORHI_STAT_SHIFT 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) #define SC8551_SS_TIMEOUT_FLAG_MASK 0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) #define SC8551_SS_TIMEOUT_FLAG_SHIFT 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) #define SC8551_CONV_SWITCHING_STAT_MASK 0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) #define SC8551_CONV_SWITCHING_STAT_SHIFT 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) #define SC8551_CONV_OCP_FLAG_MASK 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) #define SC8551_CONV_OCP_FLAG_SHIFT 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) #define SC8551_PIN_DIAG_FALL_FLAG_MASK 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) #define SC8551_PIN_DIAG_FALL_FLAG_SHIFT 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) /* Register 0Bh */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) #define SC8551_REG_0B 0x0B
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) #define SC8551_REG_RST_MASK 0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) #define SC8551_REG_RST_SHIFT 7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) #define SC8551_REG_RST_ENABLE 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) #define SC8551_REG_RST_DISABLE 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) #define SC8551_FSW_SET_MASK 0x70
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) #define SC8551_FSW_SET_SHIFT 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) #define SC8551_FSW_SET_300KHZ 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) #define SC8551_FSW_SET_350KHZ 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) #define SC8551_FSW_SET_400KHZ 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) #define SC8551_FSW_SET_450KHZ 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) #define SC8551_FSW_SET_500KHZ 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) #define SC8551_FSW_SET_550KHZ 5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) #define SC8551_FSW_SET_600KHZ 6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) #define SC8551_FSW_SET_750KHZ 7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) #define SC8551_WD_TIMEOUT_FLAG_MASK 0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) #define SC8551_WD_TIMEOUT_SHIFT 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) #define SC8551_WATCHDOG_DIS_MASK 0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) #define SC8551_WATCHDOG_DIS_SHIFT 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) #define SC8551_WATCHDOG_ENABLE 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) #define SC8551_WATCHDOG_DISABLE 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) #define SC8551_WATCHDOG_MASK 0x03
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) #define SC8551_WATCHDOG_SHIFT 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) #define SC8551_WATCHDOG_0P5S 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) #define SC8551_WATCHDOG_1S 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) #define SC8551_WATCHDOG_5S 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) #define SC8551_WATCHDOG_30S 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) /* Register 0Ch */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) #define SC8551_REG_0C 0x0C
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) #define SC8551_CHG_EN_MASK 0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) #define SC8551_CHG_EN_SHIFT 7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) #define SC8551_CHG_ENABLE 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) #define SC8551_CHG_DISABLE 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) #define SC8551_MS_MASK 0x60
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) #define SC8551_MS_SHIFT 5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) #define SC8551_MS_STANDALONE 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) #define SC8551_MS_SLAVE 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) #define SC8551_MS_MASTER 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) #define SC8551_ROLE_STDALONE 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) #define SC8551_ROLE_SLAVE 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) #define SC8551_ROLE_MASTER 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) #define SC8551_FREQ_SHIFT_MASK 0x18
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) #define SC8551_FREQ_SHIFT_SHIFT 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) #define SC8551_FREQ_SHIFT_NORMINAL 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) #define SC8551_FREQ_SHIFT_POSITIVE10 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) #define SC8551_FREQ_SHIFT_NEGATIVE10 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) #define SC8551_FREQ_SHIFT_SPREAD_SPECTRUM 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) #define SC8551_TSBUS_DIS_MASK 0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) #define SC8551_TSBUS_DIS_SHIFT 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) #define SC8551_TSBUS_ENABLE 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) #define SC8551_TSBUS_DISABLE 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) #define SC8551_TSBAT_DIS_MASK 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) #define SC8551_TSBAT_DIS_SHIFT 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) #define SC8551_TSBAT_ENABLE 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) #define SC8551_TSBAT_DISABLE 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) /* Register 0Dh */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) #define SC8551_REG_0D 0x0D
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) #define SC8551_BAT_OVP_ALM_STAT_MASK 0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) #define SC8551_BAT_OVP_ALM_STAT_SHIFT 7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) #define SC8551_BAT_OCP_ALM_STAT_MASK 0x40
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) #define SC8551_BAT_OCP_ALM_STAT_SHIFT 6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) #define SC8551_BUS_OVP_ALM_STAT_MASK 0x20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) #define SC8551_BUS_OVP_ALM_STAT_SHIFT 5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) #define SC8551_BUS_OCP_ALM_STAT_MASK 0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) #define SC8551_BUS_OCP_ALM_STAT_SHIFT 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) #define SC8551_BAT_UCP_ALM_STAT_MASK 0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) #define SC8551_BAT_UCP_ALM_STAT_SHIFT 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) #define SC8551_ADAPTER_INSERT_STAT_MASK 0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) #define SC8551_ADAPTER_INSERT_STAT_SHIFT 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) #define SC8551_VBAT_INSERT_STAT_MASK 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) #define SC8551_VBAT_INSERT_STAT_SHIFT 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) #define SC8551_ADC_DONE_STAT_MASK 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) #define SC8551_ADC_DONE_STAT_SHIFT 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) #define SC8551_ADC_DONE_STAT_COMPLETE 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) #define SC8551_ADC_DONE_STAT_NOTCOMPLETE 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) /* Register 0Eh */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) #define SC8551_REG_0E 0x0E
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) #define SC8551_BAT_OVP_ALM_FLAG_MASK 0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) #define SC8551_BAT_OVP_ALM_FLAG_SHIFT 7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) #define SC8551_BAT_OCP_ALM_FLAG_MASK 0x40
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) #define SC8551_BAT_OCP_ALM_FLAG_SHIFT 6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) #define SC8551_BUS_OVP_ALM_FLAG_MASK 0x20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) #define SC8551_BUS_OVP_ALM_FLAG_SHIFT 5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) #define SC8551_BUS_OCP_ALM_FLAG_MASK 0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) #define SC8551_BUS_OCP_ALM_FLAG_SHIFT 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) #define SC8551_BAT_UCP_ALM_FLAG_MASK 0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) #define SC8551_BAT_UCP_ALM_FLAG_SHIFT 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) #define SC8551_ADAPTER_INSERT_FLAG_MASK 0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) #define SC8551_ADAPTER_INSERT_FLAG_SHIFT 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) #define SC8551_VBAT_INSERT_FLAG_MASK 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) #define SC8551_VBAT_INSERT_FLAG_SHIFT 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) #define SC8551_ADC_DONE_FLAG_MASK 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) #define SC8551_ADC_DONE_FLAG_SHIFT 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) #define SC8551_ADC_DONE_FLAG_COMPLETE 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) #define SC8551_ADC_DONE_FLAG_NOTCOMPLETE 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) /* Register 0Fh */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) #define SC8551_REG_0F 0x0F
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) #define SC8551_BAT_OVP_ALM_MASK_MASK 0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) #define SC8551_BAT_OVP_ALM_MASK_SHIFT 7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) #define SC8551_BAT_OVP_ALM_MASK_ENABLE 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) #define SC8551_BAT_OVP_ALM_MASK_DISABLE 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) #define SC8551_BAT_OCP_ALM_MASK_MASK 0x40
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) #define SC8551_BAT_OCP_ALM_MASK_SHIFT 6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) #define SC8551_BAT_OCP_ALM_MASK_ENABLE 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) #define SC8551_BAT_OCP_ALM_MASK_DISABLE 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) #define SC8551_BUS_OVP_ALM_MASK_MASK 0x20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) #define SC8551_BUS_OVP_ALM_MASK_SHIFT 5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) #define SC8551_BUS_OVP_ALM_MASK_ENABLE 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) #define SC8551_BUS_OVP_ALM_MASK_DISABLE 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) #define SC8551_BUS_OCP_ALM_MASK_MASK 0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) #define SC8551_BUS_OCP_ALM_MASK_SHIFT 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) #define SC8551_BUS_OCP_ALM_MASK_ENABLE 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) #define SC8551_BUS_OCP_ALM_MASK_DISABLE 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) #define SC8551_BAT_UCP_ALM_MASK_MASK 0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) #define SC8551_BAT_UCP_ALM_MASK_SHIFT 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) #define SC8551_BAT_UCP_ALM_MASK_ENABLE 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) #define SC8551_BAT_UCP_ALM_MASK_DISABLE 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) #define SC8551_ADAPTER_INSERT_MASK_MASK 0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) #define SC8551_ADAPTER_INSERT_MASK_SHIFT 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) #define SC8551_ADAPTER_INSERT_MASK_ENABLE 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) #define SC8551_ADAPTER_INSERT_MASK_DISABLE 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) #define SC8551_VBAT_INSERT_MASK_MASK 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) #define SC8551_VBAT_INSERT_MASK_SHIFT 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) #define SC8551_VBAT_INSERT_MASK_ENABLE 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) #define SC8551_VBAT_INSERT_MASK_DISABLE 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) #define SC8551_ADC_DONE_MASK_MASK 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) #define SC8551_ADC_DONE_MASK_SHIFT 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) #define SC8551_ADC_DONE_MASK_ENABLE 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) #define SC8551_ADC_DONE_MASK_DISABLE 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) /* Register 10h */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) #define SC8551_REG_10 0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) #define SC8551_BAT_OVP_FLT_STAT_MASK 0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) #define SC8551_BAT_OVP_FLT_STAT_SHIFT 7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) #define SC8551_BAT_OCP_FLT_STAT_MASK 0x40
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) #define SC8551_BAT_OCP_FLT_STAT_SHIFT 6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) #define SC8551_BUS_OVP_FLT_STAT_MASK 0x20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) #define SC8551_BUS_OVP_FLT_STAT_SHIFT 5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) #define SC8551_BUS_OCP_FLT_STAT_MASK 0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) #define SC8551_BUS_OCP_FLT_STAT_SHIFT 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) #define SC8551_TSBUS_TSBAT_ALM_STAT_MASK 0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) #define SC8551_TSBUS_TSBAT_ALM_STAT_SHIFT 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) #define SC8551_TSBAT_FLT_STAT_MASK 0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) #define SC8551_TSBAT_FLT_STAT_SHIFT 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) #define SC8551_TSBUS_FLT_STAT_MASK 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) #define SC8551_TSBUS_FLT_STAT_SHIFT 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) #define SC8551_TDIE_ALM_STAT_MASK 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) #define SC8551_TDIE_ALM_STAT_SHIFT 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) /* Register 11h */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) #define SC8551_REG_11 0x11
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) #define SC8551_BAT_OVP_FLT_FLAG_MASK 0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) #define SC8551_BAT_OVP_FLT_FLAG_SHIFT 7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) #define SC8551_BAT_OCP_FLT_FLAG_MASK 0x40
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) #define SC8551_BAT_OCP_FLT_FLAG_SHIFT 6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) #define SC8551_BUS_OVP_FLT_FLAG_MASK 0x20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) #define SC8551_BUS_OVP_FLT_FLAG_SHIFT 5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) #define SC8551_BUS_OCP_FLT_FLAG_MASK 0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) #define SC8551_BUS_OCP_FLT_FLAG_SHIFT 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) #define SC8551_TSBUS_TSBAT_ALM_FLAG_MASK 0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) #define SC8551_TSBUS_TSBAT_ALM_FLAG_SHIFT 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) #define SC8551_TSBAT_FLT_FLAG_MASK 0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) #define SC8551_TSBAT_FLT_FLAG_SHIFT 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) #define SC8551_TSBUS_FLT_FLAG_MASK 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) #define SC8551_TSBUS_FLT_FLAG_SHIFT 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) #define SC8551_TDIE_ALM_FLAG_MASK 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) #define SC8551_TDIE_ALM_FLAG_SHIFT 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) /* Register 12h */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) #define SC8551_REG_12 0x12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) #define SC8551_BAT_OVP_FLT_MASK_MASK 0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) #define SC8551_BAT_OVP_FLT_MASK_SHIFT 7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) #define SC8551_BAT_OVP_FLT_MASK_ENABLE 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) #define SC8551_BAT_OVP_FLT_MASK_DISABLE 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) #define SC8551_BAT_OCP_FLT_MASK_MASK 0x40
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) #define SC8551_BAT_OCP_FLT_MASK_SHIFT 6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) #define SC8551_BAT_OCP_FLT_MASK_ENABLE 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) #define SC8551_BAT_OCP_FLT_MASK_DISABLE 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) #define SC8551_BUS_OVP_FLT_MASK_MASK 0x20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) #define SC8551_BUS_OVP_FLT_MASK_SHIFT 5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) #define SC8551_BUS_OVP_FLT_MASK_ENABLE 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) #define SC8551_BUS_OVP_FLT_MASK_DISABLE 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) #define SC8551_BUS_OCP_FLT_MASK_MASK 0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) #define SC8551_BUS_OCP_FLT_MASK_SHIFT 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) #define SC8551_BUS_OCP_FLT_MASK_ENABLE 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) #define SC8551_BUS_OCP_FLT_MASK_DISABLE 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) #define SC8551_TSBUS_TSBAT_ALM_MASK_MASK 0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) #define SC8551_TSBUS_TSBAT_ALM_MASK_SHIFT 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) #define SC8551_TSBUS_TSBAT_ALM_MASK_ENABLE 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) #define SC8551_TSBUS_TSBAT_ALM_MASK_DISABLE 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) #define SC8551_TSBAT_FLT_MASK_MASK 0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) #define SC8551_TSBAT_FLT_MASK_SHIFT 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) #define SC8551_TSBAT_FLT_MASK_ENABLE 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) #define SC8551_TSBAT_FLT_MASK_DISABLE 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) #define SC8551_TSBUS_FLT_MASK_MASK 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) #define SC8551_TSBUS_FLT_MASK_SHIFT 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) #define SC8551_TSBUS_FLT_MASK_ENABLE 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) #define SC8551_TSBUS_FLT_MASK_DISABLE 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) #define SC8551_TDIE_ALM_MASK_MASK 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) #define SC8551_TDIE_ALM_MASK_SHIFT 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) #define SC8551_TDIE_ALM_MASK_ENABLE 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) #define SC8551_TDIE_ALM_MASK_DISABLE 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) /* Register 13h */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) #define SC8551_REG_13 0x13
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) #define SC8551_DEV_ID_MASK 0xFF
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) #define SC8551_DEV_ID_SHIFT 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) /* Register 14h */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) #define SC8551_REG_14 0x14
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) #define SC8551_ADC_EN_MASK 0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) #define SC8551_ADC_EN_SHIFT 7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) #define SC8551_ADC_ENABLE 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) #define SC8551_ADC_DISABLE 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) #define SC8551_ADC_RATE_MASK 0x40
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) #define SC8551_ADC_RATE_SHIFT 6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) #define SC8551_ADC_RATE_CONTINOUS 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) #define SC8551_ADC_RATE_ONESHOT 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) #define SC8551_IBUS_ADC_DIS_MASK 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) #define SC8551_IBUS_ADC_DIS_SHIFT 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) #define SC8551_IBUS_ADC_ENABLE 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) #define SC8551_IBUS_ADC_DISABLE 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) /* Register 15h */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) #define SC8551_REG_15 0x15
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) #define SC8551_VBUS_ADC_DIS_MASK 0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) #define SC8551_VBUS_ADC_DIS_SHIFT 7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) #define SC8551_VBUS_ADC_ENABLE 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) #define SC8551_VBUS_ADC_DISABLE 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) #define SC8551_VAC_ADC_DIS_MASK 0x40
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) #define SC8551_VAC_ADC_DIS_SHIFT 6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) #define SC8551_VAC_ADC_ENABLE 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) #define SC8551_VAC_ADC_DISABLE 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) #define SC8551_VOUT_ADC_DIS_MASK 0x20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) #define SC8551_VOUT_ADC_DIS_SHIFT 5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) #define SC8551_VOUT_ADC_ENABLE 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) #define SC8551_VOUT_ADC_DISABLE 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) #define SC8551_VBAT_ADC_DIS_MASK 0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) #define SC8551_VBAT_ADC_DIS_SHIFT 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) #define SC8551_VBAT_ADC_ENABLE 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) #define SC8551_VBAT_ADC_DISABLE 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) #define SC8551_IBAT_ADC_DIS_MASK 0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) #define SC8551_IBAT_ADC_DIS_SHIFT 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) #define SC8551_IBAT_ADC_ENABLE 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) #define SC8551_IBAT_ADC_DISABLE 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) #define SC8551_TSBUS_ADC_DIS_MASK 0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) #define SC8551_TSBUS_ADC_DIS_SHIFT 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) #define SC8551_TSBUS_ADC_ENABLE 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) #define SC8551_TSBUS_ADC_DISABLE 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) #define SC8551_TSBAT_ADC_DIS_MASK 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) #define SC8551_TSBAT_ADC_DIS_SHIFT 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) #define SC8551_TSBAT_ADC_ENABLE 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) #define SC8551_TSBAT_ADC_DISABLE 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) #define SC8551_TDIE_ADC_DIS_MASK 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) #define SC8551_TDIE_ADC_DIS_SHIFT 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) #define SC8551_TDIE_ADC_ENABLE 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) #define SC8551_TDIE_ADC_DISABLE 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) /* Register 16h */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) #define SC8551_REG_16 0x16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) #define SC8551_IBUS_POL_H_MASK 0x0F
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) /* Register 17h */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) #define SC8551_REG_17 0x17
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) #define SC8551_IBUS_POL_L_MASK 0xFF
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) /* Register 18h */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) #define SC8551_REG_18 0x18
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) #define SC8551_VBUS_POL_H_MASK 0x0F
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) /* Register 19h */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) #define SC8551_REG_19 0x19
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) #define SC8551_VBUS_POL_L_MASK 0xFF
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) /* Register 1Ah */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) #define SC8551_REG_1A 0x1A
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) #define SC8551_VAC_POL_H_MASK 0x0F
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) /* Register 1Bh */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) #define SC8551_REG_1B 0x1B
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) #define SC8551_VAC_POL_L_MASK 0xFF
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) /* Register 1Ch */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) #define SC8551_REG_1C 0x1C
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) #define SC8551_VOUT_POL_H_MASK 0x0F
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) /* Register 1Dh */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) #define SC8551_REG_1D 0x1D
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) #define SC8551_VOUT_POL_L_MASK 0x0F
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) /* Register 1Eh */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) #define SC8551_REG_1E 0x1E
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) #define SC8551_VBAT_POL_H_MASK 0x0F
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) /* Register 1Fh */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) #define SC8551_REG_1F 0x1F
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) #define SC8551_VBAT_POL_L_MASK 0xFF
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) /* Register 20h */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) #define SC8551_REG_20 0x20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) #define SC8551_IBAT_POL_H_MASK 0x0F
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) /* Register 21h */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) #define SC8551_REG_21 0x21
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) #define SC8551_IBAT_POL_L_MASK 0xFF
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) /* Register 26h */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) #define SC8551_REG_26 0x26
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) #define SC8551_TDIE_POL_H_MASK 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) /* Register 2Bh */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) #define SC8551_REG_2B 0x2B
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) #define SC8551_SS_TIMEOUT_SET_MASK 0xE0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) #define SC8551_SS_TIMEOUT_SET_SHIFT 5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) #define SC8551_SS_TIMEOUT_DISABLE 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) #define SC8551_SS_TIMEOUT_12P5MS 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) #define SC8551_SS_TIMEOUT_25MS 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) #define SC8551_SS_TIMEOUT_50MS 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) #define SC8551_SS_TIMEOUT_100MS 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) #define SC8551_SS_TIMEOUT_400MS 5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) #define SC8551_SS_TIMEOUT_1500MS 6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) #define SC8551_SS_TIMEOUT_100000MS 7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) #define SC8551_EN_REGULATION_MASK 0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) #define SC8551_EN_REGULATION_SHIFT 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) #define SC8551_EN_REGULATION_ENABLE 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) #define SC8551_EN_REGULATION_DISABLE 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) #define SC8551_VOUT_OVP_DIS_MASK 0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) #define SC8551_VOUT_OVP_DIS_SHIFT 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) #define SC8551_VOUT_OVP_ENABLE 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) #define SC8551_VOUT_OVP_DISABLE 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) #define SC8551_IBUS_UCP_RISE_TH_MASK 0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) #define SC8551_IBUS_UCP_RISE_TH_SHIFT 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) #define SC8551_IBUS_UCP_RISE_150MA 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) #define SC8551_IBUS_UCP_RISE_250MA 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) #define SC8551_SET_IBAT_SNS_RES_MASK 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) #define SC8551_SET_IBAT_SNS_RES_SHIFT 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) #define SC8551_SET_IBAT_SNS_RES_2MHM 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) #define SC8551_SET_IBAT_SNS_RES_5MHM 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) #define SC8551_VAC_PD_EN_MASK 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) #define SC8551_VAC_PD_EN_SHIFT 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) #define SC8551_VAC_PD_ENABLE 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) #define SC8551_VAC_PD_DISABLE 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) /* Register 2Ch */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) #define SC8551_REG_2C 0x2C
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) #define SC8551_IBAT_REG_MASK 0xC0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) #define SC8551_IBAT_REG_SHIFT 6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) #define SC8551_IBAT_REG_200MA 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) #define SC8551_IBAT_REG_300MA 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) #define SC8551_IBAT_REG_400MA 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) #define SC8551_IBAT_REG_500MA 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) #define SC8551_VBAT_REG_MASK 0x30
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) #define SC8551_VBAT_REG_SHIFT 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) #define SC8551_VBAT_REG_50MV 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) #define SC8551_VBAT_REG_100MV 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) #define SC8551_VBAT_REG_150MV 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) #define SC8551_VBAT_REG_200MV 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) #define SC8551_VBAT_REG_ACTIVE_STAT_MASK 0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) #define SC8551_IBAT_REG_ACTIVE_STAT_MASK 0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) #define SC8551_VDROP_OVP_ACTIVE_STAT_MASK 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) #define SC8551_VOUT_OVP_ACTIVE_STAT_MASK 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) #define SC8551_REG_2D 0x2D
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) #define SC8551_VBAT_REG_ACTIVE_FLAG_MASK 0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) #define SC8551_IBAT_REG_ACTIVE_FLAG_MASK 0x40
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) #define SC8551_VDROP_OVP_FLAG_MASK 0x20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) #define SC8551_VOUT_OVP_FLAG_MASK 0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) #define SC8551_VBAT_REG_ACTIVE_MASK_MASK 0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) #define SC8551_IBAT_REG_ACTIVE_MASK_MASK 0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) #define SC8551_VDROP_OVP_MASK_MASK 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) #define SC8551_VOUT_OVP_MASK_MASK 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) #define SC8551_REG_2E 0x2E
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) #define SC8551_IBUS_LOW_DG_MASK 0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) #define SC8551_IBUS_LOW_DG_SHIFT 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) #define SC8551_IBUS_LOW_DG_10US 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) #define SC8551_IBUS_LOW_DG_5MS 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) #define SC8551_REG_2F 0x2F
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) #define SC8551_PMID2OUT_UVP_FLAG_MASK 0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) #define SC8551_PMID2OUT_OVP_FLAG_MASK 0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) #define SC8551_PMID2OUT_UVP_STAT_MASK 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) #define SC8551_PMID2OUT_OVP_STAT_MASK 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) #define SC8551_REG_30 0x30
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) #define SC8551_IBUS_REG_EN_MASK 0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) #define SC8551_IBUS_REG_EN_SHIFT 7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) #define SC8551_IBUS_REG_ENABLE 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) #define SC8551_IBUS_REG_DISABLE 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) #define SC8551_IBUS_REG_ACTIVE_STAT_MASK 0x40
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) #define SC8551_IBUS_REG_ACTIVE_FLAG_MASK 0x20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) #define SC8551_IBUS_REG_ACTIVE_MASK_MASK 0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) #define SC8551_IBUS_REG_ACTIVE_MASK_SHIFT 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) #define SC8551_IBUS_REG_ACTIVE_NOT_MASK 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) #define SC8551_IBUS_REG_ACTIVE_MASK 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) #define SC8551_IBUS_REG_MASK 0x0F
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) #define SC8551_IBUS_REG_SHIFT 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) #define SC8551_IBUS_REG_BASE 1000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) #define SC8551_IBUS_REG_LSB 250
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) #define SC8551_REG_31 0x31
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) #define SC8551_CHARGE_MODE_MASK 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) #define SC8551_CHARGE_MODE_SHIFT 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) #define SC8551_CHARGE_MODE_2_1 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) #define SC8551_CHARGE_MODE_1_1 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) #define SC8551_REG_35 0x35
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) #define SC8551_VBUS_IN_RANGE_MASK 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) #define SC8551_VBUS_IN_RANGE_SHIFT 6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) #define SC8551_VBUS_IN_RANGE_ENABLE 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) #define SC8551_VBUS_IN_RANGE_DISABLE 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) #define SC8551_REG_36 0x36
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) #define SC8551_OVPGATE_MASK 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) #define SC8551_OVPGATE_SHIFT 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) #define SC8551_OVPGATE_ENABLE 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) #define SC8551_OVPGATE_DISABLE 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) #define VBUS_INSERT BIT(2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) #define VBAT_INSERT BIT(1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) #define ADC_DONE BIT(0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) #define BAT_OVP_FAULT BIT(7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) #define BAT_OCP_FAULT BIT(6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) #define BUS_OVP_FAULT BIT(5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) #define BUS_OCP_FAULT BIT(4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) /*below used for comm with other module*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) #define BAT_OVP_FAULT_SHIFT 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) #define BAT_OCP_FAULT_SHIFT 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) #define BUS_OVP_FAULT_SHIFT 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) #define BUS_OCP_FAULT_SHIFT 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) #define BAT_THERM_FAULT_SHIFT 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) #define BUS_THERM_FAULT_SHIFT 5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) #define DIE_THERM_FAULT_SHIFT 6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) #define BAT_OVP_FAULT_MASK (1 << BAT_OVP_FAULT_SHIFT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) #define BAT_OCP_FAULT_MASK (1 << BAT_OCP_FAULT_SHIFT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) #define BUS_OVP_FAULT_MASK (1 << BUS_OVP_FAULT_SHIFT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) #define BUS_OCP_FAULT_MASK (1 << BUS_OCP_FAULT_SHIFT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) #define BAT_THERM_FAULT_MASK (1 << BAT_THERM_FAULT_SHIFT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) #define BUS_THERM_FAULT_MASK (1 << BUS_THERM_FAULT_SHIFT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) #define DIE_THERM_FAULT_MASK (1 << DIE_THERM_FAULT_SHIFT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) #define BAT_OVP_ALARM_SHIFT 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) #define BAT_OCP_ALARM_SHIFT 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) #define BUS_OVP_ALARM_SHIFT 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) #define BUS_OCP_ALARM_SHIFT 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) #define BAT_THERM_ALARM_SHIFT 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) #define BUS_THERM_ALARM_SHIFT 5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) #define DIE_THERM_ALARM_SHIFT 6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) #define BAT_UCP_ALARM_SHIFT 7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) #define BAT_OVP_ALARM_MASK (1 << BAT_OVP_ALARM_SHIFT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) #define BAT_OCP_ALARM_MASK (1 << BAT_OCP_ALARM_SHIFT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) #define BUS_OVP_ALARM_MASK (1 << BUS_OVP_ALARM_SHIFT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) #define BUS_OCP_ALARM_MASK (1 << BUS_OCP_ALARM_SHIFT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) #define BAT_THERM_ALARM_MASK (1 << BAT_THERM_ALARM_SHIFT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) #define BUS_THERM_ALARM_MASK (1 << BUS_THERM_ALARM_SHIFT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) #define DIE_THERM_ALARM_MASK (1 << DIE_THERM_ALARM_SHIFT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) #define BAT_UCP_ALARM_MASK (1 << BAT_UCP_ALARM_SHIFT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) #define VBAT_REG_STATUS_SHIFT 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) #define IBAT_REG_STATUS_SHIFT 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) #define VBAT_REG_STATUS_MASK (1 << VBAT_REG_STATUS_SHIFT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) #define IBAT_REG_STATUS_MASK (1 << VBAT_REG_STATUS_SHIFT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) #define SC8551_DEBUG_BUF_LEN 30
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) ADC_IBUS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) ADC_VBUS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) ADC_VAC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) ADC_VOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) ADC_VBAT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) ADC_IBAT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) ADC_TBUS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) ADC_TBAT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) ADC_TDIE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) ADC_MAX_NUM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) struct sc8551_cfg {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) bool bat_ovp_disable;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) bool bat_ocp_disable;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) int bat_ovp_th;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) int bat_ovp_alm_th;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) int bat_ocp_th;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) bool bus_ocp_disable;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) int bus_ovp_th;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) int bus_ocp_th;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) int ac_ovp_th;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) bool bat_therm_disable;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) bool bus_therm_disable;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) bool die_therm_disable;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) int sense_r_mohm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) struct sc8551 {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) struct device *dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) struct i2c_client *client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) int part_no;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) int revision;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) int mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) struct mutex data_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) struct mutex i2c_rw_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) int irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) bool batt_present;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) bool vbus_present;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) bool usb_present;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) bool charge_enabled;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) int vbus_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) /* ADC reading */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) int vbat_volt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) int vbus_volt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) int vout_volt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) int vac_volt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) int ibat_curr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) int ibus_curr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) int die_temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) /* alarm/fault status */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) bool bat_ovp_fault;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) bool bat_ocp_fault;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) bool bus_ovp_fault;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) bool bus_ocp_fault;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) bool vbat_reg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) bool ibat_reg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) int prev_alarm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) int prev_fault;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) struct sc8551_cfg *cfg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) struct power_supply_desc psy_desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) struct power_supply_config psy_cfg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) struct power_supply *fc2_psy;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) static int __sc8551_read_byte(struct sc8551 *sc, u8 reg, u8 *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768) s32 ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) ret = i2c_smbus_read_byte_data(sc->client, reg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) dev_err(sc->dev, "i2c read fail: can't read from reg 0x%02X\n", reg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) *data = (u8) ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) return 0;
^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 int __sc8551_write_byte(struct sc8551 *sc, int reg, u8 val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) s32 ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) ret = i2c_smbus_write_byte_data(sc->client, reg, val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) dev_err(sc->dev, "i2c write fail: can't write 0x%02X to reg 0x%02X: %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) val, reg, ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) static int sc8551_read_byte(struct sc8551 *sc, u8 reg, u8 *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) mutex_lock(&sc->i2c_rw_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) ret = __sc8551_read_byte(sc, reg, data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) mutex_unlock(&sc->i2c_rw_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) static int sc8551_write_byte(struct sc8551 *sc, u8 reg, u8 data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) mutex_lock(&sc->i2c_rw_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810) ret = __sc8551_write_byte(sc, reg, data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) mutex_unlock(&sc->i2c_rw_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) static int sc8551_update_bits(struct sc8551 *sc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) u8 reg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) u8 mask,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819) u8 data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) u8 tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) mutex_lock(&sc->i2c_rw_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) ret = __sc8551_read_byte(sc, reg, &tmp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) dev_err(sc->dev, "Failed: reg=%02X, ret=%d\n", reg, ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) tmp &= ~mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) tmp |= data & mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) ret = __sc8551_write_byte(sc, reg, tmp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) dev_err(sc->dev, "Failed: reg=%02X, ret=%d\n", reg, ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) mutex_unlock(&sc->i2c_rw_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) static int sc8551_enable_charge(struct sc8551 *sc, bool enable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846) u8 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) if (enable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849) val = SC8551_CHG_ENABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) val = SC8551_CHG_DISABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) val <<= SC8551_CHG_EN_SHIFT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855) ret = sc8551_update_bits(sc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) SC8551_REG_0C,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) SC8551_CHG_EN_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858) val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863) static int sc8551_check_charge_enabled(struct sc8551 *sc, bool *enabled)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) u8 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868) ret = sc8551_read_byte(sc, SC8551_REG_0C, &val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870) if (!ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871) *enabled = !!(val & SC8551_CHG_EN_MASK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875) static int sc8551_enable_wdt(struct sc8551 *sc, bool enable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878) u8 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880) if (enable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881) val = SC8551_WATCHDOG_ENABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) val = SC8551_WATCHDOG_DISABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885) val <<= SC8551_WATCHDOG_DIS_SHIFT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887) ret = sc8551_update_bits(sc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888) SC8551_REG_0B,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889) SC8551_WATCHDOG_DIS_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890) val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894) static int sc8551_set_wdt(struct sc8551 *sc, int ms)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) u8 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899) if (ms == 500)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900) val = SC8551_WATCHDOG_0P5S;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901) else if (ms == 1000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902) val = SC8551_WATCHDOG_1S;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903) else if (ms == 5000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) val = SC8551_WATCHDOG_5S;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905) else if (ms == 30000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906) val = SC8551_WATCHDOG_30S;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908) val = SC8551_WATCHDOG_30S;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910) val <<= SC8551_WATCHDOG_SHIFT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912) ret = sc8551_update_bits(sc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913) SC8551_REG_0B,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914) SC8551_WATCHDOG_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915) val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919) static int sc8551_enable_batovp(struct sc8551 *sc, bool enable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922) u8 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924) if (enable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925) val = SC8551_BAT_OVP_ENABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927) val = SC8551_BAT_OVP_DISABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929) val <<= SC8551_BAT_OVP_DIS_SHIFT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931) ret = sc8551_update_bits(sc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932) SC8551_REG_00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933) SC8551_BAT_OVP_DIS_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934) val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 937)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 938) static int sc8551_set_batovp_th(struct sc8551 *sc, int threshold)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 939) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941) u8 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943) if (threshold < SC8551_BAT_OVP_BASE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944) threshold = SC8551_BAT_OVP_BASE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946) val = (threshold - SC8551_BAT_OVP_BASE) / SC8551_BAT_OVP_LSB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 947)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 948) val <<= SC8551_BAT_OVP_SHIFT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 949)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 950) ret = sc8551_update_bits(sc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 951) SC8551_REG_00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 952) SC8551_BAT_OVP_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 953) val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 954) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 955) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 956)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 957) static int sc8551_enable_batocp(struct sc8551 *sc, bool enable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 958) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 959) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 960) u8 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 961)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 962) if (enable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 963) val = SC8551_BAT_OCP_ENABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 964) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 965) val = SC8551_BAT_OCP_DISABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 966)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 967) val <<= SC8551_BAT_OCP_DIS_SHIFT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 968)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 969) ret = sc8551_update_bits(sc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 970) SC8551_REG_02,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 971) SC8551_BAT_OCP_DIS_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 972) val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 973) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 974) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 975)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 976) static int sc8551_set_batocp_th(struct sc8551 *sc, int threshold)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 977) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 978) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 979) u8 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 980)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 981) if (threshold < SC8551_BAT_OCP_BASE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 982) threshold = SC8551_BAT_OCP_BASE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 983)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 984) val = (threshold - SC8551_BAT_OCP_BASE) / SC8551_BAT_OCP_LSB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 985)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 986) val <<= SC8551_BAT_OCP_SHIFT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 987)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 988) ret = sc8551_update_bits(sc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 989) SC8551_REG_02,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 990) SC8551_BAT_OCP_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 991) val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 992) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 993) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 994)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 995) static int sc8551_set_busovp_th(struct sc8551 *sc, int threshold)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 996) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 997) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 998) u8 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 999)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) if (threshold < SC8551_BUS_OVP_BASE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) threshold = SC8551_BUS_OVP_BASE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) val = (threshold - SC8551_BUS_OVP_BASE) / SC8551_BUS_OVP_LSB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) val <<= SC8551_BUS_OVP_SHIFT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) ret = sc8551_update_bits(sc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) SC8551_REG_06,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009) SC8551_BUS_OVP_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) static int sc8551_enable_busocp(struct sc8551 *sc, bool enable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) u8 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) if (enable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) val = SC8551_BUS_OCP_ENABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) val = SC8551_BUS_OCP_DISABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) val <<= SC8551_BUS_OCP_DIS_SHIFT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026) ret = sc8551_update_bits(sc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) SC8551_REG_08,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) SC8551_BUS_OCP_DIS_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) static int sc8551_set_busocp_th(struct sc8551 *sc, int threshold)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) u8 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) if (threshold < SC8551_BUS_OCP_BASE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) threshold = SC8551_BUS_OCP_BASE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) val = (threshold - SC8551_BUS_OCP_BASE) / SC8551_BUS_OCP_LSB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) val <<= SC8551_BUS_OCP_SHIFT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) ret = sc8551_update_bits(sc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046) SC8551_REG_08,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) SC8551_BUS_OCP_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) static int sc8551_set_acovp_th(struct sc8551 *sc, int threshold)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) u8 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057) if (threshold < SC8551_AC_OVP_BASE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) threshold = SC8551_AC_OVP_BASE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) if (threshold == SC8551_AC_OVP_6P5V)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) val = 0x07;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) val = (threshold - SC8551_AC_OVP_BASE) / SC8551_AC_OVP_LSB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065) val <<= SC8551_AC_OVP_SHIFT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) ret = sc8551_update_bits(sc, SC8551_REG_05,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068) SC8551_AC_OVP_MASK, val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) return ret;
^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)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) static int sc8551_set_vdrop_th(struct sc8551 *sc, int threshold)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077) u8 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) if (threshold == 300)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) val = SC8551_VDROP_THRESHOLD_300MV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) val = SC8551_VDROP_THRESHOLD_400MV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) val <<= SC8551_VDROP_THRESHOLD_SET_SHIFT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) ret = sc8551_update_bits(sc, SC8551_REG_05,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087) SC8551_VDROP_THRESHOLD_SET_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) static int sc8551_set_vdrop_deglitch(struct sc8551 *sc, int us)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096) u8 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098) if (us == 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099) val = SC8551_VDROP_DEGLITCH_8US;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) val = SC8551_VDROP_DEGLITCH_5MS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) val <<= SC8551_VDROP_DEGLITCH_SET_SHIFT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105) ret = sc8551_update_bits(sc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106) SC8551_REG_05,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) SC8551_VDROP_DEGLITCH_SET_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) static int sc8551_enable_bat_therm(struct sc8551 *sc, bool enable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115) u8 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117) if (enable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118) val = SC8551_TSBAT_ENABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) val = SC8551_TSBAT_DISABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122) val <<= SC8551_TSBAT_DIS_SHIFT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124) ret = sc8551_update_bits(sc, SC8551_REG_0C,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125) SC8551_TSBAT_DIS_MASK, val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) static int sc8551_enable_bus_therm(struct sc8551 *sc, bool enable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) u8 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134) if (enable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135) val = SC8551_TSBUS_ENABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137) val = SC8551_TSBUS_DISABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139) val <<= SC8551_TSBUS_DIS_SHIFT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) ret = sc8551_update_bits(sc, SC8551_REG_0C,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142) SC8551_TSBUS_DIS_MASK, val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146) static int sc8551_enable_adc(struct sc8551 *sc, bool enable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149) u8 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151) if (enable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152) val = SC8551_ADC_ENABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154) val = SC8551_ADC_DISABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156) val <<= SC8551_ADC_EN_SHIFT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158) ret = sc8551_update_bits(sc, SC8551_REG_14,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159) SC8551_ADC_EN_MASK, val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163) static int sc8551_set_adc_scanrate(struct sc8551 *sc, bool oneshot)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166) u8 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168) if (oneshot)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169) val = SC8551_ADC_RATE_ONESHOT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171) val = SC8551_ADC_RATE_CONTINOUS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173) val <<= SC8551_ADC_RATE_SHIFT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175) ret = sc8551_update_bits(sc, SC8551_REG_14,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176) SC8551_ADC_RATE_MASK, val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180) static int sc8551_get_adc_data(struct sc8551 *sc, int channel, int *result)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182) u8 val_l = 0, val_h = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183) u16 val = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186) if (channel >= ADC_MAX_NUM)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189) ret = sc8551_read_byte(sc, SC8551_REG_16 + (channel << 1), &val_h);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193) ret = sc8551_read_byte(sc, SC8551_REG_16 + (channel << 1) + 1, &val_l);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197) val = (val_h << 8) | val_l;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199) if (channel == ADC_IBUS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200) val = val * 15625 / 10000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201) else if (channel == ADC_VBUS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202) val = val * 375 / 100;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203) else if (channel == ADC_VAC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204) val = val * 5;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205) else if (channel == ADC_VOUT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206) val = val * 125 / 100;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207) else if (channel == ADC_VBAT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208) val = val * 125 / 100;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209) else if (channel == ADC_IBAT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210) val = val * 3125 / 1000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211) else if (channel == ADC_TDIE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212) val = val * 5 / 10;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214) *result = val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219) static int sc8551_set_adc_scan(struct sc8551 *sc, int channel, bool enable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222) u8 reg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223) u8 mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224) u8 shift;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225) u8 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227) if (channel > ADC_MAX_NUM)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230) if (channel == ADC_IBUS) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231) reg = SC8551_REG_14;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232) shift = SC8551_IBUS_ADC_DIS_SHIFT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233) mask = SC8551_IBUS_ADC_DIS_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235) reg = SC8551_REG_15;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236) shift = 8 - channel;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237) mask = 1 << shift;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240) if (enable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241) val = 0 << shift;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243) val = 1 << shift;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245) ret = sc8551_update_bits(sc, reg, mask, val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246)
^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) static int sc8551_set_alarm_int_mask(struct sc8551 *sc, u8 mask)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253) u8 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255) ret = sc8551_read_byte(sc, SC8551_REG_0F, &val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259) val |= mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261) ret = sc8551_write_byte(sc, SC8551_REG_0F, val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266) static int sc8551_set_sense_resistor(struct sc8551 *sc, int r_mohm)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269) u8 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271) if (r_mohm == 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272) val = SC8551_SET_IBAT_SNS_RES_2MHM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273) else if (r_mohm == 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274) val = SC8551_SET_IBAT_SNS_RES_5MHM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1277)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1278) val <<= SC8551_SET_IBAT_SNS_RES_SHIFT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1279)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280) ret = sc8551_update_bits(sc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281) SC8551_REG_2B,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282) SC8551_SET_IBAT_SNS_RES_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283) val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284) return ret;
^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) static int sc8551_enable_regulation(struct sc8551 *sc, bool enable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1288) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1289) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1290) u8 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1291)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1292) if (enable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1293) val = SC8551_EN_REGULATION_ENABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1294) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1295) val = SC8551_EN_REGULATION_DISABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1296)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1297) val <<= SC8551_EN_REGULATION_SHIFT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1298)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1299) ret = sc8551_update_bits(sc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1300) SC8551_REG_2B,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1301) SC8551_EN_REGULATION_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1302) val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1303)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1304) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1305)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1306) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1307)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1308) static int sc8551_set_ss_timeout(struct sc8551 *sc, int timeout)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1309) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1310) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1311) u8 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1312)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1313) switch (timeout) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1314) case 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1315) val = SC8551_SS_TIMEOUT_DISABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1316) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1317) case 12:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1318) val = SC8551_SS_TIMEOUT_12P5MS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1319) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1320) case 25:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1321) val = SC8551_SS_TIMEOUT_25MS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1322) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1323) case 50:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1324) val = SC8551_SS_TIMEOUT_50MS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1325) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1326) case 100:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1327) val = SC8551_SS_TIMEOUT_100MS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1328) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1329) case 400:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1330) val = SC8551_SS_TIMEOUT_400MS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1331) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1332) case 1500:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1333) val = SC8551_SS_TIMEOUT_1500MS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1334) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1335) case 100000:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1336) val = SC8551_SS_TIMEOUT_100000MS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1337) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1338) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1339) val = SC8551_SS_TIMEOUT_DISABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1340) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1341) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1342)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1343) val <<= SC8551_SS_TIMEOUT_SET_SHIFT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1344)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1345) ret = sc8551_update_bits(sc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1346) SC8551_REG_2B,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1347) SC8551_SS_TIMEOUT_SET_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1348) val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1349)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1350) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1351) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1352)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1353) static int sc8551_set_ibat_reg_th(struct sc8551 *sc, int th_ma)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1354) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1355) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1356) u8 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1357)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1358) if (th_ma == 200)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1359) val = SC8551_IBAT_REG_200MA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1360) else if (th_ma == 300)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1361) val = SC8551_IBAT_REG_300MA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1362) else if (th_ma == 400)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1363) val = SC8551_IBAT_REG_400MA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1364) else if (th_ma == 500)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1365) val = SC8551_IBAT_REG_500MA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1366) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1367) val = SC8551_IBAT_REG_500MA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1368)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1369) val <<= SC8551_IBAT_REG_SHIFT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1370) ret = sc8551_update_bits(sc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1371) SC8551_REG_2C,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1372) SC8551_IBAT_REG_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1373) val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1374)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1375) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1376) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1377)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1378) static int sc8551_set_vbat_reg_th(struct sc8551 *sc, int th_mv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1379) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1380) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1381) u8 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1382)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1383) if (th_mv == 50)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1384) val = SC8551_VBAT_REG_50MV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1385) else if (th_mv == 100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1386) val = SC8551_VBAT_REG_100MV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1387) else if (th_mv == 150)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1388) val = SC8551_VBAT_REG_150MV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1389) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1390) val = SC8551_VBAT_REG_200MV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1391)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1392) val <<= SC8551_VBAT_REG_SHIFT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1393)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1394) ret = sc8551_update_bits(sc, SC8551_REG_2C,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1395) SC8551_VBAT_REG_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1396) val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1397)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1398) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1399) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1400)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1401) static int sc8551_get_work_mode(struct sc8551 *sc, int *mode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1402) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1403) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1404) u8 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1405)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1406) ret = sc8551_read_byte(sc, SC8551_REG_0C, &val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1407)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1408) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1409) dev_err(sc->dev, "Failed to read operation mode register\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1410) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1411) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1412)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1413) val = (val & SC8551_MS_MASK) >> SC8551_MS_SHIFT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1414) if (val == SC8551_MS_MASTER)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1415) *mode = SC8551_ROLE_MASTER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1416) else if (val == SC8551_MS_SLAVE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1417) *mode = SC8551_ROLE_SLAVE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1418) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1419) *mode = SC8551_ROLE_STDALONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1420)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1421) pr_debug("work mode:%s\n", *mode == SC8551_ROLE_STDALONE ? "Standalone" :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1422) (*mode == SC8551_ROLE_SLAVE ? "Slave" : "Master"));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1423) return ret;
^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) static int sc8551_check_vbus_error_status(struct sc8551 *sc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1427) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1428) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1429) u8 data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1430)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1431) ret = sc8551_read_byte(sc, SC8551_REG_0A, &data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1432) if (!ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1433) sc->vbus_error = data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1434)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1435) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1436) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1437)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1438) static void sc8551_check_alarm_status(struct sc8551 *sc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1439) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1440) u8 flag = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1441) u8 stat = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1442) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1443)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1444) mutex_lock(&sc->data_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1445)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1446) ret = sc8551_read_byte(sc, SC8551_REG_08, &flag);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1447) if (!ret && (flag & SC8551_IBUS_UCP_FALL_FLAG_MASK))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1448) pr_debug("UCP_FLAG =0x%02X\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1449) !!(flag & SC8551_IBUS_UCP_FALL_FLAG_MASK));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1450)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1451) ret = sc8551_read_byte(sc, SC8551_REG_2D, &flag);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1452) if (!ret && (flag & SC8551_VDROP_OVP_FLAG_MASK))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1453) pr_debug("VDROP_OVP_FLAG =0x%02X\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1454) !!(flag & SC8551_VDROP_OVP_FLAG_MASK));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1455)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1456) /*read to clear alarm flag*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1457) ret = sc8551_read_byte(sc, SC8551_REG_0E, &flag);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1458) if (!ret && flag)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1459) pr_debug("INT_FLAG =0x%02X\n", flag);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1460)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1461) ret = sc8551_read_byte(sc, SC8551_REG_0D, &stat);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1462) if (!ret && stat != sc->prev_alarm) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1463) pr_debug("INT_STAT = 0X%02x\n", stat);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1464) sc->prev_alarm = stat;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1465) sc->batt_present = !!(stat & VBAT_INSERT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1466) sc->vbus_present = !!(stat & VBUS_INSERT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1467) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1468)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1469) ret = sc8551_read_byte(sc, SC8551_REG_08, &stat);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1470) if (!ret && (stat & 0x50))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1471) dev_err(sc->dev, "Reg[05]BUS_UCPOVP = 0x%02X\n", stat);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1472)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1473) ret = sc8551_read_byte(sc, SC8551_REG_0A, &stat);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1474) if (!ret && (stat & 0x02))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1475) dev_err(sc->dev, "Reg[0A]CONV_OCP = 0x%02X\n", stat);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1476)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1477) mutex_unlock(&sc->data_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1478) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1479)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1480) static void sc8551_check_fault_status(struct sc8551 *sc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1481) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1482) u8 flag = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1483) u8 stat = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1484) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1485)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1486) mutex_lock(&sc->data_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1487)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1488) ret = sc8551_read_byte(sc, SC8551_REG_10, &stat);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1489) if (!ret && stat)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1490) dev_err(sc->dev, "FAULT_STAT = 0x%02X\n", stat);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1491)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1492) ret = sc8551_read_byte(sc, SC8551_REG_11, &flag);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1493) if (!ret && flag)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1494) dev_err(sc->dev, "FAULT_FLAG = 0x%02X\n", flag);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1495)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1496) if (!ret && flag != sc->prev_fault) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1497) sc->prev_fault = flag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1498) sc->bat_ovp_fault = !!(flag & BAT_OVP_FAULT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1499) sc->bat_ocp_fault = !!(flag & BAT_OCP_FAULT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1500) sc->bus_ovp_fault = !!(flag & BUS_OVP_FAULT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1501) sc->bus_ocp_fault = !!(flag & BUS_OCP_FAULT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1502) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1503)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1504) mutex_unlock(&sc->data_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1505) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1506)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1507) static int sc8551_detect_device(struct sc8551 *sc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1508) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1509) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1510) u8 data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1511)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1512) ret = sc8551_read_byte(sc, SC8551_REG_13, &data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1513) if (ret == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1514) sc->part_no = (data & SC8551_DEV_ID_MASK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1515) sc->part_no >>= SC8551_DEV_ID_SHIFT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1516) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1517) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1518) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1519)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1520) static int sc8551_parse_dt(struct sc8551 *sc, struct device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1521) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1522) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1523) struct device_node *np = dev->of_node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1524)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1525) sc->cfg = devm_kzalloc(dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1526) sizeof(struct sc8551_cfg),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1527) GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1528)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1529) if (!sc->cfg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1530) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1531)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1532) sc->cfg->bat_ovp_disable = of_property_read_bool(np,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1533) "sc,sc8551,bat-ovp-disable");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1534) sc->cfg->bat_ocp_disable = of_property_read_bool(np,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1535) "sc,sc8551,bat-ocp-disable");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1536) sc->cfg->bus_ocp_disable = of_property_read_bool(np,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1537) "sc,sc8551,bus-ocp-disable");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1538) sc->cfg->bat_therm_disable = of_property_read_bool(np,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1539) "sc,sc8551,bat-therm-disable");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1540) sc->cfg->bus_therm_disable = of_property_read_bool(np,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1541) "sc,sc8551,bus-therm-disable");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1542)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1543) ret = of_property_read_u32(np, "sc,sc8551,bat-ovp-threshold",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1544) &sc->cfg->bat_ovp_th);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1545) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1546) dev_err(sc->dev, "failed to read bat-ovp-threshold\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1547) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1548) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1549) ret = of_property_read_u32(np, "sc,sc8551,bat-ocp-threshold",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1550) &sc->cfg->bat_ocp_th);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1551) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1552) dev_err(sc->dev, "failed to read bat-ocp-threshold\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1553) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1554) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1555) ret = of_property_read_u32(np, "sc,sc8551,bus-ovp-threshold",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1556) &sc->cfg->bus_ovp_th);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1557) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1558) dev_err(sc->dev, "failed to read bus-ovp-threshold\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1559) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1560) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1561) ret = of_property_read_u32(np, "sc,sc8551,bus-ocp-threshold",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1562) &sc->cfg->bus_ocp_th);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1563) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1564) dev_err(sc->dev, "failed to read bus-ocp-threshold\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1565) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1566) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1567)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1568) ret = of_property_read_u32(np, "sc,sc8551,ac-ovp-threshold",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1569) &sc->cfg->ac_ovp_th);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1570) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1571) dev_err(sc->dev, "failed to read ac-ovp-threshold\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1572) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1573) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1574)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1575) ret = of_property_read_u32(np, "sc,sc8551,sense-resistor-mohm",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1576) &sc->cfg->sense_r_mohm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1577) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1578) dev_err(sc->dev, "failed to read sense-resistor-mohm\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1579) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1580) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1581)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1582) return 0;
^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) static int sc8551_init_protection(struct sc8551 *sc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1586) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1587) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1588)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1589) ret = sc8551_enable_batovp(sc, !sc->cfg->bat_ovp_disable);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1590) pr_debug("%s bat ovp %s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1591) sc->cfg->bat_ovp_disable ? "disable" : "enable",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1592) !ret ? "successfully" : "failed");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1593)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1594) ret = sc8551_enable_batocp(sc, !sc->cfg->bat_ocp_disable);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1595) pr_debug("%s bat ocp %s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1596) sc->cfg->bat_ocp_disable ? "disable" : "enable",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1597) !ret ? "successfully" : "failed");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1598)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1599) ret = sc8551_enable_busocp(sc, !sc->cfg->bus_ocp_disable);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1600) pr_debug("%s bus ocp %s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1601) sc->cfg->bus_ocp_disable ? "disable" : "enable",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1602) !ret ? "successfully" : "failed");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1603)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1604) ret = sc8551_enable_bat_therm(sc, !sc->cfg->bat_therm_disable);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1605) pr_debug("%s bat therm %s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1606) sc->cfg->bat_therm_disable ? "disable" : "enable",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1607) !ret ? "successfully" : "failed");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1608)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1609) ret = sc8551_enable_bus_therm(sc, !sc->cfg->bus_therm_disable);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1610) pr_debug("%s bus therm %s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1611) sc->cfg->bus_therm_disable ? "disable" : "enable",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1612) !ret ? "successfully" : "failed");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1613)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1614) ret = sc8551_set_batovp_th(sc, sc->cfg->bat_ovp_th);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1615) pr_debug("set bat ovp th %d %s\n", sc->cfg->bat_ovp_th,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1616) !ret ? "successfully" : "failed");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1617)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1618) ret = sc8551_set_batocp_th(sc, sc->cfg->bat_ocp_th);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1619) pr_debug("set bat ocp threshold %d %s\n", sc->cfg->bat_ocp_th,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1620) !ret ? "successfully" : "failed");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1621)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1622) ret = sc8551_set_busovp_th(sc, sc->cfg->bus_ovp_th);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1623) pr_debug("set bus ovp threshold %d %s\n", sc->cfg->bus_ovp_th,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1624) !ret ? "successfully" : "failed");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1625)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1626) ret = sc8551_set_busocp_th(sc, sc->cfg->bus_ocp_th);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1627) pr_debug("set bus ocp threshold %d %s\n", sc->cfg->bus_ocp_th,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1628) !ret ? "successfully" : "failed");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1629)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1630) ret = sc8551_set_acovp_th(sc, sc->cfg->ac_ovp_th);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1631) pr_debug("set ac ovp threshold %d %s\n", sc->cfg->ac_ovp_th,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1632) !ret ? "successfully" : "failed");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1633)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1634) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1635) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1636)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1637) static int sc8551_init_adc(struct sc8551 *sc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1638) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1639) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1640)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1641) ret = sc8551_set_adc_scanrate(sc, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1642) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1643) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1644) ret = sc8551_set_adc_scan(sc, ADC_IBUS, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1645) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1646) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1647) ret = sc8551_set_adc_scan(sc, ADC_VBUS, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1648) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1649) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1650) ret = sc8551_set_adc_scan(sc, ADC_VOUT, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1651) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1652) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1653) ret = sc8551_set_adc_scan(sc, ADC_VBAT, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1654) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1655) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1656) ret = sc8551_set_adc_scan(sc, ADC_IBAT, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1657) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1658) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1659) ret = sc8551_set_adc_scan(sc, ADC_TBUS, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1660) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1661) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1662) ret = sc8551_set_adc_scan(sc, ADC_TBAT, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1663) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1664) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1665) ret = sc8551_set_adc_scan(sc, ADC_TDIE, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1666) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1667) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1668) ret = sc8551_set_adc_scan(sc, ADC_VAC, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1669) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1670) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1671)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1672) ret = sc8551_enable_adc(sc, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1673) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1674) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1675)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1676) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1677) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1678)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1679) static int sc8551_init_int_src(struct sc8551 *sc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1680) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1681) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1682)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1683) /*TODO:be careful ts bus and ts bat alarm bit mask is in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1684) * fault mask register.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1685) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1686) ret = sc8551_set_alarm_int_mask(sc, ADC_DONE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1687) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1688) dev_err(sc->dev, "failed to set alarm mask:%d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1689)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1690) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1691) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1692)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1693) static int sc8551_init_regulation(struct sc8551 *sc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1694) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1695) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1696)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1697) ret = sc8551_set_ibat_reg_th(sc, 300);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1698) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1699) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1700) ret = sc8551_set_vbat_reg_th(sc, 100);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1701) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1702) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1703)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1704) ret = sc8551_set_vdrop_deglitch(sc, 5000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1705) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1706) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1707) ret = sc8551_set_vdrop_th(sc, 400);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1708) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1709) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1710)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1711) ret = sc8551_enable_regulation(sc, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1712) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1713) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1714)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1715) ret = sc8551_write_byte(sc, SC8551_REG_2E, 0x08);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1716) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1717) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1718)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1719) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1720) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1721)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1722) static int sc8551_init_device(struct sc8551 *sc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1723) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1724) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1725)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1726) /* Reset registers to their default values */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1727) ret = sc8551_update_bits(sc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1728) SC8551_REG_0B,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1729) SC8551_REG_RST_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1730) SC8551_REG_RST_ENABLE << SC8551_REG_RST_SHIFT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1731) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1732) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1733) ret = sc8551_enable_wdt(sc, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1734) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1735) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1736) ret = sc8551_set_wdt(sc, 30000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1737) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1738) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1739) ret = sc8551_set_ss_timeout(sc, 100000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1740) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1741) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1742) ret = sc8551_set_sense_resistor(sc, sc->cfg->sense_r_mohm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1743) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1744) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1745) ret = sc8551_init_protection(sc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1746) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1747) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1748) ret = sc8551_init_adc(sc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1749) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1750) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1751) ret = sc8551_init_int_src(sc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1752) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1753) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1754) ret = sc8551_init_regulation(sc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1755) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1756) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1757)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1758) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1759) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1760)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1761) static int sc8551_set_present(struct sc8551 *sc, bool present)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1762) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1763) sc->usb_present = present;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1764)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1765) if (present)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1766) sc8551_init_device(sc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1767) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1768) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1769)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1770) static ssize_t registers_show(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1771) struct device_attribute *attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1772) char *buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1773) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1774) struct sc8551 *sc = dev_get_drvdata(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1775) u8 tmpbuf[SC8551_DEBUG_BUF_LEN];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1776) int idx = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1777) int result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1778) u8 addr, val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1779) int len, ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1780)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1781) ret = sc8551_get_adc_data(sc, ADC_VBAT, &result);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1782) if (!ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1783) sc->vbat_volt = result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1784)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1785) ret = sc8551_get_adc_data(sc, ADC_VAC, &result);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1786) if (!ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1787) sc->vac_volt = result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1788)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1789) ret = sc8551_get_adc_data(sc, ADC_VBUS, &result);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1790) if (!ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1791) sc->vbus_volt = result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1792)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1793) ret = sc8551_get_adc_data(sc, ADC_VOUT, &result);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1794) if (!ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1795) sc->vout_volt = result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1796)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1797) ret = sc8551_get_adc_data(sc, ADC_IBUS, &result);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1798) if (!ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1799) sc->ibus_curr = result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1800)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1801) ret = sc8551_get_adc_data(sc, ADC_TDIE, &result);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1802) if (!ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1803) sc->die_temp = result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1804) ret = sc8551_get_adc_data(sc, ADC_IBAT, &result);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1805) if (!ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1806) sc->ibat_curr = result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1807)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1808) dev_err(sc->dev, "vbus_vol %d vbat_vol(vout) %d vout %d, vac: %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1809) sc->vbus_volt, sc->vbat_volt, sc->vout_volt, sc->vac_volt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1810) dev_err(sc->dev, "ibus_curr %d ibat_curr %d\n", sc->ibus_curr, sc->ibat_curr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1811) dev_err(sc->dev, "die_temp %d\n", sc->die_temp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1812)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1813) for (addr = SC8551_REG_00; addr <= SC8551_REG_36; addr++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1814) ret = sc8551_read_byte(sc, addr, &val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1815) if (ret == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1816) len = snprintf(tmpbuf, SC8551_DEBUG_BUF_LEN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1817) "Reg[%.2X] = 0x%.2x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1818) addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1819) val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1820) memcpy(&buf[idx], tmpbuf, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1821) idx += len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1822) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1823) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1824)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1825) return idx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1826) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1827)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1828) static ssize_t registers_store(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1829) struct device_attribute *attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1830) const char *buf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1831) size_t count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1832) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1833) struct sc8551 *sc = dev_get_drvdata(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1834) unsigned int reg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1835) unsigned int val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1836) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1837)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1838) ret = sscanf(buf, "%x %x", ®, &val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1839) if ((ret == 2) && (reg >= SC8551_REG_00) && (reg <= SC8551_REG_36))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1840) sc8551_write_byte(sc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1841) (unsigned char)reg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1842) (unsigned char)val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1843)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1844) return count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1845) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1846) static DEVICE_ATTR_RW(registers);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1847)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1848) static void sc8551_create_device_node(struct device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1849) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1850) device_create_file(dev, &dev_attr_registers);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1851) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1852)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1853) static enum power_supply_property sc8551_charger_props[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1854) POWER_SUPPLY_PROP_PRESENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1855) POWER_SUPPLY_PROP_STATUS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1856) POWER_SUPPLY_PROP_CP_CHARGING_ENABLED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1857) POWER_SUPPLY_PROP_ONLINE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1858) POWER_SUPPLY_PROP_VOLTAGE_NOW,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1859) POWER_SUPPLY_PROP_CURRENT_NOW,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1860) POWER_SUPPLY_PROP_INPUT_VOLTAGE_LIMIT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1861) POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1862) POWER_SUPPLY_PROP_CP_DIE_TEMPERATURE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1863) POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1864) POWER_SUPPLY_PROP_CP_BAT_OVP_FAULT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1865) POWER_SUPPLY_PROP_CP_BAT_OCP_FAULT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1866) POWER_SUPPLY_PROP_CP_BUS_OVP_FAULT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1867) POWER_SUPPLY_PROP_CP_BUS_OCP_FAULT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1868) POWER_SUPPLY_PROP_CP_VBUS_HERROR_STATUS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1869) POWER_SUPPLY_PROP_CP_VBUS_LERROR_STATUS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1870) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1871)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1872) static int sc8551_charger_get_property(struct power_supply *psy,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1873) enum power_supply_property psp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1874) union power_supply_propval *val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1875) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1876) struct sc8551 *sc = power_supply_get_drvdata(psy);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1877) int result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1878) u8 reg_val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1879) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1880)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1881) sc8551_check_alarm_status(sc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1882) sc8551_check_fault_status(sc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1883) sc8551_check_vbus_error_status(sc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1884) switch (psp) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1885) case POWER_SUPPLY_PROP_CP_CHARGING_ENABLED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1886) sc8551_check_charge_enabled(sc, &sc->charge_enabled);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1887) val->intval = sc->charge_enabled;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1888) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1889) case POWER_SUPPLY_PROP_STATUS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1890) val->intval = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1891) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1892) case POWER_SUPPLY_PROP_PRESENT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1893) val->intval = sc->usb_present;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1894) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1895)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1896) case POWER_SUPPLY_PROP_ONLINE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1897) ret = sc8551_read_byte(sc, SC8551_REG_0D, ®_val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1898) if (!ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1899) sc->vbus_present = !!(reg_val & VBUS_INSERT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1900) val->intval = sc->vbus_present;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1901) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1902) case POWER_SUPPLY_PROP_VOLTAGE_NOW:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1903) ret = sc8551_get_adc_data(sc, ADC_VBAT, &result);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1904) if (!ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1905) sc->vbat_volt = result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1906) val->intval = sc->vbat_volt * 1000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1907) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1908) case POWER_SUPPLY_PROP_CURRENT_NOW:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1909) ret = sc8551_get_adc_data(sc, ADC_IBAT, &result);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1910) if (!ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1911) sc->ibat_curr = result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1912) val->intval = sc->ibat_curr * 1000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1913) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1914) case POWER_SUPPLY_PROP_CP_VBUS: /* BUS_VOLTAGE */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1915) ret = sc8551_get_adc_data(sc, ADC_VBUS, &result);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1916) if (!ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1917) sc->vbus_volt = result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1918) val->intval = sc->vbus_volt * 1000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1919) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1920) case POWER_SUPPLY_PROP_CP_IBUS: /* BUS_CURRENT */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1921) ret = sc8551_get_adc_data(sc, ADC_IBUS, &result);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1922) if (!ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1923) sc->ibus_curr = result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1924) val->intval = sc->ibus_curr * 1000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1925) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1926) case POWER_SUPPLY_PROP_INPUT_VOLTAGE_LIMIT: /* BUS_VOLTAGE */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1927) val->intval = 12000 * 1000; /* 20V */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1928) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1929) case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT: /* BUS_CURRENT */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1930) val->intval = 4500 * 1000; /* 4.75A */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1931) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1932) case POWER_SUPPLY_PROP_CP_DIE_TEMPERATURE:/* DIE_TEMPERATURE */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1933) ret = sc8551_get_adc_data(sc, ADC_TDIE, &result);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1934) if (!ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1935) sc->die_temp = result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1936) val->intval = sc->die_temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1937) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1938) case POWER_SUPPLY_PROP_VOLTAGE_MAX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1939) val->intval = 4300 * 1000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1940) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1941) case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1942) val->intval = 8000 * 1000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1943) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1944)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1945) case POWER_SUPPLY_PROP_CP_BAT_OVP_FAULT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1946) val->intval = sc->bat_ovp_fault;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1947) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1948) case POWER_SUPPLY_PROP_CP_BAT_OCP_FAULT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1949) val->intval = sc->bat_ocp_fault;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1950) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1951) case POWER_SUPPLY_PROP_CP_BUS_OVP_FAULT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1952) val->intval = sc->bus_ovp_fault;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1953) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1954) case POWER_SUPPLY_PROP_CP_BUS_OCP_FAULT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1955) val->intval = sc->bus_ocp_fault;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1956) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1957) case POWER_SUPPLY_PROP_CP_VBUS_HERROR_STATUS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1958) val->intval = (sc->vbus_error >> 0x04) & 0x01;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1959) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1960) case POWER_SUPPLY_PROP_CP_VBUS_LERROR_STATUS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1961) val->intval = (sc->vbus_error >> 0x05) & 0x01;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1962) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1963) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1964) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1965) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1966) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1967) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1968)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1969) static int sc8551_charger_set_property(struct power_supply *psy,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1970) enum power_supply_property prop,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1971) const union power_supply_propval *val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1972) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1973) struct sc8551 *sc = power_supply_get_drvdata(psy);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1974)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1975) switch (prop) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1976) case POWER_SUPPLY_PROP_CP_CHARGING_ENABLED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1977) sc8551_enable_charge(sc, val->intval);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1978) if (val->intval)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1979) sc8551_enable_wdt(sc, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1980) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1981) sc8551_enable_wdt(sc, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1982) sc8551_check_charge_enabled(sc, &sc->charge_enabled);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1983) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1984) case POWER_SUPPLY_PROP_PRESENT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1985) sc8551_set_present(sc, !!val->intval);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1986) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1987) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1988) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1989) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1990)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1991) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1992) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1993)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1994) static int sc8551_charger_is_writeable(struct power_supply *psy,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1995) enum power_supply_property prop)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1996) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1997) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1998)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1999) switch (prop) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2000) case POWER_SUPPLY_PROP_ONLINE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2001) ret = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2002) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2003) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2004) ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2005) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2006) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2007) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2008) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2009)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2010) static int sc8551_psy_register(struct sc8551 *sc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2011) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2012) sc->psy_cfg.drv_data = sc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2013) sc->psy_cfg.of_node = sc->dev->of_node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2014)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2015) sc->psy_desc.name = "sc8551-standalone";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2016)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2017) sc->psy_desc.type = POWER_SUPPLY_TYPE_CHARGE_PUMP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2018) sc->psy_desc.properties = sc8551_charger_props;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2019) sc->psy_desc.num_properties = ARRAY_SIZE(sc8551_charger_props);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2020) sc->psy_desc.get_property = sc8551_charger_get_property;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2021) sc->psy_desc.set_property = sc8551_charger_set_property;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2022) sc->psy_desc.property_is_writeable = sc8551_charger_is_writeable;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2023)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2024) sc->fc2_psy = devm_power_supply_register(sc->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2025) &sc->psy_desc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2026) &sc->psy_cfg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2027) if (IS_ERR(sc->fc2_psy)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2028) dev_err(sc->dev, "failed to register fc2_psy\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2029) return PTR_ERR(sc->fc2_psy);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2030) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2031)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2032) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2033) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2034)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2035) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2036) * interrupt does nothing, just info event change, other module could get info
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2037) * through power supply interface
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2038) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2039) static irqreturn_t sc8551_charger_interrupt(int irq, void *dev_id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2040) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2041) struct sc8551 *sc = dev_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2042) int ret, value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2043)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2044) ret = sc8551_get_adc_data(sc, ADC_VOUT, &value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2045) if (!ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2046) sc->vbat_volt = value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2047)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2048) ret = sc8551_get_adc_data(sc, ADC_IBAT, &value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2049) if (!ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2050) sc->ibat_curr = value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2051)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2052) ret = sc8551_get_adc_data(sc, ADC_VBUS, &value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2053) if (!ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2054) sc->vbus_volt = value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2055)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2056) ret = sc8551_get_adc_data(sc, ADC_IBUS, &value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2057) if (!ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2058) sc->ibus_curr = value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2059)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2060) ret = sc8551_get_adc_data(sc, ADC_TDIE, &value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2061) if (!ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2062) sc->die_temp = value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2063) ret = sc8551_get_adc_data(sc, ADC_IBAT, &value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2064) if (!ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2065) sc->ibat_curr = value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2066)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2067) sc8551_check_alarm_status(sc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2068) sc8551_check_fault_status(sc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2069) sc8551_check_vbus_error_status(sc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2070) power_supply_changed(sc->fc2_psy);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2071)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2072) return IRQ_HANDLED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2073) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2074)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2075) static int sc8551_init_irq(struct sc8551 *sc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2076) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2077) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2078)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2079) sc->irq = sc->client->irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2080) if (sc->irq <= 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2081) dev_err(sc->dev, "irq mapping fail\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2082) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2083) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2084)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2085) ret = devm_request_threaded_irq(sc->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2086) sc->irq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2087) NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2088) sc8551_charger_interrupt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2089) IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2090) "sc8551 standalone irq",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2091) sc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2092) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2093) dev_err(sc->dev, "request irq for irq=%d failed, ret =%d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2094) sc->irq, ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2095)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2096) enable_irq_wake(sc->irq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2097) device_init_wakeup(sc->dev, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2098)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2099) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2100) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2101)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2102) static void determine_initial_status(struct sc8551 *sc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2103) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2104) if (sc->client->irq)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2105) sc8551_charger_interrupt(sc->client->irq, sc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2106) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2107)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2108) static const struct of_device_id sc8551_charger_match[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2109) { .compatible = "sc,sc8551-standalone", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2110) {},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2111) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2112)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2113) static int sc8551_charger_probe(struct i2c_client *client,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2114) const struct i2c_device_id *id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2115) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2116) struct sc8551 *sc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2117) const struct of_device_id *match;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2118) struct device_node *node = client->dev.of_node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2119) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2120)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2121) sc = devm_kzalloc(&client->dev, sizeof(struct sc8551), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2122) if (!sc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2123) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2124)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2125) sc->dev = &client->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2126)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2127) sc->client = client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2128)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2129) mutex_init(&sc->i2c_rw_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2130) mutex_init(&sc->data_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2131)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2132) ret = sc8551_detect_device(sc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2133) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2134) dev_err(sc->dev, "No sc8551 device found!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2135) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2136) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2137)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2138) i2c_set_clientdata(client, sc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2139)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2140) match = of_match_node(sc8551_charger_match, node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2141) if (match == NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2142) dev_err(sc->dev, "device tree match not found!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2143) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2144) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2145) sc8551_get_work_mode(sc, &sc->mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2146) if (sc->mode != SC8551_ROLE_STDALONE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2147) dev_err(sc->dev, "device operation mode mismatch with dts configuration\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2148) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2149) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2150)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2151) ret = sc8551_parse_dt(sc, &client->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2152) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2153) return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2154)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2155) ret = sc8551_init_device(sc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2156) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2157) dev_err(sc->dev, "Failed to init device\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2158) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2159) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2160)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2161) ret = sc8551_psy_register(sc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2162) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2163) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2164)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2165) ret = sc8551_init_irq(sc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2166) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2167) goto err_1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2168)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2169) determine_initial_status(sc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2170) sc8551_create_device_node(&(client->dev));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2171)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2172) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2173)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2174) err_1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2175) power_supply_unregister(sc->fc2_psy);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2176) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2177) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2178)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2179) static int sc8551_charger_remove(struct i2c_client *client)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2180) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2181) struct sc8551 *sc = i2c_get_clientdata(client);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2182)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2183)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2184) sc8551_enable_adc(sc, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2185)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2186) power_supply_unregister(sc->fc2_psy);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2187)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2188) mutex_destroy(&sc->data_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2189) mutex_destroy(&sc->i2c_rw_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2190)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2191) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2192) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2193)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2194) static void sc8551_charger_shutdown(struct i2c_client *client)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2195) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2196) struct sc8551 *sc = i2c_get_clientdata(client);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2197)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2198) sc8551_enable_adc(sc, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2199) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2200)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2201) static const struct i2c_device_id sc8551_charger_id[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2202) {"sc8551-standalone", SC8551_ROLE_STDALONE},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2203) {},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2204) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2205)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2206) static struct i2c_driver sc8551_charger_driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2207) .driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2208) .name = "sc8551-charger",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2209) .owner = THIS_MODULE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2210) .of_match_table = sc8551_charger_match,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2211) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2212) .id_table = sc8551_charger_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2213)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2214) .probe = sc8551_charger_probe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2215) .remove = sc8551_charger_remove,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2216) .shutdown = sc8551_charger_shutdown,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2217) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2218)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2219) module_i2c_driver(sc8551_charger_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2220)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2221) MODULE_AUTHOR("Xu Shengfei <xsf@rock-chips.com>");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2222) MODULE_DESCRIPTION("SC SC8551 Charge Pump Driver");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2223) MODULE_LICENSE("GPL");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2224)