Message ID | 20170414083113.4255-3-romain.perier@collabora.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On 04/14/2017 10:31 AM, Romain Perier wrote: > Currently, the audio sampler clock is enabled from dw_hdmi_setup() at > step E. and is kept enabled for later use. This clock should be enabled > and disabled along with the actual audio stream and not always on (that > is bad for PM). Futhermore, as described by the datasheet, the I2S > variant need to gate/ungate the clock when the stream is > enabled/disabled. > > This commit adds a parameter to hdmi_audio_enable_clk() that controls > when the audio sample clock must be enabled or disabled. Then, it adds > the call to this function from dw_hdmi_i2s_audio_enable() and > dw_hdmi_i2s_audio_disable(). > > Signed-off-by: Romain Perier <romain.perier@collabora.com> > --- > drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 20 ++++++++++++++------ > 1 file changed, 14 insertions(+), 6 deletions(-) > > diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c > index 5b328c0..a6da634 100644 > --- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c > +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c > @@ -544,6 +544,12 @@ void dw_hdmi_set_sample_rate(struct dw_hdmi *hdmi, unsigned int rate) > } > EXPORT_SYMBOL_GPL(dw_hdmi_set_sample_rate); > > +static void hdmi_enable_audio_clk(struct dw_hdmi *hdmi, bool enable) > +{ > + hdmi_modb(hdmi, enable ? 0 : HDMI_MC_CLKDIS_AUDCLK_DISABLE, > + HDMI_MC_CLKDIS_AUDCLK_DISABLE, HDMI_MC_CLKDIS); > +} > + > void dw_hdmi_ahb_audio_enable(struct dw_hdmi *hdmi) > { > hdmi_set_cts_n(hdmi, hdmi->audio_cts, hdmi->audio_n); > @@ -557,6 +563,12 @@ void dw_hdmi_ahb_audio_disable(struct dw_hdmi *hdmi) > void dw_hdmi_i2s_audio_enable(struct dw_hdmi *hdmi) > { > hdmi_set_cts_n(hdmi, hdmi->audio_cts, hdmi->audio_n); > + hdmi_enable_audio_clk(hdmi, true); > +} > + > +void dw_hdmi_i2s_audio_disable(struct dw_hdmi *hdmi) > +{ > + hdmi_enable_audio_clk(hdmi, false); > } > > void dw_hdmi_audio_enable(struct dw_hdmi *hdmi) > @@ -1592,11 +1604,6 @@ static void dw_hdmi_enable_video_path(struct dw_hdmi *hdmi) > HDMI_MC_FLOWCTRL); > } > > -static void hdmi_enable_audio_clk(struct dw_hdmi *hdmi) > -{ > - hdmi_modb(hdmi, 0, HDMI_MC_CLKDIS_AUDCLK_DISABLE, HDMI_MC_CLKDIS); > -} > - > /* Workaround to clear the overflow condition */ > static void dw_hdmi_clear_overflow(struct dw_hdmi *hdmi) > { > @@ -1710,7 +1717,7 @@ static int dw_hdmi_setup(struct dw_hdmi *hdmi, struct drm_display_mode *mode) > > /* HDMI Initialization Step E - Configure audio */ > hdmi_clk_regenerator_update_pixel_clock(hdmi); > - hdmi_enable_audio_clk(hdmi); > + hdmi_enable_audio_clk(hdmi, true); > } > > /* not for DVI mode */ > @@ -2438,6 +2445,7 @@ __dw_hdmi_probe(struct platform_device *pdev, > audio.write = hdmi_writeb; > audio.read = hdmi_readb; > hdmi->enable_audio = dw_hdmi_i2s_audio_enable; > + hdmi->disable_audio = dw_hdmi_i2s_audio_disable; > > pdevinfo.name = "dw-hdmi-i2s-audio"; > pdevinfo.data = &audio; > Hi Romain, Reviewed-by: Neil Armstrong <narmstrong@baylibre.com>
On 04/14/2017 02:01 PM, Romain Perier wrote: > Currently, the audio sampler clock is enabled from dw_hdmi_setup() at > step E. and is kept enabled for later use. This clock should be enabled > and disabled along with the actual audio stream and not always on (that > is bad for PM). Futhermore, as described by the datasheet, the I2S s/Futhermore/Furthermore > variant need to gate/ungate the clock when the stream is s/need/needs > enabled/disabled. > > This commit adds a parameter to hdmi_audio_enable_clk() that controls > when the audio sample clock must be enabled or disabled. Then, it adds > the call to this function from dw_hdmi_i2s_audio_enable() and > dw_hdmi_i2s_audio_disable(). > > Signed-off-by: Romain Perier <romain.perier@collabora.com> > --- > drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 20 ++++++++++++++------ > 1 file changed, 14 insertions(+), 6 deletions(-) > > diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c > index 5b328c0..a6da634 100644 > --- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c > +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c > @@ -544,6 +544,12 @@ void dw_hdmi_set_sample_rate(struct dw_hdmi *hdmi, unsigned int rate) > } > EXPORT_SYMBOL_GPL(dw_hdmi_set_sample_rate); > > +static void hdmi_enable_audio_clk(struct dw_hdmi *hdmi, bool enable) > +{ > + hdmi_modb(hdmi, enable ? 0 : HDMI_MC_CLKDIS_AUDCLK_DISABLE, > + HDMI_MC_CLKDIS_AUDCLK_DISABLE, HDMI_MC_CLKDIS); > +} > + > void dw_hdmi_ahb_audio_enable(struct dw_hdmi *hdmi) > { > hdmi_set_cts_n(hdmi, hdmi->audio_cts, hdmi->audio_n); > @@ -557,6 +563,12 @@ void dw_hdmi_ahb_audio_disable(struct dw_hdmi *hdmi) > void dw_hdmi_i2s_audio_enable(struct dw_hdmi *hdmi) > { > hdmi_set_cts_n(hdmi, hdmi->audio_cts, hdmi->audio_n); > + hdmi_enable_audio_clk(hdmi, true); > +} > + > +void dw_hdmi_i2s_audio_disable(struct dw_hdmi *hdmi) > +{ > + hdmi_enable_audio_clk(hdmi, false); > } This should be static too. If you're okay with the suggestions, I can fix these myself and push. Let me know if that's okay. Thanks, Archit > > void dw_hdmi_audio_enable(struct dw_hdmi *hdmi) > @@ -1592,11 +1604,6 @@ static void dw_hdmi_enable_video_path(struct dw_hdmi *hdmi) > HDMI_MC_FLOWCTRL); > } > > -static void hdmi_enable_audio_clk(struct dw_hdmi *hdmi) > -{ > - hdmi_modb(hdmi, 0, HDMI_MC_CLKDIS_AUDCLK_DISABLE, HDMI_MC_CLKDIS); > -} > - > /* Workaround to clear the overflow condition */ > static void dw_hdmi_clear_overflow(struct dw_hdmi *hdmi) > { > @@ -1710,7 +1717,7 @@ static int dw_hdmi_setup(struct dw_hdmi *hdmi, struct drm_display_mode *mode) > > /* HDMI Initialization Step E - Configure audio */ > hdmi_clk_regenerator_update_pixel_clock(hdmi); > - hdmi_enable_audio_clk(hdmi); > + hdmi_enable_audio_clk(hdmi, true); > } > > /* not for DVI mode */ > @@ -2438,6 +2445,7 @@ __dw_hdmi_probe(struct platform_device *pdev, > audio.write = hdmi_writeb; > audio.read = hdmi_readb; > hdmi->enable_audio = dw_hdmi_i2s_audio_enable; > + hdmi->disable_audio = dw_hdmi_i2s_audio_disable; > > pdevinfo.name = "dw-hdmi-i2s-audio"; > pdevinfo.data = &audio; >
On 04/19/2017 10:21 AM, Archit Taneja wrote: > > > On 04/14/2017 02:01 PM, Romain Perier wrote: >> Currently, the audio sampler clock is enabled from dw_hdmi_setup() at >> step E. and is kept enabled for later use. This clock should be enabled >> and disabled along with the actual audio stream and not always on (that >> is bad for PM). Futhermore, as described by the datasheet, the I2S > > s/Futhermore/Furthermore > >> variant need to gate/ungate the clock when the stream is > > s/need/needs > >> enabled/disabled. >> >> This commit adds a parameter to hdmi_audio_enable_clk() that controls >> when the audio sample clock must be enabled or disabled. Then, it adds >> the call to this function from dw_hdmi_i2s_audio_enable() and >> dw_hdmi_i2s_audio_disable(). >> >> Signed-off-by: Romain Perier <romain.perier@collabora.com> >> --- >> drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 20 ++++++++++++++------ >> 1 file changed, 14 insertions(+), 6 deletions(-) >> >> diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c >> index 5b328c0..a6da634 100644 >> --- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c >> +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c >> @@ -544,6 +544,12 @@ void dw_hdmi_set_sample_rate(struct dw_hdmi *hdmi, unsigned int rate) >> } >> EXPORT_SYMBOL_GPL(dw_hdmi_set_sample_rate); >> >> +static void hdmi_enable_audio_clk(struct dw_hdmi *hdmi, bool enable) >> +{ >> + hdmi_modb(hdmi, enable ? 0 : HDMI_MC_CLKDIS_AUDCLK_DISABLE, >> + HDMI_MC_CLKDIS_AUDCLK_DISABLE, HDMI_MC_CLKDIS); >> +} >> + >> void dw_hdmi_ahb_audio_enable(struct dw_hdmi *hdmi) >> { >> hdmi_set_cts_n(hdmi, hdmi->audio_cts, hdmi->audio_n); >> @@ -557,6 +563,12 @@ void dw_hdmi_ahb_audio_disable(struct dw_hdmi *hdmi) >> void dw_hdmi_i2s_audio_enable(struct dw_hdmi *hdmi) >> { >> hdmi_set_cts_n(hdmi, hdmi->audio_cts, hdmi->audio_n); >> + hdmi_enable_audio_clk(hdmi, true); >> +} >> + >> +void dw_hdmi_i2s_audio_disable(struct dw_hdmi *hdmi) >> +{ >> + hdmi_enable_audio_clk(hdmi, false); >> } > > This should be static too. > > If you're okay with the suggestions, I can fix these myself and push. Let > me know if that's okay. Took the liberty of going ahead with the fixes. Queued both patches to drm-misc-next. Thanks, Archit > > Thanks, > Archit > >> >> void dw_hdmi_audio_enable(struct dw_hdmi *hdmi) >> @@ -1592,11 +1604,6 @@ static void dw_hdmi_enable_video_path(struct dw_hdmi *hdmi) >> HDMI_MC_FLOWCTRL); >> } >> >> -static void hdmi_enable_audio_clk(struct dw_hdmi *hdmi) >> -{ >> - hdmi_modb(hdmi, 0, HDMI_MC_CLKDIS_AUDCLK_DISABLE, HDMI_MC_CLKDIS); >> -} >> - >> /* Workaround to clear the overflow condition */ >> static void dw_hdmi_clear_overflow(struct dw_hdmi *hdmi) >> { >> @@ -1710,7 +1717,7 @@ static int dw_hdmi_setup(struct dw_hdmi *hdmi, struct drm_display_mode *mode) >> >> /* HDMI Initialization Step E - Configure audio */ >> hdmi_clk_regenerator_update_pixel_clock(hdmi); >> - hdmi_enable_audio_clk(hdmi); >> + hdmi_enable_audio_clk(hdmi, true); >> } >> >> /* not for DVI mode */ >> @@ -2438,6 +2445,7 @@ __dw_hdmi_probe(struct platform_device *pdev, >> audio.write = hdmi_writeb; >> audio.read = hdmi_readb; >> hdmi->enable_audio = dw_hdmi_i2s_audio_enable; >> + hdmi->disable_audio = dw_hdmi_i2s_audio_disable; >> >> pdevinfo.name = "dw-hdmi-i2s-audio"; >> pdevinfo.data = &audio; >> >
Hello, Le 19/04/2017 à 06:51, Archit Taneja a écrit : > > > On 04/14/2017 02:01 PM, Romain Perier wrote: >> Currently, the audio sampler clock is enabled from dw_hdmi_setup() at >> step E. and is kept enabled for later use. This clock should be enabled >> and disabled along with the actual audio stream and not always on (that >> is bad for PM). Futhermore, as described by the datasheet, the I2S > > s/Futhermore/Furthermore > >> variant need to gate/ungate the clock when the stream is > > s/need/needs > >> enabled/disabled. >> >> This commit adds a parameter to hdmi_audio_enable_clk() that controls >> when the audio sample clock must be enabled or disabled. Then, it adds >> the call to this function from dw_hdmi_i2s_audio_enable() and >> dw_hdmi_i2s_audio_disable(). >> >> Signed-off-by: Romain Perier <romain.perier@collabora.com> >> --- >> drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 20 ++++++++++++++------ >> 1 file changed, 14 insertions(+), 6 deletions(-) >> >> diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c >> b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c >> index 5b328c0..a6da634 100644 >> --- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c >> +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c >> @@ -544,6 +544,12 @@ void dw_hdmi_set_sample_rate(struct dw_hdmi >> *hdmi, unsigned int rate) >> } >> EXPORT_SYMBOL_GPL(dw_hdmi_set_sample_rate); >> >> +static void hdmi_enable_audio_clk(struct dw_hdmi *hdmi, bool enable) >> +{ >> + hdmi_modb(hdmi, enable ? 0 : HDMI_MC_CLKDIS_AUDCLK_DISABLE, >> + HDMI_MC_CLKDIS_AUDCLK_DISABLE, HDMI_MC_CLKDIS); >> +} >> + >> void dw_hdmi_ahb_audio_enable(struct dw_hdmi *hdmi) >> { >> hdmi_set_cts_n(hdmi, hdmi->audio_cts, hdmi->audio_n); >> @@ -557,6 +563,12 @@ void dw_hdmi_ahb_audio_disable(struct dw_hdmi >> *hdmi) >> void dw_hdmi_i2s_audio_enable(struct dw_hdmi *hdmi) >> { >> hdmi_set_cts_n(hdmi, hdmi->audio_cts, hdmi->audio_n); >> + hdmi_enable_audio_clk(hdmi, true); >> +} >> + >> +void dw_hdmi_i2s_audio_disable(struct dw_hdmi *hdmi) >> +{ >> + hdmi_enable_audio_clk(hdmi, false); >> } > > This should be static too. > > If you're okay with the suggestions, I can fix these myself and push. Let > me know if that's okay. > > Thanks, > Archit > Yes, I completely agree. Thanks, Romain
Hello, > Took the liberty of going ahead with the fixes. Queued both patches to > drm-misc-next. > > Thanks, > Archit You were right. Sorry for the delay, I am back from vacations :) Regards, Romain
diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c index 5b328c0..a6da634 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c @@ -544,6 +544,12 @@ void dw_hdmi_set_sample_rate(struct dw_hdmi *hdmi, unsigned int rate) } EXPORT_SYMBOL_GPL(dw_hdmi_set_sample_rate); +static void hdmi_enable_audio_clk(struct dw_hdmi *hdmi, bool enable) +{ + hdmi_modb(hdmi, enable ? 0 : HDMI_MC_CLKDIS_AUDCLK_DISABLE, + HDMI_MC_CLKDIS_AUDCLK_DISABLE, HDMI_MC_CLKDIS); +} + void dw_hdmi_ahb_audio_enable(struct dw_hdmi *hdmi) { hdmi_set_cts_n(hdmi, hdmi->audio_cts, hdmi->audio_n); @@ -557,6 +563,12 @@ void dw_hdmi_ahb_audio_disable(struct dw_hdmi *hdmi) void dw_hdmi_i2s_audio_enable(struct dw_hdmi *hdmi) { hdmi_set_cts_n(hdmi, hdmi->audio_cts, hdmi->audio_n); + hdmi_enable_audio_clk(hdmi, true); +} + +void dw_hdmi_i2s_audio_disable(struct dw_hdmi *hdmi) +{ + hdmi_enable_audio_clk(hdmi, false); } void dw_hdmi_audio_enable(struct dw_hdmi *hdmi) @@ -1592,11 +1604,6 @@ static void dw_hdmi_enable_video_path(struct dw_hdmi *hdmi) HDMI_MC_FLOWCTRL); } -static void hdmi_enable_audio_clk(struct dw_hdmi *hdmi) -{ - hdmi_modb(hdmi, 0, HDMI_MC_CLKDIS_AUDCLK_DISABLE, HDMI_MC_CLKDIS); -} - /* Workaround to clear the overflow condition */ static void dw_hdmi_clear_overflow(struct dw_hdmi *hdmi) { @@ -1710,7 +1717,7 @@ static int dw_hdmi_setup(struct dw_hdmi *hdmi, struct drm_display_mode *mode) /* HDMI Initialization Step E - Configure audio */ hdmi_clk_regenerator_update_pixel_clock(hdmi); - hdmi_enable_audio_clk(hdmi); + hdmi_enable_audio_clk(hdmi, true); } /* not for DVI mode */ @@ -2438,6 +2445,7 @@ __dw_hdmi_probe(struct platform_device *pdev, audio.write = hdmi_writeb; audio.read = hdmi_readb; hdmi->enable_audio = dw_hdmi_i2s_audio_enable; + hdmi->disable_audio = dw_hdmi_i2s_audio_disable; pdevinfo.name = "dw-hdmi-i2s-audio"; pdevinfo.data = &audio;
Currently, the audio sampler clock is enabled from dw_hdmi_setup() at step E. and is kept enabled for later use. This clock should be enabled and disabled along with the actual audio stream and not always on (that is bad for PM). Futhermore, as described by the datasheet, the I2S variant need to gate/ungate the clock when the stream is enabled/disabled. This commit adds a parameter to hdmi_audio_enable_clk() that controls when the audio sample clock must be enabled or disabled. Then, it adds the call to this function from dw_hdmi_i2s_audio_enable() and dw_hdmi_i2s_audio_disable(). Signed-off-by: Romain Perier <romain.perier@collabora.com> --- drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-)