Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

PCI: rockchip: Split out common function to init controller

Most of the initialization are used for both of RC driver and
EP driver; factor the initialization out to a new function,
rockchip_pcie_init_port(), in pcie-rockchip.c and rename the
original function to rockchip_pcie_host_init_port() to avoid
confusion. No functional changed intended.

Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>
Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Tested-by: Jeffy Chen <jeffy.chen@rock-chips.com>

authored by

Shawn Lin and committed by
Lorenzo Pieralisi
3593709f 964bac94

+152 -125
+7 -125
drivers/pci/host/pcie-rockchip-host.c
··· 293 293 } 294 294 295 295 /** 296 - * rockchip_pcie_init_port - Initialize hardware 296 + * rockchip_pcie_host_init_port - Initialize hardware 297 297 * @rockchip: PCIe port information 298 298 */ 299 - static int rockchip_pcie_init_port(struct rockchip_pcie *rockchip) 299 + static int rockchip_pcie_host_init_port(struct rockchip_pcie *rockchip) 300 300 { 301 301 struct device *dev = rockchip->dev; 302 - int err, i; 302 + int err, i = MAX_LANE_NUM; 303 303 u32 status; 304 304 305 305 gpiod_set_value_cansleep(rockchip->ep_gpio, 0); 306 306 307 - err = reset_control_assert(rockchip->aclk_rst); 308 - if (err) { 309 - dev_err(dev, "assert aclk_rst err %d\n", err); 307 + err = rockchip_pcie_init_port(rockchip); 308 + if (err) 310 309 return err; 311 - } 312 - 313 - err = reset_control_assert(rockchip->pclk_rst); 314 - if (err) { 315 - dev_err(dev, "assert pclk_rst err %d\n", err); 316 - return err; 317 - } 318 - 319 - err = reset_control_assert(rockchip->pm_rst); 320 - if (err) { 321 - dev_err(dev, "assert pm_rst err %d\n", err); 322 - return err; 323 - } 324 - 325 - for (i = 0; i < MAX_LANE_NUM; i++) { 326 - err = phy_init(rockchip->phys[i]); 327 - if (err) { 328 - dev_err(dev, "init phy%d err %d\n", i, err); 329 - goto err_exit_phy; 330 - } 331 - } 332 - 333 - err = reset_control_assert(rockchip->core_rst); 334 - if (err) { 335 - dev_err(dev, "assert core_rst err %d\n", err); 336 - goto err_exit_phy; 337 - } 338 - 339 - err = reset_control_assert(rockchip->mgmt_rst); 340 - if (err) { 341 - dev_err(dev, "assert mgmt_rst err %d\n", err); 342 - goto err_exit_phy; 343 - } 344 - 345 - err = reset_control_assert(rockchip->mgmt_sticky_rst); 346 - if (err) { 347 - dev_err(dev, "assert mgmt_sticky_rst err %d\n", err); 348 - goto err_exit_phy; 349 - } 350 - 351 - err = reset_control_assert(rockchip->pipe_rst); 352 - if (err) { 353 - dev_err(dev, "assert pipe_rst err %d\n", err); 354 - goto err_exit_phy; 355 - } 356 - 357 - udelay(10); 358 - 359 - err = reset_control_deassert(rockchip->pm_rst); 360 - if (err) { 361 - dev_err(dev, "deassert pm_rst err %d\n", err); 362 - goto err_exit_phy; 363 - } 364 - 365 - err = reset_control_deassert(rockchip->aclk_rst); 366 - if (err) { 367 - dev_err(dev, "deassert aclk_rst err %d\n", err); 368 - goto err_exit_phy; 369 - } 370 - 371 - err = reset_control_deassert(rockchip->pclk_rst); 372 - if (err) { 373 - dev_err(dev, "deassert pclk_rst err %d\n", err); 374 - goto err_exit_phy; 375 - } 376 - 377 - if (rockchip->link_gen == 2) 378 - rockchip_pcie_write(rockchip, PCIE_CLIENT_GEN_SEL_2, 379 - PCIE_CLIENT_CONFIG); 380 - else 381 - rockchip_pcie_write(rockchip, PCIE_CLIENT_GEN_SEL_1, 382 - PCIE_CLIENT_CONFIG); 383 - 384 - rockchip_pcie_write(rockchip, 385 - PCIE_CLIENT_CONF_ENABLE | 386 - PCIE_CLIENT_LINK_TRAIN_ENABLE | 387 - PCIE_CLIENT_ARI_ENABLE | 388 - PCIE_CLIENT_CONF_LANE_NUM(rockchip->lanes) | 389 - PCIE_CLIENT_MODE_RC, 390 - PCIE_CLIENT_CONFIG); 391 - 392 - for (i = 0; i < MAX_LANE_NUM; i++) { 393 - err = phy_power_on(rockchip->phys[i]); 394 - if (err) { 395 - dev_err(dev, "power on phy%d err %d\n", i, err); 396 - goto err_power_off_phy; 397 - } 398 - } 399 - 400 - /* 401 - * Please don't reorder the deassert sequence of the following 402 - * four reset pins. 403 - */ 404 - err = reset_control_deassert(rockchip->mgmt_sticky_rst); 405 - if (err) { 406 - dev_err(dev, "deassert mgmt_sticky_rst err %d\n", err); 407 - goto err_power_off_phy; 408 - } 409 - 410 - err = reset_control_deassert(rockchip->core_rst); 411 - if (err) { 412 - dev_err(dev, "deassert core_rst err %d\n", err); 413 - goto err_power_off_phy; 414 - } 415 - 416 - err = reset_control_deassert(rockchip->mgmt_rst); 417 - if (err) { 418 - dev_err(dev, "deassert mgmt_rst err %d\n", err); 419 - goto err_power_off_phy; 420 - } 421 - 422 - err = reset_control_deassert(rockchip->pipe_rst); 423 - if (err) { 424 - dev_err(dev, "deassert pipe_rst err %d\n", err); 425 - goto err_power_off_phy; 426 - } 427 310 428 311 /* Fix the transmitted FTS count desired to exit from L0s. */ 429 312 status = rockchip_pcie_read(rockchip, PCIE_CORE_CTRL_PLC1); ··· 400 517 while (i--) 401 518 phy_power_off(rockchip->phys[i]); 402 519 i = MAX_LANE_NUM; 403 - err_exit_phy: 404 520 while (i--) 405 521 phy_exit(rockchip->phys[i]); 406 522 return err; ··· 918 1036 if (err) 919 1037 goto err_disable_0v9; 920 1038 921 - err = rockchip_pcie_init_port(rockchip); 1039 + err = rockchip_pcie_host_init_port(rockchip); 922 1040 if (err) 923 1041 goto err_pcie_resume; 924 1042 ··· 983 1101 goto err_set_vpcie; 984 1102 } 985 1103 986 - err = rockchip_pcie_init_port(rockchip); 1104 + err = rockchip_pcie_host_init_port(rockchip); 987 1105 if (err) 988 1106 goto err_vpcie; 989 1107
+142
drivers/pci/host/pcie-rockchip.c
··· 12 12 */ 13 13 14 14 #include <linux/clk.h> 15 + #include <linux/delay.h> 15 16 #include <linux/gpio/consumer.h> 16 17 #include <linux/of_pci.h> 17 18 #include <linux/phy/phy.h> ··· 145 144 return 0; 146 145 } 147 146 EXPORT_SYMBOL_GPL(rockchip_pcie_parse_dt); 147 + 148 + int rockchip_pcie_init_port(struct rockchip_pcie *rockchip) 149 + { 150 + struct device *dev = rockchip->dev; 151 + int err, i; 152 + u32 regs; 153 + 154 + err = reset_control_assert(rockchip->aclk_rst); 155 + if (err) { 156 + dev_err(dev, "assert aclk_rst err %d\n", err); 157 + return err; 158 + } 159 + 160 + err = reset_control_assert(rockchip->pclk_rst); 161 + if (err) { 162 + dev_err(dev, "assert pclk_rst err %d\n", err); 163 + return err; 164 + } 165 + 166 + err = reset_control_assert(rockchip->pm_rst); 167 + if (err) { 168 + dev_err(dev, "assert pm_rst err %d\n", err); 169 + return err; 170 + } 171 + 172 + for (i = 0; i < MAX_LANE_NUM; i++) { 173 + err = phy_init(rockchip->phys[i]); 174 + if (err) { 175 + dev_err(dev, "init phy%d err %d\n", i, err); 176 + goto err_exit_phy; 177 + } 178 + } 179 + 180 + err = reset_control_assert(rockchip->core_rst); 181 + if (err) { 182 + dev_err(dev, "assert core_rst err %d\n", err); 183 + goto err_exit_phy; 184 + } 185 + 186 + err = reset_control_assert(rockchip->mgmt_rst); 187 + if (err) { 188 + dev_err(dev, "assert mgmt_rst err %d\n", err); 189 + goto err_exit_phy; 190 + } 191 + 192 + err = reset_control_assert(rockchip->mgmt_sticky_rst); 193 + if (err) { 194 + dev_err(dev, "assert mgmt_sticky_rst err %d\n", err); 195 + goto err_exit_phy; 196 + } 197 + 198 + err = reset_control_assert(rockchip->pipe_rst); 199 + if (err) { 200 + dev_err(dev, "assert pipe_rst err %d\n", err); 201 + goto err_exit_phy; 202 + } 203 + 204 + udelay(10); 205 + 206 + err = reset_control_deassert(rockchip->pm_rst); 207 + if (err) { 208 + dev_err(dev, "deassert pm_rst err %d\n", err); 209 + goto err_exit_phy; 210 + } 211 + 212 + err = reset_control_deassert(rockchip->aclk_rst); 213 + if (err) { 214 + dev_err(dev, "deassert aclk_rst err %d\n", err); 215 + goto err_exit_phy; 216 + } 217 + 218 + err = reset_control_deassert(rockchip->pclk_rst); 219 + if (err) { 220 + dev_err(dev, "deassert pclk_rst err %d\n", err); 221 + goto err_exit_phy; 222 + } 223 + 224 + if (rockchip->link_gen == 2) 225 + rockchip_pcie_write(rockchip, PCIE_CLIENT_GEN_SEL_2, 226 + PCIE_CLIENT_CONFIG); 227 + else 228 + rockchip_pcie_write(rockchip, PCIE_CLIENT_GEN_SEL_1, 229 + PCIE_CLIENT_CONFIG); 230 + 231 + regs = PCIE_CLIENT_LINK_TRAIN_ENABLE | PCIE_CLIENT_ARI_ENABLE | 232 + PCIE_CLIENT_CONF_LANE_NUM(rockchip->lanes); 233 + 234 + if (rockchip->is_rc) 235 + regs |= PCIE_CLIENT_CONF_ENABLE | PCIE_CLIENT_MODE_RC; 236 + else 237 + regs |= PCIE_CLIENT_CONF_DISABLE | PCIE_CLIENT_MODE_EP; 238 + 239 + rockchip_pcie_write(rockchip, regs, PCIE_CLIENT_CONFIG); 240 + 241 + for (i = 0; i < MAX_LANE_NUM; i++) { 242 + err = phy_power_on(rockchip->phys[i]); 243 + if (err) { 244 + dev_err(dev, "power on phy%d err %d\n", i, err); 245 + goto err_power_off_phy; 246 + } 247 + } 248 + 249 + /* 250 + * Please don't reorder the deassert sequence of the following 251 + * four reset pins. 252 + */ 253 + err = reset_control_deassert(rockchip->mgmt_sticky_rst); 254 + if (err) { 255 + dev_err(dev, "deassert mgmt_sticky_rst err %d\n", err); 256 + goto err_power_off_phy; 257 + } 258 + 259 + err = reset_control_deassert(rockchip->core_rst); 260 + if (err) { 261 + dev_err(dev, "deassert core_rst err %d\n", err); 262 + goto err_power_off_phy; 263 + } 264 + 265 + err = reset_control_deassert(rockchip->mgmt_rst); 266 + if (err) { 267 + dev_err(dev, "deassert mgmt_rst err %d\n", err); 268 + goto err_power_off_phy; 269 + } 270 + 271 + err = reset_control_deassert(rockchip->pipe_rst); 272 + if (err) { 273 + dev_err(dev, "deassert pipe_rst err %d\n", err); 274 + goto err_power_off_phy; 275 + } 276 + 277 + return 0; 278 + err_power_off_phy: 279 + while (i--) 280 + phy_power_off(rockchip->phys[i]); 281 + i = MAX_LANE_NUM; 282 + err_exit_phy: 283 + while (i--) 284 + phy_exit(rockchip->phys[i]); 285 + return err; 286 + } 287 + EXPORT_SYMBOL_GPL(rockchip_pcie_init_port); 148 288 149 289 int rockchip_pcie_get_phys(struct rockchip_pcie *rockchip) 150 290 {
+3
drivers/pci/host/pcie-rockchip.h
··· 27 27 #define PCIE_CLIENT_BASE 0x0 28 28 #define PCIE_CLIENT_CONFIG (PCIE_CLIENT_BASE + 0x00) 29 29 #define PCIE_CLIENT_CONF_ENABLE HIWORD_UPDATE_BIT(0x0001) 30 + #define PCIE_CLIENT_CONF_DISABLE HIWORD_UPDATE(0x0001, 0) 30 31 #define PCIE_CLIENT_LINK_TRAIN_ENABLE HIWORD_UPDATE_BIT(0x0002) 31 32 #define PCIE_CLIENT_ARI_ENABLE HIWORD_UPDATE_BIT(0x0008) 32 33 #define PCIE_CLIENT_CONF_LANE_NUM(x) HIWORD_UPDATE(0x0030, ENCODE_LANES(x)) 33 34 #define PCIE_CLIENT_MODE_RC HIWORD_UPDATE_BIT(0x0040) 35 + #define PCIE_CLIENT_MODE_EP HIWORD_UPDATE(0x0040, 0) 34 36 #define PCIE_CLIENT_GEN_SEL_1 HIWORD_UPDATE(0x0080, 0) 35 37 #define PCIE_CLIENT_GEN_SEL_2 HIWORD_UPDATE_BIT(0x0080) 36 38 #define PCIE_CLIENT_DEBUG_OUT_0 (PCIE_CLIENT_BASE + 0x3c) ··· 239 237 } 240 238 241 239 int rockchip_pcie_parse_dt(struct rockchip_pcie *rockchip); 240 + int rockchip_pcie_init_port(struct rockchip_pcie *rockchip); 242 241 int rockchip_pcie_get_phys(struct rockchip_pcie *rockchip); 243 242 void rockchip_pcie_deinit_phys(struct rockchip_pcie *rockchip); 244 243 int rockchip_pcie_enable_clocks(struct rockchip_pcie *rockchip);