Hi,

No replies on the list, and not merged; any comments on these three 
patches from Don?

- Chris.

Date: Sun, 29 Nov 2009 19:28:12 -0800
From: don.mul...@gmail.com

Unify duplicated implementations of UNSTUFF_BITS() into a shared .h file.
Recode UNSTUFF_BITS() as an invocation of a new more general macro
UNSTUFF_BITS_ARRAY() that works on arrays of any multiple of 32 bits.

Signed-off-by: don.mul...@gmail.com
---
 drivers/mmc/core/core.h |   21 +++++++++++++++++++++
 drivers/mmc/core/mmc.c  |   14 --------------
 drivers/mmc/core/sd.c   |   14 --------------
 3 files changed, 21 insertions(+), 28 deletions(-)

Index: linux-2.6/drivers/mmc/core/sd.c
===================================================================
--- linux-2.6.orig/drivers/mmc/core/sd.c        2009-11-02 13:02:23.000000000 
-0800
+++ linux-2.6/drivers/mmc/core/sd.c     2009-11-02 15:10:28.000000000 -0800
@@ -41,20 +41,6 @@ static const unsigned int tacc_mant[] = 
        35,     40,     45,     50,     55,     60,     70,     80,
 };
 
-#define UNSTUFF_BITS(resp,start,size)                                  \
-       ({                                                              \
-               const int __size = size;                                \
-               const u32 __mask = (__size < 32 ? 1 << __size : 0) - 1; \
-               const int __off = 3 - ((start) / 32);                   \
-               const int __shft = (start) & 31;                        \
-               u32 __res;                                              \
-                                                                       \
-               __res = resp[__off] >> __shft;                          \
-               if (__size + __shft > 32)                               \
-                       __res |= resp[__off-1] << ((32 - __shft) % 32); \
-               __res & __mask;                                         \
-       })
-
 /*
  * Given the decoded CSD structure, decode the raw CID to our CID structure.
  */
Index: linux-2.6/drivers/mmc/core/core.h
===================================================================
--- linux-2.6.orig/drivers/mmc/core/core.h      2009-11-02 13:02:23.000000000 
-0800
+++ linux-2.6/drivers/mmc/core/core.h   2009-11-02 15:12:01.000000000 -0800
@@ -13,6 +13,27 @@
 
 #include <linux/delay.h>
 
+#define UNSTUFF_BITS_ARRAY(u32_array, start, size)                     \
+       ({                                                              \
+               const int __size = size;                                \
+               const u32 __mask = (__size < 32 ? 1 << __size : 0) - 1; \
+               const int __off = (sizeof(u32_array)/4-1) - ((start) / 32); \
+               const int __shft = (start) & 31;                        \
+               u32 __res;                                              \
+                                                                       \
+               __res = (u32_array)[__off] >> __shft;                   \
+               if (__size + __shft > 32)                               \
+                       __res |= (u32_array)[__off-1]                   \
+                               << ((32 - __shft) % 32);                \
+               __res & __mask;                                         \
+       })
+
+/*
+ * Specific to 128-bit arrays, e.g. raw_cid[] and raw_csd[].
+ */
+#define UNSTUFF_BITS(resp, start, size)        \
+       UNSTUFF_BITS_ARRAY(*(u32(*)[4])resp, start, size)
+
 #define MMC_CMD_RETRIES        3
 
 struct mmc_bus_ops {
Index: linux-2.6/drivers/mmc/core/mmc.c
===================================================================
--- linux-2.6.orig/drivers/mmc/core/mmc.c       2009-11-02 13:02:23.000000000 
-0800
+++ linux-2.6/drivers/mmc/core/mmc.c    2009-11-02 13:02:23.000000000 -0800
@@ -39,20 +39,6 @@ static const unsigned int tacc_mant[] = 
        35,     40,     45,     50,     55,     60,     70,     80,
 };
 
-#define UNSTUFF_BITS(resp,start,size)                                  \
-       ({                                                              \
-               const int __size = size;                                \
-               const u32 __mask = (__size < 32 ? 1 << __size : 0) - 1; \
-               const int __off = 3 - ((start) / 32);                   \
-               const int __shft = (start) & 31;                        \
-               u32 __res;                                              \
-                                                                       \
-               __res = resp[__off] >> __shft;                          \
-               if (__size + __shft > 32)                               \
-                       __res |= resp[__off-1] << ((32 - __shft) % 32); \
-               __res & __mask;                                         \
-       })
-
 /*
  * Given the decoded CSD structure, decode the raw CID to our CID structure.
  */
--

-- 
Chris Ball   <c...@laptop.org>   <http://printf.net/>
One Laptop Per Child
--
To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to