Lines Matching defs:plgpio

30  * plgpio pins in all machines are not one to one mapped, bitwise with registers
52 * struct plgpio: plgpio driver specific structure
55 * base: base address of plgpio block
65 struct plgpio {
110 struct plgpio *plgpio = gpiochip_get_data(chip);
114 if (plgpio->p2o && (plgpio->p2o_regs & PTO_DIR_REG)) {
115 offset = plgpio->p2o(offset);
120 spin_lock_irqsave(&plgpio->lock, flags);
121 plgpio_reg_set(plgpio->base, offset, plgpio->regs.dir);
122 spin_unlock_irqrestore(&plgpio->lock, flags);
130 struct plgpio *plgpio = gpiochip_get_data(chip);
135 if (plgpio->p2o && (plgpio->p2o_regs & (PTO_DIR_REG | PTO_WDATA_REG))) {
136 tmp = plgpio->p2o(offset);
140 if (plgpio->p2o_regs & PTO_DIR_REG)
142 if (plgpio->p2o_regs & PTO_WDATA_REG)
146 spin_lock_irqsave(&plgpio->lock, flags);
148 plgpio_reg_set(plgpio->base, wdata_offset,
149 plgpio->regs.wdata);
151 plgpio_reg_reset(plgpio->base, wdata_offset,
152 plgpio->regs.wdata);
154 plgpio_reg_reset(plgpio->base, dir_offset, plgpio->regs.dir);
155 spin_unlock_irqrestore(&plgpio->lock, flags);
162 struct plgpio *plgpio = gpiochip_get_data(chip);
168 if (plgpio->p2o && (plgpio->p2o_regs & PTO_RDATA_REG)) {
169 offset = plgpio->p2o(offset);
174 return is_plgpio_set(plgpio->base, offset, plgpio->regs.rdata);
179 struct plgpio *plgpio = gpiochip_get_data(chip);
185 if (plgpio->p2o && (plgpio->p2o_regs & PTO_WDATA_REG)) {
186 offset = plgpio->p2o(offset);
192 plgpio_reg_set(plgpio->base, offset, plgpio->regs.wdata);
194 plgpio_reg_reset(plgpio->base, offset, plgpio->regs.wdata);
199 struct plgpio *plgpio = gpiochip_get_data(chip);
211 if (!IS_ERR(plgpio->clk)) {
212 ret = clk_enable(plgpio->clk);
217 if (plgpio->regs.enb == -1)
228 if (plgpio->p2o && (plgpio->p2o_regs & PTO_ENB_REG)) {
229 offset = plgpio->p2o(offset);
236 spin_lock_irqsave(&plgpio->lock, flags);
237 plgpio_reg_set(plgpio->base, offset, plgpio->regs.enb);
238 spin_unlock_irqrestore(&plgpio->lock, flags);
242 if (!IS_ERR(plgpio->clk))
243 clk_disable(plgpio->clk);
251 struct plgpio *plgpio = gpiochip_get_data(chip);
258 if (plgpio->regs.enb == -1)
262 if (plgpio->p2o && (plgpio->p2o_regs & PTO_ENB_REG)) {
263 offset = plgpio->p2o(offset);
268 spin_lock_irqsave(&plgpio->lock, flags);
269 plgpio_reg_reset(plgpio->base, offset, plgpio->regs.enb);
270 spin_unlock_irqrestore(&plgpio->lock, flags);
273 if (!IS_ERR(plgpio->clk))
274 clk_disable(plgpio->clk);
283 struct plgpio *plgpio = gpiochip_get_data(gc);
288 if (plgpio->p2o && (plgpio->p2o_regs & PTO_IE_REG)) {
289 offset = plgpio->p2o(offset);
294 spin_lock_irqsave(&plgpio->lock, flags);
295 plgpio_reg_set(plgpio->base, offset, plgpio->regs.ie);
296 spin_unlock_irqrestore(&plgpio->lock, flags);
302 struct plgpio *plgpio = gpiochip_get_data(gc);
307 if (plgpio->p2o && (plgpio->p2o_regs & PTO_IE_REG)) {
308 offset = plgpio->p2o(offset);
313 spin_lock_irqsave(&plgpio->lock, flags);
314 plgpio_reg_reset(plgpio->base, offset, plgpio->regs.ie);
315 spin_unlock_irqrestore(&plgpio->lock, flags);
321 struct plgpio *plgpio = gpiochip_get_data(gc);
326 if (offset >= plgpio->chip.ngpio)
329 if (plgpio->regs.eit == -1)
337 if (plgpio->regs.eit == -1)
340 reg_off = REG_OFFSET(plgpio->base, plgpio->regs.eit, offset);
362 struct plgpio *plgpio = gpiochip_get_data(gc);
367 count = plgpio->chip.ngpio;
371 /* check all plgpio MIS registers for a possible interrupt */
373 pending = readl_relaxed(plgpio->base + plgpio->regs.mis +
379 writel_relaxed(~pending, plgpio->base + plgpio->regs.mis +
394 if (plgpio->o2p && (plgpio->p2o_regs & PTO_MIS_REG)) {
395 pin = plgpio->o2p(offset);
413 * In spear310 there is inconsistency among bit positions in plgpio regiseters,
414 * for different plgpio pins. For example: for pin 27, bit offset is 23, pin
445 static int plgpio_probe_dt(struct platform_device *pdev, struct plgpio *plgpio)
452 plgpio->p2o = spear310_p2o;
453 plgpio->o2p = spear310_o2p;
454 plgpio->p2o_regs = PTO_WDATA_REG | PTO_DIR_REG | PTO_IE_REG |
458 if (!of_property_read_u32(np, "st-plgpio,ngpio", &val)) {
459 plgpio->chip.ngpio = val;
465 if (!of_property_read_u32(np, "st-plgpio,enb-reg", &val))
466 plgpio->regs.enb = val;
468 plgpio->regs.enb = -1;
470 if (!of_property_read_u32(np, "st-plgpio,wdata-reg", &val)) {
471 plgpio->regs.wdata = val;
477 if (!of_property_read_u32(np, "st-plgpio,dir-reg", &val)) {
478 plgpio->regs.dir = val;
484 if (!of_property_read_u32(np, "st-plgpio,ie-reg", &val)) {
485 plgpio->regs.ie = val;
491 if (!of_property_read_u32(np, "st-plgpio,rdata-reg", &val)) {
492 plgpio->regs.rdata = val;
498 if (!of_property_read_u32(np, "st-plgpio,mis-reg", &val)) {
499 plgpio->regs.mis = val;
505 if (!of_property_read_u32(np, "st-plgpio,eit-reg", &val))
506 plgpio->regs.eit = val;
508 plgpio->regs.eit = -1;
517 struct plgpio *plgpio;
520 plgpio = devm_kzalloc(&pdev->dev, sizeof(*plgpio), GFP_KERNEL);
521 if (!plgpio)
524 plgpio->base = devm_platform_ioremap_resource(pdev, 0);
525 if (IS_ERR(plgpio->base))
526 return PTR_ERR(plgpio->base);
528 ret = plgpio_probe_dt(pdev, plgpio);
534 plgpio->clk = devm_clk_get(&pdev->dev, NULL);
535 if (IS_ERR(plgpio->clk))
539 plgpio->csave_regs = devm_kcalloc(&pdev->dev,
540 DIV_ROUND_UP(plgpio->chip.ngpio, MAX_GPIO_PER_REG),
541 sizeof(*plgpio->csave_regs),
543 if (!plgpio->csave_regs)
547 platform_set_drvdata(pdev, plgpio);
548 spin_lock_init(&plgpio->lock);
550 plgpio->chip.base = -1;
551 plgpio->chip.request = plgpio_request;
552 plgpio->chip.free = plgpio_free;
553 plgpio->chip.direction_input = plgpio_direction_input;
554 plgpio->chip.direction_output = plgpio_direction_output;
555 plgpio->chip.get = plgpio_get_value;
556 plgpio->chip.set = plgpio_set_value;
557 plgpio->chip.label = dev_name(&pdev->dev);
558 plgpio->chip.parent = &pdev->dev;
559 plgpio->chip.owner = THIS_MODULE;
560 plgpio->chip.of_node = pdev->dev.of_node;
562 if (!IS_ERR(plgpio->clk)) {
563 ret = clk_prepare(plgpio->clk);
574 girq = &plgpio->chip.irq;
591 ret = gpiochip_add_data(&plgpio->chip, plgpio);
600 if (!IS_ERR(plgpio->clk))
601 clk_unprepare(plgpio->clk);
609 struct plgpio *plgpio = dev_get_drvdata(dev);
610 int i, reg_count = DIV_ROUND_UP(plgpio->chip.ngpio, MAX_GPIO_PER_REG);
614 off = plgpio->base + i * sizeof(int *);
616 if (plgpio->regs.enb != -1)
617 plgpio->csave_regs[i].enb =
618 readl_relaxed(plgpio->regs.enb + off);
619 if (plgpio->regs.eit != -1)
620 plgpio->csave_regs[i].eit =
621 readl_relaxed(plgpio->regs.eit + off);
622 plgpio->csave_regs[i].wdata = readl_relaxed(plgpio->regs.wdata +
624 plgpio->csave_regs[i].dir = readl_relaxed(plgpio->regs.dir +
626 plgpio->csave_regs[i].ie = readl_relaxed(plgpio->regs.ie + off);
636 * bit values (non-plgpio bits), and retain captured value (plgpio bits).
640 _tmp = readl_relaxed(plgpio->regs.__reg + _off); \
642 plgpio->csave_regs[i].__reg = \
643 _tmp | (plgpio->csave_regs[i].__reg & _mask); \
648 struct plgpio *plgpio = dev_get_drvdata(dev);
649 int i, reg_count = DIV_ROUND_UP(plgpio->chip.ngpio, MAX_GPIO_PER_REG);
654 off = plgpio->base + i * sizeof(int *);
657 mask = (1 << (plgpio->chip.ngpio - i *
660 if (plgpio->regs.enb != -1)
663 if (plgpio->regs.eit != -1)
671 writel_relaxed(plgpio->csave_regs[i].wdata, plgpio->regs.wdata +
673 writel_relaxed(plgpio->csave_regs[i].dir, plgpio->regs.dir +
676 if (plgpio->regs.eit != -1)
677 writel_relaxed(plgpio->csave_regs[i].eit,
678 plgpio->regs.eit + off);
680 writel_relaxed(plgpio->csave_regs[i].ie, plgpio->regs.ie + off);
682 if (plgpio->regs.enb != -1)
683 writel_relaxed(plgpio->csave_regs[i].enb,
684 plgpio->regs.enb + off);
694 { .compatible = "st,spear-plgpio" },
701 .name = "spear-plgpio",