hrev43842 adds 1 changeset to branch 'master' old head: 5a58211db286a4210e3144530013008e791f0301 new head: 57d2f931e0cd9d87477c8ae8641b8ef5cb869e50 ---------------------------------------------------------------------------- 57d2f93: ice1712: patch for initializing codec on delta1010. [ Jerome Leveque <leveque.jerome@xxxxxxxxx> ] ---------------------------------------------------------------------------- Revision: hrev43842 Commit: 57d2f931e0cd9d87477c8ae8641b8ef5cb869e50 URL: http://cgit.haiku-os.org/haiku/commit/?id=57d2f93 Author: Jerome Leveque <leveque.jerome@xxxxxxxxx> Date: Sat Mar 10 14:26:01 2012 UTC Committer: Jerome Duval <jerome.duval@xxxxxxxxx> Commit-Date: Sat Mar 10 14:26:01 2012 UTC ---------------------------------------------------------------------------- 3 files changed, 94 insertions(+), 39 deletions(-) src/add-ons/kernel/drivers/audio/ice1712/ice1712.c | 8 +- src/add-ons/kernel/drivers/audio/ice1712/ice1712.h | 5 +- src/add-ons/kernel/drivers/audio/ice1712/io.c | 120 +++++++++++----- ---------------------------------------------------------------------------- diff --git a/src/add-ons/kernel/drivers/audio/ice1712/ice1712.c b/src/add-ons/kernel/drivers/audio/ice1712/ice1712.c index 9f263a8..5c6f44c 100644 --- a/src/add-ons/kernel/drivers/audio/ice1712/ice1712.c +++ b/src/add-ons/kernel/drivers/audio/ice1712/ice1712.c @@ -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; } diff --git a/src/add-ons/kernel/drivers/audio/ice1712/ice1712.h b/src/add-ons/kernel/drivers/audio/ice1712/ice1712.h index 7212255..b848a18 100644 --- a/src/add-ons/kernel/drivers/audio/ice1712/ice1712.h +++ b/src/add-ons/kernel/drivers/audio/ice1712/ice1712.h @@ -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 diff --git a/src/add-ons/kernel/drivers/audio/ice1712/io.c b/src/add-ons/kernel/drivers/audio/ice1712/io.c index 89fa607..81990a2 100644 --- a/src/add-ons/kernel/drivers/audio/ice1712/io.c +++ b/src/add-ons/kernel/drivers/audio/ice1712/io.c @@ -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;