linux/drivers/gpio
Tarun Kanti DebBarma 7fcca715de gpio/omap: fix redundant decoding of gpio offset
In gpio_get(), _get_gpio_datain() and _get_gpio_dataout() get rid of
un-necessary operation to compute gpio mask. The gpio offset passed
to gpio_get() is sufficient to do that.

Here is Russell's original comment:
Can someone explain to me this:

static int _get_gpio_datain(struct gpio_bank *bank, int gpio)
{
       void __iomem *reg = bank->base + bank->regs->datain;

       return (__raw_readl(reg) & GPIO_BIT(bank, gpio)) != 0;
}

static int gpio_get(struct gpio_chip *chip, unsigned offset)
{
       struct gpio_bank *bank = container_of(chip, struct gpio_bank, chip);
       void __iomem *reg = bank->base;
       int gpio = chip->base + offset;
       u32 mask = GPIO_BIT(bank, gpio);

       if (gpio_is_input(bank, mask))
               return _get_gpio_datain(bank, gpio);
       else
               return _get_gpio_dataout(bank, gpio);
}

Given that bank->width on OMAP is either 32 or 16, and GPIO numbers for
any GPIO chip are always aligned to 32 or 16, why does this code bother
adding the chips base gpio number and then modulo the width?

Surely this means if - for argument sake - you registered a GPIO chip
with 8 lines followed by one with 16 lines, GPIO0..7 would be chip 0
bit 0..7, GPIO8..15 would be chip 1 bit 8..15, GPIO16..23 would be
chip 1 bit 0..7.

However, if you registered a GPIO chip with 16 lines first, it would
mean GPIO0..15 would be chip 0 bit 0..15, and GPIO16..31 would be
chip 1 bit 0..15.

Surely this kind of behaviour is not intended?

Is there a reason why the bitmask can't just be (1 << offset) where
offset is passed into these functions as GPIO number - chip->base ?

