xref: /rk3399_rockchip-uboot/drivers/i2c/muxes/max96745.c (revision 0c7f2afdd1e1c535f8dad1fb2da77397b32e5ef6)
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