From 46ac5f081daf5344afeaa10dac84bd3a0bc1c7ab Mon Sep 17 00:00:00 2001
From: Ruslan Bukin
Date: Tue, 20 Dec 2016 18:47:02 +0000
Subject: [PATCH] o Unmute headphones on Imgtec CI20 board. o Add some delay
between codec initialization procedures.
Sponsored by: DARPA, AFRL
---
sys/mips/ingenic/jz4780_codec.c | 53 ++++++++++++++++++++++++++++++++-
1 file changed, 52 insertions(+), 1 deletion(-)
diff --git a/sys/mips/ingenic/jz4780_codec.c b/sys/mips/ingenic/jz4780_codec.c
index 132d45fafd5..0a6b82b9d17 100644
--- a/sys/mips/ingenic/jz4780_codec.c
+++ b/sys/mips/ingenic/jz4780_codec.c
@@ -43,6 +43,7 @@ __FBSDID("$FreeBSD$");
#include
#include
#include
+#include
#include
@@ -50,9 +51,14 @@ __FBSDID("$FreeBSD$");
#include
#include
+#include
+
#include
#include
+#define CI20_HP_PIN 13
+#define CI20_HP_PORT 3
+
struct codec_softc {
device_t dev;
struct resource *res[1];
@@ -149,6 +155,41 @@ codec_print_registers(struct codec_softc *sc)
printf("codec DR_ADC_AGC %x\n", codec_read(sc, DR_ADC_AGC));
}
+/*
+ * CI20 board-specific
+ */
+static int
+ci20_hp_unmute(struct codec_softc *sc)
+{
+ device_t dev;
+ int port;
+ int err;
+ int pin;
+
+ pin = CI20_HP_PIN;
+ port = CI20_HP_PORT;
+
+ dev = devclass_get_device(devclass_find("gpio"), port);
+ if (dev == NULL)
+ return (0);
+
+ err = GPIO_PIN_SETFLAGS(dev, pin, GPIO_PIN_OUTPUT);
+ if (err != 0) {
+ device_printf(dev, "Cannot configure GPIO pin %d on %s\n",
+ pin, device_get_nameunit(dev));
+ return (err);
+ }
+
+ err = GPIO_PIN_SET(dev, pin, 0);
+ if (err != 0) {
+ device_printf(dev, "Cannot configure GPIO pin %d on %s\n",
+ pin, device_get_nameunit(dev));
+ return (err);
+ }
+
+ return (0);
+}
+
static int
codec_probe(device_t dev)
{
@@ -187,10 +228,14 @@ codec_attach(device_t dev)
reg &= ~(VIC_SB_SLEEP | VIC_SB);
codec_write(sc, CR_VIC, reg);
+ DELAY(20000);
+
reg = codec_read(sc, CR_DAC);
reg &= ~(DAC_SB | DAC_MUTE);
codec_write(sc, CR_DAC, reg);
+ DELAY(10000);
+
/* I2S, 16-bit, 96 kHz. */
reg = codec_read(sc, AICR_DAC);
reg &= ~(AICR_DAC_SB | DAC_ADWL_M);
@@ -199,13 +244,19 @@ codec_attach(device_t dev)
reg |= AUDIOIF_I2S;
codec_write(sc, AICR_DAC, reg);
+ DELAY(10000);
+
reg = FCR_DAC_96;
codec_write(sc, FCR_DAC, reg);
+ DELAY(10000);
+
/* Unmute headphones. */
reg = codec_read(sc, CR_HP);
reg &= ~(HP_SB | HP_MUTE);
- codec_write(sc, CR_HP, 0);
+ codec_write(sc, CR_HP, reg);
+
+ ci20_hp_unmute(sc);
return (0);
}