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