Angel Pons | e67ab18 | 2020-04-04 18:51:11 +0200 | [diff] [blame] | 1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
henryc.chen | 0bb292e | 2016-03-02 15:51:44 +0800 | [diff] [blame] | 2 | |
| 3 | #include <console/console.h> |
Nico Huber | 0f2dd1e | 2017-08-01 14:02:40 +0200 | [diff] [blame] | 4 | #include <device/i2c_simple.h> |
henryc.chen | 0bb292e | 2016-03-02 15:51:44 +0800 | [diff] [blame] | 5 | #include <soc/da9212.h> |
| 6 | |
| 7 | enum { |
| 8 | DA9212_SLAVE_ADDR = 0x68, |
| 9 | }; |
| 10 | |
| 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, "ERROR: %s failed\n", __func__); |
| 50 | |
| 51 | } |
| 52 | |
| 53 | void da9212_probe(uint8_t i2c_num) |
| 54 | { |
| 55 | int ret = 0; |
| 56 | unsigned char device_id = 0; |
| 57 | unsigned char variant_id = 0; |
| 58 | |
henryc.chen | 0bb292e | 2016-03-02 15:51:44 +0800 | [diff] [blame] | 59 | /* select to page 4, clear REVERT at first time */ |
| 60 | ret |= i2c_write_field(i2c_num, DA9212_SLAVE_ADDR, |
| 61 | DA9212_REG_PAGE_CON, DA9212_REG_PAGE4, |
| 62 | 0xF, DA9212_REG_PAGE_SHIFT); |
| 63 | |
| 64 | ret |= i2c_read_field(i2c_num, DA9212_SLAVE_ADDR, |
| 65 | DA9212_REG_DEVICE_ID, &device_id, |
| 66 | 0xFF, 0); |
| 67 | |
| 68 | ret |= i2c_read_field(i2c_num, DA9212_SLAVE_ADDR, |
| 69 | DA9212_REG_VARIANT_ID, &variant_id, |
| 70 | 0xFF, 0); |
| 71 | |
| 72 | printk(BIOS_INFO, "%s: device ID = %#x, variant ID = %#x\n", __func__, |
| 73 | device_id, variant_id); |
| 74 | |
| 75 | /* Check device ID is DA9212 */ |
| 76 | if (device_id != DA9212_ID || ret) { |
| 77 | printk(BIOS_ERR, "ERROR: unknown DA9212 device_id\n"); |
| 78 | return; |
| 79 | } |
| 80 | |
| 81 | da9212_hw_init(i2c_num, variant_id); |
| 82 | } |