Lines Matching refs:pcf
24 int pcf50633_register_irq(struct pcf50633 *pcf, int irq, in pcf50633_register_irq() argument
30 if (WARN_ON(pcf->irq_handler[irq].handler)) in pcf50633_register_irq()
33 mutex_lock(&pcf->lock); in pcf50633_register_irq()
34 pcf->irq_handler[irq].handler = handler; in pcf50633_register_irq()
35 pcf->irq_handler[irq].data = data; in pcf50633_register_irq()
36 mutex_unlock(&pcf->lock); in pcf50633_register_irq()
42 int pcf50633_free_irq(struct pcf50633 *pcf, int irq) in pcf50633_free_irq() argument
47 mutex_lock(&pcf->lock); in pcf50633_free_irq()
48 pcf->irq_handler[irq].handler = NULL; in pcf50633_free_irq()
49 mutex_unlock(&pcf->lock); in pcf50633_free_irq()
55 static int __pcf50633_irq_mask_set(struct pcf50633 *pcf, int irq, u8 mask) in __pcf50633_irq_mask_set() argument
64 pcf50633_reg_set_bit_mask(pcf, reg, bit, mask ? bit : 0); in __pcf50633_irq_mask_set()
66 mutex_lock(&pcf->lock); in __pcf50633_irq_mask_set()
69 pcf->mask_regs[idx] |= bit; in __pcf50633_irq_mask_set()
71 pcf->mask_regs[idx] &= ~bit; in __pcf50633_irq_mask_set()
73 mutex_unlock(&pcf->lock); in __pcf50633_irq_mask_set()
78 int pcf50633_irq_mask(struct pcf50633 *pcf, int irq) in pcf50633_irq_mask() argument
80 dev_dbg(pcf->dev, "Masking IRQ %d\n", irq); in pcf50633_irq_mask()
82 return __pcf50633_irq_mask_set(pcf, irq, 1); in pcf50633_irq_mask()
86 int pcf50633_irq_unmask(struct pcf50633 *pcf, int irq) in pcf50633_irq_unmask() argument
88 dev_dbg(pcf->dev, "Unmasking IRQ %d\n", irq); in pcf50633_irq_unmask()
90 return __pcf50633_irq_mask_set(pcf, irq, 0); in pcf50633_irq_unmask()
94 int pcf50633_irq_mask_get(struct pcf50633 *pcf, int irq) in pcf50633_irq_mask_get() argument
101 return pcf->mask_regs[reg] & bits; in pcf50633_irq_mask_get()
105 static void pcf50633_irq_call_handler(struct pcf50633 *pcf, int irq) in pcf50633_irq_call_handler() argument
107 if (pcf->irq_handler[irq].handler) in pcf50633_irq_call_handler()
108 pcf->irq_handler[irq].handler(irq, pcf->irq_handler[irq].data); in pcf50633_irq_call_handler()
116 struct pcf50633 *pcf = data; in pcf50633_irq() local
121 ret = pcf50633_read_block(pcf, PCF50633_REG_INT1, in pcf50633_irq()
124 dev_err(pcf->dev, "Error reading INT registers\n"); in pcf50633_irq()
134 pcf50633_reg_write(pcf, PCF50633_REG_OOCSHDWN, 0x04); in pcf50633_irq()
139 chgstat = pcf50633_reg_read(pcf, PCF50633_REG_MBCS2); in pcf50633_irq()
148 chgstat = pcf50633_reg_read(pcf, PCF50633_REG_MBCS2); in pcf50633_irq()
155 dev_dbg(pcf->dev, "INT1=0x%02x INT2=0x%02x INT3=0x%02x " in pcf50633_irq()
161 if ((pcf_int[0] & PCF50633_INT1_SECOND) && pcf->onkey1s_held) { in pcf50633_irq()
162 dev_info(pcf->dev, "ONKEY1S held for %d secs\n", in pcf50633_irq()
163 pcf->onkey1s_held); in pcf50633_irq()
164 if (pcf->onkey1s_held++ == PCF50633_ONKEY1S_TIMEOUT) in pcf50633_irq()
165 if (pcf->pdata->force_shutdown) in pcf50633_irq()
166 pcf->pdata->force_shutdown(pcf); in pcf50633_irq()
170 dev_info(pcf->dev, "ONKEY1S held\n"); in pcf50633_irq()
171 pcf->onkey1s_held = 1 ; in pcf50633_irq()
174 pcf50633_reg_clear_bits(pcf, PCF50633_REG_INT1M, in pcf50633_irq()
178 pcf50633_reg_clear_bits(pcf, PCF50633_REG_INT2M, in pcf50633_irq()
182 if ((pcf_int[1] & PCF50633_INT2_ONKEYR) && pcf->onkey1s_held) { in pcf50633_irq()
183 pcf->onkey1s_held = 0; in pcf50633_irq()
186 if (pcf->mask_regs[0] & PCF50633_INT1_SECOND) in pcf50633_irq()
187 pcf50633_reg_set_bit_mask(pcf, in pcf50633_irq()
192 if (pcf->mask_regs[1] & PCF50633_INT2_ONKEYR) in pcf50633_irq()
193 pcf50633_reg_set_bit_mask(pcf, in pcf50633_irq()
200 if (pcf->is_suspended) { in pcf50633_irq()
201 pcf->is_suspended = 0; in pcf50633_irq()
205 pcf->resume_reason[i] = pcf_int[i] & in pcf50633_irq()
206 pcf->pdata->resumers[i]; in pcf50633_irq()
215 pcf_int[i] &= ~pcf->mask_regs[i]; in pcf50633_irq()
219 pcf50633_irq_call_handler(pcf, (i * 8) + j); in pcf50633_irq()
228 int pcf50633_irq_suspend(struct pcf50633 *pcf) in pcf50633_irq_suspend() argument
237 disable_irq(pcf->irq); in pcf50633_irq_suspend()
240 ret = pcf50633_read_block(pcf, PCF50633_REG_INT1M, in pcf50633_irq_suspend()
241 ARRAY_SIZE(pcf->suspend_irq_masks), in pcf50633_irq_suspend()
242 pcf->suspend_irq_masks); in pcf50633_irq_suspend()
244 dev_err(pcf->dev, "error saving irq masks\n"); in pcf50633_irq_suspend()
250 res[i] = ~pcf->pdata->resumers[i]; in pcf50633_irq_suspend()
252 ret = pcf50633_write_block(pcf, PCF50633_REG_INT1M, in pcf50633_irq_suspend()
255 dev_err(pcf->dev, "error writing wakeup irq masks\n"); in pcf50633_irq_suspend()
259 pcf->is_suspended = 1; in pcf50633_irq_suspend()
265 int pcf50633_irq_resume(struct pcf50633 *pcf) in pcf50633_irq_resume() argument
270 ret = pcf50633_write_block(pcf, PCF50633_REG_INT1M, in pcf50633_irq_resume()
271 ARRAY_SIZE(pcf->suspend_irq_masks), in pcf50633_irq_resume()
272 pcf->suspend_irq_masks); in pcf50633_irq_resume()
274 dev_err(pcf->dev, "Error restoring saved suspend masks\n"); in pcf50633_irq_resume()
276 enable_irq(pcf->irq); in pcf50633_irq_resume()
283 int pcf50633_irq_init(struct pcf50633 *pcf, int irq) in pcf50633_irq_init() argument
287 pcf->irq = irq; in pcf50633_irq_init()
290 pcf->mask_regs[0] = 0x80; in pcf50633_irq_init()
291 pcf50633_reg_write(pcf, PCF50633_REG_INT1M, pcf->mask_regs[0]); in pcf50633_irq_init()
292 pcf50633_reg_write(pcf, PCF50633_REG_INT2M, 0x00); in pcf50633_irq_init()
293 pcf50633_reg_write(pcf, PCF50633_REG_INT3M, 0x00); in pcf50633_irq_init()
294 pcf50633_reg_write(pcf, PCF50633_REG_INT4M, 0x00); in pcf50633_irq_init()
295 pcf50633_reg_write(pcf, PCF50633_REG_INT5M, 0x00); in pcf50633_irq_init()
299 "pcf50633", pcf); in pcf50633_irq_init()
302 dev_err(pcf->dev, "Failed to request IRQ %d\n", ret); in pcf50633_irq_init()
305 dev_err(pcf->dev, "IRQ %u cannot be enabled as wake-up source" in pcf50633_irq_init()
311 void pcf50633_irq_free(struct pcf50633 *pcf) in pcf50633_irq_free() argument
313 free_irq(pcf->irq, pcf); in pcf50633_irq_free()