Simplify OCOTP field packing/unpacking with macros from <linux/bitfield.h>. Cc: Vivien Didelot <vivien.didelot@xxxxxxxxxxxxxxxxxxxx> Tested-by: Vivien Didelot <vivien.didelot@xxxxxxxxxxxxxxxxxxxx> Signed-off-by: Andrey Smirnov <andrew.smirnov@xxxxxxxxx> --- arch/arm/mach-imx/include/mach/ocotp.h | 18 +++++++++--------- arch/arm/mach-imx/ocotp.c | 8 ++++---- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/arch/arm/mach-imx/include/mach/ocotp.h b/arch/arm/mach-imx/include/mach/ocotp.h index b53000b16..76a6da53d 100644 --- a/arch/arm/mach-imx/include/mach/ocotp.h +++ b/arch/arm/mach-imx/include/mach/ocotp.h @@ -1,6 +1,8 @@ #ifndef __MACH_IMX_OCOTP_H #define __MACH_IMX_OCOTP_H +#include <linux/bitfield.h> + #define OCOTP_SHADOW_OFFSET 0x400 #define OCOTP_SHADOW_SPACING 0x10 @@ -14,17 +16,15 @@ #define OCOTP_OFFSET_TO_INDEX(o) \ (((o) - OCOTP_SHADOW_OFFSET) / OCOTP_SHADOW_SPACING) -#define OCOTP_WORD_MASK_WIDTH 8 -#define OCOTP_WORD_MASK_SHIFT 0 -#define OCOTP_WORD(n) (OCOTP_OFFSET_TO_INDEX(n) & ((1 << OCOTP_WORD_MASK_WIDTH) - 1)) +#define OCOTP_WORD_MASK GENMASK( 7, 0) +#define OCOTP_BIT_MASK GENMASK(12, 8) +#define OCOTP_WIDTH_MASK GENMASK(17, 13) -#define OCOTP_BIT_MASK_WIDTH 5 -#define OCOTP_BIT_MASK_SHIFT (OCOTP_WORD_MASK_SHIFT + OCOTP_WORD_MASK_WIDTH) -#define OCOTP_BIT(n) (((n) & ((1 << OCOTP_BIT_MASK_WIDTH) - 1)) << OCOTP_BIT_MASK_SHIFT) +#define OCOTP_WORD(n) FIELD_PREP(OCOTP_WORD_MASK, \ + OCOTP_OFFSET_TO_INDEX(n)) +#define OCOTP_BIT(n) FIELD_PREP(OCOTP_BIT_MASK, n) +#define OCOTP_WIDTH(n) FIELD_PREP(OCOTP_WIDTH_MASK, (n) - 1) -#define OCOTP_WIDTH_MASK_WIDTH 5 -#define OCOTP_WIDTH_MASK_SHIFT (OCOTP_BIT_MASK_SHIFT + OCOTP_BIT_MASK_WIDTH) -#define OCOTP_WIDTH(n) ((((n) - 1) & ((1 << OCOTP_WIDTH_MASK_WIDTH) - 1)) << OCOTP_WIDTH_MASK_SHIFT) int imx_ocotp_read_field(uint32_t field, unsigned *value); int imx_ocotp_write_field(uint32_t field, unsigned value); diff --git a/arch/arm/mach-imx/ocotp.c b/arch/arm/mach-imx/ocotp.c index a70adee37..026d23cad 100644 --- a/arch/arm/mach-imx/ocotp.c +++ b/arch/arm/mach-imx/ocotp.c @@ -314,10 +314,10 @@ static void imx_ocotp_field_decode(uint32_t field, unsigned *word, { unsigned width; - *word = ((field >> OCOTP_WORD_MASK_SHIFT) & ((1 << OCOTP_WORD_MASK_WIDTH) - 1)) * 4; - *bit = (field >> OCOTP_BIT_MASK_SHIFT) & ((1 << OCOTP_BIT_MASK_WIDTH) - 1); - width = ((field >> OCOTP_WIDTH_MASK_SHIFT) & ((1 << OCOTP_WIDTH_MASK_WIDTH) - 1)) + 1; - *mask = (1 << width) - 1; + *word = FIELD_GET(OCOTP_WORD_MASK, field) * 4; + *bit = FIELD_GET(OCOTP_BIT_MASK, field); + width = FIELD_GET(OCOTP_WIDTH_MASK, field); + *mask = GENMASK(width, 0); } int imx_ocotp_read_field(uint32_t field, unsigned *value) -- 2.17.0 _______________________________________________ barebox mailing list barebox@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/barebox