sim: bfin: fix clear/set/toggle GPIO handling
authorMike Frysinger <vapier@gentoo.org>
Fri, 25 Mar 2011 00:12:47 +0000 (00:12 +0000)
committerMike Frysinger <vapier@gentoo.org>
Fri, 25 Mar 2011 00:12:47 +0000 (00:12 +0000)
The clear/set/toggle MMRs aren't backed by "real" data; they implicitly
perform bit operations on the associated data register.  So when we go
to process writes to them, we need to adjust the pointer accordingly so
that the actual backing data is modified.

Signed-off-by: Mike Frysinger <vapier@gentoo.org>
sim/bfin/ChangeLog
sim/bfin/dv-bfin_gpio.c

index c5ab9ae6efc7f12ad05092c1033dd3ef2714d2ef..d4a36ca0eb666540d3006135f908440d9fd2f0ae 100644 (file)
@@ -1,3 +1,8 @@
+2011-03-24  Mike Frysinger  <vapier@gentoo.org>
+
+       * dv-bfin_gpio.c (bfin_gpio_io_write_buffer): Subtract 2 from the
+       valuep pointer for clear MMRs, 4 for set MMRs, and 6 for toggle MMRs.
+
 2011-03-23  Mike Frysinger  <vapier@gentoo.org>
 
        * TODO: Document some known SIC issues.
index 50baf03e71ceec57fb5e8af015d1230656ca4af2..6b18a4082c25fd80a7b985e15f2e54598516ce2e 100644 (file)
@@ -92,16 +92,22 @@ bfin_gpio_io_write_buffer (struct hw *me, const void *source, int space,
     case mmr_offset(clear):
     case mmr_offset(maska_clear):
     case mmr_offset(maskb_clear):
+      /* We want to clear the related data MMR.  */
+      valuep -= 2;
       dv_w1c_2 (valuep, value, -1);
       break;
     case mmr_offset(set):
     case mmr_offset(maska_set):
     case mmr_offset(maskb_set):
+      /* We want to set the related data MMR.  */
+      valuep -= 4;
       *valuep |= value;
       break;
     case mmr_offset(toggle):
     case mmr_offset(maska_toggle):
     case mmr_offset(maskb_toggle):
+      /* We want to toggle the related data MMR.  */
+      valuep -= 6;
       *valuep ^= value;
       break;
     default: