1 /*
2  * Copyright (C) 2020 allwinnertech Ltd.
3  */
4 
5 #include <log.h>
6 #include <sunxi_hal_regulator.h>
7 #include <sunxi_hal_regulator_private.h>
8 #include <sunxi_hal_twi.h>
9 
hal_axp_twi_init(struct regulator_dev * rdev)10 int hal_axp_twi_init(struct regulator_dev *rdev)
11 {
12     unsigned char port = TWI_PORT(rdev->flag);
13     unsigned short addr = AXP_ADDR(rdev->flag);
14 
15     hal_twi_init(port);
16     hal_twi_control(port, I2C_SLAVE, &addr);
17 
18     return 0;
19 }
20 
hal_axp_byte_read(struct regulator_dev * rdev,u8 reg,u8 * reg_val)21 int hal_axp_byte_read(struct regulator_dev *rdev, u8 reg, u8 *reg_val)
22 {
23     unsigned char port = TWI_PORT(rdev->flag);
24     int ret;
25 
26     ret = hal_twi_read(port, reg, reg_val, 1);
27     if (ret > 0)
28         return 0;
29 
30     return ret;
31 }
32 
hal_axp_byte_write(struct regulator_dev * rdev,u8 reg,u8 reg_val)33 int hal_axp_byte_write(struct regulator_dev *rdev, u8 reg, u8 reg_val)
34 {
35     /* hal_twi_write bug workaround */
36     unsigned char port = TWI_PORT(rdev->flag);
37     twi_msg_t msg;
38     uint8_t buf[2];
39 
40     buf[0] = reg;
41     buf[1] = reg_val;
42     msg.flags = 0;
43     msg.addr = AXP_ADDR(rdev->flag);
44     msg.len = 2;
45     msg.buf = buf;
46 
47     return hal_twi_control(port, I2C_RDWR, &msg);
48 }
49 
hal_axp_byte_update(struct regulator_dev * rdev,u8 reg,u8 val,u8 mask)50 int hal_axp_byte_update(struct regulator_dev *rdev, u8 reg, u8 val, u8 mask)
51 {
52     u8 reg_val = 0;
53     int ret = 0;
54 
55     ret = hal_axp_byte_read(rdev, reg, &reg_val);
56     if (ret)
57         goto out;
58 
59     if ((reg_val & mask) != val) {
60         reg_val = (reg_val & ~mask) | (val & mask);
61         ret = hal_axp_byte_write(rdev, reg, reg_val);
62     }
63 
64 out:
65     return ret;
66 }
67