1 // SPDX-License-Identifier: GPL-2.0+ 2 /* 3 * (C) Copyright 2022 Rockchip Electronics Co., Ltd 4 */ 5 6 #include <asm-generic/gpio.h> 7 #include <common.h> 8 #include <dm.h> 9 #include <errno.h> 10 #include <i2c.h> 11 #include <max96745.h> 12 13 struct max96745_priv { 14 struct udevice *dev; 15 struct gpio_desc enable_gpio; 16 }; 17 18 static int max96745_select(struct udevice *mux, struct udevice *bus, 19 uint channel) 20 { 21 if (channel == 1) 22 dm_i2c_reg_clrset(mux, 0x0086, DIS_REM_CC, 23 FIELD_PREP(DIS_REM_CC, 0)); 24 else 25 dm_i2c_reg_clrset(mux, 0x0076, DIS_REM_CC, 26 FIELD_PREP(DIS_REM_CC, 0)); 27 28 return 0; 29 } 30 31 static int max96745_deselect(struct udevice *mux, struct udevice *bus, 32 uint channel) 33 { 34 if (channel == 1) 35 dm_i2c_reg_clrset(mux, 0x0086, DIS_REM_CC, 36 FIELD_PREP(DIS_REM_CC, 1)); 37 else 38 dm_i2c_reg_clrset(mux, 0x0076, DIS_REM_CC, 39 FIELD_PREP(DIS_REM_CC, 1)); 40 41 return 0; 42 } 43 44 static const struct i2c_mux_ops max96745_ops = { 45 .select = max96745_select, 46 .deselect = max96745_deselect, 47 }; 48 49 static int max96745_power_on(struct max96745_priv *priv) 50 { 51 int ret; 52 53 if (dm_gpio_is_valid(&priv->enable_gpio)) { 54 dm_gpio_set_value(&priv->enable_gpio, 1); 55 } else { 56 ret = dm_i2c_reg_clrset(priv->dev, 0x0010, RESET_ALL, 57 FIELD_PREP(RESET_ALL, 1)); 58 if (ret < 0) 59 return ret; 60 } 61 62 mdelay(200); 63 64 ret = dm_i2c_reg_clrset(priv->dev, 0x0076, DIS_REM_CC, 65 FIELD_PREP(DIS_REM_CC, 1)); 66 if (ret < 0) 67 return ret; 68 69 ret = dm_i2c_reg_clrset(priv->dev, 0x0086, DIS_REM_CC, 70 FIELD_PREP(DIS_REM_CC, 1)); 71 if (ret < 0) 72 return ret; 73 74 return 0; 75 } 76 77 static int max96745_probe(struct udevice *dev) 78 { 79 struct max96745_priv *priv = dev_get_priv(dev); 80 int ret; 81 82 ret = i2c_set_chip_offset_len(dev, 2); 83 if (ret) 84 return ret; 85 86 priv->dev = dev; 87 88 ret = gpio_request_by_name(dev, "enable-gpios", 0, 89 &priv->enable_gpio, GPIOD_IS_OUT); 90 if (ret && ret != -ENOENT) { 91 dev_err(dev, "%s: failed to get enable GPIO: %d\n", __func__, ret); 92 return ret; 93 } 94 95 max96745_power_on(priv); 96 97 return 0; 98 } 99 100 static const struct udevice_id max96745_of_match[] = { 101 { .compatible = "maxim,max96745" }, 102 {} 103 }; 104 105 U_BOOT_DRIVER(max96745) = { 106 .name = "max96745", 107 .id = UCLASS_I2C_MUX, 108 .of_match = max96745_of_match, 109 .bind = dm_scan_fdt_dev, 110 .probe = max96745_probe, 111 .ops = &max96745_ops, 112 .priv_auto_alloc_size = sizeof(struct max96745_priv), 113 }; 114