Module Name:    src
Committed By:   jmcneill
Date:           Tue Sep  2 21:46:35 UTC 2014

Modified Files:
        src/sys/arch/arm/broadcom: bcm2835_vcaudio.c

Log Message:
capture peer version; if less than 2, bail out as bulk mode is not supported. 
report the peer version with "audioctl version"


To generate a diff of this commit:
cvs rdiff -u -r1.5 -r1.6 src/sys/arch/arm/broadcom/bcm2835_vcaudio.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/arm/broadcom/bcm2835_vcaudio.c
diff -u src/sys/arch/arm/broadcom/bcm2835_vcaudio.c:1.5 src/sys/arch/arm/broadcom/bcm2835_vcaudio.c:1.6
--- src/sys/arch/arm/broadcom/bcm2835_vcaudio.c:1.5	Tue Sep  2 10:40:51 2014
+++ src/sys/arch/arm/broadcom/bcm2835_vcaudio.c	Tue Sep  2 21:46:35 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: bcm2835_vcaudio.c,v 1.5 2014/09/02 10:40:51 jmcneill Exp $ */
+/* $NetBSD: bcm2835_vcaudio.c,v 1.6 2014/09/02 21:46:35 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2013 Jared D. McNeill <jmcne...@invisible.ca>
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: bcm2835_vcaudio.c,v 1.5 2014/09/02 10:40:51 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: bcm2835_vcaudio.c,v 1.6 2014/09/02 21:46:35 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/types.h>
@@ -102,6 +102,8 @@ struct vcaudio_softc {
 	VCHI_CONNECTION_T		sc_connection;
 	VCHI_SERVICE_HANDLE_T		sc_service;
 
+	short				sc_peer_version;
+
 	struct workqueue		*sc_wq;
 	struct vcaudio_work		sc_work;
 
@@ -197,11 +199,6 @@ vcaudio_attach(device_t parent, device_t
 	aprint_naive("\n");
 	aprint_normal(": AUDS\n");
 
-	if (vcaudio_init(sc) != 0) {
-		aprint_error_dev(self, "not configured\n");
-		return;
-	}
-
 	vcaudio_rescan(self, NULL, NULL);
 }
 
@@ -209,8 +206,13 @@ static int
 vcaudio_rescan(device_t self, const char *ifattr, const int *locs)
 {
 	struct vcaudio_softc *sc = device_private(self);
+	int error;
 
 	if (ifattr_match(ifattr, "audiobus") && sc->sc_audiodev == NULL) {
+		error = vcaudio_init(sc);
+		if (error)
+			return error;
+
 		sc->sc_audiodev = audio_attach_mi(&vcaudio_hw_if,
 		    sc, sc->sc_dev);
 	}
@@ -285,9 +287,16 @@ vcaudio_init(struct vcaudio_softc *sc)
 		    error);
 		return EIO;
 	}
-	vchi_service_release(sc->sc_service);
 
-	vchi_service_use(sc->sc_service);
+	vchi_get_peer_version(sc->sc_service, &sc->sc_peer_version);
+
+	if (sc->sc_peer_version < 2) {
+		aprint_error_dev(sc->sc_dev,
+		    "peer version (%d) is less than the required version (2)\n",
+		    sc->sc_peer_version);
+		return EINVAL;
+	}
+
 	memset(&msg, 0, sizeof(msg));
 	msg.type = VC_AUDIO_MSG_TYPE_OPEN;
 	error = vchi_msg_queue(sc->sc_service, &msg, sizeof(msg),
@@ -656,9 +665,13 @@ vcaudio_query_devinfo(void *priv, mixer_
 static int
 vcaudio_getdev(void *priv, struct audio_device *audiodev)
 {
+	struct vcaudio_softc *sc = priv;
+
 	snprintf(audiodev->name, sizeof(audiodev->name), "VCHIQ AUDS");
-	snprintf(audiodev->version, sizeof(audiodev->version), "");
+	snprintf(audiodev->version, sizeof(audiodev->version),
+	    "%d", sc->sc_peer_version);
 	snprintf(audiodev->config, sizeof(audiodev->config), "vcaudio");
+
 	return 0;
 }
 

Reply via email to