gpio: atmel_pio4: give a full configuration when muxing pins
authorLudovic Desroches <ludovic.desroches@microchip.com>
Tue, 24 Apr 2018 07:16:01 +0000 (10:16 +0300)
committerTom Rini <trini@konsulko.com>
Tue, 8 May 2018 13:07:36 +0000 (09:07 -0400)
When a pin is muxed to a peripheral or as a GPIO, the only
configuration that can be set is the pullup. It is too restrictive
so this patch allows to give a full configuration.

Signed-off-by: Ludovic Desroches <ludovic.desroches@microchip.com>
arch/arm/mach-at91/include/mach/atmel_pio4.h
board/atmel/sama5d27_som1_ek/sama5d27_som1_ek.c
board/atmel/sama5d2_ptc_ek/sama5d2_ptc_ek.c
board/atmel/sama5d2_xplained/sama5d2_xplained.c
drivers/gpio/atmel_pio4.c

index b7d6f5a10297771aa6b7885a87e9adab939caa49..7a03d6d3c73e85370e820f923a3936f93555fbdf 100644 (file)
@@ -72,14 +72,14 @@ struct atmel_pio4_port {
 #define AT91_PIO_PORTC         0x2
 #define AT91_PIO_PORTD         0x3
 
-int atmel_pio4_set_gpio(u32 port, u32 pin, u32 use_pullup);
-int atmel_pio4_set_a_periph(u32 port, u32 pin, u32 use_pullup);
-int atmel_pio4_set_b_periph(u32 port, u32 pin, u32 use_pullup);
-int atmel_pio4_set_c_periph(u32 port, u32 pin, u32 use_pullup);
-int atmel_pio4_set_d_periph(u32 port, u32 pin, u32 use_pullup);
-int atmel_pio4_set_e_periph(u32 port, u32 pin, u32 use_pullup);
-int atmel_pio4_set_f_periph(u32 port, u32 pin, u32 use_pullup);
-int atmel_pio4_set_g_periph(u32 port, u32 pin, u32 use_pullup);
+int atmel_pio4_set_gpio(u32 port, u32 pin, u32 config);
+int atmel_pio4_set_a_periph(u32 port, u32 pin, u32 config);
+int atmel_pio4_set_b_periph(u32 port, u32 pin, u32 config);
+int atmel_pio4_set_c_periph(u32 port, u32 pin, u32 config);
+int atmel_pio4_set_d_periph(u32 port, u32 pin, u32 config);
+int atmel_pio4_set_e_periph(u32 port, u32 pin, u32 config);
+int atmel_pio4_set_f_periph(u32 port, u32 pin, u32 config);
+int atmel_pio4_set_g_periph(u32 port, u32 pin, u32 config);
 int atmel_pio4_set_pio_output(u32 port, u32 pin, u32 value);
 int atmel_pio4_get_pio_input(u32 port, u32 pin);
 
index d805068ac97c1e0ddae3c16f25d674fc505343c5..3c9731501558636d765e08a4854561dc745fe025 100644 (file)
@@ -35,7 +35,7 @@ int board_late_init(void)
 #ifdef CONFIG_DEBUG_UART_BOARD_INIT
 static void board_uart1_hw_init(void)
 {
-       atmel_pio4_set_a_periph(AT91_PIO_PORTD, 2, 1);  /* URXD1 */
+       atmel_pio4_set_a_periph(AT91_PIO_PORTD, 2, ATMEL_PIO_PUEN_MASK);        /* URXD1 */
        atmel_pio4_set_a_periph(AT91_PIO_PORTD, 3, 0);  /* UTXD1 */
 
        at91_periph_clk_enable(ATMEL_ID_UART1);
index 5e8e650cd991101ded75c900e18c9eaf29049c7e..206e858b32136cce08af9896429d8a27f0248c4a 100644 (file)
@@ -58,22 +58,22 @@ static void board_nand_hw_init(void)
        atmel_pio4_set_b_periph(AT91_PIO_PORTA, 29, ATMEL_PIO_DRVSTR_ME);       /* D7 */
        atmel_pio4_set_b_periph(AT91_PIO_PORTB, 2, 0);  /* RE */
        atmel_pio4_set_b_periph(AT91_PIO_PORTA, 30, 0); /* WE */
-       atmel_pio4_set_b_periph(AT91_PIO_PORTA, 31, 1); /* NCS */
-       atmel_pio4_set_b_periph(AT91_PIO_PORTC, 8, 1);  /* RDY */
-       atmel_pio4_set_b_periph(AT91_PIO_PORTB, 0, 1);  /* ALE */
-       atmel_pio4_set_b_periph(AT91_PIO_PORTB, 1, 1);  /* CLE */
+       atmel_pio4_set_b_periph(AT91_PIO_PORTA, 31, ATMEL_PIO_PUEN_MASK);       /* NCS */
+       atmel_pio4_set_b_periph(AT91_PIO_PORTC, 8, ATMEL_PIO_PUEN_MASK);        /* RDY */
+       atmel_pio4_set_b_periph(AT91_PIO_PORTB, 0, ATMEL_PIO_PUEN_MASK);        /* ALE */
+       atmel_pio4_set_b_periph(AT91_PIO_PORTB, 1, ATMEL_PIO_PUEN_MASK);        /* CLE */
 }
 #endif
 
 static void board_usb_hw_init(void)
 {
-       atmel_pio4_set_pio_output(AT91_PIO_PORTB, 12, 1);
+       atmel_pio4_set_pio_output(AT91_PIO_PORTB, 12, ATMEL_PIO_PUEN_MASK);
 }
 
 #ifdef CONFIG_DEBUG_UART_BOARD_INIT
 static void board_uart0_hw_init(void)
 {
-       atmel_pio4_set_c_periph(AT91_PIO_PORTB, 26, 1); /* URXD0 */
+       atmel_pio4_set_c_periph(AT91_PIO_PORTB, 26, ATMEL_PIO_PUEN_MASK);       /* URXD0 */
        atmel_pio4_set_c_periph(AT91_PIO_PORTB, 27, 0); /* UTXD0 */
 
        at91_periph_clk_enable(ATMEL_ID_UART0);
index 0ae2e2fec66efe67e468b01f6a707d8e62f5774c..592b4d82dd6b2e4a10d66be0e0d96b4b0d30649d 100644 (file)
@@ -35,7 +35,7 @@ int board_late_init(void)
 #ifdef CONFIG_DEBUG_UART_BOARD_INIT
 static void board_uart1_hw_init(void)
 {
-       atmel_pio4_set_a_periph(AT91_PIO_PORTD, 2, 1);  /* URXD1 */
+       atmel_pio4_set_a_periph(AT91_PIO_PORTD, 2, ATMEL_PIO_PUEN_MASK);        /* URXD1 */
        atmel_pio4_set_a_periph(AT91_PIO_PORTD, 3, 0);  /* UTXD1 */
 
        at91_periph_clk_enable(ATMEL_ID_UART1);
index 2385dec961cefb02dba72a3e178c70f0bf8b0cec..95a189a50f64063857718c1d144ed3c5e14df1f4 100644 (file)
@@ -43,7 +43,7 @@ static struct atmel_pio4_port *atmel_pio4_port_base(u32 port)
 }
 
 static int atmel_pio4_config_io_func(u32 port, u32 pin,
-                                    u32 func, u32 use_pullup)
+                                    u32 func, u32 config)
 {
        struct atmel_pio4_port *port_base;
        u32 reg, mask;
@@ -57,7 +57,7 @@ static int atmel_pio4_config_io_func(u32 port, u32 pin,
 
        mask = 1 << pin;
        reg = func;
-       reg |= use_pullup ? ATMEL_PIO_PUEN_MASK : 0;
+       reg |= config;
 
        writel(mask, &port_base->mskr);
        writel(reg, &port_base->cfgr);
@@ -65,60 +65,60 @@ static int atmel_pio4_config_io_func(u32 port, u32 pin,
        return 0;
 }
 
-int atmel_pio4_set_gpio(u32 port, u32 pin, u32 use_pullup)
+int atmel_pio4_set_gpio(u32 port, u32 pin, u32 config)
 {
        return atmel_pio4_config_io_func(port, pin,
                                         ATMEL_PIO_CFGR_FUNC_GPIO,
-                                        use_pullup);
+                                        config);
 }
 
-int atmel_pio4_set_a_periph(u32 port, u32 pin, u32 use_pullup)
+int atmel_pio4_set_a_periph(u32 port, u32 pin, u32 config)
 {
        return atmel_pio4_config_io_func(port, pin,
                                         ATMEL_PIO_CFGR_FUNC_PERIPH_A,
-                                        use_pullup);
+                                        config);
 }
 
-int atmel_pio4_set_b_periph(u32 port, u32 pin, u32 use_pullup)
+int atmel_pio4_set_b_periph(u32 port, u32 pin, u32 config)
 {
        return atmel_pio4_config_io_func(port, pin,
                                         ATMEL_PIO_CFGR_FUNC_PERIPH_B,
-                                        use_pullup);
+                                        config);
 }
 
