Message ID | 20200614235944.17716-9-laurent.pinchart@ideasonboard.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | media: ti-vpe: cal: Add media controller support | expand |
Hi Laurent, Thank you for the patch. Laurent Pinchart <laurent.pinchart@ideasonboard.com> wrote on Mon [2020-Jun-15 02:58:05 +0300]: > Turn the reg_(read|write)_field() macros into inline functions for > additional type safety. Use the FIELD_GET() and FIELD_PREP() macros > internally instead of reinventing the wheel. > > Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> > --- > drivers/media/platform/ti-vpe/cal.c | 28 ++++++++++++++++------------ > 1 file changed, 16 insertions(+), 12 deletions(-) > > diff --git a/drivers/media/platform/ti-vpe/cal.c b/drivers/media/platform/ti-vpe/cal.c > index fa86a53882cc..8c068af936f0 100644 > --- a/drivers/media/platform/ti-vpe/cal.c > +++ b/drivers/media/platform/ti-vpe/cal.c > @@ -6,6 +6,7 @@ > * Benoit Parrot, <bparrot@ti.com> > */ > > +#include <linux/bitfield.h> > #include <linux/clk.h> > #include <linux/delay.h> > #include <linux/interrupt.h> > @@ -76,13 +77,6 @@ static const struct v4l2_fract > #define reg_read(dev, offset) ioread32(dev->base + offset) > #define reg_write(dev, offset, val) iowrite32(val, dev->base + offset) > > -#define reg_read_field(dev, offset, mask) get_field(reg_read(dev, offset), \ > - mask) > -#define reg_write_field(dev, offset, field, mask) { \ > - u32 val = reg_read(dev, offset); \ > - set_field(&val, field, mask); \ > - reg_write(dev, offset, val); } > - > /* ------------------------------------------------------------------ > * Basic structures > * ------------------------------------------------------------------ > @@ -418,6 +412,21 @@ struct cal_ctx { > bool dma_act; > }; > > +static inline u32 reg_read_field(struct cal_dev *dev, u32 offset, u32 mask) > +{ > + return FIELD_GET(mask, reg_read(dev, offset)); > +} > + > +static inline void reg_write_field(struct cal_dev *dev, u32 offset, u32 value, > + u32 mask) > +{ > + u32 val = reg_read(dev, offset); > + > + val &= ~mask; > + val |= FIELD_PREP(mask, value); > + reg_write(dev, offset, val); > +} > + > static const struct cal_fmt *find_format_by_pix(struct cal_ctx *ctx, > u32 pixelformat) > { > @@ -453,11 +462,6 @@ static inline struct cal_ctx *notifier_to_ctx(struct v4l2_async_notifier *n) > return container_of(n, struct cal_ctx, notifier); > } > > -static inline int get_field(u32 value, u32 mask) > -{ > - return (value & mask) >> __ffs(mask); > -} > - > static inline void set_field(u32 *valp, u32 field, u32 mask) > { > u32 val = *valp; Is set_field still in use then after this patch? Any reason to keep it around? Benoit > -- > Regards, > > Laurent Pinchart >
Hi Benoit, On Thu, Jun 18, 2020 at 08:29:55AM -0500, Benoit Parrot wrote: > Laurent Pinchart <laurent.pinchart@ideasonboard.com> wrote on Mon [2020-Jun-15 02:58:05 +0300]: > > Turn the reg_(read|write)_field() macros into inline functions for > > additional type safety. Use the FIELD_GET() and FIELD_PREP() macros > > internally instead of reinventing the wheel. > > > > Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> > > --- > > drivers/media/platform/ti-vpe/cal.c | 28 ++++++++++++++++------------ > > 1 file changed, 16 insertions(+), 12 deletions(-) > > > > diff --git a/drivers/media/platform/ti-vpe/cal.c b/drivers/media/platform/ti-vpe/cal.c > > index fa86a53882cc..8c068af936f0 100644 > > --- a/drivers/media/platform/ti-vpe/cal.c > > +++ b/drivers/media/platform/ti-vpe/cal.c > > @@ -6,6 +6,7 @@ > > * Benoit Parrot, <bparrot@ti.com> > > */ > > > > +#include <linux/bitfield.h> > > #include <linux/clk.h> > > #include <linux/delay.h> > > #include <linux/interrupt.h> > > @@ -76,13 +77,6 @@ static const struct v4l2_fract > > #define reg_read(dev, offset) ioread32(dev->base + offset) > > #define reg_write(dev, offset, val) iowrite32(val, dev->base + offset) > > > > -#define reg_read_field(dev, offset, mask) get_field(reg_read(dev, offset), \ > > - mask) > > -#define reg_write_field(dev, offset, field, mask) { \ > > - u32 val = reg_read(dev, offset); \ > > - set_field(&val, field, mask); \ > > - reg_write(dev, offset, val); } > > - > > /* ------------------------------------------------------------------ > > * Basic structures > > * ------------------------------------------------------------------ > > @@ -418,6 +412,21 @@ struct cal_ctx { > > bool dma_act; > > }; > > > > +static inline u32 reg_read_field(struct cal_dev *dev, u32 offset, u32 mask) > > +{ > > + return FIELD_GET(mask, reg_read(dev, offset)); > > +} > > + > > +static inline void reg_write_field(struct cal_dev *dev, u32 offset, u32 value, > > + u32 mask) > > +{ > > + u32 val = reg_read(dev, offset); > > + > > + val &= ~mask; > > + val |= FIELD_PREP(mask, value); > > + reg_write(dev, offset, val); > > +} > > + > > static const struct cal_fmt *find_format_by_pix(struct cal_ctx *ctx, > > u32 pixelformat) > > { > > @@ -453,11 +462,6 @@ static inline struct cal_ctx *notifier_to_ctx(struct v4l2_async_notifier *n) > > return container_of(n, struct cal_ctx, notifier); > > } > > > > -static inline int get_field(u32 value, u32 mask) > > -{ > > - return (value & mask) >> __ffs(mask); > > -} > > - > > static inline void set_field(u32 *valp, u32 field, u32 mask) > > { > > u32 val = *valp; > > Is set_field still in use then after this patch? > Any reason to keep it around? Yes, it's still used in a quite few functions. I'm considering addressing that on top, several (but not all) use caes are in functions that perform read-modify-write updates when they could just write the whole register.
diff --git a/drivers/media/platform/ti-vpe/cal.c b/drivers/media/platform/ti-vpe/cal.c index fa86a53882cc..8c068af936f0 100644 --- a/drivers/media/platform/ti-vpe/cal.c +++ b/drivers/media/platform/ti-vpe/cal.c @@ -6,6 +6,7 @@ * Benoit Parrot, <bparrot@ti.com> */ +#include <linux/bitfield.h> #include <linux/clk.h> #include <linux/delay.h> #include <linux/interrupt.h> @@ -76,13 +77,6 @@ static const struct v4l2_fract #define reg_read(dev, offset) ioread32(dev->base + offset) #define reg_write(dev, offset, val) iowrite32(val, dev->base + offset) -#define reg_read_field(dev, offset, mask) get_field(reg_read(dev, offset), \ - mask) -#define reg_write_field(dev, offset, field, mask) { \ - u32 val = reg_read(dev, offset); \ - set_field(&val, field, mask); \ - reg_write(dev, offset, val); } - /* ------------------------------------------------------------------ * Basic structures * ------------------------------------------------------------------ @@ -418,6 +412,21 @@ struct cal_ctx { bool dma_act; }; +static inline u32 reg_read_field(struct cal_dev *dev, u32 offset, u32 mask) +{ + return FIELD_GET(mask, reg_read(dev, offset)); +} + +static inline void reg_write_field(struct cal_dev *dev, u32 offset, u32 value, + u32 mask) +{ + u32 val = reg_read(dev, offset); + + val &= ~mask; + val |= FIELD_PREP(mask, value); + reg_write(dev, offset, val); +} + static const struct cal_fmt *find_format_by_pix(struct cal_ctx *ctx, u32 pixelformat) { @@ -453,11 +462,6 @@ static inline struct cal_ctx *notifier_to_ctx(struct v4l2_async_notifier *n) return container_of(n, struct cal_ctx, notifier); } -static inline int get_field(u32 value, u32 mask) -{ - return (value & mask) >> __ffs(mask); -} - static inline void set_field(u32 *valp, u32 field, u32 mask) { u32 val = *valp;
Turn the reg_(read|write)_field() macros into inline functions for additional type safety. Use the FIELD_GET() and FIELD_PREP() macros internally instead of reinventing the wheel. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> --- drivers/media/platform/ti-vpe/cal.c | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-)