64#include <sys/kernel.h>
65#include <sys/module.h>
67#include <sys/malloc.h>
70#include <machine/dbdma.h>
71#include <machine/intr_machdep.h>
72#include <machine/resource.h>
73#include <machine/bus.h>
74#include <machine/pio.h>
77#include <dev/iicbus/iicbus.h>
78#include <dev/iicbus/iiconf.h>
79#include <dev/ofw/ofw_bus.h>
81#ifdef HAVE_KERNEL_OPTION_HEADERS
136#define SNAPPER_IICADDR 0x6a
139#define SNAPPER_MCR1 0x01
140#define SNAPPER_DRC 0x02
141#define SNAPPER_VOLUME 0x04
142#define SNAPPER_TREBLE 0x05
143#define SNAPPER_BASS 0x06
144#define SNAPPER_MIXER_L 0x07
145#define SNAPPER_MIXER_R 0x08
146#define SNAPPER_LB0 0x0a
147#define SNAPPER_LB1 0x0b
148#define SNAPPER_LB2 0x0c
149#define SNAPPER_LB3 0x0d
150#define SNAPPER_LB4 0x0e
151#define SNAPPER_LB5 0x0f
152#define SNAPPER_LB6 0x10
153#define SNAPPER_RB0 0x13
154#define SNAPPER_RB1 0x14
155#define SNAPPER_RB2 0x15
156#define SNAPPER_RB3 0x16
157#define SNAPPER_RB4 0x17
158#define SNAPPER_RB5 0x18
159#define SNAPPER_RB6 0x19
160#define SNAPPER_LLB 0x21
161#define SNAPPER_RLB 0x22
162#define SNAPPER_LLB_GAIN 0x23
163#define SNAPPER_RLB_GAIN 0x24
164#define SNAPPER_ACR 0x40
165#define SNAPPER_MCR2 0x43
166#define SNAPPER_MCR1_FL 0x80
167#define SNAPPER_MCR1_SC 0x40
168#define SNAPPER_MCR1_SC_32 0x00
169#define SNAPPER_MCR1_SC_64 0x40
170#define SNAPPER_MCR1_SM 0x30
171#define SNAPPER_MCR1_SM_L 0x00
172#define SNAPPER_MCR1_SM_R 0x10
173#define SNAPPER_MCR1_SM_I2S 0x20
174#define SNAPPER_MCR1_W 0x03
175#define SNAPPER_MCR1_W_16 0x00
176#define SNAPPER_MCR1_W_18 0x01
177#define SNAPPER_MCR1_W_20 0x02
178#define SNAPPER_MCR1_W_24 0x03
179#define SNAPPER_MCR2_DL 0x80
180#define SNAPPER_MCR2_AP 0x02
181#define SNAPPER_ACR_ADM 0x80
182#define SNAPPER_ACR_LRB 0x40
183#define SNAPPER_ACR_DM 0x0c
184#define SNAPPER_ACR_DM_OFF 0x00
185#define SNAPPER_ACR_DM_48 0x04
186#define SNAPPER_ACR_DM_44 0x08
187#define SNAPPER_ACR_INP 0x02
188#define SNAPPER_ACR_INP_A 0x00
189#define SNAPPER_ACR_INP_B 0x02
190#define SNAPPER_ACR_APD 0x01
225 { 1, 0, 0, 0, 0, 0 },
226 { 0, 0, 0, 0, 0, 0 },
229 { 0x10, 0x00, 0x00, 0, 0, 0, 0, 0, 0 },
230 { 0x10, 0x00, 0x00, 0, 0, 0, 0, 0, 0 },
231 { 0x10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
232 { 0x10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
233 { 0x10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
234 { 0x10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
235 { 0x10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
236 { 0x10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
237 { 0x10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
238 { 0x10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
239 { 0x10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
240 { 0x10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
241 { 0x10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
242 { 0x10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
243 { 0x10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
244 { 0x10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
245 { 0x10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
246 { 0x10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
286 0,0,0,0, 0,0,0,0, 0,0,0,
287 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,
296 0x00000148, 0x0000015C, 0x00000171, 0x00000186,
297 0x0000019E, 0x000001B6, 0x000001D0, 0x000001EB,
298 0x00000209, 0x00000227, 0x00000248, 0x0000026B,
299 0x0000028F, 0x000002B6, 0x000002DF, 0x0000030B,
300 0x00000339, 0x0000036A, 0x0000039E, 0x000003D5,
301 0x0000040F, 0x0000044C, 0x0000048D, 0x000004D2,
302 0x0000051C, 0x00000569, 0x000005BB, 0x00000612,
303 0x0000066E, 0x000006D0, 0x00000737, 0x000007A5,
304 0x00000818, 0x00000893, 0x00000915, 0x0000099F,
305 0x00000A31, 0x00000ACC, 0x00000B6F, 0x00000C1D,
306 0x00000CD5, 0x00000D97, 0x00000E65, 0x00000F40,
307 0x00001027, 0x0000111C, 0x00001220, 0x00001333,
308 0x00001456, 0x0000158A, 0x000016D1, 0x0000182B,
309 0x0000199A, 0x00001B1E, 0x00001CB9, 0x00001E6D,
310 0x0000203A, 0x00002223, 0x00002429, 0x0000264E,
311 0x00002893, 0x00002AFA, 0x00002D86, 0x00003039,
312 0x00003314, 0x0000361B, 0x00003950, 0x00003CB5,
313 0x0000404E, 0x0000441D, 0x00004827, 0x00004C6D,
314 0x000050F4, 0x000055C0, 0x00005AD5, 0x00006037,
315 0x000065EA, 0x00006BF4, 0x0000725A, 0x00007920,
316 0x0000804E, 0x000087EF, 0x00008FF6, 0x0000987D,
317 0x0000A186, 0x0000AB19, 0x0000B53C, 0x0000BFF9,
318 0x0000CB59, 0x0000D766, 0x0000E429, 0x0000F1AE,
319 0x00010000, 0x00010F2B, 0x00011F3D, 0x00013042,
320 0x00014249, 0x00015562, 0x0001699C, 0x00017F09
329 struct iic_msg msg[] = {
335 msg[0].len =
size + 1;
339 iicbus_transfer(sc->
sc_dev, msg, 1);
347 const char *
name, *compat;
353 if (strcmp(
name,
"deq") == 0) {
356 }
else if (strcmp(
name,
"codec") == 0) {
357 compat = ofw_bus_get_compat(
dev);
358 if (compat == NULL || strcmp(compat,
"tas3004") != 0)
364 device_set_desc(
dev,
"Texas Instruments TAS3004 Audio Codec");
373 sc = device_get_softc(
dev);
420 x |= SOUND_MASK_VOLUME;
442 struct mtx *mixer_lock;
449 locked = mtx_owned(mixer_lock);
458 case SOUND_MIXER_VOLUME:
459 reg[0] = (l & 0xff0000) >> 16;
460 reg[1] = (l & 0x00ff00) >> 8;
461 reg[2] = l & 0x0000ff;
462 reg[3] = (
r & 0xff0000) >> 16;
463 reg[4] = (
r & 0x00ff00) >> 8;
464 reg[5] =
r & 0x0000ff;
474 mtx_unlock(mixer_lock);
479 mtx_lock(mixer_lock);
struct pcmchan_matrix * m
static int mixer_setrecsrc(struct snd_mixer *mixer, u_int32_t src)
struct mtx * mixer_get_lock(struct snd_mixer *m)
int mixer_init(device_t dev, kobj_class_t cls, void *devinfo)
static int mixer_set(struct snd_mixer *m, u_int dev, u_int32_t muted, u_int lev)
int mixer_uninit(device_t dev)
void mix_setdevs(struct snd_mixer *m, u_int32_t v)
int mixer_reinit(device_t dev)
void * mix_getdevinfo(struct snd_mixer *m)
MODULE_DEPEND(snapper, iicbus, 1, 1, 1)
#define SNAPPER_MCR1_W_16
#define SNAPPER_MCR1_SC_64
static int snapper_init(struct snd_mixer *m)
static const char snapper_regsize[]
static device_method_t snapper_methods[]
#define SNAPPER_MCR1_SM_I2S
static u_int32_t snapper_setrecsrc(struct snd_mixer *m, u_int32_t src)
DRIVER_MODULE(snapper, iicbus, snapper_driver, snapper_devclass, 0, 0)
static int snapper_reinit(struct snd_mixer *m)
MIXER_DECLARE(snapper_mixer)
static kobj_method_t snapper_mixer_methods[]
MODULE_VERSION(snapper, 1)
static u_int snapper_volume_table[100]
static devclass_t snapper_devclass
static int snapper_set(struct snd_mixer *m, unsigned dev, unsigned left, unsigned right)
static int snapper_attach(device_t)
kobj_class_t i2s_mixer_class
static const struct snapper_reg snapper_initdata
static driver_t snapper_driver
static int snapper_uninit(struct snd_mixer *m)
static int snapper_probe(device_t)
#define SNAPPER_ACR_INP_B
static int snapper_write(struct snapper_softc *sc, uint8_t reg, const void *data)