From 9eefe2a2b37a838558e3d213a9f5519503d0c180 Mon Sep 17 00:00:00 2001 From: Stefan Roese Date: Thu, 19 Mar 2009 15:35:05 +0100 Subject: UBIFS: Implement read-only UBIFS support in U-Boot The U-Boot UBIFS implementation is largely a direct copy from the current Linux version (2.6.29-rc6). As already done in the UBI version we have an "abstraction layer" to redefine or remove some OS calls (e.g. mutex_lock() ...). This makes it possible to use the original Linux code with very little changes. And by this we can better update to later Linux versions. I removed some of the Linux features that are not used in the U-Boot version (e.g. garbage-collection, write support). Signed-off-by: Stefan Roese CC: Artem Bityutskiy CC: Adrian Hunter --- include/linux/math64.h | 85 ++++++++++++++++++++++++++++++++++++++++++++++++++ include/ubi_uboot.h | 9 +++++- 2 files changed, 93 insertions(+), 1 deletion(-) create mode 100644 include/linux/math64.h (limited to 'include') diff --git a/include/linux/math64.h b/include/linux/math64.h new file mode 100644 index 0000000..6d760d7 --- /dev/null +++ b/include/linux/math64.h @@ -0,0 +1,85 @@ +#ifndef _LINUX_MATH64_H +#define _LINUX_MATH64_H + +#include + +#if BITS_PER_LONG == 64 + +/** + * div_u64_rem - unsigned 64bit divide with 32bit divisor with remainder + * + * This is commonly provided by 32bit archs to provide an optimized 64bit + * divide. + */ +static inline u64 div_u64_rem(u64 dividend, u32 divisor, u32 *remainder) +{ + *remainder = dividend % divisor; + return dividend / divisor; +} + +/** + * div_s64_rem - signed 64bit divide with 32bit divisor with remainder + */ +static inline s64 div_s64_rem(s64 dividend, s32 divisor, s32 *remainder) +{ + *remainder = dividend % divisor; + return dividend / divisor; +} + +/** + * div64_u64 - unsigned 64bit divide with 64bit divisor + */ +static inline u64 div64_u64(u64 dividend, u64 divisor) +{ + return dividend / divisor; +} + +#elif BITS_PER_LONG == 32 + +#ifndef div_u64_rem +static inline u64 div_u64_rem(u64 dividend, u32 divisor, u32 *remainder) +{ + *remainder = do_div(dividend, divisor); + return dividend; +} +#endif + +#ifndef div_s64_rem +extern s64 div_s64_rem(s64 dividend, s32 divisor, s32 *remainder); +#endif + +#ifndef div64_u64 +extern u64 div64_u64(u64 dividend, u64 divisor); +#endif + +#endif /* BITS_PER_LONG */ + +/** + * div_u64 - unsigned 64bit divide with 32bit divisor + * + * This is the most common 64bit divide and should be used if possible, + * as many 32bit archs can optimize this variant better than a full 64bit + * divide. + */ +#ifndef div_u64 +static inline u64 div_u64(u64 dividend, u32 divisor) +{ + u32 remainder; + return div_u64_rem(dividend, divisor, &remainder); +} +#endif + +/** + * div_s64 - signed 64bit divide with 32bit divisor + */ +#ifndef div_s64 +static inline s64 div_s64(s64 dividend, s32 divisor) +{ + s32 remainder; + return div_s64_rem(dividend, divisor, &remainder); +} +#endif + +u32 iter_div_u64_rem(u64 dividend, u32 divisor, u64 *remainder); + +#endif /* _LINUX_MATH64_H */ diff --git a/include/ubi_uboot.h b/include/ubi_uboot.h index b415219..74312ab 100644 --- a/include/ubi_uboot.h +++ b/include/ubi_uboot.h @@ -18,7 +18,12 @@ #include #include #include +#include +#include +#include +#include #include +#include #ifdef CONFIG_CMD_ONENAND #include @@ -193,7 +198,7 @@ static inline long IS_ERR(const void *ptr) /* module */ #define THIS_MODULE 0 -#define try_module_get(...) 0 +#define try_module_get(...) 1 #define module_put(...) do { } while (0) #define module_init(...) #define module_exit(...) @@ -206,7 +211,9 @@ static inline long IS_ERR(const void *ptr) #define MODULE_AUTHOR(...) #define MODULE_LICENSE(...) +#ifndef __UBIFS_H__ #include "../drivers/mtd/ubi/ubi.h" +#endif /* functions */ extern int ubi_mtd_param_parse(const char *val, struct kernel_param *kp); -- cgit v1.1