Merge changes Ie4293847,I050635b7 into msm-3.0
* changes: mfd: wcd9310: Make tabla interrupt line to be wakeable mfd: wcd9310: Retry read/write on failure
This commit is contained in:
committed by
QuIC Gerrit Code Review
commit
ffe4c27017
@@ -27,6 +27,7 @@
|
||||
|
||||
#define TABLA_SLIM_GLA_MAX_RETRIES 5
|
||||
#define TABLA_REGISTER_START_OFFSET 0x800
|
||||
#define TABLA_SLIM_RW_MAX_TRIES 3
|
||||
|
||||
#define MAX_TABLA_DEVICE 4
|
||||
#define TABLA_I2C_MODE 0x03
|
||||
@@ -183,21 +184,25 @@ static int tabla_slim_read_device(struct tabla *tabla, unsigned short reg,
|
||||
{
|
||||
int ret;
|
||||
struct slim_ele_access msg;
|
||||
int slim_read_tries = TABLA_SLIM_RW_MAX_TRIES;
|
||||
msg.start_offset = TABLA_REGISTER_START_OFFSET + reg;
|
||||
msg.num_bytes = bytes;
|
||||
msg.comp = NULL;
|
||||
|
||||
mutex_lock(&tabla->xfer_lock);
|
||||
if (interface)
|
||||
ret = slim_request_val_element(tabla->slim_slave, &msg, dest,
|
||||
bytes);
|
||||
else
|
||||
ret = slim_request_val_element(tabla->slim, &msg, dest, bytes);
|
||||
while (1) {
|
||||
mutex_lock(&tabla->xfer_lock);
|
||||
ret = slim_request_val_element(interface ?
|
||||
tabla->slim_slave : tabla->slim,
|
||||
&msg, dest, bytes);
|
||||
mutex_unlock(&tabla->xfer_lock);
|
||||
if (likely(ret == 0) || (--slim_read_tries == 0))
|
||||
break;
|
||||
usleep_range(5000, 5000);
|
||||
}
|
||||
|
||||
if (ret)
|
||||
pr_err("%s: Error, Tabla read failed\n", __func__);
|
||||
pr_err("%s: Error, Tabla read failed (%d)\n", __func__, ret);
|
||||
|
||||
mutex_unlock(&tabla->xfer_lock);
|
||||
return ret;
|
||||
}
|
||||
/* Interface specifies whether the write is to the interface or general
|
||||
@@ -208,20 +213,25 @@ static int tabla_slim_write_device(struct tabla *tabla, unsigned short reg,
|
||||
{
|
||||
int ret;
|
||||
struct slim_ele_access msg;
|
||||
int slim_write_tries = TABLA_SLIM_RW_MAX_TRIES;
|
||||
msg.start_offset = TABLA_REGISTER_START_OFFSET + reg;
|
||||
msg.num_bytes = bytes;
|
||||
msg.comp = NULL;
|
||||
|
||||
mutex_lock(&tabla->xfer_lock);
|
||||
if (interface)
|
||||
ret = slim_change_val_element(tabla->slim_slave, &msg, src,
|
||||
bytes);
|
||||
else
|
||||
ret = slim_change_val_element(tabla->slim, &msg, src, bytes);
|
||||
if (ret)
|
||||
pr_err("%s: Error, Tabla write failed\n", __func__);
|
||||
while (1) {
|
||||
mutex_lock(&tabla->xfer_lock);
|
||||
ret = slim_change_val_element(interface ?
|
||||
tabla->slim_slave : tabla->slim,
|
||||
&msg, src, bytes);
|
||||
mutex_unlock(&tabla->xfer_lock);
|
||||
if (likely(ret == 0) || (--slim_write_tries == 0))
|
||||
break;
|
||||
usleep_range(5000, 5000);
|
||||
}
|
||||
|
||||
if (ret)
|
||||
pr_err("%s: Error, Tabla write failed (%d)\n", __func__, ret);
|
||||
|
||||
mutex_unlock(&tabla->xfer_lock);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@@ -189,17 +189,37 @@ int tabla_irq_init(struct tabla *tabla)
|
||||
ret = request_threaded_irq(tabla->irq, NULL, tabla_irq_thread,
|
||||
IRQF_TRIGGER_HIGH | IRQF_ONESHOT,
|
||||
"tabla", tabla);
|
||||
|
||||
if (ret != 0) {
|
||||
if (ret != 0)
|
||||
dev_err(tabla->dev, "Failed to request IRQ %d: %d\n",
|
||||
tabla->irq, ret);
|
||||
return ret;
|
||||
else {
|
||||
ret = enable_irq_wake(tabla->irq);
|
||||
if (ret == 0) {
|
||||
ret = device_init_wakeup(tabla->dev, 1);
|
||||
if (ret) {
|
||||
dev_err(tabla->dev, "Failed to init device"
|
||||
"wakeup : %d\n", ret);
|
||||
disable_irq_wake(tabla->irq);
|
||||
}
|
||||
} else
|
||||
dev_err(tabla->dev, "Failed to set wake interrupt on"
|
||||
" IRQ %d: %d\n", tabla->irq, ret);
|
||||
if (ret)
|
||||
free_irq(tabla->irq, tabla);
|
||||
}
|
||||
return 0;
|
||||
|
||||
if (ret)
|
||||
mutex_destroy(&tabla->irq_lock);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
void tabla_irq_exit(struct tabla *tabla)
|
||||
{
|
||||
if (tabla->irq)
|
||||
if (tabla->irq) {
|
||||
disable_irq_wake(tabla->irq);
|
||||
free_irq(tabla->irq, tabla);
|
||||
device_init_wakeup(tabla->dev, 0);
|
||||
}
|
||||
mutex_destroy(&tabla->irq_lock);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user