1/*-
2 * Copyright 2016 Michal Meloun <mmel@FreeBSD.org>
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 *    notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 *    notice, this list of conditions and the following disclaimer in the
11 *    documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
14 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
15 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
16 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
17 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
18 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
19 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
20 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
22 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23 *
24 */
25
26#ifndef _DEV_PHY_H_
27#define	_DEV_PHY_H_
28
29#include "opt_platform.h"
30
31#include <sys/kobj.h>
32#ifdef FDT
33#include <dev/ofw/ofw_bus.h>
34#endif
35
36#define	PHY_STATUS_ENABLED	0x00000001
37
38typedef enum phy_mode {
39	PHY_MODE_INVALID,
40	PHY_MODE_USB_HOST,
41	PHY_MODE_USB_DEVICE,
42	PHY_MODE_USB_OTG,
43	PHY_MODE_UFS,
44	PHY_MODE_PCIE,
45	PHY_MODE_ETHERNET,
46	PHY_MODE_MIPI_DPHY,
47	PHY_MODE_SATA,
48	PHY_MODE_LVDS,
49	PHY_MODE_DP
50} phy_mode_t ;
51
52typedef enum phy_submode {
53	/* Common */
54	PHY_SUBMODE_NA = 0,		/* Not applicable */
55	PHY_SUBMODE_INTERNAL,
56
57	/* Ethernet  */
58	PHY_SUBMODE_ETH_MII = 1000,
59	PHY_SUBMODE_ETH_GMII,
60	PHY_SUBMODE_ETH_SGMII,
61	PHY_SUBMODE_ETH_TBI,
62	PHY_SUBMODE_ETH_REVMII,
63	PHY_SUBMODE_ETH_RMII,
64	PHY_SUBMODE_ETH_RGMII,
65	PHY_SUBMODE_ETH_RGMII_ID,
66	PHY_SUBMODE_ETH_RGMII_RXID,
67	PHY_SUBMODE_ETH_RGMII_TXID,
68	PHY_SUBMODE_ETH_RTBI,
69	PHY_SUBMODE_ETH_SMII,
70	PHY_SUBMODE_ETH_XGMII,
71	PHY_SUBMODE_ETH_XLGMII,
72	PHY_SUBMODE_ETH_MOCA,
73	PHY_SUBMODE_ETH_QSGMII,
74	PHY_SUBMODE_ETH_TRGMII,
75	PHY_SUBMODE_ETH_1000BASEX,
76	PHY_SUBMODE_ETH_2500BASEX,
77	PHY_SUBMODE_ETH_RXAUI,
78	PHY_SUBMODE_ETH_XAUI,
79	PHY_SUBMODE_ETH_10GBASER,
80	PHY_SUBMODE_ETH_USXGMII,
81	PHY_SUBMODE_ETH_10GKR,
82
83	/* USB */
84	PHY_SUBMODE_USB_LS = 2000,
85	PHY_SUBMODE_USB_FS,
86	PHY_SUBMODE_USB_HS,
87	PHY_SUBMODE_USB_SS,
88
89	/* UFS */
90	PHY_SUBMODE_UFS_HS_A = 3000,
91	PHY_SUBMODE_UFS_HS_B,
92
93} phy_submode_t;
94
95typedef struct phy *phy_t;
96
97/* Initialization parameters. */
98struct phynode_init_def {
99	intptr_t		id;		/* Phy ID */
100#ifdef FDT
101	 phandle_t 		ofw_node;	/* OFW node of phy */
102#endif
103};
104
105#include "phynode_if.h"
106
107/*
108 * Shorthands for constructing method tables.
109 */
110#define	PHYNODEMETHOD		KOBJMETHOD
111#define	PHYNODEMETHOD_END	KOBJMETHOD_END
112#define phynode_method_t	kobj_method_t
113#define phynode_class_t		kobj_class_t
114DECLARE_CLASS(phynode_class);
115
116/*
117 * Provider interface
118 */
119struct phynode *phynode_create(device_t pdev, phynode_class_t phynode_class,
120    struct phynode_init_def *def);
121struct phynode *phynode_register(struct phynode *phynode);
122void *phynode_get_softc(struct phynode *phynode);
123device_t phynode_get_device(struct phynode *phynode);
124intptr_t phynode_get_id(struct phynode *phynode);
125int phynode_enable(struct phynode *phynode);
126int phynode_disable(struct phynode *phynode);
127int phynode_set_mode(struct phynode *phynode, phy_mode_t mode,
128    phy_submode_t submode);
129int phynode_status(struct phynode *phynode, int *status);
130#ifdef FDT
131phandle_t phynode_get_ofw_node(struct phynode *phynode);
132#endif
133
134/*
135 * Consumer interface
136 */
137int phy_get_by_id(device_t consumer_dev, device_t provider_dev, intptr_t id,
138    phy_t *phy);
139void phy_release(phy_t phy);
140int phy_enable(phy_t phy);
141int phy_disable(phy_t phy);
142int phy_set_mode(phy_t phy, phy_mode_t mode, phy_submode_t submode);
143int phy_status(phy_t phy, int *value);
144#ifdef FDT
145int phy_get_by_ofw_name(device_t consumer, phandle_t node, char *name,
146    phy_t *phy);
147int phy_get_by_ofw_idx(device_t consumer, phandle_t node, int idx, phy_t *phy);
148int phy_get_by_ofw_property(device_t consumer, phandle_t node, char *name,
149    phy_t *phy);
150#endif
151
152#endif /* _DEV_PHY_H_ */
153