1 /* 2 **Copyright (C) 2021 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/rk8xx_pmic.h> 12 #include <power/pmic.h> 13 #include <spi.h> 14 15 DECLARE_GLOBAL_DATA_PTR; 16 17 #define RK806_CHIP_NAME 0x5A 18 #define RK806_CHIP_VER 0x5B 19 20 #define RK806_CMD_READ 0 21 #define RK806_CMD_WRITE BIT(7) 22 #define RK806_CMD_CRC_EN BIT(6) 23 #define RK806_CMD_CRC_DIS 0 24 #define RK806_CMD_LEN_MSK 0x0f 25 #define RK806_REG_H 0x00 26 27 static const struct pmic_child_info pmic_children_info[] = { 28 { .prefix = "DCDC", .driver = "rk8xx_spi_buck"}, 29 { .prefix = "NLDO", .driver = "rk8xx_spi_ldo"}, 30 { .prefix = "PLDO", .driver = "rk8xx_spi_pldo"}, 31 { }, 32 }; 33 34 static int _spi_read(struct udevice *dev, u32 reg, u8 *buffer, int len) 35 { 36 struct rk8xx_priv *priv = dev_get_priv(dev); 37 u8 txbuf[3]; 38 int ret; 39 40 if (spi_claim_bus(priv->slave)) 41 return -EBUSY; 42 43 txbuf[0] = RK806_CMD_READ; 44 txbuf[1] = reg; 45 txbuf[2] = RK806_REG_H; 46 47 ret = spi_write_then_read(priv->slave, txbuf, 3, NULL, buffer, 1); 48 spi_release_bus(priv->slave); 49 50 return ret; 51 } 52 53 static int _spi_write(struct udevice *dev, uint reg, const u8 *buffer, int len) 54 { 55 struct rk8xx_priv *priv = dev_get_priv(dev); 56 u8 txbuf[4]; 57 int ret; 58 59 if (len < 1) { 60 dev_err(dev, "rk806 write error: len < 1\n"); 61 return -EINVAL; 62 } 63 64 if (spi_claim_bus(priv->slave)) 65 return -EBUSY; 66 67 txbuf[0] = RK806_CMD_WRITE; 68 txbuf[1] = reg; 69 txbuf[2] = RK806_REG_H; 70 txbuf[3] = *buffer; 71 72 ret = spi_write_then_read(priv->slave, txbuf, 4, NULL, NULL, 0); 73 spi_release_bus(priv->slave); 74 75 return ret; 76 } 77 78 static int rk806_spi_read(struct udevice *dev, 79 uint reg, 80 u8 *buffer, 81 int len) 82 { 83 int ret; 84 85 ret = _spi_read(dev, reg, buffer, len); 86 if (ret) 87 dev_err(dev, "rk806 read reg(0x%x) error: %d\n", reg, ret); 88 89 return ret; 90 } 91 92 static int rk806_spi_write(struct udevice *dev, 93 uint reg, 94 const u8 *buffer, 95 int len) 96 { 97 int ret; 98 99 ret = _spi_write(dev, reg, buffer, len); 100 if (ret) 101 dev_err(dev, "rk806 write reg(0x%x) error: %d\n", reg, ret); 102 103 return ret; 104 } 105 106 static int rk8xx_spi_reg_count(struct udevice *dev) 107 { 108 return 0xff; 109 } 110 111 #if CONFIG_IS_ENABLED(PMIC_CHILDREN) 112 static int rk8xx_spi_bind(struct udevice *dev) 113 { 114 ofnode regulators_node; 115 int children; 116 117 regulators_node = dev_read_subnode(dev, "regulators"); 118 if (!ofnode_valid(regulators_node)) { 119 debug("%s: %s regulators subnode not found!\n", __func__, 120 dev->name); 121 return -ENXIO; 122 } 123 124 children = pmic_bind_children(dev, regulators_node, pmic_children_info); 125 if (!children) 126 debug("%s: %s - no child found\n", __func__, dev->name); 127 128 return 0; 129 } 130 #endif 131 132 static int rk8xx_spi_probe(struct udevice *dev) 133 { 134 struct dm_spi_slave_platdata *plat = dev_get_parent_platdata(dev); 135 struct rk8xx_priv *priv = dev_get_priv(dev); 136 struct udevice *spi = dev_get_parent(dev); 137 struct spi_slave *slave = NULL; 138 u8 msb, lsb; 139 int ret; 140 141 if (spi->seq < 0) { 142 dev_err(dev, "Failed to configure the spi num\n"); 143 return -EINVAL; 144 } 145 146 slave = spi_setup_slave(spi->seq, plat->cs, plat->max_hz, 147 plat->mode); 148 if (!slave) 149 return -ENODEV; 150 priv->slave = slave; 151 152 /* read Chip variant */ 153 ret = rk806_spi_read(dev, RK806_CHIP_NAME, &msb, 1); 154 if (msb < 0) { 155 dev_err(dev, "rk806 name read error: %d\n", ret); 156 return ret; 157 } 158 159 ret = rk806_spi_read(dev, RK806_CHIP_VER, &lsb, 1); 160 if (lsb < 0) { 161 dev_err(dev, "rk806 version read error: %d\n", ret); 162 return ret; 163 } 164 165 priv->variant = ((msb << 8) | lsb) & RK8XX_ID_MSK; 166 printf("spi%d: RK%x%x: %d\n", spi->seq, msb, (lsb >> 4), lsb & 0x0f); 167 168 return 0; 169 } 170 171 static struct dm_pmic_ops rk8xx_spi_ops = { 172 .reg_count = rk8xx_spi_reg_count, 173 .read = rk806_spi_read, 174 .write = rk806_spi_write, 175 }; 176 177 static const struct udevice_id rk8xx_spi_ids[] = { 178 { .compatible = "rockchip,rk806" }, 179 { } 180 }; 181 182 U_BOOT_DRIVER(pmic_rk8xx_spi) = { 183 .name = "rk806-pmic", 184 .id = UCLASS_PMIC, 185 .of_match = rk8xx_spi_ids, 186 #if CONFIG_IS_ENABLED(PMIC_CHILDREN) 187 .bind = rk8xx_spi_bind, 188 #endif 189 .priv_auto_alloc_size = sizeof(struct rk8xx_priv), 190 .probe = rk8xx_spi_probe, 191 .ops = &rk8xx_spi_ops, 192 }; 193