Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'net-use-new-gpio-line-value-setter-callbacks'

Bartosz Golaszewski says:

====================
net: use new GPIO line value setter callbacks

Commit 98ce1eb1fd87e ("gpiolib: introduce gpio_chip setters that return
values") added new line setter callbacks to struct gpio_chip. They allow
to indicate failures to callers. We're in the process of converting all
GPIO controllers to using them before removing the old ones. This series
converts all GPIO chips implemented under drivers/net/.

v1: https://lore.kernel.org/20250610-gpiochip-set-rv-net-v1-0-35668dd1c76f@linaro.org
====================

Link: https://patch.msgid.link/20250616-gpiochip-set-rv-net-v2-0-cae0b182a552@linaro.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

+41 -25
+25 -12
drivers/net/can/spi/mcp251x.c
··· 388 388 mcp251x_spi_write(spi, 4); 389 389 } 390 390 391 - static void mcp251x_write_bits(struct spi_device *spi, u8 reg, 392 - u8 mask, u8 val) 391 + static int mcp251x_write_bits(struct spi_device *spi, u8 reg, 392 + u8 mask, u8 val) 393 393 { 394 394 struct mcp251x_priv *priv = spi_get_drvdata(spi); 395 395 ··· 398 398 priv->spi_tx_buf[2] = mask; 399 399 priv->spi_tx_buf[3] = val; 400 400 401 - mcp251x_spi_write(spi, 4); 401 + return mcp251x_spi_write(spi, 4); 402 402 } 403 403 404 404 static u8 mcp251x_read_stat(struct spi_device *spi) ··· 441 441 unsigned int offset) 442 442 { 443 443 struct mcp251x_priv *priv = gpiochip_get_data(chip); 444 + int ret; 444 445 u8 val; 445 446 446 447 /* nothing to be done for inputs */ ··· 451 450 val = BFPCTRL_BFE(offset - MCP251X_GPIO_RX0BF); 452 451 453 452 mutex_lock(&priv->mcp_lock); 454 - mcp251x_write_bits(priv->spi, BFPCTRL, val, val); 453 + ret = mcp251x_write_bits(priv->spi, BFPCTRL, val, val); 455 454 mutex_unlock(&priv->mcp_lock); 455 + if (ret) 456 + return ret; 456 457 457 458 priv->reg_bfpctrl |= val; 458 459 ··· 533 530 return 0; 534 531 } 535 532 536 - static void mcp251x_gpio_set(struct gpio_chip *chip, unsigned int offset, 537 - int value) 533 + static int mcp251x_gpio_set(struct gpio_chip *chip, unsigned int offset, 534 + int value) 538 535 { 539 536 struct mcp251x_priv *priv = gpiochip_get_data(chip); 540 537 u8 mask, val; 538 + int ret; 541 539 542 540 mask = BFPCTRL_BFS(offset - MCP251X_GPIO_RX0BF); 543 541 val = value ? mask : 0; 544 542 545 543 mutex_lock(&priv->mcp_lock); 546 - mcp251x_write_bits(priv->spi, BFPCTRL, mask, val); 544 + ret = mcp251x_write_bits(priv->spi, BFPCTRL, mask, val); 547 545 mutex_unlock(&priv->mcp_lock); 546 + if (ret) 547 + return ret; 548 548 549 549 priv->reg_bfpctrl &= ~mask; 550 550 priv->reg_bfpctrl |= val; 551 + 552 + return 0; 551 553 } 552 554 553 - static void 555 + static int 554 556 mcp251x_gpio_set_multiple(struct gpio_chip *chip, 555 557 unsigned long *maskp, unsigned long *bitsp) 556 558 { 557 559 struct mcp251x_priv *priv = gpiochip_get_data(chip); 558 560 u8 mask, val; 561 + int ret; 559 562 560 563 mask = FIELD_GET(MCP251X_GPIO_OUTPUT_MASK, maskp[0]); 561 564 mask = FIELD_PREP(BFPCTRL_BFS_MASK, mask); ··· 570 561 val = FIELD_PREP(BFPCTRL_BFS_MASK, val); 571 562 572 563 if (!mask) 573 - return; 564 + return 0; 574 565 575 566 mutex_lock(&priv->mcp_lock); 576 - mcp251x_write_bits(priv->spi, BFPCTRL, mask, val); 567 + ret = mcp251x_write_bits(priv->spi, BFPCTRL, mask, val); 577 568 mutex_unlock(&priv->mcp_lock); 569 + if (ret) 570 + return ret; 578 571 579 572 priv->reg_bfpctrl &= ~mask; 580 573 priv->reg_bfpctrl |= val; 574 + 575 + return 0; 581 576 } 582 577 583 578 static void mcp251x_gpio_restore(struct spi_device *spi) ··· 607 594 gpio->get_direction = mcp251x_gpio_get_direction; 608 595 gpio->get = mcp251x_gpio_get; 609 596 gpio->get_multiple = mcp251x_gpio_get_multiple; 610 - gpio->set = mcp251x_gpio_set; 611 - gpio->set_multiple = mcp251x_gpio_set_multiple; 597 + gpio->set_rv = mcp251x_gpio_set; 598 + gpio->set_multiple_rv = mcp251x_gpio_set_multiple; 612 599 gpio->base = -1; 613 600 gpio->ngpio = ARRAY_SIZE(mcp251x_gpio_names); 614 601 gpio->names = mcp251x_gpio_names;
+4 -2
drivers/net/dsa/mt7530.c
··· 2112 2112 return !!(mt7530_read(priv, MT7530_LED_GPIO_DATA) & bit); 2113 2113 } 2114 2114 2115 - static void 2115 + static int 2116 2116 mt7530_gpio_set(struct gpio_chip *gc, unsigned int offset, int value) 2117 2117 { 2118 2118 struct mt7530_priv *priv = gpiochip_get_data(gc); ··· 2122 2122 mt7530_set(priv, MT7530_LED_GPIO_DATA, bit); 2123 2123 else 2124 2124 mt7530_clear(priv, MT7530_LED_GPIO_DATA, bit); 2125 + 2126 + return 0; 2125 2127 } 2126 2128 2127 2129 static int ··· 2187 2185 gc->direction_input = mt7530_gpio_direction_input; 2188 2186 gc->direction_output = mt7530_gpio_direction_output; 2189 2187 gc->get = mt7530_gpio_get; 2190 - gc->set = mt7530_gpio_set; 2188 + gc->set_rv = mt7530_gpio_set; 2191 2189 gc->base = -1; 2192 2190 gc->ngpio = 15; 2193 2191 gc->can_sleep = true;
+5 -5
drivers/net/dsa/vitesse-vsc73xx-core.c
··· 2258 2258 return !!(val & BIT(offset)); 2259 2259 } 2260 2260 2261 - static void vsc73xx_gpio_set(struct gpio_chip *chip, unsigned int offset, 2262 - int val) 2261 + static int vsc73xx_gpio_set(struct gpio_chip *chip, unsigned int offset, 2262 + int val) 2263 2263 { 2264 2264 struct vsc73xx *vsc = gpiochip_get_data(chip); 2265 2265 u32 tmp = val ? BIT(offset) : 0; 2266 2266 2267 - vsc73xx_update_bits(vsc, VSC73XX_BLOCK_SYSTEM, 0, 2268 - VSC73XX_GPIO, BIT(offset), tmp); 2267 + return vsc73xx_update_bits(vsc, VSC73XX_BLOCK_SYSTEM, 0, 2268 + VSC73XX_GPIO, BIT(offset), tmp); 2269 2269 } 2270 2270 2271 2271 static int vsc73xx_gpio_direction_output(struct gpio_chip *chip, ··· 2317 2317 vsc->gc.parent = vsc->dev; 2318 2318 vsc->gc.base = -1; 2319 2319 vsc->gc.get = vsc73xx_gpio_get; 2320 - vsc->gc.set = vsc73xx_gpio_set; 2320 + vsc->gc.set_rv = vsc73xx_gpio_set; 2321 2321 vsc->gc.direction_input = vsc73xx_gpio_direction_input; 2322 2322 vsc->gc.direction_output = vsc73xx_gpio_direction_output; 2323 2323 vsc->gc.get_direction = vsc73xx_gpio_get_direction;
+7 -6
drivers/net/phy/qcom/qca807x.c
··· 377 377 return FIELD_GET(QCA807X_GPIO_FORCE_MODE_MASK, val); 378 378 } 379 379 380 - static void qca807x_gpio_set(struct gpio_chip *gc, unsigned int offset, int value) 380 + static int qca807x_gpio_set(struct gpio_chip *gc, unsigned int offset, int value) 381 381 { 382 382 struct qca807x_gpio_priv *priv = gpiochip_get_data(gc); 383 383 u16 reg; ··· 386 386 reg = QCA807X_MMD7_LED_FORCE_CTRL(offset); 387 387 388 388 val = phy_read_mmd(priv->phy, MDIO_MMD_AN, reg); 389 + if (val < 0) 390 + return val; 391 + 389 392 val &= ~QCA807X_GPIO_FORCE_MODE_MASK; 390 393 val |= QCA807X_GPIO_FORCE_EN; 391 394 val |= FIELD_PREP(QCA807X_GPIO_FORCE_MODE_MASK, value); 392 395 393 - phy_write_mmd(priv->phy, MDIO_MMD_AN, reg, val); 396 + return phy_write_mmd(priv->phy, MDIO_MMD_AN, reg, val); 394 397 } 395 398 396 399 static int qca807x_gpio_dir_out(struct gpio_chip *gc, unsigned int offset, int value) 397 400 { 398 - qca807x_gpio_set(gc, offset, value); 399 - 400 - return 0; 401 + return qca807x_gpio_set(gc, offset, value); 401 402 } 402 403 403 404 static int qca807x_gpio(struct phy_device *phydev) ··· 426 425 gc->get_direction = qca807x_gpio_get_direction; 427 426 gc->direction_output = qca807x_gpio_dir_out; 428 427 gc->get = qca807x_gpio_get; 429 - gc->set = qca807x_gpio_set; 428 + gc->set_rv = qca807x_gpio_set; 430 429 431 430 return devm_gpiochip_add_data(dev, gc, priv); 432 431 }