]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - lib/string.c
pwm: imx: support output polarity inversion
[karo-tx-linux.git] / lib / string.c
index dc4a86341f914f0c26b92977d6f99dcc4df482c2..e5878de4f1013ddbdd3db07d1fca2bcc3a692a7c 100644 (file)
 #include <linux/types.h>
 #include <linux/string.h>
 #include <linux/ctype.h>
-#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/export.h>
+#include <linux/bug.h>
+#include <linux/errno.h>
 
 #ifndef __HAVE_ARCH_STRNICMP
 /**
@@ -785,12 +788,24 @@ void *memchr_inv(const void *start, int c, size_t bytes)
        if (bytes <= 16)
                return check_bytes8(start, value, bytes);
 
-       value64 = value | value << 8 | value << 16 | value << 24;
-       value64 = (value64 & 0xffffffff) | value64 << 32;
-       prefix = 8 - ((unsigned long)start) % 8;
+       value64 = value;
+#if defined(ARCH_HAS_FAST_MULTIPLIER) && BITS_PER_LONG == 64
+       value64 *= 0x0101010101010101;
+#elif defined(ARCH_HAS_FAST_MULTIPLIER)
+       value64 *= 0x01010101;
+       value64 |= value64 << 32;
+#else
+       value64 |= value64 << 8;
+       value64 |= value64 << 16;
+       value64 |= value64 << 32;
+#endif
 
+       prefix = (unsigned long)start % 8;
        if (prefix) {
-               u8 *r = check_bytes8(start, value, prefix);
+               u8 *r;
+
+               prefix = 8 - prefix;
+               r = check_bytes8(start, value, prefix);
                if (r)
                        return r;
                start += prefix;