From mboxrd@z Thu Jan 1 00:00:00 1970 From: Oleksandr Andrushchenko Subject: [PATCH RESEND1 07/12] ALSA: vsnd: Introduce ALSA virtual sound driver Date: Mon, 7 Aug 2017 15:22:52 +0300 Message-ID: <1502108577-8099-8-git-send-email-andr2000@gmail.com> References: <1502108577-8099-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: <1502108577-8099-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 YW0uY29tPgoKSW1wbGVtZW50IGVzc2VudGlhbCBpbml0aWFsaXphdGlvbiBvZiB0aGUgc291bmQg ZHJpdmVyOgotIGludHJvZHVjZSByZXF1aXJlZCBkYXRhIHN0cnVjdHVyZXMKLSBoYW5kbGUgZHJp dmVyIHJlZ2lzdHJhdGlvbgotIGhhbmRsZSBzb3VuZCBjYXJkIHJlZ2lzdHJhdGlvbgotIHJlZ2lz dGVyIHNvdW5kIGRyaXZlciBvbiBiYWNrZW5kIGNvbm5lY3Rpb24KLSByZW1vdmUgc291bmQgZHJp dmVyIG9uIGJhY2tlbmQgZGlzY29ubmVjdAoKU2lnbmVkLW9mZi1ieTogT2xla3NhbmRyIEFuZHJ1 c2hjaGVua28gPG9sZWtzYW5kcl9hbmRydXNoY2hlbmtvQGVwYW0uY29tPgotLS0KIHNvdW5kL2Ry aXZlcnMveGVuLWZyb250LmMgfCAxNjEgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrLQogMSBmaWxlIGNoYW5nZWQsIDE1OSBpbnNlcnRpb25zKCspLCAyIGRlbGV0 aW9ucygtKQoKZGlmZiAtLWdpdCBhL3NvdW5kL2RyaXZlcnMveGVuLWZyb250LmMgYi9zb3VuZC9k cml2ZXJzL3hlbi1mcm9udC5jCmluZGV4IDA0ZWJjMTU3NTdmNC4uZjNlM2Y2NGYwYWE2IDEwMDY0 NAotLS0gYS9zb3VuZC9kcml2ZXJzL3hlbi1mcm9udC5jCisrKyBiL3NvdW5kL2RyaXZlcnMveGVu LWZyb250LmMKQEAgLTE5LDEzICsxOSwxNCBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1 bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KIAogI2luY2x1ZGUgPHNv dW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KIAotI2luY2x1ZGUgPHhlbi9wbGF0 Zm9ybV9wY2kuaD4KICNpbmNsdWRlIDx4ZW4vZXZlbnRzLmg+CiAjaW5jbHVkZSA8eGVuL2dyYW50 X3RhYmxlLmg+CisjaW5jbHVkZSA8eGVuL3BsYXRmb3JtX3BjaS5oPgogI2luY2x1ZGUgPHhlbi94 ZW4uaD4KICNpbmNsdWRlIDx4ZW4veGVuYnVzLmg+CiAKQEAgLTY2LDYgKzY3LDMzIEBAIHN0cnVj dCBzaF9idWZfaW5mbyB7CiAJc2l6ZV90IHZidWZmZXJfc3o7CiB9OwogCitzdHJ1Y3Qgc2Rldl9w Y21fc3RyZWFtX2luZm8geworCWludCB1bmlxdWVfaWQ7CisJc3RydWN0IHNuZF9wY21faGFyZHdh cmUgcGNtX2h3OworCXN0cnVjdCB4ZHJ2X2V2dGNobmxfaW5mbyAqZXZ0X2Nobmw7CisJYm9vbCBp c19vcGVuOworCXVpbnQ4X3QgcmVxX25leHRfaWQ7CisJc3RydWN0IHNoX2J1Zl9pbmZvIHNoX2J1 ZjsKK307CisKK3N0cnVjdCBzZGV2X3BjbV9pbnN0YW5jZV9pbmZvIHsKKwlzdHJ1Y3Qgc2Rldl9j YXJkX2luZm8gKmNhcmRfaW5mbzsKKwlzdHJ1Y3Qgc25kX3BjbSAqcGNtOworCXN0cnVjdCBzbmRf cGNtX2hhcmR3YXJlIHBjbV9odzsKKwlpbnQgbnVtX3BjbV9zdHJlYW1zX3BiOworCXN0cnVjdCBz ZGV2X3BjbV9zdHJlYW1faW5mbyAqc3RyZWFtc19wYjsKKwlpbnQgbnVtX3BjbV9zdHJlYW1zX2Nh cDsKKwlzdHJ1Y3Qgc2Rldl9wY21fc3RyZWFtX2luZm8gKnN0cmVhbXNfY2FwOworfTsKKworc3Ry dWN0IHNkZXZfY2FyZF9pbmZvIHsKKwlzdHJ1Y3QgeGRydl9pbmZvICp4ZHJ2X2luZm87CisJc3Ry dWN0IHNuZF9jYXJkICpjYXJkOworCXN0cnVjdCBzbmRfcGNtX2hhcmR3YXJlIHBjbV9odzsKKwlp bnQgbnVtX3BjbV9pbnN0YW5jZXM7CisJc3RydWN0IHNkZXZfcGNtX2luc3RhbmNlX2luZm8gKnBj bV9pbnN0YW5jZXM7Cit9OworCiBzdHJ1Y3QgY2ZnX3N0cmVhbSB7CiAJaW50IHVuaXF1ZV9pZDsK IAljaGFyICp4ZW5zdG9yZV9wYXRoOwpAQCAtOTksNiArMTI3LDggQEAgc3RydWN0IHhkcnZfaW5m byB7CiAJc3RydWN0IHhlbmJ1c19kZXZpY2UgKnhiX2RldjsKIAlzcGlubG9ja190IGlvX2xvY2s7 CiAJc3RydWN0IG11dGV4IG11dGV4OworCWJvb2wgc2Rydl9yZWdpc3RlcmVkOworCXN0cnVjdCBw bGF0Zm9ybV9kZXZpY2UgKnNkcnZfcGRldjsKIAlpbnQgbnVtX2V2dF9jaGFubmVsczsKIAlzdHJ1 Y3QgeGRydl9ldnRjaG5sX2luZm8gKmV2dF9jaG5sczsKIAlzdHJ1Y3Qgc2Rldl9jYXJkX3BsYXRf ZGF0YSBjZmdfcGxhdF9kYXRhOwpAQCAtMTM4LDYgKzE2OCwxMzIgQEAgc3RhdGljIHN0cnVjdCBz bmRfcGNtX2hhcmR3YXJlIHNkcnZfcGNtX2h3X2RlZmF1bHQgPSB7CiAJLmZpZm9fc2l6ZSA9IDAs CiB9OwogCitzdGF0aWMgaW50IHNkcnZfbmV3X3BjbShzdHJ1Y3Qgc2Rldl9jYXJkX2luZm8gKmNh cmRfaW5mbywKKwlzdHJ1Y3QgY2ZnX3BjbV9pbnN0YW5jZSAqaW5zdGFuY2VfY29uZmlnLAorCXN0 cnVjdCBzZGV2X3BjbV9pbnN0YW5jZV9pbmZvICpwY21faW5zdGFuY2VfaW5mbykKK3sKKwlyZXR1 cm4gMDsKK30KKworc3RhdGljIGludCBzZHJ2X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ug KnBkZXYpCit7CisJc3RydWN0IHNkZXZfY2FyZF9pbmZvICpjYXJkX2luZm87CisJc3RydWN0IHNk ZXZfY2FyZF9wbGF0X2RhdGEgKnBsYXRkYXRhOworCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKKwlp bnQgcmV0LCBpOworCisJcGxhdGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKCZwZGV2LT5kZXYpOwor CisJZGV2X2RiZygmcGRldi0+ZGV2LCAiQ3JlYXRpbmcgdmlydHVhbCBzb3VuZCBjYXJkXG4iKTsK KworCXJldCA9IHNuZF9jYXJkX25ldygmcGRldi0+ZGV2LCAwLCBYRU5TTkRfRFJJVkVSX05BTUUs IFRISVNfTU9EVUxFLAorCQlzaXplb2Yoc3RydWN0IHNkZXZfY2FyZF9pbmZvKSwgJmNhcmQpOwor CWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJY2FyZF9pbmZvID0gY2FyZC0+cHJpdmF0 ZV9kYXRhOworCWNhcmRfaW5mby0+eGRydl9pbmZvID0gcGxhdGRhdGEtPnhkcnZfaW5mbzsKKwlj YXJkX2luZm8tPmNhcmQgPSBjYXJkOworCWNhcmRfaW5mby0+cGNtX2luc3RhbmNlcyA9IGRldm1f a2NhbGxvYygmcGRldi0+ZGV2LAorCQkJcGxhdGRhdGEtPmNmZ19jYXJkLm51bV9wY21faW5zdGFu Y2VzLAorCQkJc2l6ZW9mKHN0cnVjdCBzZGV2X3BjbV9pbnN0YW5jZV9pbmZvKSwgR0ZQX0tFUk5F TCk7CisJaWYgKCFjYXJkX2luZm8tPnBjbV9pbnN0YW5jZXMpIHsKKwkJcmV0ID0gLUVOT01FTTsK KwkJZ290byBmYWlsOworCX0KKworCWNhcmRfaW5mby0+bnVtX3BjbV9pbnN0YW5jZXMgPSBwbGF0 ZGF0YS0+Y2ZnX2NhcmQubnVtX3BjbV9pbnN0YW5jZXM7CisJY2FyZF9pbmZvLT5wY21faHcgPSBw bGF0ZGF0YS0+Y2ZnX2NhcmQucGNtX2h3OworCisJZm9yIChpID0gMDsgaSA8IHBsYXRkYXRhLT5j ZmdfY2FyZC5udW1fcGNtX2luc3RhbmNlczsgaSsrKSB7CisJCXJldCA9IHNkcnZfbmV3X3BjbShj YXJkX2luZm8sCisJCQkmcGxhdGRhdGEtPmNmZ19jYXJkLnBjbV9pbnN0YW5jZXNbaV0sCisJCQkm Y2FyZF9pbmZvLT5wY21faW5zdGFuY2VzW2ldKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIGZh aWw7CisJfQorCisJc3RybmNweShjYXJkLT5kcml2ZXIsIFhFTlNORF9EUklWRVJfTkFNRSwgc2l6 ZW9mKGNhcmQtPmRyaXZlcikpOworCXN0cm5jcHkoY2FyZC0+c2hvcnRuYW1lLCBwbGF0ZGF0YS0+ Y2ZnX2NhcmQubmFtZV9zaG9ydCwKKwkJc2l6ZW9mKGNhcmQtPnNob3J0bmFtZSkpOworCXN0cm5j cHkoY2FyZC0+bG9uZ25hbWUsIHBsYXRkYXRhLT5jZmdfY2FyZC5uYW1lX2xvbmcsCisJCXNpemVv ZihjYXJkLT5sb25nbmFtZSkpOworCisJcmV0ID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCk7CisJ aWYgKHJldCA8IDApCisJCWdvdG8gZmFpbDsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYs IGNhcmQpOworCXJldHVybiAwOworCitmYWlsOgorCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CisJcmV0 dXJuIHJldDsKK30KKworc3RhdGljIGludCBzZHJ2X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2 aWNlICpwZGV2KQoreworCXN0cnVjdCBzZGV2X2NhcmRfaW5mbyAqaW5mbzsKKwlzdHJ1Y3Qgc25k X2NhcmQgKmNhcmQgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWluZm8gPSBjYXJk LT5wcml2YXRlX2RhdGE7CisJZGV2X2RiZygmcGRldi0+ZGV2LCAiUmVtb3ZpbmcgdmlydHVhbCBz b3VuZCBjYXJkICVkXG4iLAorCQlpbmZvLT5jYXJkLT5udW1iZXIpOworCXNuZF9jYXJkX2ZyZWUo Y2FyZCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHNk cnZfaW5mbyA9IHsKKwkucHJvYmUJPSBzZHJ2X3Byb2JlLAorCS5yZW1vdmUJPSBzZHJ2X3JlbW92 ZSwKKwkuZHJpdmVyCT0geworCQkubmFtZQk9IFhFTlNORF9EUklWRVJfTkFNRSwKKwl9LAorfTsK Kworc3RhdGljIHZvaWQgc2Rydl9jbGVhbnVwKHN0cnVjdCB4ZHJ2X2luZm8gKmRydl9pbmZvKQor eworCWlmICghZHJ2X2luZm8tPnNkcnZfcmVnaXN0ZXJlZCkKKwkJcmV0dXJuOworCisJaWYgKGRy dl9pbmZvLT5zZHJ2X3BkZXYpIHsKKwkJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc2Rydl9wZGV2 OworCisJCXNkcnZfcGRldiA9IGRydl9pbmZvLT5zZHJ2X3BkZXY7CisJCWlmIChzZHJ2X3BkZXYp CisJCQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihzZHJ2X3BkZXYpOworCX0KKwlwbGF0Zm9y bV9kcml2ZXJfdW5yZWdpc3Rlcigmc2Rydl9pbmZvKTsKKwlkcnZfaW5mby0+c2Rydl9yZWdpc3Rl cmVkID0gZmFsc2U7Cit9CisKK3N0YXRpYyBpbnQgc2Rydl9pbml0KHN0cnVjdCB4ZHJ2X2luZm8g KmRydl9pbmZvKQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnNkcnZfcGRldjsKKwlpbnQg cmV0OworCisJcmV0ID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZzZHJ2X2luZm8pOworCWlm IChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJZHJ2X2luZm8tPnNkcnZfcmVnaXN0ZXJlZCA9 IHRydWU7CisJLyogcGFzcyBjYXJkIGNvbmZpZ3VyYXRpb24gdmlhIHBsYXRmb3JtIGRhdGEgKi8K KwlzZHJ2X3BkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfZGF0YShOVUxMLAorCQlYRU5T TkRfRFJJVkVSX05BTUUsIDAsICZkcnZfaW5mby0+Y2ZnX3BsYXRfZGF0YSwKKwkJc2l6ZW9mKGRy dl9pbmZvLT5jZmdfcGxhdF9kYXRhKSk7CisJaWYgKElTX0VSUihzZHJ2X3BkZXYpKQorCQlnb3Rv IGZhaWw7CisKKwlkcnZfaW5mby0+c2Rydl9wZGV2ID0gc2Rydl9wZGV2OworCXJldHVybiAwOwor CitmYWlsOgorCWRldl9lcnIoJmRydl9pbmZvLT54Yl9kZXYtPmRldiwKKwkJImZhaWxlZCB0byBy ZWdpc3RlciB2aXJ0dWFsIHNvdW5kIGRyaXZlclxuIik7CisJc2Rydl9jbGVhbnVwKGRydl9pbmZv KTsKKwlyZXR1cm4gLUVOT0RFVjsKK30KKwogc3RhdGljIGlycXJldHVybl90IHhkcnZfZXZ0Y2hu bF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQogewogCXN0cnVjdCB4ZHJ2X2V2dGNo bmxfaW5mbyAqY2hhbm5lbCA9IGRldl9pZDsKQEAgLTgzMCw2ICs5ODYsNyBAQCBzdGF0aWMgaW50 IGNmZ19jYXJkKHN0cnVjdCB4ZHJ2X2luZm8gKmRydl9pbmZvLAogCiBzdGF0aWMgdm9pZCB4ZHJ2 X3JlbW92ZV9pbnRlcm5hbChzdHJ1Y3QgeGRydl9pbmZvICpkcnZfaW5mbykKIHsKKwlzZHJ2X2Ns ZWFudXAoZHJ2X2luZm8pOwogCXhkcnZfZXZ0Y2hubF9mcmVlX2FsbChkcnZfaW5mbyk7CiB9CiAK QEAgLTEwMTgsNyArMTE3NSw3IEBAIHN0YXRpYyBpbnQgeGRydl9iZV9vbl9pbml0d2FpdChzdHJ1 Y3QgeGRydl9pbmZvICpkcnZfaW5mbykKIAogc3RhdGljIGlubGluZSBpbnQgeGRydl9iZV9vbl9j b25uZWN0ZWQoc3RydWN0IHhkcnZfaW5mbyAqZHJ2X2luZm8pCiB7Ci0JcmV0dXJuIDA7CisJcmV0 dXJuIHNkcnZfaW5pdChkcnZfaW5mbyk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCB4ZHJ2X2Jl X29uX2Rpc2Nvbm5lY3RlZChzdHJ1Y3QgeGRydl9pbmZvICpkcnZfaW5mbykKLS0gCjIuNy40CgoK X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KWGVuLWRldmVs IG1haWxpbmcgbGlzdApYZW4tZGV2ZWxAbGlzdHMueGVuLm9yZwpodHRwczovL2xpc3RzLnhlbi5v cmcveGVuLWRldmVsCg== From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753361AbdHGMZb (ORCPT ); Mon, 7 Aug 2017 08:25:31 -0400 Received: from mail-lf0-f65.google.com ([209.85.215.65]:32795 "EHLO mail-lf0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753297AbdHGMXM (ORCPT ); Mon, 7 Aug 2017 08:23:12 -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 RESEND1 07/12] ALSA: vsnd: Introduce ALSA virtual sound driver Date: Mon, 7 Aug 2017 15:22:52 +0300 Message-Id: <1502108577-8099-8-git-send-email-andr2000@gmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1502108577-8099-1-git-send-email-andr2000@gmail.com> References: <1502108577-8099-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 Implement essential initialization of the sound driver: - introduce required data structures - handle driver registration - handle sound card registration - register sound driver on backend connection - remove sound driver on backend disconnect Signed-off-by: Oleksandr Andrushchenko --- sound/drivers/xen-front.c | 161 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 159 insertions(+), 2 deletions(-) diff --git a/sound/drivers/xen-front.c b/sound/drivers/xen-front.c index 04ebc15757f4..f3e3f64f0aa6 100644 --- a/sound/drivers/xen-front.c +++ b/sound/drivers/xen-front.c @@ -19,13 +19,14 @@ */ #include +#include #include #include -#include #include #include +#include #include #include @@ -66,6 +67,33 @@ struct sh_buf_info { size_t vbuffer_sz; }; +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 sh_buf_info sh_buf; +}; + +struct sdev_pcm_instance_info { + struct sdev_card_info *card_info; + struct snd_pcm *pcm; + struct snd_pcm_hardware pcm_hw; + int num_pcm_streams_pb; + struct sdev_pcm_stream_info *streams_pb; + int num_pcm_streams_cap; + struct sdev_pcm_stream_info *streams_cap; +}; + +struct sdev_card_info { + struct xdrv_info *xdrv_info; + struct snd_card *card; + struct snd_pcm_hardware pcm_hw; + int num_pcm_instances; + struct sdev_pcm_instance_info *pcm_instances; +}; + struct cfg_stream { int unique_id; char *xenstore_path; @@ -99,6 +127,8 @@ struct xdrv_info { struct xenbus_device *xb_dev; spinlock_t io_lock; struct mutex mutex; + bool sdrv_registered; + struct platform_device *sdrv_pdev; int num_evt_channels; struct xdrv_evtchnl_info *evt_chnls; struct sdev_card_plat_data cfg_plat_data; @@ -138,6 +168,132 @@ static struct snd_pcm_hardware sdrv_pcm_hw_default = { .fifo_size = 0, }; +static int sdrv_new_pcm(struct sdev_card_info *card_info, + struct cfg_pcm_instance *instance_config, + struct sdev_pcm_instance_info *pcm_instance_info) +{ + return 0; +} + +static int sdrv_probe(struct platform_device *pdev) +{ + struct sdev_card_info *card_info; + struct sdev_card_plat_data *platdata; + struct snd_card *card; + int ret, i; + + platdata = dev_get_platdata(&pdev->dev); + + dev_dbg(&pdev->dev, "Creating virtual sound card\n"); + + ret = snd_card_new(&pdev->dev, 0, XENSND_DRIVER_NAME, THIS_MODULE, + sizeof(struct sdev_card_info), &card); + if (ret < 0) + return ret; + + card_info = card->private_data; + card_info->xdrv_info = platdata->xdrv_info; + card_info->card = card; + card_info->pcm_instances = devm_kcalloc(&pdev->dev, + platdata->cfg_card.num_pcm_instances, + sizeof(struct sdev_pcm_instance_info), GFP_KERNEL); + if (!card_info->pcm_instances) { + ret = -ENOMEM; + goto fail; + } + + card_info->num_pcm_instances = platdata->cfg_card.num_pcm_instances; + card_info->pcm_hw = platdata->cfg_card.pcm_hw; + + for (i = 0; i < platdata->cfg_card.num_pcm_instances; i++) { + ret = sdrv_new_pcm(card_info, + &platdata->cfg_card.pcm_instances[i], + &card_info->pcm_instances[i]); + if (ret < 0) + goto fail; + } + + strncpy(card->driver, XENSND_DRIVER_NAME, sizeof(card->driver)); + strncpy(card->shortname, platdata->cfg_card.name_short, + sizeof(card->shortname)); + strncpy(card->longname, platdata->cfg_card.name_long, + sizeof(card->longname)); + + ret = snd_card_register(card); + if (ret < 0) + goto fail; + + platform_set_drvdata(pdev, card); + return 0; + +fail: + snd_card_free(card); + return ret; +} + +static int sdrv_remove(struct platform_device *pdev) +{ + struct sdev_card_info *info; + struct snd_card *card = platform_get_drvdata(pdev); + + info = card->private_data; + dev_dbg(&pdev->dev, "Removing virtual sound card %d\n", + info->card->number); + snd_card_free(card); + return 0; +} + +static struct platform_driver sdrv_info = { + .probe = sdrv_probe, + .remove = sdrv_remove, + .driver = { + .name = XENSND_DRIVER_NAME, + }, +}; + +static void sdrv_cleanup(struct xdrv_info *drv_info) +{ + if (!drv_info->sdrv_registered) + return; + + if (drv_info->sdrv_pdev) { + struct platform_device *sdrv_pdev; + + sdrv_pdev = drv_info->sdrv_pdev; + if (sdrv_pdev) + platform_device_unregister(sdrv_pdev); + } + platform_driver_unregister(&sdrv_info); + drv_info->sdrv_registered = false; +} + +static int sdrv_init(struct xdrv_info *drv_info) +{ + struct platform_device *sdrv_pdev; + int ret; + + ret = platform_driver_register(&sdrv_info); + if (ret < 0) + return ret; + + drv_info->sdrv_registered = true; + /* pass card configuration via platform data */ + sdrv_pdev = platform_device_register_data(NULL, + XENSND_DRIVER_NAME, 0, &drv_info->cfg_plat_data, + sizeof(drv_info->cfg_plat_data)); + if (IS_ERR(sdrv_pdev)) + goto fail; + + drv_info->sdrv_pdev = sdrv_pdev; + return 0; + +fail: + dev_err(&drv_info->xb_dev->dev, + "failed to register virtual sound driver\n"); + sdrv_cleanup(drv_info); + return -ENODEV; +} + static irqreturn_t xdrv_evtchnl_interrupt(int irq, void *dev_id) { struct xdrv_evtchnl_info *channel = dev_id; @@ -830,6 +986,7 @@ static int cfg_card(struct xdrv_info *drv_info, static void xdrv_remove_internal(struct xdrv_info *drv_info) { + sdrv_cleanup(drv_info); xdrv_evtchnl_free_all(drv_info); } @@ -1018,7 +1175,7 @@ static int xdrv_be_on_initwait(struct xdrv_info *drv_info) static inline int xdrv_be_on_connected(struct xdrv_info *drv_info) { - return 0; + return sdrv_init(drv_info); } static inline void xdrv_be_on_disconnected(struct xdrv_info *drv_info) -- 2.7.4