#ifndef _ICE1712_H_
#define _ICE1712_H_
#include <PCI.h>
#include <KernelExport.h>
#include "debug.h"
#include "hmulti_audio.h"
#define DRIVER_NAME "ice1712"
#define VERSION "0.6"
#define ICE1712_VENDOR_ID 0x1412
#define ICE1712_DEVICE_ID 0x1712
typedef enum ice1712Product {
ICE1712_SUBDEVICE_DELTA1010 = 0x121430d6,
ICE1712_SUBDEVICE_DELTADIO2496 = 0x121431d6,
ICE1712_SUBDEVICE_DELTA66 = 0x121432d6,
ICE1712_SUBDEVICE_DELTA44 = 0x121433d6,
ICE1712_SUBDEVICE_AUDIOPHILE_2496 = 0x121434d6,
ICE1712_SUBDEVICE_DELTA410 = 0x121438d6,
ICE1712_SUBDEVICE_DELTA1010LT = 0x12143bd6,
ICE1712_SUBDEVICE_VX442 = 0x12143cd6,
} ice1712Product;
#define NUM_CARDS 4
#define MAX_ADC 12
#define MAX_DAC 10
#define MAX_MIDI_INTERFACE 2
#define SWAPPING_BUFFERS 2
#define SAMPLE_SIZE 4
#define MIN_BUFFER_FRAMES 64
#define MAX_BUFFER_FRAMES 2048
#define ICE1712_HARDWARE_VOLUME 10
#define ICE1712_MUTE_VALUE 0x7F
#define PLAYBACK_BUFFER_SIZE (MAX_BUFFER_FRAMES * MAX_DAC * SAMPLE_SIZE)
#define RECORD_BUFFER_SIZE (MAX_BUFFER_FRAMES * MAX_ADC * SAMPLE_SIZE)
#define PLAYBACK_BUFFER_TOTAL_SIZE (PLAYBACK_BUFFER_SIZE * SWAPPING_BUFFERS)
#define RECORD_BUFFER_TOTAL_SIZE (RECORD_BUFFER_SIZE * SWAPPING_BUFFERS)
#define SPDIF_LEFT 8
#define SPDIF_RIGHT 9
#define MIXER_OUT_LEFT 10
#define MIXER_OUT_RIGHT 11
#define SPDIF_OUT_PRESENT 1
#define SPDIF_IN_PRESENT 2
#define ICE1712_SAMPLERATE_96K 0x7
#define ICE1712_SAMPLERATE_48K 0x0
#define ICE1712_SAMPLERATE_88K2 0xB
#define ICE1712_SAMPLERATE_44K1 0x8
struct ice1712;
typedef struct ice1712Midi {
struct ice1712 *card;
void *mpu401device;
uint8 int_mask;
char name[64];
} ice1712Midi;
typedef struct _codecCommLines
{
uint8 clock;
uint8 data_in;
uint8 data_out;
uint8 cs_mask;
} codecCommLines;
typedef struct ice1712Volume
{
float volume;
bool mute;
} ice1712Volume;
typedef struct ice1712Settings
{
ice1712Volume playback[ICE1712_HARDWARE_VOLUME];
ice1712Volume record[ICE1712_HARDWARE_VOLUME];
uint32 bufferSize;
uint8 clock;
uint8 outFormat;
uint8 emphasis;
uint8 copyMode;
uint8 output[5];
uint8 reserved[32];
} ice1712Settings;
typedef struct ice1712HW
{
int8 nb_ADC;
int8 nb_DAC;
int8 nb_MPU401;
int8 spdif;
uint8 samplingRate;
uint32 lockSource;
ice1712Product product;
} ice1712HW;
typedef struct ice1712
{
uint32 irq;
pci_info info;
char name[B_DEV_NAME_LENGTH];
ice1712Midi midiItf[MAX_MIDI_INTERFACE];
uint32 Controller;
uint32 DDMA;
uint32 DMA_Path;
uint32 Multi_Track;
uint8 eeprom_data[32];
codecCommLines CommLines;
uint32 buffer;
bigtime_t played_time;
uint32 buffer_size;
uint32 frames_count;
area_id mem_id_pb;
physical_entry phys_pb;
addr_t log_addr_pb;
uint8 total_output_channels;
area_id mem_id_rec;
physical_entry phys_rec;
addr_t log_addr_rec;
uint8 total_input_channels;
sem_id buffer_ready_sem;
ice1712HW config;
ice1712Settings settings;
} ice1712;
#define CCS_INTERRUPT_MIDI_1 0x80
#define CCS_INTERRUPT_MIDI_2 0x20
#define GPIO_SPDIF_STATUS 0x02
#define GPIO_SPDIF_CCLK 0x04
#define GPIO_SPDIF_DOUT 0x08
#define DELTA66_DOUT 0x10
#define DELTA66_CLK 0x20
#define DELTA66_CODEC_CS_0 0x40
#define DELTA66_CODEC_CS_1 0x80
#define DELTA66_CS_MASK 0xD0
#define AP2496_CLK 0x02
#define AP2496_DIN 0x04
#define AP2496_DOUT 0x08
#define AP2496_SPDIF_CS 0x10
#define AP2496_CODEC_CS 0x20
#define AP2496_CS_MASK 0x30
#define DELTA1010LT_CLK 0x02
#define DELTA1010LT_DIN 0x04
#define DELTA1010LT_DOUT 0x08
#define DELTA1010LT_CODEC_CS_0 0x00
#define DELTA1010LT_CODEC_CS_1 0x10
#define DELTA1010LT_CODEC_CS_2 0x20
#define DELTA1010LT_CODEC_CS_3 0x30
#define DELTA1010LT_SPDIF_CS 0x40
#define DELTA1010LT_CS_NONE 0x70
#define VX442_CLK 0x02
#define VX442_DIN 0x04
#define VX442_DOUT 0x08
#define VX442_SPDIF_CS 0x10
#define VX442_CODEC_CS_0 0x20
#define VX442_CODEC_CS_1 0x40
#define VX442_CS_MASK 0x70
#define GPIO_I2C_DELAY 5
#define AK45xx_CHIP_ADDRESS 0x02
#define AK45xx_RESET_REGISTER 0x01
#define AK45xx_CLOCK_FORMAT_REGISTER 0x02
#define CS84xx_CHIP_ADDRESS 0x10
#define CS84xx_CONTROL_1_PORT_REG 0x01
#define CS84xx_CONTROL_2_PORT_REG 0x02
#define CS84xx_DATA_FLOW_CONTROL_REG 0x03
#define CS84xx_CLOCK_SOURCE_REG 0x04
#define CS84xx_SERIAL_INPUT_FORMAT_REG 0x05
#define CS84xx_SERIAL_OUTPUT_FORMAT_REG 0x06
#define CS84xx_VERSION_AND_CHIP_ID 0x7F
typedef enum ice1712EEprom {
E2PROM_MAP_SUBVENDOR_LOW = 0x00,
E2PROM_MAP_SUBVENDOR_HIGH,
E2PROM_MAP_SUBDEVICE_LOW,
E2PROM_MAP_SUBDEVICE_HIGH,
E2PROM_MAP_SIZE,
E2PROM_MAP_VERSION,
E2PROM_MAP_CONFIG,
E2PROM_MAP_ACL,
E2PROM_MAP_I2S,
E2PROM_MAP_SPDIF,
E2PROM_MAP_GPIOMASK,
E2PROM_MAP_GPIOSTATE,
E2PROM_MAP_GPIODIR,
E2PROM_MAP_AC97MAIN,
E2PROM_MAP_AC97PCM = 0x0F,
E2PROM_MAP_AC97REC = 0x11,
E2PROM_MAP_AC97REC_SOURCE = 0x13,
E2PROM_MAP_DAC_ID = 0x14,
E2PROM_MAP_ADC_ID = 0x18,
E2PROM_MAP_EXTRA = 0x1C
} ice1712EEprom;
#endif