1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * Copyright (c) 2024 Rockchip Electronics Co., Ltd. 4 */ 5 6 #include <common.h> 7 #include <asm/gpio.h> 8 #include <dm.h> 9 #include <dm/lists.h> 10 #include <dm/device-internal.h> 11 #include <dm/of_access.h> 12 #include <dm/pinctrl.h> 13 #include <i2c.h> 14 #include <power/pmic.h> 15 #include <power/regulator.h> 16 #include <power/fp9931.h> 17 18 DECLARE_GLOBAL_DATA_PTR; 19 20 static const struct pmic_child_info pmic_children_info[] = { 21 { .prefix = "vcom", .driver = FP9931_VCOM_DRIVER_NAME }, 22 { .prefix = "vpos_vneg", .driver = FP9931_VPOS_VNEG_DRIVER_NAME }, 23 { }, 24 }; 25 26 static const struct pmic_child_info thermal_child_info[] = { 27 { .prefix = "fp9931_thermal", .driver = FP9931_THERMAL_COMTATIBLE_NAME }, 28 { }, 29 }; 30 31 static int fp9931_reg_count(struct udevice *dev) 32 { 33 return fp9931_REG_MAX; 34 } 35 36 static int fp9931_write(struct udevice *dev, uint reg, const uint8_t *buff, int len) 37 { 38 int ret; 39 40 ret = dm_i2c_write(dev, reg, buff, len); 41 if (ret) { 42 pr_err("fp9931 failed to write register: %#x, ret:%d\n", reg, ret); 43 return ret; 44 } 45 46 return 0; 47 } 48 49 static int fp9931_read(struct udevice *dev, uint reg, uint8_t *buff, int len) 50 { 51 int ret; 52 53 ret = dm_i2c_read(dev, reg, buff, len); 54 if (ret) { 55 pr_err("fp9931 failed to write register: %#x, ret:%d\n", reg, ret); 56 return ret; 57 } 58 59 return 0; 60 } 61 62 static int pmic_fp9931_probe(struct udevice *dev) 63 { 64 struct fp9931_plat_data *data = dev_get_platdata(dev); 65 uint8_t val; 66 int ret; 67 68 ret = gpio_request_list_by_name(dev, "power-gpios", data->power_gpio, 4, 69 GPIOD_IS_OUT | GPIOD_IS_OUT_ACTIVE); 70 if (ret < 0) 71 dev_warn(dev, "fp9931 failed to get power gpios:%d\n", ret); 72 73 data->num_power_gpio = ret; 74 75 ret = gpio_request_by_name(dev, "enable-gpios", 0, &data->enable_gpio, GPIOD_IS_OUT); 76 if (ret) { 77 dev_err(dev, "fp9931 failed to get enable gpios:%d\n", ret); 78 return ret; 79 } 80 81 /* After power on, fp9931 requires 1ms delay time to enter active mode */ 82 udelay(1100); 83 84 /* check is device i2c present */ 85 ret = dm_i2c_read(dev, FP9931_VCOM_SETTING, &val, 1); 86 if (ret) { 87 dev_warn(dev, "fp9931 i2c not present: %d\n", ret); 88 return ret; 89 } 90 91 return 0; 92 } 93 94 static int pmic_fp9931_bind(struct udevice *dev) 95 { 96 ofnode regulators_node; 97 int children; 98 99 regulators_node = dev_read_subnode(dev, "regulators"); 100 if (!ofnode_valid(regulators_node)) { 101 dev_err(dev, "Regulators subnode not found!"); 102 return -ENXIO; 103 } 104 105 children = pmic_bind_children(dev, regulators_node, pmic_children_info); 106 if (!children) 107 dev_err(dev, "Failed to bind fp9931 regulator\n"); 108 109 children = pmic_bind_children(dev, dev->node, thermal_child_info); 110 if (!children) 111 dev_err(dev, "Failed to bind fp9931 thermal\n"); 112 113 return 0; 114 } 115 116 static struct dm_pmic_ops fp9931_ops = { 117 .reg_count = fp9931_reg_count, 118 .read = fp9931_read, 119 .write = fp9931_write, 120 }; 121 122 static const struct udevice_id pmic_fp9931_of_match[] = { 123 { .compatible = "fitipower,fp9931-pmic" }, 124 { } 125 }; 126 127 U_BOOT_DRIVER(pmic_fp9931) = { 128 .name = "pmic_fp9931", 129 .id = UCLASS_PMIC, 130 .of_match = pmic_fp9931_of_match, 131 .probe = pmic_fp9931_probe, 132 .ops = &fp9931_ops, 133 .bind = pmic_fp9931_bind, 134 .platdata_auto_alloc_size = sizeof(struct fp9931_plat_data), 135 }; 136