mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-09 20:32:04 +09:00
audio: audio info for audio license query
PD#147297: audio: audio license query driver Change-Id: I9a9db1c33c372bc58130a1c41addfd80303a5625 Signed-off-by: Xing Wang <xing.wang@amlogic.com> Signed-off-by: Matthew Shyu <matthew.shyu@amlogic.com>
This commit is contained in:
12
MAINTAINERS
12
MAINTAINERS
@@ -13536,6 +13536,7 @@ F: drivers/amlogic/pwm/*
|
||||
F: include/linux/amlogic/pwm_meson.h
|
||||
F: include/dt-bindings/pwm/meosn.h
|
||||
F: arch/arm64/boot/dts/amlogic/gxl_p212_2g.dts
|
||||
F: arch/arm64/boot/dts/amlogic/gxl_p230_2g.dts
|
||||
F: arch/arm64/boot/dts/amlogic/gxm_q200_2g.dts
|
||||
|
||||
AMLOGIC multimedia
|
||||
@@ -13583,6 +13584,7 @@ F: drivers/amlogic/media/Kconfig
|
||||
F: drivers/amlogic/media/Makefile
|
||||
F: arch/arm64/boot/dts/amlogic/gxl_p212_1g.dts
|
||||
F: arch/arm64/boot/dts/amlogic/gxl_p212_2g.dts
|
||||
F: arch/arm64/boot/dts/amlogic/gxl_p230_2g.dts
|
||||
F: arch/arm64/boot/dts/amlogic/gxm_q200_2g.dts
|
||||
F: drivers/amlogic/clk/clk_media.c
|
||||
F: include/linux/amlogic/media/vout/vout_notify.h
|
||||
@@ -13637,6 +13639,7 @@ AMLOGIC TVIN
|
||||
M: Dezhi Kong <dezhi.kong@amlogic.com>
|
||||
F: arch/arm64/boot/dts/amlogic/gxl_p212_1g.dts
|
||||
F: arch/arm64/boot/dts/amlogic/gxl_p212_2g.dts
|
||||
F: arch/arm64/boot/dts/amlogic/gxl_p230_2g.dts
|
||||
F: arch/arm64/boot/dts/amlogic/gxm_q200_2g.dts
|
||||
F: arch/arm64/boot/dts/amlogic/gxm_skt.dts
|
||||
F: arch/arm64/configs/meson64_defconfig
|
||||
@@ -13666,6 +13669,7 @@ AMLOGIC key_manage
|
||||
M: Nan Li <nan.li@amlogic.com>
|
||||
F: arch/arm64/boot/dts/amlogic/gxl_p212_1g.dts
|
||||
F: arch/arm64/boot/dts/amlogic/gxl_p212_2g.dts
|
||||
F: arch/arm64/boot/dts/amlogic/gxl_p230_2g.dts
|
||||
F: arch/arm64/boot/dts/amlogic/gxm_q200_2g.dts
|
||||
F: arch/arm64/configs/meson64_defconfig
|
||||
F: drivers/amlogic/Kconfig
|
||||
@@ -13707,6 +13711,7 @@ ANLOGIC AUDIO
|
||||
M: Xing Wang <xing.wang@amlogic.com>
|
||||
F: arch/arm64/boot/dts/amlogic/gxl_p212_1g.dts
|
||||
F: arch/arm64/boot/dts/amlogic/gxl_p212_2g.dts
|
||||
F: arch/arm64/boot/dts/amlogic/gxl_p230_2g.dts
|
||||
F: arch/arm64/boot/dts/amlogic/gxm_q200_2g.dts
|
||||
F: arch/arm64/boot/dts/amlogic/gxm_skt.dts
|
||||
F: arch/arm64/boot/dts/amlogic/mesongxl.dtsi
|
||||
@@ -13732,6 +13737,7 @@ AMLOGIC PPMGR DRIVER
|
||||
M: Guosong Zhou <guosong.zhou@amlogic.com>
|
||||
F: arch/arm64/boot/dts/amlogic/gxl_p212_1g.dts
|
||||
F: arch/arm64/boot/dts/amlogic/gxl_p212_2g.dts
|
||||
F: arch/arm64/boot/dts/amlogic/gxl_p230_2g.dts
|
||||
F: arch/arm64/boot/dts/amlogic/gxm_q200_2g.dts
|
||||
F: arch/arm64/boot/dts/amlogic/gxl_p400_2g.dts
|
||||
F: arch/arm64/boot/dts/amlogic/gxm_p401_2g.dts
|
||||
@@ -13788,6 +13794,7 @@ AMLOGIC IONVIDEO DRIVER
|
||||
M: Guosong Zhou <guosong.zhou@amlogic.com>
|
||||
F: arch/arm64/boot/dts/amlogic/gxl_p212_1g.dts
|
||||
F: arch/arm64/boot/dts/amlogic/gxl_p212_2g.dts
|
||||
F: arch/arm64/boot/dts/amlogic/gxl_p230_2g.dts
|
||||
F: arch/arm64/boot/dts/amlogic/gxm_q200_2g.dts
|
||||
F: arch/arm64/boot/dts/amlogic/gxl_p400_2g.dts
|
||||
F: arch/arm64/boot/dts/amlogic/gxm_p401_2g.dts
|
||||
@@ -13860,6 +13867,7 @@ F: arch/arm/boot/dts/amlogic/meson8b_m200.dts
|
||||
F: arch/arm/configs/meson32_defconfig
|
||||
F: arch/arm64/boot/dts/amlogic/gxl_p212_1g.dts
|
||||
F: arch/arm64/boot/dts/amlogic/gxl_p212_2g.dts
|
||||
F: arch/arm64/boot/dts/amlogic/gxl_p230_2g.dts
|
||||
F: arch/arm64/boot/dts/amlogic/gxl_p400_2g.dts
|
||||
F: arch/arm64/boot/dts/amlogic/gxl_p401_2g.dts
|
||||
F: arch/arm64/boot/dts/amlogic/gxm_q200_2g.dts
|
||||
@@ -13981,3 +13989,7 @@ M: jiaxing.ye <jiaxing.ye@amlogic.com>
|
||||
F: driver/amlogic/ddr_window/Makefile
|
||||
F: driver/amlogic/ddr_window/ddr_window.c
|
||||
F: driver/amlogic/ddr_window/Kconfig
|
||||
|
||||
AMLOGIC AUDIO INFO
|
||||
M: wang xing <xing.wang@amlogic.com>
|
||||
F: drivers/amlogic/audioinfo/
|
||||
|
||||
@@ -1180,7 +1180,9 @@
|
||||
&efuse {
|
||||
status = "ok";
|
||||
};
|
||||
|
||||
&audio_data{
|
||||
status = "okay";
|
||||
};
|
||||
&spicc{
|
||||
status = "disabled";
|
||||
pinctrl-names = "spicc_pulldown","spicc_pullup";
|
||||
|
||||
@@ -1180,3 +1180,6 @@
|
||||
&efuse {
|
||||
status = "ok";
|
||||
};
|
||||
&audio_data{
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
1174
arch/arm64/boot/dts/amlogic/gxl_p230_2g.dts
Normal file
1174
arch/arm64/boot/dts/amlogic/gxl_p230_2g.dts
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1197,7 +1197,9 @@
|
||||
&efuse {
|
||||
status = "ok";
|
||||
};
|
||||
|
||||
&audio_data{
|
||||
status = "okay";
|
||||
};
|
||||
&i2c_b {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
@@ -1010,6 +1010,12 @@ i2c_ao: i2c@c8100500{ /*I2C-AO*/
|
||||
reg = <0x0 0xc883e000 0x0 0x28>;
|
||||
};
|
||||
|
||||
audio_data:audio_data {
|
||||
compatible = "amlogic, audio_data";
|
||||
query_licence_cmd = <0x82000050>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
saradc: saradc {
|
||||
compatible = "amlogic,meson-gxl-saradc";
|
||||
status = "okay";
|
||||
|
||||
@@ -1138,6 +1138,12 @@
|
||||
reg = <0x0 0xc883e000 0x0 0x28>;
|
||||
};
|
||||
|
||||
audio_data:audio_data {
|
||||
compatible = "amlogic, audio_data";
|
||||
query_licence_cmd = <0x82000050>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
saradc: saradc {
|
||||
compatible = "amlogic,meson-gxl-saradc";
|
||||
status = "okay";
|
||||
|
||||
@@ -258,6 +258,7 @@ CONFIG_AMLOGIC_CPUCORE_THERMAL=y
|
||||
CONFIG_AMLOGIC_GPU_THERMAL=y
|
||||
CONFIG_AMLOGIC_GPUCORE_THERMAL=y
|
||||
CONFIG_AMLOGIC_AUDIO_DSP=y
|
||||
CONFIG_AMLOGIC_AUDIO_INFO=y
|
||||
CONFIG_AMLOGIC_SUSPEND=y
|
||||
CONFIG_AMLOGIC_GX_SUSPEND=y
|
||||
CONFIG_AMLOGIC_LEGACY_EARLY_SUSPEND=y
|
||||
|
||||
@@ -82,6 +82,8 @@ source "drivers/amlogic/thermal/Kconfig"
|
||||
|
||||
source "drivers/amlogic/audiodsp/Kconfig"
|
||||
|
||||
source "drivers/amlogic/audioinfo/Kconfig"
|
||||
|
||||
source "drivers/amlogic/pm/Kconfig"
|
||||
|
||||
source "drivers/amlogic/led/Kconfig"
|
||||
|
||||
@@ -68,6 +68,8 @@ obj-$(CONFIG_AMLOGIC_TEMP_SENSOR) += thermal/
|
||||
|
||||
obj-$(CONFIG_AMLOGIC_AUDIO_DSP) += audiodsp/
|
||||
|
||||
obj-$(CONFIG_AMLOGIC_AUDIO_INFO) += audioinfo/
|
||||
|
||||
obj-$(CONFIG_AMLOGIC_SUSPEND) += pm/
|
||||
|
||||
obj-$(CONFIG_AMLOGIC_LED) += led/
|
||||
|
||||
11
drivers/amlogic/audioinfo/Kconfig
Normal file
11
drivers/amlogic/audioinfo/Kconfig
Normal file
@@ -0,0 +1,11 @@
|
||||
# audio info configuration
|
||||
#
|
||||
menu "AMLOGIC Audio Info"
|
||||
|
||||
config AMLOGIC_AUDIO_INFO
|
||||
tristate "audio info"
|
||||
default n
|
||||
help
|
||||
support the amlogic audio info;
|
||||
|
||||
endmenu
|
||||
1
drivers/amlogic/audioinfo/Makefile
Normal file
1
drivers/amlogic/audioinfo/Makefile
Normal file
@@ -0,0 +1 @@
|
||||
obj-$(CONFIG_AMLOGIC_AUDIO_INFO) += audio_data.o
|
||||
295
drivers/amlogic/audioinfo/audio_data.c
Normal file
295
drivers/amlogic/audioinfo/audio_data.c
Normal file
@@ -0,0 +1,295 @@
|
||||
/*
|
||||
* drivers/amlogic/audioinfo/audio_data.c
|
||||
*
|
||||
* Copyright (C) 2017 Amlogic, Inc. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/uaccess.h>
|
||||
#include "../efuse/efuse.h"
|
||||
#include <linux/delay.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/slab.h>
|
||||
#include "audio_data.h"
|
||||
|
||||
#ifdef CONFIG_MESON_TRUSTZONE
|
||||
#include <mach/meson-secure.h>
|
||||
#endif
|
||||
#include <linux/amlogic/secmon.h>
|
||||
/*#define MYPRT pr_info*/
|
||||
#define MYPRT(...)
|
||||
/* major device number and minor device number */
|
||||
static int major_audio_data;
|
||||
/* device class and device var */
|
||||
static struct class *class_audio_data;
|
||||
static struct device *dev_audio_data;
|
||||
void __iomem *sharemem_input;/*used as input and output memory, may not ok*/
|
||||
unsigned int efuse_query_licence_cmd;
|
||||
|
||||
static int audio_data_open(struct inode *inode, struct file *filp);
|
||||
static int audio_data_release(struct inode *inode, struct file *filp);
|
||||
static ssize_t audio_data_read(struct file *filp, char __user *buf,
|
||||
size_t count, loff_t *f_pos);
|
||||
static ssize_t audio_data_write(struct file *filp, const char __user *buf,
|
||||
size_t count, loff_t *f_pos);
|
||||
|
||||
/* device operation methods chart */
|
||||
static struct file_operations const audio_data_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.open = audio_data_open,
|
||||
.release = audio_data_release,
|
||||
.read = audio_data_read,
|
||||
.write = audio_data_write,
|
||||
/* .unlocked_ioctl = audio_data_ioctl, */
|
||||
};
|
||||
|
||||
|
||||
int meson_efuse_fn_smc_query_audioinfo(struct efuse_hal_api_arg *arg)
|
||||
{
|
||||
int ret;
|
||||
unsigned int cmd, offset, size;
|
||||
unsigned long *retcnt;
|
||||
|
||||
register unsigned x0 asm("x0");
|
||||
register unsigned x1 asm("x1");
|
||||
register unsigned x2 asm("x2");
|
||||
register unsigned x3 asm("x3");
|
||||
|
||||
if (!arg)
|
||||
return -1;
|
||||
if (!sharemem_input)
|
||||
return -1;
|
||||
|
||||
retcnt = (unsigned long *)(arg->retcnt);
|
||||
cmd = arg->cmd;
|
||||
offset = arg->offset;
|
||||
size = arg->size;
|
||||
|
||||
/*write data*/
|
||||
memcpy((void *)sharemem_input, (const void *)arg->buffer, size);
|
||||
|
||||
asm __volatile__("" : : : "memory");
|
||||
x0 = cmd;
|
||||
x1 = offset;
|
||||
x2 = size;
|
||||
x3 = 0;
|
||||
|
||||
do {
|
||||
asm volatile(
|
||||
__asmeq("%0", "x0")
|
||||
__asmeq("%1", "x0")
|
||||
__asmeq("%2", "x1")
|
||||
__asmeq("%3", "x2")
|
||||
__asmeq("%4", "x3")
|
||||
"smc #0\n"
|
||||
: "=r"(x0)
|
||||
: "r"(x0), "r"(x1), "r"(x2), "r"(x3));
|
||||
} while (0);
|
||||
ret = x0;
|
||||
*retcnt = x0;
|
||||
MYPRT("[%s %d]ret/%d\n", __func__, __LINE__, ret);
|
||||
|
||||
if (ret == 0) {
|
||||
memset((void *)arg->buffer, 0, arg->size);
|
||||
memcpy((void *)arg->buffer,
|
||||
(const void *)sharemem_input, arg->size);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
int meson_trustzone_audio_info_get(struct efuse_hal_api_arg *arg)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (!arg)
|
||||
return -1;
|
||||
set_cpus_allowed_ptr(current, cpumask_of(0));
|
||||
ret = meson_efuse_fn_smc_query_audioinfo(arg);
|
||||
set_cpus_allowed_ptr(current, cpu_all_mask);
|
||||
return ret;
|
||||
}
|
||||
|
||||
unsigned long audio_info_get(char *buf, unsigned long count,
|
||||
unsigned long pos)
|
||||
{
|
||||
struct efuse_hal_api_arg arg;
|
||||
unsigned int retcnt;
|
||||
int ret;
|
||||
|
||||
arg.cmd = efuse_query_licence_cmd;
|
||||
arg.offset = pos;
|
||||
arg.size = count;
|
||||
arg.buffer = (unsigned long)buf;
|
||||
arg.retcnt = (unsigned long)&retcnt;
|
||||
|
||||
sharemem_input = get_secmon_sharemem_input_base();
|
||||
ret = meson_trustzone_audio_info_get(&arg);
|
||||
|
||||
if (ret == 0)
|
||||
MYPRT("[%s %d]: get licence!!!\n", __func__, __LINE__);
|
||||
else
|
||||
MYPRT("[%s:%d]: read error!!!\n", __func__, __LINE__);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
#define EFUSE_BUF_SIZE 1024
|
||||
/* open device methods */
|
||||
static int audio_data_open(struct inode *inode, struct file *filp)
|
||||
{
|
||||
MYPRT("[%s]\n", __func__);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* device file release */
|
||||
static int audio_data_release(struct inode *inode, struct file *filp)
|
||||
{
|
||||
MYPRT("[%s]\n", __func__);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/* read device reg val */
|
||||
static ssize_t audio_data_read(struct file *filp, char __user *buf,
|
||||
size_t count, loff_t *f_pos)
|
||||
{
|
||||
int err = 0;
|
||||
loff_t pos = 0;
|
||||
char buftmp[EFUSE_BUF_SIZE] = {0};
|
||||
|
||||
MYPRT("[%s]\n", __func__);
|
||||
if (count > EFUSE_BUF_SIZE) {
|
||||
MYPRT("[%s %d]buffer is too small\n", __func__, __LINE__);
|
||||
err = -1;
|
||||
} else{
|
||||
err = copy_from_user(buftmp, buf, count);
|
||||
if (!err) {
|
||||
err = audio_info_get(buftmp, count, pos);
|
||||
if (!err) {
|
||||
MYPRT("[%s %d]copy data to user (count/%d)\n",
|
||||
__func__, __LINE__, (int)count);
|
||||
err = copy_to_user(buf, buftmp, count);
|
||||
} else{
|
||||
err = -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!err)
|
||||
return count;
|
||||
else
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* write device reg val */
|
||||
static ssize_t audio_data_write(struct file *filp, const char __user *buf,
|
||||
size_t count, loff_t *f_pos)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int audio_data_probe(struct platform_device *pdev)
|
||||
{
|
||||
void *ptr_err;
|
||||
|
||||
major_audio_data = register_chrdev(0,
|
||||
AUDIO_DATA_DEVICE_NODE_NAME,
|
||||
&audio_data_fops);
|
||||
if (major_audio_data < 0) {
|
||||
MYPRT("Registering audio_data char device %s failed with %d\n",
|
||||
AUDIO_DATA_DEVICE_NODE_NAME, major_audio_data);
|
||||
return major_audio_data;
|
||||
}
|
||||
class_audio_data = class_create(THIS_MODULE,
|
||||
AUDIO_DATA_DEVICE_NODE_NAME);
|
||||
ptr_err = class_audio_data;
|
||||
if (IS_ERR(ptr_err))
|
||||
goto err0;
|
||||
|
||||
dev_audio_data = device_create(class_audio_data, NULL,
|
||||
MKDEV(major_audio_data, 0),
|
||||
NULL, AUDIO_DATA_DEVICE_NODE_NAME);
|
||||
ptr_err = dev_audio_data;
|
||||
if (IS_ERR(ptr_err))
|
||||
goto err1;
|
||||
if (pdev->dev.of_node) {
|
||||
int ret;
|
||||
struct device_node *np = pdev->dev.of_node;
|
||||
|
||||
of_node_get(np);
|
||||
ret = of_property_read_u32(np, "query_licence_cmd",
|
||||
&efuse_query_licence_cmd);
|
||||
if (ret) {
|
||||
MYPRT("%s:please config query_cmd item\n", __func__);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
err1:
|
||||
class_destroy(class_audio_data);
|
||||
err0:
|
||||
unregister_chrdev(major_audio_data, AUDIO_DATA_DEVICE_NODE_NAME);
|
||||
return PTR_ERR(ptr_err);
|
||||
|
||||
}
|
||||
|
||||
static int audio_data_remove(struct platform_device *pdev)
|
||||
{
|
||||
unregister_chrdev_region(major_audio_data, 1);
|
||||
device_destroy(class_audio_data, MKDEV(major_audio_data, 0));
|
||||
class_destroy(class_audio_data);
|
||||
return 0;
|
||||
}
|
||||
static const struct of_device_id amlogic_audio_data_dt_match[] = {
|
||||
{ .compatible = "amlogic, audio_data",
|
||||
},
|
||||
{},
|
||||
};
|
||||
static struct platform_driver audio_data_driver = {
|
||||
.probe = audio_data_probe,
|
||||
.remove = audio_data_remove,
|
||||
.driver = {
|
||||
.name = AUDIO_DATA_DEVICE_NODE_NAME,
|
||||
.of_match_table = amlogic_audio_data_dt_match,
|
||||
.owner = THIS_MODULE,
|
||||
},
|
||||
};
|
||||
static int __init audio_data_init(void)
|
||||
{
|
||||
int ret = -1;
|
||||
|
||||
ret = platform_driver_register(&audio_data_driver);
|
||||
if (ret != 0) {
|
||||
MYPRT("failed to register audio data driver, error %d\n", ret);
|
||||
return -ENODEV;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
/* module unload */
|
||||
static void __exit audio_data_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&audio_data_driver);
|
||||
}
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
/* MODULE_LICENSE("Proprietary"); */
|
||||
MODULE_DESCRIPTION("Amlogic audio debug Interface driver");
|
||||
|
||||
module_init(audio_data_init);
|
||||
module_exit(audio_data_exit);
|
||||
36
drivers/amlogic/audioinfo/audio_data.h
Normal file
36
drivers/amlogic/audioinfo/audio_data.h
Normal file
@@ -0,0 +1,36 @@
|
||||
/*
|
||||
* drivers/amlogic/audioinfo/audio_data.h
|
||||
*
|
||||
* Copyright (C) 2017 Amlogic, Inc. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _AUDIO_DATA_ANDROID_H_
|
||||
#define _AUDIO_DATA_ANDROID_H_
|
||||
|
||||
#include <linux/cdev.h>
|
||||
#include <linux/semaphore.h>
|
||||
|
||||
#define AUDIO_DATA_DEVICE_NODE_NAME "audio_data_debug"
|
||||
#define AUDIO_DATA_DEVICE_FILE_NAME "audio_data_debug"
|
||||
#define AUDIO_DATA_DEVICE_PROC_NAME "audio_data_debug"
|
||||
#define AUDIO_DATA_DEVICE_CLASS_NAME "audio_data_debug"
|
||||
|
||||
#define EFUSE_DOLBY_AUDIO_EFFECT 1
|
||||
|
||||
struct audio_data_android_dev {
|
||||
unsigned int val;
|
||||
struct semaphore sem;
|
||||
struct cdev dev;
|
||||
};
|
||||
#endif
|
||||
Reference in New Issue
Block a user