1 /* 2 * (C) Copyright 2024 Rockchip Electronics Co., Ltd. 3 * 4 * SPDX-License-Identifier: GPL-2.0+ 5 */ 6 7 #include <common.h> 8 #include <dm.h> 9 #include <errno.h> 10 #include <irq-generic.h> 11 #include <power/rk801_pmic.h> 12 #include <power/pmic.h> 13 14 DECLARE_GLOBAL_DATA_PTR; 15 16 #if CONFIG_IS_ENABLED(IRQ) 17 static const struct virq_reg rk801_irqs[] = { 18 [RK801_IRQ_PWRON_FALL] = { 19 .mask = RK801_IRQ_PWRON_FALL_MSK, 20 .reg_offset = 0, 21 }, 22 [RK801_IRQ_PWRON_RISE] = { 23 .mask = RK801_IRQ_PWRON_RISE_MSK, 24 .reg_offset = 0, 25 }, 26 }; 27 28 static struct virq_chip rk801_irq_chip = { 29 .status_base = RK801_INT_STS0_REG, 30 .mask_base = RK801_INT_STS0_REG, 31 .num_regs = 1, 32 .read = pmic_reg_read, 33 .write = pmic_reg_write, 34 .irqs = rk801_irqs, 35 .num_irqs = ARRAY_SIZE(rk801_irqs), 36 }; 37 #endif 38 39 static struct reg_data rk801_init_reg[] = { 40 { RK801_SLEEP_CFG_REG, RK801_NONE_FUN, RK801_SLEEP_FUN_MSK }, 41 { RK801_SYS_CFG2_REG, RK801_RST_RESTART_REG, RK801_RST_MSK }, 42 { RK801_INT_CONFIG_REG, RK801_INT_ACT_L, RK801_INT_POL_MSK }, 43 { RK801_POWER_FPWM_EN_REG, RK801_PLDO_HRDEC_EN, RK801_PLDO_HRDEC_EN }, 44 { RK801_BUCK_DEBUG5_REG, 0x54, 0xff }, 45 { RK801_CON_BACK1_REG, 0x18, 0xff }, 46 }; 47 48 static const struct pmic_child_info pmic_children_info[] = { 49 { .prefix = "DCDC", .driver = "rk801_buck"}, 50 { .prefix = "LDO", .driver = "rk801_ldo"}, 51 { .prefix = "SWITCH", .driver = "rk801_switch"}, 52 { }, 53 }; 54 55 static const struct pmic_child_info power_key_info[] = { 56 { .prefix = "pwrkey", .driver = "rk8xx_pwrkey"}, 57 { }, 58 }; 59 60 static int rk801_reg_count(struct udevice *dev) 61 { 62 return RK801_SYS_CFG3_OTP_REG + 1; 63 } 64 65 static int rk801_write(struct udevice *dev, uint reg, const uint8_t *buff, int len) 66 { 67 int ret; 68 69 ret = dm_i2c_write(dev, reg, buff, len); 70 if (ret) { 71 printf("rk801: write reg 0x%02x failed, ret=%d\n", reg, ret); 72 return ret; 73 } 74 75 return 0; 76 } 77 78 static int rk801_read(struct udevice *dev, uint reg, uint8_t *buff, int len) 79 { 80 int ret; 81 82 ret = dm_i2c_read(dev, reg, buff, len); 83 if (ret) { 84 printf("rk801: read reg 0x%02x failed, ret=%d\n", reg, ret); 85 return ret; 86 } 87 88 return 0; 89 } 90 91 static int rk801_shutdown(struct udevice *dev) 92 { 93 int ret; 94 u8 val; 95 96 ret = rk801_read(dev, RK801_SYS_CFG2_REG, &val, 1); 97 if (ret) 98 return ret; 99 100 val |= DEV_OFF; 101 102 return rk801_write(dev, RK801_SYS_CFG2_REG, &val, 1); 103 } 104 105 #if CONFIG_IS_ENABLED(PMIC_CHILDREN) 106 static int rk801_bind(struct udevice *dev) 107 { 108 ofnode regulators_node; 109 int children; 110 111 regulators_node = dev_read_subnode(dev, "regulators"); 112 if (!ofnode_valid(regulators_node)) 113 return -ENXIO; 114 115 children = pmic_bind_children(dev, regulators_node, pmic_children_info); 116 if (!children) 117 debug("%s: %s - no child found\n", __func__, dev->name); 118 119 children = pmic_bind_children(dev, dev->node, power_key_info); 120 if (!children) 121 debug("%s: %s - no child found\n", __func__, dev->name); 122 123 return 0; 124 } 125 #endif 126 127 static int rk801_ofdata_to_platdata(struct udevice *dev) 128 { 129 #if CONFIG_IS_ENABLED(IRQ) 130 struct rk801_priv *priv = dev_get_priv(dev); 131 u32 interrupt, phandle; 132 int ret; 133 134 phandle = dev_read_u32_default(dev, "interrupt-parent", -ENODATA); 135 if (phandle == -ENODATA) { 136 printf("Read 'interrupt-parent' failed, ret=%d\n", phandle); 137 return phandle; 138 } 139 140 ret = dev_read_u32_array(dev, "interrupts", &interrupt, 1); 141 if (ret) { 142 printf("Read 'interrupts' failed, ret=%d\n", ret); 143 return ret; 144 } 145 146 priv->irq = phandle_gpio_to_irq(phandle, interrupt); 147 if (priv->irq < 0) { 148 printf("priv to request rk801 irq, ret=%d\n", priv->irq); 149 return priv->irq; 150 } 151 #endif 152 153 return 0; 154 } 155 156 static int rk801_probe(struct udevice *dev) 157 { 158 struct rk801_priv *priv = dev_get_priv(dev); 159 uint8_t msb, lsb, on, off; 160 u32 pmic_id; 161 int i, ret; 162 163 ret = rk801_read(dev, RK801_ID_MSB, &msb, 1); 164 if (ret) 165 return ret; 166 167 ret = rk801_read(dev, RK801_ID_LSB, &lsb, 1); 168 if (ret) 169 return ret; 170 171 pmic_id = (msb << 8) | lsb; 172 priv->variant = pmic_id & RK8XX_ID_MSK; 173 priv->req_pwrctrl_dvs = (lsb & 0x0f) < 3; 174 if (priv->req_pwrctrl_dvs) { 175 /* GPIOD_IS_OUT: output inactive */ 176 ret = gpio_request_by_name(dev, "pwrctrl-gpios", 0, 177 &priv->pwrctrl_gpio, GPIOD_IS_OUT); 178 if (ret) { 179 printf("rk801: failed to get pwrctrl-gpio, ret=%d\n", ret); 180 return ret; 181 } 182 } 183 184 rk801_read(dev, RK801_ON_SOURCE_REG, &on, 1); 185 rk801_read(dev, RK801_OFF_SOURCE_REG, &off, 1); 186 187 printf("PMIC: RK%x (on=0x%02x, off=0x%02x, req_dvs: %d, act: %s)\n", 188 pmic_id, on, off, priv->req_pwrctrl_dvs, 189 priv->pwrctrl_gpio.flags & GPIOD_ACTIVE_LOW ? "low" : "high"); 190 191 for (i = 0; i < ARRAY_SIZE(rk801_init_reg); i++) { 192 ret = pmic_clrsetbits(dev, 193 rk801_init_reg[i].reg, 194 rk801_init_reg[i].mask, 195 rk801_init_reg[i].val); 196 if (ret < 0) { 197 printf("rk801: set reg 0x%x failed, ret=%d\n", 198 rk801_init_reg[i].reg, ret); 199 } 200 } 201 202 #if CONFIG_IS_ENABLED(IRQ) 203 priv->irq_chip = &rk801_irq_chip; 204 ret = virq_add_chip(dev, priv->irq_chip, priv->irq); 205 if (ret) { 206 printf("rk801: failed to add irqchip(irq=%d), ret=%d\n", 207 priv->irq, ret); 208 return ret; 209 } 210 #endif 211 return 0; 212 } 213 214 static struct dm_pmic_ops rk801_ops = { 215 .reg_count = rk801_reg_count, 216 .read = rk801_read, 217 .write = rk801_write, 218 .shutdown = rk801_shutdown, 219 }; 220 221 static const struct udevice_id rk801_ids[] = { 222 { .compatible = "rockchip,rk801" }, 223 { } 224 }; 225 226 U_BOOT_DRIVER(pmic_rk801) = { 227 .name = "rk801 pmic", 228 .id = UCLASS_PMIC, 229 .of_match = rk801_ids, 230 #if CONFIG_IS_ENABLED(PMIC_CHILDREN) 231 .bind = rk801_bind, 232 #endif 233 .ofdata_to_platdata = rk801_ofdata_to_platdata, 234 .priv_auto_alloc_size = sizeof(struct rk801_priv), 235 .probe = rk801_probe, 236 .ops = &rk801_ops, 237 }; 238 239