Message ID | 20240823034314.62305-5-ye.zhang@rock-chips.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | [v2] gpio: rockchip: resolve underflow issue | expand |
On Fri, Aug 23, 2024 at 11:43:07AM +0800, Ye Zhang wrote: > div_reg may be < 0 if debounce is zero, causing the unsigned int to > overflow. ... > - if (bank->gpio_type == GPIO_TYPE_V2 && !IS_ERR(bank->db_clk)) { > - div_debounce_support = true; Wouldn't be cleaner (from the patch perspective) to simply move else branch here? else div_debounce_support = false; > + div_debounce_support = (bank->gpio_type == GPIO_TYPE_V2) && !IS_ERR(bank->db_clk); > + if (debounce && div_debounce_support) { > freq = clk_get_rate(bank->db_clk); > if (!freq) > return -EINVAL; > @@ -216,8 +216,6 @@ static int rockchip_gpio_set_debounce(struct gpio_chip *gc, > > div = (u64)debounce * freq; > div_reg = DIV_ROUND_CLOSEST_ULL(div, 2 * USEC_PER_SEC) - 1; > - } else { > - div_debounce_support = false; > }
diff --git a/drivers/gpio/gpio-rockchip.c b/drivers/gpio/gpio-rockchip.c index bf22b103b6a2..c3a87d075908 100644 --- a/drivers/gpio/gpio-rockchip.c +++ b/drivers/gpio/gpio-rockchip.c @@ -204,8 +204,8 @@ static int rockchip_gpio_set_debounce(struct gpio_chip *gc, unsigned int cur_div_reg; u64 div; - if (bank->gpio_type == GPIO_TYPE_V2 && !IS_ERR(bank->db_clk)) { - div_debounce_support = true; + div_debounce_support = (bank->gpio_type == GPIO_TYPE_V2) && !IS_ERR(bank->db_clk); + if (debounce && div_debounce_support) { freq = clk_get_rate(bank->db_clk); if (!freq) return -EINVAL; @@ -216,8 +216,6 @@ static int rockchip_gpio_set_debounce(struct gpio_chip *gc, div = (u64)debounce * freq; div_reg = DIV_ROUND_CLOSEST_ULL(div, 2 * USEC_PER_SEC) - 1; - } else { - div_debounce_support = false; } raw_spin_lock_irqsave(&bank->slock, flags);
div_reg may be < 0 if debounce is zero, causing the unsigned int to overflow. Fixes: 3bcbd1a85b68 ("gpio/rockchip: support next version gpio controller") Signed-off-by: Ye Zhang <ye.zhang@rock-chips.com> --- drivers/gpio/gpio-rockchip.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-)