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 mdelay(200); 56 } 57 58 ret = dm_i2c_reg_clrset(priv->dev, 0x0076, DIS_REM_CC, 59 FIELD_PREP(DIS_REM_CC, 1)); 60 if (ret < 0) 61 return ret; 62 63 ret = dm_i2c_reg_clrset(priv->dev, 0x0086, DIS_REM_CC, 64 FIELD_PREP(DIS_REM_CC, 1)); 65 if (ret < 0) 66 return ret; 67 68 return 0; 69 } 70 71 static int max96745_probe(struct udevice *dev) 72 { 73 struct max96745_priv *priv = dev_get_priv(dev); 74 int ret; 75 76 ret = i2c_set_chip_offset_len(dev, 2); 77 if (ret) 78 return ret; 79 80 priv->dev = dev; 81 82 ret = gpio_request_by_name(dev, "enable-gpios", 0, 83 &priv->enable_gpio, GPIOD_IS_OUT); 84 if (ret && ret != -ENOENT) { 85 dev_err(dev, "%s: failed to get enable GPIO: %d\n", __func__, ret); 86 return ret; 87 } 88 89 max96745_power_on(priv); 90 91 return 0; 92 } 93 94 static const struct udevice_id max96745_of_match[] = { 95 { .compatible = "maxim,max96745" }, 96 {} 97 }; 98 99 U_BOOT_DRIVER(max96745) = { 100 .name = "max96745", 101 .id = UCLASS_I2C_MUX, 102 .of_match = max96745_of_match, 103 .bind = dm_scan_fdt_dev, 104 .probe = max96745_probe, 105 .ops = &max96745_ops, 106 .priv_auto_alloc_size = sizeof(struct max96745_priv), 107 }; 108