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