xref: /linux/drivers/phy/phy-common-props-test.c (revision c17ee635fd3a482b2ad2bf5e269755c2eae5f25e)
1*e7556b59SVladimir Oltean // SPDX-License-Identifier: GPL-2.0
2*e7556b59SVladimir Oltean /*
3*e7556b59SVladimir Oltean  * phy-common-props-test.c  --  Unit tests for PHY common properties API
4*e7556b59SVladimir Oltean  *
5*e7556b59SVladimir Oltean  * Copyright 2025-2026 NXP
6*e7556b59SVladimir Oltean  */
7*e7556b59SVladimir Oltean #include <kunit/test.h>
8*e7556b59SVladimir Oltean #include <linux/property.h>
9*e7556b59SVladimir Oltean #include <linux/phy/phy-common-props.h>
10*e7556b59SVladimir Oltean #include <dt-bindings/phy/phy.h>
11*e7556b59SVladimir Oltean 
12*e7556b59SVladimir Oltean /* Test: rx-polarity property is missing */
13*e7556b59SVladimir Oltean static void phy_test_rx_polarity_is_missing(struct kunit *test)
14*e7556b59SVladimir Oltean {
15*e7556b59SVladimir Oltean 	static const struct property_entry entries[] = {
16*e7556b59SVladimir Oltean 		{}
17*e7556b59SVladimir Oltean 	};
18*e7556b59SVladimir Oltean 	struct fwnode_handle *node;
19*e7556b59SVladimir Oltean 	unsigned int val;
20*e7556b59SVladimir Oltean 	int ret;
21*e7556b59SVladimir Oltean 
22*e7556b59SVladimir Oltean 	node = fwnode_create_software_node(entries, NULL);
23*e7556b59SVladimir Oltean 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, node);
24*e7556b59SVladimir Oltean 
25*e7556b59SVladimir Oltean 	ret = phy_get_manual_rx_polarity(node, "sgmii", &val);
26*e7556b59SVladimir Oltean 	KUNIT_EXPECT_EQ(test, ret, 0);
27*e7556b59SVladimir Oltean 	KUNIT_EXPECT_EQ(test, val, PHY_POL_NORMAL);
28*e7556b59SVladimir Oltean 
29*e7556b59SVladimir Oltean 	fwnode_remove_software_node(node);
30*e7556b59SVladimir Oltean }
31*e7556b59SVladimir Oltean 
32*e7556b59SVladimir Oltean /* Test: rx-polarity has more values than rx-polarity-names */
33*e7556b59SVladimir Oltean static void phy_test_rx_polarity_more_values_than_names(struct kunit *test)
34*e7556b59SVladimir Oltean {
35*e7556b59SVladimir Oltean 	static const u32 rx_pol[] = { PHY_POL_NORMAL, PHY_POL_INVERT, PHY_POL_NORMAL };
36*e7556b59SVladimir Oltean 	static const char * const rx_pol_names[] = { "sgmii", "2500base-x" };
37*e7556b59SVladimir Oltean 	static const struct property_entry entries[] = {
38*e7556b59SVladimir Oltean 		PROPERTY_ENTRY_U32_ARRAY("rx-polarity", rx_pol),
39*e7556b59SVladimir Oltean 		PROPERTY_ENTRY_STRING_ARRAY("rx-polarity-names", rx_pol_names),
40*e7556b59SVladimir Oltean 		{}
41*e7556b59SVladimir Oltean 	};
42*e7556b59SVladimir Oltean 	struct fwnode_handle *node;
43*e7556b59SVladimir Oltean 	unsigned int val;
44*e7556b59SVladimir Oltean 	int ret;
45*e7556b59SVladimir Oltean 
46*e7556b59SVladimir Oltean 	node = fwnode_create_software_node(entries, NULL);
47*e7556b59SVladimir Oltean 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, node);
48*e7556b59SVladimir Oltean 
49*e7556b59SVladimir Oltean 	ret = phy_get_manual_rx_polarity(node, "sgmii", &val);
50*e7556b59SVladimir Oltean 	KUNIT_EXPECT_EQ(test, ret, -EINVAL);
51*e7556b59SVladimir Oltean 
52*e7556b59SVladimir Oltean 	fwnode_remove_software_node(node);
53*e7556b59SVladimir Oltean }
54*e7556b59SVladimir Oltean 
55*e7556b59SVladimir Oltean /* Test: rx-polarity has 1 value and rx-polarity-names does not exist */
56*e7556b59SVladimir Oltean static void phy_test_rx_polarity_single_value_no_names(struct kunit *test)
57*e7556b59SVladimir Oltean {
58*e7556b59SVladimir Oltean 	static const u32 rx_pol[] = { PHY_POL_INVERT };
59*e7556b59SVladimir Oltean 	static const struct property_entry entries[] = {
60*e7556b59SVladimir Oltean 		PROPERTY_ENTRY_U32_ARRAY("rx-polarity", rx_pol),
61*e7556b59SVladimir Oltean 		{}
62*e7556b59SVladimir Oltean 	};
63*e7556b59SVladimir Oltean 	struct fwnode_handle *node;
64*e7556b59SVladimir Oltean 	unsigned int val;
65*e7556b59SVladimir Oltean 	int ret;
66*e7556b59SVladimir Oltean 
67*e7556b59SVladimir Oltean 	node = fwnode_create_software_node(entries, NULL);
68*e7556b59SVladimir Oltean 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, node);
69*e7556b59SVladimir Oltean 
70*e7556b59SVladimir Oltean 	ret = phy_get_manual_rx_polarity(node, "sgmii", &val);
71*e7556b59SVladimir Oltean 	KUNIT_EXPECT_EQ(test, ret, 0);
72*e7556b59SVladimir Oltean 	KUNIT_EXPECT_EQ(test, val, PHY_POL_INVERT);
73*e7556b59SVladimir Oltean 
74*e7556b59SVladimir Oltean 	fwnode_remove_software_node(node);
75*e7556b59SVladimir Oltean }
76*e7556b59SVladimir Oltean 
77*e7556b59SVladimir Oltean /* Test: rx-polarity-names has more values than rx-polarity */
78*e7556b59SVladimir Oltean static void phy_test_rx_polarity_more_names_than_values(struct kunit *test)
79*e7556b59SVladimir Oltean {
80*e7556b59SVladimir Oltean 	static const u32 rx_pol[] = { PHY_POL_NORMAL, PHY_POL_INVERT };
81*e7556b59SVladimir Oltean 	static const char * const rx_pol_names[] = { "sgmii", "2500base-x", "1000base-x" };
82*e7556b59SVladimir Oltean 	static const struct property_entry entries[] = {
83*e7556b59SVladimir Oltean 		PROPERTY_ENTRY_U32_ARRAY("rx-polarity", rx_pol),
84*e7556b59SVladimir Oltean 		PROPERTY_ENTRY_STRING_ARRAY("rx-polarity-names", rx_pol_names),
85*e7556b59SVladimir Oltean 		{}
86*e7556b59SVladimir Oltean 	};
87*e7556b59SVladimir Oltean 	struct fwnode_handle *node;
88*e7556b59SVladimir Oltean 	unsigned int val;
89*e7556b59SVladimir Oltean 	int ret;
90*e7556b59SVladimir Oltean 
91*e7556b59SVladimir Oltean 	node = fwnode_create_software_node(entries, NULL);
92*e7556b59SVladimir Oltean 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, node);
93*e7556b59SVladimir Oltean 
94*e7556b59SVladimir Oltean 	ret = phy_get_manual_rx_polarity(node, "sgmii", &val);
95*e7556b59SVladimir Oltean 	KUNIT_EXPECT_EQ(test, ret, -EINVAL);
96*e7556b59SVladimir Oltean 
97*e7556b59SVladimir Oltean 	fwnode_remove_software_node(node);
98*e7556b59SVladimir Oltean }
99*e7556b59SVladimir Oltean 
100*e7556b59SVladimir Oltean /* Test: rx-polarity and rx-polarity-names have same length, find the name */
101*e7556b59SVladimir Oltean static void phy_test_rx_polarity_find_by_name(struct kunit *test)
102*e7556b59SVladimir Oltean {
103*e7556b59SVladimir Oltean 	static const u32 rx_pol[] = { PHY_POL_NORMAL, PHY_POL_INVERT, PHY_POL_AUTO };
104*e7556b59SVladimir Oltean 	static const char * const rx_pol_names[] = { "sgmii", "2500base-x", "usb-ss" };
105*e7556b59SVladimir Oltean 	static const struct property_entry entries[] = {
106*e7556b59SVladimir Oltean 		PROPERTY_ENTRY_U32_ARRAY("rx-polarity", rx_pol),
107*e7556b59SVladimir Oltean 		PROPERTY_ENTRY_STRING_ARRAY("rx-polarity-names", rx_pol_names),
108*e7556b59SVladimir Oltean 		{}
109*e7556b59SVladimir Oltean 	};
110*e7556b59SVladimir Oltean 	struct fwnode_handle *node;
111*e7556b59SVladimir Oltean 	unsigned int val;
112*e7556b59SVladimir Oltean 	int ret;
113*e7556b59SVladimir Oltean 
114*e7556b59SVladimir Oltean 	node = fwnode_create_software_node(entries, NULL);
115*e7556b59SVladimir Oltean 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, node);
116*e7556b59SVladimir Oltean 
117*e7556b59SVladimir Oltean 	ret = phy_get_manual_rx_polarity(node, "sgmii", &val);
118*e7556b59SVladimir Oltean 	KUNIT_EXPECT_EQ(test, ret, 0);
119*e7556b59SVladimir Oltean 	KUNIT_EXPECT_EQ(test, val, PHY_POL_NORMAL);
120*e7556b59SVladimir Oltean 
121*e7556b59SVladimir Oltean 	ret = phy_get_manual_rx_polarity(node, "2500base-x", &val);
122*e7556b59SVladimir Oltean 	KUNIT_EXPECT_EQ(test, ret, 0);
123*e7556b59SVladimir Oltean 	KUNIT_EXPECT_EQ(test, val, PHY_POL_INVERT);
124*e7556b59SVladimir Oltean 
125*e7556b59SVladimir Oltean 	ret = phy_get_rx_polarity(node, "usb-ss", BIT(PHY_POL_AUTO),
126*e7556b59SVladimir Oltean 				  PHY_POL_AUTO, &val);
127*e7556b59SVladimir Oltean 	KUNIT_EXPECT_EQ(test, ret, 0);
128*e7556b59SVladimir Oltean 	KUNIT_EXPECT_EQ(test, val, PHY_POL_AUTO);
129*e7556b59SVladimir Oltean 
130*e7556b59SVladimir Oltean 	fwnode_remove_software_node(node);
131*e7556b59SVladimir Oltean }
132*e7556b59SVladimir Oltean 
133*e7556b59SVladimir Oltean /* Test: same length, name not found, no "default" - error */
134*e7556b59SVladimir Oltean static void phy_test_rx_polarity_name_not_found_no_default(struct kunit *test)
135*e7556b59SVladimir Oltean {
136*e7556b59SVladimir Oltean 	static const u32 rx_pol[] = { PHY_POL_NORMAL, PHY_POL_INVERT };
137*e7556b59SVladimir Oltean 	static const char * const rx_pol_names[] = { "2500base-x", "1000base-x" };
138*e7556b59SVladimir Oltean 	static const struct property_entry entries[] = {
139*e7556b59SVladimir Oltean 		PROPERTY_ENTRY_U32_ARRAY("rx-polarity", rx_pol),
140*e7556b59SVladimir Oltean 		PROPERTY_ENTRY_STRING_ARRAY("rx-polarity-names", rx_pol_names),
141*e7556b59SVladimir Oltean 		{}
142*e7556b59SVladimir Oltean 	};
143*e7556b59SVladimir Oltean 	struct fwnode_handle *node;
144*e7556b59SVladimir Oltean 	unsigned int val;
145*e7556b59SVladimir Oltean 	int ret;
146*e7556b59SVladimir Oltean 
147*e7556b59SVladimir Oltean 	node = fwnode_create_software_node(entries, NULL);
148*e7556b59SVladimir Oltean 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, node);
149*e7556b59SVladimir Oltean 
150*e7556b59SVladimir Oltean 	ret = phy_get_manual_rx_polarity(node, "sgmii", &val);
151*e7556b59SVladimir Oltean 	KUNIT_EXPECT_EQ(test, ret, -EINVAL);
152*e7556b59SVladimir Oltean 
153*e7556b59SVladimir Oltean 	fwnode_remove_software_node(node);
154*e7556b59SVladimir Oltean }
155*e7556b59SVladimir Oltean 
156*e7556b59SVladimir Oltean /* Test: same length, name not found, but "default" exists */
157*e7556b59SVladimir Oltean static void phy_test_rx_polarity_name_not_found_with_default(struct kunit *test)
158*e7556b59SVladimir Oltean {
159*e7556b59SVladimir Oltean 	static const u32 rx_pol[] = { PHY_POL_NORMAL, PHY_POL_INVERT };
160*e7556b59SVladimir Oltean 	static const char * const rx_pol_names[] = { "2500base-x", "default" };
161*e7556b59SVladimir Oltean 	static const struct property_entry entries[] = {
162*e7556b59SVladimir Oltean 		PROPERTY_ENTRY_U32_ARRAY("rx-polarity", rx_pol),
163*e7556b59SVladimir Oltean 		PROPERTY_ENTRY_STRING_ARRAY("rx-polarity-names", rx_pol_names),
164*e7556b59SVladimir Oltean 		{}
165*e7556b59SVladimir Oltean 	};
166*e7556b59SVladimir Oltean 	struct fwnode_handle *node;
167*e7556b59SVladimir Oltean 	unsigned int val;
168*e7556b59SVladimir Oltean 	int ret;
169*e7556b59SVladimir Oltean 
170*e7556b59SVladimir Oltean 	node = fwnode_create_software_node(entries, NULL);
171*e7556b59SVladimir Oltean 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, node);
172*e7556b59SVladimir Oltean 
173*e7556b59SVladimir Oltean 	ret = phy_get_manual_rx_polarity(node, "sgmii", &val);
174*e7556b59SVladimir Oltean 	KUNIT_EXPECT_EQ(test, ret, 0);
175*e7556b59SVladimir Oltean 	KUNIT_EXPECT_EQ(test, val, PHY_POL_INVERT);
176*e7556b59SVladimir Oltean 
177*e7556b59SVladimir Oltean 	fwnode_remove_software_node(node);
178*e7556b59SVladimir Oltean }
179*e7556b59SVladimir Oltean 
180*e7556b59SVladimir Oltean /* Test: polarity found but value is unsupported */
181*e7556b59SVladimir Oltean static void phy_test_rx_polarity_unsupported_value(struct kunit *test)
182*e7556b59SVladimir Oltean {
183*e7556b59SVladimir Oltean 	static const u32 rx_pol[] = { PHY_POL_AUTO };
184*e7556b59SVladimir Oltean 	static const char * const rx_pol_names[] = { "sgmii" };
185*e7556b59SVladimir Oltean 	static const struct property_entry entries[] = {
186*e7556b59SVladimir Oltean 		PROPERTY_ENTRY_U32_ARRAY("rx-polarity", rx_pol),
187*e7556b59SVladimir Oltean 		PROPERTY_ENTRY_STRING_ARRAY("rx-polarity-names", rx_pol_names),
188*e7556b59SVladimir Oltean 		{}
189*e7556b59SVladimir Oltean 	};
190*e7556b59SVladimir Oltean 	struct fwnode_handle *node;
191*e7556b59SVladimir Oltean 	unsigned int val;
192*e7556b59SVladimir Oltean 	int ret;
193*e7556b59SVladimir Oltean 
194*e7556b59SVladimir Oltean 	node = fwnode_create_software_node(entries, NULL);
195*e7556b59SVladimir Oltean 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, node);
196*e7556b59SVladimir Oltean 
197*e7556b59SVladimir Oltean 	ret = phy_get_manual_rx_polarity(node, "sgmii", &val);
198*e7556b59SVladimir Oltean 	KUNIT_EXPECT_EQ(test, ret, -EOPNOTSUPP);
199*e7556b59SVladimir Oltean 
200*e7556b59SVladimir Oltean 	fwnode_remove_software_node(node);
201*e7556b59SVladimir Oltean }
202*e7556b59SVladimir Oltean 
203*e7556b59SVladimir Oltean /* Test: tx-polarity property is missing */
204*e7556b59SVladimir Oltean static void phy_test_tx_polarity_is_missing(struct kunit *test)
205*e7556b59SVladimir Oltean {
206*e7556b59SVladimir Oltean 	static const struct property_entry entries[] = {
207*e7556b59SVladimir Oltean 		{}
208*e7556b59SVladimir Oltean 	};
209*e7556b59SVladimir Oltean 	struct fwnode_handle *node;
210*e7556b59SVladimir Oltean 	unsigned int val;
211*e7556b59SVladimir Oltean 	int ret;
212*e7556b59SVladimir Oltean 
213*e7556b59SVladimir Oltean 	node = fwnode_create_software_node(entries, NULL);
214*e7556b59SVladimir Oltean 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, node);
215*e7556b59SVladimir Oltean 
216*e7556b59SVladimir Oltean 	ret = phy_get_manual_tx_polarity(node, "sgmii", &val);
217*e7556b59SVladimir Oltean 	KUNIT_EXPECT_EQ(test, ret, 0);
218*e7556b59SVladimir Oltean 	KUNIT_EXPECT_EQ(test, val, PHY_POL_NORMAL);
219*e7556b59SVladimir Oltean 
220*e7556b59SVladimir Oltean 	fwnode_remove_software_node(node);
221*e7556b59SVladimir Oltean }
222*e7556b59SVladimir Oltean 
223*e7556b59SVladimir Oltean /* Test: tx-polarity has more values than tx-polarity-names */
224*e7556b59SVladimir Oltean static void phy_test_tx_polarity_more_values_than_names(struct kunit *test)
225*e7556b59SVladimir Oltean {
226*e7556b59SVladimir Oltean 	static const u32 tx_pol[] = { PHY_POL_NORMAL, PHY_POL_INVERT, PHY_POL_NORMAL };
227*e7556b59SVladimir Oltean 	static const char * const tx_pol_names[] = { "sgmii", "2500base-x" };
228*e7556b59SVladimir Oltean 	static const struct property_entry entries[] = {
229*e7556b59SVladimir Oltean 		PROPERTY_ENTRY_U32_ARRAY("tx-polarity", tx_pol),
230*e7556b59SVladimir Oltean 		PROPERTY_ENTRY_STRING_ARRAY("tx-polarity-names", tx_pol_names),
231*e7556b59SVladimir Oltean 		{}
232*e7556b59SVladimir Oltean 	};
233*e7556b59SVladimir Oltean 	struct fwnode_handle *node;
234*e7556b59SVladimir Oltean 	unsigned int val;
235*e7556b59SVladimir Oltean 	int ret;
236*e7556b59SVladimir Oltean 
237*e7556b59SVladimir Oltean 	node = fwnode_create_software_node(entries, NULL);
238*e7556b59SVladimir Oltean 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, node);
239*e7556b59SVladimir Oltean 
240*e7556b59SVladimir Oltean 	ret = phy_get_manual_tx_polarity(node, "sgmii", &val);
241*e7556b59SVladimir Oltean 	KUNIT_EXPECT_EQ(test, ret, -EINVAL);
242*e7556b59SVladimir Oltean 
243*e7556b59SVladimir Oltean 	fwnode_remove_software_node(node);
244*e7556b59SVladimir Oltean }
245*e7556b59SVladimir Oltean 
246*e7556b59SVladimir Oltean /* Test: tx-polarity has 1 value and tx-polarity-names does not exist */
247*e7556b59SVladimir Oltean static void phy_test_tx_polarity_single_value_no_names(struct kunit *test)
248*e7556b59SVladimir Oltean {
249*e7556b59SVladimir Oltean 	static const u32 tx_pol[] = { PHY_POL_INVERT };
250*e7556b59SVladimir Oltean 	static const struct property_entry entries[] = {
251*e7556b59SVladimir Oltean 		PROPERTY_ENTRY_U32_ARRAY("tx-polarity", tx_pol),
252*e7556b59SVladimir Oltean 		{}
253*e7556b59SVladimir Oltean 	};
254*e7556b59SVladimir Oltean 	struct fwnode_handle *node;
255*e7556b59SVladimir Oltean 	unsigned int val;
256*e7556b59SVladimir Oltean 	int ret;
257*e7556b59SVladimir Oltean 
258*e7556b59SVladimir Oltean 	node = fwnode_create_software_node(entries, NULL);
259*e7556b59SVladimir Oltean 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, node);
260*e7556b59SVladimir Oltean 
261*e7556b59SVladimir Oltean 	ret = phy_get_manual_tx_polarity(node, "sgmii", &val);
262*e7556b59SVladimir Oltean 	KUNIT_EXPECT_EQ(test, ret, 0);
263*e7556b59SVladimir Oltean 	KUNIT_EXPECT_EQ(test, val, PHY_POL_INVERT);
264*e7556b59SVladimir Oltean 
265*e7556b59SVladimir Oltean 	fwnode_remove_software_node(node);
266*e7556b59SVladimir Oltean }
267*e7556b59SVladimir Oltean 
268*e7556b59SVladimir Oltean /* Test: tx-polarity-names has more values than tx-polarity */
269*e7556b59SVladimir Oltean static void phy_test_tx_polarity_more_names_than_values(struct kunit *test)
270*e7556b59SVladimir Oltean {
271*e7556b59SVladimir Oltean 	static const u32 tx_pol[] = { PHY_POL_NORMAL, PHY_POL_INVERT };
272*e7556b59SVladimir Oltean 	static const char * const tx_pol_names[] = { "sgmii", "2500base-x", "1000base-x" };
273*e7556b59SVladimir Oltean 	static const struct property_entry entries[] = {
274*e7556b59SVladimir Oltean 		PROPERTY_ENTRY_U32_ARRAY("tx-polarity", tx_pol),
275*e7556b59SVladimir Oltean 		PROPERTY_ENTRY_STRING_ARRAY("tx-polarity-names", tx_pol_names),
276*e7556b59SVladimir Oltean 		{}
277*e7556b59SVladimir Oltean 	};
278*e7556b59SVladimir Oltean 	struct fwnode_handle *node;
279*e7556b59SVladimir Oltean 	unsigned int val;
280*e7556b59SVladimir Oltean 	int ret;
281*e7556b59SVladimir Oltean 
282*e7556b59SVladimir Oltean 	node = fwnode_create_software_node(entries, NULL);
283*e7556b59SVladimir Oltean 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, node);
284*e7556b59SVladimir Oltean 
285*e7556b59SVladimir Oltean 	ret = phy_get_manual_tx_polarity(node, "sgmii", &val);
286*e7556b59SVladimir Oltean 	KUNIT_EXPECT_EQ(test, ret, -EINVAL);
287*e7556b59SVladimir Oltean 
288*e7556b59SVladimir Oltean 	fwnode_remove_software_node(node);
289*e7556b59SVladimir Oltean }
290*e7556b59SVladimir Oltean 
291*e7556b59SVladimir Oltean /* Test: tx-polarity and tx-polarity-names have same length, find the name */
292*e7556b59SVladimir Oltean static void phy_test_tx_polarity_find_by_name(struct kunit *test)
293*e7556b59SVladimir Oltean {
294*e7556b59SVladimir Oltean 	static const u32 tx_pol[] = { PHY_POL_NORMAL, PHY_POL_INVERT, PHY_POL_NORMAL };
295*e7556b59SVladimir Oltean 	static const char * const tx_pol_names[] = { "sgmii", "2500base-x", "1000base-x" };
296*e7556b59SVladimir Oltean 	static const struct property_entry entries[] = {
297*e7556b59SVladimir Oltean 		PROPERTY_ENTRY_U32_ARRAY("tx-polarity", tx_pol),
298*e7556b59SVladimir Oltean 		PROPERTY_ENTRY_STRING_ARRAY("tx-polarity-names", tx_pol_names),
299*e7556b59SVladimir Oltean 		{}
300*e7556b59SVladimir Oltean 	};
301*e7556b59SVladimir Oltean 	struct fwnode_handle *node;
302*e7556b59SVladimir Oltean 	unsigned int val;
303*e7556b59SVladimir Oltean 	int ret;
304*e7556b59SVladimir Oltean 
305*e7556b59SVladimir Oltean 	node = fwnode_create_software_node(entries, NULL);
306*e7556b59SVladimir Oltean 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, node);
307*e7556b59SVladimir Oltean 
308*e7556b59SVladimir Oltean 	ret = phy_get_manual_tx_polarity(node, "sgmii", &val);
309*e7556b59SVladimir Oltean 	KUNIT_EXPECT_EQ(test, ret, 0);
310*e7556b59SVladimir Oltean 	KUNIT_EXPECT_EQ(test, val, PHY_POL_NORMAL);
311*e7556b59SVladimir Oltean 
312*e7556b59SVladimir Oltean 	ret = phy_get_manual_tx_polarity(node, "2500base-x", &val);
313*e7556b59SVladimir Oltean 	KUNIT_EXPECT_EQ(test, ret, 0);
314*e7556b59SVladimir Oltean 	KUNIT_EXPECT_EQ(test, val, PHY_POL_INVERT);
315*e7556b59SVladimir Oltean 
316*e7556b59SVladimir Oltean 	ret = phy_get_manual_tx_polarity(node, "1000base-x", &val);
317*e7556b59SVladimir Oltean 	KUNIT_EXPECT_EQ(test, ret, 0);
318*e7556b59SVladimir Oltean 	KUNIT_EXPECT_EQ(test, val, PHY_POL_NORMAL);
319*e7556b59SVladimir Oltean 
320*e7556b59SVladimir Oltean 	fwnode_remove_software_node(node);
321*e7556b59SVladimir Oltean }
322*e7556b59SVladimir Oltean 
323*e7556b59SVladimir Oltean /* Test: same length, name not found, no "default" - error */
324*e7556b59SVladimir Oltean static void phy_test_tx_polarity_name_not_found_no_default(struct kunit *test)
325*e7556b59SVladimir Oltean {
326*e7556b59SVladimir Oltean 	static const u32 tx_pol[] = { PHY_POL_NORMAL, PHY_POL_INVERT };
327*e7556b59SVladimir Oltean 	static const char * const tx_pol_names[] = { "2500base-x", "1000base-x" };
328*e7556b59SVladimir Oltean 	static const struct property_entry entries[] = {
329*e7556b59SVladimir Oltean 		PROPERTY_ENTRY_U32_ARRAY("tx-polarity", tx_pol),
330*e7556b59SVladimir Oltean 		PROPERTY_ENTRY_STRING_ARRAY("tx-polarity-names", tx_pol_names),
331*e7556b59SVladimir Oltean 		{}
332*e7556b59SVladimir Oltean 	};
333*e7556b59SVladimir Oltean 	struct fwnode_handle *node;
334*e7556b59SVladimir Oltean 	unsigned int val;
335*e7556b59SVladimir Oltean 	int ret;
336*e7556b59SVladimir Oltean 
337*e7556b59SVladimir Oltean 	node = fwnode_create_software_node(entries, NULL);
338*e7556b59SVladimir Oltean 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, node);
339*e7556b59SVladimir Oltean 
340*e7556b59SVladimir Oltean 	ret = phy_get_manual_tx_polarity(node, "sgmii", &val);
341*e7556b59SVladimir Oltean 	KUNIT_EXPECT_EQ(test, ret, -EINVAL);
342*e7556b59SVladimir Oltean 
343*e7556b59SVladimir Oltean 	fwnode_remove_software_node(node);
344*e7556b59SVladimir Oltean }
345*e7556b59SVladimir Oltean 
346*e7556b59SVladimir Oltean /* Test: same length, name not found, but "default" exists */
347*e7556b59SVladimir Oltean static void phy_test_tx_polarity_name_not_found_with_default(struct kunit *test)
348*e7556b59SVladimir Oltean {
349*e7556b59SVladimir Oltean 	static const u32 tx_pol[] = { PHY_POL_NORMAL, PHY_POL_INVERT };
350*e7556b59SVladimir Oltean 	static const char * const tx_pol_names[] = { "2500base-x", "default" };
351*e7556b59SVladimir Oltean 	static const struct property_entry entries[] = {
352*e7556b59SVladimir Oltean 		PROPERTY_ENTRY_U32_ARRAY("tx-polarity", tx_pol),
353*e7556b59SVladimir Oltean 		PROPERTY_ENTRY_STRING_ARRAY("tx-polarity-names", tx_pol_names),
354*e7556b59SVladimir Oltean 		{}
355*e7556b59SVladimir Oltean 	};
356*e7556b59SVladimir Oltean 	struct fwnode_handle *node;
357*e7556b59SVladimir Oltean 	unsigned int val;
358*e7556b59SVladimir Oltean 	int ret;
359*e7556b59SVladimir Oltean 
360*e7556b59SVladimir Oltean 	node = fwnode_create_software_node(entries, NULL);
361*e7556b59SVladimir Oltean 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, node);
362*e7556b59SVladimir Oltean 
363*e7556b59SVladimir Oltean 	ret = phy_get_manual_tx_polarity(node, "sgmii", &val);
364*e7556b59SVladimir Oltean 	KUNIT_EXPECT_EQ(test, ret, 0);
365*e7556b59SVladimir Oltean 	KUNIT_EXPECT_EQ(test, val, PHY_POL_INVERT);
366*e7556b59SVladimir Oltean 
367*e7556b59SVladimir Oltean 	fwnode_remove_software_node(node);
368*e7556b59SVladimir Oltean }
369*e7556b59SVladimir Oltean 
370*e7556b59SVladimir Oltean /* Test: polarity found but value is unsupported (AUTO for TX) */
371*e7556b59SVladimir Oltean static void phy_test_tx_polarity_unsupported_value(struct kunit *test)
372*e7556b59SVladimir Oltean {
373*e7556b59SVladimir Oltean 	static const u32 tx_pol[] = { PHY_POL_AUTO };
374*e7556b59SVladimir Oltean 	static const char * const tx_pol_names[] = { "sgmii" };
375*e7556b59SVladimir Oltean 	static const struct property_entry entries[] = {
376*e7556b59SVladimir Oltean 		PROPERTY_ENTRY_U32_ARRAY("tx-polarity", tx_pol),
377*e7556b59SVladimir Oltean 		PROPERTY_ENTRY_STRING_ARRAY("tx-polarity-names", tx_pol_names),
378*e7556b59SVladimir Oltean 		{}
379*e7556b59SVladimir Oltean 	};
380*e7556b59SVladimir Oltean 	struct fwnode_handle *node;
381*e7556b59SVladimir Oltean 	unsigned int val;
382*e7556b59SVladimir Oltean 	int ret;
383*e7556b59SVladimir Oltean 
384*e7556b59SVladimir Oltean 	node = fwnode_create_software_node(entries, NULL);
385*e7556b59SVladimir Oltean 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, node);
386*e7556b59SVladimir Oltean 
387*e7556b59SVladimir Oltean 	ret = phy_get_manual_tx_polarity(node, "sgmii", &val);
388*e7556b59SVladimir Oltean 	KUNIT_EXPECT_EQ(test, ret, -EOPNOTSUPP);
389*e7556b59SVladimir Oltean 
390*e7556b59SVladimir Oltean 	fwnode_remove_software_node(node);
391*e7556b59SVladimir Oltean }
392*e7556b59SVladimir Oltean 
393*e7556b59SVladimir Oltean static struct kunit_case phy_common_props_test_cases[] = {
394*e7556b59SVladimir Oltean 	KUNIT_CASE(phy_test_rx_polarity_is_missing),
395*e7556b59SVladimir Oltean 	KUNIT_CASE(phy_test_rx_polarity_more_values_than_names),
396*e7556b59SVladimir Oltean 	KUNIT_CASE(phy_test_rx_polarity_single_value_no_names),
397*e7556b59SVladimir Oltean 	KUNIT_CASE(phy_test_rx_polarity_more_names_than_values),
398*e7556b59SVladimir Oltean 	KUNIT_CASE(phy_test_rx_polarity_find_by_name),
399*e7556b59SVladimir Oltean 	KUNIT_CASE(phy_test_rx_polarity_name_not_found_no_default),
400*e7556b59SVladimir Oltean 	KUNIT_CASE(phy_test_rx_polarity_name_not_found_with_default),
401*e7556b59SVladimir Oltean 	KUNIT_CASE(phy_test_rx_polarity_unsupported_value),
402*e7556b59SVladimir Oltean 	KUNIT_CASE(phy_test_tx_polarity_is_missing),
403*e7556b59SVladimir Oltean 	KUNIT_CASE(phy_test_tx_polarity_more_values_than_names),
404*e7556b59SVladimir Oltean 	KUNIT_CASE(phy_test_tx_polarity_single_value_no_names),
405*e7556b59SVladimir Oltean 	KUNIT_CASE(phy_test_tx_polarity_more_names_than_values),
406*e7556b59SVladimir Oltean 	KUNIT_CASE(phy_test_tx_polarity_find_by_name),
407*e7556b59SVladimir Oltean 	KUNIT_CASE(phy_test_tx_polarity_name_not_found_no_default),
408*e7556b59SVladimir Oltean 	KUNIT_CASE(phy_test_tx_polarity_name_not_found_with_default),
409*e7556b59SVladimir Oltean 	KUNIT_CASE(phy_test_tx_polarity_unsupported_value),
410*e7556b59SVladimir Oltean 	{}
411*e7556b59SVladimir Oltean };
412*e7556b59SVladimir Oltean 
413*e7556b59SVladimir Oltean static struct kunit_suite phy_common_props_test_suite = {
414*e7556b59SVladimir Oltean 	.name = "phy-common-props",
415*e7556b59SVladimir Oltean 	.test_cases = phy_common_props_test_cases,
416*e7556b59SVladimir Oltean };
417*e7556b59SVladimir Oltean 
418*e7556b59SVladimir Oltean kunit_test_suite(phy_common_props_test_suite);
419*e7556b59SVladimir Oltean 
420*e7556b59SVladimir Oltean MODULE_DESCRIPTION("Test module for PHY common properties API");
421*e7556b59SVladimir Oltean MODULE_AUTHOR("Vladimir Oltean <vladimir.oltean@nxp.com>");
422*e7556b59SVladimir Oltean MODULE_LICENSE("GPL");
423