Loading drivers/gpu/drm/msm/dp/dp_aux.c +27 −3 Original line number Diff line number Diff line Loading @@ -38,6 +38,8 @@ struct dp_aux_private { bool cmd_busy; bool native; bool read; bool no_send_addr; bool no_send_stop; struct drm_dp_aux drm_aux; }; Loading Loading @@ -103,8 +105,15 @@ static u32 dp_aux_write(struct dp_aux_private *aux, } reg = 0; /* Transaction number == 1 */ if (!aux->native) /* i2c */ reg |= (BIT(8) | BIT(10) | BIT(11)); if (!aux->native) { /* i2c */ reg |= BIT(8); if (aux->no_send_addr) reg |= BIT(10); if (aux->no_send_stop) reg |= BIT(11); } reg |= BIT(9); aux->catalog->data = reg; Loading Loading @@ -150,7 +159,7 @@ static void dp_aux_cmd_fifo_rx(struct dp_aux_private *aux, { u32 data; u8 *dp; u32 i; u32 i, actual_i; u32 len = msg->size; data = 0; Loading @@ -168,6 +177,11 @@ static void dp_aux_cmd_fifo_rx(struct dp_aux_private *aux, for (i = 0; i < len; i++) { data = aux->catalog->read_data(aux->catalog); *dp++ = (u8)((data >> 8) & 0xff); actual_i = (data >> 16) & 0xFF; if (i != actual_i) pr_warn("Index mismatch: expected %d, found %d\n", i, actual_i); } } Loading Loading @@ -288,6 +302,14 @@ static ssize_t dp_aux_transfer(struct drm_dp_aux *drm_aux, goto unlock_exit; } if (aux->read) { aux->no_send_addr = true; aux->no_send_stop = false; } else { aux->no_send_addr = true; aux->no_send_stop = true; } ret = dp_aux_cmd_fifo_tx(aux, msg); if ((ret < 0) && aux->native) { aux->retry_cnt++; Loading @@ -300,6 +322,8 @@ static ssize_t dp_aux_transfer(struct drm_dp_aux *drm_aux, goto unlock_exit; } aux->catalog->clear_trans(aux->catalog); if (aux->aux_error_num == DP_AUX_ERR_NONE) { if (aux->read) dp_aux_cmd_fifo_rx(aux, msg); Loading drivers/gpu/drm/msm/dp/dp_catalog.c +26 −3 Original line number Diff line number Diff line Loading @@ -131,6 +131,29 @@ static int dp_catalog_aux_write_trans(struct dp_catalog_aux *aux) return rc; } static int dp_catalog_aux_clear_trans(struct dp_catalog_aux *aux) { int rc = 0; u32 data; struct dp_catalog_private *catalog; void __iomem *base; if (!aux) { pr_err("invalid input\n"); rc = -EINVAL; goto end; } dp_catalog_get_priv(aux); base = catalog->io->ctrl_io.base; data = dp_read(base + DP_AUX_TRANS_CTRL); data &= ~BIT(9); dp_write(base + DP_AUX_TRANS_CTRL, data); end: return rc; } static void dp_catalog_aux_reset(struct dp_catalog_aux *aux) { u32 aux_ctrl; Loading Loading @@ -219,13 +242,12 @@ static void dp_catalog_aux_setup(struct dp_catalog_aux *aux, dp_catalog_get_priv(aux); dp_write(catalog->io->phy_io.base + DP_PHY_PD_CTL, 0x02); dp_write(catalog->io->phy_io.base + DP_PHY_PD_CTL, 0x65); wmb(); /* make sure PD programming happened */ dp_write(catalog->io->phy_io.base + DP_PHY_PD_CTL, 0x7d); /* Turn on BIAS current for PHY/PLL */ dp_write(catalog->io->dp_pll_io.base + QSERDES_COM_BIAS_EN_CLKBUFLR_EN, 0x3f); QSERDES_COM_BIAS_EN_CLKBUFLR_EN, 0x1b); /* DP AUX CFG register programming */ for (i = 0; i < PHY_AUX_CFG_MAX; i++) { Loading Loading @@ -1213,6 +1235,7 @@ struct dp_catalog *dp_catalog_get(struct device *dev, struct dp_io *io) .read_data = dp_catalog_aux_read_data, .write_data = dp_catalog_aux_write_data, .write_trans = dp_catalog_aux_write_trans, .clear_trans = dp_catalog_aux_clear_trans, .reset = dp_catalog_aux_reset, .update_aux_cfg = dp_catalog_aux_update_cfg, .enable = dp_catalog_aux_enable, Loading drivers/gpu/drm/msm/dp/dp_catalog.h +1 −0 Original line number Diff line number Diff line Loading @@ -67,6 +67,7 @@ struct dp_catalog_aux { u32 (*read_data)(struct dp_catalog_aux *aux); int (*write_data)(struct dp_catalog_aux *aux); int (*write_trans)(struct dp_catalog_aux *aux); int (*clear_trans)(struct dp_catalog_aux *aux); void (*reset)(struct dp_catalog_aux *aux); void (*enable)(struct dp_catalog_aux *aux, bool enable); void (*update_aux_cfg)(struct dp_catalog_aux *aux, Loading drivers/gpu/drm/msm/dp/dp_display.c +4 −2 Original line number Diff line number Diff line Loading @@ -472,6 +472,8 @@ static int dp_display_process_hpd_high(struct dp_display_private *dp) u32 max_pclk_from_edid = 0; struct edid *edid; dp->aux->init(dp->aux, dp->parser->aux_cfg); rc = dp->panel->read_sink_caps(dp->panel, dp->dp_display.connector); if (rc) return rc; Loading Loading @@ -515,7 +517,6 @@ static void dp_display_host_init(struct dp_display_private *dp) dp->power->init(dp->power, flip); dp->ctrl->init(dp->ctrl, flip); dp->aux->init(dp->aux, dp->parser->aux_cfg); enable_irq(dp->irq); dp->core_initialized = true; } Loading @@ -527,7 +528,6 @@ static void dp_display_host_deinit(struct dp_display_private *dp) return; } dp->aux->deinit(dp->aux); dp->ctrl->deinit(dp->ctrl); dp->power->deinit(dp->power); disable_irq(dp->irq); Loading @@ -548,6 +548,8 @@ static void dp_display_process_hpd_low(struct dp_display_private *dp) dp->audio->off(dp->audio); dp_display_send_hpd_notification(dp, false); dp->aux->deinit(dp->aux); } static int dp_display_usbpd_configure_cb(struct device *dev) Loading Loading
drivers/gpu/drm/msm/dp/dp_aux.c +27 −3 Original line number Diff line number Diff line Loading @@ -38,6 +38,8 @@ struct dp_aux_private { bool cmd_busy; bool native; bool read; bool no_send_addr; bool no_send_stop; struct drm_dp_aux drm_aux; }; Loading Loading @@ -103,8 +105,15 @@ static u32 dp_aux_write(struct dp_aux_private *aux, } reg = 0; /* Transaction number == 1 */ if (!aux->native) /* i2c */ reg |= (BIT(8) | BIT(10) | BIT(11)); if (!aux->native) { /* i2c */ reg |= BIT(8); if (aux->no_send_addr) reg |= BIT(10); if (aux->no_send_stop) reg |= BIT(11); } reg |= BIT(9); aux->catalog->data = reg; Loading Loading @@ -150,7 +159,7 @@ static void dp_aux_cmd_fifo_rx(struct dp_aux_private *aux, { u32 data; u8 *dp; u32 i; u32 i, actual_i; u32 len = msg->size; data = 0; Loading @@ -168,6 +177,11 @@ static void dp_aux_cmd_fifo_rx(struct dp_aux_private *aux, for (i = 0; i < len; i++) { data = aux->catalog->read_data(aux->catalog); *dp++ = (u8)((data >> 8) & 0xff); actual_i = (data >> 16) & 0xFF; if (i != actual_i) pr_warn("Index mismatch: expected %d, found %d\n", i, actual_i); } } Loading Loading @@ -288,6 +302,14 @@ static ssize_t dp_aux_transfer(struct drm_dp_aux *drm_aux, goto unlock_exit; } if (aux->read) { aux->no_send_addr = true; aux->no_send_stop = false; } else { aux->no_send_addr = true; aux->no_send_stop = true; } ret = dp_aux_cmd_fifo_tx(aux, msg); if ((ret < 0) && aux->native) { aux->retry_cnt++; Loading @@ -300,6 +322,8 @@ static ssize_t dp_aux_transfer(struct drm_dp_aux *drm_aux, goto unlock_exit; } aux->catalog->clear_trans(aux->catalog); if (aux->aux_error_num == DP_AUX_ERR_NONE) { if (aux->read) dp_aux_cmd_fifo_rx(aux, msg); Loading
drivers/gpu/drm/msm/dp/dp_catalog.c +26 −3 Original line number Diff line number Diff line Loading @@ -131,6 +131,29 @@ static int dp_catalog_aux_write_trans(struct dp_catalog_aux *aux) return rc; } static int dp_catalog_aux_clear_trans(struct dp_catalog_aux *aux) { int rc = 0; u32 data; struct dp_catalog_private *catalog; void __iomem *base; if (!aux) { pr_err("invalid input\n"); rc = -EINVAL; goto end; } dp_catalog_get_priv(aux); base = catalog->io->ctrl_io.base; data = dp_read(base + DP_AUX_TRANS_CTRL); data &= ~BIT(9); dp_write(base + DP_AUX_TRANS_CTRL, data); end: return rc; } static void dp_catalog_aux_reset(struct dp_catalog_aux *aux) { u32 aux_ctrl; Loading Loading @@ -219,13 +242,12 @@ static void dp_catalog_aux_setup(struct dp_catalog_aux *aux, dp_catalog_get_priv(aux); dp_write(catalog->io->phy_io.base + DP_PHY_PD_CTL, 0x02); dp_write(catalog->io->phy_io.base + DP_PHY_PD_CTL, 0x65); wmb(); /* make sure PD programming happened */ dp_write(catalog->io->phy_io.base + DP_PHY_PD_CTL, 0x7d); /* Turn on BIAS current for PHY/PLL */ dp_write(catalog->io->dp_pll_io.base + QSERDES_COM_BIAS_EN_CLKBUFLR_EN, 0x3f); QSERDES_COM_BIAS_EN_CLKBUFLR_EN, 0x1b); /* DP AUX CFG register programming */ for (i = 0; i < PHY_AUX_CFG_MAX; i++) { Loading Loading @@ -1213,6 +1235,7 @@ struct dp_catalog *dp_catalog_get(struct device *dev, struct dp_io *io) .read_data = dp_catalog_aux_read_data, .write_data = dp_catalog_aux_write_data, .write_trans = dp_catalog_aux_write_trans, .clear_trans = dp_catalog_aux_clear_trans, .reset = dp_catalog_aux_reset, .update_aux_cfg = dp_catalog_aux_update_cfg, .enable = dp_catalog_aux_enable, Loading
drivers/gpu/drm/msm/dp/dp_catalog.h +1 −0 Original line number Diff line number Diff line Loading @@ -67,6 +67,7 @@ struct dp_catalog_aux { u32 (*read_data)(struct dp_catalog_aux *aux); int (*write_data)(struct dp_catalog_aux *aux); int (*write_trans)(struct dp_catalog_aux *aux); int (*clear_trans)(struct dp_catalog_aux *aux); void (*reset)(struct dp_catalog_aux *aux); void (*enable)(struct dp_catalog_aux *aux, bool enable); void (*update_aux_cfg)(struct dp_catalog_aux *aux, Loading
drivers/gpu/drm/msm/dp/dp_display.c +4 −2 Original line number Diff line number Diff line Loading @@ -472,6 +472,8 @@ static int dp_display_process_hpd_high(struct dp_display_private *dp) u32 max_pclk_from_edid = 0; struct edid *edid; dp->aux->init(dp->aux, dp->parser->aux_cfg); rc = dp->panel->read_sink_caps(dp->panel, dp->dp_display.connector); if (rc) return rc; Loading Loading @@ -515,7 +517,6 @@ static void dp_display_host_init(struct dp_display_private *dp) dp->power->init(dp->power, flip); dp->ctrl->init(dp->ctrl, flip); dp->aux->init(dp->aux, dp->parser->aux_cfg); enable_irq(dp->irq); dp->core_initialized = true; } Loading @@ -527,7 +528,6 @@ static void dp_display_host_deinit(struct dp_display_private *dp) return; } dp->aux->deinit(dp->aux); dp->ctrl->deinit(dp->ctrl); dp->power->deinit(dp->power); disable_irq(dp->irq); Loading @@ -548,6 +548,8 @@ static void dp_display_process_hpd_low(struct dp_display_private *dp) dp->audio->off(dp->audio); dp_display_send_hpd_notification(dp, false); dp->aux->deinit(dp->aux); } static int dp_display_usbpd_configure_cb(struct device *dev) Loading