--- /dev/null
+From patchwork Tue Apr 23 12:12:33 2024
+Content-Type: text/plain; charset="utf-8"
+MIME-Version: 1.0
+Content-Transfer-Encoding: 7bit
+X-Patchwork-Id: 1926515
+Return-Path:
+ <linux-gpio+bounces-5755-incoming=patchwork.ozlabs.org@vger.kernel.org>
+Authentication-Results: legolas.ozlabs.org;
+ dkim=pass (2048-bit key;
+ header.s=google header.b=qX99TQMM;
+ dkim-atps=neutral
+Authentication-Results: legolas.ozlabs.org;
+ spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org
+ (client-ip=2604:1380:45e3:2400::1; helo=sv.mirrors.kernel.org;
+ envelope-from=linux-gpio+bounces-5755-incoming=patchwork.ozlabs.org@vger.kernel.org;
+ receiver=patchwork.ozlabs.org)
+Received: from sv.mirrors.kernel.org (sv.mirrors.kernel.org
+ [IPv6:2604:1380:45e3:2400::1])
+ (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)
+ key-exchange X25519 server-signature ECDSA (secp384r1))
+ (No client certificate requested)
+ by legolas.ozlabs.org (Postfix) with ESMTPS id 4VP1Gc6RZKz1yZP
+Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org
+ [52.25.139.140])
+ (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
+ (No client certificate requested)
+ by sv.mirrors.kernel.org (Postfix) with ESMTPS id 5BB9C28522A
+Received: from localhost.localdomain (localhost.localdomain [127.0.0.1])
+ by smtp.subspace.kernel.org (Postfix) with ESMTP id 2F83B8563D;
+ Tue, 23 Apr 2024 12:12:41 +0000 (UTC)
+Authentication-Results: smtp.subspace.kernel.org;
+ header.b="qX99TQMM"
+Received: from mail-lj1-f179.google.com (mail-lj1-f179.google.com
+ [209.85.208.179])
+ (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits))
+ (No client certificate requested)
+ by smtp.subspace.kernel.org (Postfix) with ESMTPS id A8F3C82865
+Authentication-Results: smtp.subspace.kernel.org;
+ arc=none smtp.client-ip=209.85.208.179
+ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;
+ t=1713874361; cv=none;
+ b=d6RcvcAu8hBYAK8Io489ZHQpJVXPwuokP6iMcAkbvElCerbXD6jAdqdi+RjDlo5C49GHGO4FQ19UwQn/VE//qSwiK1ulTSBp3OkvAmyb7yYAFnDs9AVNWRw+5/NxeFNn3fj5PyvqVymIbaJKabfrOVNwkz/5JMHxEIJtr6Crmog=
+ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org;
+ s=arc-20240116; t=1713874361; c=relaxed/simple;
+ bh=0eXJ5AIjzz1TBGZ8SlshIPrEHZaZwZfYEdof+dSpu4Y=;
+ h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:To:Cc;
+ b=EfFtruUxRIGy+jylEiJ2rPEyPCjGCc8ptT9FVxe6s0O/kW38Y6196xVQeiSV2tSKVCEOIO+9HoqmpgdKsJE7gU9++EcrasP96MYpsklYpc2zsWW3b8QEhfxfZ9Ai/idyYihE2u9dQ7a143P/Ij/twDrZTt24wO/mtHDrE5XcCFI=
+ARC-Authentication-Results: i=1; smtp.subspace.kernel.org;
+ dmarc=pass (p=none dis=none) header.from=linaro.org;
+ spf=pass smtp.mailfrom=linaro.org;
+ header.b=qX99TQMM; arc=none smtp.client-ip=209.85.208.179
+Authentication-Results: smtp.subspace.kernel.org;
+ dmarc=pass (p=none dis=none) header.from=linaro.org
+Authentication-Results: smtp.subspace.kernel.org;
+ spf=pass smtp.mailfrom=linaro.org
+Received: by mail-lj1-f179.google.com with SMTP id
+ 38308e7fff4ca-2dd041acff1so40839131fa.1
+ Tue, 23 Apr 2024 05:12:37 -0700 (PDT)
+DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
+ d=linaro.org; s=google; t=1713874356; x=1714479156;
+ darn=vger.kernel.org;
+ h=cc:to:message-id:content-transfer-encoding:mime-version:subject
+ :date:from:from:to:cc:subject:date:message-id:reply-to;
+ bh=vysJsMiH5IVqdTs4yMwZxZ7nUmt2aG7eBhkn8qm8hvI=;
+ b=qX99TQMMdHbskFYUaw8c93sIJsUhKmj/WPdyahHcupUhwn5wol4aVoPczkOKYwJZhE
+ eoInxzjAHIl3UNKyvPPrD4MrbLcSoFT6mTFMsgRQYUghsLattmGcqIebu9XT556dBhsf
+ DydmpqGgnTOIa+IEknFxg24mo8Xn2LVmDC7LSGEYykUy1xLHd1NSq56YEaYXC7641xeZ
+ 9TOL0rZszeGld5cCS3013EmEeXQGCC3lAP83Eb48vbFXjPojkN0s40rZ2s8YpVsGT0iP
+ LeLVtP/E8XJqi4YipKryKSgbgOvQ1Bclle5+s+2qcJQNnSEjekMwR59BIRs3OZH2SRfN
+ gQdQ==
+X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
+ d=1e100.net; s=20230601; t=1713874356; x=1714479156;
+ h=cc:to:message-id:content-transfer-encoding:mime-version:subject
+ :date:from:x-gm-message-state:from:to:cc:subject:date:message-id
+ :reply-to;
+ bh=vysJsMiH5IVqdTs4yMwZxZ7nUmt2aG7eBhkn8qm8hvI=;
+ b=jEBH4NQ7SzFi2tnb1lgL06IchnBJoscNgKesjlorvou6X/9wDE/VbgxNFKR0zWwdTk
+ BEjG/ifFJxLmM9jdaCKu5cJc4yiDNXp7yZd48D71V34zJ4aINAGAx4hcOKqf95neFknx
+ nsFPpBFnTYFEpCLF0TebVoL6h6ehPzSojmkArzsrMppNvW2cwJ5gDlkqy2y4SezLanmM
+ 6iU0ksnwE0bb2iLkahhgo00Ejt33yqxwa+3xBfhOe9oYKSSZYnY7qVq055SSwt9IAq+H
+ REGyJN+GrvupTHagiioYe3LPXDPdOui9ZixXXDllw1t1yGUy+TkJu8xSqtvHEfg81FHP
+ AxtA==
+X-Forwarded-Encrypted: i=1;
+ AJvYcCUbxzPklfPYrLgyY1I0ycuj7Dh04dcGVonYocA2mzxzlAEV107o0ELlFqr3O9Td+tV/t0eV9ly9YAbTY6n1XPnFXS5dsYYAZw6RHw==
+X-Gm-Message-State: AOJu0YxsC7zdakTzntbiRFnN2A7yTrR0x+IpR6ce6eGn5kHeqIBi1km+
+ zTVpRulbch3JsmzVDbCbbAAYoBkNgEA568YL6zdjVARnvFwNz1cqatOrR1AXUm0=
+X-Google-Smtp-Source:
+ AGHT+IHBRMGvaJM98f86Z6m/RfVhK2XejjNGF3EvcRq/4x3oGM0DKpd2PbeCJdgmzHjLPVVbdsNzJg==
+X-Received: by 2002:a2e:9852:0:b0:2d8:a98d:18e with SMTP id
+ e18-20020a2e9852000000b002d8a98d018emr7955886ljj.8.1713874355700;
+ Tue, 23 Apr 2024 05:12:35 -0700 (PDT)
+Received: from [192.168.1.140] ([85.235.12.238])
+ by smtp.gmail.com with ESMTPSA id
+ x6-20020a2e7c06000000b002da179d8d25sm1628982ljc.64.2024.04.23.05.12.33
+ (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);
+ Tue, 23 Apr 2024 05:12:35 -0700 (PDT)
+Date: Tue, 23 Apr 2024 14:12:33 +0200
+Subject: [PATCH v2] wifi: ath9k: Obtain system GPIOS from descriptors
+Precedence: bulk
+List-Id: <linux-gpio.vger.kernel.org>
+MIME-Version: 1.0
+X-B4-Tracking: v=1; b=H4sIALClJ2YC/22Nyw6CMBBFf4XM2hpanrLyPwyL0o4wCaFkxqCG9
+ N+txKXLc5Nz7g6CTCjQZTswbiQUlgTmlIGb7DKiIp8YTG7KXBujPIpjWh+BRT2JcUYRNbTeXir
+ v7FBUkNSV8U6vI3vrE08kSXgfL5v+rr9gof8HN61yhdo1rvJ125T1dabFcjgHHqGPMX4Ao4iiN
+ LkAAAA=
+X-Mailer: b4 0.13.0
+
+The ath9k has an odd use of system-wide GPIOs: if the chip
+does not have internal GPIO capability, it will try to obtain a
+GPIO line from the system GPIO controller:
+
+ if (BIT(gpio) & ah->caps.gpio_mask)
+ ath9k_hw_gpio_cfg_wmac(...);
+ else if (AR_SREV_SOC(ah))
+ ath9k_hw_gpio_cfg_soc(ah, gpio, out, label);
+
+Where ath9k_hw_gpio_cfg_soc() will attempt to issue
+gpio_request_one() passing the local GPIO number of the controller
+(0..31) to gpio_request_one().
+
+This is somewhat peculiar and possibly even dangerous: there is
+nowadays no guarantee of the numbering of these system-wide
+GPIOs, and assuming that GPIO 0..31 as used by ath9k would
+correspond to GPIOs 0..31 on the system as a whole seems a bit
+wild.
+
+Register all 32 GPIOs at index 0..31 directly in the ATH79K
+GPIO driver and associate with WIFI if and only if we are probing
+ATH79K wifi from the AHB bus (used for SoCs).
+
+---
+Changes in v2:
+- Define all the descriptors directly in the ATH79K
+ GPIO driver in case the driver want to request them directly.
+---
+ drivers/net/wireless/ath/ath9k/hw.c | 29 ++++++++++++-----------
+ drivers/net/wireless/ath/ath9k/hw.h | 3 ++-
+ 2 files changed, 32 insertions(+), 15 deletions(-)
+
+
+---
+base-commit: 4cece764965020c22cff7665b18a012006359095
+change-id: 20240122-descriptors-wireless-b8da95dcab35
+
+Best regards,
+
+--- a/drivers/net/wireless/ath/ath9k/hw.c
++++ b/drivers/net/wireless/ath/ath9k/hw.c
+@@ -20,7 +20,7 @@
+ #include <linux/time.h>
+ #include <linux/bitops.h>
+ #include <linux/etherdevice.h>
+-#include <linux/gpio.h>
++#include <linux/gpio/consumer.h>
+ #include <linux/unaligned.h>
+
+ #include "hw.h"
+@@ -2727,19 +2727,25 @@ static void ath9k_hw_gpio_cfg_output_mux
+ static void ath9k_hw_gpio_cfg_soc(struct ath_hw *ah, u32 gpio, bool out,
+ const char *label)
+ {
++ enum gpiod_flags flags = out ? GPIOD_OUT_LOW : GPIOD_IN;
++ struct gpio_desc *gpiod;
+ int err;
+
+- if (ah->caps.gpio_requested & BIT(gpio))
++ if (ah->gpiods[gpio])
+ return;
+
+- err = devm_gpio_request_one(ah->dev, gpio, out ? GPIOF_OUT_INIT_LOW : GPIOF_IN, label);
+- if (err) {
++ /* Obtains a system specific GPIO descriptor from another GPIO controller */
++ gpiod = gpiod_get_index(NULL, "ath9k", gpio, flags);
++
++ if (IS_ERR(gpiod)) {
++ err = PTR_ERR(gpiod);
+ ath_err(ath9k_hw_common(ah), "request GPIO%d failed:%d\n",
+ gpio, err);
+ return;
+ }
+
+- ah->caps.gpio_requested |= BIT(gpio);
++ gpiod_set_consumer_name(gpiod, label);
++ ah->gpiods[gpio] = gpiod;
+ }
+
+ static void ath9k_hw_gpio_cfg_wmac(struct ath_hw *ah, u32 gpio, bool out,
+@@ -2801,8 +2807,10 @@ void ath9k_hw_gpio_free(struct ath_hw *a
+
+ WARN_ON(gpio >= ah->caps.num_gpio_pins);
+
+- if (ah->caps.gpio_requested & BIT(gpio))
+- ah->caps.gpio_requested &= ~BIT(gpio);
++ if (ah->gpiods[gpio]) {
++ gpiod_put(ah->gpiods[gpio]);
++ ah->gpiods[gpio] = NULL;
++ }
+ }
+ EXPORT_SYMBOL(ath9k_hw_gpio_free);
+
+@@ -2830,8 +2838,8 @@ u32 ath9k_hw_gpio_get(struct ath_hw *ah,
+ val = REG_READ(ah, AR_GPIO_IN(ah)) & BIT(gpio);
+ else
+ val = MS_REG_READ(AR, gpio);
+- } else if (BIT(gpio) & ah->caps.gpio_requested) {
+- val = gpio_get_value(gpio) & BIT(gpio);
++ } else if (ah->gpiods[gpio]) {
++ val = gpiod_get_value(ah->gpiods[gpio]);
+ } else {
+ WARN_ON(1);
+ }
+@@ -2854,8 +2862,8 @@ void ath9k_hw_set_gpio(struct ath_hw *ah
+ AR7010_GPIO_OUT : AR_GPIO_IN_OUT(ah);
+
+ REG_RMW(ah, out_addr, val << gpio, BIT(gpio));
+- } else if (BIT(gpio) & ah->caps.gpio_requested) {
+- gpio_set_value(gpio, val);
++ } else if (ah->gpiods[gpio]) {
++ gpiod_set_value(ah->gpiods[gpio], val);
+ } else {
+ WARN_ON(1);
+ }
+--- a/drivers/net/wireless/ath/ath9k/hw.h
++++ b/drivers/net/wireless/ath/ath9k/hw.h
+@@ -19,6 +19,7 @@
+
+ #include <linux/if_ether.h>
+ #include <linux/delay.h>
++#include <linux/gpio/consumer.h>
+ #include <linux/io.h>
+ #include <linux/firmware.h>
+
+@@ -302,7 +303,6 @@ struct ath9k_hw_capabilities {
+ u8 max_rxchains;
+ u8 num_gpio_pins;
+ u32 gpio_mask;
+- u32 gpio_requested;
+ u8 rx_hp_qdepth;
+ u8 rx_lp_qdepth;
+ u8 rx_status_len;
+@@ -783,6 +783,7 @@ struct ath_hw {
+ struct ath9k_hw_capabilities caps;
+ struct ath9k_channel channels[ATH9K_NUM_CHANNELS];
+ struct ath9k_channel *curchan;
++ struct gpio_desc *gpiods[32];
+
+ union {
+ struct ar5416_eeprom_def def;