}
#endif
-#if 1
+#if 0
static int wm831x_on_suspend_noirq(struct device *dev)
{
input_sync(g_wm831x_on->dev);
DBG("%s:poll=%d,ret=0x%x\n",__FUNCTION__,poll,ret);
}
+
DBG("%s\n",__FUNCTION__);
return 0;
}
wm831x_on->dev->dev.parent = &pdev->dev;
g_wm831x_on = wm831x_on;
- wm831x_on_pm_init();
+// wm831x_on_pm_init();
ret = request_threaded_irq(irq, NULL, wm831x_on_irq,
IRQF_TRIGGER_RISING, "wm831x_on",
msg[0].len = 1;
msg[0].buf = &start_reg;
msg[0].scl_rate = 400*1000;
- msg[0].udelay = 80;
+ msg[0].udelay = 0;
- msg[1].addr = ts->client->addr;
- msg[1].flags = ts->client->flags | I2C_M_RD;
- msg[1].len = 9;
- msg[1].buf = buf;
- msg[1].scl_rate = 400*1000;
- msg[1].udelay = 80;
+ ret = i2c_transfer(ts->client->adapter, msg, 1);
+ if (ret < 0)
+ {
+ printk("%s:i2c_transfer fail, ret=%d\n",__FUNCTION__,ret);
+ goto out;
+ }
+
+ udelay(200); //tp need delay
+
+ msg[0].addr = ts->client->addr;
+ msg[0].flags = ts->client->flags | I2C_M_RD;
+ msg[0].len = 9;
+ msg[0].buf = buf;
+ msg[0].scl_rate = 400*1000;
+ msg[0].udelay = 0;
- ret = i2c_transfer(ts->client->adapter, msg, 2);
+ ret = i2c_transfer(ts->client->adapter, msg, 1);
if (ret < 0)
{
- //for(i=0; i<msg[1].len; i++)
- //buf[i] = 0xff;
printk("%s:i2c_transfer fail, ret=%d\n",__FUNCTION__,ret);
goto out;
}
unsigned long flags;
struct wm831x_handle_irq *hd;
int ret;
- msleep(2);
+
#if (WM831X_IRQ_TYPE != IRQF_TRIGGER_LOW)
/*mask wm831x irq at first*/
ret = wm831x_set_bits(wm831x, WM831X_IRQ_CONFIG,
goto out;
}
#endif
+
primary = wm831x_reg_read(wm831x, WM831X_SYSTEM_INTERRUPTS);
if (primary < 0) {
dev_err(wm831x->dev, "Failed to read system interrupt: %d\n",
static irqreturn_t wm831x_irq_thread(int irq, void *data)
{
struct wm831x *wm831x = data;
-
+ int msdelay = 0;
/* Shut the interrupt to the CPU up and schedule the actual
* handler; we can't check that the IRQ is asserted. */
#if (WM831X_IRQ_TYPE == IRQF_TRIGGER_LOW)
disable_irq_nosync(irq);
#endif
wake_lock(&wm831x->irq_wake);
- queue_work(wm831x->irq_wq, &wm831x->irq_work);
+ if(wm831x->flag_suspend)
+ {
+ spin_lock(&wm831x->flag_lock);
+ wm831x->flag_suspend = 0;
+ spin_unlock(&wm831x->flag_lock);
+ msdelay = 50; //wait for spi/i2c resume
+ printk("%s:msdelay=%d\n",__FUNCTION__,msdelay);
+ }
+ else
+ msdelay = 0;
+
+ queue_delayed_work(wm831x->irq_wq, &wm831x->irq_work, msecs_to_jiffies(msdelay));
//printk("%s\n",__FUNCTION__);
return IRQ_HANDLED;
}
wm831x->irq = irq;
+ wm831x->flag_suspend = 0;
wm831x->irq_base = pdata->irq_base;
- INIT_WORK(&wm831x->irq_work, wm831x_irq_worker);
+ INIT_DELAYED_WORK(&wm831x->irq_work, wm831x_irq_worker);
wake_lock_init(&wm831x->irq_wake, WAKE_LOCK_SUSPEND, "wm831x_irq_wake");
wake_lock_init(&wm831x->handle_wake, WAKE_LOCK_SUSPEND, "wm831x_handle_wake");
#if WM831X_IRQ_LIST
/* Go register at a time */
for (r = reg; r < reg + (bytes / 2); r++) {
tx_val = cpu_to_be16(r | 0x8000);
-
+ //printk("read:reg=0x%x,",reg);
ret = spi_write_then_read(wm831x->control_data,
(u8 *)&tx_val, 2, (u8 *)d, 2);
if (ret != 0)
return ret;
-
+ //printk("rec=0x%x\n",be16_to_cpu(*d));
//*d = be16_to_cpu(*d);
d++;
for (r = reg; r < reg + (bytes / 2); r++) {
data[0] = cpu_to_be16(r);
data[1] = *s++;
-
+ //printk("write:reg=0x%x,send=0x%x\n",reg, data[0]);
ret = spi_write(spi, (char *)&data, sizeof(data));
if (ret != 0)
return ret;
static int wm831x_spi_suspend(struct spi_device *spi, pm_message_t m)
{
struct wm831x *wm831x = dev_get_drvdata(&spi->dev);
-
+ spin_lock(&wm831x->flag_lock);
+ wm831x->flag_suspend = 1;
+ spin_unlock(&wm831x->flag_lock);
return wm831x_device_suspend(wm831x);
}
struct wm831x_power *power = container_of(work, struct wm831x_power, batt_work);
ret = wm831x_power_check_online(power->wm831x, WM831X_PWR_SRC_BATT, &val);
+ if (ret < 0) {
+ printk("%s: check bat online failer... err = %d\n", __FUNCTION__, ret);
+ return;
+ }
online = val.intval;
ret = wm831x_bat_check_status(power->wm831x, &status);
+ if (ret < 0) {
+ printk("%s: check bat status failer... err = %d\n", __FUNCTION__, ret);
+ return;
+ }
+
ret = wm831x_bat_check_health(power->wm831x, &health);
+ if (ret < 0) {
+ printk("%s: check bat health failer... err = %d\n", __FUNCTION__, ret);
+ return;
+ }
ret = wm831x_power_read_voltage(power->wm831x, WM831X_AUX_BATT, &val);
+ if (ret < 0) {
+ printk("%s: read bat voltage failer...err = %d\n", __FUNCTION__, ret);
+ return;
+ }
+ power->priv.voltage = val.intval;
+
wm831x_batt_vol_level(power, val.intval, &level);
mod_timer(&power->timer, jiffies + msecs_to_jiffies(power->interval));
#ifdef CONFIG_PM
static int wm831x_battery_suspend(struct platform_device *dev, pm_message_t state)
{
- //struct wm831x_power *power = (struct wm831x_power *)platform_get_drvdata(dev);
- //flush_scheduled_work();
- //del_timer(&power->timer);
+ struct wm831x_power *power = (struct wm831x_power *)platform_get_drvdata(dev);
+ flush_scheduled_work();
+ del_timer(&power->timer);
+ printk("%s\n",__FUNCTION__);
return 0;
}
static int wm831x_battery_resume(struct platform_device *dev)
{
- //struct wm831x_power *power = (struct wm831x_power *)platform_get_drvdata(dev);
- //power->timer.expires = jiffies + msecs_to_jiffies(power->interval);
- //add_timer(&power->timer);
+ struct wm831x_power *power = (struct wm831x_power *)platform_get_drvdata(dev);
+ power->timer.expires = jiffies + msecs_to_jiffies(power->interval);
+ add_timer(&power->timer);
+ printk("%s\n",__FUNCTION__);
return 0;
}
#else
}\r
\r
spi_enable_chip(dws, 1);\r
- flush(dws);\r
+ //flush(dws);\r
}\r
\r
/* cpufreq driver support */\r
dws->pdev = pdev;\r
/* Basic HW init */\r
spi_hw_init(dws);\r
+ flush(dws);\r
/* Initial and start queue */\r
ret = init_queue(dws);\r
if (ret) {\r
struct rk29xx_spi *dws = spi_master_get_devdata(master);\r
struct rk29xx_spi_platform_data *pdata = pdev->dev.platform_data;\r
int status;\r
-\r
+ \r
+ flush(dws);\r
status = stop_queue(dws);\r
if (status != 0)\r
return status;\r
void *control_data;
int irq; /* Our chip IRQ */
+ int flag_suspend;
+ spinlock_t flag_lock;
struct mutex irq_lock;
struct workqueue_struct *irq_wq;
- struct work_struct irq_work;
+ struct delayed_work irq_work;
struct wake_lock irq_wake;
struct wake_lock handle_wake;
#if WM831X_IRQ_LIST