Module Name: src
Committed By: jmcneill
Date: Mon Nov 17 01:38:00 UTC 2014
Modified Files:
src/sys/arch/arm/allwinner: awin_hdmi.c awin_hdmiaudio.c awin_var.h
Log Message:
report hotplug status for AUDIO_GETDEV fields, only allow playback if a capable
display is connected
To generate a diff of this commit:
cvs rdiff -u -r1.13 -r1.14 src/sys/arch/arm/allwinner/awin_hdmi.c
cvs rdiff -u -r1.3 -r1.4 src/sys/arch/arm/allwinner/awin_hdmiaudio.c
cvs rdiff -u -r1.24 -r1.25 src/sys/arch/arm/allwinner/awin_var.h
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/allwinner/awin_hdmi.c
diff -u src/sys/arch/arm/allwinner/awin_hdmi.c:1.13 src/sys/arch/arm/allwinner/awin_hdmi.c:1.14
--- src/sys/arch/arm/allwinner/awin_hdmi.c:1.13 Mon Nov 17 00:49:32 2014
+++ src/sys/arch/arm/allwinner/awin_hdmi.c Mon Nov 17 01:38:00 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: awin_hdmi.c,v 1.13 2014/11/17 00:49:32 jmcneill Exp $ */
+/* $NetBSD: awin_hdmi.c,v 1.14 2014/11/17 01:38:00 jmcneill Exp $ */
/*-
* Copyright (c) 2014 Jared D. McNeill <[email protected]>
@@ -32,7 +32,7 @@
#define AWIN_HDMI_PLL 3 /* PLL7 or PLL3 */
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: awin_hdmi.c,v 1.13 2014/11/17 00:49:32 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: awin_hdmi.c,v 1.14 2014/11/17 01:38:00 jmcneill Exp $");
#include <sys/param.h>
#include <sys/bus.h>
@@ -64,8 +64,11 @@ struct awin_hdmi_softc {
kmutex_t sc_ic_lock;
bool sc_connected;
+ char sc_display_vendor[16];
+ char sc_display_product[16];
u_int sc_display_mode;
+ u_int sc_current_display_mode;
#define DISPLAY_MODE_AUTO 0
#define DISPLAY_MODE_HDMI 1
#define DISPLAY_MODE_DVI 2
@@ -522,6 +525,12 @@ awin_hdmi_read_edid(struct awin_hdmi_sof
device_printf(sc->sc_dev, "%s mode (%s)\n",
display_mode == DISPLAY_MODE_HDMI ? "HDMI" : "DVI", forced);
+ strlcpy(sc->sc_display_vendor, ei.edid_vendorname,
+ sizeof(sc->sc_display_vendor));
+ strlcpy(sc->sc_display_product, ei.edid_productname,
+ sizeof(sc->sc_display_product));
+ sc->sc_current_display_mode = display_mode;
+
mode = ei.edid_preferred_mode;
if (mode == NULL)
mode = pick_mode_by_ref(640, 480, 60);
@@ -868,7 +877,6 @@ awin_hdmi_hpd(struct awin_hdmi_softc *sc
if (sc->sc_connected == con)
return;
- sc->sc_connected = con;
if (con) {
device_printf(sc->sc_dev, "display connected\n");
awin_hdmi_read_edid(sc);
@@ -876,6 +884,8 @@ awin_hdmi_hpd(struct awin_hdmi_softc *sc
device_printf(sc->sc_dev, "display disconnected\n");
awin_tcon_set_videomode(NULL);
}
+
+ sc->sc_connected = con;
}
static void
@@ -908,6 +918,32 @@ awin_hdmi_intr(void *priv)
}
#endif
+void
+awin_hdmi_get_info(struct awin_hdmi_info *info)
+{
+ struct awin_hdmi_softc *sc;
+ device_t dev;
+
+ memset(info, 0, sizeof(*info));
+
+ dev = device_find_by_driver_unit("awinhdmi", 0);
+ if (dev == NULL) {
+ info->display_connected = false;
+ return;
+ }
+ sc = device_private(dev);
+
+ info->display_connected = sc->sc_connected;
+ if (info->display_connected) {
+ strlcpy(info->display_vendor, sc->sc_display_vendor,
+ sizeof(info->display_vendor));
+ strlcpy(info->display_product, sc->sc_display_product,
+ sizeof(info->display_product));
+ info->display_hdmimode =
+ sc->sc_current_display_mode == DISPLAY_MODE_HDMI;
+ }
+}
+
#if defined(DDB)
void
awin_hdmi_dump_regs(void)
Index: src/sys/arch/arm/allwinner/awin_hdmiaudio.c
diff -u src/sys/arch/arm/allwinner/awin_hdmiaudio.c:1.3 src/sys/arch/arm/allwinner/awin_hdmiaudio.c:1.4
--- src/sys/arch/arm/allwinner/awin_hdmiaudio.c:1.3 Wed Nov 12 17:38:14 2014
+++ src/sys/arch/arm/allwinner/awin_hdmiaudio.c Mon Nov 17 01:38:00 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: awin_hdmiaudio.c,v 1.3 2014/11/12 17:38:14 jmcneill Exp $ */
+/* $NetBSD: awin_hdmiaudio.c,v 1.4 2014/11/17 01:38:00 jmcneill Exp $ */
/*-
* Copyright (c) 2014 Jared D. McNeill <[email protected]>
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: awin_hdmiaudio.c,v 1.3 2014/11/12 17:38:14 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: awin_hdmiaudio.c,v 1.4 2014/11/17 01:38:00 jmcneill Exp $");
#include <sys/param.h>
#include <sys/bus.h>
@@ -538,14 +538,35 @@ static int
awin_hdmiaudio_getdev(void *priv, struct audio_device *audiodev)
{
struct awin_hdmiaudio_softc *sc = priv;
+ struct awin_hdmi_info info;
+ const char *vendor = NULL, *product = NULL;
const int vmaj = __SHIFTOUT(sc->sc_ver, AWIN_HDMI_VERSION_ID_H);
const int vmin = __SHIFTOUT(sc->sc_ver, AWIN_HDMI_VERSION_ID_L);
- snprintf(audiodev->name, sizeof(audiodev->name), "Allwinner");
- snprintf(audiodev->version, sizeof(audiodev->version),
+ awin_hdmi_get_info(&info);
+
+ if (info.display_connected && info.display_hdmimode) {
+ if (strlen(info.display_vendor) > 0 &&
+ strlen(info.display_product) > 0) {
+ vendor = info.display_vendor;
+ product = info.display_product;
+ } else {
+ vendor = "HDMI";
+ product = "";
+ }
+ } else if (info.display_connected) {
+ vendor = "DVI";
+ product = "(unsupported)";
+ } else {
+ vendor = "HDMI";
+ product = "(disconnected)";
+ }
+
+ strlcpy(audiodev->name, vendor, sizeof(audiodev->name));
+ strlcpy(audiodev->version, product, sizeof(audiodev->version));
+ snprintf(audiodev->config, sizeof(audiodev->config),
"HDMI %d.%d", vmaj, vmin);
- snprintf(audiodev->config, sizeof(audiodev->config), "awin_hdmiaudio");
return 0;
}
@@ -574,11 +595,16 @@ awin_hdmiaudio_trigger_output(void *priv
{
struct awin_hdmiaudio_softc *sc = priv;
struct awin_hdmiaudio_dma *dma;
+ struct awin_hdmi_info info;
bus_addr_t pstart;
bus_size_t psize;
uint32_t dmacfg;
int error;
+ awin_hdmi_get_info(&info);
+ if (info.display_connected == false || info.display_hdmimode == false)
+ return ENXIO;
+
pstart = 0;
psize = (uintptr_t)end - (uintptr_t)start;
Index: src/sys/arch/arm/allwinner/awin_var.h
diff -u src/sys/arch/arm/allwinner/awin_var.h:1.24 src/sys/arch/arm/allwinner/awin_var.h:1.25
--- src/sys/arch/arm/allwinner/awin_var.h:1.24 Fri Nov 14 23:45:02 2014
+++ src/sys/arch/arm/allwinner/awin_var.h Mon Nov 17 01:38:00 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: awin_var.h,v 1.24 2014/11/14 23:45:02 jmcneill Exp $ */
+/* $NetBSD: awin_var.h,v 1.25 2014/11/17 01:38:00 jmcneill Exp $ */
/*-
* Copyright (c) 2013 The NetBSD Foundation, Inc.
* All rights reserved.
@@ -132,6 +132,15 @@ void awin_tcon_enable(bool);
void awin_debe_set_videomode(const struct videomode *);
void awin_debe_enable(bool);
int awin_debe_ioctl(device_t, u_long, void *);
+
+struct awin_hdmi_info {
+ bool display_connected;
+ char display_vendor[16];
+ char display_product[16];
+ bool display_hdmimode;
+};
+void awin_hdmi_get_info(struct awin_hdmi_info *);
+
void awin_fb_set_videomode(device_t, u_int, u_int);
void awin_fb_ddb_trap_callback(int);