* [PATCH] at91: add dump mux command
@ 2012-12-26 20:28 Jean-Christophe PLAGNIOL-VILLARD
2013-01-02 10:06 ` Sascha Hauer
0 siblings, 1 reply; 2+ messages in thread
From: Jean-Christophe PLAGNIOL-VILLARD @ 2012-12-26 20:28 UTC (permalink / raw)
To: barebox
This will allow to dump all pin configuration in a nice table
and if the bank/pin is specified the pin details
barebox@Atmel at91sam9x5-ek:/
Pin PIOA PIOB PIOC PIOD
0: [gpio] set [periph A] [gpio] set [periph A]
1: [periph A] [periph A] [gpio] set [periph A]
2: [gpio] set [periph A] [gpio] set [periph A]
3: [gpio] set [periph A] [gpio] set [periph A]
4: [gpio] set [periph A] [gpio] set [gpio] clear
5: [gpio] set [periph A] [gpio] set [gpio] set
6: [gpio] set [periph A] [gpio] set [periph A]
7: [gpio] set [periph A] [gpio] set [periph A]
8: [gpio] set [gpio] set [gpio] set [periph A]
9: [periph A] [periph A] [gpio] set [periph A]
10: [periph A] [periph A] [gpio] set [periph A]
11: [periph A] [gpio] set [gpio] set [periph A]
12: [periph A] [gpio] set [gpio] set [periph A]
13: [periph A] [gpio] clear [gpio] set [periph A]
14: [gpio] set [gpio] clear [gpio] set [gpio] set
15: [periph A] [gpio] set [gpio] set [gpio] set
16: [periph A] [gpio] set [gpio] clear [periph A]
17: [periph A] [gpio] set [gpio] set [periph A]
18: [periph A] [gpio] set [gpio] set [periph A]
19: [periph A] [periph A] [gpio] set [gpio] set
20: [periph A] [periph A] [gpio] clear [gpio] set
21: [gpio] set [periph A] [gpio] clear [gpio] clear
22: [gpio] set [periph A] [gpio] set [periph A]
23: [gpio] set [periph A] [gpio] set [periph A]
24: [gpio] set [periph A] [gpio] set [periph A]
25: [gpio] set [periph A] [gpio] set [periph A]
26: [gpio] set [periph A] [gpio] set [periph A]
27: [gpio] clear [periph A] [gpio] set [periph A]
28: [gpio] set [periph A] [gpio] clear [periph A]
29: [gpio] set [periph A] [gpio] set [periph A]
30: [gpio] set [periph A] [gpio] set [periph A]
31: [gpio] set [periph A] [gpio] set [periph A]
barebox@Atmel at91sam9x5-ek:/
pioA27 configuration
[gpio] clear
multidrive = disable
pullup = disable
degitch = disable
debounce = disable
pulldown = enable
schmitt trigger = enable
Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
---
arch/arm/mach-at91/Kconfig | 4 +
arch/arm/mach-at91/gpio.c | 226 ++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 230 insertions(+)
diff --git a/arch/arm/mach-at91/Kconfig b/arch/arm/mach-at91/Kconfig
index 448044a..58780c7 100644
--- a/arch/arm/mach-at91/Kconfig
+++ b/arch/arm/mach-at91/Kconfig
@@ -510,4 +510,8 @@ config CALAO_MB_QIL_A9260
bool "MB-QIL A9260 Motherboard Board support"
depends on MACH_QIL_A9260
+config CMD_AT91MUX
+ bool "at91mux dump command"
+ default y
+
endif
diff --git a/arch/arm/mach-at91/gpio.c b/arch/arm/mach-at91/gpio.c
index 9e71324..9df5218 100644
--- a/arch/arm/mach-at91/gpio.c
+++ b/arch/arm/mach-at91/gpio.c
@@ -18,6 +18,8 @@
*/
#include <common.h>
+#include <command.h>
+#include <complete.h>
#include <linux/clk.h>
#include <linux/err.h>
#include <errno.h>
@@ -28,6 +30,7 @@
#include <gpio.h>
#include <init.h>
#include <driver.h>
+#include <getopt.h>
#define MAX_GPIO_BANKS 5
#define MAX_NB_GPIO_PER_BANK 32
@@ -77,6 +80,7 @@ static inline unsigned pin_to_mask(unsigned pin)
* periph A and B has changed
* So provide the right call back
* if not present means the IP does not support it
+ * @get_periph: return the periph mode configured
* @mux_A_periph: mux as periph A
* @mux_B_periph: mux as periph B
* @mux_C_periph: mux as periph C
@@ -87,13 +91,18 @@ static inline unsigned pin_to_mask(unsigned pin)
* @disable_schmitt_trig: disable schmitt trigger
*/
struct at91_pinctrl_mux_ops {
+ enum at91_mux (*get_periph)(void __iomem *pio, unsigned mask);
void (*mux_A_periph)(void __iomem *pio, unsigned mask);
void (*mux_B_periph)(void __iomem *pio, unsigned mask);
void (*mux_C_periph)(void __iomem *pio, unsigned mask);
void (*mux_D_periph)(void __iomem *pio, unsigned mask);
+ bool (*get_deglitch)(void __iomem *pio, unsigned pin);
void (*set_deglitch)(void __iomem *pio, unsigned mask, bool in_on);
+ bool (*get_debounce)(void __iomem *pio, unsigned pin, u32 *div);
void (*set_debounce)(void __iomem *pio, unsigned mask, bool in_on, u32 div);
+ bool (*get_pulldown)(void __iomem *pio, unsigned pin);
void (*set_pulldown)(void __iomem *pio, unsigned mask, bool in_on);
+ bool (*get_schmitt_trig)(void __iomem *pio, unsigned pin);
void (*disable_schmitt_trig)(void __iomem *pio, unsigned mask);
};
@@ -185,20 +194,93 @@ static void at91_mux_pio3_disable_schmitt_trig(void __iomem *pio, unsigned mask)
__raw_writel(__raw_readl(pio + PIO_SCHMITT) | mask, pio + PIO_SCHMITT);
}
+#ifdef CONFIG_CMD_AT91MUX
+static unsigned at91_mux_get_pullup(void __iomem *pio, unsigned pin)
+{
+ return (__raw_readl(pio + PIO_PUSR) >> pin) & 0x1;
+}
+
+static unsigned at91_mux_get_multidrive(void __iomem *pio, unsigned pin)
+{
+ return (__raw_readl(pio + PIO_MDSR) >> pin) & 0x1;
+}
+
+static enum at91_mux at91_mux_pio3_get_periph(void __iomem *pio, unsigned mask)
+{
+ unsigned select;
+
+ if (__raw_readl(pio + PIO_PSR) & mask)
+ return AT91_MUX_GPIO;
+
+ select = !!(__raw_readl(pio + PIO_ABCDSR1) & mask);
+ select |= (!!(__raw_readl(pio + PIO_ABCDSR2) & mask) << 1);
+
+ return select + 1;
+}
+
+static enum at91_mux at91_mux_get_periph(void __iomem *pio, unsigned mask)
+{
+ unsigned select;
+
+ if (__raw_readl(pio + PIO_PSR) & mask)
+ return AT91_MUX_GPIO;
+
+ select = __raw_readl(pio + PIO_ABSR) & mask;
+
+ return select + 1;
+}
+
+static bool at91_mux_get_deglitch(void __iomem *pio, unsigned pin)
+{
+ return (__raw_readl(pio + PIO_IFSR) >> pin) & 0x1;
+}
+
+static bool at91_mux_pio3_get_debounce(void __iomem *pio, unsigned pin, u32 *div)
+{
+ *div = __raw_readl(pio + PIO_SCDR);
+
+ return (__raw_readl(pio + PIO_IFSCSR) >> pin) & 0x1;
+}
+
+static bool at91_mux_pio3_get_pulldown(void __iomem *pio, unsigned pin)
+{
+ return (__raw_readl(pio + PIO_PPDSR) >> pin) & 0x1;
+}
+
+static bool at91_mux_pio3_get_schmitt_trig(void __iomem *pio, unsigned pin)
+{
+ return (__raw_readl(pio + PIO_SCHMITT) >> pin) & 0x1;
+}
+#else
+#define at91_mux_get_periph NULL
+#define at91_mux_pio3_get_periph NULL
+#define at91_mux_get_deglitch NULL
+#define at91_mux_pio3_get_debounce NULL
+#define at91_mux_pio3_get_pulldown NULL
+#define at91_mux_pio3_get_schmitt_trig NULL
+#endif
+
static struct at91_pinctrl_mux_ops at91rm9200_ops = {
+ .get_periph = at91_mux_get_periph,
.mux_A_periph = at91_mux_set_A_periph,
.mux_B_periph = at91_mux_set_B_periph,
+ .get_deglitch = at91_mux_get_deglitch,
.set_deglitch = at91_mux_set_deglitch,
};
static struct at91_pinctrl_mux_ops at91sam9x5_ops = {
+ .get_periph = at91_mux_pio3_get_periph,
.mux_A_periph = at91_mux_pio3_set_A_periph,
.mux_B_periph = at91_mux_pio3_set_B_periph,
.mux_C_periph = at91_mux_pio3_set_C_periph,
.mux_D_periph = at91_mux_pio3_set_D_periph,
+ .get_deglitch = at91_mux_get_deglitch,
.set_deglitch = at91_mux_pio3_set_deglitch,
+ .get_debounce = at91_mux_pio3_get_debounce,
.set_debounce = at91_mux_pio3_set_debounce,
+ .get_pulldown = at91_mux_pio3_get_pulldown,
.set_pulldown = at91_mux_pio3_set_pulldown,
+ .get_schmitt_trig = at91_mux_pio3_get_schmitt_trig,
.disable_schmitt_trig = at91_mux_pio3_disable_schmitt_trig,
};
@@ -410,6 +492,150 @@ int at91_disable_schmitt_trig(unsigned pin)
}
EXPORT_SYMBOL(at91_disable_schmitt_trig);
+#ifdef CONFIG_CMD_AT91MUX
+static void at91mux_printf_mode(unsigned bank, unsigned pin)
+{
+ struct at91_gpio_chip *at91_gpio = &gpio_chip[bank];
+ void __iomem *pio = at91_gpio->regbase;
+ enum at91_mux mode;
+ u32 pdsr;
+
+ unsigned mask = pin_to_mask(pin);
+
+ mode = at91_gpio->ops->get_periph(pio, mask);
+
+ if (mode == AT91_MUX_GPIO) {
+ pdsr = __raw_readl(pio + PIO_PDSR);
+
+ printf("[gpio] %s", pdsr & mask ? "set" : "clear");
+ } else {
+ printf("[periph %c]", mode + 'A' - 1);
+ }
+}
+
+static void at91mux_dump_config(void)
+{
+ int bank, j;
+
+ /* print heading */
+ printf("Pin\t");
+ for (bank = 0; bank < gpio_banks; bank++) {
+ printf("PIO%c\t\t", 'A' + bank);
+ };
+ printf("\n\n");
+
+ /* print pin status */
+ for (j = 0; j < 32; j++) {
+ printf("%i:\t", j);
+
+ for (bank = 0; bank < gpio_banks; bank++) {
+ at91mux_printf_mode(bank, j);
+
+ printf("\t");
+ }
+
+ printf("\n");
+ }
+}
+
+static void at91mux_print_en_disable(const char *str, bool is_on)
+{
+ printf("%s = ", str);
+
+ if (is_on)
+ printf("enable\n");
+ else
+ printf("disable\n");
+}
+
+static void at91mux_dump_pio_config(unsigned bank, unsigned pin)
+{
+ struct at91_gpio_chip *at91_gpio = &gpio_chip[bank];
+ void __iomem *pio = at91_gpio->regbase;
+ u32 div;
+
+ printf("pio%c%d configuration\n\n", bank + 'A', pin);
+
+ at91mux_printf_mode(bank, pin);
+ printf("\n");
+
+ at91mux_print_en_disable("multidrive",
+ at91_mux_get_multidrive(pio, pin));
+
+ at91mux_print_en_disable("pullup",
+ at91_mux_get_pullup(pio, pin));
+
+ if (at91_gpio->ops->get_deglitch)
+ at91mux_print_en_disable("degitch",
+ at91_gpio->ops->get_deglitch(pio, pin));
+
+ if (at91_gpio->ops->get_debounce) {
+ printf("debounce = ");
+ if (at91_gpio->ops->get_debounce(pio, pin, &div))
+ printf("enable at %d\n", div);
+ else
+ printf("disable\n");
+ }
+
+ if (at91_gpio->ops->get_pulldown)
+ at91mux_print_en_disable("pulldown",
+ at91_gpio->ops->get_pulldown(pio, pin));
+
+ if (at91_gpio->ops->get_schmitt_trig)
+ at91mux_print_en_disable("schmitt trigger",
+ !at91_gpio->ops->get_schmitt_trig(pio, pin));
+}
+
+static int do_at91mux(int argc, char *argv[])
+{
+ int opt;
+ unsigned bank = 0;
+ unsigned pin = 0;
+
+ if (argc < 2) {
+ at91mux_dump_config();
+ return 0;
+ }
+
+ while ((opt = getopt(argc, argv, "b:p:")) > 0) {
+ switch (opt) {
+ case 'b':
+ bank = simple_strtoul(optarg, NULL, 10);
+ break;
+ case 'p':
+ pin = simple_strtoul(optarg, NULL, 10);
+ break;
+ }
+ }
+
+ if (bank >= gpio_banks) {
+ printf("bank %c >= supported %c banks\n", bank + 'A',
+ gpio_banks + 'A');
+ return 1;
+ }
+
+ if (pin >= 32) {
+ printf("pin %d >= supported %d pins\n", pin, 32);
+ return 1;
+ }
+
+ at91mux_dump_pio_config(bank, pin);
+
+ return 0;
+}
+
+BAREBOX_CMD_HELP_START(at91mux)
+BAREBOX_CMD_HELP_USAGE("at91mux [-p <pin> -b <bank>]\n")
+BAREBOX_CMD_HELP_SHORT("dump current mux configuration if bank/pin specified dump pin details\n");
+BAREBOX_CMD_HELP_END
+
+BAREBOX_CMD_START(at91mux)
+ .cmd = do_at91mux,
+ .usage = "dump current mux configuration",
+ BAREBOX_CMD_HELP(cmd_at91mux_help)
+ BAREBOX_CMD_COMPLETE(empty_complete)
+BAREBOX_CMD_END
+#endif
/*--------------------------------------------------------------------------*/
static int at91_gpio_get(struct gpio_chip *chip, unsigned offset)
--
1.7.10.4
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [PATCH] at91: add dump mux command
2012-12-26 20:28 [PATCH] at91: add dump mux command Jean-Christophe PLAGNIOL-VILLARD
@ 2013-01-02 10:06 ` Sascha Hauer
0 siblings, 0 replies; 2+ messages in thread
From: Sascha Hauer @ 2013-01-02 10:06 UTC (permalink / raw)
To: Jean-Christophe PLAGNIOL-VILLARD; +Cc: barebox
On Wed, Dec 26, 2012 at 09:28:48PM +0100, Jean-Christophe PLAGNIOL-VILLARD wrote:
> This will allow to dump all pin configuration in a nice table
> and if the bank/pin is specified the pin details
Applied, thanks
Sascha
>
> barebox@Atmel at91sam9x5-ek:/
> Pin PIOA PIOB PIOC PIOD
>
> 0: [gpio] set [periph A] [gpio] set [periph A]
> 1: [periph A] [periph A] [gpio] set [periph A]
> 2: [gpio] set [periph A] [gpio] set [periph A]
> 3: [gpio] set [periph A] [gpio] set [periph A]
> 4: [gpio] set [periph A] [gpio] set [gpio] clear
> 5: [gpio] set [periph A] [gpio] set [gpio] set
> 6: [gpio] set [periph A] [gpio] set [periph A]
> 7: [gpio] set [periph A] [gpio] set [periph A]
> 8: [gpio] set [gpio] set [gpio] set [periph A]
> 9: [periph A] [periph A] [gpio] set [periph A]
> 10: [periph A] [periph A] [gpio] set [periph A]
> 11: [periph A] [gpio] set [gpio] set [periph A]
> 12: [periph A] [gpio] set [gpio] set [periph A]
> 13: [periph A] [gpio] clear [gpio] set [periph A]
> 14: [gpio] set [gpio] clear [gpio] set [gpio] set
> 15: [periph A] [gpio] set [gpio] set [gpio] set
> 16: [periph A] [gpio] set [gpio] clear [periph A]
> 17: [periph A] [gpio] set [gpio] set [periph A]
> 18: [periph A] [gpio] set [gpio] set [periph A]
> 19: [periph A] [periph A] [gpio] set [gpio] set
> 20: [periph A] [periph A] [gpio] clear [gpio] set
> 21: [gpio] set [periph A] [gpio] clear [gpio] clear
> 22: [gpio] set [periph A] [gpio] set [periph A]
> 23: [gpio] set [periph A] [gpio] set [periph A]
> 24: [gpio] set [periph A] [gpio] set [periph A]
> 25: [gpio] set [periph A] [gpio] set [periph A]
> 26: [gpio] set [periph A] [gpio] set [periph A]
> 27: [gpio] clear [periph A] [gpio] set [periph A]
> 28: [gpio] set [periph A] [gpio] clear [periph A]
> 29: [gpio] set [periph A] [gpio] set [periph A]
> 30: [gpio] set [periph A] [gpio] set [periph A]
> 31: [gpio] set [periph A] [gpio] set [periph A]
> barebox@Atmel at91sam9x5-ek:/
> pioA27 configuration
>
> [gpio] clear
> multidrive = disable
> pullup = disable
> degitch = disable
> debounce = disable
> pulldown = enable
> schmitt trigger = enable
>
> Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
> ---
> arch/arm/mach-at91/Kconfig | 4 +
> arch/arm/mach-at91/gpio.c | 226 ++++++++++++++++++++++++++++++++++++++++++++
> 2 files changed, 230 insertions(+)
>
> diff --git a/arch/arm/mach-at91/Kconfig b/arch/arm/mach-at91/Kconfig
> index 448044a..58780c7 100644
> --- a/arch/arm/mach-at91/Kconfig
> +++ b/arch/arm/mach-at91/Kconfig
> @@ -510,4 +510,8 @@ config CALAO_MB_QIL_A9260
> bool "MB-QIL A9260 Motherboard Board support"
> depends on MACH_QIL_A9260
>
> +config CMD_AT91MUX
> + bool "at91mux dump command"
> + default y
> +
> endif
> diff --git a/arch/arm/mach-at91/gpio.c b/arch/arm/mach-at91/gpio.c
> index 9e71324..9df5218 100644
> --- a/arch/arm/mach-at91/gpio.c
> +++ b/arch/arm/mach-at91/gpio.c
> @@ -18,6 +18,8 @@
> */
>
> #include <common.h>
> +#include <command.h>
> +#include <complete.h>
> #include <linux/clk.h>
> #include <linux/err.h>
> #include <errno.h>
> @@ -28,6 +30,7 @@
> #include <gpio.h>
> #include <init.h>
> #include <driver.h>
> +#include <getopt.h>
>
> #define MAX_GPIO_BANKS 5
> #define MAX_NB_GPIO_PER_BANK 32
> @@ -77,6 +80,7 @@ static inline unsigned pin_to_mask(unsigned pin)
> * periph A and B has changed
> * So provide the right call back
> * if not present means the IP does not support it
> + * @get_periph: return the periph mode configured
> * @mux_A_periph: mux as periph A
> * @mux_B_periph: mux as periph B
> * @mux_C_periph: mux as periph C
> @@ -87,13 +91,18 @@ static inline unsigned pin_to_mask(unsigned pin)
> * @disable_schmitt_trig: disable schmitt trigger
> */
> struct at91_pinctrl_mux_ops {
> + enum at91_mux (*get_periph)(void __iomem *pio, unsigned mask);
> void (*mux_A_periph)(void __iomem *pio, unsigned mask);
> void (*mux_B_periph)(void __iomem *pio, unsigned mask);
> void (*mux_C_periph)(void __iomem *pio, unsigned mask);
> void (*mux_D_periph)(void __iomem *pio, unsigned mask);
> + bool (*get_deglitch)(void __iomem *pio, unsigned pin);
> void (*set_deglitch)(void __iomem *pio, unsigned mask, bool in_on);
> + bool (*get_debounce)(void __iomem *pio, unsigned pin, u32 *div);
> void (*set_debounce)(void __iomem *pio, unsigned mask, bool in_on, u32 div);
> + bool (*get_pulldown)(void __iomem *pio, unsigned pin);
> void (*set_pulldown)(void __iomem *pio, unsigned mask, bool in_on);
> + bool (*get_schmitt_trig)(void __iomem *pio, unsigned pin);
> void (*disable_schmitt_trig)(void __iomem *pio, unsigned mask);
> };
>
> @@ -185,20 +194,93 @@ static void at91_mux_pio3_disable_schmitt_trig(void __iomem *pio, unsigned mask)
> __raw_writel(__raw_readl(pio + PIO_SCHMITT) | mask, pio + PIO_SCHMITT);
> }
>
> +#ifdef CONFIG_CMD_AT91MUX
> +static unsigned at91_mux_get_pullup(void __iomem *pio, unsigned pin)
> +{
> + return (__raw_readl(pio + PIO_PUSR) >> pin) & 0x1;
> +}
> +
> +static unsigned at91_mux_get_multidrive(void __iomem *pio, unsigned pin)
> +{
> + return (__raw_readl(pio + PIO_MDSR) >> pin) & 0x1;
> +}
> +
> +static enum at91_mux at91_mux_pio3_get_periph(void __iomem *pio, unsigned mask)
> +{
> + unsigned select;
> +
> + if (__raw_readl(pio + PIO_PSR) & mask)
> + return AT91_MUX_GPIO;
> +
> + select = !!(__raw_readl(pio + PIO_ABCDSR1) & mask);
> + select |= (!!(__raw_readl(pio + PIO_ABCDSR2) & mask) << 1);
> +
> + return select + 1;
> +}
> +
> +static enum at91_mux at91_mux_get_periph(void __iomem *pio, unsigned mask)
> +{
> + unsigned select;
> +
> + if (__raw_readl(pio + PIO_PSR) & mask)
> + return AT91_MUX_GPIO;
> +
> + select = __raw_readl(pio + PIO_ABSR) & mask;
> +
> + return select + 1;
> +}
> +
> +static bool at91_mux_get_deglitch(void __iomem *pio, unsigned pin)
> +{
> + return (__raw_readl(pio + PIO_IFSR) >> pin) & 0x1;
> +}
> +
> +static bool at91_mux_pio3_get_debounce(void __iomem *pio, unsigned pin, u32 *div)
> +{
> + *div = __raw_readl(pio + PIO_SCDR);
> +
> + return (__raw_readl(pio + PIO_IFSCSR) >> pin) & 0x1;
> +}
> +
> +static bool at91_mux_pio3_get_pulldown(void __iomem *pio, unsigned pin)
> +{
> + return (__raw_readl(pio + PIO_PPDSR) >> pin) & 0x1;
> +}
> +
> +static bool at91_mux_pio3_get_schmitt_trig(void __iomem *pio, unsigned pin)
> +{
> + return (__raw_readl(pio + PIO_SCHMITT) >> pin) & 0x1;
> +}
> +#else
> +#define at91_mux_get_periph NULL
> +#define at91_mux_pio3_get_periph NULL
> +#define at91_mux_get_deglitch NULL
> +#define at91_mux_pio3_get_debounce NULL
> +#define at91_mux_pio3_get_pulldown NULL
> +#define at91_mux_pio3_get_schmitt_trig NULL
> +#endif
> +
> static struct at91_pinctrl_mux_ops at91rm9200_ops = {
> + .get_periph = at91_mux_get_periph,
> .mux_A_periph = at91_mux_set_A_periph,
> .mux_B_periph = at91_mux_set_B_periph,
> + .get_deglitch = at91_mux_get_deglitch,
> .set_deglitch = at91_mux_set_deglitch,
> };
>
> static struct at91_pinctrl_mux_ops at91sam9x5_ops = {
> + .get_periph = at91_mux_pio3_get_periph,
> .mux_A_periph = at91_mux_pio3_set_A_periph,
> .mux_B_periph = at91_mux_pio3_set_B_periph,
> .mux_C_periph = at91_mux_pio3_set_C_periph,
> .mux_D_periph = at91_mux_pio3_set_D_periph,
> + .get_deglitch = at91_mux_get_deglitch,
> .set_deglitch = at91_mux_pio3_set_deglitch,
> + .get_debounce = at91_mux_pio3_get_debounce,
> .set_debounce = at91_mux_pio3_set_debounce,
> + .get_pulldown = at91_mux_pio3_get_pulldown,
> .set_pulldown = at91_mux_pio3_set_pulldown,
> + .get_schmitt_trig = at91_mux_pio3_get_schmitt_trig,
> .disable_schmitt_trig = at91_mux_pio3_disable_schmitt_trig,
> };
>
> @@ -410,6 +492,150 @@ int at91_disable_schmitt_trig(unsigned pin)
> }
> EXPORT_SYMBOL(at91_disable_schmitt_trig);
>
> +#ifdef CONFIG_CMD_AT91MUX
> +static void at91mux_printf_mode(unsigned bank, unsigned pin)
> +{
> + struct at91_gpio_chip *at91_gpio = &gpio_chip[bank];
> + void __iomem *pio = at91_gpio->regbase;
> + enum at91_mux mode;
> + u32 pdsr;
> +
> + unsigned mask = pin_to_mask(pin);
> +
> + mode = at91_gpio->ops->get_periph(pio, mask);
> +
> + if (mode == AT91_MUX_GPIO) {
> + pdsr = __raw_readl(pio + PIO_PDSR);
> +
> + printf("[gpio] %s", pdsr & mask ? "set" : "clear");
> + } else {
> + printf("[periph %c]", mode + 'A' - 1);
> + }
> +}
> +
> +static void at91mux_dump_config(void)
> +{
> + int bank, j;
> +
> + /* print heading */
> + printf("Pin\t");
> + for (bank = 0; bank < gpio_banks; bank++) {
> + printf("PIO%c\t\t", 'A' + bank);
> + };
> + printf("\n\n");
> +
> + /* print pin status */
> + for (j = 0; j < 32; j++) {
> + printf("%i:\t", j);
> +
> + for (bank = 0; bank < gpio_banks; bank++) {
> + at91mux_printf_mode(bank, j);
> +
> + printf("\t");
> + }
> +
> + printf("\n");
> + }
> +}
> +
> +static void at91mux_print_en_disable(const char *str, bool is_on)
> +{
> + printf("%s = ", str);
> +
> + if (is_on)
> + printf("enable\n");
> + else
> + printf("disable\n");
> +}
> +
> +static void at91mux_dump_pio_config(unsigned bank, unsigned pin)
> +{
> + struct at91_gpio_chip *at91_gpio = &gpio_chip[bank];
> + void __iomem *pio = at91_gpio->regbase;
> + u32 div;
> +
> + printf("pio%c%d configuration\n\n", bank + 'A', pin);
> +
> + at91mux_printf_mode(bank, pin);
> + printf("\n");
> +
> + at91mux_print_en_disable("multidrive",
> + at91_mux_get_multidrive(pio, pin));
> +
> + at91mux_print_en_disable("pullup",
> + at91_mux_get_pullup(pio, pin));
> +
> + if (at91_gpio->ops->get_deglitch)
> + at91mux_print_en_disable("degitch",
> + at91_gpio->ops->get_deglitch(pio, pin));
> +
> + if (at91_gpio->ops->get_debounce) {
> + printf("debounce = ");
> + if (at91_gpio->ops->get_debounce(pio, pin, &div))
> + printf("enable at %d\n", div);
> + else
> + printf("disable\n");
> + }
> +
> + if (at91_gpio->ops->get_pulldown)
> + at91mux_print_en_disable("pulldown",
> + at91_gpio->ops->get_pulldown(pio, pin));
> +
> + if (at91_gpio->ops->get_schmitt_trig)
> + at91mux_print_en_disable("schmitt trigger",
> + !at91_gpio->ops->get_schmitt_trig(pio, pin));
> +}
> +
> +static int do_at91mux(int argc, char *argv[])
> +{
> + int opt;
> + unsigned bank = 0;
> + unsigned pin = 0;
> +
> + if (argc < 2) {
> + at91mux_dump_config();
> + return 0;
> + }
> +
> + while ((opt = getopt(argc, argv, "b:p:")) > 0) {
> + switch (opt) {
> + case 'b':
> + bank = simple_strtoul(optarg, NULL, 10);
> + break;
> + case 'p':
> + pin = simple_strtoul(optarg, NULL, 10);
> + break;
> + }
> + }
> +
> + if (bank >= gpio_banks) {
> + printf("bank %c >= supported %c banks\n", bank + 'A',
> + gpio_banks + 'A');
> + return 1;
> + }
> +
> + if (pin >= 32) {
> + printf("pin %d >= supported %d pins\n", pin, 32);
> + return 1;
> + }
> +
> + at91mux_dump_pio_config(bank, pin);
> +
> + return 0;
> +}
> +
> +BAREBOX_CMD_HELP_START(at91mux)
> +BAREBOX_CMD_HELP_USAGE("at91mux [-p <pin> -b <bank>]\n")
> +BAREBOX_CMD_HELP_SHORT("dump current mux configuration if bank/pin specified dump pin details\n");
> +BAREBOX_CMD_HELP_END
> +
> +BAREBOX_CMD_START(at91mux)
> + .cmd = do_at91mux,
> + .usage = "dump current mux configuration",
> + BAREBOX_CMD_HELP(cmd_at91mux_help)
> + BAREBOX_CMD_COMPLETE(empty_complete)
> +BAREBOX_CMD_END
> +#endif
> /*--------------------------------------------------------------------------*/
>
> static int at91_gpio_get(struct gpio_chip *chip, unsigned offset)
> --
> 1.7.10.4
>
>
> _______________________________________________
> barebox mailing list
> barebox@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/barebox
>
--
Pengutronix e.K. | |
Industrial Linux Solutions | http://www.pengutronix.de/ |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2013-01-02 10:06 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-12-26 20:28 [PATCH] at91: add dump mux command Jean-Christophe PLAGNIOL-VILLARD
2013-01-02 10:06 ` Sascha Hauer
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox