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_SLEEP_ACT_H, RK801_SLEEP_POL_MSK }, 42 { RK801_SYS_CFG2_REG, RK801_RST_RESTART_REG, RK801_RST_MSK }, 43 { RK801_INT_CONFIG_REG, RK801_INT_ACT_L, RK801_INT_POL_MSK }, 44 { RK801_POWER_FPWM_EN_REG, RK801_PLDO_HRDEC_EN, RK801_PLDO_HRDEC_EN }, 45 { RK801_BUCK_DEBUG5_REG, 0x54, 0xff }, 46 { RK801_CON_BACK1_REG, 0x18, 0xff }, 47 }; 48 49 static const struct pmic_child_info pmic_children_info[] = { 50 { .prefix = "DCDC", .driver = "rk801_buck"}, 51 { .prefix = "LDO", .driver = "rk801_ldo"}, 52 { .prefix = "SWITCH", .driver = "rk801_switch"}, 53 { }, 54 }; 55 56 static const struct pmic_child_info power_key_info[] = { 57 { .prefix = "pwrkey", .driver = "rk8xx_pwrkey"}, 58 { }, 59 }; 60 61 static int rk801_reg_count(struct udevice *dev) 62 { 63 return RK801_SYS_CFG3_OTP_REG + 1; 64 } 65 66 static int rk801_write(struct udevice *dev, uint reg, const uint8_t *buff, int len) 67 { 68 int ret; 69 70 ret = dm_i2c_write(dev, reg, buff, len); 71 if (ret) { 72 printf("rk801: write reg 0x%02x failed, ret=%d\n", reg, ret); 73 return ret; 74 } 75 76 return 0; 77 } 78 79 static int rk801_read(struct udevice *dev, uint reg, uint8_t *buff, int len) 80 { 81 int ret; 82 83 ret = dm_i2c_read(dev, reg, buff, len); 84 if (ret) { 85 printf("rk801: read reg 0x%02x failed, ret=%d\n", reg, ret); 86 return ret; 87 } 88 89 return 0; 90 } 91 92 static int rk801_shutdown(struct udevice *dev) 93 { 94 int ret; 95 u8 val; 96 97 ret = rk801_read(dev, RK801_SYS_CFG2_REG, &val, 1); 98 if (ret) 99 return ret; 100 101 val |= DEV_OFF; 102 103 return rk801_write(dev, RK801_SYS_CFG2_REG, &val, 1); 104 } 105 106 #if CONFIG_IS_ENABLED(PMIC_CHILDREN) 107 static int rk801_bind(struct udevice *dev) 108 { 109 ofnode regulators_node; 110 int children; 111 112 regulators_node = dev_read_subnode(dev, "regulators"); 113 if (!ofnode_valid(regulators_node)) 114 return -ENXIO; 115 116 children = pmic_bind_children(dev, regulators_node, pmic_children_info); 117 if (!children) 118 debug("%s: %s - no child found\n", __func__, dev->name); 119 120 children = pmic_bind_children(dev, dev->node, power_key_info); 121 if (!children) 122 debug("%s: %s - no child found\n", __func__, dev->name); 123 124 return 0; 125 } 126 #endif 127 128 static int rk801_ofdata_to_platdata(struct udevice *dev) 129 { 130 #if CONFIG_IS_ENABLED(IRQ) 131 struct rk801_priv *priv = dev_get_priv(dev); 132 u32 interrupt, phandle; 133 int ret; 134 135 phandle = dev_read_u32_default(dev, "interrupt-parent", -ENODATA); 136 if (phandle == -ENODATA) { 137 printf("Read 'interrupt-parent' failed, ret=%d\n", phandle); 138 return phandle; 139 } 140 141 ret = dev_read_u32_array(dev, "interrupts", &interrupt, 1); 142 if (ret) { 143 printf("Read 'interrupts' failed, ret=%d\n", ret); 144 return ret; 145 } 146 147 priv->irq = phandle_gpio_to_irq(phandle, interrupt); 148 if (priv->irq < 0) { 149 printf("priv to request rk801 irq, ret=%d\n", priv->irq); 150 return priv->irq; 151 } 152 #endif 153 154 return 0; 155 } 156 157 static int rk801_probe(struct udevice *dev) 158 { 159 struct rk801_priv *priv = dev_get_priv(dev); 160 uint8_t msb, lsb, on, off; 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 priv->variant = ((msb << 8) | lsb) & RK8XX_ID_MSK; 172 priv->req_pwrctrl_dvs = (lsb & 0x0f) < 4; 173 174 rk801_read(dev, RK801_ON_SOURCE_REG, &on, 1); 175 rk801_read(dev, RK801_OFF_SOURCE_REG, &off, 1); 176 177 printf("PMIC: RK%x (on=0x%02x, off=0x%02x, req_dvs=%d)\n", 178 priv->variant, on, off, priv->req_pwrctrl_dvs); 179 180 if (priv->req_pwrctrl_dvs) { 181 ret = gpio_request_by_name(dev, "pwrctrl-gpios", 0, 182 &priv->pwrctrl_gpio, GPIOD_IS_OUT); 183 if (ret) { 184 printf("failed to get pwrctrl gpio! ret=%d\n", ret); 185 return ret; 186 } 187 } 188 189 for (i = 0; i < ARRAY_SIZE(rk801_init_reg); i++) { 190 ret = pmic_clrsetbits(dev, 191 rk801_init_reg[i].reg, 192 rk801_init_reg[i].mask, 193 rk801_init_reg[i].val); 194 if (ret < 0) { 195 printf("rk801: set reg 0x%x failed, ret=%d\n", 196 rk801_init_reg[i].reg, ret); 197 } 198 } 199 200 #if CONFIG_IS_ENABLED(IRQ) 201 priv->irq_chip = &rk801_irq_chip; 202 ret = virq_add_chip(dev, priv->irq_chip, priv->irq); 203 if (ret) { 204 printf("rk801: failed to add irqchip(irq=%d), ret=%d\n", 205 priv->irq, ret); 206 return ret; 207 } 208 #endif 209 return 0; 210 } 211 212 static struct dm_pmic_ops rk801_ops = { 213 .reg_count = rk801_reg_count, 214 .read = rk801_read, 215 .write = rk801_write, 216 .shutdown = rk801_shutdown, 217 }; 218 219 static const struct udevice_id rk801_ids[] = { 220 { .compatible = "rockchip,rk801" }, 221 { } 222 }; 223 224 U_BOOT_DRIVER(pmic_rk801) = { 225 .name = "rk801 pmic", 226 .id = UCLASS_PMIC, 227 .of_match = rk801_ids, 228 #if CONFIG_IS_ENABLED(PMIC_CHILDREN) 229 .bind = rk801_bind, 230 #endif 231 .ofdata_to_platdata = rk801_ofdata_to_platdata, 232 .priv_auto_alloc_size = sizeof(struct rk801_priv), 233 .probe = rk801_probe, 234 .ops = &rk801_ops, 235 }; 236 237