gdsys: mpc8308: Use shadow register for output GPIO values
authorMario Six <mario.six@gdsys.cc>
Fri, 29 Mar 2019 09:18:07 +0000 (10:18 +0100)
committerMario Six <mario.six@gdsys.cc>
Tue, 21 May 2019 06:03:38 +0000 (08:03 +0200)
Since the gpio output status on MPC8xxx cannot be read back, it has to
be buffered locally.

Signed-off-by: Dirk Eibach <dirk.eibach@gdsys.cc>
Signed-off-by: Mario Six <mario.six@gdsys.cc>
board/gdsys/mpc8308/hrcon.c
board/gdsys/mpc8308/mpc8308.c
board/gdsys/mpc8308/mpc8308.h
board/gdsys/mpc8308/strider.c

index 79e3b25de8ccde7d4264acac605d652ce44d88ca..d14a28ec94d0f6fa1960fb182c71cbbf06c05d4e 100644 (file)
@@ -287,8 +287,8 @@ void mpc8308_setup_hw(void)
        /*
         * set "startup-finished"-gpios
         */
-       setbits_be32(&immr->gpio[0].dir, (BIT(31 - 11) | BIT(31 - 12)));
-       setbits_be32(&immr->gpio[0].dat, BIT(31 - 12));
+       setbits_be32(&immr->gpio[0].dir, BIT(31 - 11) | BIT(31 - 12));
+       setbits_gpio0_out(BIT(31 - 12));
 }
 
 int mpc8308_get_fpga_done(uint fpga)
index 9fe1d66c60566b3971667d3dc64ce89909778060..a53135b8fd0eb6b0fbb857c119f190d8abc94d5f 100644 (file)
 
 DECLARE_GLOBAL_DATA_PTR;
 
+/* as gpio output status cannot be read back, we have to buffer it locally */
+u32 gpio0_out;
+
+void setbits_gpio0_out(u32 mask)
+{
+       immap_t *immr = (immap_t *)CONFIG_SYS_IMMR;
+
+       gpio0_out |= mask;
+       out_be32(&immr->gpio[0].dat, gpio0_out);
+}
+
+void clrbits_gpio0_out(u32 mask)
+{
+       immap_t *immr = (immap_t *)CONFIG_SYS_IMMR;
+
+       gpio0_out &= ~mask;
+       out_be32(&immr->gpio[0].dat, gpio0_out);
+}
+
 int get_fpga_state(uint dev)
 {
        return gd->arch.fpga_state[dev];
index dc07d564eb5861225676ddd29d4da4e8d6e6fbed..1e4f24fb2ae8fa35d2df3949ff71e3fb17ef3152 100644 (file)
@@ -1,6 +1,9 @@
 #ifndef __MPC8308_H_
 #define __MPC8308_H_
 
+void setbits_gpio0_out(u32 mask);
+void clrbits_gpio0_out(u32 mask);
+
 /* functions to be provided by board implementation */
 void mpc8308_init(void);
 void mpc8308_set_fpga_reset(unsigned state);
index b1997f453ae3013e1d49a48988abad0512622057..1fdea675bdadb8570e04020a58209a09ca2b5632 100644 (file)
@@ -343,7 +343,7 @@ void mpc8308_setup_hw(void)
         * set "startup-finished"-gpios
         */
        setbits_be32(&immr->gpio[0].dir, BIT(31 - 11) | BIT(31 - 12));
-       setbits_be32(&immr->gpio[0].dat, BIT(31 - 12));
+       setbits_gpio0_out(BIT(31 - 12));
 }
 
 int mpc8308_get_fpga_done(uint fpga)