Lines Matching refs:plgpio

67 struct plgpio {  struct
117 struct plgpio *plgpio = gpiochip_get_data(chip); in plgpio_direction_input() local
121 if (plgpio->p2o && (plgpio->p2o_regs & PTO_DIR_REG)) { in plgpio_direction_input()
122 offset = plgpio->p2o(offset); in plgpio_direction_input()
127 spin_lock_irqsave(&plgpio->lock, flags); in plgpio_direction_input()
128 plgpio_reg_set(plgpio->regmap, offset, plgpio->regs.dir); in plgpio_direction_input()
129 spin_unlock_irqrestore(&plgpio->lock, flags); in plgpio_direction_input()
137 struct plgpio *plgpio = gpiochip_get_data(chip); in plgpio_direction_output() local
142 if (plgpio->p2o && (plgpio->p2o_regs & (PTO_DIR_REG | PTO_WDATA_REG))) { in plgpio_direction_output()
143 tmp = plgpio->p2o(offset); in plgpio_direction_output()
147 if (plgpio->p2o_regs & PTO_DIR_REG) in plgpio_direction_output()
149 if (plgpio->p2o_regs & PTO_WDATA_REG) in plgpio_direction_output()
153 spin_lock_irqsave(&plgpio->lock, flags); in plgpio_direction_output()
155 plgpio_reg_set(plgpio->regmap, wdata_offset, in plgpio_direction_output()
156 plgpio->regs.wdata); in plgpio_direction_output()
158 plgpio_reg_reset(plgpio->regmap, wdata_offset, in plgpio_direction_output()
159 plgpio->regs.wdata); in plgpio_direction_output()
161 plgpio_reg_reset(plgpio->regmap, dir_offset, plgpio->regs.dir); in plgpio_direction_output()
162 spin_unlock_irqrestore(&plgpio->lock, flags); in plgpio_direction_output()
169 struct plgpio *plgpio = gpiochip_get_data(chip); in plgpio_get_value() local
175 if (plgpio->p2o && (plgpio->p2o_regs & PTO_RDATA_REG)) { in plgpio_get_value()
176 offset = plgpio->p2o(offset); in plgpio_get_value()
181 return is_plgpio_set(plgpio->regmap, offset, plgpio->regs.rdata); in plgpio_get_value()
186 struct plgpio *plgpio = gpiochip_get_data(chip); in plgpio_set_value() local
192 if (plgpio->p2o && (plgpio->p2o_regs & PTO_WDATA_REG)) { in plgpio_set_value()
193 offset = plgpio->p2o(offset); in plgpio_set_value()
199 plgpio_reg_set(plgpio->regmap, offset, plgpio->regs.wdata); in plgpio_set_value()
201 plgpio_reg_reset(plgpio->regmap, offset, plgpio->regs.wdata); in plgpio_set_value()
206 struct plgpio *plgpio = gpiochip_get_data(chip); in plgpio_request() local
218 if (!IS_ERR(plgpio->clk)) { in plgpio_request()
219 ret = clk_enable(plgpio->clk); in plgpio_request()
224 if (plgpio->regs.enb == -1) in plgpio_request()
235 if (plgpio->p2o && (plgpio->p2o_regs & PTO_ENB_REG)) { in plgpio_request()
236 offset = plgpio->p2o(offset); in plgpio_request()
243 spin_lock_irqsave(&plgpio->lock, flags); in plgpio_request()
244 plgpio_reg_set(plgpio->regmap, offset, plgpio->regs.enb); in plgpio_request()
245 spin_unlock_irqrestore(&plgpio->lock, flags); in plgpio_request()
249 if (!IS_ERR(plgpio->clk)) in plgpio_request()
250 clk_disable(plgpio->clk); in plgpio_request()
258 struct plgpio *plgpio = gpiochip_get_data(chip); in plgpio_free() local
265 if (plgpio->regs.enb == -1) in plgpio_free()
269 if (plgpio->p2o && (plgpio->p2o_regs & PTO_ENB_REG)) { in plgpio_free()
270 offset = plgpio->p2o(offset); in plgpio_free()
275 spin_lock_irqsave(&plgpio->lock, flags); in plgpio_free()
276 plgpio_reg_reset(plgpio->regmap, offset, plgpio->regs.enb); in plgpio_free()
277 spin_unlock_irqrestore(&plgpio->lock, flags); in plgpio_free()
280 if (!IS_ERR(plgpio->clk)) in plgpio_free()
281 clk_disable(plgpio->clk); in plgpio_free()
290 struct plgpio *plgpio = gpiochip_get_data(gc); in plgpio_irq_disable() local
295 if (plgpio->p2o && (plgpio->p2o_regs & PTO_IE_REG)) { in plgpio_irq_disable()
296 offset = plgpio->p2o(offset); in plgpio_irq_disable()
301 spin_lock_irqsave(&plgpio->lock, flags); in plgpio_irq_disable()
302 plgpio_reg_set(plgpio->regmap, offset, plgpio->regs.ie); in plgpio_irq_disable()
303 spin_unlock_irqrestore(&plgpio->lock, flags); in plgpio_irq_disable()
310 struct plgpio *plgpio = gpiochip_get_data(gc); in plgpio_irq_enable() local
315 if (plgpio->p2o && (plgpio->p2o_regs & PTO_IE_REG)) { in plgpio_irq_enable()
316 offset = plgpio->p2o(offset); in plgpio_irq_enable()
322 spin_lock_irqsave(&plgpio->lock, flags); in plgpio_irq_enable()
323 plgpio_reg_reset(plgpio->regmap, offset, plgpio->regs.ie); in plgpio_irq_enable()
324 spin_unlock_irqrestore(&plgpio->lock, flags); in plgpio_irq_enable()
330 struct plgpio *plgpio = gpiochip_get_data(gc); in plgpio_irq_set_type() local
335 if (offset >= plgpio->chip.ngpio) in plgpio_irq_set_type()
338 if (plgpio->regs.eit == -1) in plgpio_irq_set_type()
346 if (plgpio->regs.eit == -1) in plgpio_irq_set_type()
349 reg_off = REG_OFFSET(0, plgpio->regs.eit, offset); in plgpio_irq_set_type()
350 regmap_read(plgpio->regmap, reg_off, &val); in plgpio_irq_set_type()
354 regmap_write(plgpio->regmap, reg_off, val | (1 << offset)); in plgpio_irq_set_type()
356 regmap_write(plgpio->regmap, reg_off, val & ~(1 << offset)); in plgpio_irq_set_type()
373 struct plgpio *plgpio = gpiochip_get_data(gc); in plgpio_irq_handler() local
379 count = plgpio->chip.ngpio; in plgpio_irq_handler()
385 regmap_read(plgpio->regmap, plgpio->regs.mis + in plgpio_irq_handler()
391 regmap_write(plgpio->regmap, plgpio->regs.mis + in plgpio_irq_handler()
407 if (plgpio->o2p && (plgpio->p2o_regs & PTO_MIS_REG)) { in plgpio_irq_handler()
408 pin = plgpio->o2p(offset); in plgpio_irq_handler()
457 static int plgpio_probe_dt(struct platform_device *pdev, struct plgpio *plgpio) in plgpio_probe_dt() argument
464 plgpio->p2o = spear310_p2o; in plgpio_probe_dt()
465 plgpio->o2p = spear310_o2p; in plgpio_probe_dt()
466 plgpio->p2o_regs = PTO_WDATA_REG | PTO_DIR_REG | PTO_IE_REG | in plgpio_probe_dt()
471 plgpio->chip.ngpio = val; in plgpio_probe_dt()
478 plgpio->regs.enb = val; in plgpio_probe_dt()
480 plgpio->regs.enb = -1; in plgpio_probe_dt()
483 plgpio->regs.wdata = val; in plgpio_probe_dt()
490 plgpio->regs.dir = val; in plgpio_probe_dt()
497 plgpio->regs.ie = val; in plgpio_probe_dt()
504 plgpio->regs.rdata = val; in plgpio_probe_dt()
511 plgpio->regs.mis = val; in plgpio_probe_dt()
518 plgpio->regs.eit = val; in plgpio_probe_dt()
520 plgpio->regs.eit = -1; in plgpio_probe_dt()
531 struct plgpio *plgpio; in plgpio_probe() local
534 plgpio = devm_kzalloc(&pdev->dev, sizeof(*plgpio), GFP_KERNEL); in plgpio_probe()
535 if (!plgpio) in plgpio_probe()
540 plgpio->regmap = device_node_to_regmap(regmap_np); in plgpio_probe()
542 if (IS_ERR(plgpio->regmap)) { in plgpio_probe()
544 plgpio->regmap); in plgpio_probe()
545 return PTR_ERR(plgpio->regmap); in plgpio_probe()
548 plgpio->regmap = device_node_to_regmap(pdev->dev.of_node); in plgpio_probe()
549 if (IS_ERR(plgpio->regmap)) { in plgpio_probe()
551 plgpio->regmap); in plgpio_probe()
552 return PTR_ERR(plgpio->regmap); in plgpio_probe()
556 ret = plgpio_probe_dt(pdev, plgpio); in plgpio_probe()
562 plgpio->clk = devm_clk_get(&pdev->dev, NULL); in plgpio_probe()
563 if (IS_ERR(plgpio->clk)) in plgpio_probe()
567 plgpio->csave_regs = devm_kcalloc(&pdev->dev, in plgpio_probe()
568 DIV_ROUND_UP(plgpio->chip.ngpio, MAX_GPIO_PER_REG), in plgpio_probe()
569 sizeof(*plgpio->csave_regs), in plgpio_probe()
571 if (!plgpio->csave_regs) in plgpio_probe()
575 platform_set_drvdata(pdev, plgpio); in plgpio_probe()
576 spin_lock_init(&plgpio->lock); in plgpio_probe()
578 plgpio->chip.base = -1; in plgpio_probe()
579 plgpio->chip.request = plgpio_request; in plgpio_probe()
580 plgpio->chip.free = plgpio_free; in plgpio_probe()
581 plgpio->chip.direction_input = plgpio_direction_input; in plgpio_probe()
582 plgpio->chip.direction_output = plgpio_direction_output; in plgpio_probe()
583 plgpio->chip.get = plgpio_get_value; in plgpio_probe()
584 plgpio->chip.set = plgpio_set_value; in plgpio_probe()
585 plgpio->chip.label = dev_name(&pdev->dev); in plgpio_probe()
586 plgpio->chip.parent = &pdev->dev; in plgpio_probe()
587 plgpio->chip.owner = THIS_MODULE; in plgpio_probe()
589 if (!IS_ERR(plgpio->clk)) { in plgpio_probe()
590 ret = clk_prepare(plgpio->clk); in plgpio_probe()
601 girq = &plgpio->chip.irq; in plgpio_probe()
618 ret = gpiochip_add_data(&plgpio->chip, plgpio); in plgpio_probe()
627 if (!IS_ERR(plgpio->clk)) in plgpio_probe()
628 clk_unprepare(plgpio->clk); in plgpio_probe()
636 struct plgpio *plgpio = dev_get_drvdata(dev); in plgpio_suspend() local
637 int i, reg_count = DIV_ROUND_UP(plgpio->chip.ngpio, MAX_GPIO_PER_REG); in plgpio_suspend()
643 if (plgpio->regs.enb != -1) in plgpio_suspend()
644 regmap_read(plgpio->regmap, plgpio->regs.enb + off, in plgpio_suspend()
645 &plgpio->csave_regs[i].enb); in plgpio_suspend()
646 if (plgpio->regs.eit != -1) in plgpio_suspend()
647 regmap_read(plgpio->regmap, plgpio->regs.eit + off, in plgpio_suspend()
648 &plgpio->csave_regs[i].eit); in plgpio_suspend()
649 regmap_read(plgpio->regmap, plgpio->regs.wdata + off, in plgpio_suspend()
650 &plgpio->csave_regs[i].wdata); in plgpio_suspend()
651 regmap_read(plgpio->regmap, plgpio->regs.dir + off, in plgpio_suspend()
652 &plgpio->csave_regs[i].dir); in plgpio_suspend()
653 regmap_read(plgpio->regmap, plgpio->regs.ie + off, in plgpio_suspend()
654 &plgpio->csave_regs[i].ie); in plgpio_suspend()
668 regmap_read(plgpio->regmap, plgpio->regs.__reg + _off, &_tmp); \
670 plgpio->csave_regs[i].__reg = \
671 _tmp | (plgpio->csave_regs[i].__reg & _mask); \
676 struct plgpio *plgpio = dev_get_drvdata(dev); in plgpio_resume() local
677 int i, reg_count = DIV_ROUND_UP(plgpio->chip.ngpio, MAX_GPIO_PER_REG); in plgpio_resume()
685 mask = (1 << (plgpio->chip.ngpio - i * in plgpio_resume()
688 if (plgpio->regs.enb != -1) in plgpio_resume()
691 if (plgpio->regs.eit != -1) in plgpio_resume()
699 regmap_write(plgpio->regmap, plgpio->regs.wdata + off, in plgpio_resume()
700 plgpio->csave_regs[i].wdata); in plgpio_resume()
702 regmap_write(plgpio->regmap, plgpio->regs.dir + off, in plgpio_resume()
703 plgpio->csave_regs[i].dir); in plgpio_resume()
705 if (plgpio->regs.eit != -1) in plgpio_resume()
706 regmap_write(plgpio->regmap, plgpio->regs.eit + off, in plgpio_resume()
707 plgpio->csave_regs[i].eit); in plgpio_resume()
709 regmap_write(plgpio->regmap, plgpio->regs.ie + off, in plgpio_resume()
710 plgpio->csave_regs[i].ie); in plgpio_resume()
712 if (plgpio->regs.enb != -1) in plgpio_resume()
713 regmap_write(plgpio->regmap, plgpio->regs.enb + off, in plgpio_resume()
714 plgpio->csave_regs[i].enb); in plgpio_resume()