diff --git a/src/add-ons/kernel/drivers/audio/ice1712/ice1712.c b/src/add-ons/kernel/drivers/audio/ice1712/ice1712.c index dea0bb571e..464fc754d6 100644 --- a/src/add-ons/kernel/drivers/audio/ice1712/ice1712.c +++ b/src/add-ons/kernel/drivers/audio/ice1712/ice1712.c @@ -13,16 +13,16 @@ #include #include #include -#include #include #include +#include +#include #include #include "debug.h" #include "ice1712.h" #include "ice1712_reg.h" #include "io.h" -#include "midi_driver.h" #include "multi.h" #include "util.h" @@ -137,7 +137,7 @@ static status_t ice1712_setup(ice1712 *ice) { int result, i; - long result_l = 0; + status_t status = B_OK; uint8 reg8 = 0; ice->irq = ice->info.u.h0.interrupt_line; @@ -249,10 +249,13 @@ ice1712_setup(ice1712 *ice) names[num_names] = NULL; ice->buffer_ready_sem = create_sem(0, "Buffer Exchange"); + if (ice->buffer_ready_sem < B_OK) { + return ice->buffer_ready_sem; + } // TRACE_ICE(("installing interrupt : %0x\n", ice->irq)); - result_l = install_io_interrupt_handler(ice->irq, ice_1712_int, ice, 0); - if (result_l == B_OK) + status = install_io_interrupt_handler(ice->irq, ice_1712_int, ice, 0); + if (status == B_OK) TRACE_ICE(("Install Interrupt Handler == B_OK\n")); else TRACE_ICE(("Install Interrupt Handler != B_OK\n")); @@ -260,10 +263,21 @@ ice1712_setup(ice1712 *ice) ice->mem_id_pb = alloc_mem(&ice->phys_addr_pb, &ice->log_addr_pb, PLAYBACK_BUFFER_TOTAL_SIZE, "playback buffer"); + if (ice->mem_id_pb < B_OK) { + remove_io_interrupt_handler(ice->irq, ice_1712_int, ice); + delete_sem(ice->buffer_ready_sem); + return ice->mem_id_pb; + } ice->mem_id_rec = alloc_mem(&ice->phys_addr_rec, &ice->log_addr_rec, RECORD_BUFFER_TOTAL_SIZE, "record buffer"); + if (ice->mem_id_rec < B_OK) { + remove_io_interrupt_handler(ice->irq, ice_1712_int, ice); + delete_sem(ice->buffer_ready_sem); + delete_area(ice->mem_id_pb); + return(ice->mem_id_rec); + } memset(ice->log_addr_pb, 0, PLAYBACK_BUFFER_TOTAL_SIZE); memset(ice->log_addr_rec, 0, RECORD_BUFFER_TOTAL_SIZE); @@ -336,24 +350,19 @@ init_driver(void) return ENOSYS; } - while ((*pci->get_nth_pci_info)(i, &cards[num_cards].info) == B_OK) - {//TODO check other Vendor_ID and DEVICE_ID - if ((cards[num_cards].info.vendor_id == ICE1712_VENDOR_ID) && - (cards[num_cards].info.device_id == ICE1712_DEVICE_ID)) - { - if (num_cards == NUM_CARDS) - { + while ((*pci->get_nth_pci_info)(i, &cards[num_cards].info) == B_OK) { + //TODO check other Vendor_ID and DEVICE_ID + if ((cards[num_cards].info.vendor_id == ICE1712_VENDOR_ID) + && (cards[num_cards].info.device_id == ICE1712_DEVICE_ID)) { + if (num_cards == NUM_CARDS) { TRACE_ICE(("Too many ice1712 cards installed!\n")); break; } - if (ice1712_setup(&cards[num_cards]) != B_OK) + if (ice1712_setup(&cards[num_cards]) != B_OK) { //Vendor_ID and Device_ID has been modified - { TRACE_ICE(("Setup of ice1712 %d failed\n", num_cards + 1)); - } - else - { + } else { num_cards++; } } @@ -366,7 +375,7 @@ init_driver(void) put_module(B_PCI_MODULE_NAME); put_module(B_MPU_401_MODULE_NAME); return ENODEV; - } + } return B_OK; } @@ -374,10 +383,12 @@ init_driver(void) static void ice_1712_shutdown(ice1712 *ice) { - long result_l; + status_t result; - result_l = remove_io_interrupt_handler(ice->irq, ice_1712_int, ice); - if (result_l == B_OK) + delete_sem(ice->buffer_ready_sem); + + result = remove_io_interrupt_handler(ice->irq, ice_1712_int, ice); + if (result == B_OK) TRACE_ICE(("remove Interrupt result == B_OK\n")); else TRACE_ICE(("remove Interrupt result != B_OK\n")); @@ -426,8 +437,24 @@ publish_devices(void) static status_t ice_1712_open(const char *name, uint32 flags, void **cookie) -{//Not Implemented (partialy only) +{ + int ix; + ice1712 *card = NULL; TRACE_ICE(("===open()===\n")); + + for (ix=0; ix= 0) eeprom[i] = (uint8)tmp; @@ -278,8 +277,7 @@ int16 read_eeprom(ice1712 *ice, uint8 eeprom[32]) } if (eeprom[4] > 32) return -1; - for (i = 6; i < eeprom[4]; i++) - { + for (i = 6; i < eeprom[4]; i++) { tmp = read_i2c(ice, I2C_EEPROM_ADDRESS_READ, i); if (tmp >= 0) eeprom[i] = (uint8)tmp; @@ -366,8 +364,7 @@ ak45xx_write_gpio(ice1712 *ice, uint8 reg_addr, uint8 data, uint8 chip_select) write_gpio(ice, tmp); snooze(AK45xx_DELAY); - for (i = 0; i < AK45xx_BITS_TO_WRITE; i++) - { + for (i = 0; i < AK45xx_BITS_TO_WRITE; i++) { // drop clock and data bits tmp &= ~(ice->analog_codec.clock | ice->analog_codec.data_out); @@ -415,8 +412,7 @@ cs84xx_write_gpio(ice1712 *ice, uint8 reg_addr, uint8 data, uint8 chip_select) write_gpio(ice, tmp); snooze(CS84xx_DELAY); - for (i = 0; i < CS84xx_BITS_TO_WRITE; i++) - { + for (i = 0; i < CS84xx_BITS_TO_WRITE; i++) { // drop clock and data bits tmp &= ~(ice->digital_codec.clock | ice->digital_codec.data_out); diff --git a/src/add-ons/kernel/drivers/audio/ice1712/multi.c b/src/add-ons/kernel/drivers/audio/ice1712/multi.c index 1216adf765..99100be37e 100644 --- a/src/add-ons/kernel/drivers/audio/ice1712/multi.c +++ b/src/add-ons/kernel/drivers/audio/ice1712/multi.c @@ -95,6 +95,7 @@ start_DMA(ice1712 *card) write_mt_uint8(card, MT_PROF_PB_CONTROL, 5); } + status_t ice1712_get_description(ice1712 *card, multi_description *data) { @@ -312,19 +313,19 @@ ice1712_set_global_format(ice1712 *card, multi_format_info *data) TRACE_ICE(("Input Sampling Rate = %#x\n", data->input.rate)); TRACE_ICE(("Output Sampling Rate = %#x\n", data->output.rate)); - if ((data->input.rate == data->output.rate) && - (card->lock_source == B_MULTI_LOCK_INTERNAL)) { + if ((data->input.rate == data->output.rate) + && (card->lock_source == B_MULTI_LOCK_INTERNAL)) { switch (data->input.rate) { case B_SR_96000 : card->sampling_rate = 0x07; break; - case B_SR_48000 : - card->sampling_rate = 0x00; - break; case B_SR_88200 : card->sampling_rate = 0x0B; break; + case B_SR_48000 : + card->sampling_rate = 0x00; + break; case B_SR_44100 : card->sampling_rate = 0x08; break;