Merge "ASoC: wsa881x: Add retry logic for temperature read"
This commit is contained in:
commit
083b8cc439
2 changed files with 26 additions and 8 deletions
|
@ -1,4 +1,4 @@
|
||||||
/* Copyright (c) 2015, The Linux Foundation. All rights reserved.
|
/* Copyright (c) 2015, 2017 The Linux Foundation. All rights reserved.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License version 2 and
|
* it under the terms of the GNU General Public License version 2 and
|
||||||
|
@ -23,7 +23,7 @@
|
||||||
#define LOW_TEMP_THRESHOLD 5
|
#define LOW_TEMP_THRESHOLD 5
|
||||||
#define HIGH_TEMP_THRESHOLD 45
|
#define HIGH_TEMP_THRESHOLD 45
|
||||||
#define TEMP_INVALID 0xFFFF
|
#define TEMP_INVALID 0xFFFF
|
||||||
|
#define WSA881X_TEMP_RETRY 3
|
||||||
/*
|
/*
|
||||||
* wsa881x_get_temp - get wsa temperature
|
* wsa881x_get_temp - get wsa temperature
|
||||||
* @thermal: thermal zone device
|
* @thermal: thermal zone device
|
||||||
|
@ -44,6 +44,7 @@ int wsa881x_get_temp(struct thermal_zone_device *thermal,
|
||||||
int temp_val;
|
int temp_val;
|
||||||
int t1 = T1_TEMP;
|
int t1 = T1_TEMP;
|
||||||
int t2 = T2_TEMP;
|
int t2 = T2_TEMP;
|
||||||
|
u8 retry = WSA881X_TEMP_RETRY;
|
||||||
|
|
||||||
if (!thermal)
|
if (!thermal)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
@ -60,6 +61,7 @@ int wsa881x_get_temp(struct thermal_zone_device *thermal,
|
||||||
pr_err("%s: pdata is NULL\n", __func__);
|
pr_err("%s: pdata is NULL\n", __func__);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
temp_retry:
|
||||||
if (pdata->wsa_temp_reg_read) {
|
if (pdata->wsa_temp_reg_read) {
|
||||||
ret = pdata->wsa_temp_reg_read(codec, ®);
|
ret = pdata->wsa_temp_reg_read(codec, ®);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
|
@ -101,6 +103,10 @@ int wsa881x_get_temp(struct thermal_zone_device *thermal,
|
||||||
printk_ratelimited("%s: T0: %d is out of range[%d, %d]\n",
|
printk_ratelimited("%s: T0: %d is out of range[%d, %d]\n",
|
||||||
__func__, temp_val, LOW_TEMP_THRESHOLD,
|
__func__, temp_val, LOW_TEMP_THRESHOLD,
|
||||||
HIGH_TEMP_THRESHOLD);
|
HIGH_TEMP_THRESHOLD);
|
||||||
|
if (retry--) {
|
||||||
|
msleep(20);
|
||||||
|
goto temp_retry;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (temp)
|
if (temp)
|
||||||
*temp = temp_val;
|
*temp = temp_val;
|
||||||
|
|
|
@ -986,6 +986,7 @@ static int32_t wsa881x_temp_reg_read(struct snd_soc_codec *codec,
|
||||||
{
|
{
|
||||||
struct wsa881x_priv *wsa881x = snd_soc_codec_get_drvdata(codec);
|
struct wsa881x_priv *wsa881x = snd_soc_codec_get_drvdata(codec);
|
||||||
struct swr_device *dev;
|
struct swr_device *dev;
|
||||||
|
u8 retry = WSA881X_NUM_RETRY;
|
||||||
u8 devnum = 0;
|
u8 devnum = 0;
|
||||||
|
|
||||||
if (!wsa881x) {
|
if (!wsa881x) {
|
||||||
|
@ -994,7 +995,12 @@ static int32_t wsa881x_temp_reg_read(struct snd_soc_codec *codec,
|
||||||
}
|
}
|
||||||
dev = wsa881x->swr_slave;
|
dev = wsa881x->swr_slave;
|
||||||
if (dev && (wsa881x->state == WSA881X_DEV_DOWN)) {
|
if (dev && (wsa881x->state == WSA881X_DEV_DOWN)) {
|
||||||
if (swr_get_logical_dev_num(dev, dev->addr, &devnum)) {
|
while (swr_get_logical_dev_num(dev, dev->addr, &devnum) &&
|
||||||
|
retry--) {
|
||||||
|
/* Retry after 1 msec delay */
|
||||||
|
usleep_range(1000, 1100);
|
||||||
|
}
|
||||||
|
if (retry == 0) {
|
||||||
dev_err(codec->dev,
|
dev_err(codec->dev,
|
||||||
"%s get devnum %d for dev addr %lx failed\n",
|
"%s get devnum %d for dev addr %lx failed\n",
|
||||||
__func__, devnum, dev->addr);
|
__func__, devnum, dev->addr);
|
||||||
|
@ -1088,6 +1094,7 @@ static int wsa881x_swr_startup(struct swr_device *swr_dev)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
u8 devnum = 0;
|
u8 devnum = 0;
|
||||||
|
u8 retry = WSA881X_NUM_RETRY;
|
||||||
struct wsa881x_priv *wsa881x;
|
struct wsa881x_priv *wsa881x;
|
||||||
|
|
||||||
wsa881x = swr_get_dev_data(swr_dev);
|
wsa881x = swr_get_dev_data(swr_dev);
|
||||||
|
@ -1102,11 +1109,16 @@ static int wsa881x_swr_startup(struct swr_device *swr_dev)
|
||||||
* as per HW requirement.
|
* as per HW requirement.
|
||||||
*/
|
*/
|
||||||
usleep_range(5000, 5010);
|
usleep_range(5000, 5010);
|
||||||
ret = swr_get_logical_dev_num(swr_dev, swr_dev->addr, &devnum);
|
while (swr_get_logical_dev_num(swr_dev, swr_dev->addr, &devnum) &&
|
||||||
if (ret) {
|
retry--) {
|
||||||
dev_dbg(&swr_dev->dev, "%s failed to get devnum, err:%d\n",
|
/* Retry after 1 msec delay */
|
||||||
__func__, ret);
|
usleep_range(1000, 1100);
|
||||||
goto err;
|
}
|
||||||
|
if (retry == 0) {
|
||||||
|
dev_err(&swr_dev->dev,
|
||||||
|
"%s get devnum %d for dev addr %lx failed\n",
|
||||||
|
__func__, devnum, swr_dev->addr);
|
||||||
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
swr_dev->dev_num = devnum;
|
swr_dev->dev_num = devnum;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue