xref: /OK3568_Linux_fs/u-boot/test/dm/phy.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Copyright (C) 2017 Texas Instruments Incorporated - http://www.ti.com/
3*4882a593Smuzhiyun  * Written by Jean-Jacques Hiblot  <jjhiblot@ti.com>
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * SPDX-License-Identifier:	GPL-2.0+
6*4882a593Smuzhiyun  */
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun #include <common.h>
9*4882a593Smuzhiyun #include <dm.h>
10*4882a593Smuzhiyun #include <generic-phy.h>
11*4882a593Smuzhiyun #include <dm/test.h>
12*4882a593Smuzhiyun #include <test/ut.h>
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun DECLARE_GLOBAL_DATA_PTR;
15*4882a593Smuzhiyun 
16*4882a593Smuzhiyun /* Base test of the phy uclass */
dm_test_phy_base(struct unit_test_state * uts)17*4882a593Smuzhiyun static int dm_test_phy_base(struct unit_test_state *uts)
18*4882a593Smuzhiyun {
19*4882a593Smuzhiyun 	struct udevice *dev;
20*4882a593Smuzhiyun 	struct phy phy1_method1;
21*4882a593Smuzhiyun 	struct phy phy1_method2;
22*4882a593Smuzhiyun 	struct phy phy2;
23*4882a593Smuzhiyun 	struct phy phy3;
24*4882a593Smuzhiyun 	struct udevice *parent;
25*4882a593Smuzhiyun 
26*4882a593Smuzhiyun 	/* Get the device using the phy device*/
27*4882a593Smuzhiyun 	ut_assertok(uclass_get_device_by_name(UCLASS_SIMPLE_BUS,
28*4882a593Smuzhiyun 					      "gen_phy_user", &parent));
29*4882a593Smuzhiyun 	/*
30*4882a593Smuzhiyun 	 * Get the same phy port in 2 different ways and compare.
31*4882a593Smuzhiyun 	 */
32*4882a593Smuzhiyun 	ut_assertok(generic_phy_get_by_name(parent, "phy1", &phy1_method1))
33*4882a593Smuzhiyun 	ut_assertok(generic_phy_get_by_index(parent, 0, &phy1_method2))
34*4882a593Smuzhiyun 	ut_asserteq(phy1_method1.id, phy1_method2.id);
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun 	/*
37*4882a593Smuzhiyun 	 * Get the second phy port. Check that the same phy provider (device)
38*4882a593Smuzhiyun 	 * provides this 2nd phy port, but that the IDs are different
39*4882a593Smuzhiyun 	 */
40*4882a593Smuzhiyun 	ut_assertok(generic_phy_get_by_name(parent, "phy2", &phy2))
41*4882a593Smuzhiyun 	ut_asserteq_ptr(phy1_method2.dev, phy2.dev);
42*4882a593Smuzhiyun 	ut_assert(phy1_method1.id != phy2.id);
43*4882a593Smuzhiyun 
44*4882a593Smuzhiyun 	/*
45*4882a593Smuzhiyun 	 * Get the third phy port. Check that the phy provider is different
46*4882a593Smuzhiyun 	 */
47*4882a593Smuzhiyun 	ut_assertok(generic_phy_get_by_name(parent, "phy3", &phy3))
48*4882a593Smuzhiyun 	ut_assert(phy2.dev != phy3.dev);
49*4882a593Smuzhiyun 
50*4882a593Smuzhiyun 	/* Try to get a non-existing phy */
51*4882a593Smuzhiyun 	ut_asserteq(-ENODEV, uclass_get_device(UCLASS_PHY, 3, &dev));
52*4882a593Smuzhiyun 	ut_asserteq(-ENODATA, generic_phy_get_by_name(parent,
53*4882a593Smuzhiyun 					"phy_not_existing", &phy1_method1));
54*4882a593Smuzhiyun 
55*4882a593Smuzhiyun 	return 0;
56*4882a593Smuzhiyun }
57*4882a593Smuzhiyun DM_TEST(dm_test_phy_base, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
58*4882a593Smuzhiyun 
59*4882a593Smuzhiyun /* Test of the phy uclass using the sandbox phy driver operations */
dm_test_phy_ops(struct unit_test_state * uts)60*4882a593Smuzhiyun static int dm_test_phy_ops(struct unit_test_state *uts)
61*4882a593Smuzhiyun {
62*4882a593Smuzhiyun 	struct phy phy1;
63*4882a593Smuzhiyun 	struct phy phy2;
64*4882a593Smuzhiyun 	struct phy phy3;
65*4882a593Smuzhiyun 	struct udevice *parent;
66*4882a593Smuzhiyun 
67*4882a593Smuzhiyun 	ut_assertok(uclass_get_device_by_name(UCLASS_SIMPLE_BUS,
68*4882a593Smuzhiyun 					      "gen_phy_user", &parent));
69*4882a593Smuzhiyun 
70*4882a593Smuzhiyun 	ut_assertok(generic_phy_get_by_name(parent, "phy1", &phy1));
71*4882a593Smuzhiyun 	ut_asserteq(0, phy1.id);
72*4882a593Smuzhiyun 	ut_assertok(generic_phy_get_by_name(parent, "phy2", &phy2));
73*4882a593Smuzhiyun 	ut_asserteq(1, phy2.id);
74*4882a593Smuzhiyun 	ut_assertok(generic_phy_get_by_name(parent, "phy3", &phy3));
75*4882a593Smuzhiyun 	ut_asserteq(0, phy3.id);
76*4882a593Smuzhiyun 
77*4882a593Smuzhiyun 	/* test normal operations */
78*4882a593Smuzhiyun 	ut_assertok(generic_phy_init(&phy1));
79*4882a593Smuzhiyun 	ut_assertok(generic_phy_power_on(&phy1));
80*4882a593Smuzhiyun 	ut_assertok(generic_phy_power_off(&phy1));
81*4882a593Smuzhiyun 
82*4882a593Smuzhiyun 	/*
83*4882a593Smuzhiyun 	 * test operations after exit().
84*4882a593Smuzhiyun 	 * The sandbox phy driver does not allow it.
85*4882a593Smuzhiyun 	 */
86*4882a593Smuzhiyun 	ut_assertok(generic_phy_exit(&phy1));
87*4882a593Smuzhiyun 	ut_assert(generic_phy_power_on(&phy1) != 0);
88*4882a593Smuzhiyun 	ut_assert(generic_phy_power_off(&phy1) != 0);
89*4882a593Smuzhiyun 
90*4882a593Smuzhiyun 	/*
91*4882a593Smuzhiyun 	 * test normal operations again (after re-init)
92*4882a593Smuzhiyun 	 */
93*4882a593Smuzhiyun 	ut_assertok(generic_phy_init(&phy1));
94*4882a593Smuzhiyun 	ut_assertok(generic_phy_power_on(&phy1));
95*4882a593Smuzhiyun 	ut_assertok(generic_phy_power_off(&phy1));
96*4882a593Smuzhiyun 
97*4882a593Smuzhiyun 	/*
98*4882a593Smuzhiyun 	 * test calling unimplemented feature.
99*4882a593Smuzhiyun 	 * The call is expected to succeed
100*4882a593Smuzhiyun 	 */
101*4882a593Smuzhiyun 	ut_assertok(generic_phy_reset(&phy1));
102*4882a593Smuzhiyun 
103*4882a593Smuzhiyun 	/* PHY2 has a known problem with power off */
104*4882a593Smuzhiyun 	ut_assertok(generic_phy_init(&phy2));
105*4882a593Smuzhiyun 	ut_assertok(generic_phy_power_on(&phy2));
106*4882a593Smuzhiyun 	ut_asserteq(-EIO, generic_phy_power_off(&phy2));
107*4882a593Smuzhiyun 
108*4882a593Smuzhiyun 	/* PHY3 has a known problem with power off and power on */
109*4882a593Smuzhiyun 	ut_assertok(generic_phy_init(&phy3));
110*4882a593Smuzhiyun 	ut_asserteq(-EIO, generic_phy_power_off(&phy3));
111*4882a593Smuzhiyun 	ut_asserteq(-EIO, generic_phy_power_off(&phy3));
112*4882a593Smuzhiyun 
113*4882a593Smuzhiyun 	return 0;
114*4882a593Smuzhiyun }
115*4882a593Smuzhiyun DM_TEST(dm_test_phy_ops, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
116