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