diff mbox

[1/2,v3] ARM: s3c24xx: get rid of custom <mach/gpio.h>

Message ID 1386939220-12776-1-git-send-email-linus.walleij@linaro.org (mailing list archive)
State New, archived
Headers show

Commit Message

Linus Walleij Dec. 13, 2013, 12:53 p.m. UTC
This isolates the custom S3C24xx GPIO definition table to
<linux/platform_data/gpio-samsung-s3x24xx.h> as this is
used in a few different places in the kernel, removing the
need to depend on the implicit inclusion of <mach/gpio.h>
from <linux/gpio.h> and thus getting rid of a few nasty
cross-dependencies.

We also delete the nifty CONFIG_S3C24XX_GPIO_EXTRA stuff.
The biggest this can ever be for the S3C24XX is
CONFIG_S3C24XX_GPIO_EXTRA = 128, and then for CPU_S3C2443 or
CPU_S3C2416 32*12 GPIOs are added, so 32*12+128 = 512
is the absolute roof value on this platform. So we set
the size of ARCH_NR_GPIO to this and the GPIOs array will
fit any S3C24XX platform, as per pattern from other archs.

Cc: Tomasz Figa <tomasz.figa@gmail.com>
Cc: Sylwester Nawrocki <sylvester.nawrocki@gmail.com>
Cc: Ben Dooks <ben-linux@fluff.org>
Cc: linux-samsung-soc@vger.kernel.org
Acked-by: Kukjin Kim <kgene.kim@samsung.com>
Acked-by: Heiko Stuebner <heiko@sntech.de>
Tested-by: Heiko Stuebner <heiko@sntech.de>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
---
ChangeLog v2->v3:
- Move the movement of the S3C64XX gpio.h file out of
  this patch and into the follow-up patch where it belongs.
ChangeLog v1->v2:
- Added an #ifdef ARCH_S3C24XX around the header inclusion
  in drivers/gpio/gpio-samsung.c as we would otherwise
  have colliding definitions when compiling S3C64XX.
- Rename inclusion guard in the header file.

I will take this through the GPIO tree.
---
 arch/arm/Kconfig                                   |   3 +-
 arch/arm/mach-s3c24xx/Kconfig                      |  21 ----
 arch/arm/mach-s3c24xx/common-smdk.c                |   2 +-
 arch/arm/mach-s3c24xx/h1940-bluetooth.c            |   1 +
 arch/arm/mach-s3c24xx/include/mach/gpio.h          | 114 ---------------------
 arch/arm/mach-s3c24xx/mach-amlm5900.c              |   1 +
 arch/arm/mach-s3c24xx/mach-anubis.c                |   1 +
 arch/arm/mach-s3c24xx/mach-at2440evb.c             |   1 +
 arch/arm/mach-s3c24xx/mach-bast.c                  |   1 +
 arch/arm/mach-s3c24xx/mach-gta02.c                 |   1 +
 arch/arm/mach-s3c24xx/mach-h1940.c                 |   1 +
 arch/arm/mach-s3c24xx/mach-jive.c                  |   1 +
 arch/arm/mach-s3c24xx/mach-mini2440.c              |   1 +
 arch/arm/mach-s3c24xx/mach-n30.c                   |   1 +
 arch/arm/mach-s3c24xx/mach-nexcoder.c              |   1 +
 arch/arm/mach-s3c24xx/mach-osiris.c                |   1 +
 arch/arm/mach-s3c24xx/mach-qt2410.c                |   1 +
 arch/arm/mach-s3c24xx/mach-rx1950.c                |   1 +
 arch/arm/mach-s3c24xx/mach-rx3715.c                |   1 +
 arch/arm/mach-s3c24xx/mach-smdk2413.c              |   1 +
 arch/arm/mach-s3c24xx/mach-smdk2416.c              |   1 +
 arch/arm/mach-s3c24xx/mach-vr1000.c                |   1 +
 arch/arm/mach-s3c24xx/pm-s3c2410.c                 |   1 +
 arch/arm/mach-s3c24xx/pm.c                         |   1 +
 arch/arm/mach-s3c24xx/s3c2410.c                    |   1 +
 arch/arm/mach-s3c24xx/s3c2416.c                    |   1 +
 arch/arm/mach-s3c24xx/s3c2440.c                    |   1 +
 arch/arm/mach-s3c24xx/s3c2442.c                    |   1 +
 arch/arm/mach-s3c24xx/s3c2443.c                    |   1 +
 arch/arm/mach-s3c24xx/setup-i2c.c                  |   1 +
 arch/arm/mach-s3c24xx/setup-sdhci-gpio.c           |   1 +
 arch/arm/mach-s3c24xx/setup-ts.c                   |   1 +
 arch/arm/mach-s3c24xx/simtec-usb.c                 |   1 +
 arch/arm/plat-samsung/pm-gpio.c                    |   3 +
 arch/arm/plat-samsung/setup-camif.c                |   1 +
 drivers/gpio/gpio-samsung.c                        |   3 +
 drivers/mmc/host/s3cmci.c                          |   1 +
 include/linux/platform_data/gpio-samsung-s3c24xx.h | 106 +++++++++++++++++++
 38 files changed, 145 insertions(+), 138 deletions(-)
 delete mode 100644 arch/arm/mach-s3c24xx/include/mach/gpio.h
 create mode 100644 include/linux/platform_data/gpio-samsung-s3c24xx.h

Comments

Arnd Bergmann Jan. 7, 2014, 11:15 a.m. UTC | #1
On Friday 13 December 2013, Linus Walleij wrote:
> This isolates the custom S3C24xx GPIO definition table to
> <linux/platform_data/gpio-samsung-s3x24xx.h> as this is
> used in a few different places in the kernel, removing the
> need to depend on the implicit inclusion of <mach/gpio.h>
> from <linux/gpio.h> and thus getting rid of a few nasty
> cross-dependencies.
> 
> We also delete the nifty CONFIG_S3C24XX_GPIO_EXTRA stuff.
> The biggest this can ever be for the S3C24XX is
> CONFIG_S3C24XX_GPIO_EXTRA = 128, and then for CPU_S3C2443 or
> CPU_S3C2416 32*12 GPIOs are added, so 32*12+128 = 512
> is the absolute roof value on this platform. So we set
> the size of ARCH_NR_GPIO to this and the GPIOs array will
> fit any S3C24XX platform, as per pattern from other archs.
> 
> Cc: Tomasz Figa <tomasz.figa@gmail.com>
> Cc: Sylwester Nawrocki <sylvester.nawrocki@gmail.com>
> Cc: Ben Dooks <ben-linux@fluff.org>
> Cc: linux-samsung-soc@vger.kernel.org
> Acked-by: Kukjin Kim <kgene.kim@samsung.com>
> Acked-by: Heiko Stuebner <heiko@sntech.de>
> Tested-by: Heiko Stuebner <heiko@sntech.de>
> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>

