Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8a53bdb9 authored by Ben Dooks's avatar Ben Dooks
Browse files

[ARM] S3C: Add GPIO chip tracking



The gpiolib driver keeps its chip array to itself
and having a separate array for s3c-only gpios stops
any non-s3c gpio being used in one of the s3c specific
configuration calls.

Signed-off-by: default avatarBen Dooks <ben-linux@fluff.org>
parent 7db6c82a
Loading
Loading
Loading
Loading
+6 −0
Original line number Original line Diff line number Diff line
@@ -114,6 +114,12 @@ config S3C_GPIO_SPACE
	  one bank to another to be caught, at the expense of using a little
	  one bank to another to be caught, at the expense of using a little
	  more memory.
	  more memory.


config S3C_GPIO_TRACK
	bool
	help
	  Internal configuration option to enable the s3c specific gpio
	  chip tracking if the platform requires it.

# device definitions to compile in
# device definitions to compile in


config S3C_DEV_HSMMC
config S3C_DEV_HSMMC
+20 −1
Original line number Original line Diff line number Diff line
@@ -18,6 +18,22 @@


#include <plat/gpio-core.h>
#include <plat/gpio-core.h>


#ifdef CONFIG_S3C_GPIO_TRACK
struct s3c_gpio_chip *s3c_gpios[S3C_GPIO_END];

static __init void s3c_gpiolib_track(struct s3c_gpio_chip *chip)
{
	unsigned int gpn;
	int i;

	gpn = chip->chip.base;
	for (i = 0; i < chip->chip.ngpio; i++, gpn++) {
		BUG_ON(gpn > ARRAY_SIZE(s3c_gpios));
		s3c_gpios[gpn] = chip;
	}
}
#endif /* CONFIG_S3C_GPIO_TRACK */

/* Default routines for controlling GPIO, based on the original S3C24XX
/* Default routines for controlling GPIO, based on the original S3C24XX
 * GPIO functions which deal with the case where each gpio bank of the
 * GPIO functions which deal with the case where each gpio bank of the
 * chip is as following:
 * chip is as following:
@@ -109,6 +125,7 @@ static int s3c_gpiolib_get(struct gpio_chip *chip, unsigned offset)
__init void s3c_gpiolib_add(struct s3c_gpio_chip *chip)
__init void s3c_gpiolib_add(struct s3c_gpio_chip *chip)
{
{
	struct gpio_chip *gc = &chip->chip;
	struct gpio_chip *gc = &chip->chip;
	int ret;


	BUG_ON(!chip->base);
	BUG_ON(!chip->base);
	BUG_ON(!gc->label);
	BUG_ON(!gc->label);
@@ -124,5 +141,7 @@ __init void s3c_gpiolib_add(struct s3c_gpio_chip *chip)
		gc->get = s3c_gpiolib_get;
		gc->get = s3c_gpiolib_get;


	/* gpiochip_add() prints own failure message on error. */
	/* gpiochip_add() prints own failure message on error. */
	gpiochip_add(gc);
	ret = gpiochip_add(gc);
	if (ret >= 0)
		s3c_gpiolib_track(chip);
}
}
+23 −0
Original line number Original line Diff line number Diff line
@@ -47,3 +47,26 @@ static inline struct s3c_gpio_chip *to_s3c_gpio(struct gpio_chip *gpc)
 * other parts of the system.
 * other parts of the system.
 */
 */
extern void s3c_gpiolib_add(struct s3c_gpio_chip *chip);
extern void s3c_gpiolib_add(struct s3c_gpio_chip *chip);


/* CONFIG_S3C_GPIO_TRACK enables the tracking of the s3c specific gpios
 * for use with the configuration calls, and other parts of the s3c gpiolib
 * support code.
 *
 * Not all s3c support code will need this, as some configurations of cpu
 * may only support one or two different configuration options and have an
 * easy gpio to s3c_gpio_chip mapping function. If this is the case, then
 * the machine support file should provide its own s3c_gpiolib_getchip()
 * and any other necessary functions.
 */

#ifdef CONFIG_S3C_GPIO_TRACK
extern struct s3c_gpio_chip *s3c_gpios[S3C_GPIO_END];

static inline struct s3c_gpio_chip *s3c_gpiolib_getchip(unsigned int chip)
{
	return s3c_gpios[chip];
}
#else
static inline void s3c_gpiolib_track(struct s3c_gpio_chip *chip) { }
#endif
+1 −0
Original line number Original line Diff line number Diff line
@@ -14,6 +14,7 @@ config PLAT_S3C64XX
	default y
	default y
	select NO_IOPORT
	select NO_IOPORT
	select ARCH_REQUIRE_GPIOLIB
	select ARCH_REQUIRE_GPIOLIB
	select S3C_GPIO_TRACK
	help
	help
	  Base platform code for any Samsung S3C64XX device
	  Base platform code for any Samsung S3C64XX device