
Dear Simon Glass,
In message BANLkTi=+pqk=UQY_=NoXcMabBDm845xcEw@mail.gmail.com you wrote:
#define clrsetfield_le32(bitfield, addr, value) =A0...
Then caller can define these in a header file:
#define FIELD_MASK 0xf0000 #define FIELD_SHIFT 16
And use this macro to set the bitfield to 6, for example:
clrsetfield_le32(FIELD, &my_device->ctrl, 6)
(this will simply shift the value left 16 bits and apply the supplied ma=
sk)
This captures the essence of bitfields, in that we are abstracting the field under a single name. The change would just add this macro to the io.h header file.
Sorry, I fail to understand how you envision to use this, and how it would be different from =A0clrsetbits*() ?
For example this allows us to replace:
clrsetbits_le(&my_device->ctrl, 0xf << 16, 6 << 16)
with:
clrsetfield_le32(FIELD, &my_device->ctrl, 6)
So the two identical shifts are avoided, and the forming of the mask is done once in the define.
If you really insist:
#define FIELD_VAL(x) (x << 16) #define FIELD_MASK FIELD_VAL(0xF)
clrsetbits_le32(&my_device->ctrl, FIELD_MASK, FIELD_VAL(6));
In practical use cases, you will probablu not use magg numbers like '6' anyway, and define symbolic names for this anyway, so this would be:
clrsetbits_le32(&my_device->ctrl, FIELD_MASK, FIELD_VAL_FOO);
or similar.
Best regards,
Wolfgang Denk