forked from Minki/linux
ASoC: wm2000: Always use a 4s timeout for the firmware
Rather than having varying timeouts depending on the transition always use a 4s timeout. This provides better diagnostics for clocking errors and ensures compatibility with current calibration firmwares. Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
This commit is contained in:
parent
90c6ce0d54
commit
3ff1ec27e9
@ -99,8 +99,9 @@ static void wm2000_reset(struct wm2000_priv *wm2000)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int wm2000_poll_bit(struct i2c_client *i2c,
|
static int wm2000_poll_bit(struct i2c_client *i2c,
|
||||||
unsigned int reg, u8 mask, int timeout)
|
unsigned int reg, u8 mask)
|
||||||
{
|
{
|
||||||
|
int timeout = 4000;
|
||||||
int val;
|
int val;
|
||||||
|
|
||||||
val = wm2000_read(i2c, reg);
|
val = wm2000_read(i2c, reg);
|
||||||
@ -119,7 +120,7 @@ static int wm2000_poll_bit(struct i2c_client *i2c,
|
|||||||
static int wm2000_power_up(struct i2c_client *i2c, int analogue)
|
static int wm2000_power_up(struct i2c_client *i2c, int analogue)
|
||||||
{
|
{
|
||||||
struct wm2000_priv *wm2000 = dev_get_drvdata(&i2c->dev);
|
struct wm2000_priv *wm2000 = dev_get_drvdata(&i2c->dev);
|
||||||
int ret, timeout;
|
int ret;
|
||||||
|
|
||||||
BUG_ON(wm2000->anc_mode != ANC_OFF);
|
BUG_ON(wm2000->anc_mode != ANC_OFF);
|
||||||
|
|
||||||
@ -140,13 +141,13 @@ static int wm2000_power_up(struct i2c_client *i2c, int analogue)
|
|||||||
|
|
||||||
/* Wait for ANC engine to become ready */
|
/* Wait for ANC engine to become ready */
|
||||||
if (!wm2000_poll_bit(i2c, WM2000_REG_ANC_STAT,
|
if (!wm2000_poll_bit(i2c, WM2000_REG_ANC_STAT,
|
||||||
WM2000_ANC_ENG_IDLE, 1)) {
|
WM2000_ANC_ENG_IDLE)) {
|
||||||
dev_err(&i2c->dev, "ANC engine failed to reset\n");
|
dev_err(&i2c->dev, "ANC engine failed to reset\n");
|
||||||
return -ETIMEDOUT;
|
return -ETIMEDOUT;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!wm2000_poll_bit(i2c, WM2000_REG_SYS_STATUS,
|
if (!wm2000_poll_bit(i2c, WM2000_REG_SYS_STATUS,
|
||||||
WM2000_STATUS_BOOT_COMPLETE, 1)) {
|
WM2000_STATUS_BOOT_COMPLETE)) {
|
||||||
dev_err(&i2c->dev, "ANC engine failed to initialise\n");
|
dev_err(&i2c->dev, "ANC engine failed to initialise\n");
|
||||||
return -ETIMEDOUT;
|
return -ETIMEDOUT;
|
||||||
}
|
}
|
||||||
@ -173,16 +174,13 @@ static int wm2000_power_up(struct i2c_client *i2c, int analogue)
|
|||||||
dev_dbg(&i2c->dev, "Download complete\n");
|
dev_dbg(&i2c->dev, "Download complete\n");
|
||||||
|
|
||||||
if (analogue) {
|
if (analogue) {
|
||||||
timeout = 248;
|
wm2000_write(i2c, WM2000_REG_ANA_VMID_PU_TIME, 248 / 4);
|
||||||
wm2000_write(i2c, WM2000_REG_ANA_VMID_PU_TIME, timeout / 4);
|
|
||||||
|
|
||||||
wm2000_write(i2c, WM2000_REG_SYS_MODE_CNTRL,
|
wm2000_write(i2c, WM2000_REG_SYS_MODE_CNTRL,
|
||||||
WM2000_MODE_ANA_SEQ_INCLUDE |
|
WM2000_MODE_ANA_SEQ_INCLUDE |
|
||||||
WM2000_MODE_MOUSE_ENABLE |
|
WM2000_MODE_MOUSE_ENABLE |
|
||||||
WM2000_MODE_THERMAL_ENABLE);
|
WM2000_MODE_THERMAL_ENABLE);
|
||||||
} else {
|
} else {
|
||||||
timeout = 10;
|
|
||||||
|
|
||||||
wm2000_write(i2c, WM2000_REG_SYS_MODE_CNTRL,
|
wm2000_write(i2c, WM2000_REG_SYS_MODE_CNTRL,
|
||||||
WM2000_MODE_MOUSE_ENABLE |
|
WM2000_MODE_MOUSE_ENABLE |
|
||||||
WM2000_MODE_THERMAL_ENABLE);
|
WM2000_MODE_THERMAL_ENABLE);
|
||||||
@ -201,9 +199,8 @@ static int wm2000_power_up(struct i2c_client *i2c, int analogue)
|
|||||||
wm2000_write(i2c, WM2000_REG_SYS_CTL2, WM2000_ANC_INT_N_CLR);
|
wm2000_write(i2c, WM2000_REG_SYS_CTL2, WM2000_ANC_INT_N_CLR);
|
||||||
|
|
||||||
if (!wm2000_poll_bit(i2c, WM2000_REG_SYS_STATUS,
|
if (!wm2000_poll_bit(i2c, WM2000_REG_SYS_STATUS,
|
||||||
WM2000_STATUS_MOUSE_ACTIVE, timeout)) {
|
WM2000_STATUS_MOUSE_ACTIVE)) {
|
||||||
dev_err(&i2c->dev, "Timed out waiting for device after %dms\n",
|
dev_err(&i2c->dev, "Timed out waiting for device\n");
|
||||||
timeout * 10);
|
|
||||||
return -ETIMEDOUT;
|
return -ETIMEDOUT;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -218,28 +215,25 @@ static int wm2000_power_up(struct i2c_client *i2c, int analogue)
|
|||||||
static int wm2000_power_down(struct i2c_client *i2c, int analogue)
|
static int wm2000_power_down(struct i2c_client *i2c, int analogue)
|
||||||
{
|
{
|
||||||
struct wm2000_priv *wm2000 = dev_get_drvdata(&i2c->dev);
|
struct wm2000_priv *wm2000 = dev_get_drvdata(&i2c->dev);
|
||||||
int timeout;
|
|
||||||
|
|
||||||
if (analogue) {
|
if (analogue) {
|
||||||
timeout = 248;
|
wm2000_write(i2c, WM2000_REG_ANA_VMID_PD_TIME, 248 / 4);
|
||||||
wm2000_write(i2c, WM2000_REG_ANA_VMID_PD_TIME, timeout / 4);
|
|
||||||
wm2000_write(i2c, WM2000_REG_SYS_MODE_CNTRL,
|
wm2000_write(i2c, WM2000_REG_SYS_MODE_CNTRL,
|
||||||
WM2000_MODE_ANA_SEQ_INCLUDE |
|
WM2000_MODE_ANA_SEQ_INCLUDE |
|
||||||
WM2000_MODE_POWER_DOWN);
|
WM2000_MODE_POWER_DOWN);
|
||||||
} else {
|
} else {
|
||||||
timeout = 10;
|
|
||||||
wm2000_write(i2c, WM2000_REG_SYS_MODE_CNTRL,
|
wm2000_write(i2c, WM2000_REG_SYS_MODE_CNTRL,
|
||||||
WM2000_MODE_POWER_DOWN);
|
WM2000_MODE_POWER_DOWN);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!wm2000_poll_bit(i2c, WM2000_REG_SYS_STATUS,
|
if (!wm2000_poll_bit(i2c, WM2000_REG_SYS_STATUS,
|
||||||
WM2000_STATUS_POWER_DOWN_COMPLETE, timeout)) {
|
WM2000_STATUS_POWER_DOWN_COMPLETE)) {
|
||||||
dev_err(&i2c->dev, "Timeout waiting for ANC power down\n");
|
dev_err(&i2c->dev, "Timeout waiting for ANC power down\n");
|
||||||
return -ETIMEDOUT;
|
return -ETIMEDOUT;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!wm2000_poll_bit(i2c, WM2000_REG_ANC_STAT,
|
if (!wm2000_poll_bit(i2c, WM2000_REG_ANC_STAT,
|
||||||
WM2000_ANC_ENG_IDLE, 1)) {
|
WM2000_ANC_ENG_IDLE)) {
|
||||||
dev_err(&i2c->dev, "Timeout waiting for ANC engine idle\n");
|
dev_err(&i2c->dev, "Timeout waiting for ANC engine idle\n");
|
||||||
return -ETIMEDOUT;
|
return -ETIMEDOUT;
|
||||||
}
|
}
|
||||||
@ -268,13 +262,13 @@ static int wm2000_enter_bypass(struct i2c_client *i2c, int analogue)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!wm2000_poll_bit(i2c, WM2000_REG_SYS_STATUS,
|
if (!wm2000_poll_bit(i2c, WM2000_REG_SYS_STATUS,
|
||||||
WM2000_STATUS_ANC_DISABLED, 10)) {
|
WM2000_STATUS_ANC_DISABLED)) {
|
||||||
dev_err(&i2c->dev, "Timeout waiting for ANC disable\n");
|
dev_err(&i2c->dev, "Timeout waiting for ANC disable\n");
|
||||||
return -ETIMEDOUT;
|
return -ETIMEDOUT;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!wm2000_poll_bit(i2c, WM2000_REG_ANC_STAT,
|
if (!wm2000_poll_bit(i2c, WM2000_REG_ANC_STAT,
|
||||||
WM2000_ANC_ENG_IDLE, 1)) {
|
WM2000_ANC_ENG_IDLE)) {
|
||||||
dev_err(&i2c->dev, "Timeout waiting for ANC engine idle\n");
|
dev_err(&i2c->dev, "Timeout waiting for ANC engine idle\n");
|
||||||
return -ETIMEDOUT;
|
return -ETIMEDOUT;
|
||||||
}
|
}
|
||||||
@ -311,7 +305,7 @@ static int wm2000_exit_bypass(struct i2c_client *i2c, int analogue)
|
|||||||
wm2000_write(i2c, WM2000_REG_SYS_CTL2, WM2000_ANC_INT_N_CLR);
|
wm2000_write(i2c, WM2000_REG_SYS_CTL2, WM2000_ANC_INT_N_CLR);
|
||||||
|
|
||||||
if (!wm2000_poll_bit(i2c, WM2000_REG_SYS_STATUS,
|
if (!wm2000_poll_bit(i2c, WM2000_REG_SYS_STATUS,
|
||||||
WM2000_STATUS_MOUSE_ACTIVE, 10)) {
|
WM2000_STATUS_MOUSE_ACTIVE)) {
|
||||||
dev_err(&i2c->dev, "Timed out waiting for MOUSE\n");
|
dev_err(&i2c->dev, "Timed out waiting for MOUSE\n");
|
||||||
return -ETIMEDOUT;
|
return -ETIMEDOUT;
|
||||||
}
|
}
|
||||||
@ -325,38 +319,32 @@ static int wm2000_exit_bypass(struct i2c_client *i2c, int analogue)
|
|||||||
static int wm2000_enter_standby(struct i2c_client *i2c, int analogue)
|
static int wm2000_enter_standby(struct i2c_client *i2c, int analogue)
|
||||||
{
|
{
|
||||||
struct wm2000_priv *wm2000 = dev_get_drvdata(&i2c->dev);
|
struct wm2000_priv *wm2000 = dev_get_drvdata(&i2c->dev);
|
||||||
int timeout;
|
|
||||||
|
|
||||||
BUG_ON(wm2000->anc_mode != ANC_ACTIVE);
|
BUG_ON(wm2000->anc_mode != ANC_ACTIVE);
|
||||||
|
|
||||||
if (analogue) {
|
if (analogue) {
|
||||||
timeout = 248;
|
wm2000_write(i2c, WM2000_REG_ANA_VMID_PD_TIME, 248 / 4);
|
||||||
wm2000_write(i2c, WM2000_REG_ANA_VMID_PD_TIME, timeout / 4);
|
|
||||||
|
|
||||||
wm2000_write(i2c, WM2000_REG_SYS_MODE_CNTRL,
|
wm2000_write(i2c, WM2000_REG_SYS_MODE_CNTRL,
|
||||||
WM2000_MODE_ANA_SEQ_INCLUDE |
|
WM2000_MODE_ANA_SEQ_INCLUDE |
|
||||||
WM2000_MODE_THERMAL_ENABLE |
|
WM2000_MODE_THERMAL_ENABLE |
|
||||||
WM2000_MODE_STANDBY_ENTRY);
|
WM2000_MODE_STANDBY_ENTRY);
|
||||||
} else {
|
} else {
|
||||||
timeout = 10;
|
|
||||||
|
|
||||||
wm2000_write(i2c, WM2000_REG_SYS_MODE_CNTRL,
|
wm2000_write(i2c, WM2000_REG_SYS_MODE_CNTRL,
|
||||||
WM2000_MODE_THERMAL_ENABLE |
|
WM2000_MODE_THERMAL_ENABLE |
|
||||||
WM2000_MODE_STANDBY_ENTRY);
|
WM2000_MODE_STANDBY_ENTRY);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!wm2000_poll_bit(i2c, WM2000_REG_SYS_STATUS,
|
if (!wm2000_poll_bit(i2c, WM2000_REG_SYS_STATUS,
|
||||||
WM2000_STATUS_ANC_DISABLED, timeout)) {
|
WM2000_STATUS_ANC_DISABLED)) {
|
||||||
dev_err(&i2c->dev,
|
dev_err(&i2c->dev,
|
||||||
"Timed out waiting for ANC disable after 1ms\n");
|
"Timed out waiting for ANC disable after 1ms\n");
|
||||||
return -ETIMEDOUT;
|
return -ETIMEDOUT;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!wm2000_poll_bit(i2c, WM2000_REG_ANC_STAT, WM2000_ANC_ENG_IDLE,
|
if (!wm2000_poll_bit(i2c, WM2000_REG_ANC_STAT, WM2000_ANC_ENG_IDLE)) {
|
||||||
1)) {
|
|
||||||
dev_err(&i2c->dev,
|
dev_err(&i2c->dev,
|
||||||
"Timed out waiting for standby after %dms\n",
|
"Timed out waiting for standby\n");
|
||||||
timeout * 10);
|
|
||||||
return -ETIMEDOUT;
|
return -ETIMEDOUT;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -374,23 +362,19 @@ static int wm2000_enter_standby(struct i2c_client *i2c, int analogue)
|
|||||||
static int wm2000_exit_standby(struct i2c_client *i2c, int analogue)
|
static int wm2000_exit_standby(struct i2c_client *i2c, int analogue)
|
||||||
{
|
{
|
||||||
struct wm2000_priv *wm2000 = dev_get_drvdata(&i2c->dev);
|
struct wm2000_priv *wm2000 = dev_get_drvdata(&i2c->dev);
|
||||||
int timeout;
|
|
||||||
|
|
||||||
BUG_ON(wm2000->anc_mode != ANC_STANDBY);
|
BUG_ON(wm2000->anc_mode != ANC_STANDBY);
|
||||||
|
|
||||||
wm2000_write(i2c, WM2000_REG_SYS_CTL1, 0);
|
wm2000_write(i2c, WM2000_REG_SYS_CTL1, 0);
|
||||||
|
|
||||||
if (analogue) {
|
if (analogue) {
|
||||||
timeout = 248;
|
wm2000_write(i2c, WM2000_REG_ANA_VMID_PU_TIME, 248 / 4);
|
||||||
wm2000_write(i2c, WM2000_REG_ANA_VMID_PU_TIME, timeout / 4);
|
|
||||||
|
|
||||||
wm2000_write(i2c, WM2000_REG_SYS_MODE_CNTRL,
|
wm2000_write(i2c, WM2000_REG_SYS_MODE_CNTRL,
|
||||||
WM2000_MODE_ANA_SEQ_INCLUDE |
|
WM2000_MODE_ANA_SEQ_INCLUDE |
|
||||||
WM2000_MODE_THERMAL_ENABLE |
|
WM2000_MODE_THERMAL_ENABLE |
|
||||||
WM2000_MODE_MOUSE_ENABLE);
|
WM2000_MODE_MOUSE_ENABLE);
|
||||||
} else {
|
} else {
|
||||||
timeout = 10;
|
|
||||||
|
|
||||||
wm2000_write(i2c, WM2000_REG_SYS_MODE_CNTRL,
|
wm2000_write(i2c, WM2000_REG_SYS_MODE_CNTRL,
|
||||||
WM2000_MODE_THERMAL_ENABLE |
|
WM2000_MODE_THERMAL_ENABLE |
|
||||||
WM2000_MODE_MOUSE_ENABLE);
|
WM2000_MODE_MOUSE_ENABLE);
|
||||||
@ -400,9 +384,8 @@ static int wm2000_exit_standby(struct i2c_client *i2c, int analogue)
|
|||||||
wm2000_write(i2c, WM2000_REG_SYS_CTL2, WM2000_ANC_INT_N_CLR);
|
wm2000_write(i2c, WM2000_REG_SYS_CTL2, WM2000_ANC_INT_N_CLR);
|
||||||
|
|
||||||
if (!wm2000_poll_bit(i2c, WM2000_REG_SYS_STATUS,
|
if (!wm2000_poll_bit(i2c, WM2000_REG_SYS_STATUS,
|
||||||
WM2000_STATUS_MOUSE_ACTIVE, timeout)) {
|
WM2000_STATUS_MOUSE_ACTIVE)) {
|
||||||
dev_err(&i2c->dev, "Timed out waiting for MOUSE after %dms\n",
|
dev_err(&i2c->dev, "Timed out waiting for MOUSE\n");
|
||||||
timeout * 10);
|
|
||||||
return -ETIMEDOUT;
|
return -ETIMEDOUT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user