static long acdb_ioctl(struct file *f, unsigned int cmd, unsigned long arg) { int32_t result = 0; int32_t size; int32_t pmem_fd; uint32_t topology; struct cal_block data[MAX_NETWORKS]; pr_debug("%s\n", __func__); switch (cmd) { case AUDIO_REGISTER_PMEM: pr_debug("AUDIO_REGISTER_PMEM\n"); if (atomic_read(&acdb_data.pmem_fd)) { deregister_pmem(); pr_debug("Remove the existing PMEM\n"); } if (copy_from_user(&pmem_fd, (void *)arg, sizeof(pmem_fd))) { pr_err("%s: fail to copy pmem handle!\n", __func__); result = -EFAULT; } else { atomic_set(&acdb_data.pmem_fd, pmem_fd); result = register_pmem(); } goto done; case AUDIO_DEREGISTER_PMEM: pr_debug("AUDIO_DEREGISTER_PMEM\n"); deregister_pmem(); goto done; case AUDIO_SET_VOICE_RX_TOPOLOGY: if (copy_from_user(&topology, (void *)arg, sizeof(topology))) { pr_err("%s: fail to copy topology!\n", __func__); result = -EFAULT; } store_voice_rx_topology(topology); goto done; case AUDIO_SET_VOICE_TX_TOPOLOGY: if (copy_from_user(&topology, (void *)arg, sizeof(topology))) { pr_err("%s: fail to copy topology!\n", __func__); result = -EFAULT; } store_voice_tx_topology(topology); goto done; case AUDIO_SET_ADM_RX_TOPOLOGY: if (copy_from_user(&topology, (void *)arg, sizeof(topology))) { pr_err("%s: fail to copy topology!\n", __func__); result = -EFAULT; } store_adm_rx_topology(topology); goto done; case AUDIO_SET_ADM_TX_TOPOLOGY: if (copy_from_user(&topology, (void *)arg, sizeof(topology))) { pr_err("%s: fail to copy topology!\n", __func__); result = -EFAULT; } store_adm_tx_topology(topology); goto done; case AUDIO_SET_ASM_TOPOLOGY: if (copy_from_user(&topology, (void *)arg, sizeof(topology))) { pr_err("%s: fail to copy topology!\n", __func__); result = -EFAULT; } store_asm_topology(topology); goto done; } if (copy_from_user(&size, (void *) arg, sizeof(size))) { result = -EFAULT; goto done; } if (size <= 0) { pr_err("%s: Invalid size sent to driver: %d\n", __func__, size); result = -EFAULT; goto done; } if (copy_from_user(data, (void *)(arg + sizeof(size)), size)) { pr_err("%s: fail to copy table size %d\n", __func__, size); result = -EFAULT; goto done; } if (data == NULL) { pr_err("%s: NULL pointer sent to driver!\n", __func__); result = -EFAULT; goto done; } switch (cmd) { case AUDIO_SET_AUDPROC_TX_CAL: if (size > sizeof(struct cal_block)) pr_err("%s: More Audproc Cal then expected, " "size received: %d\n", __func__, size); store_audproc_cal(TX_CAL, data); break; case AUDIO_SET_AUDPROC_RX_CAL: if (size > sizeof(struct cal_block)) pr_err("%s: More Audproc Cal then expected, " "size received: %d\n", __func__, size); store_audproc_cal(RX_CAL, data); break; case AUDIO_SET_AUDPROC_TX_STREAM_CAL: if (size > sizeof(struct cal_block)) pr_err("%s: More Audproc Cal then expected, " "size received: %d\n", __func__, size); store_audstrm_cal(TX_CAL, data); break; case AUDIO_SET_AUDPROC_RX_STREAM_CAL: if (size > sizeof(struct cal_block)) pr_err("%s: More Audproc Cal then expected, " "size received: %d\n", __func__, size); store_audstrm_cal(RX_CAL, data); break; case AUDIO_SET_AUDPROC_TX_VOL_CAL: if (size > sizeof(struct cal_block)) pr_err("%s: More Audproc Cal then expected, " "size received: %d\n", __func__, size); store_audvol_cal(TX_CAL, data); break; case AUDIO_SET_AUDPROC_RX_VOL_CAL: if (size > sizeof(struct cal_block)) pr_err("%s: More Audproc Cal then expected, " "size received: %d\n", __func__, size); store_audvol_cal(RX_CAL, data); break; case AUDIO_SET_AFE_TX_CAL: if (size > sizeof(struct cal_block)) pr_err("%s: More AFE Cal then expected, " "size received: %d\n", __func__, size); store_afe_cal(TX_CAL, data); break; case AUDIO_SET_AFE_RX_CAL: if (size > sizeof(struct cal_block)) pr_err("%s: More AFE Cal then expected, " "size received: %d\n", __func__, size); store_afe_cal(RX_CAL, data); break; case AUDIO_SET_VOCPROC_CAL: store_vocproc_cal(size / sizeof(struct cal_block), data); break; case AUDIO_SET_VOCPROC_STREAM_CAL: store_vocstrm_cal(size / sizeof(struct cal_block), data); break; case AUDIO_SET_VOCPROC_VOL_CAL: store_vocvol_cal(size / sizeof(struct cal_block), data); break; case AUDIO_SET_SIDETONE_CAL: if (size > sizeof(struct sidetone_cal)) pr_err("%s: More sidetone cal then expected, " "size received: %d\n", __func__, size); store_sidetone_cal((struct sidetone_cal *)data); break; case AUDIO_SET_ANC_CAL: store_anc_cal(data); break; default: pr_err("ACDB=> ACDB ioctl not found!\n"); } done: return result; }
static long acdb_ioctl(struct file *f, unsigned int cmd, unsigned long arg) { s32 result = 0; s32 audproc_path; s32 size; struct cal_block data[MAX_NETWORKS]; pr_debug("%s\n", __func__); switch (cmd) { case AUDIO_REGISTER_PMEM: pr_debug("AUDIO_REGISTER_PMEM\n"); mutex_lock(&acdb_data.acdb_mutex); if (acdb_data.pmem_fd) { deregister_pmem(); pr_aud_info("Remove the existing PMEM\n"); } if (copy_from_user(&acdb_data.pmem_fd, (void *)arg, sizeof(acdb_data.pmem_fd))) result = -EFAULT; else result = register_pmem(); mutex_unlock(&acdb_data.acdb_mutex); goto done; case AUDIO_DEREGISTER_PMEM: pr_debug("AUDIO_DEREGISTER_PMEM\n"); mutex_lock(&acdb_data.acdb_mutex); deregister_pmem(); mutex_unlock(&acdb_data.acdb_mutex); goto done; } if (copy_from_user(&size, (void *) arg, sizeof(size))) { result = -EFAULT; goto done; } if (size <= 0) { pr_aud_err("%s: Invalid size sent to driver: %d\n", __func__, size); result = -EFAULT; goto done; } if (copy_from_user(data, (void *)(arg + sizeof(size)), size)) { pr_aud_err("%s: fail to copy table size %d\n", __func__, size); result = -EFAULT; goto done; } if (data == NULL) { pr_aud_err("%s: NULL pointer sent to driver!\n", __func__); result = -EFAULT; goto done; } switch (cmd) { case AUDIO_SET_AUDPROC_TX_CAL: audproc_path = TX_CAL; if (size > sizeof(struct cal_block)) pr_aud_err("%s: More Audproc Cal then expected, " "size received: %d\n", __func__, size); store_audproc_cal(audproc_path, data); break; case AUDIO_SET_AUDPROC_RX_CAL: audproc_path = RX_CAL; if (size > sizeof(struct cal_block)) pr_aud_err("%s: More Audproc Cal then expected, " "size received: %d\n", __func__, size); store_audproc_cal(audproc_path, data); break; case AUDIO_SET_AUDPROC_TX_STREAM_CAL: audproc_path = TX_CAL; if (size > sizeof(struct cal_block)) pr_aud_err("%s: More Audproc Cal then expected, " "size received: %d\n", __func__, size); store_audstrm_cal(audproc_path, data); break; case AUDIO_SET_AUDPROC_RX_STREAM_CAL: audproc_path = RX_CAL; if (size > sizeof(struct cal_block)) pr_aud_err("%s: More Audproc Cal then expected, " "size received: %d\n", __func__, size); store_audstrm_cal(audproc_path, data); break; case AUDIO_SET_AUDPROC_TX_VOL_CAL: audproc_path = TX_CAL; if (size > sizeof(struct cal_block)) pr_aud_err("%s: More Audproc Cal then expected, " "size received: %d\n", __func__, size); store_audvol_cal(audproc_path, data); case AUDIO_SET_AUDPROC_RX_VOL_CAL: audproc_path = RX_CAL; if (size > sizeof(struct cal_block)) pr_aud_err("%s: More Audproc Cal then expected, " "size received: %d\n", __func__, size); store_audvol_cal(audproc_path, data); break; case AUDIO_SET_VOCPROC_CAL: store_vocproc_cal(size / sizeof(struct cal_block), data); break; case AUDIO_SET_VOCPROC_STREAM_CAL: store_vocstrm_cal(size / sizeof(struct cal_block), data); break; case AUDIO_SET_VOCPROC_VOL_CAL: store_vocvol_cal(size / sizeof(struct cal_block), data); break; case AUDIO_SET_SIDETONE_CAL: if (size > sizeof(struct sidetone_cal)) pr_aud_err("%s: More sidetone cal then expected, " "size received: %d\n", __func__, size); store_sidetone_cal((struct sidetone_cal *)data); break; case AUDIO_SET_ANC_CAL: store_anc_cal(data); break; default: pr_aud_err("ACDB=> ACDB ioctl not found!\n"); } done: return result; }