techpack: audio: aw882xx: Load calibration file through firmware class

Direct access to filesystem is insane and hits a neverallow, load it
through the firmware class instead.

Change-Id: I72149f8674c6211fab57a025b47cf84e505a256a
This commit is contained in:
dianlujitao 2022-02-02 23:37:08 +08:00 • committed by Michael Bestas
commit 83e1eff0f1
No known key found for this signature in database

View file

@ -25,7 +25,6 @@
#include <linux/of_gpio.h>
#include <linux/delay.h>
#include <linux/slab.h>
#include <linux/fs.h>
#include <linux/miscdevice.h>
#include <linux/device.h>
#include <linux/firmware.h>
@ -63,9 +62,8 @@
#define AW_READ_CHIPID_RETRY_DELAY 5 /* 5 ms */
#define CALI_BUF_MAX 100
#define DELAY_TIME_MAX 300
#define AWINIC_CALI_FILE "/mnt/vendor/persist/factory/audio/aw_cali.bin"
#define AWINIC_CALI_FILE "aw_cali.bin"
static DEFINE_MUTEX(g_msg_dsp_lock);
@ -97,7 +95,7 @@ static int aw_adm_param_enable(int port_id, int module_id, int param_id, int ena
}
#endif
static int aw882xx_get_cali_re_from_nv(uint32_t *cali_re);
static int aw882xx_get_cali_re_from_nv(struct aw882xx *aw882xx, uint32_t *cali_re);
static int aw882xx_set_cali_re(struct aw882xx *aw882xx, uint32_t cali_re);
static int aw882xx_load_profile_params(struct aw882xx *aw882xx);
static int aw882xx_skt_set_dsp(int value);
@ -497,7 +495,7 @@ static void aw882xx_start(struct aw882xx *aw882xx)
uint32_t cali_re;
pr_debug("%s: enter\n", __func__);
ret = aw882xx_get_cali_re_from_nv(&cali_re);
ret = aw882xx_get_cali_re_from_nv(aw882xx, &cali_re);
if (ret < 0) {
cali_re = ERRO_CALI_VALUE;
pr_err("%s: use default vaule %d", __func__ , ERRO_CALI_VALUE);
@ -564,44 +562,38 @@ static void aw882xx_stop(struct aw882xx *aw882xx)
* aw882xx config
*
******************************************************/
static int aw882xx_get_cali_re_from_nv(uint32_t *cali_re)
static int aw882xx_get_cali_re_from_nv(struct aw882xx *aw882xx, uint32_t *cali_re)
{
/*custom add, if success return value is 0 , else -1*/
struct file *fp;
char buf[CALI_BUF_MAX];
int rc = -EINVAL;
uint32_t read_re;
loff_t pos = 0;
mm_segment_t fs;
const struct firmware *fw = NULL;
memset(buf, 0, CALI_BUF_MAX);
/*open cali file*/
fp = filp_open(AWINIC_CALI_FILE, O_RDONLY, 0);
if (IS_ERR(fp)) {
if (request_firmware(&fw, AWINIC_CALI_FILE, aw882xx->dev)) {
pr_err("%s: open %s failed!", __func__, AWINIC_CALI_FILE);
return -EINVAL;
return rc;
}
/*set fs kernel*/
fs = get_fs();
set_fs(KERNEL_DS);
/*read file*/
kernel_read(fp, buf, CALI_BUF_MAX - 1, &pos);
if (!fw || !fw->data || !fw->size) {
pr_err("%s: invalid firmware", __func__);
goto error;
}
/*get cali re value*/
if (sscanf(buf, "%d", &read_re) != 1) {
if (sscanf(fw->data, "%d", &read_re) != 1) {
pr_err("%s: file read error", __func__);
set_fs(fs);
filp_close(fp, NULL);
return -EINVAL;
goto error;
}
set_fs(fs);
/*close file*/
filp_close(fp, NULL);
*cali_re = read_re;
pr_info("%s: %d", __func__, read_re);
return 0;
rc = 0;
error:
/*close file*/
release_firmware(fw);
return rc;
}
static int aw882xx_set_cali_re(struct aw882xx *aw882xx, uint32_t cali_re)