aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu
diff options
context:
space:
mode:
authorRussell King <rmk+kernel@arm.linux.org.uk>2015-02-02 06:01:08 -0500
committerRussell King <rmk+kernel@arm.linux.org.uk>2015-03-30 14:42:35 -0400
commit6bcf495317857e4e4cfb2e6f57fa8230cedc1362 (patch)
treee37ddd8b48b4527696ac242af4db7b95e1e8e606 /drivers/gpu
parent351e1354fcd06e96245f8fda141ac3cc2f68f763 (diff)
drm: bridge/dw_hdmi: protect n/cts setting with a mutex
The HDMI n/cts settings need to be updated whenever the audio sample rate or the video pixel clock changes. This needs to be protected against concurrency as there is no synchronisation between these two operations. Introduce a mutex (called audio_mutex) to protect against two threads trying to update the video clock rate and pixel clock simultaneously. Acked-by: Philipp Zabel <p.zabel@pengutronix.de> Tested-by: Philipp Zabel <p.zabel@pengutronix.de> Acked-by: Andy Yan <andy.yan@rock-chips.com> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/drm/bridge/dw_hdmi.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/drivers/gpu/drm/bridge/dw_hdmi.c b/drivers/gpu/drm/bridge/dw_hdmi.c
index 78363552d80e..b75922d4901e 100644
--- a/drivers/gpu/drm/bridge/dw_hdmi.c
+++ b/drivers/gpu/drm/bridge/dw_hdmi.c
@@ -16,6 +16,7 @@
16#include <linux/err.h> 16#include <linux/err.h>
17#include <linux/clk.h> 17#include <linux/clk.h>
18#include <linux/hdmi.h> 18#include <linux/hdmi.h>
19#include <linux/mutex.h>
19#include <linux/of_device.h> 20#include <linux/of_device.h>
20 21
21#include <drm/drm_of.h> 22#include <drm/drm_of.h>
@@ -126,6 +127,7 @@ struct dw_hdmi {
126 struct i2c_adapter *ddc; 127 struct i2c_adapter *ddc;
127 void __iomem *regs; 128 void __iomem *regs;
128 129
130 struct mutex audio_mutex;
129 unsigned int sample_rate; 131 unsigned int sample_rate;
130 int ratio; 132 int ratio;
131 133
@@ -357,12 +359,16 @@ static void hdmi_set_clk_regenerator(struct dw_hdmi *hdmi,
357 359
358static void hdmi_init_clk_regenerator(struct dw_hdmi *hdmi) 360static void hdmi_init_clk_regenerator(struct dw_hdmi *hdmi)
359{ 361{
362 mutex_lock(&hdmi->audio_mutex);
360 hdmi_set_clk_regenerator(hdmi, 74250000); 363 hdmi_set_clk_regenerator(hdmi, 74250000);
364 mutex_unlock(&hdmi->audio_mutex);
361} 365}
362 366
363static void hdmi_clk_regenerator_update_pixel_clock(struct dw_hdmi *hdmi) 367static void hdmi_clk_regenerator_update_pixel_clock(struct dw_hdmi *hdmi)
364{ 368{
369 mutex_lock(&hdmi->audio_mutex);
365 hdmi_set_clk_regenerator(hdmi, hdmi->hdmi_data.video_mode.mpixelclock); 370 hdmi_set_clk_regenerator(hdmi, hdmi->hdmi_data.video_mode.mpixelclock);
371 mutex_unlock(&hdmi->audio_mutex);
366} 372}
367 373
368/* 374/*
@@ -1565,6 +1571,8 @@ int dw_hdmi_bind(struct device *dev, struct device *master,
1565 hdmi->ratio = 100; 1571 hdmi->ratio = 100;
1566 hdmi->encoder = encoder; 1572 hdmi->encoder = encoder;
1567 1573
1574 mutex_init(&hdmi->audio_mutex);
1575
1568 of_property_read_u32(np, "reg-io-width", &val); 1576 of_property_read_u32(np, "reg-io-width", &val);
1569 1577
1570 switch (val) { 1578 switch (val) {