linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v1 1/2] gpiolib: of: Prepare of_gpiochip_add() / of_gpiochip_remove() for fwnode
@ 2022-11-07 16:10 Andy Shevchenko
  2022-11-07 16:10 ` [PATCH v1 2/2] gpiolib: of: Integrate of_gpiochip_init_valid_mask() into gpiochip_init_valid_mask() Andy Shevchenko
                   ` (2 more replies)
  0 siblings, 3 replies; 11+ messages in thread
From: Andy Shevchenko @ 2022-11-07 16:10 UTC (permalink / raw)
  To: Bartosz Golaszewski, Dmitry Torokhov, Andy Shevchenko,
	linux-gpio, linux-kernel
  Cc: Linus Walleij

GPIO library is getting rid of of_node, fwnode should be utilized instead.
Prepare of_gpiochip_add() / of_gpiochip_remove() for fwnode.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
 drivers/gpio/gpiolib-of.c | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/drivers/gpio/gpiolib-of.c b/drivers/gpio/gpiolib-of.c
index be9c34cca322..000020eb78d8 100644
--- a/drivers/gpio/gpiolib-of.c
+++ b/drivers/gpio/gpiolib-of.c
@@ -1104,9 +1104,11 @@ static int of_gpiochip_add_pin_range(struct gpio_chip *chip) { return 0; }
 
 int of_gpiochip_add(struct gpio_chip *chip)
 {
+	struct device_node *np;
 	int ret;
 
-	if (!chip->of_node)
+	np = to_of_node(chip->fwnode);
+	if (!np)
 		return 0;
 
 	if (!chip->of_xlate) {
@@ -1123,18 +1125,18 @@ int of_gpiochip_add(struct gpio_chip *chip)
 	if (ret)
 		return ret;
 
-	of_node_get(chip->of_node);
+	fwnode_handle_get(chip->fwnode);
 
 	ret = of_gpiochip_scan_gpios(chip);
 	if (ret)
-		of_node_put(chip->of_node);
+		fwnode_handle_put(chip->fwnode);
 
 	return ret;
 }
 
 void of_gpiochip_remove(struct gpio_chip *chip)
 {
-	of_node_put(chip->of_node);
+	fwnode_handle_put(chip->fwnode);
 }
 
 void of_gpio_dev_init(struct gpio_chip *gc, struct gpio_device *gdev)
-- 
2.35.1


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH v1 2/2] gpiolib: of: Integrate of_gpiochip_init_valid_mask() into gpiochip_init_valid_mask()
  2022-11-07 16:10 [PATCH v1 1/2] gpiolib: of: Prepare of_gpiochip_add() / of_gpiochip_remove() for fwnode Andy Shevchenko
@ 2022-11-07 16:10 ` Andy Shevchenko
  2022-11-07 18:20   ` Dmitry Torokhov
  2022-11-07 18:14 ` [PATCH v1 1/2] gpiolib: of: Prepare of_gpiochip_add() / of_gpiochip_remove() for fwnode Dmitry Torokhov
  2022-11-09 13:13 ` Bartosz Golaszewski
  2 siblings, 1 reply; 11+ messages in thread
From: Andy Shevchenko @ 2022-11-07 16:10 UTC (permalink / raw)
  To: Bartosz Golaszewski, Dmitry Torokhov, Andy Shevchenko,
	linux-gpio, linux-kernel
  Cc: Linus Walleij

In preparation to complete fwnode switch, integrate
of_gpiochip_init_valid_mask() into gpiochip_init_valid_mask().

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
 drivers/gpio/gpiolib-of.c | 42 -------------------------------
 drivers/gpio/gpiolib-of.h |  5 ----
 drivers/gpio/gpiolib.c    | 52 ++++++++++++++++++++++++++++++++++++++-
 3 files changed, 51 insertions(+), 48 deletions(-)

diff --git a/drivers/gpio/gpiolib-of.c b/drivers/gpio/gpiolib-of.c
index 000020eb78d8..4be3c21aa718 100644
--- a/drivers/gpio/gpiolib-of.c
+++ b/drivers/gpio/gpiolib-of.c
@@ -112,24 +112,6 @@ static struct gpio_desc *of_xlate_and_get_gpiod_flags(struct gpio_chip *chip,
 	return gpiochip_get_desc(chip, ret);
 }
 
