[haiku-commits] haiku: hrev43842 - src/add-ons/kernel/drivers/audio/ice1712

  • From: korli@xxxxxxxxxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Sat, 10 Mar 2012 15:27:15 +0100 (CET)

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;


Other related posts:

  • » [haiku-commits] haiku: hrev43842 - src/add-ons/kernel/drivers/audio/ice1712 - korli