I'm getting build errors in linux-next for s3c2410_defconfig now
because of this patch :(

Two problems:

* Some files that use functions or macros defined in this file
  fail to include it. I see drivers/leds/leds-s3c24xx.c and
  mach-osiris-dvs.c, but there might be more that don't get built
  by default.

* The file includes <plat/gpio-cfg.h>, which is not a bug yet, but
  will be once we move s3c24xx to multiplatform, which would make
  it impossible to include this file from outside of arch/arm.

Note that on Exynos, the solution for the gpio driver dependencies
was to scrap the driver and use pinctrl-exynos instead.

	Arnd
Linus Walleij Jan. 7, 2014, 6:27 p.m. UTC | #2
On Tue, Jan 7, 2014 at 12:15 PM, Arnd Bergmann <arnd@arndb.de> wrote:
> On Friday 13 December 2013, Linus Walleij wrote:
>> This isolates the custom S3C24xx GPIO definition table to
>> <linux/platform_data/gpio-samsung-s3x24xx.h> as this is
>> used in a few different places in the kernel, removing the
>> need to depend on the implicit inclusion of <mach/gpio.h>
>> from <linux/gpio.h> and thus getting rid of a few nasty
>> cross-dependencies.
>>
>> We also delete the nifty CONFIG_S3C24XX_GPIO_EXTRA stuff.
>> The biggest this can ever be for the S3C24XX is
>> CONFIG_S3C24XX_GPIO_EXTRA = 128, and then for CPU_S3C2443 or
>> CPU_S3C2416 32*12 GPIOs are added, so 32*12+128 = 512
>> is the absolute roof value on this platform. So we set
>> the size of ARCH_NR_GPIO to this and the GPIOs array will
>> fit any S3C24XX platform, as per pattern from other archs.
>>
>> Cc: Tomasz Figa <tomasz.figa@gmail.com>
>> Cc: Sylwester Nawrocki <sylvester.nawrocki@gmail.com>
>> Cc: Ben Dooks <ben-linux@fluff.org>
>> Cc: linux-samsung-soc@vger.kernel.org
>> Acked-by: Kukjin Kim <kgene.kim@samsung.com>
>> Acked-by: Heiko Stuebner <heiko@sntech.de>
>> Tested-by: Heiko Stuebner <heiko@sntech.de>
>> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
>
> I'm getting build errors in linux-next for s3c2410_defconfig now
> because of this patch :(

Hm. I just compiled this defconfig on linux-next:

  AS      arch/arm/boot/compressed/lib1funcs.o
  AS      arch/arm/boot/compressed/ashldi3.o
  AS      arch/arm/boot/compressed/bswapsdi2.o
  CC      arch/arm/boot/compressed/decompress.o
  CC      arch/arm/boot/compressed/misc.o
  GZIP    arch/arm/boot/compressed/piggy.gzip
  AS      arch/arm/boot/compressed/piggy.gzip.o
  LD      arch/arm/boot/compressed/vmlinux
  OBJCOPY arch/arm/boot/zImage
  Kernel: arch/arm/boot/zImage is ready

It appears that these problems appear if you explicitly
enable the DT board support, can't we just put that into
the defconfig then, so we don't miss such things?

> Two problems:
>
> * Some files that use functions or macros defined in this file
>   fail to include it. I see drivers/leds/leds-s3c24xx.c

I merged a patch fixing this by having that file explicitly include
<plat/gpip-cfg.h> (it was already including it implicitly).

> and
>   mach-osiris-dvs.c,

It needs this:
#include <linux/platform_data/gpio-samsung-s3c24xx.h>

(I have sent a patch.)

> but there might be more that don't get built
>   by default.

Yeah implicit includes are a nightmare for refactoring...
I'm trying to grep around for some symbols to see if I
can find some lost cases.

> * The file includes <plat/gpio-cfg.h>, which is not a bug yet, but
>   will be once we move s3c24xx to multiplatform, which would make
>   it impossible to include this file from outside of arch/arm.

Yes that needs to be a step for multiplatform enablement.
My series only tries to make the problem smaller and remove
the dependence on <mach/gpio.h>. All the <mach/*> and
<plat/*> stuff needs to go away eventually ...

> Note that on Exynos, the solution for the gpio driver dependencies
> was to scrap the driver and use pinctrl-exynos instead.

I think the S3C driver is a different piece of hardware unfortunately.

Yours,
Linus Walleij
Heiko Stuebner Jan. 7, 2014, 7:36 p.m. UTC | #3
Am Dienstag, 7. Januar 2014, 19:27:49 schrieb Linus Walleij:
> On Tue, Jan 7, 2014 at 12:15 PM, Arnd Bergmann <arnd@arndb.de> wrote:
> > On Friday 13 December 2013, Linus Walleij wrote:
> > * The file includes <plat/gpio-cfg.h>, which is not a bug yet, but
> > 
> >   will be once we move s3c24xx to multiplatform, which would make
> >   it impossible to include this file from outside of arch/arm.
> 
> Yes that needs to be a step for multiplatform enablement.
> My series only tries to make the problem smaller and remove
> the dependence on <mach/gpio.h>. All the <mach/*> and
> <plat/*> stuff needs to go away eventually ...
>
> > Note that on Exynos, the solution for the gpio driver dependencies
> > was to scrap the driver and use pinctrl-exynos instead.
> 
> I think the S3C driver is a different piece of hardware unfortunately.

both the s3c24xx as well as the exynos pinctrl driver use the common pinctrl-
samsung infrastructure. The biggest part of the pinctrl-{exynos,s3c24xx} 
drivers is the handling of the gpio-interrupts and defining the available 
banks.

In general my multiplatform-plan is to provide the basics (pinctrl, common-
clock, etc) and then take the easy way out, described in some arm-summit-notes 
by simply removing the boards and let people with the hardware that care about 
it readd the specifics :-) .

For example it seems nobody started a S3C2442 machine for quite some time, as 
it was/is missing the clkdev entries for stuff like the serial ports.


Heiko
Arnd Bergmann Jan. 7, 2014, 7:52 p.m. UTC | #4
On Tuesday 07 January 2014, Linus Walleij wrote:
> On Tue, Jan 7, 2014 at 12:15 PM, Arnd Bergmann <arnd@arndb.de> wrote:
> > On Friday 13 December 2013, Linus Walleij wrote:
> 
> Hm. I just compiled this defconfig on linux-next:
> 
>   AS      arch/arm/boot/compressed/lib1funcs.o
>   AS      arch/arm/boot/compressed/ashldi3.o
>   AS      arch/arm/boot/compressed/bswapsdi2.o
>   CC      arch/arm/boot/compressed/decompress.o
>   CC      arch/arm/boot/compressed/misc.o
>   GZIP    arch/arm/boot/compressed/piggy.gzip
>   AS      arch/arm/boot/compressed/piggy.gzip.o
>   LD      arch/arm/boot/compressed/vmlinux
>   OBJCOPY arch/arm/boot/zImage
>   Kernel: arch/arm/boot/zImage is ready
> 
> It appears that these problems appear if you explicitly
> enable the DT board support, can't we just put that into
> the defconfig then, so we don't miss such things?

I don't understand. I didn't enable it manually and
I still get it on linux-next-20130107. Maybe you were
still on the older linux-next that had not been updated
for some time?

> > Two problems:
> >
> > * Some files that use functions or macros defined in this file
> >   fail to include it. I see drivers/leds/leds-s3c24xx.c
> 
> I merged a patch fixing this by having that file explicitly include
> <plat/gpip-cfg.h> (it was already including it implicitly).
> 
> > and
> >   mach-osiris-dvs.c,
> 
> It needs this:
> #include <linux/platform_data/gpio-samsung-s3c24xx.h>
> 
> (I have sent a patch.)

Ok, thanks!

> > but there might be more that don't get built
> >   by default.
> 
> Yeah implicit includes are a nightmare for refactoring...
> I'm trying to grep around for some symbols to see if I
> can find some lost cases.

I just tried building with "make allmodconfig KCONFIG_ALLCONFIG=allconfig",
with the allconfig file containing a CONFIG_MACH_S3C2410=y statement.
This caught a number of additionl problems, some related and some not.

> > * The file includes <plat/gpio-cfg.h>, which is not a bug yet, but
> >   will be once we move s3c24xx to multiplatform, which would make
> >   it impossible to include this file from outside of arch/arm.
> 
> Yes that needs to be a step for multiplatform enablement.
> My series only tries to make the problem smaller and remove
> the dependence on <mach/gpio.h>. All the <mach/*> and
> <plat/*> stuff needs to go away eventually ...

True. What is actually the bigger worry here is that the contents
of the new file, while correctly moved out of mach/gpio.h also
don't belong into include/linux/platform_data, because they don't
define a pdata structure but rather the contents that are supposed
to be passed from the platform code. I would much prefer if you could
move the file back into mach-s3c24xx/ under a new name and keep it out of
platform_data. I suspect that the only thing actually needed by the
gpio driver is the number of GPIO lines per platform, and we can
find another way to communicate that. Most of the contents should
be private to the mach-s3c code and not be visible to either the
gpio driver or any drivers using the plat/gpio-cfg.h interface.

> > Note that on Exynos, the solution for the gpio driver dependencies
> > was to scrap the driver and use pinctrl-exynos instead.
> 
> I think the S3C driver is a different piece of hardware unfortunately.

But exynos was using this driver before it moved to the new pinctrl
driver.

	Arnd
Tomasz Figa Jan. 8, 2014, 12:52 a.m. UTC | #5
On Tuesday 07 of January 2014 20:52:30 Arnd Bergmann wrote:
> On Tuesday 07 January 2014, Linus Walleij wrote:
> > On Tue, Jan 7, 2014 at 12:15 PM, Arnd Bergmann <arnd@arndb.de> wrote:
> > > On Friday 13 December 2013, Linus Walleij wrote:
> > 
> > Hm. I just compiled this defconfig on linux-next:
> > 
> >   AS      arch/arm/boot/compressed/lib1funcs.o
> >   AS      arch/arm/boot/compressed/ashldi3.o
> >   AS      arch/arm/boot/compressed/bswapsdi2.o
> >   CC      arch/arm/boot/compressed/decompress.o
> >   CC      arch/arm/boot/compressed/misc.o
> >   GZIP    arch/arm/boot/compressed/piggy.gzip
> >   AS      arch/arm/boot/compressed/piggy.gzip.o
> >   LD      arch/arm/boot/compressed/vmlinux
> >   OBJCOPY arch/arm/boot/zImage
> >   Kernel: arch/arm/boot/zImage is ready
> > 
> > It appears that these problems appear if you explicitly
> > enable the DT board support, can't we just put that into
> > the defconfig then, so we don't miss such things?
> 
> I don't understand. I didn't enable it manually and
> I still get it on linux-next-20130107. Maybe you were
> still on the older linux-next that had not been updated
> for some time?
> 
> > > Two problems:
> > >
> > > * Some files that use functions or macros defined in this file
> > >   fail to include it. I see drivers/leds/leds-s3c24xx.c
> > 
> > I merged a patch fixing this by having that file explicitly include
> > <plat/gpip-cfg.h> (it was already including it implicitly).
> > 
> > > and
> > >   mach-osiris-dvs.c,
> > 
> > It needs this:
> > #include <linux/platform_data/gpio-samsung-s3c24xx.h>
> > 
> > (I have sent a patch.)
> 
> Ok, thanks!
> 
> > > but there might be more that don't get built
> > >   by default.
> > 
> > Yeah implicit includes are a nightmare for refactoring...
> > I'm trying to grep around for some symbols to see if I
> > can find some lost cases.
> 
> I just tried building with "make allmodconfig KCONFIG_ALLCONFIG=allconfig",
> with the allconfig file containing a CONFIG_MACH_S3C2410=y statement.
> This caught a number of additionl problems, some related and some not.
> 
> > > * The file includes <plat/gpio-cfg.h>, which is not a bug yet, but
> > >   will be once we move s3c24xx to multiplatform, which would make
> > >   it impossible to include this file from outside of arch/arm.
> > 
> > Yes that needs to be a step for multiplatform enablement.
> > My series only tries to make the problem smaller and remove
> > the dependence on <mach/gpio.h>. All the <mach/*> and
> > <plat/*> stuff needs to go away eventually ...
> 
> True. What is actually the bigger worry here is that the contents
> of the new file, while correctly moved out of mach/gpio.h also
> don't belong into include/linux/platform_data, because they don't
> define a pdata structure but rather the contents that are supposed
> to be passed from the platform code. I would much prefer if you could
> move the file back into mach-s3c24xx/ under a new name and keep it out of
> platform_data. I suspect that the only thing actually needed by the
> gpio driver is the number of GPIO lines per platform, and we can
> find another way to communicate that. Most of the contents should
> be private to the mach-s3c code and not be visible to either the
> gpio driver or any drivers using the plat/gpio-cfg.h interface.
> 
> > > Note that on Exynos, the solution for the gpio driver dependencies
> > > was to scrap the driver and use pinctrl-exynos instead.
> > 
> > I think the S3C driver is a different piece of hardware unfortunately.
> 
> But exynos was using this driver before it moved to the new pinctrl
> driver.

Note that, however, pinctrl-samsung is a DT-only driver, so for non-DT
platforms the old gpio-samsung needs to be used. There are no DT platforms
using the old driver, though, all do use the new one.

Best regards,
Tomasz
Linus Walleij Jan. 8, 2014, 8:49 a.m. UTC | #6
On Tue, Jan 7, 2014 at 8:52 PM, Arnd Bergmann <arnd@arndb.de> wrote:
> On Tuesday 07 January 2014, Linus Walleij wrote:

>> It appears that these problems appear if you explicitly
>> enable the DT board support, can't we just put that into
>> the defconfig then, so we don't miss such things?
>
> I don't understand. I didn't enable it manually and
> I still get it on linux-next-20130107. Maybe you were
> still on the older linux-next that had not been updated
> for some time?

No that's not the problem, I used the latest... but:

(...)
> I just tried building with "make allmodconfig KCONFIG_ALLCONFIG=allconfig",
> with the allconfig file containing a CONFIG_MACH_S3C2410=y statement.
> This caught a number of additionl problems, some related and some not.

This was the problem, so making new build rules now
to see if I can catch this.

> What is actually the bigger worry here is that the contents
> of the new file, while correctly moved out of mach/gpio.h also
> don't belong into include/linux/platform_data, because they don't
> define a pdata structure but rather the contents that are supposed
> to be passed from the platform code. I would much prefer if you could
> move the file back into mach-s3c24xx/ under a new name and keep it out of
> platform_data.

Unfortunately it cannot live right under mach-s3c24xx because there
are drivers here and there referring directly to the contents of this
file.

The only quick-fix option would be to move it back to
<mach/gpio-samsung-s3c24xx.h>
but the real solution is of course to augment all drivers to use
gpio descriptors and add descriptor tables to the boardfiles.

I'm a bit reluctant to do that as I'd prefer to be able to test
such modifications on HW ... plus time may be better invested
in DT migration (as I think is the conclusion of this thread
eventually).

> I suspect that the only thing actually needed by the
> gpio driver is the number of GPIO lines per platform, and we can
> find another way to communicate that.

A bit more: if you look in drivers/gpio/gpio-samsung.c you see
bank base GPIO offset for each bank into the global scope
*and* the number of GPIOs for each bank propagated from
machine headers instead of using platform data.

Again the proper solution (if the boardfiles are kept) is to switch
to using a GPIO descriptor table. Or using DT.

> Most of the contents should
> be private to the mach-s3c code and not be visible to either the
> gpio driver or any drivers using the plat/gpio-cfg.h interface.

Samsungs <plat/gpio-cfg.h> is basically a custom legacy pin
control implementation.

The real solution to getting rid of that file is to switch over
to using pinctrl-[samsung|s3c24xx] which as Heiko describes
mandates also using DT, and thus blocks attempts
at using this path for fixing the legacy boardfiles.

It's one of these situations where we end up with an
all-or-nothing conversion path: either you change everything
over to device tree or everything stays in two copies ...
I'm trying to refactor the existing board files here maybe
that is in vain :-/ as GPIO maintainer I want to get rid of
<mach/gpio.h>.

>> > Note that on Exynos, the solution for the gpio driver dependencies
>> > was to scrap the driver and use pinctrl-exynos instead.
>>
>> I think the S3C driver is a different piece of hardware unfortunately.
>
> But exynos was using this driver before it moved to the new pinctrl
> driver.

I was wrong about this, too much in my head. As Tomasz says,
pinctrl-samsung can be used, but mandates that everything is
moved over to device tree.

Probably the best thing now that I have one problem less is to
leave it to the S3C maintainers to complete their DT migration?

Yours,
Linus Walleij
Arnd Bergmann Jan. 8, 2014, 11:43 a.m. UTC | #7
On Wednesday 08 January 2014, Linus Walleij wrote:
> On Tue, Jan 7, 2014 at 8:52 PM, Arnd Bergmann <arnd@arndb.de> wrote:
> > What is actually the bigger worry here is that the contents
> > of the new file, while correctly moved out of mach/gpio.h also
> > don't belong into include/linux/platform_data, because they don't
> > define a pdata structure but rather the contents that are supposed
> > to be passed from the platform code. I would much prefer if you could
> > move the file back into mach-s3c24xx/ under a new name and keep it out of
> > platform_data.
> 
> Unfortunately it cannot live right under mach-s3c24xx because there
> are drivers here and there referring directly to the contents of this
> file.

I think they only reference a small portion of the total contents.
The idea was to make whatever is really needed by drivers visible in
a header and keep everything else in the mach directory.

> The only quick-fix option would be to move it back to
> <mach/gpio-samsung-s3c24xx.h>
> but the real solution is of course to augment all drivers to use
> gpio descriptors and add descriptor tables to the boardfiles.

Right. I would use <mach/gpio-samsung.h> though, so you don't
have to #ifdef it on the platform as you currently do in the
gpio driver.

> I'm a bit reluctant to do that as I'd prefer to be able to test
> such modifications on HW ... plus time may be better invested
> in DT migration (as I think is the conclusion of this thread
> eventually).

Doing the full DT migration would of course be best, but I would
suspect that to take quite a while still.

> > I suspect that the only thing actually needed by the
> > gpio driver is the number of GPIO lines per platform, and we can
> > find another way to communicate that.
> 
> A bit more: if you look in drivers/gpio/gpio-samsung.c you see
> bank base GPIO offset for each bank into the global scope
> *and* the number of GPIOs for each bank propagated from
> machine headers instead of using platform data.
> 
> Again the proper solution (if the boardfiles are kept) is to switch
> to using a GPIO descriptor table. Or using DT.

Ok.

> > Most of the contents should
> > be private to the mach-s3c code and not be visible to either the
> > gpio driver or any drivers using the plat/gpio-cfg.h interface.
> 
> Samsungs <plat/gpio-cfg.h> is basically a custom legacy pin
> control implementation.
> 
> The real solution to getting rid of that file is to switch over
> to using pinctrl-[samsung|s3c24xx] which as Heiko describes
> mandates also using DT, and thus blocks attempts
> at using this path for fixing the legacy boardfiles.
> 
> It's one of these situations where we end up with an
> all-or-nothing conversion path: either you change everything
> over to device tree or everything stays in two copies ...
> I'm trying to refactor the existing board files here maybe
> that is in vain :-/ as GPIO maintainer I want to get rid of
> <mach/gpio.h>.

Well, we can't do it all at once, and we have to start untangling
this somewhere. Getting rid of mach/gpio.h sounds as good to me
as any other part of the puzzle, as long as we don't do something
bad along the lines that comes back to bite us later.

> >> > Note that on Exynos, the solution for the gpio driver dependencies
> >> > was to scrap the driver and use pinctrl-exynos instead.
> >>
> >> I think the S3C driver is a different piece of hardware unfortunately.
> >
> > But exynos was using this driver before it moved to the new pinctrl
> > driver.
> 
> I was wrong about this, too much in my head. As Tomasz says,
> pinctrl-samsung can be used, but mandates that everything is
> moved over to device tree.
> 
> Probably the best thing now that I have one problem less is to
> leave it to the S3C maintainers to complete their DT migration?

Let me have another look first, maybe I can find an intermediate
step that helps you on your conquest to kill mach/gpio.h.

	Arnd
Arnd Bergmann Jan. 8, 2014, 3:59 p.m. UTC | #8
On Wednesday 08 January 2014, Arnd Bergmann wrote:
> On Wednesday 08 January 2014, Linus Walleij wrote:
> > On Tue, Jan 7, 2014 at 8:52 PM, Arnd Bergmann <arnd@arndb.de> wrote:
b> > 
> > I was wrong about this, too much in my head. As Tomasz says,
> > pinctrl-samsung can be used, but mandates that everything is
> > moved over to device tree.
> > 
> > Probably the best thing now that I have one problem less is to
> > leave it to the S3C maintainers to complete their DT migration?
> 
> Let me have another look first, maybe I can find an intermediate
> step that helps you on your conquest to kill mach/gpio.h.

I've asked the mighty grep and it said that these are the files
using the contents you moved around:

drivers/gpio/gpio-samsung.c
drivers/leds/leds-s3c24xx.c
drivers/mmc/host/s3cmci.c
sound/soc/samsung/h1940_uda1380.c
sound/soc/samsung/neo1973_wm8753.c
sound/soc/samsung/rx1950_uda1380.c
sound/soc/samsung/s3c2412-i2s.c
sound/soc/samsung/s3c24xx-i2s.c
sound/soc/samsung/smartq_wm8987.c

The symbols used in these drivers are:

S3C....GP.()
S3C_GPIO_END
S3C_GPIO_PULL_.*
S3C_GPIO_SFN()
s3c_gpio_cfgall_range()
s3c_gpio_setpull()

which is basically all of the mach/gpio.h file, plus a few small parts of
the plat/gpio-cfg.h file. The rest of plat/gpio-cfg.h however is used in
board files to call into the gpio-samsung.c driver, so we still need 
the header file for those, until the board files get replaced with DT
descriptions using the pinctrl interface.

I think it would be worthwhile to go ahead and make all inclusions of
the plat/gpio-cfg.h file explicit, and remove it from mach/gpio.h, that
part should be simple enough and helpful at the same time. Besides the
leds-s3c24xx.c and gpio-samsung.c files we already talked about, I think
it's only s3cmci.c, s3c2412-i2s.c and s3c24xx-i2s.c that still need this
outside of mach-s3c*.

The correct way to get rid of S3C...._GP. and S3C_GPIO_END would be to
pass the GPIO numbers from platform code in platform_data pointers.
It's not hard to do, but tedious to get right for the seven drivers
that need them.

	Arnd
Mark Brown Jan. 8, 2014, 5:08 p.m. UTC | #9
On Tue, Jan 07, 2014 at 07:27:49PM +0100, Linus Walleij wrote:

> I think the S3C driver is a different piece of hardware unfortunately.

It's not, the IP is basically the same - the difference between s3c, s5p
and Exynos is a marketing one, Samsung have generally just reused IP
where that is reasonable.  There's a great deal of continuity in the
platforms.
Linus Walleij Jan. 14, 2014, 10:42 a.m. UTC | #10
On Wed, Jan 8, 2014 at 4:59 PM, Arnd Bergmann <arnd@arndb.de> wrote:

> I've asked the mighty grep and it said that these are the files
> using the contents you moved around:
>
> drivers/gpio/gpio-samsung.c
> drivers/leds/leds-s3c24xx.c
> drivers/mmc/host/s3cmci.c
> sound/soc/samsung/h1940_uda1380.c
> sound/soc/samsung/neo1973_wm8753.c
> sound/soc/samsung/rx1950_uda1380.c
> sound/soc/samsung/s3c2412-i2s.c
> sound/soc/samsung/s3c24xx-i2s.c
> sound/soc/samsung/smartq_wm8987.c
>
> The symbols used in these drivers are:
>
> S3C....GP.()
> S3C_GPIO_END
> S3C_GPIO_PULL_.*
> S3C_GPIO_SFN()
> s3c_gpio_cfgall_range()
> s3c_gpio_setpull()

Hm I will look closer at these. Maybe I can even fix some to just
pass GPIO thru platform data and end-of-story them.
Targeting v3.15.

But I guess you want me to move the
<linux/platform_data/gpio-s3c*> back to <mach/*>
before v3.14 so focusing on that now. (These patches
cannot be just reverted as people have fixed other
Samsung GPIO issues on top of them, so it needs to be done
carefully.)

> I think it would be worthwhile to go ahead and make all inclusions of
> the plat/gpio-cfg.h file explicit, and remove it from mach/gpio.h, that
> part should be simple enough and helpful at the same time.

<plat/gpio-cfg.h> is used by S5P as well, but I guess you've
checked that.

If I take it driver-by-driver it should be possible to get rid of it
or most of it I think, reducing it to the arch/arm/mach-* folder.

Certainly I should be attacking S3C and S5P simultaneously.

Yours,
Linus Walleij
Arnd Bergmann Jan. 14, 2014, 10:52 a.m. UTC | #11
On Tuesday 14 January 2014 11:42:08 Linus Walleij wrote:
> On Wed, Jan 8, 2014 at 4:59 PM, Arnd Bergmann <arnd@arndb.de> wrote:
> 
> > I've asked the mighty grep and it said that these are the files
> > using the contents you moved around:
> >
> > drivers/gpio/gpio-samsung.c
> > drivers/leds/leds-s3c24xx.c
> > drivers/mmc/host/s3cmci.c
> > sound/soc/samsung/h1940_uda1380.c
> > sound/soc/samsung/neo1973_wm8753.c
> > sound/soc/samsung/rx1950_uda1380.c
> > sound/soc/samsung/s3c2412-i2s.c
> > sound/soc/samsung/s3c24xx-i2s.c
> > sound/soc/samsung/smartq_wm8987.c
> >
> > The symbols used in these drivers are:
> >
> > S3C....GP.()
> > S3C_GPIO_END
> > S3C_GPIO_PULL_.*
> > S3C_GPIO_SFN()
> > s3c_gpio_cfgall_range()
> > s3c_gpio_setpull()
> 
> Hm I will look closer at these. Maybe I can even fix some to just
> pass GPIO thru platform data and end-of-story them.
> Targeting v3.15.

Ok, sounds good. That will take care of the first two of this
list, which are the most common ones. The others are from
plat/gpio-cfg.h.

> But I guess you want me to move the
> <linux/platform_data/gpio-s3c*> back to <mach/*>
> before v3.14 so focusing on that now. (These patches
> cannot be just reverted as people have fixed other
> Samsung GPIO issues on top of them, so it needs to be done
> carefully.)

Yes, that would be good. Maybe <mach/gpio-samsung.h> for the
contents rather than putting them back into the common mach/gpio.h?

> > I think it would be worthwhile to go ahead and make all inclusions of
> > the plat/gpio-cfg.h file explicit, and remove it from mach/gpio.h, that
> > part should be simple enough and helpful at the same time.
> 
> <plat/gpio-cfg.h> is used by S5P as well, but I guess you've
> checked that.
> 
> If I take it driver-by-driver it should be possible to get rid of it
> or most of it I think, reducing it to the arch/arm/mach-* folder.
> 
> Certainly I should be attacking S3C and S5P simultaneously.

That makes sense, but note that there is also work going on to make
S5P64xx and S5PV210 multiplatform and DT-only and multiplatform,
and to deprecate S5PC100. If those things happen first, you no longer
have to worry about these platforms as they won't be using this
driver any more.

	Arnd
diff mbox

Patch

diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index c1f1a7eee953..6a26bcb3a63a 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -710,7 +710,6 @@  config ARCH_S3C24XX
 	select HAVE_S3C2410_WATCHDOG if WATCHDOG
 	select HAVE_S3C_RTC if RTC_CLASS
 	select MULTI_IRQ_HANDLER
-	select NEED_MACH_GPIO_H
 	select NEED_MACH_IO_H
 	select SAMSUNG_ATAGS
 	help
@@ -1593,7 +1592,7 @@  config ARM_PSCI
 config ARCH_NR_GPIO
 	int
 	default 1024 if ARCH_SHMOBILE || ARCH_TEGRA
-	default 512 if ARCH_EXYNOS || ARCH_KEYSTONE || SOC_OMAP5 || SOC_DRA7XX
+	default 512 if ARCH_EXYNOS || ARCH_KEYSTONE || SOC_OMAP5 || SOC_DRA7XX || ARCH_S3C24XX
 	default 392 if ARCH_U8500
 	default 352 if ARCH_VT8500
 	default 288 if ARCH_SUNXI
diff --git a/arch/arm/mach-s3c24xx/Kconfig b/arch/arm/mach-s3c24xx/Kconfig
index 8f1d327e0cd1..d876431d64c0 100644
--- a/arch/arm/mach-s3c24xx/Kconfig
+++ b/arch/arm/mach-s3c24xx/Kconfig
@@ -180,27 +180,6 @@  config CPU_LLSERIAL_S3C2440
 	  Selected if there is an S3C2440 (or register compatible) serial
 	  low-level implementation needed
 
-# gpio configurations
-
-config S3C24XX_GPIO_EXTRA
-	int
-	default 128 if S3C24XX_GPIO_EXTRA128
-	default 64 if S3C24XX_GPIO_EXTRA64
-	default 16 if ARCH_H1940
-	default 0
-
-config S3C24XX_GPIO_EXTRA64
-	bool
-	help
-	  Add an extra 64 gpio numbers to the available GPIO pool. This is
-	  available for boards that need extra gpios for external devices.
-
-config S3C24XX_GPIO_EXTRA128
-	bool
-	help
-	  Add an extra 128 gpio numbers to the available GPIO pool. This is
-	  available for boards that need extra gpios for external devices.
-
 config S3C24XX_PLL
 	bool "Support CPUfreq changing of PLL frequency (EXPERIMENTAL)"
 	depends on ARM_S3C24XX_CPUFREQ
diff --git a/arch/arm/mach-s3c24xx/common-smdk.c b/arch/arm/mach-s3c24xx/common-smdk.c
index 404444dd3840..0a84a9c9f429 100644
--- a/arch/arm/mach-s3c24xx/common-smdk.c
+++ b/arch/arm/mach-s3c24xx/common-smdk.c
@@ -38,7 +38,7 @@ 
 
 #include <mach/regs-gpio.h>
 #include <linux/platform_data/leds-s3c24xx.h>
-
+#include <linux/platform_data/gpio-samsung-s3c24xx.h>
 #include <linux/platform_data/mtd-nand-s3c2410.h>
 
 #include <plat/gpio-cfg.h>
diff --git a/arch/arm/mach-s3c24xx/h1940-bluetooth.c b/arch/arm/mach-s3c24xx/h1940-bluetooth.c
index 5b98bfd1df43..f2b859f4c894 100644
--- a/arch/arm/mach-s3c24xx/h1940-bluetooth.c
+++ b/arch/arm/mach-s3c24xx/h1940-bluetooth.c
@@ -18,6 +18,7 @@ 
 #include <linux/leds.h>
 #include <linux/gpio.h>
 #include <linux/rfkill.h>
+#include <linux/platform_data/gpio-samsung-s3c24xx.h>
 
 #include <mach/hardware.h>
 #include <mach/regs-gpio.h>
diff --git a/arch/arm/mach-s3c24xx/include/mach/gpio.h b/arch/arm/mach-s3c24xx/include/mach/gpio.h
deleted file mode 100644
index 14591563ca70..000000000000
--- a/arch/arm/mach-s3c24xx/include/mach/gpio.h
+++ /dev/null
@@ -1,114 +0,0 @@ 
-/*
- * Copyright (c) 2008 Simtec Electronics
- *	http://armlinux.simtec.co.uk/
- *	Ben Dooks <ben@simtec.co.uk>
- *
- * S3C2410 - GPIO lib support
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
-*/
-
-/* some boards require extra gpio capacity to support external
- * devices that need GPIO.
- */
-
-#ifndef __MACH_GPIO_H
-#define __MACH_GPIO_H __FILE__
-
-#ifdef CONFIG_CPU_S3C244X
-#define ARCH_NR_GPIOS	(32 * 9 + CONFIG_S3C24XX_GPIO_EXTRA)
-#elif defined(CONFIG_CPU_S3C2443) || defined(CONFIG_CPU_S3C2416)
-#define ARCH_NR_GPIOS	(32 * 12 + CONFIG_S3C24XX_GPIO_EXTRA)
-#else
-#define ARCH_NR_GPIOS	(256 + CONFIG_S3C24XX_GPIO_EXTRA)
-#endif
-
-/*
- * GPIO sizes for various SoCs:
- *
- *   2410 2412 2440 2443 2416
- *             2442
- *   ---- ---- ---- ---- ----
- * A  23   22   25   16   25
- * B  11   11   11   11   9
- * C  16   15   16   16   16
- * D  16   16   16   16   16
- * E  16   16   16   16   16
- * F  8    8    8    8    8
- * G  16   16   16   16   8
- * H  11   11   9    15   15
- * J  --   --   13   16   --
- * K  --   --   --   --   16
- * L  --   --   --   15   7
- * M  --   --   --   2    2
- */
-
-/* GPIO bank sizes */
-
-#define S3C2410_GPIO_A_NR	(32)
-#define S3C2410_GPIO_B_NR	(32)
-#define S3C2410_GPIO_C_NR	(32)
-#define S3C2410_GPIO_D_NR	(32)
-#define S3C2410_GPIO_E_NR	(32)
-#define S3C2410_GPIO_F_NR	(32)
-#define S3C2410_GPIO_G_NR	(32)
-#define S3C2410_GPIO_H_NR	(32)
-#define S3C2410_GPIO_J_NR	(32)	/* technically 16. */
-#define S3C2410_GPIO_K_NR	(32)	/* technically 16. */
-#define S3C2410_GPIO_L_NR	(32)	/* technically 15. */
-#define S3C2410_GPIO_M_NR	(32)	/* technically 2. */
-
-#if CONFIG_S3C_GPIO_SPACE != 0
-#error CONFIG_S3C_GPIO_SPACE cannot be nonzero at the moment
-#endif
-
-#define S3C2410_GPIO_NEXT(__gpio) \
-	((__gpio##_START) + (__gpio##_NR) + CONFIG_S3C_GPIO_SPACE + 0)
-
-#ifndef __ASSEMBLY__
-
-enum s3c_gpio_number {
-	S3C2410_GPIO_A_START = 0,
-	S3C2410_GPIO_B_START = S3C2410_GPIO_NEXT(S3C2410_GPIO_A),
-	S3C2410_GPIO_C_START = S3C2410_GPIO_NEXT(S3C2410_GPIO_B),
-	S3C2410_GPIO_D_START = S3C2410_GPIO_NEXT(S3C2410_GPIO_C),
-	S3C2410_GPIO_E_START = S3C2410_GPIO_NEXT(S3C2410_GPIO_D),
-	S3C2410_GPIO_F_START = S3C2410_GPIO_NEXT(S3C2410_GPIO_E),
-	S3C2410_GPIO_G_START = S3C2410_GPIO_NEXT(S3C2410_GPIO_F),
-	S3C2410_GPIO_H_START = S3C2410_GPIO_NEXT(S3C2410_GPIO_G),
-	S3C2410_GPIO_J_START = S3C2410_GPIO_NEXT(S3C2410_GPIO_H),
-	S3C2410_GPIO_K_START = S3C2410_GPIO_NEXT(S3C2410_GPIO_J),
-	S3C2410_GPIO_L_START = S3C2410_GPIO_NEXT(S3C2410_GPIO_K),
-	S3C2410_GPIO_M_START = S3C2410_GPIO_NEXT(S3C2410_GPIO_L),
-};
-
-#endif /* __ASSEMBLY__ */
-
-/* S3C2410 GPIO number definitions. */
-
-#define S3C2410_GPA(_nr)	(S3C2410_GPIO_A_START + (_nr))
-#define S3C2410_GPB(_nr)	(S3C2410_GPIO_B_START + (_nr))
-#define S3C2410_GPC(_nr)	(S3C2410_GPIO_C_START + (_nr))
-#define S3C2410_GPD(_nr)	(S3C2410_GPIO_D_START + (_nr))
-#define S3C2410_GPE(_nr)	(S3C2410_GPIO_E_START + (_nr))
-#define S3C2410_GPF(_nr)	(S3C2410_GPIO_F_START + (_nr))
-#define S3C2410_GPG(_nr)	(S3C2410_GPIO_G_START + (_nr))
-#define S3C2410_GPH(_nr)	(S3C2410_GPIO_H_START + (_nr))
-#define S3C2410_GPJ(_nr)	(S3C2410_GPIO_J_START + (_nr))
-#define S3C2410_GPK(_nr)	(S3C2410_GPIO_K_START + (_nr))
-#define S3C2410_GPL(_nr)	(S3C2410_GPIO_L_START + (_nr))
-#define S3C2410_GPM(_nr)	(S3C2410_GPIO_M_START + (_nr))
-
-#include <plat/gpio-cfg.h>
-
-#ifdef CONFIG_CPU_S3C244X
-#define S3C_GPIO_END	(S3C2410_GPJ(0) + 32)
-#elif defined(CONFIG_CPU_S3C2443) || defined(CONFIG_CPU_S3C2416)
-#define S3C_GPIO_END	(S3C2410_GPM(0) + 32)
-#else
-#define S3C_GPIO_END	(S3C2410_GPH(0) + 32)
-#endif
-
-#endif /* __MACH_GPIO_H */
diff --git a/arch/arm/mach-s3c24xx/mach-amlm5900.c b/arch/arm/mach-s3c24xx/mach-amlm5900.c
index e27b5c91b3db..530e9a624466 100644
--- a/arch/arm/mach-s3c24xx/mach-amlm5900.c
+++ b/arch/arm/mach-s3c24xx/mach-amlm5900.c
@@ -54,6 +54,7 @@ 
 #include <mach/regs-gpio.h>
 
 #include <linux/platform_data/i2c-s3c2410.h>
+#include <linux/platform_data/gpio-samsung-s3c24xx.h>
 #include <plat/devs.h>
 #include <plat/cpu.h>
 #include <plat/gpio-cfg.h>
diff --git a/arch/arm/mach-s3c24xx/mach-anubis.c b/arch/arm/mach-s3c24xx/mach-anubis.c
index c1fb6c37867f..b60a248c033a 100644
--- a/arch/arm/mach-s3c24xx/mach-anubis.c
+++ b/arch/arm/mach-s3c24xx/mach-anubis.c
@@ -37,6 +37,7 @@ 
 #include <mach/regs-lcd.h>
 #include <linux/platform_data/mtd-nand-s3c2410.h>
 #include <linux/platform_data/i2c-s3c2410.h>
+#include <linux/platform_data/gpio-samsung-s3c24xx.h>
 
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/nand.h>
diff --git a/arch/arm/mach-s3c24xx/mach-at2440evb.c b/arch/arm/mach-s3c24xx/mach-at2440evb.c
index 6dfeeb7ef469..74401196b429 100644
--- a/arch/arm/mach-s3c24xx/mach-at2440evb.c
+++ b/arch/arm/mach-s3c24xx/mach-at2440evb.c
@@ -38,6 +38,7 @@ 
 #include <mach/regs-lcd.h>
 #include <linux/platform_data/mtd-nand-s3c2410.h>
 #include <linux/platform_data/i2c-s3c2410.h>
+#include <linux/platform_data/gpio-samsung-s3c24xx.h>
 
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/nand.h>
diff --git a/arch/arm/mach-s3c24xx/mach-bast.c b/arch/arm/mach-s3c24xx/mach-bast.c
index 22d6ae926d91..47fe7af87129 100644
--- a/arch/arm/mach-s3c24xx/mach-bast.c
+++ b/arch/arm/mach-s3c24xx/mach-bast.c
@@ -35,6 +35,7 @@ 
 #include <linux/platform_data/hwmon-s3c.h>
 #include <linux/platform_data/i2c-s3c2410.h>
 #include <linux/platform_data/mtd-nand-s3c2410.h>
+#include <linux/platform_data/gpio-samsung-s3c24xx.h>
 
 #include <net/ax88796.h>
 
diff --git a/arch/arm/mach-s3c24xx/mach-gta02.c b/arch/arm/mach-s3c24xx/mach-gta02.c
index 13d8d073675a..c2c2ac78cea8 100644
--- a/arch/arm/mach-s3c24xx/mach-gta02.c
+++ b/arch/arm/mach-s3c24xx/mach-gta02.c
@@ -70,6 +70,7 @@ 
 #include <linux/platform_data/touchscreen-s3c2410.h>
 #include <linux/platform_data/usb-ohci-s3c2410.h>
 #include <linux/platform_data/usb-s3c2410_udc.h>
+#include <linux/platform_data/gpio-samsung-s3c24xx.h>
 
 #include <mach/fb.h>
 #include <mach/hardware.h>
diff --git a/arch/arm/mach-s3c24xx/mach-h1940.c b/arch/arm/mach-s3c24xx/mach-h1940.c
index 952b6a040d1f..d25d8b18512c 100644
--- a/arch/arm/mach-s3c24xx/mach-h1940.c
+++ b/arch/arm/mach-s3c24xx/mach-h1940.c
@@ -46,6 +46,7 @@ 
 #include <linux/platform_data/mmc-s3cmci.h>
 #include <linux/platform_data/touchscreen-s3c2410.h>
 #include <linux/platform_data/usb-s3c2410_udc.h>
+#include <linux/platform_data/gpio-samsung-s3c24xx.h>
 
 #include <sound/uda1380.h>
 
diff --git a/arch/arm/mach-s3c24xx/mach-jive.c b/arch/arm/mach-s3c24xx/mach-jive.c
index 43c23e220f5b..434dbf231773 100644
--- a/arch/arm/mach-s3c24xx/mach-jive.c
+++ b/arch/arm/mach-s3c24xx/mach-jive.c
@@ -34,6 +34,7 @@ 
 #include <plat/regs-serial.h>
 #include <linux/platform_data/mtd-nand-s3c2410.h>
 #include <linux/platform_data/i2c-s3c2410.h>
+#include <linux/platform_data/gpio-samsung-s3c24xx.h>
 
 #include <mach/regs-gpio.h>
 #include <mach/regs-lcd.h>
diff --git a/arch/arm/mach-s3c24xx/mach-mini2440.c b/arch/arm/mach-s3c24xx/mach-mini2440.c
index 4a18d49a63e0..48af11fc15fd 100644
--- a/arch/arm/mach-s3c24xx/mach-mini2440.c
+++ b/arch/arm/mach-s3c24xx/mach-mini2440.c
@@ -46,6 +46,7 @@ 
 #include <linux/platform_data/i2c-s3c2410.h>
 #include <linux/platform_data/mmc-s3cmci.h>
 #include <linux/platform_data/usb-s3c2410_udc.h>
+#include <linux/platform_data/gpio-samsung-s3c24xx.h>
 
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/nand.h>
diff --git a/arch/arm/mach-s3c24xx/mach-n30.c b/arch/arm/mach-s3c24xx/mach-n30.c
index 2cb46c37c920..7fcb887f5289 100644
--- a/arch/arm/mach-s3c24xx/mach-n30.c
+++ b/arch/arm/mach-s3c24xx/mach-n30.c
@@ -42,6 +42,7 @@ 
 #include <asm/mach/map.h>
 
 #include <linux/platform_data/i2c-s3c2410.h>
+#include <linux/platform_data/gpio-samsung-s3c24xx.h>
 #include <plat/regs-serial.h>
 
 #include <plat/clock.h>
diff --git a/arch/arm/mach-s3c24xx/mach-nexcoder.c b/arch/arm/mach-s3c24xx/mach-nexcoder.c
index 01f4354206f9..0f27ac44db09 100644
--- a/arch/arm/mach-s3c24xx/mach-nexcoder.c
+++ b/arch/arm/mach-s3c24xx/mach-nexcoder.c
@@ -39,6 +39,7 @@ 
 #include <mach/regs-gpio.h>
 #include <plat/regs-serial.h>
 #include <linux/platform_data/i2c-s3c2410.h>
+#include <linux/platform_data/gpio-samsung-s3c24xx.h>
 
 #include <plat/gpio-cfg.h>
 #include <plat/clock.h>
diff --git a/arch/arm/mach-s3c24xx/mach-osiris.c b/arch/arm/mach-s3c24xx/mach-osiris.c
index 58d6fbe5bf1f..040b16aff93d 100644
--- a/arch/arm/mach-s3c24xx/mach-osiris.c
+++ b/arch/arm/mach-s3c24xx/mach-osiris.c
@@ -33,6 +33,7 @@ 
 
 #include <linux/platform_data/mtd-nand-s3c2410.h>
 #include <linux/platform_data/i2c-s3c2410.h>
+#include <linux/platform_data/gpio-samsung-s3c24xx.h>
 
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/nand.h>
diff --git a/arch/arm/mach-s3c24xx/mach-qt2410.c b/arch/arm/mach-s3c24xx/mach-qt2410.c
index f8feaeadb55a..96c3bc858710 100644
--- a/arch/arm/mach-s3c24xx/mach-qt2410.c
+++ b/arch/arm/mach-s3c24xx/mach-qt2410.c
@@ -54,6 +54,7 @@ 
 #include <linux/platform_data/mtd-nand-s3c2410.h>
 #include <linux/platform_data/usb-s3c2410_udc.h>
 #include <linux/platform_data/i2c-s3c2410.h>
+#include <linux/platform_data/gpio-samsung-s3c24xx.h>
 
 #include <plat/gpio-cfg.h>
 #include <plat/devs.h>
diff --git a/arch/arm/mach-s3c24xx/mach-rx1950.c b/arch/arm/mach-s3c24xx/mach-rx1950.c
index 034b7fe45c49..d492fb938bbb 100644
--- a/arch/arm/mach-s3c24xx/mach-rx1950.c
+++ b/arch/arm/mach-s3c24xx/mach-rx1950.c
@@ -45,6 +45,7 @@ 
 #include <linux/platform_data/mtd-nand-s3c2410.h>
 #include <linux/platform_data/touchscreen-s3c2410.h>
 #include <linux/platform_data/usb-s3c2410_udc.h>
+#include <linux/platform_data/gpio-samsung-s3c24xx.h>
 
 #include <sound/uda1380.h>
 
diff --git a/arch/arm/mach-s3c24xx/mach-rx3715.c b/arch/arm/mach-s3c24xx/mach-rx3715.c
index 3bc6231d0a1f..319ed8033475 100644
--- a/arch/arm/mach-s3c24xx/mach-rx3715.c
+++ b/arch/arm/mach-s3c24xx/mach-rx3715.c
@@ -35,6 +35,7 @@ 
 #include <asm/mach/map.h>
 
 #include <linux/platform_data/mtd-nand-s3c2410.h>
+#include <linux/platform_data/gpio-samsung-s3c24xx.h>
 
 #include <asm/irq.h>
 #include <asm/mach-types.h>
diff --git a/arch/arm/mach-s3c24xx/mach-smdk2413.c b/arch/arm/mach-s3c24xx/mach-smdk2413.c
index c9d31ef28dd1..86e25012b0c1 100644
--- a/arch/arm/mach-s3c24xx/mach-smdk2413.c
+++ b/arch/arm/mach-s3c24xx/mach-smdk2413.c
@@ -39,6 +39,7 @@ 
 
 #include <linux/platform_data/usb-s3c2410_udc.h>
 #include <linux/platform_data/i2c-s3c2410.h>
+#include <linux/platform_data/gpio-samsung-s3c24xx.h>
 #include <mach/fb.h>
 
 #include <plat/clock.h>
diff --git a/arch/arm/mach-s3c24xx/mach-smdk2416.c b/arch/arm/mach-s3c24xx/mach-smdk2416.c
index f88e672ad1e4..0cc691d01d60 100644
--- a/arch/arm/mach-s3c24xx/mach-smdk2416.c
+++ b/arch/arm/mach-s3c24xx/mach-smdk2416.c
@@ -41,6 +41,7 @@ 
 
 #include <linux/platform_data/leds-s3c24xx.h>
 #include <linux/platform_data/i2c-s3c2410.h>
+#include <linux/platform_data/gpio-samsung-s3c24xx.h>
 
 #include <plat/gpio-cfg.h>
 #include <plat/clock.h>
diff --git a/arch/arm/mach-s3c24xx/mach-vr1000.c b/arch/arm/mach-s3c24xx/mach-vr1000.c
index 42e7187fed60..86e7ffdca33f 100644
--- a/arch/arm/mach-s3c24xx/mach-vr1000.c
+++ b/arch/arm/mach-s3c24xx/mach-vr1000.c
@@ -37,6 +37,7 @@ 
 #include <linux/platform_data/leds-s3c24xx.h>
 #include <linux/platform_data/i2c-s3c2410.h>
 #include <linux/platform_data/asoc-s3c24xx_simtec.h>
+#include <linux/platform_data/gpio-samsung-s3c24xx.h>
 
 #include <mach/hardware.h>
 #include <mach/regs-gpio.h>
diff --git a/arch/arm/mach-s3c24xx/pm-s3c2410.c b/arch/arm/mach-s3c24xx/pm-s3c2410.c
index 2d82c4f116cd..e4cd56e8b90b 100644
--- a/arch/arm/mach-s3c24xx/pm-s3c2410.c
+++ b/arch/arm/mach-s3c24xx/pm-s3c2410.c
@@ -28,6 +28,7 @@ 
 #include <linux/syscore_ops.h>
 #include <linux/gpio.h>
 #include <linux/io.h>
+#include <linux/platform_data/gpio-samsung-s3c24xx.h>
 
 #include <asm/mach-types.h>
 
diff --git a/arch/arm/mach-s3c24xx/pm.c b/arch/arm/mach-s3c24xx/pm.c
index caa5b7211380..2baa887b28d2 100644
--- a/arch/arm/mach-s3c24xx/pm.c
+++ b/arch/arm/mach-s3c24xx/pm.c
@@ -34,6 +34,7 @@ 
 #include <linux/interrupt.h>
 #include <linux/serial_core.h>
 #include <linux/io.h>
+#include <linux/platform_data/gpio-samsung-s3c24xx.h>
 
 #include <plat/regs-serial.h>
 #include <mach/regs-clock.h>
diff --git a/arch/arm/mach-s3c24xx/s3c2410.c b/arch/arm/mach-s3c24xx/s3c2410.c
index 34676d1d5fec..db22f748ce8d 100644
--- a/arch/arm/mach-s3c24xx/s3c2410.c
+++ b/arch/arm/mach-s3c24xx/s3c2410.c
@@ -24,6 +24,7 @@ 
 #include <linux/platform_device.h>
 #include <linux/reboot.h>
 #include <linux/io.h>
+#include <linux/platform_data/gpio-samsung-s3c24xx.h>
 
 #include <asm/mach/arch.h>
 #include <asm/mach/map.h>
diff --git a/arch/arm/mach-s3c24xx/s3c2416.c b/arch/arm/mach-s3c24xx/s3c2416.c
index 9ef3ccfbe196..cb77880029f7 100644
--- a/arch/arm/mach-s3c24xx/s3c2416.c
+++ b/arch/arm/mach-s3c24xx/s3c2416.c
@@ -36,6 +36,7 @@ 
 #include <linux/clk.h>
 #include <linux/io.h>
 #include <linux/reboot.h>
+#include <linux/platform_data/gpio-samsung-s3c24xx.h>
 
 #include <asm/mach/arch.h>
 #include <asm/mach/map.h>
diff --git a/arch/arm/mach-s3c24xx/s3c2440.c b/arch/arm/mach-s3c24xx/s3c2440.c
index 5f9d6569475d..22e5dbdcbe8d 100644
--- a/arch/arm/mach-s3c24xx/s3c2440.c
+++ b/arch/arm/mach-s3c24xx/s3c2440.c
@@ -23,6 +23,7 @@ 
 #include <linux/gpio.h>
 #include <linux/clk.h>
 #include <linux/io.h>
+#include <linux/platform_data/gpio-samsung-s3c24xx.h>
 
 #include <asm/mach/arch.h>
 #include <asm/mach/map.h>
diff --git a/arch/arm/mach-s3c24xx/s3c2442.c b/arch/arm/mach-s3c24xx/s3c2442.c
index 6819961f6b19..4ba093b4e495 100644
--- a/arch/arm/mach-s3c24xx/s3c2442.c
+++ b/arch/arm/mach-s3c24xx/s3c2442.c
@@ -35,6 +35,7 @@ 
 #include <linux/gpio.h>
 #include <linux/clk.h>
 #include <linux/io.h>
+#include <linux/platform_data/gpio-samsung-s3c24xx.h>
 
 #include <mach/hardware.h>
 #include <linux/atomic.h>
diff --git a/arch/arm/mach-s3c24xx/s3c2443.c b/arch/arm/mach-s3c24xx/s3c2443.c
index b6c71918b25c..faa1086924c4 100644
--- a/arch/arm/mach-s3c24xx/s3c2443.c
+++ b/arch/arm/mach-s3c24xx/s3c2443.c
@@ -23,6 +23,7 @@ 
 #include <linux/clk.h>
 #include <linux/io.h>
 #include <linux/reboot.h>
+#include <linux/platform_data/gpio-samsung-s3c24xx.h>
 
 #include <asm/mach/arch.h>
 #include <asm/mach/map.h>
diff --git a/arch/arm/mach-s3c24xx/setup-i2c.c b/arch/arm/mach-s3c24xx/setup-i2c.c
index 7b4f33332d19..3d1fd5ce24e5 100644
--- a/arch/arm/mach-s3c24xx/setup-i2c.c
+++ b/arch/arm/mach-s3c24xx/setup-i2c.c
@@ -17,6 +17,7 @@  struct platform_device;
 
 #include <plat/gpio-cfg.h>
 #include <linux/platform_data/i2c-s3c2410.h>
+#include <linux/platform_data/gpio-samsung-s3c24xx.h>
 #include <mach/hardware.h>
 #include <mach/regs-gpio.h>
 
diff --git a/arch/arm/mach-s3c24xx/setup-sdhci-gpio.c b/arch/arm/mach-s3c24xx/setup-sdhci-gpio.c
index f65cb3ef16ce..2835241f732a 100644
--- a/arch/arm/mach-s3c24xx/setup-sdhci-gpio.c
+++ b/arch/arm/mach-s3c24xx/setup-sdhci-gpio.c
@@ -18,6 +18,7 @@ 
 #include <linux/platform_device.h>
 #include <linux/io.h>
 #include <linux/gpio.h>
+#include <linux/platform_data/gpio-samsung-s3c24xx.h>
 
 #include <mach/regs-gpio.h>
 #include <plat/gpio-cfg.h>
diff --git a/arch/arm/mach-s3c24xx/setup-ts.c b/arch/arm/mach-s3c24xx/setup-ts.c
index 4e11affce3a8..1ea4056f6fdc 100644
--- a/arch/arm/mach-s3c24xx/setup-ts.c
+++ b/arch/arm/mach-s3c24xx/setup-ts.c
@@ -12,6 +12,7 @@ 
 
 #include <linux/kernel.h>
 #include <linux/gpio.h>
+#include <linux/platform_data/gpio-samsung-s3c24xx.h>
 
 struct platform_device; /* don't need the contents */
 
diff --git a/arch/arm/mach-s3c24xx/simtec-usb.c b/arch/arm/mach-s3c24xx/simtec-usb.c
index 2ed2e32430dc..a007e5f16583 100644
--- a/arch/arm/mach-s3c24xx/simtec-usb.c
+++ b/arch/arm/mach-s3c24xx/simtec-usb.c
@@ -32,6 +32,7 @@ 
 #include <asm/irq.h>
 
 #include <linux/platform_data/usb-ohci-s3c2410.h>
+#include <linux/platform_data/gpio-samsung-s3c24xx.h>
 #include <plat/devs.h>
 
 #include "bast.h"
diff --git a/arch/arm/plat-samsung/pm-gpio.c b/arch/arm/plat-samsung/pm-gpio.c
index a8de3cfe2ee1..41fef6980230 100644
--- a/arch/arm/plat-samsung/pm-gpio.c
+++ b/arch/arm/plat-samsung/pm-gpio.c
@@ -19,6 +19,9 @@ 
 #include <linux/io.h>
 #include <linux/gpio.h>
 
+#ifdef CONFIG_ARCH_S3C24XX
+#include <linux/platform_data/gpio-samsung-s3c24xx.h>
+#endif
 #include <plat/gpio-core.h>
 #include <plat/pm.h>
 
diff --git a/arch/arm/plat-samsung/setup-camif.c b/arch/arm/plat-samsung/setup-camif.c
index e01bf760af2c..70cf503c9a6b 100644
--- a/arch/arm/plat-samsung/setup-camif.c
+++ b/arch/arm/plat-samsung/setup-camif.c
@@ -9,6 +9,7 @@ 
  */
 
 #include <linux/gpio.h>
+#include <linux/platform_data/gpio-samsung-s3c24xx.h>
 #include <plat/gpio-cfg.h>
 
 /* Number of camera port pins, without FIELD */
diff --git a/drivers/gpio/gpio-samsung.c b/drivers/gpio/gpio-samsung.c
index 76e02b9460e6..268214c57799 100644
--- a/drivers/gpio/gpio-samsung.c
+++ b/drivers/gpio/gpio-samsung.c
@@ -27,6 +27,9 @@ 
 #include <linux/of.h>
 #include <linux/slab.h>
 #include <linux/of_address.h>
+#ifdef CONFIG_ARCH_S3C24XX
+#include <linux/platform_data/gpio-samsung-s3c24xx.h>
+#endif
 
 #include <asm/irq.h>
 
diff --git a/drivers/mmc/host/s3cmci.c b/drivers/mmc/host/s3cmci.c
index 2fce5ea5eb39..11ba3cbb0951 100644
--- a/drivers/mmc/host/s3cmci.c
+++ b/drivers/mmc/host/s3cmci.c
@@ -26,6 +26,7 @@ 
 #include <mach/dma.h>
 
 #include <linux/platform_data/mmc-s3cmci.h>
+#include <linux/platform_data/gpio-samsung-s3c24xx.h>
 
 #include "s3cmci.h"
 
diff --git a/include/linux/platform_data/gpio-samsung-s3c24xx.h b/include/linux/platform_data/gpio-samsung-s3c24xx.h
new file mode 100644
index 000000000000..5ce750c84a14
--- /dev/null
+++ b/include/linux/platform_data/gpio-samsung-s3c24xx.h
@@ -0,0 +1,106 @@ 
+/*
+ * Copyright (c) 2008 Simtec Electronics
+ *	http://armlinux.simtec.co.uk/
+ *	Ben Dooks <ben@simtec.co.uk>
+ *
+ * S3C2410 - GPIO lib support
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+*/
+
+/* some boards require extra gpio capacity to support external
+ * devices that need GPIO.
+ */
+
+#ifndef GPIO_SAMSUNG_S3C24XX_H
+#define GPIO_SAMSUNG_S3C24XX_H
+
+/*
+ * GPIO sizes for various SoCs:
+ *
+ *   2410 2412 2440 2443 2416
+ *             2442
+ *   ---- ---- ---- ---- ----
+ * A  23   22   25   16   25
+ * B  11   11   11   11   9
+ * C  16   15   16   16   16
+ * D  16   16   16   16   16
+ * E  16   16   16   16   16
+ * F  8    8    8    8    8
+ * G  16   16   16   16   8
+ * H  11   11   9    15   15
+ * J  --   --   13   16   --
+ * K  --   --   --   --   16
+ * L  --   --   --   15   7
+ * M  --   --   --   2    2
+ */
+
+/* GPIO bank sizes */
+
+#define S3C2410_GPIO_A_NR	(32)
+#define S3C2410_GPIO_B_NR	(32)
+#define S3C2410_GPIO_C_NR	(32)
+#define S3C2410_GPIO_D_NR	(32)
+#define S3C2410_GPIO_E_NR	(32)
+#define S3C2410_GPIO_F_NR	(32)
+#define S3C2410_GPIO_G_NR	(32)
+#define S3C2410_GPIO_H_NR	(32)
+#define S3C2410_GPIO_J_NR	(32)	/* technically 16. */
+#define S3C2410_GPIO_K_NR	(32)	/* technically 16. */
+#define S3C2410_GPIO_L_NR	(32)	/* technically 15. */
+#define S3C2410_GPIO_M_NR	(32)	/* technically 2. */
+
+#if CONFIG_S3C_GPIO_SPACE != 0
+#error CONFIG_S3C_GPIO_SPACE cannot be nonzero at the moment
+#endif
+
+#define S3C2410_GPIO_NEXT(__gpio) \
+	((__gpio##_START) + (__gpio##_NR) + CONFIG_S3C_GPIO_SPACE + 0)
+
+#ifndef __ASSEMBLY__
+
+enum s3c_gpio_number {
+	S3C2410_GPIO_A_START = 0,
+	S3C2410_GPIO_B_START = S3C2410_GPIO_NEXT(S3C2410_GPIO_A),
+	S3C2410_GPIO_C_START = S3C2410_GPIO_NEXT(S3C2410_GPIO_B),
+	S3C2410_GPIO_D_START = S3C2410_GPIO_NEXT(S3C2410_GPIO_C),
+	S3C2410_GPIO_E_START = S3C2410_GPIO_NEXT(S3C2410_GPIO_D),
+	S3C2410_GPIO_F_START = S3C2410_GPIO_NEXT(S3C2410_GPIO_E),
+	S3C2410_GPIO_G_START = S3C2410_GPIO_NEXT(S3C2410_GPIO_F),
+	S3C2410_GPIO_H_START = S3C2410_GPIO_NEXT(S3C2410_GPIO_G),
+	S3C2410_GPIO_J_START = S3C2410_GPIO_NEXT(S3C2410_GPIO_H),
+	S3C2410_GPIO_K_START = S3C2410_GPIO_NEXT(S3C2410_GPIO_J),
+	S3C2410_GPIO_L_START = S3C2410_GPIO_NEXT(S3C2410_GPIO_K),
+	S3C2410_GPIO_M_START = S3C2410_GPIO_NEXT(S3C2410_GPIO_L),
+};
+
+#endif /* __ASSEMBLY__ */
+
+/* S3C2410 GPIO number definitions. */
+
+#define S3C2410_GPA(_nr)	(S3C2410_GPIO_A_START + (_nr))
+#define S3C2410_GPB(_nr)	(S3C2410_GPIO_B_START + (_nr))
+#define S3C2410_GPC(_nr)	(S3C2410_GPIO_C_START + (_nr))
+#define S3C2410_GPD(_nr)	(S3C2410_GPIO_D_START + (_nr))
+#define S3C2410_GPE(_nr)	(S3C2410_GPIO_E_START + (_nr))
+#define S3C2410_GPF(_nr)	(S3C2410_GPIO_F_START + (_nr))
+#define S3C2410_GPG(_nr)	(S3C2410_GPIO_G_START + (_nr))
+#define S3C2410_GPH(_nr)	(S3C2410_GPIO_H_START + (_nr))
+#define S3C2410_GPJ(_nr)	(S3C2410_GPIO_J_START + (_nr))
+#define S3C2410_GPK(_nr)	(S3C2410_GPIO_K_START + (_nr))
+#define S3C2410_GPL(_nr)	(S3C2410_GPIO_L_START + (_nr))
+#define S3C2410_GPM(_nr)	(S3C2410_GPIO_M_START + (_nr))
+
+#include <plat/gpio-cfg.h>
+
+#ifdef CONFIG_CPU_S3C244X
+#define S3C_GPIO_END	(S3C2410_GPJ(0) + 32)
+#elif defined(CONFIG_CPU_S3C2443) || defined(CONFIG_CPU_S3C2416)
+#define S3C_GPIO_END	(S3C2410_GPM(0) + 32)
+#else
+#define S3C_GPIO_END	(S3C2410_GPH(0) + 32)
+#endif
+
+#endif /* GPIO_SAMSUNG_S3C24XX_H */