--- 464f66e93e91da822f190d36a6e4e8baae3d86c5 +++ 81a45ab85373f9092353dca3708e983e830bb762 @@ -35,12 +35,11 @@ #include #include #include -#include #include #include #include #include -#include +#include #include #include @@ -191,6 +190,9 @@ struct audio { int eq_needs_commit; struct audpp_cmd_cfg_object_params_eqalizer eq; struct audpp_cmd_cfg_object_params_volume vol_pan; + struct ion_client *client; + struct ion_handle *input_buff_handle; + struct ion_handle *output_buff_handle; }; static int auddec_dsp_config(struct audio *audio, int enable); @@ -814,6 +816,10 @@ static long audio_ioctl(struct file *fil uint16_t enable_mask; int enable; int prev_state; + unsigned long ionflag = 0; + ion_phys_addr_t addr = 0; + struct ion_handle *handle = NULL; + int len = 0; MM_DBG("cmd = %d\n", cmd); @@ -1052,31 +1058,59 @@ static long audio_ioctl(struct file *fil MM_DBG("allocate PCM buffer %d\n", config.buffer_count * config.buffer_size); - audio->read_phys = - allocate_contiguous_ebi_nomap( - config.buffer_size * - config.buffer_count, - SZ_4K); - if (!audio->read_phys) { + handle = ion_alloc(audio->client, + (config.buffer_size * + config.buffer_count), + SZ_4K, ION_HEAP(ION_AUDIO_HEAP_ID)); + if (IS_ERR_OR_NULL(handle)) { + MM_ERR("Unable to alloc I/P buffs\n"); + audio->input_buff_handle = NULL; + rc = -ENOMEM; + break; + } + + audio->input_buff_handle = handle; + + rc = ion_phys(audio->client , + handle, &addr, &len); + if (rc) { + MM_ERR("Invalid phy: %x sz: %x\n", + (unsigned int) addr, + (unsigned int) len); + ion_free(audio->client, handle); + audio->input_buff_handle = NULL; + rc = -ENOMEM; + break; + } else { + MM_INFO("Got valid phy: %x sz: %x\n", + (unsigned int) audio->read_phys, + (unsigned int) len); + } + audio->read_phys = (int32_t)addr; + + rc = ion_handle_get_flags(audio->client, + handle, &ionflag); + if (rc) { + MM_ERR("could not get flags\n"); + ion_free(audio->client, handle); + audio->input_buff_handle = NULL; rc = -ENOMEM; break; } - audio->map_v_read = msm_subsystem_map_buffer( - audio->read_phys, - config.buffer_size * - config.buffer_count, - MSM_SUBSYSTEM_MAP_KADDR - , NULL, 0); + + audio->map_v_read = ion_map_kernel( + audio->client, + handle, ionflag); if (IS_ERR(audio->map_v_read)) { - MM_ERR("read buf alloc fail\n"); + MM_ERR("map of read buf failed\n"); + ion_free(audio->client, handle); + audio->input_buff_handle = NULL; rc = -ENOMEM; - free_contiguous_memory_by_paddr( - audio->read_phys); } else { uint8_t index; uint32_t offset = 0; audio->read_data = - audio->map_v_read->vaddr; + (char *)audio->map_v_read; audio->buf_refresh = 0; audio->pcm_buf_count = config.buffer_count; @@ -1457,12 +1491,13 @@ static int audio_release(struct inode *i audio->event_abort = 1; wake_up(&audio->event_wait); audwma_reset_event_queue(audio); - msm_subsystem_unmap_buffer(audio->map_v_write); - free_contiguous_memory_by_paddr(audio->phys); - if (audio->read_data) { - msm_subsystem_unmap_buffer(audio->map_v_read); - free_contiguous_memory_by_paddr(audio->read_phys); + ion_unmap_kernel(audio->client, audio->output_buff_handle); + ion_free(audio->client, audio->output_buff_handle); + if (audio->input_buff_handle != NULL) { + ion_unmap_kernel(audio->client, audio->input_buff_handle); + ion_free(audio->client, audio->input_buff_handle); } + ion_client_destroy(audio->client); mutex_unlock(&audio->lock); #ifdef CONFIG_DEBUG_FS if (audio->dentry) @@ -1603,8 +1638,13 @@ static int audio_open(struct inode *inod { struct audio *audio = NULL; int rc, dec_attrb, decid, i; - unsigned pmem_sz = DMASZ_MAX; + unsigned mem_sz = DMASZ_MAX; struct audwma_event *e_node = NULL; + unsigned long ionflag = 0; + ion_phys_addr_t addr = 0; + struct ion_handle *handle = NULL; + struct ion_client *client = NULL; + int len = 0; #ifdef CONFIG_DEBUG_FS /* 4 bytes represents decoder number, 1 byte for terminate string */ char name[sizeof "msm_wma_" + 5]; @@ -1647,39 +1687,52 @@ static int audio_open(struct inode *inod } audio->dec_id = decid & MSM_AUD_DECODER_MASK; - while (pmem_sz >= DMASZ_MIN) { - MM_DBG("pmemsz = %d\n", pmem_sz); - audio->phys = allocate_contiguous_ebi_nomap(pmem_sz, SZ_4K); - if (audio->phys) { - audio->map_v_write = msm_subsystem_map_buffer( - audio->phys, pmem_sz, - MSM_SUBSYSTEM_MAP_KADDR, - NULL, 0); - if (IS_ERR(audio->map_v_write)) { - MM_ERR("could not allocate write buffers, \ - freeing instance 0x%08x\n", - (int)audio); - rc = -ENOMEM; - free_contiguous_memory_by_paddr(audio->phys); - audpp_adec_free(audio->dec_id); - kfree(audio); - goto done; - } - audio->data = audio->map_v_write->vaddr; - MM_DBG("write buf: phy addr 0x%08x kernel addr \ - 0x%08x\n", audio->phys, (int)audio->data); - break; - } else if (pmem_sz == DMASZ_MIN) { - MM_ERR("could not allocate write buffers, freeing \ - instance 0x%08x\n", (int)audio); - rc = -ENOMEM; - audpp_adec_free(audio->dec_id); - kfree(audio); - goto done; - } else - pmem_sz >>= 1; + client = msm_ion_client_create(UINT_MAX, "Audio_WMA_Client"); + if (IS_ERR_OR_NULL(client)) { + pr_err("Unable to create ION client\n"); + rc = -ENOMEM; + goto client_create_error; + } + audio->client = client; + + handle = ion_alloc(client, mem_sz, 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); + goto output_buff_get_phys_error; + } else { + MM_INFO("O/P buffers:valid phy: %x sz: %x\n", + (unsigned int) addr, (unsigned int) len); } - audio->out_dma_sz = pmem_sz; + 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"); + goto output_buff_get_flags_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 output_buff_map_error; + } + audio->data = (char *)audio->map_v_write; + MM_DBG("write buf: phy addr 0x%08x kernel addr 0x%08x\n", + audio->phys, (int)audio->data); + + audio->out_dma_sz = mem_sz; rc = msm_adsp_get(audio->module_name, &audio->audplay, &audplay_adsp_ops_wma, audio); @@ -1771,8 +1824,14 @@ done: event_err: msm_adsp_put(audio->audplay); err: - msm_subsystem_unmap_buffer(audio->map_v_write); - free_contiguous_memory_by_paddr(audio->phys); + 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: audpp_adec_free(audio->dec_id); kfree(audio); return rc;