aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJerome Brunet <jbrunet@baylibre.com>2017-12-18 04:44:42 -0500
committerDavid S. Miller <davem@davemloft.net>2017-12-18 13:24:55 -0500
commitfdaa84c37151f7f8080dc2d7842f681d9790fb87 (patch)
treee66de316ad62358ac18b80a23227bac21f92223a
parent00fd73eb29205c1c94805fe5e39a09135d870e96 (diff)
net: phy: meson-gxl: add read and write helpers for banked registers
Add read and write helpers to manipulate banked registers on this PHY This helps clarify the settings applied to these registers and what the driver actually does Signed-off-by: Neil Armstrong <narmstrong@baylibre.com> Signed-off-by: Jerome Brunet <jbrunet@baylibre.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/phy/meson-gxl.c130
1 files changed, 69 insertions, 61 deletions
diff --git a/drivers/net/phy/meson-gxl.c b/drivers/net/phy/meson-gxl.c
index 61bcc17098d7..a52645566d0d 100644
--- a/drivers/net/phy/meson-gxl.c
+++ b/drivers/net/phy/meson-gxl.c
@@ -50,11 +50,13 @@
50#define FR_PLL_DIV0 0x1c 50#define FR_PLL_DIV0 0x1c
51#define FR_PLL_DIV1 0x1d 51#define FR_PLL_DIV1 0x1d
52 52
53static int meson_gxl_config_init(struct phy_device *phydev) 53static int meson_gxl_open_banks(struct phy_device *phydev)
54{ 54{
55 int ret; 55 int ret;
56 56
57 /* Enable Analog and DSP register Bank access by */ 57 /* Enable Analog and DSP register Bank access by
58 * toggling TSTCNTL_TEST_MODE bit in the TSTCNTL register
59 */
58 ret = phy_write(phydev, TSTCNTL, 0); 60 ret = phy_write(phydev, TSTCNTL, 0);
59 if (ret) 61 if (ret)
60 return ret; 62 return ret;
@@ -64,55 +66,84 @@ static int meson_gxl_config_init(struct phy_device *phydev)
64 ret = phy_write(phydev, TSTCNTL, 0); 66 ret = phy_write(phydev, TSTCNTL, 0);
65 if (ret) 67 if (ret)
66 return ret; 68 return ret;
67 ret = phy_write(phydev, TSTCNTL, TSTCNTL_TEST_MODE); 69 return phy_write(phydev, TSTCNTL, TSTCNTL_TEST_MODE);
68 if (ret) 70}
69 return ret;
70 71
71 /* Write CONFIG_A6*/ 72static void meson_gxl_close_banks(struct phy_device *phydev)
72 ret = phy_write(phydev, TSTWRITE, 0x8e0d); 73{
74 phy_write(phydev, TSTCNTL, 0);
75}
76
77static int meson_gxl_read_reg(struct phy_device *phydev,
78 unsigned int bank, unsigned int reg)
79{
80 int ret;
81
82 ret = meson_gxl_open_banks(phydev);
73 if (ret) 83 if (ret)
74 return ret; 84 goto out;
75 ret = phy_write(phydev, TSTCNTL, 85
76 TSTCNTL_WRITE 86 ret = phy_write(phydev, TSTCNTL, TSTCNTL_READ |
77 | FIELD_PREP(TSTCNTL_REG_BANK_SEL, BANK_ANALOG_DSP) 87 FIELD_PREP(TSTCNTL_REG_BANK_SEL, bank) |
78 | TSTCNTL_TEST_MODE 88 TSTCNTL_TEST_MODE |
79 | FIELD_PREP(TSTCNTL_WRITE_ADDRESS, A6_CONFIG_REG)); 89 FIELD_PREP(TSTCNTL_READ_ADDRESS, reg));
80 if (ret) 90 if (ret)
81 return ret; 91 goto out;
82 92
83 /* Enable fractional PLL */ 93 ret = phy_read(phydev, TSTREAD1);
84 ret = phy_write(phydev, TSTWRITE, 0x0005); 94out:
95 /* Close the bank access on our way out */
96 meson_gxl_close_banks(phydev);
97 return ret;
98}
99
100static int meson_gxl_write_reg(struct phy_device *phydev,
101 unsigned int bank, unsigned int reg,
102 uint16_t value)
103{
104 int ret;
105
106 ret = meson_gxl_open_banks(phydev);
85 if (ret) 107 if (ret)
86 return ret; 108 goto out;
87 ret = phy_write(phydev, TSTCNTL, 109
88 TSTCNTL_WRITE 110 ret = phy_write(phydev, TSTWRITE, value);
89 | FIELD_PREP(TSTCNTL_REG_BANK_SEL, BANK_BIST)
90 | TSTCNTL_TEST_MODE
91 | FIELD_PREP(TSTCNTL_WRITE_ADDRESS, FR_PLL_CONTROL));
92 if (ret) 111 if (ret)
93 return ret; 112 goto out;
94 113
95 /* Program fraction FR_PLL_DIV1 */ 114 ret = phy_write(phydev, TSTCNTL, TSTCNTL_WRITE |
96 ret = phy_write(phydev, TSTWRITE, 0x029a); 115 FIELD_PREP(TSTCNTL_REG_BANK_SEL, bank) |
116 TSTCNTL_TEST_MODE |
117 FIELD_PREP(TSTCNTL_WRITE_ADDRESS, reg));
118
119out:
120 /* Close the bank access on our way out */
121 meson_gxl_close_banks(phydev);
122 return ret;
123}
124
125static int meson_gxl_config_init(struct phy_device *phydev)
126{
127 int ret;
128
129 /* Write CONFIG_A6*/
130 ret = meson_gxl_write_reg(phydev, BANK_ANALOG_DSP, A6_CONFIG_REG,
131 0x8e0d);
97 if (ret) 132 if (ret)
98 return ret; 133 return ret;
99 ret = phy_write(phydev, TSTCNTL, 134
100 TSTCNTL_WRITE 135 /* Enable fractional PLL */
101 | FIELD_PREP(TSTCNTL_REG_BANK_SEL, BANK_BIST) 136 ret = meson_gxl_write_reg(phydev, BANK_BIST, FR_PLL_CONTROL, 0x5);
102 | TSTCNTL_TEST_MODE
103 | FIELD_PREP(TSTCNTL_WRITE_ADDRESS, FR_PLL_DIV1));
104 if (ret) 137 if (ret)
105 return ret; 138 return ret;
106 139
107 /* Program fraction FR_PLL_DIV1 */ 140 /* Program fraction FR_PLL_DIV1 */
108 ret = phy_write(phydev, TSTWRITE, 0xaaaa); 141 ret = meson_gxl_write_reg(phydev, BANK_BIST, FR_PLL_DIV1, 0x029a);
109 if (ret) 142 if (ret)
110 return ret; 143 return ret;
111 ret = phy_write(phydev, TSTCNTL, 144
112 TSTCNTL_WRITE 145 /* Program fraction FR_PLL_DIV1 */
113 | FIELD_PREP(TSTCNTL_REG_BANK_SEL, BANK_BIST) 146 ret = meson_gxl_write_reg(phydev, BANK_BIST, FR_PLL_DIV0, 0xaaaa);
114 | TSTCNTL_TEST_MODE
115 | FIELD_PREP(TSTCNTL_WRITE_ADDRESS, FR_PLL_DIV0));
116 if (ret) 147 if (ret)
117 return ret; 148 return ret;
118 149
@@ -146,31 +177,8 @@ static int meson_gxl_read_status(struct phy_device *phydev)
146 else if (!ret) 177 else if (!ret)
147 goto read_status_continue; 178 goto read_status_continue;
148 179
149 /* Need to access WOL bank, make sure the access is open */ 180 /* Aneg is done, let's check everything is fine */
150 ret = phy_write(phydev, TSTCNTL, 0); 181 wol = meson_gxl_read_reg(phydev, BANK_WOL, LPI_STATUS);
151 if (ret)
152 return ret;
153 ret = phy_write(phydev, TSTCNTL, TSTCNTL_TEST_MODE);
154 if (ret)
155 return ret;
156 ret = phy_write(phydev, TSTCNTL, 0);
157 if (ret)
158 return ret;
159 ret = phy_write(phydev, TSTCNTL, TSTCNTL_TEST_MODE);
160 if (ret)
161 return ret;
162
163 /* Request LPI_STATUS WOL register */
164 ret = phy_write(phydev, TSTCNTL,
165 TSTCNTL_READ
166 | FIELD_PREP(TSTCNTL_REG_BANK_SEL, BANK_WOL)
167 | TSTCNTL_TEST_MODE
168 | FIELD_PREP(TSTCNTL_READ_ADDRESS, LPI_STATUS));
169 if (ret)
170 return ret;
171
172 /* Read LPI_STATUS value */
173 wol = phy_read(phydev, TSTREAD1);
174 if (wol < 0) 182 if (wol < 0)
175 return wol; 183 return wol;
176 184