diff mbox series

[v1,008/107] media: ti-vpe: cal: Turn reg_(read|write)_field() into inline functions

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

Commit Message

Laurent Pinchart June 14, 2020, 11:58 p.m. UTC
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(-)

Comments

Benoit Parrot June 18, 2020, 1:29 p.m. UTC | #1
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
>
Laurent Pinchart June 19, 2020, 3:15 p.m. UTC | #2
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 mbox series

Patch

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;