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