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

drm: xlnx: zynqmp_dpsub: Register AUX bus at bridge attach time

To prepare for operating as a standalone DP bridge with the DRM device
implemented in the PL, move registration of the AUX bus to bridge attach
time, as that's the earliest point when a DRM device is available.

The DRM device pointer stored in zynqmp_dp isn't used anymore, drop it.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>

+24 -17
+24 -17
drivers/gpu/drm/xlnx/zynqmp_dp.c
··· 276 276 * struct zynqmp_dp - Xilinx DisplayPort core 277 277 * @dev: device structure 278 278 * @dpsub: Display subsystem 279 - * @drm: DRM core 280 279 * @iomem: device I/O memory for register access 281 280 * @reset: reset controller 282 281 * @irq: irq ··· 296 297 struct zynqmp_dp { 297 298 struct device *dev; 298 299 struct zynqmp_dpsub *dpsub; 299 - struct drm_device *drm; 300 300 void __iomem *iomem; 301 301 struct reset_control *reset; 302 302 int irq; ··· 1055 1057 1056 1058 dp->aux.name = "ZynqMP DP AUX"; 1057 1059 dp->aux.dev = dp->dev; 1058 - dp->aux.drm_dev = dp->drm; 1060 + dp->aux.drm_dev = dp->bridge.dev; 1059 1061 dp->aux.transfer = zynqmp_dp_aux_transfer; 1060 1062 1061 1063 return drm_dp_aux_register(&dp->aux); ··· 1281 1283 struct zynqmp_dp *dp = bridge_to_dp(bridge); 1282 1284 int ret; 1283 1285 1286 + /* Initialize and register the AUX adapter. */ 1287 + ret = zynqmp_dp_aux_init(dp); 1288 + if (ret) { 1289 + dev_err(dp->dev, "failed to initialize DP aux\n"); 1290 + return ret; 1291 + } 1292 + 1284 1293 if (dp->next_bridge) { 1285 1294 ret = drm_bridge_attach(bridge->encoder, dp->next_bridge, 1286 1295 bridge, flags); 1287 1296 if (ret < 0) 1288 - return ret; 1297 + goto error; 1289 1298 } 1290 1299 1300 + /* Now that initialisation is complete, enable interrupts. */ 1301 + zynqmp_dp_write(dp, ZYNQMP_DP_INT_EN, ZYNQMP_DP_INT_ALL); 1302 + 1291 1303 return 0; 1304 + 1305 + error: 1306 + zynqmp_dp_aux_cleanup(dp); 1307 + return ret; 1308 + } 1309 + 1310 + static void zynqmp_dp_bridge_detach(struct drm_bridge *bridge) 1311 + { 1312 + struct zynqmp_dp *dp = bridge_to_dp(bridge); 1313 + 1314 + zynqmp_dp_aux_cleanup(dp); 1292 1315 } 1293 1316 1294 1317 static int zynqmp_dp_bridge_mode_valid(struct drm_bridge *bridge, ··· 1514 1495 1515 1496 static const struct drm_bridge_funcs zynqmp_dp_bridge_funcs = { 1516 1497 .attach = zynqmp_dp_bridge_attach, 1498 + .detach = zynqmp_dp_bridge_detach, 1517 1499 .mode_valid = zynqmp_dp_bridge_mode_valid, 1518 1500 .atomic_enable = zynqmp_dp_bridge_atomic_enable, 1519 1501 .atomic_disable = zynqmp_dp_bridge_atomic_disable, ··· 1614 1594 { 1615 1595 struct zynqmp_dp *dp = dpsub->dp; 1616 1596 struct drm_bridge *bridge = &dp->bridge; 1617 - int ret; 1618 1597 1619 1598 dp->config.misc0 &= ~ZYNQMP_DP_MAIN_STREAM_MISC0_SYNC_LOCK; 1620 1599 zynqmp_dp_set_format(dp, NULL, ZYNQMP_DPSUB_FORMAT_RGB, 8); ··· 1624 1605 | DRM_BRIDGE_OP_HPD; 1625 1606 bridge->type = DRM_MODE_CONNECTOR_DisplayPort; 1626 1607 dpsub->bridge = bridge; 1627 - 1628 - /* Initialize and register the AUX adapter. */ 1629 - ret = zynqmp_dp_aux_init(dp); 1630 - if (ret) { 1631 - dev_err(dp->dev, "failed to initialize DP aux\n"); 1632 - return ret; 1633 - } 1634 - 1635 - /* Now that initialisation is complete, enable interrupts. */ 1636 - zynqmp_dp_write(dp, ZYNQMP_DP_INT_EN, ZYNQMP_DP_INT_ALL); 1637 1608 1638 1609 return 0; 1639 1610 } ··· 1642 1633 dp->dev = &pdev->dev; 1643 1634 dp->dpsub = dpsub; 1644 1635 dp->status = connector_status_disconnected; 1645 - dp->drm = drm; 1646 1636 1647 1637 INIT_DELAYED_WORK(&dp->hpd_work, zynqmp_dp_hpd_work_func); 1648 1638 ··· 1727 1719 disable_irq(dp->irq); 1728 1720 1729 1721 cancel_delayed_work_sync(&dp->hpd_work); 1730 - zynqmp_dp_aux_cleanup(dp); 1731 1722 1732 1723 zynqmp_dp_write(dp, ZYNQMP_DP_TRANSMITTER_ENABLE, 0); 1733 1724 zynqmp_dp_write(dp, ZYNQMP_DP_INT_DS, 0xffffffff);