From mboxrd@z Thu Jan 1 00:00:00 1970 From: Oleksandr Andrushchenko Subject: [PATCH RESEND 08/11] ALSA: vsnd: Add timer for period interrupt emulation Date: Mon, 7 Aug 2017 14:50:42 +0300 Message-ID: <1502106645-6731-9-git-send-email-andr2000@gmail.com> References: <1502106645-6731-1-git-send-email-andr2000@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <1502106645-6731-1-git-send-email-andr2000@gmail.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" To: alsa-devel@alsa-project.org, xen-devel@lists.xen.org, linux-kernel@vger.kernel.org Cc: andr2000@gmail.com, Oleksandr Andrushchenko , tiwai@suse.com, perex@perex.cz List-Id: alsa-devel@alsa-project.org RnJvbTogT2xla3NhbmRyIEFuZHJ1c2hjaGVua28gPG9sZWtzYW5kcl9hbmRydXNoY2hlbmtvQGVw YW0uY29tPgoKRnJvbnQgc291bmQgZHJpdmVyIGhhcyBubyByZWFsIGludGVycnVwdHMsIHNvCnBs YXliYWNrL2NhcHR1cmUgcGVyaW9kIHBhc3NlZCBpbnRlcnJ1cHQgbmVlZHMgdG8gYmUgZW11bGF0 ZWQ6CnRoaXMgaXMgZG9uZSB2aWEgdGltZXIuIEFkZCByZXF1aXJlZCB0aW1lciBvcGVyYXRpb25z LAp0aGlzIGlzIGJhc2VkIG9uIHNvdW5kL2RyaXZlcnMvZHVtbXkuYy4KClNpZ25lZC1vZmYtYnk6 IE9sZWtzYW5kciBBbmRydXNoY2hlbmtvIDxvbGVrc2FuZHJfYW5kcnVzaGNoZW5rb0BlcGFtLmNv bT4KLS0tCiBzb3VuZC9kcml2ZXJzL3hlbi1mcm9udC5jIHwgMTIxICsrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysKIDEgZmlsZSBjaGFuZ2VkLCAxMjEgaW5zZXJ0 aW9ucygrKQoKZGlmZiAtLWdpdCBhL3NvdW5kL2RyaXZlcnMveGVuLWZyb250LmMgYi9zb3VuZC9k cml2ZXJzL3hlbi1mcm9udC5jCmluZGV4IDlmMzFlNjgzMjA4Ni4uNTA3YzVlYjM0M2M4IDEwMDY0 NAotLS0gYS9zb3VuZC9kcml2ZXJzL3hlbi1mcm9udC5jCisrKyBiL3NvdW5kL2RyaXZlcnMveGVu LWZyb250LmMKQEAgLTY3LDEyICs2NywyOSBAQCBzdHJ1Y3Qgc2hfYnVmX2luZm8gewogCXNpemVf dCB2YnVmZmVyX3N6OwogfTsKIAorc3RydWN0IHNkZXZfYWxzYV90aW1lcl9pbmZvIHsKKwlzcGlu bG9ja190IGxvY2s7CisJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CisJdW5zaWduZWQgbG9uZyBi YXNlX3RpbWU7CisJLyogZnJhY3Rpb25hbCBzYW1wbGUgcG9zaXRpb24gKGJhc2VkIEhaKSAqLwor CXVuc2lnbmVkIGludCBmcmFjX3BvczsKKwl1bnNpZ25lZCBpbnQgZnJhY19wZXJpb2RfcmVzdDsK KwkvKiBidWZmZXJfc2l6ZSAqIEhaICovCisJdW5zaWduZWQgaW50IGZyYWNfYnVmZmVyX3NpemU7 CisJLyogcGVyaW9kX3NpemUgKiBIWiAqLworCXVuc2lnbmVkIGludCBmcmFjX3BlcmlvZF9zaXpl OworCXVuc2lnbmVkIGludCByYXRlOworCWludCBlbGFwc2VkOworCXN0cnVjdCBzbmRfcGNtX3N1 YnN0cmVhbSAqc3Vic3RyZWFtOworfTsKKwogc3RydWN0IHNkZXZfcGNtX3N0cmVhbV9pbmZvIHsK IAlpbnQgdW5pcXVlX2lkOwogCXN0cnVjdCBzbmRfcGNtX2hhcmR3YXJlIHBjbV9odzsKIAlzdHJ1 Y3QgeGRydl9ldnRjaG5sX2luZm8gKmV2dF9jaG5sOwogCWJvb2wgaXNfb3BlbjsKIAl1aW50OF90 IHJlcV9uZXh0X2lkOworCXN0cnVjdCBzZGV2X2Fsc2FfdGltZXJfaW5mbyB0aW1lcjsKIAlzdHJ1 Y3Qgc2hfYnVmX2luZm8gc2hfYnVmOwogfTsKIApAQCAtMTQ4LDYgKzE2NSwxMTAgQEAgc3RhdGlj IHN0cnVjdCBzZGV2X3BjbV9zdHJlYW1faW5mbyAqc2Rydl9zdHJlYW1fZ2V0KAogCXJldHVybiBz dHJlYW07CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZHJ2X2Fsc2FfdGltZXJfcmVhcm0oc3Ry dWN0IHNkZXZfYWxzYV90aW1lcl9pbmZvICpkcGNtKQoreworCW1vZF90aW1lcigmZHBjbS0+dGlt ZXIsIGppZmZpZXMgKworCQkoZHBjbS0+ZnJhY19wZXJpb2RfcmVzdCArIGRwY20tPnJhdGUgLSAx KSAvIGRwY20tPnJhdGUpOworfQorCitzdGF0aWMgdm9pZCBzZHJ2X2Fsc2FfdGltZXJfdXBkYXRl KHN0cnVjdCBzZGV2X2Fsc2FfdGltZXJfaW5mbyAqZHBjbSkKK3sKKwl1bnNpZ25lZCBsb25nIGRl bHRhOworCisJZGVsdGEgPSBqaWZmaWVzIC0gZHBjbS0+YmFzZV90aW1lOworCWlmICghZGVsdGEp CisJCXJldHVybjsKKwlkcGNtLT5iYXNlX3RpbWUgKz0gZGVsdGE7CisJZGVsdGEgKj0gZHBjbS0+ cmF0ZTsKKwlkcGNtLT5mcmFjX3BvcyArPSBkZWx0YTsKKwl3aGlsZSAoZHBjbS0+ZnJhY19wb3Mg Pj0gZHBjbS0+ZnJhY19idWZmZXJfc2l6ZSkKKwkJZHBjbS0+ZnJhY19wb3MgLT0gZHBjbS0+ZnJh Y19idWZmZXJfc2l6ZTsKKwl3aGlsZSAoZHBjbS0+ZnJhY19wZXJpb2RfcmVzdCA8PSBkZWx0YSkg eworCQlkcGNtLT5lbGFwc2VkKys7CisJCWRwY20tPmZyYWNfcGVyaW9kX3Jlc3QgKz0gZHBjbS0+ ZnJhY19wZXJpb2Rfc2l6ZTsKKwl9CisJZHBjbS0+ZnJhY19wZXJpb2RfcmVzdCAtPSBkZWx0YTsK K30KKworc3RhdGljIGludCBzZHJ2X2Fsc2FfdGltZXJfc3RhcnQoc3RydWN0IHNuZF9wY21fc3Vi c3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHNkZXZfcGNtX3N0cmVhbV9pbmZvICpzdHJl YW0gPSBzZHJ2X3N0cmVhbV9nZXQoc3Vic3RyZWFtKTsKKwlzdHJ1Y3Qgc2Rldl9hbHNhX3RpbWVy X2luZm8gKmRwY20gPSAmc3RyZWFtLT50aW1lcjsKKworCXNwaW5fbG9jaygmZHBjbS0+bG9jayk7 CisJZHBjbS0+YmFzZV90aW1lID0gamlmZmllczsKKwlzZHJ2X2Fsc2FfdGltZXJfcmVhcm0oZHBj bSk7CisJc3Bpbl91bmxvY2soJmRwY20tPmxvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMg aW50IHNkcnZfYWxzYV90aW1lcl9zdG9wKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3Ry ZWFtKQoreworCXN0cnVjdCBzZGV2X3BjbV9zdHJlYW1faW5mbyAqc3RyZWFtID0gc2Rydl9zdHJl YW1fZ2V0KHN1YnN0cmVhbSk7CisJc3RydWN0IHNkZXZfYWxzYV90aW1lcl9pbmZvICpkcGNtID0g JnN0cmVhbS0+dGltZXI7CisKKwlzcGluX2xvY2soJmRwY20tPmxvY2spOworCWRlbF90aW1lcigm ZHBjbS0+dGltZXIpOworCXNwaW5fdW5sb2NrKCZkcGNtLT5sb2NrKTsKKwlyZXR1cm4gMDsKK30K Kworc3RhdGljIGludCBzZHJ2X2Fsc2FfdGltZXJfcHJlcGFyZShzdHJ1Y3Qgc25kX3BjbV9zdWJz dHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0g c3Vic3RyZWFtLT5ydW50aW1lOworCXN0cnVjdCBzZGV2X3BjbV9zdHJlYW1faW5mbyAqc3RyZWFt ID0gc2Rydl9zdHJlYW1fZ2V0KHN1YnN0cmVhbSk7CisJc3RydWN0IHNkZXZfYWxzYV90aW1lcl9p bmZvICpkcGNtID0gJnN0cmVhbS0+dGltZXI7CisKKwlkcGNtLT5mcmFjX3BvcyA9IDA7CisJZHBj bS0+cmF0ZSA9IHJ1bnRpbWUtPnJhdGU7CisJZHBjbS0+ZnJhY19idWZmZXJfc2l6ZSA9IHJ1bnRp bWUtPmJ1ZmZlcl9zaXplICogSFo7CisJZHBjbS0+ZnJhY19wZXJpb2Rfc2l6ZSA9IHJ1bnRpbWUt PnBlcmlvZF9zaXplICogSFo7CisJZHBjbS0+ZnJhY19wZXJpb2RfcmVzdCA9IGRwY20tPmZyYWNf cGVyaW9kX3NpemU7CisJZHBjbS0+ZWxhcHNlZCA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRp YyB2b2lkIHNkcnZfYWxzYV90aW1lcl9jYWxsYmFjayh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJ c3RydWN0IHNkZXZfYWxzYV90aW1lcl9pbmZvICpkcGNtID0gKHN0cnVjdCBzZGV2X2Fsc2FfdGlt ZXJfaW5mbyAqKWRhdGE7CisJaW50IGVsYXBzZWQ7CisKKwlzcGluX2xvY2soJmRwY20tPmxvY2sp OworCXNkcnZfYWxzYV90aW1lcl91cGRhdGUoZHBjbSk7CisJc2Rydl9hbHNhX3RpbWVyX3JlYXJt KGRwY20pOworCWVsYXBzZWQgPSBkcGNtLT5lbGFwc2VkOworCWRwY20tPmVsYXBzZWQgPSAwOwor CXNwaW5fdW5sb2NrKCZkcGNtLT5sb2NrKTsKKwlpZiAoZWxhcHNlZCkKKwkJc25kX3BjbV9wZXJp b2RfZWxhcHNlZChkcGNtLT5zdWJzdHJlYW0pOworfQorCitzdGF0aWMgc25kX3BjbV91ZnJhbWVz X3Qgc2Rydl9hbHNhX3RpbWVyX3BvaW50ZXIoCisJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpz dWJzdHJlYW0pCit7CisJc3RydWN0IHNkZXZfcGNtX3N0cmVhbV9pbmZvICpzdHJlYW0gPSBzZHJ2 X3N0cmVhbV9nZXQoc3Vic3RyZWFtKTsKKwlzdHJ1Y3Qgc2Rldl9hbHNhX3RpbWVyX2luZm8gKmRw Y20gPSAmc3RyZWFtLT50aW1lcjsKKwlzbmRfcGNtX3VmcmFtZXNfdCBwb3M7CisKKwlzcGluX2xv Y2soJmRwY20tPmxvY2spOworCXNkcnZfYWxzYV90aW1lcl91cGRhdGUoZHBjbSk7CisJcG9zID0g ZHBjbS0+ZnJhY19wb3MgLyBIWjsKKwlzcGluX3VubG9jaygmZHBjbS0+bG9jayk7CisJcmV0dXJu IHBvczsKK30KKworc3RhdGljIGludCBzZHJ2X2Fsc2FfdGltZXJfY3JlYXRlKHN0cnVjdCBzbmRf cGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzZGV2X3BjbV9zdHJlYW1faW5m byAqc3RyZWFtID0gc2Rydl9zdHJlYW1fZ2V0KHN1YnN0cmVhbSk7CisJc3RydWN0IHNkZXZfYWxz YV90aW1lcl9pbmZvICpkcGNtID0gJnN0cmVhbS0+dGltZXI7CisKKwlzcGluX2xvY2tfaW5pdCgm ZHBjbS0+bG9jayk7CisJZHBjbS0+c3Vic3RyZWFtID0gc3Vic3RyZWFtOworCXNldHVwX3RpbWVy KCZkcGNtLT50aW1lciwgc2Rydl9hbHNhX3RpbWVyX2NhbGxiYWNrLAorCQkodW5zaWduZWQgbG9u ZykgZHBjbSk7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyB2b2lkIHNkcnZfY29weV9wY21faHco c3RydWN0IHNuZF9wY21faGFyZHdhcmUgKmRzdCwKIAlzdHJ1Y3Qgc25kX3BjbV9oYXJkd2FyZSAq c3JjLAogCXN0cnVjdCBzbmRfcGNtX2hhcmR3YXJlICpyZWZfcGNtX2h3KQotLSAKMi43LjQKCgpf X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpYZW4tZGV2ZWwg bWFpbGluZyBsaXN0Clhlbi1kZXZlbEBsaXN0cy54ZW4ub3JnCmh0dHBzOi8vbGlzdHMueGVuLm9y Zy94ZW4tZGV2ZWwK From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753351AbdHGLx0 (ORCPT ); Mon, 7 Aug 2017 07:53:26 -0400 Received: from mail-lf0-f65.google.com ([209.85.215.65]:36529 "EHLO mail-lf0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753301AbdHGLvF (ORCPT ); Mon, 7 Aug 2017 07:51:05 -0400 From: Oleksandr Andrushchenko To: alsa-devel@alsa-project.org, xen-devel@lists.xen.org, linux-kernel@vger.kernel.org Cc: perex@perex.cz, tiwai@suse.com, andr2000@gmail.com, Oleksandr Andrushchenko Subject: [PATCH RESEND 08/11] ALSA: vsnd: Add timer for period interrupt emulation Date: Mon, 7 Aug 2017 14:50:42 +0300 Message-Id: <1502106645-6731-9-git-send-email-andr2000@gmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1502106645-6731-1-git-send-email-andr2000@gmail.com> References: <1502106645-6731-1-git-send-email-andr2000@gmail.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Oleksandr Andrushchenko Front sound driver has no real interrupts, so playback/capture period passed interrupt needs to be emulated: this is done via timer. Add required timer operations, this is based on sound/drivers/dummy.c. Signed-off-by: Oleksandr Andrushchenko --- sound/drivers/xen-front.c | 121 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 121 insertions(+) diff --git a/sound/drivers/xen-front.c b/sound/drivers/xen-front.c index 9f31e6832086..507c5eb343c8 100644 --- a/sound/drivers/xen-front.c +++ b/sound/drivers/xen-front.c @@ -67,12 +67,29 @@ struct sh_buf_info { size_t vbuffer_sz; }; +struct sdev_alsa_timer_info { + spinlock_t lock; + struct timer_list timer; + unsigned long base_time; + /* fractional sample position (based HZ) */ + unsigned int frac_pos; + unsigned int frac_period_rest; + /* buffer_size * HZ */ + unsigned int frac_buffer_size; + /* period_size * HZ */ + unsigned int frac_period_size; + unsigned int rate; + int elapsed; + struct snd_pcm_substream *substream; +}; + struct sdev_pcm_stream_info { int unique_id; struct snd_pcm_hardware pcm_hw; struct xdrv_evtchnl_info *evt_chnl; bool is_open; uint8_t req_next_id; + struct sdev_alsa_timer_info timer; struct sh_buf_info sh_buf; }; @@ -148,6 +165,110 @@ static struct sdev_pcm_stream_info *sdrv_stream_get( return stream; } +static inline void sdrv_alsa_timer_rearm(struct sdev_alsa_timer_info *dpcm) +{ + mod_timer(&dpcm->timer, jiffies + + (dpcm->frac_period_rest + dpcm->rate - 1) / dpcm->rate); +} + +static void sdrv_alsa_timer_update(struct sdev_alsa_timer_info *dpcm) +{ + unsigned long delta; + + delta = jiffies - dpcm->base_time; + if (!delta) + return; + dpcm->base_time += delta; + delta *= dpcm->rate; + dpcm->frac_pos += delta; + while (dpcm->frac_pos >= dpcm->frac_buffer_size) + dpcm->frac_pos -= dpcm->frac_buffer_size; + while (dpcm->frac_period_rest <= delta) { + dpcm->elapsed++; + dpcm->frac_period_rest += dpcm->frac_period_size; + } + dpcm->frac_period_rest -= delta; +} + +static int sdrv_alsa_timer_start(struct snd_pcm_substream *substream) +{ + struct sdev_pcm_stream_info *stream = sdrv_stream_get(substream); + struct sdev_alsa_timer_info *dpcm = &stream->timer; + + spin_lock(&dpcm->lock); + dpcm->base_time = jiffies; + sdrv_alsa_timer_rearm(dpcm); + spin_unlock(&dpcm->lock); + return 0; +} + +static int sdrv_alsa_timer_stop(struct snd_pcm_substream *substream) +{ + struct sdev_pcm_stream_info *stream = sdrv_stream_get(substream); + struct sdev_alsa_timer_info *dpcm = &stream->timer; + + spin_lock(&dpcm->lock); + del_timer(&dpcm->timer); + spin_unlock(&dpcm->lock); + return 0; +} + +static int sdrv_alsa_timer_prepare(struct snd_pcm_substream *substream) +{ + struct snd_pcm_runtime *runtime = substream->runtime; + struct sdev_pcm_stream_info *stream = sdrv_stream_get(substream); + struct sdev_alsa_timer_info *dpcm = &stream->timer; + + dpcm->frac_pos = 0; + dpcm->rate = runtime->rate; + dpcm->frac_buffer_size = runtime->buffer_size * HZ; + dpcm->frac_period_size = runtime->period_size * HZ; + dpcm->frac_period_rest = dpcm->frac_period_size; + dpcm->elapsed = 0; + return 0; +} + +static void sdrv_alsa_timer_callback(unsigned long data) +{ + struct sdev_alsa_timer_info *dpcm = (struct sdev_alsa_timer_info *)data; + int elapsed; + + spin_lock(&dpcm->lock); + sdrv_alsa_timer_update(dpcm); + sdrv_alsa_timer_rearm(dpcm); + elapsed = dpcm->elapsed; + dpcm->elapsed = 0; + spin_unlock(&dpcm->lock); + if (elapsed) + snd_pcm_period_elapsed(dpcm->substream); +} + +static snd_pcm_uframes_t sdrv_alsa_timer_pointer( + struct snd_pcm_substream *substream) +{ + struct sdev_pcm_stream_info *stream = sdrv_stream_get(substream); + struct sdev_alsa_timer_info *dpcm = &stream->timer; + snd_pcm_uframes_t pos; + + spin_lock(&dpcm->lock); + sdrv_alsa_timer_update(dpcm); + pos = dpcm->frac_pos / HZ; + spin_unlock(&dpcm->lock); + return pos; +} + +static int sdrv_alsa_timer_create(struct snd_pcm_substream *substream) +{ + struct sdev_pcm_stream_info *stream = sdrv_stream_get(substream); + struct sdev_alsa_timer_info *dpcm = &stream->timer; + + spin_lock_init(&dpcm->lock); + dpcm->substream = substream; + setup_timer(&dpcm->timer, sdrv_alsa_timer_callback, + (unsigned long) dpcm); + return 0; +} + static void sdrv_copy_pcm_hw(struct snd_pcm_hardware *dst, struct snd_pcm_hardware *src, struct snd_pcm_hardware *ref_pcm_hw) -- 2.7.4