Lines Matching refs:ei

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