plgpio
struct plgpio *plgpio = gpiochip_get_data(chip);
if (plgpio->p2o && (plgpio->p2o_regs & PTO_DIR_REG)) {
offset = plgpio->p2o(offset);
spin_lock_irqsave(&plgpio->lock, flags);
plgpio_reg_set(plgpio->regmap, offset, plgpio->regs.dir);
spin_unlock_irqrestore(&plgpio->lock, flags);
struct plgpio *plgpio = gpiochip_get_data(chip);
if (plgpio->p2o && (plgpio->p2o_regs & (PTO_DIR_REG | PTO_WDATA_REG))) {
tmp = plgpio->p2o(offset);
if (plgpio->p2o_regs & PTO_DIR_REG)
if (plgpio->p2o_regs & PTO_WDATA_REG)
spin_lock_irqsave(&plgpio->lock, flags);
plgpio_reg_set(plgpio->regmap, wdata_offset,
plgpio->regs.wdata);
plgpio_reg_reset(plgpio->regmap, wdata_offset,
plgpio->regs.wdata);
plgpio_reg_reset(plgpio->regmap, dir_offset, plgpio->regs.dir);
spin_unlock_irqrestore(&plgpio->lock, flags);
struct plgpio *plgpio = gpiochip_get_data(chip);
if (plgpio->p2o && (plgpio->p2o_regs & PTO_RDATA_REG)) {
offset = plgpio->p2o(offset);
return is_plgpio_set(plgpio->regmap, offset, plgpio->regs.rdata);
struct plgpio *plgpio = gpiochip_get_data(chip);
if (plgpio->p2o && (plgpio->p2o_regs & PTO_WDATA_REG)) {
offset = plgpio->p2o(offset);
plgpio_reg_set(plgpio->regmap, offset, plgpio->regs.wdata);
plgpio_reg_reset(plgpio->regmap, offset, plgpio->regs.wdata);
struct plgpio *plgpio = gpiochip_get_data(chip);
if (!IS_ERR(plgpio->clk)) {
ret = clk_enable(plgpio->clk);
if (plgpio->regs.enb == -1)
if (plgpio->p2o && (plgpio->p2o_regs & PTO_ENB_REG)) {
offset = plgpio->p2o(offset);
spin_lock_irqsave(&plgpio->lock, flags);
plgpio_reg_set(plgpio->regmap, offset, plgpio->regs.enb);
spin_unlock_irqrestore(&plgpio->lock, flags);
if (!IS_ERR(plgpio->clk))
clk_disable(plgpio->clk);
struct plgpio *plgpio = gpiochip_get_data(chip);
if (plgpio->regs.enb == -1)
if (plgpio->p2o && (plgpio->p2o_regs & PTO_ENB_REG)) {
offset = plgpio->p2o(offset);
spin_lock_irqsave(&plgpio->lock, flags);
plgpio_reg_reset(plgpio->regmap, offset, plgpio->regs.enb);
spin_unlock_irqrestore(&plgpio->lock, flags);
if (!IS_ERR(plgpio->clk))
clk_disable(plgpio->clk);
struct plgpio *plgpio = gpiochip_get_data(gc);
if (plgpio->p2o && (plgpio->p2o_regs & PTO_IE_REG)) {
offset = plgpio->p2o(offset);
spin_lock_irqsave(&plgpio->lock, flags);
plgpio_reg_set(plgpio->regmap, offset, plgpio->regs.ie);
spin_unlock_irqrestore(&plgpio->lock, flags);
struct plgpio *plgpio = gpiochip_get_data(gc);
if (plgpio->p2o && (plgpio->p2o_regs & PTO_IE_REG)) {
offset = plgpio->p2o(offset);
spin_lock_irqsave(&plgpio->lock, flags);
plgpio_reg_reset(plgpio->regmap, offset, plgpio->regs.ie);
spin_unlock_irqrestore(&plgpio->lock, flags);
struct plgpio *plgpio = gpiochip_get_data(gc);
if (offset >= plgpio->chip.ngpio)
if (plgpio->regs.eit == -1)
if (plgpio->regs.eit == -1)
reg_off = REG_OFFSET(0, plgpio->regs.eit, offset);
regmap_read(plgpio->regmap, reg_off, &val);
regmap_write(plgpio->regmap, reg_off, val | (1 << offset));
regmap_write(plgpio->regmap, reg_off, val & ~(1 << offset));
struct plgpio *plgpio = gpiochip_get_data(gc);
count = plgpio->chip.ngpio;
regmap_read(plgpio->regmap, plgpio->regs.mis +
regmap_write(plgpio->regmap, plgpio->regs.mis +
if (plgpio->o2p && (plgpio->p2o_regs & PTO_MIS_REG)) {
pin = plgpio->o2p(offset);
static int plgpio_probe_dt(struct platform_device *pdev, struct plgpio *plgpio)
plgpio->p2o = spear310_p2o;
plgpio->o2p = spear310_o2p;
plgpio->p2o_regs = PTO_WDATA_REG | PTO_DIR_REG | PTO_IE_REG |
plgpio->chip.ngpio = val;
plgpio->regs.enb = val;
plgpio->regs.enb = -1;
plgpio->regs.wdata = val;
plgpio->regs.dir = val;
plgpio->regs.ie = val;
plgpio->regs.rdata = val;
plgpio->regs.mis = val;
plgpio->regs.eit = val;
plgpio->regs.eit = -1;
struct plgpio *plgpio;
plgpio = devm_kzalloc(&pdev->dev, sizeof(*plgpio), GFP_KERNEL);
if (!plgpio)
plgpio->regmap = device_node_to_regmap(regmap_np);
if (IS_ERR(plgpio->regmap)) {
plgpio->regmap);
return PTR_ERR(plgpio->regmap);
plgpio->regmap = device_node_to_regmap(pdev->dev.of_node);
if (IS_ERR(plgpio->regmap)) {
plgpio->regmap);
return PTR_ERR(plgpio->regmap);
ret = plgpio_probe_dt(pdev, plgpio);
plgpio->clk = devm_clk_get(&pdev->dev, NULL);
if (IS_ERR(plgpio->clk))
plgpio->csave_regs = devm_kcalloc(&pdev->dev,
DIV_ROUND_UP(plgpio->chip.ngpio, MAX_GPIO_PER_REG),
sizeof(*plgpio->csave_regs),
if (!plgpio->csave_regs)
platform_set_drvdata(pdev, plgpio);
spin_lock_init(&plgpio->lock);
plgpio->chip.base = -1;
plgpio->chip.request = plgpio_request;
plgpio->chip.free = plgpio_free;
plgpio->chip.direction_input = plgpio_direction_input;
plgpio->chip.direction_output = plgpio_direction_output;
plgpio->chip.get = plgpio_get_value;
plgpio->chip.set = plgpio_set_value;
plgpio->chip.label = dev_name(&pdev->dev);
plgpio->chip.parent = &pdev->dev;
plgpio->chip.owner = THIS_MODULE;
if (!IS_ERR(plgpio->clk)) {
ret = clk_prepare(plgpio->clk);
girq = &plgpio->chip.irq;
ret = gpiochip_add_data(&plgpio->chip, plgpio);
if (!IS_ERR(plgpio->clk))
clk_unprepare(plgpio->clk);
struct plgpio *plgpio = dev_get_drvdata(dev);
int i, reg_count = DIV_ROUND_UP(plgpio->chip.ngpio, MAX_GPIO_PER_REG);
if (plgpio->regs.enb != -1)
regmap_read(plgpio->regmap, plgpio->regs.enb + off,
&plgpio->csave_regs[i].enb);
if (plgpio->regs.eit != -1)
regmap_read(plgpio->regmap, plgpio->regs.eit + off,
&plgpio->csave_regs[i].eit);
regmap_read(plgpio->regmap, plgpio->regs.wdata + off,
&plgpio->csave_regs[i].wdata);
regmap_read(plgpio->regmap, plgpio->regs.dir + off,
&plgpio->csave_regs[i].dir);
regmap_read(plgpio->regmap, plgpio->regs.ie + off,
&plgpio->csave_regs[i].ie);
regmap_read(plgpio->regmap, plgpio->regs.__reg + _off, &_tmp); \
plgpio->csave_regs[i].__reg = \
_tmp | (plgpio->csave_regs[i].__reg & _mask); \
struct plgpio *plgpio = dev_get_drvdata(dev);
int i, reg_count = DIV_ROUND_UP(plgpio->chip.ngpio, MAX_GPIO_PER_REG);
mask = (1 << (plgpio->chip.ngpio - i *
if (plgpio->regs.enb != -1)
if (plgpio->regs.eit != -1)
regmap_write(plgpio->regmap, plgpio->regs.wdata + off,
plgpio->csave_regs[i].wdata);
regmap_write(plgpio->regmap, plgpio->regs.dir + off,
plgpio->csave_regs[i].dir);
if (plgpio->regs.eit != -1)
regmap_write(plgpio->regmap, plgpio->regs.eit + off,
plgpio->csave_regs[i].eit);
regmap_write(plgpio->regmap, plgpio->regs.ie + off,
plgpio->csave_regs[i].ie);
if (plgpio->regs.enb != -1)
regmap_write(plgpio->regmap, plgpio->regs.enb + off,
plgpio->csave_regs[i].enb);