Lines Matching refs:ei
52 static inline void egpio_writew(u16 value, struct egpio_info *ei, int reg) in egpio_writew() argument
54 writew(value, ei->base_addr + (reg << ei->bus_shift)); in egpio_writew()
57 static inline u16 egpio_readw(struct egpio_info *ei, int reg) in egpio_readw() argument
59 return readw(ei->base_addr + (reg << ei->bus_shift)); in egpio_readw()
66 static inline void ack_irqs(struct egpio_info *ei) in ack_irqs() argument
68 egpio_writew(ei->ack_write, ei, ei->ack_register); in ack_irqs()
70 ei->ack_write, ei->ack_register << ei->bus_shift); in ack_irqs()
82 struct egpio_info *ei = irq_data_get_irq_chip_data(data); in egpio_mask() local
83 ei->irqs_enabled &= ~(1 << (data->irq - ei->irq_start)); in egpio_mask()
84 pr_debug("EGPIO mask %d %04x\n", data->irq, ei->irqs_enabled); in egpio_mask()
89 struct egpio_info *ei = irq_data_get_irq_chip_data(data); in egpio_unmask() local
90 ei->irqs_enabled |= 1 << (data->irq - ei->irq_start); in egpio_unmask()
91 pr_debug("EGPIO unmask %d %04x\n", data->irq, ei->irqs_enabled); in egpio_unmask()
103 struct egpio_info *ei = irq_desc_get_handler_data(desc); in egpio_handler() local
107 unsigned long readval = egpio_readw(ei, ei->ack_register); in egpio_handler()
110 ack_irqs(ei); in egpio_handler()
112 readval &= ei->irqs_enabled; in egpio_handler()
113 for_each_set_bit(irqpin, &readval, ei->nirqs) { in egpio_handler()
116 generic_handle_irq(ei->irq_start + irqpin); in egpio_handler()
122 struct egpio_info *ei = dev_get_drvdata(dev); in htc_egpio_get_wakeup_irq() local
125 u16 readval = egpio_readw(ei, ei->ack_register); in htc_egpio_get_wakeup_irq()
127 ack_irqs(ei); in htc_egpio_get_wakeup_irq()
129 readval &= ei->irqs_enabled; in htc_egpio_get_wakeup_irq()
130 return ei->irq_start + ffs(readval) - 1; in htc_egpio_get_wakeup_irq()
134 static inline int egpio_pos(struct egpio_info *ei, int bit) in egpio_pos() argument
136 return bit >> ei->reg_shift; in egpio_pos()
139 static inline int egpio_bit(struct egpio_info *ei, int bit) in egpio_bit() argument
141 return 1 << (bit & ((1 << ei->reg_shift)-1)); in egpio_bit()
151 struct egpio_info *ei; in egpio_get() local
159 ei = dev_get_drvdata(egpio->dev); in egpio_get()
160 bit = egpio_bit(ei, offset); in egpio_get()
161 reg = egpio->reg_start + egpio_pos(ei, offset); in egpio_get()
163 value = egpio_readw(ei, reg); in egpio_get()
165 ei->base_addr, reg << ei->bus_shift, value); in egpio_get()
186 struct egpio_info *ei; in egpio_set() local
196 ei = dev_get_drvdata(egpio->dev); in egpio_set()
197 bit = egpio_bit(ei, offset); in egpio_set()
198 pos = egpio_pos(ei, offset); in egpio_set()
200 shift = pos << ei->reg_shift; in egpio_set()
203 reg, (egpio->cached_values >> shift) & ei->reg_mask); in egpio_set()
205 spin_lock_irqsave(&ei->lock, flag); in egpio_set()
210 egpio_writew((egpio->cached_values >> shift) & ei->reg_mask, ei, reg); in egpio_set()
211 spin_unlock_irqrestore(&ei->lock, flag); in egpio_set()
228 static void egpio_write_cache(struct egpio_info *ei) in egpio_write_cache() argument
234 for (i = 0; i < ei->nchips; i++) { in egpio_write_cache()
235 egpio = &(ei->chip[i]); in egpio_write_cache()
240 shift += (1<<ei->reg_shift)) { in egpio_write_cache()
242 int reg = egpio->reg_start + egpio_pos(ei, shift); in egpio_write_cache()
244 if (!((egpio->is_out >> shift) & ei->reg_mask)) in egpio_write_cache()
248 (egpio->cached_values >> shift) & ei->reg_mask, in egpio_write_cache()
249 egpio_readw(ei, reg)); in egpio_write_cache()
252 & ei->reg_mask, ei, reg); in egpio_write_cache()
266 struct egpio_info *ei; in egpio_probe() local
273 ei = devm_kzalloc(&pdev->dev, sizeof(*ei), GFP_KERNEL); in egpio_probe()
274 if (!ei) in egpio_probe()
277 spin_lock_init(&ei->lock); in egpio_probe()
283 ei->chained_irq = res->start; in egpio_probe()
289 ei->base_addr = devm_ioremap_nocache(&pdev->dev, res->start, in egpio_probe()
291 if (!ei->base_addr) in egpio_probe()
293 pr_debug("EGPIO phys=%08x virt=%p\n", (u32)res->start, ei->base_addr); in egpio_probe()
297 ei->bus_shift = fls(pdata->bus_width - 1) - 3; in egpio_probe()
298 pr_debug("bus_shift = %d\n", ei->bus_shift); in egpio_probe()
302 ei->reg_shift = fls(pdata->reg_width - 1); in egpio_probe()
303 pr_debug("reg_shift = %d\n", ei->reg_shift); in egpio_probe()
305 ei->reg_mask = (1 << pdata->reg_width) - 1; in egpio_probe()
307 platform_set_drvdata(pdev, ei); in egpio_probe()
309 ei->nchips = pdata->num_chips; in egpio_probe()
310 ei->chip = devm_kzalloc(&pdev->dev, in egpio_probe()
311 sizeof(struct egpio_chip) * ei->nchips, in egpio_probe()
313 if (!ei->chip) { in egpio_probe()
317 for (i = 0; i < ei->nchips; i++) { in egpio_probe()
318 ei->chip[i].reg_start = pdata->chip[i].reg_start; in egpio_probe()
319 ei->chip[i].cached_values = pdata->chip[i].initial_values; in egpio_probe()
320 ei->chip[i].is_out = pdata->chip[i].direction; in egpio_probe()
321 ei->chip[i].dev = &(pdev->dev); in egpio_probe()
322 chip = &(ei->chip[i].chip); in egpio_probe()
337 egpio_write_cache(ei); in egpio_probe()
339 ei->irq_start = pdata->irq_base; in egpio_probe()
340 ei->nirqs = pdata->num_irqs; in egpio_probe()
341 ei->ack_register = pdata->ack_register; in egpio_probe()
343 if (ei->chained_irq) { in egpio_probe()
345 ei->ack_write = 0xFFFF; in egpio_probe()
347 ei->ack_write = 0; in egpio_probe()
348 irq_end = ei->irq_start + ei->nirqs; in egpio_probe()
349 for (irq = ei->irq_start; irq < irq_end; irq++) { in egpio_probe()
352 irq_set_chip_data(irq, ei); in egpio_probe()
355 irq_set_irq_type(ei->chained_irq, IRQ_TYPE_EDGE_RISING); in egpio_probe()
356 irq_set_handler_data(ei->chained_irq, ei); in egpio_probe()
357 irq_set_chained_handler(ei->chained_irq, egpio_handler); in egpio_probe()
358 ack_irqs(ei); in egpio_probe()
372 struct egpio_info *ei = platform_get_drvdata(pdev); in egpio_remove() local
375 if (ei->chained_irq) { in egpio_remove()
376 irq_end = ei->irq_start + ei->nirqs; in egpio_remove()
377 for (irq = ei->irq_start; irq < irq_end; irq++) { in egpio_remove()
381 irq_set_chained_handler(ei->chained_irq, NULL); in egpio_remove()
391 struct egpio_info *ei = platform_get_drvdata(pdev); in egpio_suspend() local
393 if (ei->chained_irq && device_may_wakeup(&pdev->dev)) in egpio_suspend()
394 enable_irq_wake(ei->chained_irq); in egpio_suspend()
400 struct egpio_info *ei = platform_get_drvdata(pdev); in egpio_resume() local
402 if (ei->chained_irq && device_may_wakeup(&pdev->dev)) in egpio_resume()
403 disable_irq_wake(ei->chained_irq); in egpio_resume()
407 egpio_write_cache(ei); in egpio_resume()