xref: /aosp_15_r20/external/coreboot/src/soc/mediatek/mt8173/da9212.c (revision b9411a12aaaa7e1e6a6fb7c5e057f44ee179a49c)
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #include <console/console.h>
4 #include <device/i2c_simple.h>
5 #include <soc/da9212.h>
6 
7 enum {
8 	DA9212_SLAVE_ADDR = 0x68,
9 };
10 
da9212_hw_init(uint8_t i2c_num,unsigned char variant_id)11 static void da9212_hw_init(uint8_t i2c_num, unsigned char variant_id)
12 {
13 	int ret = 0;
14 	int buck_mode = DA9212_BUCK_MODE_AUTO;
15 
16 	if (variant_id == DA9212_VARIANT_ID_AB)
17 		buck_mode = DA9212_BUCK_MODE_PWM;
18 
19 	/* page select to 0 */
20 	ret |= i2c_write_field(i2c_num, DA9212_SLAVE_ADDR,
21 			       DA9212_REG_PAGE_CON, DA9212_REG_PAGE0,
22 			       DA9212_REG_PAGE_MASK, DA9212_REG_PAGE_SHIFT);
23 
24 	ret |= i2c_write_field(i2c_num, DA9212_SLAVE_ADDR,
25 			       DA9212_REG_BUCKA_CONT, DA9212_BUCK_GPI_GPIO1,
26 			       DA9212_BUCK_GPI_MASK, DA9212_BUCK_GPI_SHIFT);
27 
28 	ret |= i2c_write_field(i2c_num, DA9212_SLAVE_ADDR,
29 			       DA9212_REG_BUCKB_CONT, DA9212_BUCK_GPI_OFF,
30 			       DA9212_BUCK_GPI_OFF, DA9212_BUCK_GPI_SHIFT);
31 
32 	ret |= i2c_write_field(i2c_num, DA9212_SLAVE_ADDR,
33 			       DA9212_REG_BUCKA_CONT, DA9212_VBUCK_SEL_A,
34 			       DA9212_VBUCK_SEL_MASK, DA9212_VBUCK_SEL_SHIFT);
35 
36 	ret |= i2c_write_field(i2c_num, DA9212_SLAVE_ADDR,
37 			       DA9212_REG_BUCKB_CONT, DA9212_VBUCK_SEL_A,
38 			       DA9212_VBUCK_SEL_MASK, DA9212_VBUCK_SEL_SHIFT);
39 
40 	ret |= i2c_write_field(i2c_num, DA9212_SLAVE_ADDR,
41 			       DA9212_REG_BUCKA_CONF, buck_mode,
42 			       DA9212_BUCK_MODE_MASK, DA9212_BUCK_MODE_SHIFT);
43 
44 	ret |= i2c_write_field(i2c_num, DA9212_SLAVE_ADDR,
45 			       DA9212_REG_BUCKB_CONF, buck_mode,
46 			       DA9212_BUCK_MODE_MASK, DA9212_BUCK_MODE_SHIFT);
47 
48 	if (ret)
49 		printk(BIOS_ERR, "%s failed\n", __func__);
50 }
51 
da9212_probe(uint8_t i2c_num)52 void da9212_probe(uint8_t i2c_num)
53 {
54 	int ret = 0;
55 	unsigned char device_id = 0;
56 	unsigned char variant_id = 0;
57 
58 	/* select to page 4, clear REVERT at first time */
59 	ret |= i2c_write_field(i2c_num, DA9212_SLAVE_ADDR,
60 			       DA9212_REG_PAGE_CON, DA9212_REG_PAGE4,
61 			       0xF, DA9212_REG_PAGE_SHIFT);
62 
63 	ret |= i2c_read_field(i2c_num, DA9212_SLAVE_ADDR,
64 			      DA9212_REG_DEVICE_ID, &device_id,
65 			      0xFF, 0);
66 
67 	ret |= i2c_read_field(i2c_num, DA9212_SLAVE_ADDR,
68 			      DA9212_REG_VARIANT_ID, &variant_id,
69 			      0xFF, 0);
70 
71 	printk(BIOS_INFO, "%s: device ID = %#x, variant ID = %#x\n", __func__,
72 	       device_id, variant_id);
73 
74 	/* Check device ID is DA9212 */
75 	if (device_id != DA9212_ID || ret) {
76 		printk(BIOS_ERR, "unknown DA9212 device_id\n");
77 		return;
78 	}
79 
80 	da9212_hw_init(i2c_num, variant_id);
81 }
82