xref: /openbmc/u-boot/drivers/misc/gdsys_rxaui_ctrl.c (revision 86da8c12ef0f86c7bd7a1cf95d71806dd9022969)
1*86da8c12SMario Six // SPDX-License-Identifier: GPL-2.0+
2*86da8c12SMario Six /*
3*86da8c12SMario Six  * (C) Copyright 2015
4*86da8c12SMario Six  * Dirk Eibach,  Guntermann & Drunck GmbH, eibach@gdsys.de
5*86da8c12SMario Six  *
6*86da8c12SMario Six  * (C) Copyright 2017
7*86da8c12SMario Six  * Mario Six,  Guntermann & Drunck GmbH, mario.six@gdsys.cc
8*86da8c12SMario Six  */
9*86da8c12SMario Six 
10*86da8c12SMario Six #include <common.h>
11*86da8c12SMario Six #include <dm.h>
12*86da8c12SMario Six #include <regmap.h>
13*86da8c12SMario Six #include <misc.h>
14*86da8c12SMario Six 
15*86da8c12SMario Six struct gdsys_rxaui_ctrl_regs {
16*86da8c12SMario Six 	u16 gen_cnt;
17*86da8c12SMario Six 	u16 err_cnt;
18*86da8c12SMario Six 	u16 succ_cnt;
19*86da8c12SMario Six 	u16 status;
20*86da8c12SMario Six 	u16 ctrl_0;
21*86da8c12SMario Six 	u16 ctrl_1;
22*86da8c12SMario Six };
23*86da8c12SMario Six 
24*86da8c12SMario Six #define rxaui_ctrl_set(map, member, val) \
25*86da8c12SMario Six 	regmap_set(map, struct gdsys_rxaui_ctrl_regs, member, val)
26*86da8c12SMario Six 
27*86da8c12SMario Six #define rxaui_ctrl_get(map, member, valp) \
28*86da8c12SMario Six 	regmap_get(map, struct gdsys_rxaui_ctrl_regs, member, valp)
29*86da8c12SMario Six 
30*86da8c12SMario Six struct gdsys_rxaui_ctrl_priv {
31*86da8c12SMario Six 	struct regmap *map;
32*86da8c12SMario Six };
33*86da8c12SMario Six 
gdsys_rxaui_set_polarity_inversion(struct udevice * dev,bool val)34*86da8c12SMario Six int gdsys_rxaui_set_polarity_inversion(struct udevice *dev, bool val)
35*86da8c12SMario Six {
36*86da8c12SMario Six 	struct gdsys_rxaui_ctrl_priv *priv = dev_get_priv(dev);
37*86da8c12SMario Six 	u16 state;
38*86da8c12SMario Six 
39*86da8c12SMario Six 	rxaui_ctrl_get(priv->map, ctrl_1, &state);
40*86da8c12SMario Six 
41*86da8c12SMario Six 	if (val)
42*86da8c12SMario Six 		state |= ~0x7800;
43*86da8c12SMario Six 	else
44*86da8c12SMario Six 		state &= ~0x7800;
45*86da8c12SMario Six 
46*86da8c12SMario Six 	rxaui_ctrl_set(priv->map, ctrl_1, state);
47*86da8c12SMario Six 
48*86da8c12SMario Six 	return 0;
49*86da8c12SMario Six }
50*86da8c12SMario Six 
51*86da8c12SMario Six static const struct misc_ops gdsys_rxaui_ctrl_ops = {
52*86da8c12SMario Six 	.set_enabled = gdsys_rxaui_set_polarity_inversion,
53*86da8c12SMario Six };
54*86da8c12SMario Six 
gdsys_rxaui_ctrl_probe(struct udevice * dev)55*86da8c12SMario Six int gdsys_rxaui_ctrl_probe(struct udevice *dev)
56*86da8c12SMario Six {
57*86da8c12SMario Six 	struct gdsys_rxaui_ctrl_priv *priv = dev_get_priv(dev);
58*86da8c12SMario Six 
59*86da8c12SMario Six 	regmap_init_mem(dev, &priv->map);
60*86da8c12SMario Six 
61*86da8c12SMario Six 	return 0;
62*86da8c12SMario Six }
63*86da8c12SMario Six 
64*86da8c12SMario Six static const struct udevice_id gdsys_rxaui_ctrl_ids[] = {
65*86da8c12SMario Six 	{ .compatible = "gdsys,rxaui_ctrl" },
66*86da8c12SMario Six 	{ }
67*86da8c12SMario Six };
68*86da8c12SMario Six 
69*86da8c12SMario Six U_BOOT_DRIVER(gdsys_rxaui_ctrl) = {
70*86da8c12SMario Six 	.name           = "gdsys_rxaui_ctrl",
71*86da8c12SMario Six 	.id             = UCLASS_MISC,
72*86da8c12SMario Six 	.ops		= &gdsys_rxaui_ctrl_ops,
73*86da8c12SMario Six 	.of_match       = gdsys_rxaui_ctrl_ids,
74*86da8c12SMario Six 	.probe          = gdsys_rxaui_ctrl_probe,
75*86da8c12SMario Six 	.priv_auto_alloc_size = sizeof(struct gdsys_rxaui_ctrl_priv),
76*86da8c12SMario Six };
77