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()
226 static void egpio_write_cache(struct egpio_info *ei) in egpio_write_cache() argument
232 for (i = 0; i < ei->nchips; i++) { in egpio_write_cache()
233 egpio = &(ei->chip[i]); in egpio_write_cache()
238 shift += (1<<ei->reg_shift)) { in egpio_write_cache()
240 int reg = egpio->reg_start + egpio_pos(ei, shift); in egpio_write_cache()
242 if (!((egpio->is_out >> shift) & ei->reg_mask)) in egpio_write_cache()
246 (egpio->cached_values >> shift) & ei->reg_mask, in egpio_write_cache()
247 egpio_readw(ei, reg)); in egpio_write_cache()
250 & ei->reg_mask, ei, reg); in egpio_write_cache()
264 struct egpio_info *ei; in egpio_probe() local
271 ei = devm_kzalloc(&pdev->dev, sizeof(*ei), GFP_KERNEL); in egpio_probe()
272 if (!ei) in egpio_probe()
275 spin_lock_init(&ei->lock); in egpio_probe()
281 ei->chained_irq = res->start; in egpio_probe()
287 ei->base_addr = devm_ioremap_nocache(&pdev->dev, res->start, in egpio_probe()
289 if (!ei->base_addr) in egpio_probe()
291 pr_debug("EGPIO phys=%08x virt=%p\n", (u32)res->start, ei->base_addr); in egpio_probe()
295 ei->bus_shift = fls(pdata->bus_width - 1) - 3; in egpio_probe()
296 pr_debug("bus_shift = %d\n", ei->bus_shift); in egpio_probe()
300 ei->reg_shift = fls(pdata->reg_width - 1); in egpio_probe()
301 pr_debug("reg_shift = %d\n", ei->reg_shift); in egpio_probe()
303 ei->reg_mask = (1 << pdata->reg_width) - 1; in egpio_probe()
305 platform_set_drvdata(pdev, ei); in egpio_probe()
307 ei->nchips = pdata->num_chips; in egpio_probe()
308 ei->chip = devm_kcalloc(&pdev->dev, in egpio_probe()
309 ei->nchips, sizeof(struct egpio_chip), in egpio_probe()
311 if (!ei->chip) { in egpio_probe()
315 for (i = 0; i < ei->nchips; i++) { in egpio_probe()
316 ei->chip[i].reg_start = pdata->chip[i].reg_start; in egpio_probe()
317 ei->chip[i].cached_values = pdata->chip[i].initial_values; in egpio_probe()
318 ei->chip[i].is_out = pdata->chip[i].direction; in egpio_probe()
319 ei->chip[i].dev = &(pdev->dev); in egpio_probe()
320 chip = &(ei->chip[i].chip); in egpio_probe()
338 gpiochip_add_data(chip, &ei->chip[i]); in egpio_probe()
342 egpio_write_cache(ei); in egpio_probe()
344 ei->irq_start = pdata->irq_base; in egpio_probe()
345 ei->nirqs = pdata->num_irqs; in egpio_probe()
346 ei->ack_register = pdata->ack_register; in egpio_probe()
348 if (ei->chained_irq) { in egpio_probe()
350 ei->ack_write = 0xFFFF; in egpio_probe()
352 ei->ack_write = 0; in egpio_probe()
353 irq_end = ei->irq_start + ei->nirqs; in egpio_probe()
354 for (irq = ei->irq_start; irq < irq_end; irq++) { in egpio_probe()
357 irq_set_chip_data(irq, ei); in egpio_probe()
360 irq_set_irq_type(ei->chained_irq, IRQ_TYPE_EDGE_RISING); in egpio_probe()
361 irq_set_chained_handler_and_data(ei->chained_irq, in egpio_probe()
362 egpio_handler, ei); in egpio_probe()
363 ack_irqs(ei); in egpio_probe()
378 struct egpio_info *ei = platform_get_drvdata(pdev); in egpio_suspend() local
380 if (ei->chained_irq && device_may_wakeup(&pdev->dev)) in egpio_suspend()
381 enable_irq_wake(ei->chained_irq); in egpio_suspend()
387 struct egpio_info *ei = platform_get_drvdata(pdev); in egpio_resume() local
389 if (ei->chained_irq && device_may_wakeup(&pdev->dev)) in egpio_resume()
390 disable_irq_wake(ei->chained_irq); in egpio_resume()
394 egpio_write_cache(ei); in egpio_resume()