1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * Copyright (c) 2019 Fuzhou Rockchip Electronics Co., Ltd 4 */ 5 6 #include <common.h> 7 #include <dm.h> 8 #include <errno.h> 9 #include <i2c.h> 10 #include <dm/pinctrl.h> 11 #include <dm/uclass.h> 12 #include <dm/uclass-id.h> 13 14 #include "rk1000.h" 15 16 #define CTRL_ADC 0x00 17 #define ADC_OFF 0x88 18 #define CTRL_CODEC 0x01 19 #define CODEC_OFF 0x0d 20 #define CTRL_I2C 0x02 21 #define I2C_TIMEOUT_PERIOD 0x22 22 #define CTRL_TVE 0x03 23 #define TVE_OFF 0x00 24 25 int rk1000_ctl_i2c_write(struct rk1000_ctl *rk1000_ctl, u8 reg, u8 val) 26 { 27 struct dm_i2c_chip *chip = dev_get_parent_platdata(rk1000_ctl->dev); 28 struct i2c_msg msg; 29 u8 buf[2]; 30 int ret; 31 32 buf[0] = reg; 33 buf[1] = val; 34 msg.addr = chip->chip_addr; 35 msg.flags = 0; 36 msg.len = 2; 37 msg.buf = buf; 38 39 ret = dm_i2c_xfer(rk1000_ctl->dev, &msg, 1); 40 if (ret) { 41 dev_err(rk1000_ctl->dev, "rk1000 ctrl i2c write failed: %d\n", 42 ret); 43 return ret; 44 } 45 46 return 0; 47 } 48 49 int rk1000_ctl_i2c_read(struct rk1000_ctl *rk1000_ctl, u8 reg, u8 *val) 50 { 51 struct dm_i2c_chip *chip = dev_get_parent_platdata(rk1000_ctl->dev); 52 u8 data; 53 struct i2c_msg msg[] = { 54 { 55 .addr = chip->chip_addr, 56 .flags = 0, 57 .buf = (u8 *)®, 58 .len = 1, 59 }, { 60 .addr = chip->chip_addr, 61 .flags = I2C_M_RD, 62 .buf = (u8 *)&data, 63 .len = 1, 64 } 65 }; 66 int ret; 67 68 ret = dm_i2c_xfer(rk1000_ctl->dev, msg, 2); 69 if (ret) { 70 dev_err(rk1000_ctl->dev, "rk1000 ctrl i2c read failed: %d\n", 71 ret); 72 return ret; 73 } 74 75 *val = data; 76 77 return 0; 78 } 79 80 int rk1000_ctl_write_block(struct rk1000_ctl *rk1000_ctl, 81 u8 reg, const u8 *buf, u8 len) 82 { 83 int i, ret; 84 85 for (i = 0; i < len; i++) { 86 ret = rk1000_ctl_i2c_write(rk1000_ctl, reg + i, buf[i]); 87 if (ret) 88 break; 89 } 90 91 return ret; 92 } 93 94 static int rk1000_ctl_probe(struct udevice *dev) 95 { 96 struct rk1000_ctl *rk1000_ctl = dev_get_priv(dev); 97 int ret; 98 99 rk1000_ctl->dev = dev; 100 101 ret = gpio_request_by_name(dev, "reset-gpios", 0, 102 &rk1000_ctl->reset_gpio, GPIOD_IS_OUT); 103 if (ret) { 104 dev_err(dev, "Cannot get reset GPIO: %d\n", ret); 105 return ret; 106 } 107 108 ret = clk_get_by_name(dev, "mclk", &rk1000_ctl->mclk); 109 if (ret < 0) { 110 dev_err(dev, "failed to get clkin: %d\n", ret); 111 return ret; 112 } 113 114 clk_enable(&rk1000_ctl->mclk); 115 116 pinctrl_select_state(rk1000_ctl->dev, "default"); 117 118 dm_gpio_set_value(&rk1000_ctl->reset_gpio, 0); 119 mdelay(1); 120 dm_gpio_set_value(&rk1000_ctl->reset_gpio, 1); 121 mdelay(1); 122 dm_gpio_set_value(&rk1000_ctl->reset_gpio, 0); 123 124 return 0; 125 } 126 127 static const struct udevice_id rk1000_ctl_of_match[] = { 128 { .compatible = "rockchip,rk1000-ctl" }, 129 {} 130 }; 131 132 U_BOOT_DRIVER(rk1000) = { 133 .name = "rk1000_ctl", 134 .id = UCLASS_I2C_GENERIC, 135 .of_match = rk1000_ctl_of_match, 136 .probe = rk1000_ctl_probe, 137 .bind = dm_scan_fdt_dev, 138 .priv_auto_alloc_size = sizeof(struct rk1000_ctl), 139 }; 140