Reported-by: Russell King - ARM Linux <linux@arm.linux.org.uk>
Signed-off-by: Tarun Kanti DebBarma <tarun.kanti@ti.com>
Reviewed-by: Santosh Shilimkar <santosh.shilimkar@ti.com>
Reviewed-by: Kevin Hilman <khilman@ti.com>
Signed-off-by: Kevin Hilman <khilman@ti.com>
2012-03-21 10:21:24 +05:30
..
devres.c GPIO: add bindings for managed devices 2012-01-04 11:37:42 -07:00
gpio-74x164.c drivers/gpio: Fix drivers who are implicit users of module.h 2011-10-31 19:31:47 -04:00
gpio-ab8500.c gpio: ab8500: fix MODULE_ALIAS for ab8500 2011-07-28 16:19:23 -06:00
gpio-adp5520.c gpio: Convert GPIO drivers to module_platform_driver 2012-01-02 00:26:06 -07:00
gpio-adp5588.c gpiolib: output basic details and consolidate gpio device drivers 2011-12-12 13:40:16 -07:00
gpio-bt8xx.c gpiolib: output basic details and consolidate gpio device drivers 2011-12-12 13:40:16 -07:00
gpio-cs5535.c gpio: Convert GPIO drivers to module_platform_driver 2012-01-02 00:26:06 -07:00
gpio-da9052.c Changes queued in gpio/next for the start of the 3.3 merge window 2012-01-07 12:15:36 -08:00
gpio-davinci.c gpio/davinci: fix enabling unbanked GPIO IRQs 2012-03-12 11:53:33 -06:00
gpio-ep93xx.c drivers/gpio: Fix drivers who are implicit users of module.h 2011-10-31 19:31:47 -04:00
gpio-generic.c gpio: Convert GPIO drivers to module_platform_driver 2012-01-02 00:26:06 -07:00
gpio-it8761e.c gpio: reorganize drivers 2011-06-06 10:10:11 -06:00
gpio-janz-ttl.c gpio: Convert GPIO drivers to module_platform_driver 2012-01-02 00:26:06 -07:00
gpio-ks8695.c ARM: 7036/1: mach-ks8695: break out GPIO driver specifics 2011-08-22 09:12:54 +01:00
gpio-langwell.c gpio: langwell: ensure alternate function is cleared 2011-10-06 04:14:52 -06:00
gpio-lpc32xx.c GPIO: LPC32xx: Add output reading to GPO P3 2012-03-12 11:25:30 -06:00
gpio-max730x.c gpio: reorganize drivers 2011-06-06 10:10:11 -06:00
gpio-max732x.c gpio: reorganize drivers 2011-06-06 10:10:11 -06:00
gpio-max7300.c gpio: reorganize drivers 2011-06-06 10:10:11 -06:00
gpio-max7301.c gpio: reorganize drivers 2011-06-06 10:10:11 -06:00
gpio-mc9s08dz60.c ARM/mx35/3ds: gpio: add mc9s08dz60 gpio function 2012-01-30 07:49:08 -07:00
gpio-mc33880.c drivers/gpio: Fix drivers who are implicit users of module.h 2011-10-31 19:31:47 -04:00
gpio-mcp23s08.c drivers/gpio: Fix drivers who are implicit users of module.h 2011-10-31 19:31:47 -04:00
gpio-ml-ioh.c gpio: Add missing spin_lock_init in gpio-ml-ioh driver 2012-02-01 21:59:37 -07:00
gpio-mpc8xxx.c irq_domain/powerpc: Replace custom xlate functions with library functions 2012-02-16 06:11:24 -07:00
gpio-mpc5200.c drivers/gpio: Fix drivers who are implicit users of module.h 2011-10-31 19:31:47 -04:00
gpio-msm-v1.c gpio_msm: Move Qualcomm v6 MSM driver into drivers 2011-08-01 04:58:00 -07:00
gpio-msm-v2.c gpio_msm: Move Qualcomm MSM v2 gpio driver into drivers 2011-08-01 04:58:00 -07:00
gpio-mxc.c Merge branch 'modsplit-Oct31_2011' of git://git.kernel.org/pub/scm/linux/kernel/git/paulg/linux 2011-11-06 19:44:47 -08:00
gpio-mxs.c Merge branch 'modsplit-Oct31_2011' of git://git.kernel.org/pub/scm/linux/kernel/git/paulg/linux 2011-11-06 19:44:47 -08:00
gpio-nomadik.c gpiolib: output basic details and consolidate gpio device drivers 2011-12-12 13:40:16 -07:00
gpio-omap.c gpio/omap: fix redundant decoding of gpio offset 2012-03-21 10:21:24 +05:30
gpio-pca953x.c gpio: pca953x: Staticise pca953x_get_altdata() 2011-11-21 20:53:15 +01:00
gpio-pcf857x.c gpiolib: output basic details and consolidate gpio device drivers 2011-12-12 13:40:16 -07:00
gpio-pch.c gpio: Add missing spin_lock_init in gpio-pch driver 2012-02-01 21:59:15 -07:00
gpio-pl061.c gpio/gpio-pl061: No need of thaw and poweroff routines for hibernate 2012-02-16 06:37:51 -07:00
gpio-pxa.c ARM: pxa: add clk support in gpio driver 2011-11-15 19:09:36 +08:00
gpio-rdc321x.c gpio: Convert GPIO drivers to module_platform_driver 2012-01-02 00:26:06 -07:00
gpio-sa1100.c GPIO: sa1100: implement proper gpiolib gpio_to_irq conversion 2012-01-13 22:25:23 -07:00
gpio-samsung.c gpio: samsung: adapt to changes in gpio specifier translator function declaration 2012-02-01 17:05:28 -07:00
gpio-sch.c gpio: Convert GPIO drivers to module_platform_driver 2012-01-02 00:26:06 -07:00
gpio-sodaville.c gpio: Add a driver for Sodaville GPIO controller 2012-02-03 16:13:25 -07:00
gpio-stmpe.c gpio/gpio-stmpe: Fix the value returned by _get_value routine 2012-03-12 11:36:38 -06:00
gpio-sx150x.c gpio: reorganize drivers 2011-06-06 10:10:11 -06:00
gpio-tc3589x.c gpio: reorganize drivers 2011-06-06 10:10:11 -06:00
gpio-tegra.c ARM: tegra: export tegra_gpio_{en,dis}able 2012-03-12 11:42:49 -06:00
gpio-timberdale.c gpio: Convert GPIO drivers to module_platform_driver 2012-01-02 00:26:06 -07:00
gpio-tnetv107x.c ARM: 7039/1: mach-davinci: move DaVinci TNET GPIO driver to GPIO subsystem 2011-08-22 09:12:55 +01:00
gpio-tps65910.c gpio: tps65910: Add sleep control support 2012-02-05 23:08:29 -07:00
gpio-tps65912.c tps65912: gpio: add gpio driver 2011-07-31 23:28:22 +02:00
gpio-twl4030.c gpio: reorganize drivers 2011-06-06 10:10:11 -06:00
gpio-ucb1400.c gpio: Convert GPIO drivers to module_platform_driver 2012-01-02 00:26:06 -07:00
gpio-vr41xx.c gpio: Convert GPIO drivers to module_platform_driver 2012-01-02 00:26:06 -07:00
gpio-vx855.c gpio: Convert GPIO drivers to module_platform_driver 2012-01-02 00:26:06 -07:00
gpio-wm831x.c Merge branch 'gpio/next' of git://git.secretlab.ca/git/linux-2.6 2011-07-22 14:50:57 -07:00
gpio-wm8350.c gpio: reorganize drivers 2011-06-06 10:10:11 -06:00
gpio-wm8994.c gpio: Add decode of WM8994 GPIO configuration 2012-01-02 00:27:01 -07:00
gpio-xilinx.c gpiolib: output basic details and consolidate gpio device drivers 2011-12-12 13:40:16 -07:00
gpiolib.c gpiolib: Add comments explaining the _cansleep() WARN_ON()s 2012-03-05 08:05:08 -07:00
Kconfig gpio: Add a driver for Sodaville GPIO controller 2012-02-03 16:13:25 -07:00
Makefile gpio: Add a driver for Sodaville GPIO controller 2012-02-03 16:13:25 -07:00