Lines Matching refs:ei
53 static inline void egpio_writew(u16 value, struct egpio_info *ei, int reg) in egpio_writew() argument
55 writew(value, ei->base_addr + (reg << ei->bus_shift)); in egpio_writew()
58 static inline u16 egpio_readw(struct egpio_info *ei, int reg) in egpio_readw() argument
60 return readw(ei->base_addr + (reg << ei->bus_shift)); in egpio_readw()
67 static inline void ack_irqs(struct egpio_info *ei) in ack_irqs() argument
69 egpio_writew(ei->ack_write, ei, ei->ack_register); in ack_irqs()
71 ei->ack_write, ei->ack_register << ei->bus_shift); in ack_irqs()
83 struct egpio_info *ei = irq_data_get_irq_chip_data(data); in egpio_mask() local
84 ei->irqs_enabled &= ~(1 << (data->irq - ei->irq_start)); in egpio_mask()
85 pr_debug("EGPIO mask %d %04x\n", data->irq, ei->irqs_enabled); in egpio_mask()
90 struct egpio_info *ei = irq_data_get_irq_chip_data(data); in egpio_unmask() local
91 ei->irqs_enabled |= 1 << (data->irq - ei->irq_start); in egpio_unmask()
92 pr_debug("EGPIO unmask %d %04x\n", data->irq, ei->irqs_enabled); in egpio_unmask()
104 struct egpio_info *ei = irq_desc_get_handler_data(desc); in egpio_handler() local
108 unsigned long readval = egpio_readw(ei, ei->ack_register); in egpio_handler()
111 ack_irqs(ei); in egpio_handler()
113 readval &= ei->irqs_enabled; in egpio_handler()
114 for_each_set_bit(irqpin, &readval, ei->nirqs) { in egpio_handler()
117 generic_handle_irq(ei->irq_start + irqpin); in egpio_handler()
121 static inline int egpio_pos(struct egpio_info *ei, int bit) in egpio_pos() argument
123 return bit >> ei->reg_shift; in egpio_pos()
126 static inline int egpio_bit(struct egpio_info *ei, int bit) in egpio_bit() argument
128 return 1 << (bit & ((1 << ei->reg_shift)-1)); in egpio_bit()
138 struct egpio_info *ei; in egpio_get() local
146 ei = dev_get_drvdata(egpio->dev); in egpio_get()
147 bit = egpio_bit(ei, offset); in egpio_get()
148 reg = egpio->reg_start + egpio_pos(ei, offset); in egpio_get()
153 value = egpio_readw(ei, reg); in egpio_get()
155 ei->base_addr, reg << ei->bus_shift, value); in egpio_get()
177 struct egpio_info *ei; in egpio_set() local
186 ei = dev_get_drvdata(egpio->dev); in egpio_set()
187 pos = egpio_pos(ei, offset); in egpio_set()
189 shift = pos << ei->reg_shift; in egpio_set()
192 reg, (egpio->cached_values >> shift) & ei->reg_mask); in egpio_set()
194 spin_lock_irqsave(&ei->lock, flag); in egpio_set()
199 egpio_writew((egpio->cached_values >> shift) & ei->reg_mask, ei, reg); in egpio_set()
200 spin_unlock_irqrestore(&ei->lock, flag); in egpio_set()
229 static void egpio_write_cache(struct egpio_info *ei) in egpio_write_cache() argument
235 for (i = 0; i < ei->nchips; i++) { in egpio_write_cache()
236 egpio = &(ei->chip[i]); in egpio_write_cache()
241 shift += (1<<ei->reg_shift)) { in egpio_write_cache()
243 int reg = egpio->reg_start + egpio_pos(ei, shift); in egpio_write_cache()
245 if (!((egpio->is_out >> shift) & ei->reg_mask)) in egpio_write_cache()
249 (egpio->cached_values >> shift) & ei->reg_mask, in egpio_write_cache()
250 egpio_readw(ei, reg)); in egpio_write_cache()
253 & ei->reg_mask, ei, reg); in egpio_write_cache()
267 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()
282 ei->chained_irq = res->start; in egpio_probe()
285 ei->base_addr = devm_platform_ioremap_resource(pdev, 0); in egpio_probe()
286 if (IS_ERR(ei->base_addr)) in egpio_probe()
287 return PTR_ERR(ei->base_addr); in egpio_probe()
292 ei->bus_shift = fls(pdata->bus_width - 1) - 3; in egpio_probe()
293 pr_debug("bus_shift = %d\n", ei->bus_shift); in egpio_probe()
298 ei->reg_shift = fls(pdata->reg_width - 1); in egpio_probe()
299 pr_debug("reg_shift = %d\n", ei->reg_shift); in egpio_probe()
301 ei->reg_mask = (1 << pdata->reg_width) - 1; in egpio_probe()
303 platform_set_drvdata(pdev, ei); in egpio_probe()
305 ei->nchips = pdata->num_chips; in egpio_probe()
306 ei->chip = devm_kcalloc(&pdev->dev, in egpio_probe()
307 ei->nchips, sizeof(struct egpio_chip), in egpio_probe()
309 if (!ei->chip) in egpio_probe()
312 for (i = 0; i < ei->nchips; i++) { in egpio_probe()
313 ei->chip[i].reg_start = pdata->chip[i].reg_start; in egpio_probe()
314 ei->chip[i].cached_values = pdata->chip[i].initial_values; in egpio_probe()
315 ei->chip[i].is_out = pdata->chip[i].direction; in egpio_probe()
316 ei->chip[i].dev = &(pdev->dev); in egpio_probe()
317 chip = &(ei->chip[i].chip); in egpio_probe()
334 gpiochip_add_data(chip, &ei->chip[i]); in egpio_probe()
338 egpio_write_cache(ei); in egpio_probe()
340 ei->irq_start = pdata->irq_base; in egpio_probe()
341 ei->nirqs = pdata->num_irqs; in egpio_probe()
342 ei->ack_register = pdata->ack_register; in egpio_probe()
344 if (ei->chained_irq) { in egpio_probe()
346 ei->ack_write = 0xFFFF; in egpio_probe()
348 ei->ack_write = 0; in egpio_probe()
349 irq_end = ei->irq_start + ei->nirqs; in egpio_probe()
350 for (irq = ei->irq_start; irq < irq_end; irq++) { in egpio_probe()
353 irq_set_chip_data(irq, ei); in egpio_probe()
356 irq_set_irq_type(ei->chained_irq, IRQ_TYPE_EDGE_RISING); in egpio_probe()
357 irq_set_chained_handler_and_data(ei->chained_irq, in egpio_probe()
358 egpio_handler, ei); in egpio_probe()
359 ack_irqs(ei); in egpio_probe()
370 struct egpio_info *ei = platform_get_drvdata(pdev); in egpio_suspend() local
372 if (ei->chained_irq && device_may_wakeup(&pdev->dev)) in egpio_suspend()
373 enable_irq_wake(ei->chained_irq); in egpio_suspend()
379 struct egpio_info *ei = platform_get_drvdata(pdev); in egpio_resume() local
381 if (ei->chained_irq && device_may_wakeup(&pdev->dev)) in egpio_resume()
382 disable_irq_wake(ei->chained_irq); in egpio_resume()
386 egpio_write_cache(ei); in egpio_resume()