diff options
author | PixelBot AutoMerger <android-nexus-securitybot@system.gserviceaccount.com> | 2024-01-14 18:41:28 -0800 |
---|---|---|
committer | SecurityBot <android-nexus-securitybot@system.gserviceaccount.com> | 2024-01-14 18:41:29 -0800 |
commit | 173f3441615f6ecc635e618b563571f6a1018255 (patch) | |
tree | 17b71d8fdf4843c2ebd9a217b5424584679bf061 | |
parent | 3c965efc4b06d387bffad89ccd6c70abd5eaf23c (diff) | |
parent | 5437a68f9c55991aa3e2c51f687c2e2bc2aa733f (diff) | |
download | display-173f3441615f6ecc635e618b563571f6a1018255.tar.gz |
Merge android14-gs-pixel-5.15-24Q2 into android14-gs-pixel-5.15
SBMerger: 571992243
Change-Id: Id2407a0ed93080d08c155fe37a099637844f0c6c
Signed-off-by: SecurityBot <android-nexus-securitybot@system.gserviceaccount.com>
-rw-r--r-- | samsung/cal_9865/dp_reg.c | 17 | ||||
-rw-r--r-- | samsung/cal_9865/regs-dpp.h | 2 | ||||
-rw-r--r-- | samsung/cal_common/dp_cal.h | 3 | ||||
-rw-r--r-- | samsung/exynos_drm_dp.c | 18 | ||||
-rw-r--r-- | samsung/exynos_drm_drv.c | 16 | ||||
-rw-r--r-- | samsung/exynos_drm_drv.h | 1 |
6 files changed, 54 insertions, 3 deletions
diff --git a/samsung/cal_9865/dp_reg.c b/samsung/cal_9865/dp_reg.c index 28d27bc..72e6554 100644 --- a/samsung/cal_9865/dp_reg.c +++ b/samsung/cal_9865/dp_reg.c @@ -380,6 +380,17 @@ static void dpphy_reg_cr_write_mask(u16 addr, u16 data, u16 mask) cal_log_debug(0, "[CR][%04X][%04X]", addr, old); } +/* + * Boost charge pump bias current + * [10:8] mpllb_ctr_cp_int_ref + * [2:0] mplla_ctr_cp_int_ref + */ +static void dpphy_reg_enable_cp_current_boost(void) +{ + dpphy_reg_cr_write_mask(0x5c, 0x400, 0x700); + dpphy_reg_cr_write_mask(0x5c, 0x4, 0x7); +} + /* fix abnormal lane2 signal */ static void dpphy_reg_usb_tune_reset(enum plug_orientation orient) { @@ -720,7 +731,7 @@ static void dpphy_reg_set_mpllb(struct dp_hw_config *hw_config, bool reconfig) mpllb_cp_prop_gs = (u32)0x7f; // CONFIG02 u32 mpllb_div5_clk_en = 1, mpllb_div_cl_en = 0, - mpllb_div_multiplier = 0, mpllb_force_en = 1; + mpllb_div_multiplier = 0, mpllb_force_en = 0; u32 mpllb_force_ack = 0, mpllb_fracn_cfg_update_en = 1, mpllb_fracn_en = 1, mpllb_fracn_den = 1; // CONFIG03 @@ -935,6 +946,10 @@ static void dpphy_reg_init(struct dp_hw_config *hw_config, bool reconfig) /* Assert DP Alt-mode Disable ACK */ dpphy_reg_set_config19_dpalt_disable_ack(1); + /* CP(Charge Pump) Bias Boosting X2 */ + if (hw_config->phy_boost && !reconfig) + dpphy_reg_enable_cp_current_boost(); + /* Set Master PLL-B for DP as Link_BW */ dpphy_reg_set_mpllb(hw_config, reconfig); cal_log_debug(0, "set MPLLB as link_bw.\n"); diff --git a/samsung/cal_9865/regs-dpp.h b/samsung/cal_9865/regs-dpp.h index 225e7de..fd2762e 100644 --- a/samsung/cal_9865/regs-dpp.h +++ b/samsung/cal_9865/regs-dpp.h @@ -66,7 +66,7 @@ #define IDMA_READ_SLAVE_ERR_MASK (1 << 4) #define IDMA_DEADLOCK_MASK (1 << 2) #define IDMA_FRAME_DONE_MASK (1 << 1) -#define IDMA_ALL_IRQ_MASK (0xDFB << 16) +#define IDMA_ALL_IRQ_MASK (0xDFB << 1) #define IDMA_IRQ_ENABLE (1 << 0) diff --git a/samsung/cal_common/dp_cal.h b/samsung/cal_common/dp_cal.h index d184ef3..851856f 100644 --- a/samsung/cal_common/dp_cal.h +++ b/samsung/cal_common/dp_cal.h @@ -298,6 +298,9 @@ struct dp_hw_config { /* USBDP combo phy enable ref count */ atomic_t usbdp_phy_en_cnt; + + /* DP PHY boost */ + bool phy_boost; }; diff --git a/samsung/exynos_drm_dp.c b/samsung/exynos_drm_dp.c index 604f01e..a23f20d 100644 --- a/samsung/exynos_drm_dp.c +++ b/samsung/exynos_drm_dp.c @@ -178,6 +178,10 @@ static bool dp_ssc = true; module_param(dp_ssc, bool, 0664); MODULE_PARM_DESC(dp_ssc, "Enable/disable DP link spread spectrum clocking"); +static bool dp_phy_boost = true; +module_param(dp_phy_boost, bool, 0664); +MODULE_PARM_DESC(dp_phy_boost, "Enable/disable DP PHY current boost"); + #define DP_BIST_OFF 0 #define DP_BIST_ON 1 #define DP_BIST_ON_HDCP 2 @@ -1694,12 +1698,22 @@ static int dp_downstream_port_event_handler(struct dp_device *dp, int new_sink_c static void dp_work_hpd(struct work_struct *work) { struct dp_device *dp = get_dp_drvdata(); + struct drm_connector *connector = &dp->connector; + struct drm_device *dev = connector->dev; + struct exynos_drm_private *private = drm_to_exynos_dev(dev); enum link_training_status link_status = LINK_TRAINING_UNKNOWN; int ret; mutex_lock(&dp->hpd_lock); if (dp_get_hpd_state(dp) == EXYNOS_HPD_PLUG) { + if (mutex_trylock(&private->dp_tui_lock) == 0) { + /* TUI is active, bail out */ + dp_info(dp, "unable to handle HPD_PLUG, TUI is active\n"); + mutex_unlock(&dp->hpd_lock); + return; + } + pm_runtime_get_sync(dp->dev); dp_debug(dp, "pm_rtm_get_sync usage_cnt(%d)\n", atomic_read(&dp->dev->power.usage_count)); @@ -1751,6 +1765,8 @@ static void dp_work_hpd(struct work_struct *work) dp->state = DP_STATE_INIT; dp_info(dp, "%s: DP State changed to INIT\n", __func__); + + mutex_unlock(&private->dp_tui_lock); } mutex_unlock(&dp->hpd_lock); @@ -1783,6 +1799,7 @@ HPD_FAIL: dp->dp_hotplug_error_code); drm_kms_helper_hotplug_event(dp->connector.dev); + mutex_unlock(&private->dp_tui_lock); mutex_unlock(&dp->hpd_lock); } @@ -1971,6 +1988,7 @@ static int usb_typec_dp_notification_locked(struct dp_device *dp, enum hotplug_s dp->typec_pin_assignment); dp->hw_config.pin_type = dp->typec_pin_assignment; + dp->hw_config.phy_boost = dp_phy_boost; dp_hpd_changed(dp, EXYNOS_HPD_PLUG); } } else if (hpd == EXYNOS_HPD_IRQ) { diff --git a/samsung/exynos_drm_drv.c b/samsung/exynos_drm_drv.c index 7b9c59b..8397543 100644 --- a/samsung/exynos_drm_drv.c +++ b/samsung/exynos_drm_drv.c @@ -732,6 +732,12 @@ int exynos_atomic_enter_tui(void) if (private->tui_enabled) return -EBUSY; + if (mutex_trylock(&private->dp_tui_lock) == 0) { + /* DP connection is active, bail out */ + pr_info("%s: unable to enter TUI, DP is active\n", __func__); + return -EBUSY; + } + drm_for_each_crtc(crtc, dev) { decon = crtc_to_decon(crtc); hibernation_block_exit(decon->hibernation); @@ -740,8 +746,10 @@ int exynos_atomic_enter_tui(void) DRM_MODESET_LOCK_ALL_BEGIN(dev, ctx, 0, ret); state = drm_atomic_helper_duplicate_state(dev, &ctx); - if (IS_ERR(state)) + if (IS_ERR(state)) { + ret = -ENOMEM; goto err_dup; + } mode_config->suspend_state = state; @@ -822,6 +830,8 @@ err_state_alloc: mode_config->suspend_state = NULL; } err_dup: + if (ret) + mutex_unlock(&private->dp_tui_lock); DRM_MODESET_LOCK_ALL_END(dev, ctx, ret); pr_debug("%s -\n", __func__); @@ -886,6 +896,7 @@ int exynos_atomic_exit_tui(void) DRM_MODESET_LOCK_ALL_END(dev, ctx, ret); if (!ret) drm_atomic_state_put(state); + mutex_unlock(&private->dp_tui_lock); pr_debug("%s -\n", __func__); return ret; @@ -1049,6 +1060,9 @@ static int exynos_drm_bind(struct device *dev) init_waitqueue_head(&private->wait); spin_lock_init(&private->lock); + private->tui_enabled = false; + mutex_init(&private->dp_tui_lock); + dev_set_drvdata(dev, drm); ret = drmm_mode_config_init(drm); diff --git a/samsung/exynos_drm_drv.h b/samsung/exynos_drm_drv.h index 0270d03..21acd62 100644 --- a/samsung/exynos_drm_drv.h +++ b/samsung/exynos_drm_drv.h @@ -386,6 +386,7 @@ struct exynos_drm_private { struct device *iommu_client; void *mapping; bool tui_enabled; + struct mutex dp_tui_lock; u32 secured_dpp_mask; /* for atomic commit */ |