#ifndef _ARM_SUNXI_CODEC_H
#define _ARM_SUNXI_CODEC_H
#include <sys/audioio.h>
#include <dev/audio/audio_if.h>
#include <dev/fdt/fdtvar.h>
#include "h3_codec.h"
#include "v3s_codec.h"
struct sunxi_codec_softc;
struct sunxi_codec_conf {
const char *name;
int (*init)(struct sunxi_codec_softc *);
void (*mute)(struct sunxi_codec_softc *, int, u_int);
int (*set_port)(struct sunxi_codec_softc *,
mixer_ctrl_t *);
int (*get_port)(struct sunxi_codec_softc *,
mixer_ctrl_t *);
int (*query_devinfo)(struct sunxi_codec_softc *,
mixer_devinfo_t *);
bus_size_t DPC,
DAC_FIFOC,
DAC_FIFOS,
DAC_TXDATA,
ADC_FIFOC,
ADC_FIFOS,
ADC_RXDATA,
DAC_CNT,
ADC_CNT;
};
struct sunxi_codec_chan {
struct sunxi_codec_softc *ch_sc;
u_int ch_mode;
struct fdtbus_dma *ch_dma;
struct fdtbus_dma_req ch_req;
audio_params_t ch_params;
bus_addr_t ch_start_phys;
bus_addr_t ch_end_phys;
bus_addr_t ch_cur_phys;
int ch_blksize;
void (*ch_intr)(void *);
void *ch_intrarg;
};
struct sunxi_codec_dma {
LIST_ENTRY(sunxi_codec_dma) dma_list;
bus_dmamap_t dma_map;
void *dma_addr;
size_t dma_size;
bus_dma_segment_t dma_segs[1];
int dma_nsegs;
};
struct sunxi_codec_softc {
device_t sc_dev;
bus_space_tag_t sc_bst;
bus_space_handle_t sc_bsh;
bus_dma_tag_t sc_dmat;
int sc_phandle;
bus_addr_t sc_baseaddr;
const struct sunxi_codec_conf *sc_cfg;
void *sc_codec_priv;
struct fdtbus_gpio_pin *sc_pin_pa;
LIST_HEAD(, sunxi_codec_dma) sc_dmalist;
kmutex_t sc_lock;
kmutex_t sc_intr_lock;
struct audio_format sc_format;
struct sunxi_codec_chan sc_pchan;
struct sunxi_codec_chan sc_rchan;
};
#if NH3_CODEC > 0
extern const struct sunxi_codec_conf sun8i_h3_codecconf;
#define H3_CODEC_COMPATDATA \
{ .compat = "allwinner,sun8i-h3-codec", \
.data = &sun8i_h3_codecconf },
#else
#define H3_CODEC_COMPATDATA
#endif
#if NV3S_CODEC > 0
extern const struct sunxi_codec_conf sun8i_v3s_codecconf;
#define V3S_CODEC_COMPATDATA \
{ .compat = "allwinner,sun8i-v3s-codec", \
.data = &sun8i_v3s_codecconf },
#else
#define V3S_CODEC_COMPATDATA
#endif
extern const struct sunxi_codec_conf sun4i_a10_codecconf;
#define A10_CODEC_COMPATDATA \
{ .compat = "allwinner,sun4i-a10-codec", \
.data = &sun4i_a10_codecconf }, \
{ .compat = "allwinner,sun7i-a20-codec", \
.data = &sun4i_a10_codecconf },
extern const struct sunxi_codec_conf sun6i_a31_codecconf;
#define A31_CODEC_COMPATDATA \
{ .compat = "allwinner,sun6i-a31-codec", \
.data = &sun6i_a31_codecconf },
#endif