Skip to content

Commit

Permalink
basic_mmio_gpio: support different input/output registers
Browse files Browse the repository at this point in the history
Some controllers have separate input and output registers.  For these
controllers, use "set" for the output and "dat" for the input.

Changes since v2: reuse "set" for output and "dat" for input rather than
adding a new "in" register.

Signed-off-by: Jamie Iles <jamie@jamieiles.com>
Acked-by: Anton Vorontsov <cbouatmailru@gmail.com>
Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
  • Loading branch information
Jamie Iles authored and Grant Likely committed May 20, 2011
1 parent e027d6f commit dd86a0c
Showing 1 changed file with 33 additions and 5 deletions.
38 changes: 33 additions & 5 deletions drivers/gpio/basic_mmio_gpio.c
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,24 @@ static void bgpio_set_with_clear(struct gpio_chip *gc, unsigned int gpio,
bgc->write_reg(bgc->reg_clr, mask);
}

static void bgpio_set_set(struct gpio_chip *gc, unsigned int gpio, int val)
{
struct bgpio_chip *bgc = to_bgpio_chip(gc);
unsigned long mask = bgc->pin2mask(bgc, gpio);
unsigned long flags;

spin_lock_irqsave(&bgc->lock, flags);

if (val)
bgc->data |= mask;
else
bgc->data &= ~mask;

bgc->write_reg(bgc->reg_set, bgc->data);

spin_unlock_irqrestore(&bgc->lock, flags);
}

static int bgpio_dir_in(struct gpio_chip *gc, unsigned int gpio)
{
return 0;
Expand Down Expand Up @@ -245,10 +263,12 @@ static int bgpio_setup_accessors(struct platform_device *pdev,

/*
* Create the device and allocate the resources. For setting GPIO's there are
* two supported configurations:
* three supported configurations:
*
* - single output register resource (named "dat").
* - single input/output register resource (named "dat").
* - set/clear pair (named "set" and "clr").
* - single output register resource and single input resource ("set" and
* dat").
*
* For the single output register, this drives a 1 by setting a bit and a zero
* by clearing a bit. For the set clr pair, this drives a 1 by setting a bit
Expand Down Expand Up @@ -292,12 +312,21 @@ static int bgpio_setup_io(struct platform_device *pdev,
return -ENOMEM;

bgc->gc.set = bgpio_set_with_clear;
} else if (res_set || res_clr) {
return -EINVAL;
} else if (res_set && !res_clr) {
if (resource_size(res_set) != resource_size(res_dat))
return -EINVAL;

bgc->reg_set = bgpio_request_and_map(&pdev->dev, res_set);
if (!bgc->reg_set)
return -ENOMEM;

bgc->gc.set = bgpio_set_set;
} else {
bgc->gc.set = bgpio_set;
}

bgc->gc.get = bgpio_get;

return 0;
}

Expand Down Expand Up @@ -336,7 +365,6 @@ static int __devinit bgpio_probe(struct platform_device *pdev)
bgc->gc.ngpio = ngpio;
bgc->gc.direction_input = bgpio_dir_in;
bgc->gc.direction_output = bgpio_dir_out;
bgc->gc.get = bgpio_get;
bgc->gc.dev = dev;
bgc->gc.label = dev_name(dev);

Expand Down

0 comments on commit dd86a0c

Please sign in to comment.