-/**
- * of_gpio_need_valid_mask() - figure out if the OF GPIO driver needs
- * to set the .valid_mask
- * @gc: the target gpio_chip
- *
- * Return: true if the valid mask needs to be set
- */
-bool of_gpio_need_valid_mask(const struct gpio_chip *gc)
-{
-	int size;
-	const struct device_node *np = gc->of_node;
-
-	size = of_property_count_u32_elems(np,  "gpio-reserved-ranges");
-	if (size > 0 && size % 2 == 0)
-		return true;
-	return false;
-}
-
 /*
  * Overrides stated polarity of a gpio line and warns when there is a
  * discrepancy.
@@ -989,28 +971,6 @@ void of_mm_gpiochip_remove(struct of_mm_gpio_chip *mm_gc)
 }
 EXPORT_SYMBOL_GPL(of_mm_gpiochip_remove);
 
-static void of_gpiochip_init_valid_mask(struct gpio_chip *chip)
-{
-	int len, i;
-	u32 start, count;
-	struct device_node *np = chip->of_node;
-
-	len = of_property_count_u32_elems(np,  "gpio-reserved-ranges");
-	if (len < 0 || len % 2 != 0)
-		return;
-
-	for (i = 0; i < len; i += 2) {
-		of_property_read_u32_index(np, "gpio-reserved-ranges",
-					   i, &start);
-		of_property_read_u32_index(np, "gpio-reserved-ranges",
-					   i + 1, &count);
-		if (start >= chip->ngpio || start + count > chip->ngpio)
-			continue;
-
-		bitmap_clear(chip->valid_mask, start, count);
-	}
-};
-
 #ifdef CONFIG_PINCTRL
 static int of_gpiochip_add_pin_range(struct gpio_chip *chip)
 {
@@ -1119,8 +1079,6 @@ int of_gpiochip_add(struct gpio_chip *chip)
 	if (chip->of_gpio_n_cells > MAX_PHANDLE_ARGS)
 		return -EINVAL;
 
-	of_gpiochip_init_valid_mask(chip);
-
 	ret = of_gpiochip_add_pin_range(chip);
 	if (ret)
 		return ret;
diff --git a/drivers/gpio/gpiolib-of.h b/drivers/gpio/gpiolib-of.h
index 1b5df39a952e..2a2f7d17fa7e 100644
--- a/drivers/gpio/gpiolib-of.h
+++ b/drivers/gpio/gpiolib-of.h
@@ -23,7 +23,6 @@ struct gpio_desc *of_find_gpio(struct device *dev,
 int of_gpiochip_add(struct gpio_chip *gc);
 void of_gpiochip_remove(struct gpio_chip *gc);
 int of_gpio_get_count(struct device *dev, const char *con_id);
-bool of_gpio_need_valid_mask(const struct gpio_chip *gc);
 void of_gpio_dev_init(struct gpio_chip *gc, struct gpio_device *gdev);
 #else
 static inline struct gpio_desc *of_find_gpio(struct device *dev,
@@ -39,10 +38,6 @@ static inline int of_gpio_get_count(struct device *dev, const char *con_id)
 {
 	return 0;
 }
-static inline bool of_gpio_need_valid_mask(const struct gpio_chip *gc)
-{
-	return false;
-}
 static inline void of_gpio_dev_init(struct gpio_chip *gc,
 				    struct gpio_device *gdev)
 {
diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
index e8faedca6b14..2ab7b7949171 100644
--- a/drivers/gpio/gpiolib.c
+++ b/drivers/gpio/gpiolib.c
@@ -445,9 +445,20 @@ static unsigned long *gpiochip_allocate_mask(struct gpio_chip *gc)
 	return p;
 }
 
+static unsigned int gpiochip_count_reserved_ranges(struct gpio_chip *gc)
+{
+	int size;
+
+	size = fwnode_property_count_u32(gc->fwnode, "gpio-reserved-ranges");
+	if (size > 0 && size % 2 == 0)
+		return size;
+
+	return 0;
+}
+
 static int gpiochip_alloc_valid_mask(struct gpio_chip *gc)
 {
-	if (!(of_gpio_need_valid_mask(gc) || gc->init_valid_mask))
+	if (!(gpiochip_count_reserved_ranges(gc) || gc->init_valid_mask))
 		return 0;
 
 	gc->valid_mask = gpiochip_allocate_mask(gc);
@@ -457,8 +468,47 @@ static int gpiochip_alloc_valid_mask(struct gpio_chip *gc)
 	return 0;
 }
 
+static int gpiochip_apply_reserved_ranges(struct gpio_chip *gc, unsigned int sz)
+{
+	u32 *ranges;
+	int ret;
+
+	ranges = kmalloc_array(sz, sizeof(*ranges), GFP_KERNEL);
+	if (!ranges)
+		return -ENOMEM;
+
+	ret = fwnode_property_read_u32_array(gc->fwnode, "gpio-reserved-ranges", ranges, sz);
+	if (ret) {
+		kfree(ranges);
+		return ret;
+	}
+
+	while (sz) {
+		u32 count = ranges[--sz];
+		u32 start = ranges[--sz];
+
+		if (start >= gc->ngpio || start + count > gc->ngpio)
+			continue;
+
+		bitmap_clear(gc->valid_mask, start, count);
+	}
+
+	kfree(ranges);
+	return 0;
+}
+
 static int gpiochip_init_valid_mask(struct gpio_chip *gc)
 {
+	unsigned int sz;
+	int ret;
+
+	sz = gpiochip_count_reserved_ranges(gc);
+	if (sz) {
+		ret = gpiochip_apply_reserved_ranges(gc, sz);
+		if (ret)
+			return ret;
+	}
+
 	if (gc->init_valid_mask)
 		return gc->init_valid_mask(gc,
 					   gc->valid_mask,
-- 
2.35.1


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: [PATCH v1 1/2] gpiolib: of: Prepare of_gpiochip_add() / of_gpiochip_remove() for fwnode
  2022-11-07 16:10 [PATCH v1 1/2] gpiolib: of: Prepare of_gpiochip_add() / of_gpiochip_remove() for fwnode Andy Shevchenko
  2022-11-07 16:10 ` [PATCH v1 2/2] gpiolib: of: Integrate of_gpiochip_init_valid_mask() into gpiochip_init_valid_mask() Andy Shevchenko
@ 2022-11-07 18:14 ` Dmitry Torokhov
  2022-11-09 13:13 ` Bartosz Golaszewski
  2 siblings, 0 replies; 11+ messages in thread
From: Dmitry Torokhov @ 2022-11-07 18:14 UTC (permalink / raw)
  To: Andy Shevchenko
  Cc: Bartosz Golaszewski, linux-gpio, linux-kernel, Linus Walleij

On Mon, Nov 07, 2022 at 06:10:26PM +0200, Andy Shevchenko wrote:
> GPIO library is getting rid of of_node, fwnode should be utilized instead.
> Prepare of_gpiochip_add() / of_gpiochip_remove() for fwnode.
> 
> Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>

Reviewed-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>

> ---
>  drivers/gpio/gpiolib-of.c | 10 ++++++----
>  1 file changed, 6 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/gpio/gpiolib-of.c b/drivers/gpio/gpiolib-of.c
> index be9c34cca322..000020eb78d8 100644
> --- a/drivers/gpio/gpiolib-of.c
> +++ b/drivers/gpio/gpiolib-of.c
> @@ -1104,9 +1104,11 @@ static int of_gpiochip_add_pin_range(struct gpio_chip *chip) { return 0; }
>  
>  int of_gpiochip_add(struct gpio_chip *chip)
>  {
> +	struct device_node *np;
>  	int ret;
>  
> -	if (!chip->of_node)
> +	np = to_of_node(chip->fwnode);
> +	if (!np)
>  		return 0;
>  
>  	if (!chip->of_xlate) {
> @@ -1123,18 +1125,18 @@ int of_gpiochip_add(struct gpio_chip *chip)
>  	if (ret)
>  		return ret;
>  
> -	of_node_get(chip->of_node);
> +	fwnode_handle_get(chip->fwnode);
>  
>  	ret = of_gpiochip_scan_gpios(chip);
>  	if (ret)
> -		of_node_put(chip->of_node);
> +		fwnode_handle_put(chip->fwnode);
>  
>  	return ret;
>  }
>  
>  void of_gpiochip_remove(struct gpio_chip *chip)
>  {
> -	of_node_put(chip->of_node);
> +	fwnode_handle_put(chip->fwnode);
>  }
>  
>  void of_gpio_dev_init(struct gpio_chip *gc, struct gpio_device *gdev)
> -- 
> 2.35.1
> 

-- 
Dmitry

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v1 2/2] gpiolib: of: Integrate of_gpiochip_init_valid_mask() into gpiochip_init_valid_mask()
  2022-11-07 16:10 ` [PATCH v1 2/2] gpiolib: of: Integrate of_gpiochip_init_valid_mask() into gpiochip_init_valid_mask() Andy Shevchenko
@ 2022-11-07 18:20   ` Dmitry Torokhov
  2022-11-07 21:09     ` Andy Shevchenko
  0 siblings, 1 reply; 11+ messages in thread
From: Dmitry Torokhov @ 2022-11-07 18:20 UTC (permalink / raw)
  To: Andy Shevchenko
  Cc: Bartosz Golaszewski, linux-gpio, linux-kernel, Linus Walleij

Hi Andy,

On Mon, Nov 07, 2022 at 06:10:27PM +0200, Andy Shevchenko wrote:
> +static unsigned int gpiochip_count_reserved_ranges(struct gpio_chip *gc)
> +{
> +	int size;
> +
> +	size = fwnode_property_count_u32(gc->fwnode, "gpio-reserved-ranges");

I wonder if a comment why we need even size would not be helpful.

> +	if (size > 0 && size % 2 == 0)
> +		return size;
> +
> +	return 0;
> +}
> +
>  static int gpiochip_alloc_valid_mask(struct gpio_chip *gc)
>  {
> -	if (!(of_gpio_need_valid_mask(gc) || gc->init_valid_mask))
> +	if (!(gpiochip_count_reserved_ranges(gc) || gc->init_valid_mask))
>  		return 0;
>  
>  	gc->valid_mask = gpiochip_allocate_mask(gc);
> @@ -457,8 +468,47 @@ static int gpiochip_alloc_valid_mask(struct gpio_chip *gc)
>  	return 0;
>  }
>  
> +static int gpiochip_apply_reserved_ranges(struct gpio_chip *gc, unsigned int sz)
> +{
> +	u32 *ranges;
> +	int ret;
> +
> +	ranges = kmalloc_array(sz, sizeof(*ranges), GFP_KERNEL);
> +	if (!ranges)
> +		return -ENOMEM;
> +
> +	ret = fwnode_property_read_u32_array(gc->fwnode, "gpio-reserved-ranges", ranges, sz);
> +	if (ret) {
> +		kfree(ranges);
> +		return ret;
> +	}
> +
> +	while (sz) {
> +		u32 count = ranges[--sz];
> +		u32 start = ranges[--sz];

I know we checked sz validity, but I wonder if re-checking it in this
function would not insulate us from errors creeping in after some other
code refactoring.

In any case,

Reviewed-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>

Thanks.

-- 
Dmitry

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v1 2/2] gpiolib: of: Integrate of_gpiochip_init_valid_mask() into gpiochip_init_valid_mask()
  2022-11-07 18:20   ` Dmitry Torokhov
@ 2022-11-07 21:09     ` Andy Shevchenko
  2022-11-07 21:40       ` Dmitry Torokhov
  0 siblings, 1 reply; 11+ messages in thread
From: Andy Shevchenko @ 2022-11-07 21:09 UTC (permalink / raw)
  To: Dmitry Torokhov
  Cc: Bartosz Golaszewski, linux-gpio, linux-kernel, Linus Walleij

On Mon, Nov 07, 2022 at 10:20:37AM -0800, Dmitry Torokhov wrote:
> On Mon, Nov 07, 2022 at 06:10:27PM +0200, Andy Shevchenko wrote:
> > +static unsigned int gpiochip_count_reserved_ranges(struct gpio_chip *gc)
> > +{
> > +	int size;
> > +
> > +	size = fwnode_property_count_u32(gc->fwnode, "gpio-reserved-ranges");
> 
> I wonder if a comment why we need even size would not be helpful.

Was it in the original code?
Anyway, if Bart thinks so as well, I may add it in v2.

> > +	if (size > 0 && size % 2 == 0)
> > +		return size;
> > +
> > +	return 0;
> > +}
> > +
> >  static int gpiochip_alloc_valid_mask(struct gpio_chip *gc)
> >  {
> > -	if (!(of_gpio_need_valid_mask(gc) || gc->init_valid_mask))
> > +	if (!(gpiochip_count_reserved_ranges(gc) || gc->init_valid_mask))
> >  		return 0;
> >  
> >  	gc->valid_mask = gpiochip_allocate_mask(gc);
> > @@ -457,8 +468,47 @@ static int gpiochip_alloc_valid_mask(struct gpio_chip *gc)
> >  	return 0;
> >  }
> >  
> > +static int gpiochip_apply_reserved_ranges(struct gpio_chip *gc, unsigned int sz)
> > +{
> > +	u32 *ranges;
> > +	int ret;
> > +
> > +	ranges = kmalloc_array(sz, sizeof(*ranges), GFP_KERNEL);
> > +	if (!ranges)
> > +		return -ENOMEM;
> > +
> > +	ret = fwnode_property_read_u32_array(gc->fwnode, "gpio-reserved-ranges", ranges, sz);
> > +	if (ret) {
> > +		kfree(ranges);
> > +		return ret;
> > +	}
> > +
> > +	while (sz) {
> > +		u32 count = ranges[--sz];
> > +		u32 start = ranges[--sz];
> 
> I know we checked sz validity, but I wonder if re-checking it in this
> function would not insulate us from errors creeping in after some other
> code refactoring.

I'm not sure I understand what you meant. The fwnode_property_read_u32_array()
will fail if the given sz is too big for the real data, so while (sz) would
never even go on the invalid data.

> In any case,
> 
> Reviewed-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>

Thank you!

-- 
With Best Regards,
Andy Shevchenko



^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v1 2/2] gpiolib: of: Integrate of_gpiochip_init_valid_mask() into gpiochip_init_valid_mask()
  2022-11-07 21:09     ` Andy Shevchenko
@ 2022-11-07 21:40       ` Dmitry Torokhov
  2022-11-08  8:41         ` Andy Shevchenko
  0 siblings, 1 reply; 11+ messages in thread
From: Dmitry Torokhov @ 2022-11-07 21:40 UTC (permalink / raw)
  To: Andy Shevchenko
  Cc: Bartosz Golaszewski, linux-gpio, linux-kernel, Linus Walleij

On Mon, Nov 07, 2022 at 11:09:19PM +0200, Andy Shevchenko wrote:
> On Mon, Nov 07, 2022 at 10:20:37AM -0800, Dmitry Torokhov wrote:
> > On Mon, Nov 07, 2022 at 06:10:27PM +0200, Andy Shevchenko wrote:
> > > +static unsigned int gpiochip_count_reserved_ranges(struct gpio_chip *gc)
> > > +{
> > > +	int size;
> > > +
> > > +	size = fwnode_property_count_u32(gc->fwnode, "gpio-reserved-ranges");
> > 
> > I wonder if a comment why we need even size would not be helpful.
> 
> Was it in the original code?
> Anyway, if Bart thinks so as well, I may add it in v2.
> 
> > > +	if (size > 0 && size % 2 == 0)
> > > +		return size;
> > > +
> > > +	return 0;
> > > +}
> > > +
> > >  static int gpiochip_alloc_valid_mask(struct gpio_chip *gc)
> > >  {
> > > -	if (!(of_gpio_need_valid_mask(gc) || gc->init_valid_mask))
> > > +	if (!(gpiochip_count_reserved_ranges(gc) || gc->init_valid_mask))
> > >  		return 0;
> > >  
> > >  	gc->valid_mask = gpiochip_allocate_mask(gc);
> > > @@ -457,8 +468,47 @@ static int gpiochip_alloc_valid_mask(struct gpio_chip *gc)
> > >  	return 0;
> > >  }
> > >  
> > > +static int gpiochip_apply_reserved_ranges(struct gpio_chip *gc, unsigned int sz)
> > > +{
> > > +	u32 *ranges;
> > > +	int ret;
> > > +
> > > +	ranges = kmalloc_array(sz, sizeof(*ranges), GFP_KERNEL);
> > > +	if (!ranges)
> > > +		return -ENOMEM;
> > > +
> > > +	ret = fwnode_property_read_u32_array(gc->fwnode, "gpio-reserved-ranges", ranges, sz);
> > > +	if (ret) {
> > > +		kfree(ranges);
> > > +		return ret;
> > > +	}
> > > +
> > > +	while (sz) {
> > > +		u32 count = ranges[--sz];
> > > +		u32 start = ranges[--sz];
> > 
> > I know we checked sz validity, but I wonder if re-checking it in this
> > function would not insulate us from errors creeping in after some other
> > code refactoring.
> 
> I'm not sure I understand what you meant. The fwnode_property_read_u32_array()
> will fail if the given sz is too big for the real data, so while (sz) would
> never even go on the invalid data.

I am more worried about sz being odd and the loop ending up trying to
dereference ranges[-1].

Thanks.

-- 
Dmitry

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v1 2/2] gpiolib: of: Integrate of_gpiochip_init_valid_mask() into gpiochip_init_valid_mask()
  2022-11-07 21:40       ` Dmitry Torokhov
@ 2022-11-08  8:41         ` Andy Shevchenko
  2022-11-08 13:23           ` Andy Shevchenko
  0 siblings, 1 reply; 11+ messages in thread
From: Andy Shevchenko @ 2022-11-08  8:41 UTC (permalink / raw)
  To: Dmitry Torokhov
  Cc: Bartosz Golaszewski, linux-gpio, linux-kernel, Linus Walleij

On Mon, Nov 07, 2022 at 01:40:53PM -0800, Dmitry Torokhov wrote:
> On Mon, Nov 07, 2022 at 11:09:19PM +0200, Andy Shevchenko wrote:
> > On Mon, Nov 07, 2022 at 10:20:37AM -0800, Dmitry Torokhov wrote:
> > > On Mon, Nov 07, 2022 at 06:10:27PM +0200, Andy Shevchenko wrote:

...

> > > > +static int gpiochip_apply_reserved_ranges(struct gpio_chip *gc, unsigned int sz)
> > > > +{
> > > > +	u32 *ranges;
> > > > +	int ret;
> > > > +
> > > > +	ranges = kmalloc_array(sz, sizeof(*ranges), GFP_KERNEL);
> > > > +	if (!ranges)
> > > > +		return -ENOMEM;
> > > > +
> > > > +	ret = fwnode_property_read_u32_array(gc->fwnode, "gpio-reserved-ranges", ranges, sz);
> > > > +	if (ret) {
> > > > +		kfree(ranges);
> > > > +		return ret;
> > > > +	}
> > > > +
> > > > +	while (sz) {
> > > > +		u32 count = ranges[--sz];
> > > > +		u32 start = ranges[--sz];
> > > 
> > > I know we checked sz validity, but I wonder if re-checking it in this
> > > function would not insulate us from errors creeping in after some other
> > > code refactoring.
> > 
> > I'm not sure I understand what you meant. The fwnode_property_read_u32_array()
> > will fail if the given sz is too big for the real data, so while (sz) would
> > never even go on the invalid data.
> 
> I am more worried about sz being odd and the loop ending up trying to
> dereference ranges[-1].

I see. What if we take amount of ranges as the parameter and convert to size by
multiplying by 2?

-- 
With Best Regards,
Andy Shevchenko



^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v1 2/2] gpiolib: of: Integrate of_gpiochip_init_valid_mask() into gpiochip_init_valid_mask()
  2022-11-08  8:41         ` Andy Shevchenko
@ 2022-11-08 13:23           ` Andy Shevchenko
  0 siblings, 0 replies; 11+ messages in thread
From: Andy Shevchenko @ 2022-11-08 13:23 UTC (permalink / raw)
  To: Dmitry Torokhov
  Cc: Bartosz Golaszewski, linux-gpio, linux-kernel, Linus Walleij

On Tue, Nov 08, 2022 at 10:41:43AM +0200, Andy Shevchenko wrote:
> On Mon, Nov 07, 2022 at 01:40:53PM -0800, Dmitry Torokhov wrote:
> > On Mon, Nov 07, 2022 at 11:09:19PM +0200, Andy Shevchenko wrote:

...

> > I am more worried about sz being odd and the loop ending up trying to
> > dereference ranges[-1].
> 
> I see. What if we take amount of ranges as the parameter and convert to size by
> multiplying by 2?

Okay, I found a way how to avoid additional churn and add validation.
I will incorporate that in v2 with your tags.

-- 
With Best Regards,
Andy Shevchenko



^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v1 1/2] gpiolib: of: Prepare of_gpiochip_add() / of_gpiochip_remove() for fwnode
  2022-11-07 16:10 [PATCH v1 1/2] gpiolib: of: Prepare of_gpiochip_add() / of_gpiochip_remove() for fwnode Andy Shevchenko
  2022-11-07 16:10 ` [PATCH v1 2/2] gpiolib: of: Integrate of_gpiochip_init_valid_mask() into gpiochip_init_valid_mask() Andy Shevchenko
  2022-11-07 18:14 ` [PATCH v1 1/2] gpiolib: of: Prepare of_gpiochip_add() / of_gpiochip_remove() for fwnode Dmitry Torokhov
@ 2022-11-09 13:13 ` Bartosz Golaszewski
  2022-11-09 13:13   ` Bartosz Golaszewski
  2 siblings, 1 reply; 11+ messages in thread
From: Bartosz Golaszewski @ 2022-11-09 13:13 UTC (permalink / raw)
  To: Andy Shevchenko; +Cc: Dmitry Torokhov, linux-gpio, linux-kernel, Linus Walleij

On Mon, Nov 7, 2022 at 5:10 PM Andy Shevchenko
<andriy.shevchenko@linux.intel.com> wrote:
>
> GPIO library is getting rid of of_node, fwnode should be utilized instead.
> Prepare of_gpiochip_add() / of_gpiochip_remove() for fwnode.
>
> Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> ---
>  drivers/gpio/gpiolib-of.c | 10 ++++++----
>  1 file changed, 6 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/gpio/gpiolib-of.c b/drivers/gpio/gpiolib-of.c
> index be9c34cca322..000020eb78d8 100644
> --- a/drivers/gpio/gpiolib-of.c
> +++ b/drivers/gpio/gpiolib-of.c
> @@ -1104,9 +1104,11 @@ static int of_gpiochip_add_pin_range(struct gpio_chip *chip) { return 0; }
>
>  int of_gpiochip_add(struct gpio_chip *chip)
>  {
> +       struct device_node *np;
>         int ret;
>
> -       if (!chip->of_node)
> +       np = to_of_node(chip->fwnode);
> +       if (!np)
>                 return 0;
>
>         if (!chip->of_xlate) {
> @@ -1123,18 +1125,18 @@ int of_gpiochip_add(struct gpio_chip *chip)
>         if (ret)
>                 return ret;
>
> -       of_node_get(chip->of_node);
> +       fwnode_handle_get(chip->fwnode);
>
>         ret = of_gpiochip_scan_gpios(chip);
>         if (ret)
> -               of_node_put(chip->of_node);
> +               fwnode_handle_put(chip->fwnode);
>
>         return ret;
>  }
>
>  void of_gpiochip_remove(struct gpio_chip *chip)
>  {
> -       of_node_put(chip->of_node);
> +       fwnode_handle_put(chip->fwnode);
>  }
>
>  void of_gpio_dev_init(struct gpio_chip *gc, struct gpio_device *gdev)
> --
> 2.35.1
>

Applied, thanks!

Bart

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v1 1/2] gpiolib: of: Prepare of_gpiochip_add() / of_gpiochip_remove() for fwnode
  2022-11-09 13:13 ` Bartosz Golaszewski
@ 2022-11-09 13:13   ` Bartosz Golaszewski
  2022-11-09 13:23     ` Andy Shevchenko
  0 siblings, 1 reply; 11+ messages in thread
From: Bartosz Golaszewski @ 2022-11-09 13:13 UTC (permalink / raw)
  To: Andy Shevchenko; +Cc: Dmitry Torokhov, linux-gpio, linux-kernel, Linus Walleij

On Wed, Nov 9, 2022 at 2:13 PM Bartosz Golaszewski <brgl@bgdev.pl> wrote:
>
> On Mon, Nov 7, 2022 at 5:10 PM Andy Shevchenko
> <andriy.shevchenko@linux.intel.com> wrote:
> >
> > GPIO library is getting rid of of_node, fwnode should be utilized instead.
> > Prepare of_gpiochip_add() / of_gpiochip_remove() for fwnode.
> >
> > Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> > ---
> >  drivers/gpio/gpiolib-of.c | 10 ++++++----
> >  1 file changed, 6 insertions(+), 4 deletions(-)
> >
> > diff --git a/drivers/gpio/gpiolib-of.c b/drivers/gpio/gpiolib-of.c
> > index be9c34cca322..000020eb78d8 100644
> > --- a/drivers/gpio/gpiolib-of.c
> > +++ b/drivers/gpio/gpiolib-of.c
> > @@ -1104,9 +1104,11 @@ static int of_gpiochip_add_pin_range(struct gpio_chip *chip) { return 0; }
> >
> >  int of_gpiochip_add(struct gpio_chip *chip)
> >  {
> > +       struct device_node *np;
> >         int ret;
> >
> > -       if (!chip->of_node)
> > +       np = to_of_node(chip->fwnode);
> > +       if (!np)
> >                 return 0;
> >
> >         if (!chip->of_xlate) {
> > @@ -1123,18 +1125,18 @@ int of_gpiochip_add(struct gpio_chip *chip)
> >         if (ret)
> >                 return ret;
> >
> > -       of_node_get(chip->of_node);
> > +       fwnode_handle_get(chip->fwnode);
> >
> >         ret = of_gpiochip_scan_gpios(chip);
> >         if (ret)
> > -               of_node_put(chip->of_node);
> > +               fwnode_handle_put(chip->fwnode);
> >
> >         return ret;
> >  }
> >
> >  void of_gpiochip_remove(struct gpio_chip *chip)
> >  {
> > -       of_node_put(chip->of_node);
> > +       fwnode_handle_put(chip->fwnode);
> >  }
> >
> >  void of_gpio_dev_init(struct gpio_chip *gc, struct gpio_device *gdev)
> > --
> > 2.35.1
> >
>
> Applied, thanks!
>
> Bart

I actually applied v2 and both the patches from this series.

Bart

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v1 1/2] gpiolib: of: Prepare of_gpiochip_add() / of_gpiochip_remove() for fwnode
  2022-11-09 13:13   ` Bartosz Golaszewski
@ 2022-11-09 13:23     ` Andy Shevchenko
  0 siblings, 0 replies; 11+ messages in thread
From: Andy Shevchenko @ 2022-11-09 13:23 UTC (permalink / raw)
  To: Bartosz Golaszewski
  Cc: Dmitry Torokhov, linux-gpio, linux-kernel, Linus Walleij

On Wed, Nov 09, 2022 at 02:13:55PM +0100, Bartosz Golaszewski wrote:
> On Wed, Nov 9, 2022 at 2:13 PM Bartosz Golaszewski <brgl@bgdev.pl> wrote:
> > On Mon, Nov 7, 2022 at 5:10 PM Andy Shevchenko
> > <andriy.shevchenko@linux.intel.com> wrote:

...

> > Applied, thanks!
> >
> I actually applied v2 and both the patches from this series.

Thank you!

-- 
With Best Regards,
Andy Shevchenko



^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2022-11-09 13:23 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-11-07 16:10 [PATCH v1 1/2] gpiolib: of: Prepare of_gpiochip_add() / of_gpiochip_remove() for fwnode Andy Shevchenko
2022-11-07 16:10 ` [PATCH v1 2/2] gpiolib: of: Integrate of_gpiochip_init_valid_mask() into gpiochip_init_valid_mask() Andy Shevchenko
2022-11-07 18:20   ` Dmitry Torokhov
2022-11-07 21:09     ` Andy Shevchenko
2022-11-07 21:40       ` Dmitry Torokhov
2022-11-08  8:41         ` Andy Shevchenko
2022-11-08 13:23           ` Andy Shevchenko
2022-11-07 18:14 ` [PATCH v1 1/2] gpiolib: of: Prepare of_gpiochip_add() / of_gpiochip_remove() for fwnode Dmitry Torokhov
2022-11-09 13:13 ` Bartosz Golaszewski
2022-11-09 13:13   ` Bartosz Golaszewski
2022-11-09 13:23     ` Andy Shevchenko

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).