Received: by 2002:a05:6a10:413:0:0:0:0 with SMTP id 19csp2518872pxp; Mon, 21 Mar 2022 23:20:57 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyd4QNO1NZgPZyNuyLvli408ArekyedtRQ3jnqpUqts1RSKdOHX3Tmvx9xG9Vbu8dJTx6an X-Received: by 2002:a17:902:ec83:b0:154:7cee:7722 with SMTP id x3-20020a170902ec8300b001547cee7722mr3748702plg.96.1647930057676; Mon, 21 Mar 2022 23:20:57 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1647930057; cv=none; d=google.com; s=arc-20160816; b=L39FuwGFly+CNPA54ziYVpsm+A5aQTDmz8LrtWyhKurBZQ4lqLC5P/Dx1WgjSGfs7G fGUx204S2j4uZlusAENySZFpynNy+lLjNPiBiNAd+vBTxnjaMHqpD3amLHJEYGTNKQEY 8OuQsjLShS3eIOXxMI6jcmMNoJmsmyfIwpecC8kY6iQ3ycxKmYnQokAgmm7nZkIURaPs wiynMVsGsp3/zy7hPV/UJyw52fqMz1QQfxFkloIm9MVAl+JwFAaUgOz9mEb3wIAAUqpB igf+mzeF/BJydVpj4OknnCT6tqK5ONTVmLqVY+dIYieMXrq2GALSnCP1Lckr4oZqCXln Oycw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:message-id:date:subject:cc:to:from; bh=r+GioQx3R9jJi/DjMx0DqDWtFo8qDY4A+EK6ADVcyQs=; b=Yl+GJqXXzg/JLez+2JgZbKwqWU4tuJZ4gQCfnM60MK8tuHTks5FnEW0o8CK3qHn1za vt7VBj2uNj9BRBc4pLrlqx//RIvLR2UrfsLHj8jCVthk+hKKhII+tXr2th5Wj5/xiDtA h6DYTv3bS8LsU2y0NTWOy1cOVrWzk5RUqCQT3TnrvAlWNIDQudtteKesXrnjmJgXXFId LBvyYJJ38NdKjEvY7vWjBnGT8PNFQnfABB0xUzKLtGi0o289lvq6j5JXemiRcKknnqKH f9+4ZK71NhGqYdCL7wHKoqXBJ+TewUngffTDnuXbXXb4XAt/8RNyZz2+HMHLCJ/eNe6g DZIw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=nxp.com Return-Path: Received: from lindbergh.monkeyblade.net (lindbergh.monkeyblade.net. [2620:137:e000::1:18]) by mx.google.com with ESMTPS id y4-20020a63ce04000000b003842921930bsi1234887pgf.808.2022.03.21.23.20.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 21 Mar 2022 23:20:57 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) client-ip=2620:137:e000::1:18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=nxp.com Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 1D948BE18; Mon, 21 Mar 2022 22:52:22 -0700 (PDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236791AbiCVFxo (ORCPT + 99 others); Tue, 22 Mar 2022 01:53:44 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:40150 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236783AbiCVFxn (ORCPT ); Tue, 22 Mar 2022 01:53:43 -0400 Received: from inva020.nxp.com (inva020.nxp.com [92.121.34.13]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 982E1FC1; Mon, 21 Mar 2022 22:52:14 -0700 (PDT) Received: from inva020.nxp.com (localhost [127.0.0.1]) by inva020.eu-rdc02.nxp.com (Postfix) with ESMTP id A122E1A13C3; Tue, 22 Mar 2022 06:52:12 +0100 (CET) Received: from aprdc01srsp001v.ap-rdc01.nxp.com (aprdc01srsp001v.ap-rdc01.nxp.com [165.114.16.16]) by inva020.eu-rdc02.nxp.com (Postfix) with ESMTP id 6A3711A13B0; Tue, 22 Mar 2022 06:52:12 +0100 (CET) Received: from localhost.localdomain (shlinux2.ap.freescale.net [10.192.224.44]) by aprdc01srsp001v.ap-rdc01.nxp.com (Postfix) with ESMTP id 38CFA183AD6F; Tue, 22 Mar 2022 13:52:11 +0800 (+08) From: haibo.chen@nxp.com To: linus.walleij@linaro.org, brgl@bgdev.pl, andy.shevchenko@gmail.com Cc: linux-gpio@vger.kernel.org, linux-kernel@vger.kernel.org, linux-imx@nxp.com, haibo.chen@nxp.com Subject: [PATCH v2] gpio: Allow setting gpio device id via device tree alias Date: Tue, 22 Mar 2022 13:40:49 +0800 Message-Id: <1647927649-9907-1-git-send-email-haibo.chen@nxp.com> X-Mailer: git-send-email 2.7.4 X-Virus-Scanned: ClamAV using ClamSMTP X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,RDNS_NONE, SPF_HELO_NONE,T_SCC_BODY_TEXT_LINE autolearn=no 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: X-Mailing-List: linux-kernel@vger.kernel.org From: Haibo Chen For some SoCs which contain different cores, like few ARM A cores and few ARM M cores. Some GPIO controllers like GPIO3/GPIO4/GPIO5 belong to A core domain, some GPIO controllers like GPIO1/GPIO2 belong to M core domain. Linux only cover A cores, without gpio alias, we can get gpiochip0/gpiochip1/gpiochip2 to map the real GPIO3/GPIO4/GPIO5, it's difficult for users to identify this map relation, and hardcode the gpio device index. With gpio alias, we can easily make gpiochip3 map to GPIO3, gpiochip4 map to GPIO4. For GPIO controllers do not claim the alias, it will get one id which larger than all the claimed aliases. Signed-off-by: Haibo Chen --- drivers/gpio/gpiolib.c | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c index 56d090258d62..3d24351a33db 100644 --- a/drivers/gpio/gpiolib.c +++ b/drivers/gpio/gpiolib.c @@ -495,7 +495,7 @@ static void gpiodevice_release(struct device *dev) list_del(&gdev->list); spin_unlock_irqrestore(&gpio_lock, flags); - ida_free(&gpio_ida, gdev->id); + ida_simple_remove(&gpio_ida, gdev->id); kfree_const(gdev->label); kfree(gdev->descs); kfree(gdev); @@ -594,6 +594,7 @@ int gpiochip_add_data_with_key(struct gpio_chip *gc, void *data, unsigned long flags; int base = gc->base; unsigned int i; + int alias_id, first_dynamic; int ret = 0; u32 ngpios; @@ -623,11 +624,20 @@ int gpiochip_add_data_with_key(struct gpio_chip *gc, void *data, */ gdev->dev.fwnode = dev_fwnode(&gdev->dev) ?: fwnode; - gdev->id = ida_alloc(&gpio_ida, GFP_KERNEL); - if (gdev->id < 0) { - ret = gdev->id; - goto err_free_gdev; + alias_id = of_alias_get_id(gdev->dev.of_node, "gpio"); + if (alias_id < 0) { + first_dynamic = of_alias_get_highest_id("gpio"); + if (first_dynamic < 0) + first_dynamic = 0; + else + first_dynamic++; + alias_id = ida_simple_get(&gpio_ida, first_dynamic, 0, GFP_KERNEL); + if (alias_id < 0) { + ret = alias_id; + goto err_free_gdev; + } } + gdev->id = alias_id; ret = dev_set_name(&gdev->dev, GPIOCHIP_NAME "%d", gdev->id); if (ret) @@ -821,7 +831,7 @@ int gpiochip_add_data_with_key(struct gpio_chip *gc, void *data, err_free_dev_name: kfree(dev_name(&gdev->dev)); err_free_ida: - ida_free(&gpio_ida, gdev->id); + ida_simple_remove(&gpio_ida, gdev->id); err_free_gdev: /* failures here can mean systems won't boot... */ if (ret != -EPROBE_DEFER) { -- 2.25.1