ice1712: patch for initializing codec on delta1010.

This commit is contained in:
Jerome Leveque 2012-03-10 15:26:01 +01:00 committed by Jerome Duval
parent 5a58211db2
commit 57d2f931e0
3 changed files with 94 additions and 39 deletions

View File

@ -263,7 +263,7 @@ ice1712_setup(ice1712 *ice)
ice->CommLines.data_in = 0;
ice->CommLines.data_out = DELTA66_DOUT;
ice->CommLines.cs_mask = DELTA66_CLK | DELTA66_DOUT
| DELTA66_CODEC_CS_0 | DELTA66_CODEC_CS_1;
| DELTA66_CS_MASK;
break;
case ICE1712_SUBDEVICE_DELTA410 :
case ICE1712_SUBDEVICE_AUDIOPHILE_2496 :
@ -272,7 +272,7 @@ ice1712_setup(ice1712 *ice)
ice->CommLines.data_in = AP2496_DIN;
ice->CommLines.data_out = AP2496_DOUT;
ice->CommLines.cs_mask = AP2496_CLK | AP2496_DIN
| AP2496_DOUT | AP2496_SPDIF_CS | AP2496_CODEC_CS;
| AP2496_DOUT | AP2496_CS_MASK;
break;
case ICE1712_SUBDEVICE_DELTA1010 :
case ICE1712_SUBDEVICE_DELTA1010LT :
@ -286,8 +286,8 @@ ice1712_setup(ice1712 *ice)
ice->CommLines.clock = VX442_CLK;
ice->CommLines.data_in = VX442_DIN;
ice->CommLines.data_out = VX442_DOUT;
ice->CommLines.cs_mask = VX442_SPDIF_CS | VX442_CODEC_CS_0
| VX442_CODEC_CS_1;
ice->CommLines.cs_mask = VX442_CLK | VX442_DIN | VX442_DOUT
| VX442_CS_MASK;
break;
}

View File

@ -193,6 +193,7 @@ extern ice1712 cards[NUM_CARDS];
#define DELTA66_CLK 0x20 // clock
#define DELTA66_CODEC_CS_0 0x40 // AK4524 #0
#define DELTA66_CODEC_CS_1 0x80 // AK4524 #1
#define DELTA66_CS_MASK 0xD0 // Chip Select mask
//For AudioPhile 2496 / Delta 410
#define AP2496_CLK 0x02 // clock
@ -200,6 +201,7 @@ extern ice1712 cards[NUM_CARDS];
#define AP2496_DOUT 0x08 // data output
#define AP2496_SPDIF_CS 0x10 // CS8427 chip select
#define AP2496_CODEC_CS 0x20 // AK4528 chip select
#define AP2496_CS_MASK 0x30 // Chip Select Mask
//For Delta 1010 LT
#define DELTA1010LT_CLK 0x02 // clock
@ -210,7 +212,7 @@ extern ice1712 cards[NUM_CARDS];
#define DELTA1010LT_CODEC_CS_2 0x20 // AK4524 #2
#define DELTA1010LT_CODEC_CS_3 0x30 // AK4524 #3
#define DELTA1010LT_SPDIF_CS 0x40 // CS8427
#define DELTA1010LT_CS_NONE 0x50 // All CS deselected
#define DELTA1010LT_CS_NONE 0x70 // All CS deselected
//For VX442
#define VX442_CLK 0x02 // clock
@ -219,6 +221,7 @@ extern ice1712 cards[NUM_CARDS];
#define VX442_SPDIF_CS 0x10 // CS8427
#define VX442_CODEC_CS_0 0x20 // ?? #0
#define VX442_CODEC_CS_1 0x40 // ?? #1
#define VX442_CS_MASK 0x70 // Chip Select Mask
#define GPIO_I2C_DELAY 5 //Clock Delay for writing
//I2C data throw GPIO

View File

