summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: a8bc5a3)
raw | patch | inline | side by side (parent: a8bc5a3)
author | Tracy Yi <tracy-yi@ti.com> | |
Thu, 30 Nov 2017 03:12:42 +0000 (11:12 +0800) | ||
committer | Tracy Yi <tracy-yi@ti.com> | |
Thu, 30 Nov 2017 03:24:05 +0000 (11:24 +0800) |
Signed-off-by: Tracy Yi <tracy-yi@ti.com>
tas2559-core.c | patch | blob | history | |
tas2559-regmap.c | patch | blob | history | |
tas2559.h | patch | blob | history |
diff --git a/tas2559-core.c b/tas2559-core.c
index e0fad206d677dc0f32c67cf5ff01cc64325b3e00..e917866a8cb0b33600b724219e480dee3ce65abc 100755 (executable)
--- a/tas2559-core.c
+++ b/tas2559-core.c
#include "tas2559-core.h"
#define TAS2559_CAL_NAME "/data/tas2559_cal.bin"
+#define RESTART_MAX 3
static int tas2559_load_calibration(struct tas2559_priv *pTAS2559,
char *pFileName);
if (hrtimer_active(&pTAS2559->mtimer))
hrtimer_cancel(&pTAS2559->mtimer);
+ if(pTAS2559->mnRestart < RESTART_MAX)
+ {
+ pTAS2559->mnRestart ++;
+ msleep(100);
+ dev_err(pTAS2559->dev, "I2C COMM error, restart SmartAmp.\n");
+ schedule_delayed_work(&pTAS2559->irq_work, msecs_to_jiffies(100));
+ return;
+ }
+
pTAS2559->enableIRQ(pTAS2559, DevBoth, false);
tas2559_DevShutdown(pTAS2559, DevBoth);
pTAS2559->mbPowerUp = false;
if ((nValue & 0xff) != TAS2559_SAFE_GUARD_PATTERN) {
dev_err(pTAS2559->dev, "ERROR DevA safe guard (0x%x) failure!\n", nValue);
nResult = -EPIPE;
+ pTAS2559->mnErrCode = ERROR_SAFE_GUARD;
+ pTAS2559->mbPowerUp = true;
goto end;
}
}
pTAS2559->mbPowerUp = true;
+ pTAS2559->mnRestart = 0;
}
} else {
if (pTAS2559->mbPowerUp) {
goto end;
pTAS2559->mbPowerUp = false;
+ pTAS2559->mnRestart = 0;
}
}
end:
if (nResult < 0) {
- if (pTAS2559->mnErrCode & (ERROR_DEVA_I2C_COMM | ERROR_DEVB_I2C_COMM | ERROR_PRAM_CRCCHK | ERROR_YRAM_CRCCHK))
+ if (pTAS2559->mnErrCode & (ERROR_DEVA_I2C_COMM | ERROR_DEVB_I2C_COMM | ERROR_PRAM_CRCCHK | ERROR_YRAM_CRCCHK | ERROR_SAFE_GUARD))
failsafe(pTAS2559);
}
MODULE_AUTHOR("Texas Instruments Inc.");
MODULE_DESCRIPTION("TAS2559 common functions for Android Linux");
-MODULE_LICENSE("GPL v2");
\ No newline at end of file
+MODULE_LICENSE("GPL v2");
diff --git a/tas2559-regmap.c b/tas2559-regmap.c
index caf3a510bffa75fbcb09af43a34415ccc97411fb..5d9f53a48d3bc89d2cdfce603cf3d54e00f90ae1 100755 (executable)
--- a/tas2559-regmap.c
+++ b/tas2559-regmap.c
goto end;
}
+ if(ptas2559->mnErrCode & ERROR_FAILSAFE)
+ goto program;
+
if (!pTAS2559->mbPowerUp) {
dev_info(pTAS2559->dev, "%s, device not powered\n", __func__);
goto end;
pTAS2559->hw_reset = tas2559_hw_reset;
pTAS2559->runtime_suspend = tas2559_runtime_suspend;
pTAS2559->runtime_resume = tas2559_runtime_resume;
+ ptas2559->mnRestart = 0;
mutex_init(&pTAS2559->dev_lock);
diff --git a/tas2559.h b/tas2559.h
index 217da856e13a3a00849899ed8562b3158d8fa579..e98078101573d6ad62976e620396e30c0fd9f550 100755 (executable)
--- a/tas2559.h
+++ b/tas2559.h
#define ERROR_UNDER_VOLTAGE 0x00000800
#define ERROR_OVER_CURRENT 0x00001000
#define ERROR_CLASSD_PWR 0x00002000
+#define ERROR_SAFE_GUARD 0x00004000
#define ERROR_FAILSAFE 0x40000000
#define LOW_TEMPERATURE_GAIN 6
unsigned int mnErrCode;
+ unsigned int mnRestart;
#ifdef CONFIG_TAS2559_CODEC
struct mutex codec_lock;
#endif