From mboxrd@z Thu Jan 1 00:00:00 1970 From: Yakir Subject: Re: [PATCH 08/13] drm: bridge/dw_hdmi: introduce interfaces to enable and disable audio Date: Fri, 22 May 2015 23:28:58 +0800 Message-ID: <555F4B3A.3070907@rock-chips.com> References: <20150509102501.GO2067@n2100.arm.linux.org.uk> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8"; Format="flowed" Content-Transfer-Encoding: base64 Return-path: Received: from regular1.263xmail.com (regular1.263xmail.com [211.150.99.138]) by alsa0.perex.cz (Postfix) with ESMTP id 56E91265CC7 for ; Fri, 22 May 2015 17:29:00 +0200 (CEST) In-Reply-To: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: alsa-devel-bounces@alsa-project.org To: Russell King , alsa-devel@alsa-project.org, dri-devel@lists.freedesktop.org, linux-arm-kernel@lists.infradead.org Cc: Fabio Estevam , David Airlie , Takashi Iwai , Mark Brown , Philipp Zabel List-Id: alsa-devel@alsa-project.org SGkgUnVzc2VsbCwKCuWcqCAyMDE1LzUvOSAxODoyNiwgUnVzc2VsbCBLaW5nIOWGmemBkzoKPiBp TVg2IGRldmljZXMgc3VmZmVyIGZyb20gYW4gZXJyYXRhIChFUlIwMDUxNzQpIHdoZXJlIHRoZSBh dWRpbyBGSUZPIGNhbgo+IGJlIGVtcHRpZWQgd2hpbGUgaXQgaXMgcGFydGlhbGx5IGZ1bGwsIHJl c3VsdGluZyBpbiBtaXNhbGlnbm1lbnQgb2YgdGhlCj4gYXVkaW8gc2FtcGxlcy4KPgo+IFRvIHBy ZXZlbnQgdGhpcywgdGhlIGVycmF0YSB3b3JrYXJvdW5kIHJlY29tbWVuZHMgd3JpdGluZyBOIGFz IHplcm8KPiB1bnRpbCB0aGUgYXVkaW8gRklGTyBoYXMgYmVlbiBsb2FkZWQgYnkgRE1BLiAgV3Jp dGluZyBOPTAgcHJldmVudHMgdGhlCj4gSERNSSBicmlkZ2UgZnJvbSByZWFkaW5nIGZyb20gdGhl IGF1ZGlvIEZJRk8sIGVmZmVjdGl2ZWx5IGRpc2FibGluZwo+IGF1ZGlvLgo+Cj4gVGhpcyBtZWFu cyB3ZSBuZWVkIHRvIHByb3ZpZGUgdGhlIGF1ZGlvIGRyaXZlciB3aXRoIGEgcGFpciBvZiBmdW5j dGlvbnMKPiB0byBlbmFibGUvZGlzYWJsZSBhdWRpby4gIFRoZXNlIGFyZSBkd19oZG1pX2F1ZGlv X2VuYWJsZSgpIGFuZAo+IGR3X2hkbWlfYXVkaW9fZGlzYWJsZSgpLgo+Cj4gQSBzcGlubG9jayBp cyBpbnRyb2R1Y2VkIHRvIGVuc3VyZSB0aGF0IHNldHRpbmcgdGhlIENUUy9OIHZhbHVlcyBjYW4n dAo+IHJhY2UsIGVuc3VyaW5nIHRoYXQgdGhlIGF1ZGlvIGRyaXZlciBjYWxsaW5nIHRoZSBlbmFi bGUvZGlzYWJsZQo+IGZ1bmN0aW9ucyAod2hpY2ggYXJlIGNhbGxlZCBpbiBhbiBhdG9taWMgY29u dGV4dCkgY2FuJ3QgcmFjZSB3aXRoIGEKPiBtb2Rlc2V0Lgo+Cj4gU2lnbmVkLW9mZi1ieTogUnVz c2VsbCBLaW5nIDxybWsra2VybmVsQGFybS5saW51eC5vcmcudWs+CgpUZXN0IG9uIFJLMzI4OCBw bGF0Zm9ybSwgaXQgd29ya3Mgd2VsbHMuIFByZXZpb3VzbHkgSSB1c2UgdG8gc3dpdGNoIG9mZgp0 aGUgaTJzIGF1ZGlvIGNsb2NrLCBmb3Igbm93IHNlZW1zIGl0IGlzIG5vdCBuZWNlc3NhcnkuCgpU ZXN0LWJ5OiBZYWtpciBZYW5nIDx5a2tAcm9jay1jaGlwcy5jb20+CgpUaGFua3MsCllha2lyIFlh bmcKCj4gLS0tCj4gICBkcml2ZXJzL2dwdS9kcm0vYnJpZGdlL2R3X2hkbWkuYyB8IDM0ICsrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKy0KPiAgIGluY2x1ZGUvZHJtL2JyaWRnZS9kd19o ZG1pLmggICAgIHwgIDIgKysKPiAgIDIgZmlsZXMgY2hhbmdlZCwgMzUgaW5zZXJ0aW9ucygrKSwg MSBkZWxldGlvbigtKQo+Cj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9icmlkZ2UvZHdf aGRtaS5jIGIvZHJpdmVycy9ncHUvZHJtL2JyaWRnZS9kd19oZG1pLmMKPiBpbmRleCAwMzY5ZmFi NWM2OTUuLmFkZGEzYTk4OGYzNiAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vYnJpZGdl L2R3X2hkbWkuYwo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9icmlkZ2UvZHdfaGRtaS5jCj4gQEAg LTE4LDYgKzE4LDcgQEAKPiAgICNpbmNsdWRlIDxsaW51eC9oZG1pLmg+Cj4gICAjaW5jbHVkZSA8 bGludXgvbXV0ZXguaD4KPiAgICNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KPiArI2luY2x1 ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Cj4gICAKPiAgICNpbmNsdWRlIDxkcm0vZHJtX29mLmg+Cj4g ICAjaW5jbHVkZSA8ZHJtL2RybVAuaD4KPiBAQCAtMTI0LDggKzEyNSwxMiBAQCBzdHJ1Y3QgZHdf aGRtaSB7Cj4gICAJc3RydWN0IGkyY19hZGFwdGVyICpkZGM7Cj4gICAJdm9pZCBfX2lvbWVtICpy ZWdzOwo+ICAgCj4gKwlzcGlubG9ja190IGF1ZGlvX2xvY2s7Cj4gICAJc3RydWN0IG11dGV4IGF1 ZGlvX211dGV4Owo+ICAgCXVuc2lnbmVkIGludCBzYW1wbGVfcmF0ZTsKPiArCXVuc2lnbmVkIGlu dCBhdWRpb19jdHM7Cj4gKwl1bnNpZ25lZCBpbnQgYXVkaW9fbjsKPiArCWJvb2wgYXVkaW9fZW5h YmxlOwo+ICAgCWludCByYXRpbzsKPiAgIAo+ICAgCXZvaWQgKCp3cml0ZSkoc3RydWN0IGR3X2hk bWkgKmhkbWksIHU4IHZhbCwgaW50IG9mZnNldCk7Cj4gQEAgLTM0Nyw3ICszNTIsMTEgQEAgc3Rh dGljIHZvaWQgaGRtaV9zZXRfY2xrX3JlZ2VuZXJhdG9yKHN0cnVjdCBkd19oZG1pICpoZG1pLAo+ ICAgCWRldl9kYmcoaGRtaS0+ZGV2LCAiJXM6IHNhbXBsZXJhdGU9JXVrSHogcmF0aW89JWQgcGl4 ZWxjbGs9JWx1TUh6IE49JWQgY3RzPSVkXG4iLAo+ICAgCQlfX2Z1bmNfXywgc2FtcGxlX3JhdGUs IHJhdGlvLCBwaXhlbF9jbGssIG4sIGN0cyk7Cj4gICAKPiAtCWhkbWlfc2V0X2N0c19uKGhkbWks IGN0cywgbik7Cj4gKwlzcGluX2xvY2tfaXJxKCZoZG1pLT5hdWRpb19sb2NrKTsKPiArCWhkbWkt PmF1ZGlvX24gPSBuOwo+ICsJaGRtaS0+YXVkaW9fY3RzID0gY3RzOwo+ICsJaGRtaV9zZXRfY3Rz X24oaGRtaSwgY3RzLCBoZG1pLT5hdWRpb19lbmFibGUgPyBuIDogMCk7Cj4gKwlzcGluX3VubG9j a19pcnEoJmhkbWktPmF1ZGlvX2xvY2spOwo+ICAgfQo+ICAgCj4gICBzdGF0aWMgdm9pZCBoZG1p X2luaXRfY2xrX3JlZ2VuZXJhdG9yKHN0cnVjdCBkd19oZG1pICpoZG1pKQo+IEBAIC0zNzYsNiAr Mzg1LDI4IEBAIHZvaWQgZHdfaGRtaV9zZXRfc2FtcGxlX3JhdGUoc3RydWN0IGR3X2hkbWkgKmhk bWksIHVuc2lnbmVkIGludCByYXRlKQo+ICAgfQo+ICAgRVhQT1JUX1NZTUJPTF9HUEwoZHdfaGRt aV9zZXRfc2FtcGxlX3JhdGUpOwo+ICAgCj4gK3ZvaWQgZHdfaGRtaV9hdWRpb19lbmFibGUoc3Ry dWN0IGR3X2hkbWkgKmhkbWkpCj4gK3sKPiArCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Cj4gKwo+ICsJ c3Bpbl9sb2NrX2lycXNhdmUoJmhkbWktPmF1ZGlvX2xvY2ssIGZsYWdzKTsKPiArCWhkbWktPmF1 ZGlvX2VuYWJsZSA9IHRydWU7Cj4gKwloZG1pX3NldF9jdHNfbihoZG1pLCBoZG1pLT5hdWRpb19j dHMsIGhkbWktPmF1ZGlvX24pOwo+ICsJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGRtaS0+YXVk aW9fbG9jaywgZmxhZ3MpOwo+ICt9Cj4gK0VYUE9SVF9TWU1CT0xfR1BMKGR3X2hkbWlfYXVkaW9f ZW5hYmxlKTsKPiArCj4gK3ZvaWQgZHdfaGRtaV9hdWRpb19kaXNhYmxlKHN0cnVjdCBkd19oZG1p ICpoZG1pKQo+ICt7Cj4gKwl1bnNpZ25lZCBsb25nIGZsYWdzOwo+ICsKPiArCXNwaW5fbG9ja19p cnFzYXZlKCZoZG1pLT5hdWRpb19sb2NrLCBmbGFncyk7Cj4gKwloZG1pLT5hdWRpb19lbmFibGUg PSBmYWxzZTsKPiArCWhkbWlfc2V0X2N0c19uKGhkbWksIGhkbWktPmF1ZGlvX2N0cywgMCk7Cj4g KwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoZG1pLT5hdWRpb19sb2NrLCBmbGFncyk7Cj4gK30K PiArRVhQT1JUX1NZTUJPTF9HUEwoZHdfaGRtaV9hdWRpb19kaXNhYmxlKTsKPiArCj4gICAvKgo+ ICAgICogdGhpcyBzdWJtb2R1bGUgaXMgcmVzcG9uc2libGUgZm9yIHRoZSB2aWRlbyBkYXRhIHN5 bmNocm9uaXphdGlvbi4KPiAgICAqIGZvciBleGFtcGxlLCBmb3IgUkdCIDQ6NDo0IGlucHV0LCB0 aGUgZGF0YSBtYXAgaXMgZGVmaW5lZCBhcwo+IEBAIC0xNTc4LDYgKzE2MDksNyBAQCBpbnQgZHdf aGRtaV9iaW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZSAqbWFzdGVyLAo+ICAg CWhkbWktPmVuY29kZXIgPSBlbmNvZGVyOwo+ICAgCj4gICAJbXV0ZXhfaW5pdCgmaGRtaS0+YXVk aW9fbXV0ZXgpOwo+ICsJc3Bpbl9sb2NrX2luaXQoJmhkbWktPmF1ZGlvX2xvY2spOwo+ICAgCj4g ICAJb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJyZWctaW8td2lkdGgiLCAmdmFsKTsKPiAgIAo+ IGRpZmYgLS1naXQgYS9pbmNsdWRlL2RybS9icmlkZ2UvZHdfaGRtaS5oIGIvaW5jbHVkZS9kcm0v YnJpZGdlL2R3X2hkbWkuaAo+IGluZGV4IDc2M2FmNTFlMWQ2MC4uYmFlNzlmM2M0ZDI4IDEwMDY0 NAo+IC0tLSBhL2luY2x1ZGUvZHJtL2JyaWRnZS9kd19oZG1pLmgKPiArKysgYi9pbmNsdWRlL2Ry bS9icmlkZ2UvZHdfaGRtaS5oCj4gQEAgLTYzLDUgKzYzLDcgQEAgaW50IGR3X2hkbWlfYmluZChz dHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2UgKm1hc3RlciwKPiAgIAkJIGNvbnN0IHN0 cnVjdCBkd19oZG1pX3BsYXRfZGF0YSAqcGxhdF9kYXRhKTsKPiAgIAo+ICAgdm9pZCBkd19oZG1p X3NldF9zYW1wbGVfcmF0ZShzdHJ1Y3QgZHdfaGRtaSAqaGRtaSwgdW5zaWduZWQgaW50IHJhdGUp Owo+ICt2b2lkIGR3X2hkbWlfYXVkaW9fZW5hYmxlKHN0cnVjdCBkd19oZG1pICpoZG1pKTsKPiAr dm9pZCBkd19oZG1pX2F1ZGlvX2Rpc2FibGUoc3RydWN0IGR3X2hkbWkgKmhkbWkpOwo+ICAgCj4g ICAjZW5kaWYgLyogX19JTVhfSERNSV9IX18gKi8KCgpfX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fXwpBbHNhLWRldmVsIG1haWxpbmcgbGlzdApBbHNhLWRldmVs QGFsc2EtcHJvamVjdC5vcmcKaHR0cDovL21haWxtYW4uYWxzYS1wcm9qZWN0Lm9yZy9tYWlsbWFu L2xpc3RpbmZvL2Fsc2EtZGV2ZWwK From mboxrd@z Thu Jan 1 00:00:00 1970 From: ykk@rock-chips.com (Yakir) Date: Fri, 22 May 2015 23:28:58 +0800 Subject: [PATCH 08/13] drm: bridge/dw_hdmi: introduce interfaces to enable and disable audio In-Reply-To: References: <20150509102501.GO2067@n2100.arm.linux.org.uk> Message-ID: <555F4B3A.3070907@rock-chips.com> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org Hi Russell, ? 2015/5/9 18:26, Russell King ??: > iMX6 devices suffer from an errata (ERR005174) where the audio FIFO can > be emptied while it is partially full, resulting in misalignment of the > audio samples. > > To prevent this, the errata workaround recommends writing N as zero > until the audio FIFO has been loaded by DMA. Writing N=0 prevents the > HDMI bridge from reading from the audio FIFO, effectively disabling > audio. > > This means we need to provide the audio driver with a pair of functions > to enable/disable audio. These are dw_hdmi_audio_enable() and > dw_hdmi_audio_disable(). > > A spinlock is introduced to ensure that setting the CTS/N values can't > race, ensuring that the audio driver calling the enable/disable > functions (which are called in an atomic context) can't race with a > modeset. > > Signed-off-by: Russell King Test on RK3288 platform, it works wells. Previously I use to switch off the i2s audio clock, for now seems it is not necessary. Test-by: Yakir Yang Thanks, Yakir Yang > --- > drivers/gpu/drm/bridge/dw_hdmi.c | 34 +++++++++++++++++++++++++++++++++- > include/drm/bridge/dw_hdmi.h | 2 ++ > 2 files changed, 35 insertions(+), 1 deletion(-) > > diff --git a/drivers/gpu/drm/bridge/dw_hdmi.c b/drivers/gpu/drm/bridge/dw_hdmi.c > index 0369fab5c695..adda3a988f36 100644 > --- a/drivers/gpu/drm/bridge/dw_hdmi.c > +++ b/drivers/gpu/drm/bridge/dw_hdmi.c > @@ -18,6 +18,7 @@ > #include > #include > #include > +#include > > #include > #include > @@ -124,8 +125,12 @@ struct dw_hdmi { > struct i2c_adapter *ddc; > void __iomem *regs; > > + spinlock_t audio_lock; > struct mutex audio_mutex; > unsigned int sample_rate; > + unsigned int audio_cts; > + unsigned int audio_n; > + bool audio_enable; > int ratio; > > void (*write)(struct dw_hdmi *hdmi, u8 val, int offset); > @@ -347,7 +352,11 @@ static void hdmi_set_clk_regenerator(struct dw_hdmi *hdmi, > dev_dbg(hdmi->dev, "%s: samplerate=%ukHz ratio=%d pixelclk=%luMHz N=%d cts=%d\n", > __func__, sample_rate, ratio, pixel_clk, n, cts); > > - hdmi_set_cts_n(hdmi, cts, n); > + spin_lock_irq(&hdmi->audio_lock); > + hdmi->audio_n = n; > + hdmi->audio_cts = cts; > + hdmi_set_cts_n(hdmi, cts, hdmi->audio_enable ? n : 0); > + spin_unlock_irq(&hdmi->audio_lock); > } > > static void hdmi_init_clk_regenerator(struct dw_hdmi *hdmi) > @@ -376,6 +385,28 @@ void dw_hdmi_set_sample_rate(struct dw_hdmi *hdmi, unsigned int rate) > } > EXPORT_SYMBOL_GPL(dw_hdmi_set_sample_rate); > > +void dw_hdmi_audio_enable(struct dw_hdmi *hdmi) > +{ > + unsigned long flags; > + > + spin_lock_irqsave(&hdmi->audio_lock, flags); > + hdmi->audio_enable = true; > + hdmi_set_cts_n(hdmi, hdmi->audio_cts, hdmi->audio_n); > + spin_unlock_irqrestore(&hdmi->audio_lock, flags); > +} > +EXPORT_SYMBOL_GPL(dw_hdmi_audio_enable); > + > +void dw_hdmi_audio_disable(struct dw_hdmi *hdmi) > +{ > + unsigned long flags; > + > + spin_lock_irqsave(&hdmi->audio_lock, flags); > + hdmi->audio_enable = false; > + hdmi_set_cts_n(hdmi, hdmi->audio_cts, 0); > + spin_unlock_irqrestore(&hdmi->audio_lock, flags); > +} > +EXPORT_SYMBOL_GPL(dw_hdmi_audio_disable); > + > /* > * this submodule is responsible for the video data synchronization. > * for example, for RGB 4:4:4 input, the data map is defined as > @@ -1578,6 +1609,7 @@ int dw_hdmi_bind(struct device *dev, struct device *master, > hdmi->encoder = encoder; > > mutex_init(&hdmi->audio_mutex); > + spin_lock_init(&hdmi->audio_lock); > > of_property_read_u32(np, "reg-io-width", &val); > > diff --git a/include/drm/bridge/dw_hdmi.h b/include/drm/bridge/dw_hdmi.h > index 763af51e1d60..bae79f3c4d28 100644 > --- a/include/drm/bridge/dw_hdmi.h > +++ b/include/drm/bridge/dw_hdmi.h > @@ -63,5 +63,7 @@ int dw_hdmi_bind(struct device *dev, struct device *master, > const struct dw_hdmi_plat_data *plat_data); > > void dw_hdmi_set_sample_rate(struct dw_hdmi *hdmi, unsigned int rate); > +void dw_hdmi_audio_enable(struct dw_hdmi *hdmi); > +void dw_hdmi_audio_disable(struct dw_hdmi *hdmi); > > #endif /* __IMX_HDMI_H__ */