@ -16,16 +16,17 @@
extern pci_module_info *pci;
static void ak45xx_write_gpio(ice1712 *ice, uint8 reg_addr,
uint8 data, uint8 chip_select);
uint8 data, uint8 chip_select, uint8 invert_cs);
static void cs84xx_write_gpio(ice1712 *ice, uint8 reg_addr,
uint8 data, uint8 chip_select);
uint8 data, uint8 chip_select, uint8 invert_cs);
static uint8 ak45xx_read_gpio(ice1712 *ice, uint8 reg_addr,
uint8 chip_select) {return 0;} //Unimplemented
uint8 chip_select, uint8 invert_cs)
{return 0;} //Unimplemented
static uint8 cs84xx_read_gpio(ice1712 *ice, uint8 reg_addr,
uint8 chip_select);
uint8 chip_select, uint8 invert_cs);
static void write_gpio_byte(ice1712 *ice, uint8 data, uint8 gpio_data);
static uint8 read_gpio_byte(ice1712 *ice, uint8 gpio_data);
@ -304,24 +305,28 @@ codec_write(ice1712 *ice, uint8 reg_addr, uint8 data)
switch (ice->product) {
case ICE1712_SUBDEVICE_DELTA66:
case ICE1712_SUBDEVICE_DELTA44:
ak45xx_write_gpio(ice, reg_addr, data, DELTA66_CODEC_CS_0);
ak45xx_write_gpio(ice, reg_addr, data, DELTA66_CODEC_CS_1);
ak45xx_write_gpio(ice, reg_addr, data, DELTA66_CODEC_CS_0, 0);
ak45xx_write_gpio(ice, reg_addr, data, DELTA66_CODEC_CS_1, 0);
break;
case ICE1712_SUBDEVICE_DELTA410:
case ICE1712_SUBDEVICE_AUDIOPHILE_2496:
case ICE1712_SUBDEVICE_DELTADIO2496:
ak45xx_write_gpio(ice, reg_addr, data, AP2496_CODEC_CS);
ak45xx_write_gpio(ice, reg_addr, data, AP2496_CODEC_CS, 0);
break;
case ICE1712_SUBDEVICE_DELTA1010:
case ICE1712_SUBDEVICE_DELTA1010LT:
ak45xx_write_gpio(ice, reg_addr, data, DELTA1010LT_CODEC_CS_0);
ak45xx_write_gpio(ice, reg_addr, data, DELTA1010LT_CODEC_CS_1);
ak45xx_write_gpio(ice, reg_addr, data, DELTA1010LT_CODEC_CS_2);
ak45xx_write_gpio(ice, reg_addr, data, DELTA1010LT_CODEC_CS_3);
ak45xx_write_gpio(ice, reg_addr, data, DELTA1010LT_CODEC_CS_0,
DELTA1010LT_CS_NONE);
ak45xx_write_gpio(ice, reg_addr, data, DELTA1010LT_CODEC_CS_1,
DELTA1010LT_CS_NONE);
ak45xx_write_gpio(ice, reg_addr, data, DELTA1010LT_CODEC_CS_2,
DELTA1010LT_CS_NONE);
ak45xx_write_gpio(ice, reg_addr, data, DELTA1010LT_CODEC_CS_3,
DELTA1010LT_CS_NONE);
break;
case ICE1712_SUBDEVICE_VX442:
ak45xx_write_gpio(ice, reg_addr, data, VX442_CODEC_CS_0);
ak45xx_write_gpio(ice, reg_addr, data, VX442_CODEC_CS_1);
ak45xx_write_gpio(ice, reg_addr, data, VX442_CODEC_CS_0, 0);
ak45xx_write_gpio(ice, reg_addr, data, VX442_CODEC_CS_1, 0);
break;
}
}
@ -340,15 +345,16 @@ spdif_write(ice1712 *ice, uint8 reg_addr, uint8 data)
case ICE1712_SUBDEVICE_DELTA44:
break;
case ICE1712_SUBDEVICE_AUDIOPHILE_2496:
cs84xx_write_gpio(ice, reg_addr, data, AP2496_SPDIF_CS);
cs84xx_write_gpio(ice, reg_addr, data, AP2496_SPDIF_CS, 0);
break;
case ICE1712_SUBDEVICE_DELTA410:
break;
case ICE1712_SUBDEVICE_DELTA1010LT:
cs84xx_write_gpio(ice, reg_addr, data, DELTA1010LT_SPDIF_CS);
cs84xx_write_gpio(ice, reg_addr, data, DELTA1010LT_SPDIF_CS,
DELTA1010LT_CS_NONE);
break;
case ICE1712_SUBDEVICE_VX442:
cs84xx_write_gpio(ice, reg_addr, data, VX442_SPDIF_CS);
cs84xx_write_gpio(ice, reg_addr, data, VX442_SPDIF_CS, 0);
break;
}
}
@ -361,19 +367,20 @@ codec_read(ice1712 *ice, uint8 reg_addr)
switch (ice->product) {
case ICE1712_SUBDEVICE_DELTA66:
case ICE1712_SUBDEVICE_DELTA44:
val = ak45xx_read_gpio(ice, reg_addr, DELTA66_CODEC_CS_0);
val = ak45xx_read_gpio(ice, reg_addr, DELTA66_CODEC_CS_0, 0);
break;
case ICE1712_SUBDEVICE_DELTA410:
case ICE1712_SUBDEVICE_AUDIOPHILE_2496:
case ICE1712_SUBDEVICE_DELTADIO2496:
val = ak45xx_read_gpio(ice, reg_addr, AP2496_CODEC_CS);
val = ak45xx_read_gpio(ice, reg_addr, AP2496_CODEC_CS, 0);
break;
case ICE1712_SUBDEVICE_DELTA1010:
case ICE1712_SUBDEVICE_DELTA1010LT:
val = ak45xx_read_gpio(ice, reg_addr, DELTA1010LT_CODEC_CS_0);
val = ak45xx_read_gpio(ice, reg_addr, DELTA1010LT_CODEC_CS_0,
DELTA1010LT_CS_NONE);
break;
case ICE1712_SUBDEVICE_VX442:
val = ak45xx_read_gpio(ice, reg_addr, VX442_CODEC_CS_0);
val = ak45xx_read_gpio(ice, reg_addr, VX442_CODEC_CS_0, 0);
break;
}
@ -395,15 +402,16 @@ spdif_read(ice1712 *ice, uint8 reg_addr)
case ICE1712_SUBDEVICE_DELTA44:
break;
case ICE1712_SUBDEVICE_AUDIOPHILE_2496:
val = cs84xx_read_gpio(ice, reg_addr, AP2496_SPDIF_CS);
val = cs84xx_read_gpio(ice, reg_addr, AP2496_SPDIF_CS, 0);
break;
case ICE1712_SUBDEVICE_DELTA410:
break;
case ICE1712_SUBDEVICE_DELTA1010LT:
val = cs84xx_read_gpio(ice, reg_addr, DELTA1010LT_SPDIF_CS);
val = cs84xx_read_gpio(ice, reg_addr, DELTA1010LT_SPDIF_CS,
DELTA1010LT_CS_NONE);
break;
case ICE1712_SUBDEVICE_VX442:
val = cs84xx_read_gpio(ice, reg_addr, VX442_SPDIF_CS);
val = cs84xx_read_gpio(ice, reg_addr, VX442_SPDIF_CS, 0);
break;
}
@ -458,13 +466,20 @@ read_gpio_byte(ice1712 *ice, uint8 gpio_data)
}
void
ak45xx_write_gpio(ice1712 *ice, uint8 reg_addr, uint8 data, uint8 chip_select)
ak45xx_write_gpio(ice1712 *ice, uint8 reg_addr, uint8 data,
uint8 chip_select, uint8 invert_cs)
{
uint8 tmp;
tmp = read_gpio(ice);
tmp |= ice->CommLines.cs_mask;
tmp &= ~(chip_select);
if (invert_cs != 0) {
tmp &= ~invert_cs;
tmp |= chip_select;
} else {
tmp &= ~chip_select;
}
write_gpio(ice, tmp);
snooze(GPIO_I2C_DELAY);
@ -473,19 +488,30 @@ ak45xx_write_gpio(ice1712 *ice, uint8 reg_addr, uint8 data, uint8 chip_select)
| (reg_addr & 0x1F), tmp);
write_gpio_byte(ice, data, tmp);
tmp |= chip_select;
if (invert_cs != 0) {
tmp |= invert_cs;
} else {
tmp |= chip_select;
}
write_gpio(ice, tmp);
snooze(GPIO_I2C_DELAY);
}
void
cs84xx_write_gpio(ice1712 *ice, uint8 reg_addr, uint8 data, uint8 chip_select)
cs84xx_write_gpio(ice1712 *ice, uint8 reg_addr, uint8 data,
uint8 chip_select, uint8 invert_cs)
{
uint8 tmp;
tmp = read_gpio(ice);
tmp |= ice->CommLines.cs_mask;
tmp &= ~(chip_select);
if (invert_cs != 0) {
tmp &= ~invert_cs;
tmp |= chip_select;
} else {
tmp &= ~chip_select;
}
write_gpio(ice, tmp);
snooze(GPIO_I2C_DELAY);
@ -494,19 +520,30 @@ cs84xx_write_gpio(ice1712 *ice, uint8 reg_addr, uint8 data, uint8 chip_select)
write_gpio_byte(ice, reg_addr & 0x7F, tmp); //Do not Increment
write_gpio_byte(ice, data, tmp);
tmp |= chip_select;
if (invert_cs != 0) {
tmp |= invert_cs;
} else {
tmp |= chip_select;
}
write_gpio(ice, tmp);
snooze(GPIO_I2C_DELAY);
}
uint8
cs84xx_read_gpio(ice1712 *ice, uint8 reg_addr, uint8 chip_select)
cs84xx_read_gpio(ice1712 *ice, uint8 reg_addr, uint8 chip_select,
uint8 invert_cs)
{
uint8 tmp, data;
tmp = read_gpio(ice);
tmp |= ice->CommLines.cs_mask;
tmp &= ~(chip_select);
if (invert_cs != 0) {
tmp &= ~invert_cs;
tmp |= chip_select;
} else {
tmp &= ~chip_select;
}
write_gpio(ice, tmp);
snooze(GPIO_I2C_DELAY);
@ -515,11 +552,21 @@ cs84xx_read_gpio(ice1712 *ice, uint8 reg_addr, uint8 chip_select)
tmp); //For writing the MAP
write_gpio_byte(ice, reg_addr & 0x7F, tmp); //Do not Increment
tmp |= chip_select; //Deselect the chip
//Deselect the chip
if (invert_cs != 0) {
tmp |= invert_cs;
} else {
tmp |= chip_select;
}
write_gpio(ice, tmp);
snooze(GPIO_I2C_DELAY);
tmp &= ~(chip_select); //Reselect the chip
if (invert_cs != 0) {
tmp &= ~invert_cs;
tmp |= chip_select;
} else {
tmp &= ~chip_select;
}
write_gpio(ice, tmp);
snooze(GPIO_I2C_DELAY);
@ -527,7 +574,12 @@ cs84xx_read_gpio(ice1712 *ice, uint8 reg_addr, uint8 chip_select)
tmp); //For writing the MAP
data = read_gpio_byte(ice, tmp); //For reading
tmp |= chip_select; //Deselect the chip
//Deselect the chip
if (invert_cs != 0) {
tmp |= invert_cs;
} else {
tmp |= chip_select;
}
write_gpio(ice, tmp);
return data;