Merge "ASoC: wsa881x: Add retry logic for temperature read"

This commit is contained in:
Linux Build Service Account 2017-02-25 19:49:30 -08:00 committed by Gerrit - the friendly Code Review server
commit 083b8cc439
2 changed files with 26 additions and 8 deletions

View file

@ -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, &reg); ret = pdata->wsa_temp_reg_read(codec, &reg);
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;

View file

@ -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;