static int msm8k_amr_ioctl(struct inode *inode, struct file *f, unsigned int cmd, unsigned long arg) { int rc = CAD_RES_SUCCESS; struct amr *p = f->private_data; void *cad_arg = (void *)arg; u32 stream_device[1]; struct cad_device_struct_type cad_dev; struct cad_stream_device_struct_type cad_stream_dev; struct cad_stream_info_struct_type cad_stream_info; struct cad_amr_format cad_amr_fmt; struct cad_flt_cfg_strm_vol cad_strm_volume; struct cad_filter_struct flt; u32 percentage; D("%s\n", __func__); memset(&cad_dev, 0, sizeof(struct cad_device_struct_type)); memset(&cad_stream_dev, 0, sizeof(struct cad_stream_device_struct_type)); memset(&cad_stream_info, 0, sizeof(struct cad_stream_info_struct_type)); memset(&cad_amr_fmt, 0, sizeof(struct cad_amr_format)); memset(&flt, 0, sizeof(struct cad_filter_struct)); switch (cmd) { case AUDIO_START: cad_stream_info.app_type = CAD_STREAM_APP_PLAYBACK; cad_stream_info.priority = 0; cad_stream_info.buf_mem_type = CAD_STREAM_BUF_MEM_HEAP; cad_stream_info.ses_buf_max_size = 1024 * 11; rc = cad_ioctl(p->cad_w_handle, CAD_IOCTL_CMD_SET_STREAM_INFO, &cad_stream_info, sizeof(struct cad_stream_info_struct_type)); if (rc) { pr_err("cad_ioctl() SET_STREAM_INFO failed\n"); break; } rc = cad_ioctl(p->cad_w_handle, CAD_IOCTL_CMD_SET_STREAM_CONFIG, &cad_amr_fmt, sizeof(struct cad_amr_format)); if (rc) { pr_err("cad_ioctl() SET_STREAM_CONFIG failed\n"); break; } stream_device[0] = CAD_HW_DEVICE_ID_DEFAULT_RX; cad_stream_dev.device = (u32 *)&stream_device[0]; cad_stream_dev.device_len = 1; rc = cad_ioctl(p->cad_w_handle, CAD_IOCTL_CMD_SET_STREAM_DEVICE, &cad_stream_dev, sizeof(struct cad_stream_device_struct_type)); if (rc) { pr_err("cad_ioctl() SET_STREAM_DEVICE failed\n"); break; } rc = cad_ioctl(p->cad_w_handle, CAD_IOCTL_CMD_STREAM_START, NULL, 0); if (rc) { pr_err("cad_ioctl() STREAM_START failed\n"); break; } break; case AUDIO_STOP: rc = cad_ioctl(p->cad_w_handle, CAD_IOCTL_CMD_STREAM_PAUSE, cad_arg, sizeof(u32)); break; case AUDIO_FLUSH: rc = cad_ioctl(p->cad_w_handle, CAD_IOCTL_CMD_STREAM_FLUSH, cad_arg, sizeof(u32)); break; case AUDIO_GET_CONFIG: if (copy_to_user((void *)arg, &p->cfg, sizeof(struct msm_audio_config))) return -EFAULT; break; case AUDIO_SET_CONFIG: rc = copy_from_user(&p->cfg, (void *)arg, sizeof(struct msm_audio_config)); break; case AUDIO_SET_VOLUME: rc = copy_from_user(&percentage, (void *)arg, sizeof(u32)); p->volume = qdsp6_stream_volume_mapping(percentage); memset(&cad_strm_volume, 0, sizeof(struct cad_flt_cfg_strm_vol)); cad_strm_volume.volume = p->volume; flt.filter_type = CAD_DEVICE_FILTER_TYPE_VOL; flt.format_block = &cad_strm_volume; flt.cmd = CAD_FILTER_CONFIG_STREAM_VOLUME; flt.format_block_len = sizeof(struct cad_flt_cfg_strm_vol); rc = cad_ioctl(p->cad_w_handle, CAD_IOCTL_CMD_SET_STREAM_FILTER_CONFIG, &flt, sizeof(struct cad_stream_filter_struct_type)); if (rc) { pr_err("cad_ioctl() set volume failed\n"); break; } break; default: rc = -EINVAL; } return rc; }
static int msm8k_mp3_ioctl(struct inode *inode, struct file *f, unsigned int cmd, unsigned long arg) { int rc; struct msm_audio_config cfg; struct mp3 *p = f->private_data; void *cad_arg = (void *)arg; u32 stream_device[1]; struct cad_device_struct_type cad_dev; struct cad_stream_device_struct_type cad_stream_dev; struct cad_stream_info_struct_type cad_stream_info; struct cad_write_mp3_format_struct_type cad_write_mp3_fmt; struct cad_flt_cfg_strm_vol cad_strm_volume; struct cad_filter_struct flt; struct cad_event_struct_type eos_event; struct cad_audio_eq_cfg eq; u32 percentage; D("%s\n", __func__); memset(&cad_dev, 0, sizeof(struct cad_device_struct_type)); memset(&cad_stream_dev, 0, sizeof(struct cad_stream_device_struct_type)); memset(&cad_stream_info, 0, sizeof(struct cad_stream_info_struct_type)); memset(&cad_write_mp3_fmt, 0, sizeof(struct cad_write_mp3_format_struct_type)); memset(&cfg, 0, sizeof(struct msm_audio_config)); memset(&flt, 0, sizeof(struct cad_filter_struct)); switch (cmd) { case AUDIO_START: cad_stream_info.app_type = CAD_STREAM_APP_PLAYBACK; cad_stream_info.priority = 0; cad_stream_info.buf_mem_type = CAD_STREAM_BUF_MEM_HEAP; cad_stream_info.ses_buf_max_size = 1024 * 11; rc = cad_ioctl(p->cad_w_handle, CAD_IOCTL_CMD_SET_STREAM_INFO, &cad_stream_info, sizeof(struct cad_stream_info_struct_type)); if (rc) { pr_err("cad_ioctl() SET_STREAM_INFO failed\n"); break; } cad_write_mp3_fmt.ver_id = CAD_WRITE_MP3_VERSION_10; rc = cad_ioctl(p->cad_w_handle, CAD_IOCTL_CMD_SET_STREAM_CONFIG, &cad_write_mp3_fmt, sizeof(struct cad_write_mp3_format_struct_type)); if (rc) { pr_err("cad_ioctl() SET_STREAM_CONFIG failed\n"); break; } eos_event.callback = &msm8k_mp3_eos_event_cb; eos_event.client_data = p; rc = cad_ioctl(p->cad_w_handle, CAD_IOCTL_CMD_SET_STREAM_EVENT_LSTR, &eos_event, sizeof(struct cad_event_struct_type)); if (rc) { D("cad_ioctl() SET_STREAM_EVENT_LSTR failed\n"); break; } stream_device[0] = CAD_HW_DEVICE_ID_DEFAULT_RX; cad_stream_dev.device = (u32 *)&stream_device[0]; cad_stream_dev.device_len = 1; rc = cad_ioctl(p->cad_w_handle, CAD_IOCTL_CMD_SET_STREAM_DEVICE, &cad_stream_dev, sizeof(struct cad_stream_device_struct_type)); if (rc) { pr_err("cad_ioctl() SET_STREAM_DEVICE failed\n"); break; } rc = cad_ioctl(p->cad_w_handle, CAD_IOCTL_CMD_STREAM_START, NULL, 0); if (rc) { pr_err("cad_ioctl() STREAM_START failed\n"); break; } break; case AUDIO_STOP: rc = cad_ioctl(p->cad_w_handle, CAD_IOCTL_CMD_STREAM_PAUSE, NULL, 0); break; case AUDIO_FLUSH: p->flush_rcvd = 1; rc = cad_ioctl(p->cad_w_handle, CAD_IOCTL_CMD_STREAM_FLUSH, NULL, 0); wake_up(&p->eos_wait); p->flush_rcvd = 0; break; case AUDIO_GET_CONFIG: /* hard-coded until we support this in the CAD */ cfg.buffer_size = 4096; cfg.buffer_count = 2; cfg.channel_count = 1; cfg.sample_rate = 48000; if (copy_to_user((void *)arg, &cfg, sizeof(struct msm_audio_config))) return -EFAULT; rc = CAD_RES_SUCCESS; break; case AUDIO_SET_CONFIG: rc = cad_ioctl(p->cad_w_handle, CAD_IOCTL_CMD_SET_STREAM_CONFIG, cad_arg, sizeof(u32)); break; case AUDIO_SET_VOLUME: rc = copy_from_user(&percentage, (void *)arg, sizeof(u32)); p->volume = qdsp6_stream_volume_mapping(percentage); memset(&cad_strm_volume, 0, sizeof(struct cad_flt_cfg_strm_vol)); cad_strm_volume.volume = p->volume; flt.filter_type = CAD_DEVICE_FILTER_TYPE_VOL; flt.format_block = &cad_strm_volume; flt.cmd = CAD_FILTER_CONFIG_STREAM_VOLUME; flt.format_block_len = sizeof(struct cad_flt_cfg_strm_vol); rc = cad_ioctl(p->cad_w_handle, CAD_IOCTL_CMD_SET_STREAM_FILTER_CONFIG, &flt, sizeof(struct cad_filter_struct)); if (rc) { pr_err("cad_ioctl() set volume failed\n"); break; } break; case AUDIO_SET_EQ: rc = copy_from_user(&eq, (void *)arg, sizeof(struct cad_audio_eq_cfg)); flt.filter_type = CAD_DEVICE_FILTER_TYPE_EQ; flt.cmd = CAD_FILTER_EQ_STREAM_CONFIG; flt.format_block_len = sizeof(struct cad_audio_eq_cfg); flt.format_block = &eq; rc = cad_ioctl(p->cad_w_handle, CAD_IOCTL_CMD_SET_STREAM_FILTER_CONFIG, &flt, sizeof(struct cad_filter_struct)); if (rc) pr_err("cad_ioctl() set equalizer failed\n"); break; default: rc = -EINVAL; } return rc; }