rk3288:pmic:ricoh619:add some lock and modify suspend func
author张晴 <zhangqing@rock-chips.com>
Fri, 6 Jun 2014 03:04:37 +0000 (11:04 +0800)
committer张晴 <zhangqing@rock-chips.com>
Fri, 6 Jun 2014 03:04:37 +0000 (11:04 +0800)
drivers/mfd/ricoh619-irq.c
drivers/mfd/ricoh619.c

index e3fba0d99b9cc02149a34416a3c53720b3944b1e..472a75502bd92910308b596b58bc0c1b006e1945 100755 (executable)
@@ -31,6 +31,7 @@
 #include <linux/mfd/ricoh619.h>
 #include <linux/irqdomain.h>
 
+static DEFINE_MUTEX(int_flag_mutex);
 
 enum int_type {
        SYS_INT  = 0x1,
@@ -226,6 +227,7 @@ static void ricoh619_irq_unmask(struct irq_data *irq_data)
 {
        struct ricoh619 *ricoh619 = irq_data_get_irq_chip_data(irq_data);
        const struct ricoh619_irq_data *data= irq_to_ricoh619_irq(ricoh619,irq_data->irq);
+       mutex_lock(&int_flag_mutex);
 
        ricoh619->group_irq_en[data->master_bit] |= (1 << data->grp_index);
        if (ricoh619->group_irq_en[data->master_bit])
@@ -237,12 +239,14 @@ static void ricoh619_irq_unmask(struct irq_data *irq_data)
        else
                ricoh619->irq_en_reg[data->mask_reg_index]
                                                |= 1 << data->int_en_bit;
+        mutex_unlock(&int_flag_mutex);
 }
 
 static void ricoh619_irq_mask(struct irq_data *irq_data)
 {
        struct ricoh619 *ricoh619 = irq_data_get_irq_chip_data(irq_data);
        const struct ricoh619_irq_data *data= irq_to_ricoh619_irq(ricoh619,irq_data->irq);
+        mutex_lock(&int_flag_mutex);
 
        ricoh619->group_irq_en[data->master_bit] &= ~(1 << data->grp_index);
        if (!ricoh619->group_irq_en[data->master_bit])
@@ -254,6 +258,7 @@ static void ricoh619_irq_mask(struct irq_data *irq_data)
        else
                ricoh619->irq_en_reg[data->mask_reg_index]
                                                &= ~(1 << data->int_en_bit);
+        mutex_unlock(&int_flag_mutex);
 }
 
 static void ricoh619_irq_sync_unlock(struct irq_data *irq_data)
@@ -423,7 +428,7 @@ static irqreturn_t ricoh619_irq(int irq, void *data)
        int_sts[6] |= int_sts[7];
 
        /* Call interrupt handler if enabled */
-
+        mutex_lock(&int_flag_mutex);
        for (i = 0; i <RICOH619_NR_IRQS; ++i) {
                const struct ricoh619_irq_data *data = &ricoh619_irqs[i];
                if ((int_sts[data->mask_reg_index] & (1 << data->int_en_bit)) &&(ricoh619->group_irq_en[data->master_bit] & (1 << data->grp_index))){
@@ -432,6 +437,7 @@ static irqreturn_t ricoh619_irq(int irq, void *data)
                                handle_nested_irq(cur_irq);
                }
        }
+        mutex_unlock(&int_flag_mutex);
 
 //     printk(KERN_INFO "PMU: %s: out\n", __func__);
        return IRQ_HANDLED;
@@ -439,8 +445,10 @@ static irqreturn_t ricoh619_irq(int irq, void *data)
 
 static struct irq_chip ricoh619_irq_chip = {
        .name = "ricoh619",
-       .irq_mask = ricoh619_irq_mask,
-       .irq_unmask = ricoh619_irq_unmask,
+       //.irq_mask = ricoh619_irq_mask,
+       //.irq_unmask = ricoh619_irq_unmask,
+       .irq_enable = ricoh619_irq_unmask,
+       .irq_disable = ricoh619_irq_mask,
        .irq_bus_lock = ricoh619_irq_lock,
        .irq_bus_sync_unlock = ricoh619_irq_sync_unlock,
        .irq_set_type = ricoh619_irq_set_type,
index feb23c8c96e8eb6a31d6d5832f51cd3dc0a53914..0893bd1b0f05155c58f7ba5b4d670a753a0399f1 100755 (executable)
@@ -429,7 +429,7 @@ static int ricoh619_device_shutdown(struct i2c_client *client)
        return 0;
 }
 EXPORT_SYMBOL_GPL(ricoh619_device_shutdown);
-static int ricoh619_power_off(void)
+static void ricoh619_power_off(void)
 {
        int ret,i=0;
        uint8_t val,charge_state;
@@ -912,9 +912,10 @@ extern u8 ricoh619_pwr_key_reg;
 int ricoh619_pwrkey_wakeup = 0;
 static int ricoh619_i2c_suspend(struct i2c_client *client, pm_message_t state)
 {
-//     if (g_ricoh619->chip_irq)
-//             disable_irq(g_ricoh619->chip_irq);
 //     printk("PMU: %s: \n",__func__);
+
+       if (g_ricoh619->chip_irq)
+               disable_irq(g_ricoh619->chip_irq);
        ricoh619_pwrkey_wakeup = 1;
        __ricoh619_write(client, RICOH619_INT_IR_SYS, 0x0); //Clear PWR_KEY IRQ
         __ricoh619_read(client, RICOH619_INT_IR_SYS, &ricoh619_pwr_key_reg);
@@ -932,10 +933,33 @@ static int ricoh619_i2c_resume(struct i2c_client *client)
                __ricoh619_write(client, RICOH619_INT_IR_SYS, 0x0); //Clear PWR_KEY IRQ
        }
        */
-//     enable_irq(g_ricoh619->chip_irq);
+       
+       if (g_ricoh619->chip_irq)
+               enable_irq(g_ricoh619->chip_irq);
        return 0;
 }
 
+static int  ricoh619_i2c_late_suspend(struct device *dev)
+{
+       struct i2c_client *client = i2c_verify_client(dev);
+
+        ricoh619_i2c_suspend(client,PMSG_SUSPEND);
+       return 0;
+}
+
+static int rockchip_i2c_late_resume(struct device *dev)
+{
+       struct i2c_client *client = i2c_verify_client(dev);    
+    
+        ricoh619_i2c_resume(client);
+       return 0;
+}
+
+static const struct dev_pm_ops ricoh619_i2c_dev_pm= {
+       .suspend_late = ricoh619_i2c_late_suspend,
+       .resume_early = rockchip_i2c_late_resume,
+};
+
 #endif
 
 static const struct i2c_device_id ricoh619_i2c_id[] = {
@@ -952,20 +976,19 @@ static const struct of_device_id ricoh619_dt_match[] = {
 MODULE_DEVICE_TABLE(of, ricoh619_dt_match);
 #endif
 
-
 static struct i2c_driver ricoh619_i2c_driver = {
        .driver = {
                   .name = "ricoh619",
                   .owner = THIS_MODULE,
+                  #ifdef CONFIG_PM
+                   .pm = (&ricoh619_i2c_dev_pm),
+                  #endif                  
                   .of_match_table = of_match_ptr(ricoh619_dt_match),
                   },
        .probe = ricoh619_i2c_probe,
        .remove = ricoh619_i2c_remove,
        .shutdown = ricoh619_device_shutdown,
-#ifdef CONFIG_PM
-       .suspend = ricoh619_i2c_suspend,
-       .resume = ricoh619_i2c_resume,
-#endif
+
        .id_table = ricoh619_i2c_id,
 };