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 TUMBLER_IICADDR 0x68
139#define TUMBLER_MCR 0x01
140#define TUMBLER_DRC 0x02
141#define TUMBLER_VOLUME 0x04
142#define TUMBLER_TREBLE 0x05
143#define TUMBLER_BASS 0x06
144#define TUMBLER_MIXER1 0x07
145#define TUMBLER_MIXER2 0x08
146#define TUMBLER_LB0 0x0a
147#define TUMBLER_LB1 0x0b
148#define TUMBLER_LB2 0x0c
149#define TUMBLER_LB3 0x0d
150#define TUMBLER_LB4 0x0e
151#define TUMBLER_LB5 0x0f
152#define TUMBLER_RB0 0x13
153#define TUMBLER_RB1 0x14
154#define TUMBLER_RB2 0x15
155#define TUMBLER_RB3 0x16
156#define TUMBLER_RB4 0x17
157#define TUMBLER_RB5 0x18
158#define TUMBLER_MCR_FL 0x80
159#define TUMBLER_MCR_SC 0x40
160#define TUMBLER_MCR_SC_32 0x00
161#define TUMBLER_MCR_SC_64 0x40
162#define TUMBLER_MCR_SM 0x30
163#define TUMBLER_MCR_SM_L 0x00
164#define TUMBLER_MCR_SM_R 0x10
165#define TUMBLER_MCR_SM_I2S 0x20
166#define TUMBLER_MCR_ISM 0x0C
167#define TUMBLER_MCR_ISM_L 0x00
168#define TUMBLER_MCR_ISM_R 0x04
169#define TUMBLER_MCR_ISM_I2S 0x08
170#define TUMBLER_MCR_W 0x03
171#define TUMBLER_MCR_W_16 0x00
172#define TUMBLER_MCR_W_18 0x01
173#define TUMBLER_MCR_W_20 0x02
174#define TUMBLER_DRC_COMP_31 0xc0
175#define TUMBLER_DRC_ENABLE 0x01
176#define TUMBLER_DRC_DEFL_TH 0xa0
208 { 0, 0, 0, 0, 0, 0 },
211 { 0x10, 0x00, 0x00 },
212 { 0x00, 0x00, 0x00 },
213 { 0x10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
214 { 0x10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
215 { 0x10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
216 { 0x10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
217 { 0x10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
218 { 0x10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
219 { 0x10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
220 { 0x10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
221 { 0x10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
222 { 0x10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
223 { 0x10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
224 { 0x10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
257 0x00000148, 0x0000015C, 0x00000171, 0x00000186,
258 0x0000019E, 0x000001B6, 0x000001D0, 0x000001EB,
259 0x00000209, 0x00000227, 0x00000248, 0x0000026B,
260 0x0000028F, 0x000002B6, 0x000002DF, 0x0000030B,
261 0x00000339, 0x0000036A, 0x0000039E, 0x000003D5,
262 0x0000040F, 0x0000044C, 0x0000048D, 0x000004D2,
263 0x0000051C, 0x00000569, 0x000005BB, 0x00000612,
264 0x0000066E, 0x000006D0, 0x00000737, 0x000007A5,
265 0x00000818, 0x00000893, 0x00000915, 0x0000099F,
266 0x00000A31, 0x00000ACC, 0x00000B6F, 0x00000C1D,
267 0x00000CD5, 0x00000D97, 0x00000E65, 0x00000F40,
268 0x00001027, 0x0000111C, 0x00001220, 0x00001333,
269 0x00001456, 0x0000158A, 0x000016D1, 0x0000182B,
270 0x0000199A, 0x00001B1E, 0x00001CB9, 0x00001E6D,
271 0x0000203A, 0x00002223, 0x00002429, 0x0000264E,
272 0x00002893, 0x00002AFA, 0x00002D86, 0x00003039,
273 0x00003314, 0x0000361B, 0x00003950, 0x00003CB5,
274 0x0000404E, 0x0000441D, 0x00004827, 0x00004C6D,
275 0x000050F4, 0x000055C0, 0x00005AD5, 0x00006037,
276 0x000065EA, 0x00006BF4, 0x0000725A, 0x00007920,
277 0x0000804E, 0x000087EF, 0x00008FF6, 0x0000987D,
278 0x0000A186, 0x0000AB19, 0x0000B53C, 0x0000BFF9,
279 0x0000CB59, 0x0000D766, 0x0000E429, 0x0000F1AE,
280 0x00010000, 0x00010F2B, 0x00011F3D, 0x00013042,
281 0x00014249, 0x00015562, 0x0001699C, 0x00017F09
290 struct iic_msg msg[] = {
296 msg[0].len =
size + 1;
300 iicbus_transfer(sc->
sc_dev, msg, 1);
314 if (strcmp(
name,
"deq") == 0 && iicbus_get_addr(
dev) ==
316 device_set_desc(
dev,
"Texas Instruments TAS3001 Audio Codec");
328 sc = device_get_softc(
dev);
367 x |= SOUND_MASK_VOLUME;
389 struct mtx *mixer_lock;
396 locked = mtx_owned(mixer_lock);
399 case SOUND_MIXER_VOLUME:
406 reg[0] = (l & 0xff0000) >> 16;
407 reg[1] = (l & 0x00ff00) >> 8;
408 reg[2] = l & 0x0000ff;
409 reg[3] = (
r & 0xff0000) >> 16;
410 reg[4] = (
r & 0x00ff00) >> 8;
411 reg[5] =
r & 0x0000ff;
421 mtx_unlock(mixer_lock);
426 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)
static driver_t tumbler_driver
static int tumbler_write(struct tumbler_softc *sc, uint8_t reg, const void *data)
static u_int tumbler_volume_table[100]
static int tumbler_reinit(struct snd_mixer *m)
MODULE_VERSION(tumbler, 1)
static kobj_method_t tumbler_mixer_methods[]
static device_method_t tumbler_methods[]
const char tumbler_regsize[]
MODULE_DEPEND(tumbler, iicbus, 1, 1, 1)
static int tumbler_set(struct snd_mixer *m, unsigned dev, unsigned left, unsigned right)
static int tumbler_uninit(struct snd_mixer *m)
static int tumbler_probe(device_t)
#define TUMBLER_DRC_COMP_31
const struct tumbler_reg tumbler_initdata
static int tumbler_init(struct snd_mixer *m)
MIXER_DECLARE(tumbler_mixer)
static u_int32_t tumbler_setrecsrc(struct snd_mixer *m, u_int32_t src)
static devclass_t tumbler_devclass
kobj_class_t i2s_mixer_class
DRIVER_MODULE(tumbler, iicbus, tumbler_driver, tumbler_devclass, 0, 0)
#define TUMBLER_MCR_ISM_I2S
#define TUMBLER_MCR_SC_64
#define TUMBLER_MCR_SM_I2S
static int tumbler_attach(device_t)
#define TUMBLER_DRC_DEFL_TH