--- 50621c994a905ded26624a1bf43c4f3af39bfd55 +++ 6e45bda98945269943baecc214963b406b40a80e @@ -27,7 +27,7 @@ #include #include #include -#include +#include #include #include @@ -138,6 +138,9 @@ struct audio_in { int running; int stopped; /* set when stopped, cleared on flush */ char *build_id; + struct ion_client *client; + struct ion_handle *input_buff_handle; + struct ion_handle *output_buff_handle; }; struct audio_frame { @@ -1319,15 +1322,16 @@ static int audevrc_in_release(struct ino audio->audrec = NULL; audio->opened = 0; if (audio->data) { - msm_subsystem_unmap_buffer(audio->map_v_read); - free_contiguous_memory_by_paddr(audio->phys); + ion_unmap_kernel(audio->client, audio->input_buff_handle); + ion_free(audio->client, audio->input_buff_handle); audio->data = NULL; } if (audio->out_data) { - msm_subsystem_unmap_buffer(audio->map_v_write); - free_contiguous_memory_by_paddr(audio->out_phys); + ion_unmap_kernel(audio->client, audio->output_buff_handle); + ion_free(audio->client, audio->output_buff_handle); audio->out_data = NULL; } + ion_client_destroy(audio->client); mutex_unlock(&audio->lock); return 0; } @@ -1338,30 +1342,65 @@ static int audevrc_in_open(struct inode struct audio_in *audio = &the_audio_evrc_in; int rc; int encid; + int len = 0; + unsigned long ionflag = 0; + ion_phys_addr_t addr = 0; + struct ion_handle *handle = NULL; + struct ion_client *client = NULL; mutex_lock(&audio->lock); if (audio->opened) { rc = -EBUSY; goto done; } - audio->phys = allocate_contiguous_ebi_nomap(DMASZ, SZ_4K); - if (audio->phys) { - audio->map_v_read = msm_subsystem_map_buffer( - audio->phys, DMASZ, - MSM_SUBSYSTEM_MAP_KADDR, - NULL, 0); - if (IS_ERR(audio->map_v_read)) { - MM_ERR("failed to map read physical address\n"); - rc = -ENOMEM; - free_contiguous_memory_by_paddr(audio->phys); - goto done; - } - audio->data = audio->map_v_read->vaddr; + + client = msm_ion_client_create(UINT_MAX, "Audio_EVRC_in_client"); + if (IS_ERR_OR_NULL(client)) { + MM_ERR("Unable to create ION client\n"); + rc = -ENOMEM; + goto client_create_error; + } + audio->client = client; + + MM_DBG("allocating mem sz = %d\n", DMASZ); + handle = ion_alloc(client, DMASZ, SZ_4K, + ION_HEAP(ION_AUDIO_HEAP_ID)); + if (IS_ERR_OR_NULL(handle)) { + MM_ERR("Unable to create allocate O/P buffers\n"); + rc = -ENOMEM; + goto output_buff_alloc_error; + } + + audio->output_buff_handle = handle; + + rc = ion_phys(client , handle, &addr, &len); + if (rc) { + MM_ERR("O/P buffers:Invalid phy: %x sz: %x\n", + (unsigned int) addr, (unsigned int) len); + rc = -ENOMEM; + goto output_buff_get_phys_error; } else { - MM_ERR("could not allocate DMA buffers\n"); + MM_INFO("O/P buffers:valid phy: %x sz: %x\n", + (unsigned int) addr, (unsigned int) len); + } + audio->phys = (int32_t)addr; + + rc = ion_handle_get_flags(client, handle, &ionflag); + if (rc) { + MM_ERR("could not get flags for the handle\n"); rc = -ENOMEM; - goto done; + goto output_buff_get_flags_error; } + + audio->map_v_read = ion_map_kernel(client, handle, ionflag); + if (IS_ERR(audio->map_v_read)) { + MM_ERR("could not map read buffers,freeing instance 0x%08x\n", + (int)audio); + rc = -ENOMEM; + goto output_buff_map_error; + } + audio->data = (char *)audio->map_v_read; + MM_DBG("Memory addr = 0x%8x phy addr = 0x%8x\n",\ (int) audio->data, (int) audio->phys); if ((file->f_mode & FMODE_WRITE) && @@ -1418,27 +1457,49 @@ static int audevrc_in_open(struct inode audevrc_in_flush(audio); audevrc_out_flush(audio); - audio->out_phys = allocate_contiguous_ebi_nomap(BUFFER_SIZE, - SZ_4K); - if (!audio->out_phys) { - MM_ERR("could not allocate write buffers\n"); + MM_DBG("allocating BUFFER_SIZE %d\n", BUFFER_SIZE); + handle = ion_alloc(client, BUFFER_SIZE, + SZ_4K, ION_HEAP(ION_AUDIO_HEAP_ID)); + if (IS_ERR_OR_NULL(handle)) { + MM_ERR("Unable to create allocate I/P buffers\n"); rc = -ENOMEM; - goto evt_error; + goto input_buff_alloc_error; + } + + audio->input_buff_handle = handle; + + rc = ion_phys(client , handle, &addr, &len); + if (rc) { + MM_ERR("I/P buffers:Invalid phy: %x sz: %x\n", + (unsigned int) addr, (unsigned int) len); + rc = -ENOMEM; + goto input_buff_alloc_error; } else { - audio->map_v_write = msm_subsystem_map_buffer( - audio->out_phys, BUFFER_SIZE, - MSM_SUBSYSTEM_MAP_KADDR, - NULL, 0); - if (IS_ERR(audio->map_v_write)) { - MM_ERR("could map write buffers\n"); - rc = -ENOMEM; - free_contiguous_memory_by_paddr(audio->out_phys); - goto evt_error; - } - audio->out_data = audio->map_v_write->vaddr; - MM_DBG("write buf: phy addr 0x%08x kernel addr 0x%08x\n", - audio->out_phys, (int)audio->out_data); + MM_INFO("Got valid phy: %x sz: %x\n", + (unsigned int) addr, + (unsigned int) len); + } + audio->out_phys = (int32_t)addr; + + rc = ion_handle_get_flags(client, + handle, &ionflag); + if (rc) { + MM_ERR("could not get flags for the handle\n"); + rc = -ENOMEM; + goto input_buff_alloc_error; + } + + audio->map_v_write = ion_map_kernel(client, + handle, ionflag); + if (IS_ERR(audio->map_v_write)) { + MM_ERR("could not map write buffers\n"); + rc = -ENOMEM; + goto input_buff_map_error; } + audio->out_data = (char *)audio->map_v_write; + MM_DBG("write buf: phy addr 0x%08x kernel addr 0x%08x\n", + (unsigned int)addr, + (unsigned int)audio->out_data); /* Initialize buffer */ audio->out[0].data = audio->out_data + 0; @@ -1479,6 +1540,17 @@ evt_error: msm_adsp_put(audio->audrec); audpreproc_aenc_free(audio->enc_id); mutex_unlock(&audio->lock); +input_buff_map_error: + ion_free(client, audio->input_buff_handle); +input_buff_alloc_error: + ion_unmap_kernel(client, audio->output_buff_handle); +output_buff_map_error: +output_buff_get_phys_error: +output_buff_get_flags_error: + ion_free(client, audio->output_buff_handle); +output_buff_alloc_error: + ion_client_destroy(client); +client_create_error: return rc; }