Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

pm2301-charger: Adjust interrupt handler behavior

Signed-off-by: M BenZoubeir <mustapha.ben.zoubeir-xsig@stericsson.com>
Signed-off-by: Lee Jones <lee.jones@linaro.org>
Reviewed-by: Philippe LANGLAIS <philippe.langlais@stericsson.com>

authored by

M BenZoubeir and committed by
Lee Jones
f4095a0f b3ea5f45

+25 -22
+24 -21
drivers/power/pm2301_charger.c
··· 493 493 struct pm2xxx_interrupts *interrupt = pm2->pm2_int; 494 494 int i; 495 495 496 - for (i = 0; i < PM2XXX_NUM_INT_REG; i++) { 497 - pm2xxx_reg_read(pm2, 496 + do { 497 + for (i = 0; i < PM2XXX_NUM_INT_REG; i++) { 498 + pm2xxx_reg_read(pm2, 498 499 pm2xxx_interrupt_registers[i], 499 500 &(interrupt->reg[i])); 500 501 501 - if (interrupt->reg[i] > 0) 502 - interrupt->handler[i](pm2, interrupt->reg[i]); 503 - } 502 + if (interrupt->reg[i] > 0) 503 + interrupt->handler[i](pm2, interrupt->reg[i]); 504 + } 505 + } while (gpio_get_value(pm2->pdata->gpio_irq_number) == 0); 504 506 505 507 return IRQ_HANDLED; 506 508 } ··· 953 951 struct pm2xxx_charger *pm2; 954 952 int ret = 0; 955 953 u8 val; 954 + int i; 956 955 957 956 pm2 = kzalloc(sizeof(struct pm2xxx_charger), GFP_KERNEL); 958 957 if (!pm2) { ··· 1065 1062 } 1066 1063 1067 1064 /* Register interrupts */ 1068 - ret = request_threaded_irq(pm2->pdata->irq_number, NULL, 1065 + ret = request_threaded_irq(gpio_to_irq(pm2->pdata->gpio_irq_number), 1066 + NULL, 1069 1067 pm2xxx_charger_irq[0].isr, 1070 1068 pm2->pdata->irq_type, 1071 1069 pm2xxx_charger_irq[0].name, pm2); 1072 1070 1073 1071 if (ret != 0) { 1074 1072 dev_err(pm2->dev, "failed to request %s IRQ %d: %d\n", 1075 - pm2xxx_charger_irq[0].name, pm2->pdata->irq_number, ret); 1073 + pm2xxx_charger_irq[0].name, 1074 + gpio_to_irq(pm2->pdata->gpio_irq_number), ret); 1076 1075 goto unregister_pm2xxx_charger; 1077 1076 } 1078 1077 /* pm interrupt can wake up system */ 1079 - ret = enable_irq_wake(pm2->pdata->irq_number); 1078 + ret = enable_irq_wake(gpio_to_irq(pm2->pdata->gpio_irq_number)); 1080 1079 if (ret) { 1081 1080 dev_err(pm2->dev, "failed to set irq wake\n"); 1082 1081 goto unregister_pm2xxx_interrupt; 1083 1082 } 1084 1083 1085 - /*Initialize lock*/ 1086 1084 mutex_init(&pm2->lock); 1087 1085 1088 1086 /* ··· 1103 1099 } 1104 1100 1105 1101 set_lpn_pin(pm2); 1102 + 1103 + /* read interrupt registers */ 1104 + for (i = 0; i < PM2XXX_NUM_INT_REG; i++) 1105 + pm2xxx_reg_read(pm2, 1106 + pm2xxx_interrupt_registers[i], 1107 + &val); 1108 + 1106 1109 ret = pm2xxx_charger_detection(pm2, &val); 1107 1110 1108 1111 if ((ret == 0) && val) { 1109 - /* 1110 - * When boot is due to AC charger plug-in, 1111 - * read interrupt registers 1112 - */ 1113 - pm2xxx_reg_read(pm2, PM2XXX_REG_INT1, &val); 1114 - pm2xxx_reg_read(pm2, PM2XXX_REG_INT2, &val); 1115 - pm2xxx_reg_read(pm2, PM2XXX_REG_INT4, &val); 1116 1112 pm2->ac.charger_connected = 1; 1117 1113 ab8500_override_turn_on_stat(~AB8500_POW_KEY_1_ON, 1118 1114 AB8500_MAIN_CH_DET); ··· 1126 1122 free_gpio: 1127 1123 gpio_free(pm2->lpn_pin); 1128 1124 disable_pm2_irq_wake: 1129 - disable_irq_wake(pm2->pdata->irq_number); 1125 + disable_irq_wake(gpio_to_irq(pm2->pdata->gpio_irq_number)); 1130 1126 unregister_pm2xxx_interrupt: 1131 1127 /* disable interrupt */ 1132 - free_irq(pm2->pdata->irq_number, pm2); 1128 + free_irq(gpio_to_irq(pm2->pdata->gpio_irq_number), pm2); 1133 1129 unregister_pm2xxx_charger: 1134 1130 /* unregister power supply */ 1135 1131 power_supply_unregister(&pm2->ac_chg.psy); ··· 1152 1148 pm2xxx_charger_ac_en(&pm2->ac_chg, false, 0, 0); 1153 1149 1154 1150 /* Disable wake by pm interrupt */ 1155 - disable_irq_wake(pm2->pdata->irq_number); 1151 + disable_irq_wake(gpio_to_irq(pm2->pdata->gpio_irq_number)); 1156 1152 1157 1153 /* Disable interrupts */ 1158 - free_irq(pm2->pdata->irq_number, pm2); 1154 + free_irq(gpio_to_irq(pm2->pdata->gpio_irq_number), pm2); 1159 1155 1160 1156 /* Delete the work queue */ 1161 1157 destroy_workqueue(pm2->charger_wq); ··· 1167 1163 1168 1164 power_supply_unregister(&pm2->ac_chg.psy); 1169 1165 1170 - /*Free GPIO60*/ 1171 1166 gpio_free(pm2->lpn_pin); 1172 1167 1173 1168 kfree(pm2);
+1 -1
include/linux/pm2301_charger.h
··· 48 48 size_t num_supplicants; 49 49 int i2c_bus; 50 50 const char *label; 51 - int irq_number; 51 + int gpio_irq_number; 52 52 unsigned int lpn_gpio; 53 53 int irq_type; 54 54 };