Skip to content

Commit c32048d

Browse files
superna9999atseanpaul
authored andcommitted
drm/bridge/synopsys: dw-hdmi: fix dw_hdmi_setup_rx_sense
The dw_hdmi_setup_rx_sense exported function should not use struct device to recover the dw-hdmi context using drvdata, but take struct dw_hdmi directly like other exported functions. This caused a regression using Meson DRM on S905X since v4.17-rc1 : Internal error: Oops: 96000007 [#1] PREEMPT SMP [...] CPU: 0 PID: 124 Comm: irq/32-dw_hdmi_ Not tainted 4.17.0-rc7 #2 Hardware name: Libre Technology CC (DT) [...] pc : osq_lock+0x54/0x188 lr : __mutex_lock.isra.0+0x74/0x530 [...] Process irq/32-dw_hdmi_ (pid: 124, stack limit = 0x00000000adf418cb) Call trace: osq_lock+0x54/0x188 __mutex_lock_slowpath+0x10/0x18 mutex_lock+0x30/0x38 __dw_hdmi_setup_rx_sense+0x28/0x98 dw_hdmi_setup_rx_sense+0x10/0x18 dw_hdmi_top_thread_irq+0x2c/0x50 irq_thread_fn+0x28/0x68 irq_thread+0x10c/0x1a0 kthread+0x128/0x130 ret_from_fork+0x10/0x18 Code: 34000964 d00050a2 51000484 9135c042 (f864d844) ---[ end trace 945641e1fbbc07da ]--- note: irq/32-dw_hdmi_[124] exited with preempt_count 1 genirq: exiting task "irq/32-dw_hdmi_" (124) is an active IRQ thread (irq 32) Fixes: eea034a ("drm/bridge/synopsys: dw-hdmi: don't clobber drvdata") Signed-off-by: Neil Armstrong <[email protected]> Tested-by: Koen Kooi <[email protected]> Signed-off-by: Sean Paul <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
1 parent 2bc5ff0 commit c32048d

File tree

3 files changed

+6
-13
lines changed

3 files changed

+6
-13
lines changed

drivers/gpu/drm/bridge/synopsys/dw-hdmi.c

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2077,7 +2077,7 @@ static irqreturn_t dw_hdmi_hardirq(int irq, void *dev_id)
20772077
return ret;
20782078
}
20792079

2080-
void __dw_hdmi_setup_rx_sense(struct dw_hdmi *hdmi, bool hpd, bool rx_sense)
2080+
void dw_hdmi_setup_rx_sense(struct dw_hdmi *hdmi, bool hpd, bool rx_sense)
20812081
{
20822082
mutex_lock(&hdmi->mutex);
20832083

@@ -2103,13 +2103,6 @@ void __dw_hdmi_setup_rx_sense(struct dw_hdmi *hdmi, bool hpd, bool rx_sense)
21032103
}
21042104
mutex_unlock(&hdmi->mutex);
21052105
}
2106-
2107-
void dw_hdmi_setup_rx_sense(struct device *dev, bool hpd, bool rx_sense)
2108-
{
2109-
struct dw_hdmi *hdmi = dev_get_drvdata(dev);
2110-
2111-
__dw_hdmi_setup_rx_sense(hdmi, hpd, rx_sense);
2112-
}
21132106
EXPORT_SYMBOL_GPL(dw_hdmi_setup_rx_sense);
21142107

21152108
static irqreturn_t dw_hdmi_irq(int irq, void *dev_id)
@@ -2145,9 +2138,9 @@ static irqreturn_t dw_hdmi_irq(int irq, void *dev_id)
21452138
*/
21462139
if (intr_stat &
21472140
(HDMI_IH_PHY_STAT0_RX_SENSE | HDMI_IH_PHY_STAT0_HPD)) {
2148-
__dw_hdmi_setup_rx_sense(hdmi,
2149-
phy_stat & HDMI_PHY_HPD,
2150-
phy_stat & HDMI_PHY_RX_SENSE);
2141+
dw_hdmi_setup_rx_sense(hdmi,
2142+
phy_stat & HDMI_PHY_HPD,
2143+
phy_stat & HDMI_PHY_RX_SENSE);
21512144

21522145
if ((phy_stat & (HDMI_PHY_RX_SENSE | HDMI_PHY_HPD)) == 0)
21532146
cec_notifier_set_phys_addr(hdmi->cec_notifier,

drivers/gpu/drm/meson/meson_dw_hdmi.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -529,7 +529,7 @@ static irqreturn_t dw_hdmi_top_thread_irq(int irq, void *dev_id)
529529
if (stat & HDMITX_TOP_INTR_HPD_RISE)
530530
hpd_connected = true;
531531

532-
dw_hdmi_setup_rx_sense(dw_hdmi->dev, hpd_connected,
532+
dw_hdmi_setup_rx_sense(dw_hdmi->hdmi, hpd_connected,
533533
hpd_connected);
534534

535535
drm_helper_hpd_irq_event(dw_hdmi->encoder.dev);

include/drm/bridge/dw_hdmi.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ struct dw_hdmi *dw_hdmi_bind(struct platform_device *pdev,
151151
struct drm_encoder *encoder,
152152
const struct dw_hdmi_plat_data *plat_data);
153153

154-
void dw_hdmi_setup_rx_sense(struct device *dev, bool hpd, bool rx_sense);
154+
void dw_hdmi_setup_rx_sense(struct dw_hdmi *hdmi, bool hpd, bool rx_sense);
155155

156156
void dw_hdmi_set_sample_rate(struct dw_hdmi *hdmi, unsigned int rate);
157157
void dw_hdmi_audio_enable(struct dw_hdmi *hdmi);

0 commit comments

Comments
 (0)