Lines Matching refs:plgpio

65 struct plgpio {  struct
110 struct plgpio *plgpio = container_of(chip, struct plgpio, chip); in plgpio_direction_input() local
114 if (plgpio->p2o && (plgpio->p2o_regs & PTO_DIR_REG)) { in plgpio_direction_input()
115 offset = plgpio->p2o(offset); in plgpio_direction_input()
120 spin_lock_irqsave(&plgpio->lock, flags); in plgpio_direction_input()
121 plgpio_reg_set(plgpio->base, offset, plgpio->regs.dir); in plgpio_direction_input()
122 spin_unlock_irqrestore(&plgpio->lock, flags); in plgpio_direction_input()
130 struct plgpio *plgpio = container_of(chip, struct plgpio, chip); in plgpio_direction_output() local
135 if (plgpio->p2o && (plgpio->p2o_regs & (PTO_DIR_REG | PTO_WDATA_REG))) { in plgpio_direction_output()
136 tmp = plgpio->p2o(offset); in plgpio_direction_output()
140 if (plgpio->p2o_regs & PTO_DIR_REG) in plgpio_direction_output()
142 if (plgpio->p2o_regs & PTO_WDATA_REG) in plgpio_direction_output()
146 spin_lock_irqsave(&plgpio->lock, flags); in plgpio_direction_output()
148 plgpio_reg_set(plgpio->base, wdata_offset, in plgpio_direction_output()
149 plgpio->regs.wdata); in plgpio_direction_output()
151 plgpio_reg_reset(plgpio->base, wdata_offset, in plgpio_direction_output()
152 plgpio->regs.wdata); in plgpio_direction_output()
154 plgpio_reg_reset(plgpio->base, dir_offset, plgpio->regs.dir); in plgpio_direction_output()
155 spin_unlock_irqrestore(&plgpio->lock, flags); in plgpio_direction_output()
162 struct plgpio *plgpio = container_of(chip, struct plgpio, chip); in plgpio_get_value() local
168 if (plgpio->p2o && (plgpio->p2o_regs & PTO_RDATA_REG)) { in plgpio_get_value()
169 offset = plgpio->p2o(offset); in plgpio_get_value()
174 return is_plgpio_set(plgpio->base, offset, plgpio->regs.rdata); in plgpio_get_value()
179 struct plgpio *plgpio = container_of(chip, struct plgpio, chip); in plgpio_set_value() local
185 if (plgpio->p2o && (plgpio->p2o_regs & PTO_WDATA_REG)) { in plgpio_set_value()
186 offset = plgpio->p2o(offset); in plgpio_set_value()
192 plgpio_reg_set(plgpio->base, offset, plgpio->regs.wdata); in plgpio_set_value()
194 plgpio_reg_reset(plgpio->base, offset, plgpio->regs.wdata); in plgpio_set_value()
199 struct plgpio *plgpio = container_of(chip, struct plgpio, chip); in plgpio_request() local
211 if (!IS_ERR(plgpio->clk)) { in plgpio_request()
212 ret = clk_enable(plgpio->clk); in plgpio_request()
217 if (plgpio->regs.enb == -1) in plgpio_request()
228 if (plgpio->p2o && (plgpio->p2o_regs & PTO_ENB_REG)) { in plgpio_request()
229 offset = plgpio->p2o(offset); in plgpio_request()
236 spin_lock_irqsave(&plgpio->lock, flags); in plgpio_request()
237 plgpio_reg_set(plgpio->base, offset, plgpio->regs.enb); in plgpio_request()
238 spin_unlock_irqrestore(&plgpio->lock, flags); in plgpio_request()
242 if (!IS_ERR(plgpio->clk)) in plgpio_request()
243 clk_disable(plgpio->clk); in plgpio_request()
251 struct plgpio *plgpio = container_of(chip, struct plgpio, chip); in plgpio_free() local
258 if (plgpio->regs.enb == -1) in plgpio_free()
262 if (plgpio->p2o && (plgpio->p2o_regs & PTO_ENB_REG)) { in plgpio_free()
263 offset = plgpio->p2o(offset); in plgpio_free()
268 spin_lock_irqsave(&plgpio->lock, flags); in plgpio_free()
269 plgpio_reg_reset(plgpio->base, offset, plgpio->regs.enb); in plgpio_free()
270 spin_unlock_irqrestore(&plgpio->lock, flags); in plgpio_free()
273 if (!IS_ERR(plgpio->clk)) in plgpio_free()
274 clk_disable(plgpio->clk); in plgpio_free()
283 struct plgpio *plgpio = container_of(gc, struct plgpio, chip); in plgpio_irq_disable() local
288 if (plgpio->p2o && (plgpio->p2o_regs & PTO_IE_REG)) { in plgpio_irq_disable()
289 offset = plgpio->p2o(offset); in plgpio_irq_disable()
294 spin_lock_irqsave(&plgpio->lock, flags); in plgpio_irq_disable()
295 plgpio_reg_set(plgpio->base, offset, plgpio->regs.ie); in plgpio_irq_disable()
296 spin_unlock_irqrestore(&plgpio->lock, flags); in plgpio_irq_disable()
302 struct plgpio *plgpio = container_of(gc, struct plgpio, chip); in plgpio_irq_enable() local
307 if (plgpio->p2o && (plgpio->p2o_regs & PTO_IE_REG)) { in plgpio_irq_enable()
308 offset = plgpio->p2o(offset); in plgpio_irq_enable()
313 spin_lock_irqsave(&plgpio->lock, flags); in plgpio_irq_enable()
314 plgpio_reg_reset(plgpio->base, offset, plgpio->regs.ie); in plgpio_irq_enable()
315 spin_unlock_irqrestore(&plgpio->lock, flags); in plgpio_irq_enable()
321 struct plgpio *plgpio = container_of(gc, struct plgpio, chip); in plgpio_irq_set_type() local
326 if (offset >= plgpio->chip.ngpio) in plgpio_irq_set_type()
329 if (plgpio->regs.eit == -1) in plgpio_irq_set_type()
337 if (plgpio->regs.eit == -1) in plgpio_irq_set_type()
340 reg_off = REG_OFFSET(plgpio->base, plgpio->regs.eit, offset); in plgpio_irq_set_type()
362 struct plgpio *plgpio = container_of(gc, struct plgpio, chip); in plgpio_irq_handler() local
367 count = plgpio->chip.ngpio; in plgpio_irq_handler()
373 pending = readl_relaxed(plgpio->base + plgpio->regs.mis + in plgpio_irq_handler()
379 writel_relaxed(~pending, plgpio->base + plgpio->regs.mis + in plgpio_irq_handler()
394 if (plgpio->o2p && (plgpio->p2o_regs & PTO_MIS_REG)) { in plgpio_irq_handler()
395 pin = plgpio->o2p(offset); in plgpio_irq_handler()
445 static int plgpio_probe_dt(struct platform_device *pdev, struct plgpio *plgpio) in plgpio_probe_dt() argument
452 plgpio->p2o = spear310_p2o; in plgpio_probe_dt()
453 plgpio->o2p = spear310_o2p; in plgpio_probe_dt()
454 plgpio->p2o_regs = PTO_WDATA_REG | PTO_DIR_REG | PTO_IE_REG | in plgpio_probe_dt()
459 plgpio->chip.ngpio = val; in plgpio_probe_dt()
466 plgpio->regs.enb = val; in plgpio_probe_dt()
468 plgpio->regs.enb = -1; in plgpio_probe_dt()
471 plgpio->regs.wdata = val; in plgpio_probe_dt()
478 plgpio->regs.dir = val; in plgpio_probe_dt()
485 plgpio->regs.ie = val; in plgpio_probe_dt()
492 plgpio->regs.rdata = val; in plgpio_probe_dt()
499 plgpio->regs.mis = val; in plgpio_probe_dt()
506 plgpio->regs.eit = val; in plgpio_probe_dt()
508 plgpio->regs.eit = -1; in plgpio_probe_dt()
517 struct plgpio *plgpio; in plgpio_probe() local
521 plgpio = devm_kzalloc(&pdev->dev, sizeof(*plgpio), GFP_KERNEL); in plgpio_probe()
522 if (!plgpio) { in plgpio_probe()
528 plgpio->base = devm_ioremap_resource(&pdev->dev, res); in plgpio_probe()
529 if (IS_ERR(plgpio->base)) in plgpio_probe()
530 return PTR_ERR(plgpio->base); in plgpio_probe()
532 ret = plgpio_probe_dt(pdev, plgpio); in plgpio_probe()
538 plgpio->clk = devm_clk_get(&pdev->dev, NULL); in plgpio_probe()
539 if (IS_ERR(plgpio->clk)) in plgpio_probe()
543 plgpio->csave_regs = devm_kzalloc(&pdev->dev, in plgpio_probe()
544 sizeof(*plgpio->csave_regs) * in plgpio_probe()
545 DIV_ROUND_UP(plgpio->chip.ngpio, MAX_GPIO_PER_REG), in plgpio_probe()
547 if (!plgpio->csave_regs) { in plgpio_probe()
553 platform_set_drvdata(pdev, plgpio); in plgpio_probe()
554 spin_lock_init(&plgpio->lock); in plgpio_probe()
556 plgpio->chip.base = -1; in plgpio_probe()
557 plgpio->chip.request = plgpio_request; in plgpio_probe()
558 plgpio->chip.free = plgpio_free; in plgpio_probe()
559 plgpio->chip.direction_input = plgpio_direction_input; in plgpio_probe()
560 plgpio->chip.direction_output = plgpio_direction_output; in plgpio_probe()
561 plgpio->chip.get = plgpio_get_value; in plgpio_probe()
562 plgpio->chip.set = plgpio_set_value; in plgpio_probe()
563 plgpio->chip.label = dev_name(&pdev->dev); in plgpio_probe()
564 plgpio->chip.dev = &pdev->dev; in plgpio_probe()
565 plgpio->chip.owner = THIS_MODULE; in plgpio_probe()
566 plgpio->chip.of_node = pdev->dev.of_node; in plgpio_probe()
568 if (!IS_ERR(plgpio->clk)) { in plgpio_probe()
569 ret = clk_prepare(plgpio->clk); in plgpio_probe()
576 ret = gpiochip_add(&plgpio->chip); in plgpio_probe()
588 ret = gpiochip_irqchip_add(&plgpio->chip, in plgpio_probe()
598 gpiochip_set_chained_irqchip(&plgpio->chip, in plgpio_probe()
609 gpiochip_remove(&plgpio->chip); in plgpio_probe()
611 if (!IS_ERR(plgpio->clk)) in plgpio_probe()
612 clk_unprepare(plgpio->clk); in plgpio_probe()
620 struct plgpio *plgpio = dev_get_drvdata(dev); in plgpio_suspend() local
621 int i, reg_count = DIV_ROUND_UP(plgpio->chip.ngpio, MAX_GPIO_PER_REG); in plgpio_suspend()
625 off = plgpio->base + i * sizeof(int *); in plgpio_suspend()
627 if (plgpio->regs.enb != -1) in plgpio_suspend()
628 plgpio->csave_regs[i].enb = in plgpio_suspend()
629 readl_relaxed(plgpio->regs.enb + off); in plgpio_suspend()
630 if (plgpio->regs.eit != -1) in plgpio_suspend()
631 plgpio->csave_regs[i].eit = in plgpio_suspend()
632 readl_relaxed(plgpio->regs.eit + off); in plgpio_suspend()
633 plgpio->csave_regs[i].wdata = readl_relaxed(plgpio->regs.wdata + in plgpio_suspend()
635 plgpio->csave_regs[i].dir = readl_relaxed(plgpio->regs.dir + in plgpio_suspend()
637 plgpio->csave_regs[i].ie = readl_relaxed(plgpio->regs.ie + off); in plgpio_suspend()
651 _tmp = readl_relaxed(plgpio->regs.__reg + _off); \
653 plgpio->csave_regs[i].__reg = \
654 _tmp | (plgpio->csave_regs[i].__reg & _mask); \
659 struct plgpio *plgpio = dev_get_drvdata(dev); in plgpio_resume() local
660 int i, reg_count = DIV_ROUND_UP(plgpio->chip.ngpio, MAX_GPIO_PER_REG); in plgpio_resume()
665 off = plgpio->base + i * sizeof(int *); in plgpio_resume()
668 mask = (1 << (plgpio->chip.ngpio - i * in plgpio_resume()
671 if (plgpio->regs.enb != -1) in plgpio_resume()
674 if (plgpio->regs.eit != -1) in plgpio_resume()
682 writel_relaxed(plgpio->csave_regs[i].wdata, plgpio->regs.wdata + in plgpio_resume()
684 writel_relaxed(plgpio->csave_regs[i].dir, plgpio->regs.dir + in plgpio_resume()
687 if (plgpio->regs.eit != -1) in plgpio_resume()
688 writel_relaxed(plgpio->csave_regs[i].eit, in plgpio_resume()
689 plgpio->regs.eit + off); in plgpio_resume()
691 writel_relaxed(plgpio->csave_regs[i].ie, plgpio->regs.ie + off); in plgpio_resume()
693 if (plgpio->regs.enb != -1) in plgpio_resume()
694 writel_relaxed(plgpio->csave_regs[i].enb, in plgpio_resume()
695 plgpio->regs.enb + off); in plgpio_resume()