svn commit: r310334 - head/sys/mips/ingenic
Ruslan Bukin
br at FreeBSD.org
Tue Dec 20 18:47:03 UTC 2016
Author: br
Date: Tue Dec 20 18:47:02 2016
New Revision: 310334
URL: https://svnweb.freebsd.org/changeset/base/310334
Log:
o Unmute headphones on Imgtec CI20 board.
o Add some delay between codec initialization procedures.
Sponsored by: DARPA, AFRL
Modified:
head/sys/mips/ingenic/jz4780_codec.c
Modified: head/sys/mips/ingenic/jz4780_codec.c
==============================================================================
--- head/sys/mips/ingenic/jz4780_codec.c Tue Dec 20 18:27:53 2016 (r310333)
+++ head/sys/mips/ingenic/jz4780_codec.c Tue Dec 20 18:47:02 2016 (r310334)
@@ -43,6 +43,7 @@ __FBSDID("$FreeBSD$");
#include <sys/mutex.h>
#include <sys/resource.h>
#include <sys/rman.h>
+#include <sys/gpio.h>
#include <machine/bus.h>
@@ -50,9 +51,14 @@ __FBSDID("$FreeBSD$");
#include <dev/ofw/ofw_bus.h>
#include <dev/ofw/ofw_bus_subr.h>
+#include <dev/gpio/gpiobusvar.h>
+
#include <mips/ingenic/jz4780_common.h>
#include <mips/ingenic/jz4780_codec.h>
+#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
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);
}
More information about the svn-src-head
mailing list