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

drm/tegra: sor: Operate on struct drm_dp_aux *

Instead of getting a pointer to the driver-specific wrapper of AUX
channels, use the AUX channel objects directly to avoid hackish casting
between the two types.

Signed-off-by: Thierry Reding <treding@nvidia.com>

+60 -60
+23 -18
drivers/gpu/drm/tegra/dpaux.c
··· 436 436 .remove = tegra_dpaux_remove, 437 437 }; 438 438 439 - struct tegra_dpaux *tegra_dpaux_find_by_of_node(struct device_node *np) 439 + struct drm_dp_aux *drm_dp_aux_find_by_of_node(struct device_node *np) 440 440 { 441 441 struct tegra_dpaux *dpaux; 442 442 ··· 445 445 list_for_each_entry(dpaux, &dpaux_list, list) 446 446 if (np == dpaux->dev->of_node) { 447 447 mutex_unlock(&dpaux_lock); 448 - return dpaux; 448 + return &dpaux->aux; 449 449 } 450 450 451 451 mutex_unlock(&dpaux_lock); ··· 453 453 return NULL; 454 454 } 455 455 456 - int tegra_dpaux_attach(struct tegra_dpaux *dpaux, struct tegra_output *output) 456 + int drm_dp_aux_attach(struct drm_dp_aux *aux, struct tegra_output *output) 457 457 { 458 + struct tegra_dpaux *dpaux = to_dpaux(aux); 458 459 unsigned long timeout; 459 460 int err; 460 461 ··· 471 470 while (time_before(jiffies, timeout)) { 472 471 enum drm_connector_status status; 473 472 474 - status = tegra_dpaux_detect(dpaux); 473 + status = drm_dp_aux_detect(aux); 475 474 if (status == connector_status_connected) { 476 475 enable_irq(dpaux->irq); 477 476 return 0; ··· 483 482 return -ETIMEDOUT; 484 483 } 485 484 486 - int tegra_dpaux_detach(struct tegra_dpaux *dpaux) 485 + int drm_dp_aux_detach(struct drm_dp_aux *aux) 487 486 { 487 + struct tegra_dpaux *dpaux = to_dpaux(aux); 488 488 unsigned long timeout; 489 489 int err; 490 490 ··· 500 498 while (time_before(jiffies, timeout)) { 501 499 enum drm_connector_status status; 502 500 503 - status = tegra_dpaux_detect(dpaux); 501 + status = drm_dp_aux_detect(aux); 504 502 if (status == connector_status_disconnected) { 505 503 dpaux->output = NULL; 506 504 return 0; ··· 512 510 return -ETIMEDOUT; 513 511 } 514 512 515 - enum drm_connector_status tegra_dpaux_detect(struct tegra_dpaux *dpaux) 513 + enum drm_connector_status drm_dp_aux_detect(struct drm_dp_aux *aux) 516 514 { 515 + struct tegra_dpaux *dpaux = to_dpaux(aux); 517 516 u32 value; 518 517 519 518 value = tegra_dpaux_readl(dpaux, DPAUX_DP_AUXSTAT); ··· 525 522 return connector_status_disconnected; 526 523 } 527 524 528 - int tegra_dpaux_enable(struct tegra_dpaux *dpaux) 525 + int drm_dp_aux_enable(struct drm_dp_aux *aux) 529 526 { 527 + struct tegra_dpaux *dpaux = to_dpaux(aux); 530 528 u32 value; 531 529 532 530 value = DPAUX_HYBRID_PADCTL_AUX_CMH(2) | ··· 544 540 return 0; 545 541 } 546 542 547 - int tegra_dpaux_disable(struct tegra_dpaux *dpaux) 543 + int drm_dp_aux_disable(struct drm_dp_aux *aux) 548 544 { 545 + struct tegra_dpaux *dpaux = to_dpaux(aux); 549 546 u32 value; 550 547 551 548 value = tegra_dpaux_readl(dpaux, DPAUX_HYBRID_SPARE); ··· 556 551 return 0; 557 552 } 558 553 559 - int tegra_dpaux_prepare(struct tegra_dpaux *dpaux, u8 encoding) 554 + int drm_dp_aux_prepare(struct drm_dp_aux *aux, u8 encoding) 560 555 { 561 556 int err; 562 557 563 - err = drm_dp_dpcd_writeb(&dpaux->aux, DP_MAIN_LINK_CHANNEL_CODING_SET, 558 + err = drm_dp_dpcd_writeb(aux, DP_MAIN_LINK_CHANNEL_CODING_SET, 564 559 encoding); 565 560 if (err < 0) 566 561 return err; ··· 568 563 return 0; 569 564 } 570 565 571 - int tegra_dpaux_train(struct tegra_dpaux *dpaux, struct drm_dp_link *link, 572 - u8 pattern) 566 + int drm_dp_aux_train(struct drm_dp_aux *aux, struct drm_dp_link *link, 567 + u8 pattern) 573 568 { 574 569 u8 tp = pattern & DP_TRAINING_PATTERN_MASK; 575 570 u8 status[DP_LINK_STATUS_SIZE], values[4]; 576 571 unsigned int i; 577 572 int err; 578 573 579 - err = drm_dp_dpcd_writeb(&dpaux->aux, DP_TRAINING_PATTERN_SET, pattern); 574 + err = drm_dp_dpcd_writeb(aux, DP_TRAINING_PATTERN_SET, pattern); 580 575 if (err < 0) 581 576 return err; 582 577 ··· 589 584 DP_TRAIN_MAX_SWING_REACHED | 590 585 DP_TRAIN_VOLTAGE_SWING_LEVEL_0; 591 586 592 - err = drm_dp_dpcd_write(&dpaux->aux, DP_TRAINING_LANE0_SET, values, 587 + err = drm_dp_dpcd_write(aux, DP_TRAINING_LANE0_SET, values, 593 588 link->num_lanes); 594 589 if (err < 0) 595 590 return err; 596 591 597 592 usleep_range(500, 1000); 598 593 599 - err = drm_dp_dpcd_read_link_status(&dpaux->aux, status); 594 + err = drm_dp_dpcd_read_link_status(aux, status); 600 595 if (err < 0) 601 596 return err; 602 597 ··· 614 609 break; 615 610 616 611 default: 617 - dev_err(dpaux->dev, "unsupported training pattern %u\n", tp); 612 + dev_err(aux->dev, "unsupported training pattern %u\n", tp); 618 613 return -EINVAL; 619 614 } 620 615 621 - err = drm_dp_dpcd_writeb(&dpaux->aux, DP_EDP_CONFIGURATION_SET, 0); 616 + err = drm_dp_dpcd_writeb(aux, DP_EDP_CONFIGURATION_SET, 0); 622 617 if (err < 0) 623 618 return err; 624 619
+9 -10
drivers/gpu/drm/tegra/drm.h
··· 247 247 void tegra_output_encoder_destroy(struct drm_encoder *encoder); 248 248 249 249 /* from dpaux.c */ 250 - struct tegra_dpaux; 251 250 struct drm_dp_link; 252 251 253 - struct tegra_dpaux *tegra_dpaux_find_by_of_node(struct device_node *np); 254 - enum drm_connector_status tegra_dpaux_detect(struct tegra_dpaux *dpaux); 255 - int tegra_dpaux_attach(struct tegra_dpaux *dpaux, struct tegra_output *output); 256 - int tegra_dpaux_detach(struct tegra_dpaux *dpaux); 257 - int tegra_dpaux_enable(struct tegra_dpaux *dpaux); 258 - int tegra_dpaux_disable(struct tegra_dpaux *dpaux); 259 - int tegra_dpaux_prepare(struct tegra_dpaux *dpaux, u8 encoding); 260 - int tegra_dpaux_train(struct tegra_dpaux *dpaux, struct drm_dp_link *link, 261 - u8 pattern); 252 + struct drm_dp_aux *drm_dp_aux_find_by_of_node(struct device_node *np); 253 + enum drm_connector_status drm_dp_aux_detect(struct drm_dp_aux *aux); 254 + int drm_dp_aux_attach(struct drm_dp_aux *aux, struct tegra_output *output); 255 + int drm_dp_aux_detach(struct drm_dp_aux *aux); 256 + int drm_dp_aux_enable(struct drm_dp_aux *aux); 257 + int drm_dp_aux_disable(struct drm_dp_aux *aux); 258 + int drm_dp_aux_prepare(struct drm_dp_aux *aux, u8 encoding); 259 + int drm_dp_aux_train(struct drm_dp_aux *aux, struct drm_dp_link *link, 260 + u8 pattern); 262 261 263 262 /* from fb.c */ 264 263 struct tegra_bo *tegra_fb_get_plane(struct drm_framebuffer *framebuffer,
+28 -32
drivers/gpu/drm/tegra/sor.c
··· 173 173 struct clk *clk_dp; 174 174 struct clk *clk; 175 175 176 - struct tegra_dpaux *dpaux; 176 + struct drm_dp_aux *aux; 177 177 178 178 struct drm_info_list *debugfs_files; 179 179 struct drm_minor *minor; ··· 273 273 SOR_DP_PADCTL_CM_TXD_1 | SOR_DP_PADCTL_CM_TXD_0); 274 274 tegra_sor_writel(sor, value, SOR_DP_PADCTL0); 275 275 276 - err = tegra_dpaux_prepare(sor->dpaux, DP_SET_ANSI_8B10B); 276 + err = drm_dp_aux_prepare(sor->aux, DP_SET_ANSI_8B10B); 277 277 if (err < 0) 278 278 return err; 279 279 ··· 288 288 289 289 pattern = DP_TRAINING_PATTERN_1; 290 290 291 - err = tegra_dpaux_train(sor->dpaux, link, pattern); 291 + err = drm_dp_aux_train(sor->aux, link, pattern); 292 292 if (err < 0) 293 293 return err; 294 294 ··· 309 309 310 310 pattern = DP_LINK_SCRAMBLING_DISABLE | DP_TRAINING_PATTERN_2; 311 311 312 - err = tegra_dpaux_train(sor->dpaux, link, pattern); 312 + err = drm_dp_aux_train(sor->aux, link, pattern); 313 313 if (err < 0) 314 314 return err; 315 315 ··· 324 324 325 325 pattern = DP_TRAINING_PATTERN_DISABLE; 326 326 327 - err = tegra_dpaux_train(sor->dpaux, link, pattern); 327 + err = drm_dp_aux_train(sor->aux, link, pattern); 328 328 if (err < 0) 329 329 return err; 330 330 ··· 1044 1044 struct tegra_output *output = connector_to_output(connector); 1045 1045 struct tegra_sor *sor = to_sor(output); 1046 1046 1047 - if (sor->dpaux) 1048 - return tegra_dpaux_detect(sor->dpaux); 1047 + if (sor->aux) 1048 + return drm_dp_aux_detect(sor->aux); 1049 1049 1050 1050 return tegra_output_connector_detect(connector, force); 1051 1051 } ··· 1066 1066 struct tegra_sor *sor = to_sor(output); 1067 1067 int err; 1068 1068 1069 - if (sor->dpaux) 1070 - tegra_dpaux_enable(sor->dpaux); 1069 + if (sor->aux) 1070 + drm_dp_aux_enable(sor->aux); 1071 1071 1072 1072 err = tegra_output_connector_get_modes(connector); 1073 1073 1074 - if (sor->dpaux) 1075 - tegra_dpaux_disable(sor->dpaux); 1074 + if (sor->aux) 1075 + drm_dp_aux_disable(sor->aux); 1076 1076 1077 1077 return err; 1078 1078 } ··· 1128 1128 if (err < 0) 1129 1129 dev_err(sor->dev, "failed to power down SOR: %d\n", err); 1130 1130 1131 - if (sor->dpaux) { 1132 - err = tegra_dpaux_disable(sor->dpaux); 1131 + if (sor->aux) { 1132 + err = drm_dp_aux_disable(sor->aux); 1133 1133 if (err < 0) 1134 1134 dev_err(sor->dev, "failed to disable DP: %d\n", err); 1135 1135 } ··· 1196 1196 struct tegra_sor *sor = to_sor(output); 1197 1197 struct tegra_sor_config config; 1198 1198 struct drm_dp_link link; 1199 - struct drm_dp_aux *aux; 1200 1199 int err = 0; 1201 1200 u32 value; 1202 1201 ··· 1208 1209 if (output->panel) 1209 1210 drm_panel_prepare(output->panel); 1210 1211 1211 - /* FIXME: properly convert to struct drm_dp_aux */ 1212 - aux = (struct drm_dp_aux *)sor->dpaux; 1213 - 1214 - if (sor->dpaux) { 1215 - err = tegra_dpaux_enable(sor->dpaux); 1212 + if (sor->aux) { 1213 + err = drm_dp_aux_enable(sor->aux); 1216 1214 if (err < 0) 1217 1215 dev_err(sor->dev, "failed to enable DP: %d\n", err); 1218 1216 1219 - err = drm_dp_link_probe(aux, &link); 1217 + err = drm_dp_link_probe(sor->aux, &link); 1220 1218 if (err < 0) { 1221 1219 dev_err(sor->dev, "failed to probe eDP link: %d\n", 1222 1220 err); ··· 1430 1434 value |= SOR_DP_PADCTL_PAD_CAL_PD; 1431 1435 tegra_sor_writel(sor, value, SOR_DP_PADCTL0); 1432 1436 1433 - if (sor->dpaux) { 1437 + if (sor->aux) { 1434 1438 u8 rate, lanes; 1435 1439 1436 - err = drm_dp_link_probe(aux, &link); 1440 + err = drm_dp_link_probe(sor->aux, &link); 1437 1441 if (err < 0) 1438 1442 dev_err(sor->dev, "failed to probe eDP link: %d\n", 1439 1443 err); 1440 1444 1441 - err = drm_dp_link_power_up(aux, &link); 1445 + err = drm_dp_link_power_up(sor->aux, &link); 1442 1446 if (err < 0) 1443 1447 dev_err(sor->dev, "failed to power up eDP link: %d\n", 1444 1448 err); 1445 1449 1446 - err = drm_dp_link_configure(aux, &link); 1450 + err = drm_dp_link_configure(sor->aux, &link); 1447 1451 if (err < 0) 1448 1452 dev_err(sor->dev, "failed to configure eDP link: %d\n", 1449 1453 err); ··· 2144 2148 int encoder = DRM_MODE_ENCODER_NONE; 2145 2149 int err; 2146 2150 2147 - if (!sor->dpaux) { 2151 + if (!sor->aux) { 2148 2152 if (sor->soc->supports_hdmi) { 2149 2153 connector = DRM_MODE_CONNECTOR_HDMIA; 2150 2154 encoder = DRM_MODE_ENCODER_TMDS; ··· 2195 2199 dev_err(sor->dev, "debugfs setup failed: %d\n", err); 2196 2200 } 2197 2201 2198 - if (sor->dpaux) { 2199 - err = tegra_dpaux_attach(sor->dpaux, &sor->output); 2202 + if (sor->aux) { 2203 + err = drm_dp_aux_attach(sor->aux, &sor->output); 2200 2204 if (err < 0) { 2201 2205 dev_err(sor->dev, "failed to attach DP: %d\n", err); 2202 2206 return err; ··· 2245 2249 2246 2250 tegra_output_exit(&sor->output); 2247 2251 2248 - if (sor->dpaux) { 2249 - err = tegra_dpaux_detach(sor->dpaux); 2252 + if (sor->aux) { 2253 + err = drm_dp_aux_detach(sor->aux); 2250 2254 if (err < 0) { 2251 2255 dev_err(sor->dev, "failed to detach DP: %d\n", err); 2252 2256 return err; ··· 2395 2399 2396 2400 np = of_parse_phandle(pdev->dev.of_node, "nvidia,dpaux", 0); 2397 2401 if (np) { 2398 - sor->dpaux = tegra_dpaux_find_by_of_node(np); 2402 + sor->aux = drm_dp_aux_find_by_of_node(np); 2399 2403 of_node_put(np); 2400 2404 2401 - if (!sor->dpaux) 2405 + if (!sor->aux) 2402 2406 return -EPROBE_DEFER; 2403 2407 } 2404 2408 2405 - if (!sor->dpaux) { 2409 + if (!sor->aux) { 2406 2410 if (sor->soc->supports_hdmi) { 2407 2411 sor->ops = &tegra_sor_hdmi_ops; 2408 2412 } else if (sor->soc->supports_lvds) {