-int atmel_pio4_set_c_periph(u32 port, u32 pin, u32 use_pullup)
+int atmel_pio4_set_c_periph(u32 port, u32 pin, u32 config)
 {
        return atmel_pio4_config_io_func(port, pin,
                                         ATMEL_PIO_CFGR_FUNC_PERIPH_C,
-                                        use_pullup);
+                                        config);
 }
 
-int atmel_pio4_set_d_periph(u32 port, u32 pin, u32 use_pullup)
+int atmel_pio4_set_d_periph(u32 port, u32 pin, u32 config)
 {
        return atmel_pio4_config_io_func(port, pin,
                                         ATMEL_PIO_CFGR_FUNC_PERIPH_D,
-                                        use_pullup);
+                                        config);
 }
 
-int atmel_pio4_set_e_periph(u32 port, u32 pin, u32 use_pullup)
+int atmel_pio4_set_e_periph(u32 port, u32 pin, u32 config)
 {
        return atmel_pio4_config_io_func(port, pin,
                                         ATMEL_PIO_CFGR_FUNC_PERIPH_E,
-                                        use_pullup);
+                                        config);
 }
 
-int atmel_pio4_set_f_periph(u32 port, u32 pin, u32 use_pullup)
+int atmel_pio4_set_f_periph(u32 port, u32 pin, u32 config)
 {
        return atmel_pio4_config_io_func(port, pin,
                                         ATMEL_PIO_CFGR_FUNC_PERIPH_F,
-                                        use_pullup);
+                                        config);
 }
 
-int atmel_pio4_set_g_periph(u32 port, u32 pin, u32 use_pullup)
+int atmel_pio4_set_g_periph(u32 port, u32 pin, u32 config)
 {
        return atmel_pio4_config_io_func(port, pin,
                                         ATMEL_PIO_CFGR_FUNC_PERIPH_G,
-                                        use_pullup);
+                                        config);
 }
 
 int atmel_pio4_set_pio_output(u32 port, u32 pin, u32 value)