summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPixelBot AutoMerger <android-nexus-securitybot@system.gserviceaccount.com>2024-01-14 18:41:28 -0800
committerSecurityBot <android-nexus-securitybot@system.gserviceaccount.com>2024-01-14 18:41:29 -0800
commit173f3441615f6ecc635e618b563571f6a1018255 (patch)
tree17b71d8fdf4843c2ebd9a217b5424584679bf061
parent3c965efc4b06d387bffad89ccd6c70abd5eaf23c (diff)
parent5437a68f9c55991aa3e2c51f687c2e2bc2aa733f (diff)
downloaddisplay-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.c17
-rw-r--r--samsung/cal_9865/regs-dpp.h2
-rw-r--r--samsung/cal_common/dp_cal.h3
-rw-r--r--samsung/exynos_drm_dp.c18
-rw-r--r--samsung/exynos_drm_drv.c16
-rw-r--r--samsung/exynos_drm_drv.h1
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 */