Ticket #8377: delta1010.patch

File delta1010.patch, 11.0 KB (added by SeanCollins, 12 years ago)
  • src/add-ons/kernel/drivers/audio/ice1712/ice1712.c

    diff --git a/src/add-ons/kernel/drivers/audio/ice1712/ice1712.c b/src/add-ons/kernel/drivers/audio/ice1712/ice1712.c
    index d1f057e..e9d62ba 100644
    a b ice1712_setup(ice1712 *ice)  
    263263            ice->CommLines.data_in = 0;
    264264            ice->CommLines.data_out = DELTA66_DOUT;
    265265            ice->CommLines.cs_mask = DELTA66_CLK | DELTA66_DOUT
    266                 | DELTA66_CODEC_CS_0 | DELTA66_CODEC_CS_1;
     266                | DELTA66_CS_MASK;
    267267            break;
    268268        case ICE1712_SUBDEVICE_DELTA410 :
    269269        case ICE1712_SUBDEVICE_AUDIOPHILE_2496 :
    ice1712_setup(ice1712 *ice)  
    272272            ice->CommLines.data_in = AP2496_DIN;
    273273            ice->CommLines.data_out = AP2496_DOUT;
    274274            ice->CommLines.cs_mask = AP2496_CLK | AP2496_DIN
    275                 | AP2496_DOUT | AP2496_SPDIF_CS | AP2496_CODEC_CS;
     275                | AP2496_DOUT | AP2496_CS_MASK;
    276276            break;
    277277        case ICE1712_SUBDEVICE_DELTA1010 :
    278278        case ICE1712_SUBDEVICE_DELTA1010LT :
    ice1712_setup(ice1712 *ice)  
    286286            ice->CommLines.clock = VX442_CLK;
    287287            ice->CommLines.data_in = VX442_DIN;
    288288            ice->CommLines.data_out = VX442_DOUT;
    289             ice->CommLines.cs_mask = VX442_SPDIF_CS | VX442_CODEC_CS_0
    290                 | VX442_CODEC_CS_1;
     289            ice->CommLines.cs_mask = VX442_CLK | VX442_DIN | VX442_DOUT
     290                | VX442_CS_MASK;
    291291            break;
    292292    }
    293293
  • src/add-ons/kernel/drivers/audio/ice1712/ice1712.h

    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 b extern ice1712 cards[NUM_CARDS];  
    193193#define DELTA66_CLK                     0x20    // clock
    194194#define DELTA66_CODEC_CS_0              0x40    // AK4524 #0
    195195#define DELTA66_CODEC_CS_1              0x80    // AK4524 #1
     196#define DELTA66_CS_MASK                 0xD0    // Chip Select mask
    196197
    197198//For AudioPhile 2496 / Delta 410
    198199#define AP2496_CLK                      0x02    // clock
    extern ice1712 cards[NUM_CARDS];  
    200201#define AP2496_DOUT                     0x08    // data output
    201202#define AP2496_SPDIF_CS                 0x10    // CS8427 chip select
    202203#define AP2496_CODEC_CS                 0x20    // AK4528 chip select
     204#define AP2496_CS_MASK                  0x30    // Chip Select Mask
    203205
    204206//For Delta 1010 LT
    205207#define DELTA1010LT_CLK                 0x02    // clock
    extern ice1712 cards[NUM_CARDS];  
    210212#define DELTA1010LT_CODEC_CS_2          0x20    // AK4524 #2
    211213#define DELTA1010LT_CODEC_CS_3          0x30    // AK4524 #3
    212214#define DELTA1010LT_SPDIF_CS            0x40    // CS8427
    213 #define DELTA1010LT_CS_NONE             0x50    // All CS deselected
     215#define DELTA1010LT_CS_NONE             0x70    // All CS deselected
    214216
    215217//For VX442
    216218#define VX442_CLK                       0x02    // clock
    extern ice1712 cards[NUM_CARDS];  
    219221#define VX442_SPDIF_CS                  0x10    // CS8427
    220222#define VX442_CODEC_CS_0                0x20    // ?? #0
    221223#define VX442_CODEC_CS_1                0x40    // ?? #1
     224#define VX442_CS_MASK                   0x70    // Chip Select Mask
    222225
    223226#define GPIO_I2C_DELAY                  5       //Clock Delay for writing
    224227                                                //I2C data throw GPIO
  • src/add-ons/kernel/drivers/audio/ice1712/io.c

    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 b  
    1616extern pci_module_info *pci;
    1717
    1818static void ak45xx_write_gpio(ice1712 *ice, uint8 reg_addr,
    19                             uint8 data, uint8 chip_select);
     19                            uint8 data, uint8 chip_select, uint8 invert_cs);
    2020
    2121static void cs84xx_write_gpio(ice1712 *ice, uint8 reg_addr,
    22                             uint8 data, uint8 chip_select);
     22                            uint8 data, uint8 chip_select, uint8 invert_cs);
    2323
    2424static uint8 ak45xx_read_gpio(ice1712 *ice, uint8 reg_addr,
    25                             uint8 chip_select) {return 0;} //Unimplemented
     25                            uint8 chip_select, uint8 invert_cs)
     26            {return 0;} //Unimplemented
    2627
    2728static uint8 cs84xx_read_gpio(ice1712 *ice, uint8 reg_addr,
    28                             uint8 chip_select);
     29                            uint8 chip_select, uint8 invert_cs);
    2930
    3031static void write_gpio_byte(ice1712 *ice, uint8 data, uint8 gpio_data);
    3132static uint8 read_gpio_byte(ice1712 *ice, uint8 gpio_data);
    codec_write(ice1712 *ice, uint8 reg_addr, uint8 data)  
    304305    switch (ice->product) {
    305306        case ICE1712_SUBDEVICE_DELTA66:
    306307        case ICE1712_SUBDEVICE_DELTA44:
    307             ak45xx_write_gpio(ice, reg_addr, data, DELTA66_CODEC_CS_0);
    308             ak45xx_write_gpio(ice, reg_addr, data, DELTA66_CODEC_CS_1);
     308            ak45xx_write_gpio(ice, reg_addr, data, DELTA66_CODEC_CS_0, 0);
     309            ak45xx_write_gpio(ice, reg_addr, data, DELTA66_CODEC_CS_1, 0);
    309310            break;
    310311        case ICE1712_SUBDEVICE_DELTA410:
    311312        case ICE1712_SUBDEVICE_AUDIOPHILE_2496:
    312313        case ICE1712_SUBDEVICE_DELTADIO2496:
    313             ak45xx_write_gpio(ice, reg_addr, data, AP2496_CODEC_CS);
     314            ak45xx_write_gpio(ice, reg_addr, data, AP2496_CODEC_CS, 0);
    314315            break;
    315316        case ICE1712_SUBDEVICE_DELTA1010:
    316317        case ICE1712_SUBDEVICE_DELTA1010LT:
    317             ak45xx_write_gpio(ice, reg_addr, data, DELTA1010LT_CODEC_CS_0);
    318             ak45xx_write_gpio(ice, reg_addr, data, DELTA1010LT_CODEC_CS_1);
    319             ak45xx_write_gpio(ice, reg_addr, data, DELTA1010LT_CODEC_CS_2);
    320             ak45xx_write_gpio(ice, reg_addr, data, DELTA1010LT_CODEC_CS_3);
     318            ak45xx_write_gpio(ice, reg_addr, data, DELTA1010LT_CODEC_CS_0,
     319                    DELTA1010LT_CS_NONE);
     320            ak45xx_write_gpio(ice, reg_addr, data, DELTA1010LT_CODEC_CS_1,
     321                    DELTA1010LT_CS_NONE);
     322            ak45xx_write_gpio(ice, reg_addr, data, DELTA1010LT_CODEC_CS_2,
     323                    DELTA1010LT_CS_NONE);
     324            ak45xx_write_gpio(ice, reg_addr, data, DELTA1010LT_CODEC_CS_3,
     325                    DELTA1010LT_CS_NONE);
    321326            break;
    322327        case ICE1712_SUBDEVICE_VX442:
    323             ak45xx_write_gpio(ice, reg_addr, data, VX442_CODEC_CS_0);
    324             ak45xx_write_gpio(ice, reg_addr, data, VX442_CODEC_CS_1);
     328            ak45xx_write_gpio(ice, reg_addr, data, VX442_CODEC_CS_0, 0);
     329            ak45xx_write_gpio(ice, reg_addr, data, VX442_CODEC_CS_1, 0);
    325330            break;
    326331    }
    327332}
    spdif_write(ice1712 *ice, uint8 reg_addr, uint8 data)  
    340345        case ICE1712_SUBDEVICE_DELTA44:
    341346            break;
    342347        case ICE1712_SUBDEVICE_AUDIOPHILE_2496:
    343             cs84xx_write_gpio(ice, reg_addr, data, AP2496_SPDIF_CS);
     348            cs84xx_write_gpio(ice, reg_addr, data, AP2496_SPDIF_CS, 0);
    344349            break;
    345350        case ICE1712_SUBDEVICE_DELTA410:
    346351            break;
    347352        case ICE1712_SUBDEVICE_DELTA1010LT:
    348             cs84xx_write_gpio(ice, reg_addr, data, DELTA1010LT_SPDIF_CS);
     353            cs84xx_write_gpio(ice, reg_addr, data, DELTA1010LT_SPDIF_CS,
     354                    DELTA1010LT_CS_NONE);
    349355            break;
    350356        case ICE1712_SUBDEVICE_VX442:
    351             cs84xx_write_gpio(ice, reg_addr, data, VX442_SPDIF_CS);
     357            cs84xx_write_gpio(ice, reg_addr, data, VX442_SPDIF_CS, 0);
    352358            break;
    353359    }
    354360}
    codec_read(ice1712 *ice, uint8 reg_addr)  
    361367    switch (ice->product) {
    362368        case ICE1712_SUBDEVICE_DELTA66:
    363369        case ICE1712_SUBDEVICE_DELTA44:
    364             val = ak45xx_read_gpio(ice, reg_addr, DELTA66_CODEC_CS_0);
     370            val = ak45xx_read_gpio(ice, reg_addr, DELTA66_CODEC_CS_0, 0);
    365371            break;
    366372        case ICE1712_SUBDEVICE_DELTA410:
    367373        case ICE1712_SUBDEVICE_AUDIOPHILE_2496:
    368374        case ICE1712_SUBDEVICE_DELTADIO2496:
    369             val = ak45xx_read_gpio(ice, reg_addr, AP2496_CODEC_CS);
     375            val = ak45xx_read_gpio(ice, reg_addr, AP2496_CODEC_CS, 0);
    370376            break;
    371377        case ICE1712_SUBDEVICE_DELTA1010:
    372378        case ICE1712_SUBDEVICE_DELTA1010LT:
    373             val = ak45xx_read_gpio(ice, reg_addr, DELTA1010LT_CODEC_CS_0);
     379            val = ak45xx_read_gpio(ice, reg_addr, DELTA1010LT_CODEC_CS_0,
     380                            DELTA1010LT_CS_NONE);
    374381            break;
    375382        case ICE1712_SUBDEVICE_VX442:
    376             val = ak45xx_read_gpio(ice, reg_addr, VX442_CODEC_CS_0);
     383            val = ak45xx_read_gpio(ice, reg_addr, VX442_CODEC_CS_0, 0);
    377384            break;
    378385    }
    379386
    spdif_read(ice1712 *ice, uint8 reg_addr)  
    395402        case ICE1712_SUBDEVICE_DELTA44:
    396403            break;
    397404        case ICE1712_SUBDEVICE_AUDIOPHILE_2496:
    398             val = cs84xx_read_gpio(ice, reg_addr, AP2496_SPDIF_CS);
     405            val = cs84xx_read_gpio(ice, reg_addr, AP2496_SPDIF_CS, 0);
    399406            break;
    400407        case ICE1712_SUBDEVICE_DELTA410:
    401408            break;
    402409        case ICE1712_SUBDEVICE_DELTA1010LT:
    403             val = cs84xx_read_gpio(ice, reg_addr, DELTA1010LT_SPDIF_CS);
     410            val = cs84xx_read_gpio(ice, reg_addr, DELTA1010LT_SPDIF_CS,
     411                            DELTA1010LT_CS_NONE);
    404412            break;
    405413        case ICE1712_SUBDEVICE_VX442:
    406             val = cs84xx_read_gpio(ice, reg_addr, VX442_SPDIF_CS);
     414            val = cs84xx_read_gpio(ice, reg_addr, VX442_SPDIF_CS, 0);
    407415            break;
    408416    }
    409417
    read_gpio_byte(ice1712 *ice, uint8 gpio_data)  
    458466}
    459467
    460468void
    461 ak45xx_write_gpio(ice1712 *ice, uint8 reg_addr, uint8 data, uint8 chip_select)
     469ak45xx_write_gpio(ice1712 *ice, uint8 reg_addr, uint8 data,
     470    uint8 chip_select, uint8 invert_cs)
    462471{
    463472    uint8 tmp;
    464473
    465474    tmp = read_gpio(ice);
    466475    tmp |= ice->CommLines.cs_mask;
    467     tmp &= ~(chip_select);
     476
     477    if (invert_cs != 0) {
     478        tmp &= ~invert_cs;
     479        tmp |= chip_select;
     480    } else {
     481        tmp &= ~chip_select;
     482    }
    468483
    469484    write_gpio(ice, tmp);
    470485    snooze(GPIO_I2C_DELAY);
    ak45xx_write_gpio(ice1712 *ice, uint8 reg_addr, uint8 data, uint8 chip_select)  
    473488        | (reg_addr & 0x1F), tmp);
    474489    write_gpio_byte(ice, data, tmp);
    475490
    476     tmp |= chip_select;
     491    if (invert_cs != 0) {
     492        tmp |= invert_cs;
     493    } else {
     494        tmp |= chip_select;
     495    }
    477496    write_gpio(ice, tmp);
    478497    snooze(GPIO_I2C_DELAY);
    479498}
    480499
    481500void
    482 cs84xx_write_gpio(ice1712 *ice, uint8 reg_addr, uint8 data, uint8 chip_select)
     501cs84xx_write_gpio(ice1712 *ice, uint8 reg_addr, uint8 data,
     502    uint8 chip_select, uint8 invert_cs)
    483503{
    484504    uint8 tmp;
    485505
    486506    tmp = read_gpio(ice);
    487507    tmp |= ice->CommLines.cs_mask;
    488     tmp &= ~(chip_select);
     508
     509    if (invert_cs != 0) {
     510        tmp &= ~invert_cs;
     511        tmp |= chip_select;
     512    } else {
     513        tmp &= ~chip_select;
     514    }
    489515
    490516    write_gpio(ice, tmp);
    491517    snooze(GPIO_I2C_DELAY);
    cs84xx_write_gpio(ice1712 *ice, uint8 reg_addr, uint8 data, uint8 chip_select)  
    494520    write_gpio_byte(ice, reg_addr & 0x7F, tmp); //Do not Increment
    495521    write_gpio_byte(ice, data, tmp);
    496522
    497     tmp |= chip_select;
     523    if (invert_cs != 0) {
     524        tmp |= invert_cs;
     525    } else {
     526        tmp |= chip_select;
     527    }
    498528    write_gpio(ice, tmp);
    499529    snooze(GPIO_I2C_DELAY);
    500530}
    501531
    502532uint8
    503 cs84xx_read_gpio(ice1712 *ice, uint8 reg_addr, uint8 chip_select)
     533cs84xx_read_gpio(ice1712 *ice, uint8 reg_addr, uint8 chip_select,
     534    uint8 invert_cs)
    504535{
    505536    uint8 tmp, data;
    506537
    507538    tmp = read_gpio(ice);
    508539    tmp |= ice->CommLines.cs_mask;
    509     tmp &= ~(chip_select);
     540
     541    if (invert_cs != 0) {
     542        tmp &= ~invert_cs;
     543        tmp |= chip_select;
     544    } else {
     545        tmp &= ~chip_select;
     546    }
    510547
    511548    write_gpio(ice, tmp);
    512549    snooze(GPIO_I2C_DELAY);
    cs84xx_read_gpio(ice1712 *ice, uint8 reg_addr, uint8 chip_select)  
    515552        tmp); //For writing the MAP
    516553    write_gpio_byte(ice, reg_addr & 0x7F, tmp); //Do not Increment
    517554
    518     tmp |= chip_select; //Deselect the chip
     555    //Deselect the chip
     556    if (invert_cs != 0) {
     557        tmp |= invert_cs;
     558    } else {
     559        tmp |= chip_select;
     560    }
    519561    write_gpio(ice, tmp);
    520562    snooze(GPIO_I2C_DELAY);
    521563
    522     tmp &= ~(chip_select); //Reselect the chip
     564    if (invert_cs != 0) {
     565        tmp &= ~invert_cs;
     566        tmp |= chip_select;
     567    } else {
     568        tmp &= ~chip_select;
     569    }
    523570    write_gpio(ice, tmp);
    524571    snooze(GPIO_I2C_DELAY);
    525572
    cs84xx_read_gpio(ice1712 *ice, uint8 reg_addr, uint8 chip_select)  
    527574        tmp); //For writing the MAP
    528575    data = read_gpio_byte(ice, tmp); //For reading
    529576
    530     tmp |= chip_select; //Deselect the chip
     577    //Deselect the chip
     578    if (invert_cs != 0) {
     579        tmp |= invert_cs;
     580    } else {
     581        tmp |= chip_select;
     582    }
    531583    write_gpio(ice, tmp);
    532584
    533585    return data;