On Tue, Nov 15, 2022 at 12:18:00PM +0100, Marijn Suijten wrote: > On 2022-11-14 16:15:25, Brian Masney wrote: > > On Fri, Nov 11, 2022 at 12:37:32PM +0100, Thierry Reding wrote: > > > From: Thierry Reding > > > > > > The OF node store in chip->fwnode is used to explicitly override the FW > > > node for a GPIO chip. For chips that use the default FW node (i.e. that > > > of their parent device), this will be NULL and cause the chip not to be > > > fully registered. > > > > > > Instead, use the GPIO device's FW node, which is set to either the node > > > of the parent device or the explicit override in chip->fwnode. > > > > > > Fixes: 8afe82550240 ("gpiolib: of: Prepare of_gpiochip_add() / of_gpiochip_remove() for fwnode") > > > Tested-by: Marek Szyprowski > > > Signed-off-by: Thierry Reding > > > > Reviewed-by: Brian Masney > > Tested-by: Brian Masney > > > > I separately sent a similar type of patch to fix the same issue today: > > https://lore.kernel.org/linux-arm-msm/20221114202943.2389489-1-bmasney@redhat.com/T/#u > > For completeness, your linked patch fixes a synchronous external abort > on multiple Qualcomm platforms pointed out in [1]. This patch however > does not, are you sure they fix the exact same issue? > > [1]: https://lore.kernel.org/linux-arm-msm/20221115110800.35gl3j43lmbxm3jb@SoMainline.org/ Can you check if the below fixes the MSM issue that you're seeing (applied on top of my earlier patch, though with Brian's reverted temporarily)? Thanks, Thierry --- >8 --- diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c index 11fb7ec883e9..d692ad5c5a27 100644 --- a/drivers/gpio/gpiolib.c +++ b/drivers/gpio/gpiolib.c @@ -447,10 +447,11 @@ static unsigned long *gpiochip_allocate_mask(struct gpio_chip *gc) static unsigned int gpiochip_count_reserved_ranges(struct gpio_chip *gc) { + struct fwnode_handle *fwnode = dev_fwnode(&gc->gpiodev->dev); int size; /* Format is "start, count, ..." */ - size = fwnode_property_count_u32(gc->fwnode, "gpio-reserved-ranges"); + size = fwnode_property_count_u32(fwnode, "gpio-reserved-ranges"); if (size > 0 && size % 2 == 0) return size; @@ -471,6 +472,7 @@ static int gpiochip_alloc_valid_mask(struct gpio_chip *gc) static int gpiochip_apply_reserved_ranges(struct gpio_chip *gc) { + struct fwnode_handle *fwnode = dev_fwnode(&gc->gpiodev->dev); unsigned int size; u32 *ranges; int ret; @@ -483,7 +485,7 @@ static int gpiochip_apply_reserved_ranges(struct gpio_chip *gc) if (!ranges) return -ENOMEM; - ret = fwnode_property_read_u32_array(gc->fwnode, "gpio-reserved-ranges", ranges, size); + ret = fwnode_property_read_u32_array(fwnode, "gpio-reserved-ranges", ranges, size); if (ret) { kfree(ranges); return ret; --- >8 ---