Message ID | 20230210145656.71838-2-andriy.shevchenko@linux.intel.com |
---|---|
State | New |
Headers |
Return-Path: <linux-kernel-owner@vger.kernel.org> Delivered-To: ouuuleilei@gmail.com Received: by 2002:adf:eb09:0:0:0:0:0 with SMTP id s9csp998957wrn; Fri, 10 Feb 2023 07:00:19 -0800 (PST) X-Google-Smtp-Source: AK7set/v+h+nz8wQHrxlWJuIBgxHhpYckkqGz0dWufvuIpLElYbBgQjZOs4U0GMz2E3krUT9CU9G X-Received: by 2002:a50:f697:0:b0:4a2:7579:1d9c with SMTP id d23-20020a50f697000000b004a275791d9cmr17158666edn.1.1676041219625; Fri, 10 Feb 2023 07:00:19 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1676041219; cv=none; d=google.com; s=arc-20160816; b=XDANMyQz9cd04HXY61a+ctXCp0G5N8p+jLdYdBqgFkAbNvjTg7MDKMs0TPpxwYRrOW v6WsF1e6zmZm8mmrwHLfksnhnrvAlHaWngSjjxXDJ3J5PBIdSEFr7TvWZidL+cFu0n3X Cd6xHMOx+/7fMP8ZgEiWTZW6t9rwrRWjd644prcnyJ1h/uVeXE0IFNtZTjK83VRrUQQz nFkMoXGow2nddYkJR0vFMi6OuEVGHRYmkRxqbjjlkexxTTGMBR/5Ra5wA7FNgCxONnIA pNms1qK3ZacpfxXu4wo5im9Bxe5v/vacIL7bs9MFDt9Qn4kX+O03tf+EObgBmOikyypv DOCA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=+8NkayhPIKci0o7h0bnKBAGL6iD7hK/TW+2szdOdBnc=; b=suj/6QQPMVxzsnhu1joXUkD4eqUdSuA7ipunh7mPxethVyTC0iHyJV+leCpw3jm08P YdyK4Ibo1Si65ifyyxhjlJChPuzKsLc1Pamj4dtfmCKezumlVTsEMVjz1I10c2H2QYYa /DMakCYVfJACc7Nb0q9z/N+biW0ZqJSBzEO7j/bqJaFEca+/OZtRkw5Dv+6krWOjBDi8 3arp4IJgxit+c0RNrcbNCuQ1iyfD6RBEoVvbvHYbL6ZPNbq/1HeveE00c6oNFoXdb6Xi 8bQza/HGBWZvJsDrW9YSzBiX47vhndWMEzhyaxn5mt5u1y7nuW33ovTKvvWc0ajqY8eX bJIA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=jMwb+tGZ; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id b26-20020a05640202da00b004a0b6e6f506si5719041edx.431.2023.02.10.06.59.55; Fri, 10 Feb 2023 07:00:19 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=jMwb+tGZ; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232509AbjBJO4X (ORCPT <rfc822;ybw1215001957@gmail.com> + 99 others); Fri, 10 Feb 2023 09:56:23 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48368 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232234AbjBJO4W (ORCPT <rfc822;linux-kernel@vger.kernel.org>); Fri, 10 Feb 2023 09:56:22 -0500 Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B91E16C7E0; Fri, 10 Feb 2023 06:56:21 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1676040981; x=1707576981; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=yF1vTEf/Cj8uQR7zMwL8EK6cJrGK3YEQj9wTzr3teZY=; b=jMwb+tGZAL8NsfFwug+rpel8CS6Z/fq183wcwW9Q+bI4zV8qjnHydieQ VJmg1dxtO5dnqvX6226AkrbpLAUPqaAB0vDuI9OfjD+IQGxAV3VJG3B/k PxXj+m/9CPt4I+r1zIx2CB1Q+ZlvGFAcHAtSR4BIYNMFvd7quJk6lzzIz e6RtdrFkK438ldF1H1lKnEevW0CkEmmTBhDqX5odmrRnu0dJtn5YLQGzg ffDJvUylJtaM9ovTsnbIxTJ1dI2y2KdVPmSB/4Py5yPGr26GyhfkFesWW 79VhunVPLAM1OlTK1S3TXU117GLDnON5Aq84U9e+A6bL+oY37AxA+fkby A==; X-IronPort-AV: E=McAfee;i="6500,9779,10617"; a="357836316" X-IronPort-AV: E=Sophos;i="5.97,287,1669104000"; d="scan'208";a="357836316" Received: from orsmga002.jf.intel.com ([10.7.209.21]) by fmsmga101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 10 Feb 2023 06:56:21 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6500,9779,10617"; a="668079982" X-IronPort-AV: E=Sophos;i="5.97,287,1669104000"; d="scan'208";a="668079982" Received: from black.fi.intel.com ([10.237.72.28]) by orsmga002.jf.intel.com with ESMTP; 10 Feb 2023 06:56:18 -0800 Received: by black.fi.intel.com (Postfix, from userid 1003) id DD30F1A6; Fri, 10 Feb 2023 16:56:57 +0200 (EET) From: Andy Shevchenko <andriy.shevchenko@linux.intel.com> To: linux-arm-kernel@lists.infradead.org, linux-gpio@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Ludovic Desroches <ludovic.desroches@microchip.com>, Linus Walleij <linus.walleij@linaro.org>, Nicolas Ferre <nicolas.ferre@microchip.com>, Alexandre Belloni <alexandre.belloni@bootlin.com>, Claudiu Beznea <claudiu.beznea@microchip.com>, Andy Shevchenko <andriy.shevchenko@linux.intel.com> Subject: [PATCH v1 1/5] pinctrl: at91: use devm_kasprintf() to avoid potential leaks (part 2) Date: Fri, 10 Feb 2023 16:56:52 +0200 Message-Id: <20230210145656.71838-2-andriy.shevchenko@linux.intel.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230210145656.71838-1-andriy.shevchenko@linux.intel.com> References: <20230210145656.71838-1-andriy.shevchenko@linux.intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-4.3 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_EF,RCVD_IN_DNSWL_MED, RCVD_IN_MSPIKE_H3,RCVD_IN_MSPIKE_WL,SPF_HELO_NONE,SPF_NONE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: <linux-kernel.vger.kernel.org> X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1757456598102590370?= X-GMAIL-MSGID: =?utf-8?q?1757456598102590370?= |
Series |
pinctrl: at91: Cleanups
|
|
Commit Message
Andy Shevchenko
Feb. 10, 2023, 2:56 p.m. UTC
Use devm_kasprintf() instead of kasprintf() to avoid any potential
leaks. At the moment drivers have no remove functionality hence
there is no need for fixes tag.
While at it, switch to use devm_kasprintf_strarray().
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
drivers/pinctrl/pinctrl-at91.c | 23 +++++++++++++++++------
1 file changed, 17 insertions(+), 6 deletions(-)
Comments
Hi Andy, I love your patch! Perhaps something to improve: [auto build test WARNING on linusw-pinctrl/devel] [also build test WARNING on linusw-pinctrl/for-next next-20230210] [cannot apply to clk/clk-next soc/for-next linus/master v6.2-rc7] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/Andy-Shevchenko/pinctrl-at91-use-devm_kasprintf-to-avoid-potential-leaks-part-2/20230210-225817 base: https://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-pinctrl.git devel patch link: https://lore.kernel.org/r/20230210145656.71838-2-andriy.shevchenko%40linux.intel.com patch subject: [PATCH v1 1/5] pinctrl: at91: use devm_kasprintf() to avoid potential leaks (part 2) config: arm-randconfig-r046-20230210 (https://download.01.org/0day-ci/archive/20230211/202302110336.1P7vM7AU-lkp@intel.com/config) compiler: arm-linux-gnueabi-gcc (GCC) 12.1.0 reproduce (this is a W=1 build): wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # https://github.com/intel-lab-lkp/linux/commit/0562771ccfa099db4361c2e5958ca1685f498cdf git remote add linux-review https://github.com/intel-lab-lkp/linux git fetch --no-tags linux-review Andy-Shevchenko/pinctrl-at91-use-devm_kasprintf-to-avoid-potential-leaks-part-2/20230210-225817 git checkout 0562771ccfa099db4361c2e5958ca1685f498cdf # save the config file mkdir build_dir && cp config build_dir/.config COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross W=1 O=build_dir ARCH=arm olddefconfig COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross W=1 O=build_dir ARCH=arm SHELL=/bin/bash drivers/pinctrl/ If you fix the issue, kindly add following tag where applicable | Reported-by: kernel test robot <lkp@intel.com> | Link: https://lore.kernel.org/oe-kbuild-all/202302110336.1P7vM7AU-lkp@intel.com/ All warnings (new ones prefixed by >>): drivers/pinctrl/pinctrl-at91.c: In function 'at91_pinctrl_probe': drivers/pinctrl/pinctrl-at91.c:1402:22: error: 'names' undeclared (first use in this function) 1402 | if (!names) | ^~~~~ drivers/pinctrl/pinctrl-at91.c:1402:22: note: each undeclared identifier is reported only once for each function it appears in drivers/pinctrl/pinctrl-at91.c: In function 'at91_gpio_probe': >> drivers/pinctrl/pinctrl-at91.c:1889:28: warning: passing argument 1 of 'strreplace' makes pointer from integer without a cast [-Wint-conversion] 1889 | strreplace('-', alias_idx + 'A'); | ^~~ | | | int In file included from include/linux/bitmap.h:11, from include/linux/cpumask.h:12, from include/linux/smp.h:13, from include/linux/lockdep.h:14, from include/linux/mutex.h:17, from include/linux/notifier.h:14, from include/linux/clk.h:14, from drivers/pinctrl/pinctrl-at91.c:8: include/linux/string.h:172:24: note: expected 'char *' but argument is of type 'int' 172 | char *strreplace(char *s, char old, char new); | ~~~~~~^ drivers/pinctrl/pinctrl-at91.c:1889:17: error: too few arguments to function 'strreplace' 1889 | strreplace('-', alias_idx + 'A'); | ^~~~~~~~~~ include/linux/string.h:172:7: note: declared here 172 | char *strreplace(char *s, char old, char new); | ^~~~~~~~~~ vim +/strreplace +1889 drivers/pinctrl/pinctrl-at91.c 1809 1810 static int at91_gpio_probe(struct platform_device *pdev) 1811 { 1812 struct device *dev = &pdev->dev; 1813 struct device_node *np = dev->of_node; 1814 struct at91_gpio_chip *at91_chip = NULL; 1815 struct gpio_chip *chip; 1816 struct pinctrl_gpio_range *range; 1817 int ret = 0; 1818 int irq, i; 1819 int alias_idx = of_alias_get_id(np, "gpio"); 1820 uint32_t ngpio; 1821 char **names; 1822 1823 BUG_ON(alias_idx >= ARRAY_SIZE(gpio_chips)); 1824 if (gpio_chips[alias_idx]) { 1825 ret = -EBUSY; 1826 goto err; 1827 } 1828 1829 irq = platform_get_irq(pdev, 0); 1830 if (irq < 0) { 1831 ret = irq; 1832 goto err; 1833 } 1834 1835 at91_chip = devm_kzalloc(&pdev->dev, sizeof(*at91_chip), GFP_KERNEL); 1836 if (!at91_chip) { 1837 ret = -ENOMEM; 1838 goto err; 1839 } 1840 1841 at91_chip->regbase = devm_platform_ioremap_resource(pdev, 0); 1842 if (IS_ERR(at91_chip->regbase)) { 1843 ret = PTR_ERR(at91_chip->regbase); 1844 goto err; 1845 } 1846 1847 at91_chip->ops = (const struct at91_pinctrl_mux_ops *) 1848 of_match_device(at91_gpio_of_match, &pdev->dev)->data; 1849 at91_chip->pioc_virq = irq; 1850 at91_chip->pioc_idx = alias_idx; 1851 1852 at91_chip->clock = devm_clk_get(&pdev->dev, NULL); 1853 if (IS_ERR(at91_chip->clock)) { 1854 dev_err(&pdev->dev, "failed to get clock, ignoring.\n"); 1855 ret = PTR_ERR(at91_chip->clock); 1856 goto err; 1857 } 1858 1859 ret = clk_prepare_enable(at91_chip->clock); 1860 if (ret) { 1861 dev_err(&pdev->dev, "failed to prepare and enable clock, ignoring.\n"); 1862 goto clk_enable_err; 1863 } 1864 1865 at91_chip->chip = at91_gpio_template; 1866 at91_chip->id = alias_idx; 1867 1868 chip = &at91_chip->chip; 1869 chip->label = dev_name(&pdev->dev); 1870 chip->parent = &pdev->dev; 1871 chip->owner = THIS_MODULE; 1872 chip->base = alias_idx * MAX_NB_GPIO_PER_BANK; 1873 1874 if (!of_property_read_u32(np, "#gpio-lines", &ngpio)) { 1875 if (ngpio >= MAX_NB_GPIO_PER_BANK) 1876 pr_err("at91_gpio.%d, gpio-nb >= %d failback to %d\n", 1877 alias_idx, MAX_NB_GPIO_PER_BANK, MAX_NB_GPIO_PER_BANK); 1878 else 1879 chip->ngpio = ngpio; 1880 } 1881 1882 names = devm_kasprintf_strarray(dev, "pio", chip->ngpio); 1883 if (!names) { 1884 ret = -ENOMEM; 1885 goto clk_enable_err; 1886 } 1887 1888 for (i = 0; i < chip->ngpio; i++) > 1889 strreplace('-', alias_idx + 'A'); 1890 1891 chip->names = (const char *const *)names; 1892 1893 range = &at91_chip->range; 1894 range->name = chip->label; 1895 range->id = alias_idx; 1896 range->pin_base = range->base = range->id * MAX_NB_GPIO_PER_BANK; 1897 1898 range->npins = chip->ngpio; 1899 range->gc = chip; 1900 1901 ret = at91_gpio_of_irq_setup(pdev, at91_chip); 1902 if (ret) 1903 goto gpiochip_add_err; 1904 1905 ret = gpiochip_add_data(chip, at91_chip); 1906 if (ret) 1907 goto gpiochip_add_err; 1908 1909 gpio_chips[alias_idx] = at91_chip; 1910 platform_set_drvdata(pdev, at91_chip); 1911 gpio_banks = max(gpio_banks, alias_idx + 1); 1912 1913 dev_info(&pdev->dev, "at address %p\n", at91_chip->regbase); 1914 1915 return 0; 1916 1917 gpiochip_add_err: 1918 clk_enable_err: 1919 clk_disable_unprepare(at91_chip->clock); 1920 err: 1921 dev_err(&pdev->dev, "Failure %i for GPIO %i\n", ret, alias_idx); 1922 1923 return ret; 1924 } 1925
Hi Andy, I love your patch! Yet something to improve: [auto build test ERROR on linusw-pinctrl/devel] [also build test ERROR on linusw-pinctrl/for-next next-20230210] [cannot apply to clk/clk-next soc/for-next linus/master v6.2-rc7] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/Andy-Shevchenko/pinctrl-at91-use-devm_kasprintf-to-avoid-potential-leaks-part-2/20230210-225817 base: https://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-pinctrl.git devel patch link: https://lore.kernel.org/r/20230210145656.71838-2-andriy.shevchenko%40linux.intel.com patch subject: [PATCH v1 1/5] pinctrl: at91: use devm_kasprintf() to avoid potential leaks (part 2) config: arm-randconfig-r046-20230210 (https://download.01.org/0day-ci/archive/20230211/202302110407.TpDeAlpQ-lkp@intel.com/config) compiler: arm-linux-gnueabi-gcc (GCC) 12.1.0 reproduce (this is a W=1 build): wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # https://github.com/intel-lab-lkp/linux/commit/0562771ccfa099db4361c2e5958ca1685f498cdf git remote add linux-review https://github.com/intel-lab-lkp/linux git fetch --no-tags linux-review Andy-Shevchenko/pinctrl-at91-use-devm_kasprintf-to-avoid-potential-leaks-part-2/20230210-225817 git checkout 0562771ccfa099db4361c2e5958ca1685f498cdf # save the config file mkdir build_dir && cp config build_dir/.config COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross W=1 O=build_dir ARCH=arm olddefconfig COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross W=1 O=build_dir ARCH=arm SHELL=/bin/bash drivers/ If you fix the issue, kindly add following tag where applicable | Reported-by: kernel test robot <lkp@intel.com> | Link: https://lore.kernel.org/oe-kbuild-all/202302110407.TpDeAlpQ-lkp@intel.com/ All errors (new ones prefixed by >>): drivers/pinctrl/pinctrl-at91.c: In function 'at91_pinctrl_probe': >> drivers/pinctrl/pinctrl-at91.c:1402:22: error: 'names' undeclared (first use in this function) 1402 | if (!names) | ^~~~~ drivers/pinctrl/pinctrl-at91.c:1402:22: note: each undeclared identifier is reported only once for each function it appears in drivers/pinctrl/pinctrl-at91.c: In function 'at91_gpio_probe': drivers/pinctrl/pinctrl-at91.c:1889:28: warning: passing argument 1 of 'strreplace' makes pointer from integer without a cast [-Wint-conversion] 1889 | strreplace('-', alias_idx + 'A'); | ^~~ | | | int In file included from include/linux/bitmap.h:11, from include/linux/cpumask.h:12, from include/linux/smp.h:13, from include/linux/lockdep.h:14, from include/linux/mutex.h:17, from include/linux/notifier.h:14, from include/linux/clk.h:14, from drivers/pinctrl/pinctrl-at91.c:8: include/linux/string.h:172:24: note: expected 'char *' but argument is of type 'int' 172 | char *strreplace(char *s, char old, char new); | ~~~~~~^ >> drivers/pinctrl/pinctrl-at91.c:1889:17: error: too few arguments to function 'strreplace' 1889 | strreplace('-', alias_idx + 'A'); | ^~~~~~~~~~ include/linux/string.h:172:7: note: declared here 172 | char *strreplace(char *s, char old, char new); | ^~~~~~~~~~ vim +/names +1402 drivers/pinctrl/pinctrl-at91.c 1372 1373 static int at91_pinctrl_probe(struct platform_device *pdev) 1374 { 1375 struct device *dev = &pdev->dev; 1376 struct at91_pinctrl *info; 1377 struct pinctrl_pin_desc *pdesc; 1378 int ret, i, j, k; 1379 1380 info = devm_kzalloc(&pdev->dev, sizeof(*info), GFP_KERNEL); 1381 if (!info) 1382 return -ENOMEM; 1383 1384 ret = at91_pinctrl_probe_dt(pdev, info); 1385 if (ret) 1386 return ret; 1387 1388 at91_pinctrl_desc.name = dev_name(&pdev->dev); 1389 at91_pinctrl_desc.npins = gpio_banks * MAX_NB_GPIO_PER_BANK; 1390 at91_pinctrl_desc.pins = pdesc = 1391 devm_kcalloc(&pdev->dev, 1392 at91_pinctrl_desc.npins, sizeof(*pdesc), 1393 GFP_KERNEL); 1394 1395 if (!at91_pinctrl_desc.pins) 1396 return -ENOMEM; 1397 1398 for (i = 0, k = 0; i < gpio_banks; i++) { 1399 char **pin_names; 1400 1401 pin_names = devm_kasprintf_strarray(dev, "pio", MAX_NB_GPIO_PER_BANK); > 1402 if (!names) 1403 return -ENOMEM; 1404 1405 for (j = 0; j < MAX_NB_GPIO_PER_BANK; j++, k++) { 1406 char *pin_name = pin_names[j]; 1407 1408 strreplace(pin_name, '-', i + 'A'); 1409 1410 pdesc->number = k; 1411 pdesc->name = pin_name; 1412 pdesc++; 1413 } 1414 } 1415 1416 platform_set_drvdata(pdev, info); 1417 info->pctl = devm_pinctrl_register(&pdev->dev, &at91_pinctrl_desc, 1418 info); 1419 1420 if (IS_ERR(info->pctl)) { 1421 dev_err(&pdev->dev, "could not register AT91 pinctrl driver\n"); 1422 return PTR_ERR(info->pctl); 1423 } 1424 1425 /* We will handle a range of GPIO pins */ 1426 for (i = 0; i < gpio_banks; i++) 1427 if (gpio_chips[i]) 1428 pinctrl_add_gpio_range(info->pctl, &gpio_chips[i]->range); 1429 1430 dev_info(&pdev->dev, "initialized AT91 pinctrl driver\n"); 1431 1432 return 0; 1433 } 1434
diff --git a/drivers/pinctrl/pinctrl-at91.c b/drivers/pinctrl/pinctrl-at91.c index 735c501e7a06..bb93d8bcfd08 100644 --- a/drivers/pinctrl/pinctrl-at91.c +++ b/drivers/pinctrl/pinctrl-at91.c @@ -18,6 +18,7 @@ #include <linux/pm.h> #include <linux/seq_file.h> #include <linux/slab.h> +#include <linux/string_helpers.h> /* Since we request GPIOs from ourself */ #include <linux/pinctrl/consumer.h> @@ -1371,6 +1372,7 @@ static int at91_pinctrl_probe_dt(struct platform_device *pdev, static int at91_pinctrl_probe(struct platform_device *pdev) { + struct device *dev = &pdev->dev; struct at91_pinctrl *info; struct pinctrl_pin_desc *pdesc; int ret, i, j, k; @@ -1394,9 +1396,19 @@ static int at91_pinctrl_probe(struct platform_device *pdev) return -ENOMEM; for (i = 0, k = 0; i < gpio_banks; i++) { + char **pin_names; + + pin_names = devm_kasprintf_strarray(dev, "pio", MAX_NB_GPIO_PER_BANK); + if (!names) + return -ENOMEM; + for (j = 0; j < MAX_NB_GPIO_PER_BANK; j++, k++) { + char *pin_name = pin_names[j]; + + strreplace(pin_name, '-', i + 'A'); + pdesc->number = k; - pdesc->name = kasprintf(GFP_KERNEL, "pio%c%d", i + 'A', j); + pdesc->name = pin_name; pdesc++; } } @@ -1797,7 +1809,8 @@ static const struct of_device_id at91_gpio_of_match[] = { static int at91_gpio_probe(struct platform_device *pdev) { - struct device_node *np = pdev->dev.of_node; + struct device *dev = &pdev->dev; + struct device_node *np = dev->of_node; struct at91_gpio_chip *at91_chip = NULL; struct gpio_chip *chip; struct pinctrl_gpio_range *range; @@ -1866,16 +1879,14 @@ static int at91_gpio_probe(struct platform_device *pdev) chip->ngpio = ngpio; } - names = devm_kcalloc(&pdev->dev, chip->ngpio, sizeof(char *), - GFP_KERNEL); - + names = devm_kasprintf_strarray(dev, "pio", chip->ngpio); if (!names) { ret = -ENOMEM; goto clk_enable_err; } for (i = 0; i < chip->ngpio; i++) - names[i] = devm_kasprintf(&pdev->dev, GFP_KERNEL, "pio%c%d", alias_idx + 'A', i); + strreplace('-', alias_idx + 'A'); chip->names = (const char *const *)names;