From nobody Thu Dec 18 09:26:28 2025 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8E03B393775 for ; Tue, 16 Dec 2025 12:52:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.180.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765889533; cv=none; b=Cm6NpkT1zf072DpQ2rn0cRD5o0m4FCSYnnd+WLhh4UjEdkdnO/JGDU6ae+cUSVTSTt+3biXFNE6IXmeXpBNLkemHtsklHIV62W7RFYFULnPgXv/T7gS+aNqVJZS3AWqplLlKZ/7RjThU8UWEXwcG8IaVnjLsy1PaNn1xmDlTaD8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765889533; c=relaxed/simple; bh=hImE7GQrCuzWz+LCETc8MWiZwVHo4qo/PyPQSktScRQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=VNYUVd5Oo5ynrgmYxG+XuwePkcghibKLd+fbR4X39xrP395Um36Sk5imb+9gjWRoFx5qBw2CDjjf0VK+b9ivjh5XSCykRiuN0+W4u/b0h75b/xAtu5V+Q0JdQ2N4dFdPh4uyl2jvW0noQQFibXZIRyDaKvXveBc9tlhmAAVAqds= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=LraelETJ; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=SdWRJtTo; arc=none smtp.client-ip=205.220.180.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="LraelETJ"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="SdWRJtTo" Received: from pps.filterd (m0279869.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 5BGB1pZZ018800 for ; Tue, 16 Dec 2025 12:52:10 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= jy1598yUJqUvu+a7XgM5cYaI53QGia/dl9hRsBk1Zhk=; b=LraelETJ8uHo7rm4 z4g4tkiP9GsG63ZX40EEg9dp74yWZzTsQxlpy/Wdd7YKtnIxgiljEyrERjtMzRP2 +N+8951XtOPmYmyZjuMjBRbcp/UWyEuoO68sKZRMevXlX0AmJ08zOvCEGcid957k JtTjS4jwxezJeRngiOiuhh9ln5c1/xzX7O2v9xWf/bNru/VGOKkTDAW3T8qwRFbP IRiTMUPLOFXV16Fo+eJoVLy/9IdLcSIoilf+H5fRaHzk72uG2FKRjX6cwAugdDP0 txKVKow35q73dEoYkIVsaGggSG9hs+LRzMsGBWolR389bCIdWp3nwKTuSxhVX5XU iCFwow== Received: from mail-pf1-f198.google.com (mail-pf1-f198.google.com [209.85.210.198]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4b366q8bba-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Tue, 16 Dec 2025 12:52:09 +0000 (GMT) Received: by mail-pf1-f198.google.com with SMTP id d2e1a72fcca58-7b9ef46df43so4791893b3a.1 for ; Tue, 16 Dec 2025 04:52:09 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1765889528; x=1766494328; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=jy1598yUJqUvu+a7XgM5cYaI53QGia/dl9hRsBk1Zhk=; b=SdWRJtToHDKUJnxPXXehCof0yjpAwLxywQzxdghGgJ84FTEpt8OkvaerVd8ZeQMLZ/ yrXons8Kevo9DSER7ZuKQCNPTryipxAO9e7gaoirbcy22kIYvf80sTqXYkSVV8yJ1OC3 uEAQmoqyFDZkDCSMRlGJkeCHgwdiT9iAGhR3QArA3VTtSuM1BHwJ4cyAn+YEfoJLWenQ 1D5M77ewz3kap1DPgnKeE2cFJfFEerAJzCZk8+c9tbbVFYHUAowlLUXSfINACPuPIX0J lkIn8WvGVW9yYT0SD2PouHLFnVnPRdmc0SnKy6YbrZkaeWHfKCuJxKevHheYqICkSYMS PMZQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1765889528; x=1766494328; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=jy1598yUJqUvu+a7XgM5cYaI53QGia/dl9hRsBk1Zhk=; b=ULGTT4Cn0HaKl0+KdvABblZtDEb50PbJVeWnokzxijLAZxhAXlBamMQIVPBxZyPa8S m+xeKxuDtaoXoehF85W6zT478xaMohql9Cm5kxOTOGPpqcgAoDtgcQu625wR/3COi2MU EWtExS5i/LdCCAcKbZCqkFYiL3vFYa5yI7lvgqy7Ym2n/Kmgi5Mj7BvcH8HP6epsxT5M rJ+S/opbJkY2jk3vQWF8kWD/oD9hvrdzHQGXdexhdcDnfXsal/lJdZEw3o0mCdItk8L/ pnJf8U1+vapQSSLRBv6ehsQzxhXZVLaFD73b4c4K+YEskvQfGd9r8oFomyNsnjGZV30Q eMtA== X-Forwarded-Encrypted: i=1; AJvYcCXEeM2gVi8EtKrNIZEpgq04c154Dyhq4TUs86GrVM1+plw1dTH76ZpQRevdw+4cfkni1FZ0lFn6LlX8rqg=@vger.kernel.org X-Gm-Message-State: AOJu0YzQOs1mWsyAiE936f7fTH8ByxC2wjp/9uzakp6Di6hKQvcXw/d6 TEES519/spj2gzgPC0XlsSN0oMWLL3ZfqzvMpgKTxRGVURIdULo0PsY4PoiY8+NDrmCq9s3isTM CwWXNo7deJZWOskjM7Zyo/oRnwLB7FA/Po5MSK8CtBA9gUhszQwLTgw35cDbliBAqe80TR5lshY o= X-Gm-Gg: AY/fxX5Ny1GRX69PNQl74RqQUVHhJoBAE2k2b8Ia9t7/QKZLe4Y1+ipAKukm2fMW6Ee m2S9p1SY2FquAz+0X8fwJUSxIg1TwJZNyWi6c644AFctdlaoe8bWEWPBplrb58p9ufbUpMd3dLv 73o0SN8BnLWXyV7gdVrO5rX2e5F9K9EcxY/3YmAXu2Qm+ehquBQK10uGXg/noPiNIjexWGHt7Za CB9VcOyu2z0wLgYb01uve3Wd8Z9spMrY/EvrbKggaKKbAeE6YBwN+J3XToIfqteclk+nIIy92s4 ewwm6X+vJQqLdqbfXbz2VXrx80ekn7C/dcv6YItsw3ok4cUnlvO1v8svxopGw1FEMfI7fbJHv90 Evmhpbd8Eb4Hn8zqvAMp1aL3ZiMyILEzLkCyjIQIioA== X-Received: by 2002:a05:6a20:939f:b0:35e:4017:3f32 with SMTP id adf61e73a8af0-369afa0f149mr12539063637.38.1765889528345; Tue, 16 Dec 2025 04:52:08 -0800 (PST) X-Google-Smtp-Source: AGHT+IHjzD7R4uaZ9Cp8BC5PKe+O45asaEaN2RWQgZGhm1UDQOaN2oNuTVDcVsFmdwaYr/60winWHA== X-Received: by 2002:a05:6a20:939f:b0:35e:4017:3f32 with SMTP id adf61e73a8af0-369afa0f149mr12539021637.38.1765889527748; Tue, 16 Dec 2025 04:52:07 -0800 (PST) Received: from [192.168.1.102] ([117.193.213.190]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-7f5ab7d87e8sm13634362b3a.25.2025.12.16.04.52.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 16 Dec 2025 04:52:07 -0800 (PST) From: Manivannan Sadhasivam Date: Tue, 16 Dec 2025 18:21:44 +0530 Subject: [PATCH v2 2/5] PCI/pwrctrl: Add 'struct pci_pwrctrl::power_{on/off}' callbacks Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251216-pci-pwrctrl-rework-v2-2-745a563b9be6@oss.qualcomm.com> References: <20251216-pci-pwrctrl-rework-v2-0-745a563b9be6@oss.qualcomm.com> In-Reply-To: <20251216-pci-pwrctrl-rework-v2-0-745a563b9be6@oss.qualcomm.com> To: Manivannan Sadhasivam , Lorenzo Pieralisi , =?utf-8?q?Krzysztof_Wilczy=C5=84ski?= , Rob Herring , Bjorn Helgaas , Bartosz Golaszewski , Bartosz Golaszewski Cc: linux-pci@vger.kernel.org, linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, Chen-Yu Tsai , Brian Norris , Krishna Chaitanya Chundru , Niklas Cassel , Alex Elder , Manivannan Sadhasivam , Chen-Yu Tsai X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=6339; i=manivannan.sadhasivam@oss.qualcomm.com; h=from:subject:message-id; bh=hImE7GQrCuzWz+LCETc8MWiZwVHo4qo/PyPQSktScRQ=; b=owEBbQGS/pANAwAKAVWfEeb+kc71AcsmYgBpQVXoI2KPJRcOdMTIipPr6Ud1/OJHbwdy8AEwn Nrm5E+vwmmJATMEAAEKAB0WIQRnpUMqgUjL2KRYJ5dVnxHm/pHO9QUCaUFV6AAKCRBVnxHm/pHO 9XVsB/9YvZIzl+Mywl3tkwyVsxgkXlZ9ldkwCpfjg+sz0vqfzO5ed+Cs6GDQIu//5Hw3WQcPsZD J/8Ef4P8D7KSwduDxa7aVa+8z+iLWcTsbqZjFbz+2nbSCZUqCbkybLtWt72nk9bBLFOJ54y4W2g rFINTSID4Dk9sFaDSyBwKHoP4ZIbsRlSaLItUCICHGGpwur1d/88YH2orCf4K9VIETbVa8TCcYv ZBMJti2YogCB9erkpZXJDi/Dco5bYpDoWpm7zTmuWmBHomp40SacXsAyyOJOB/DKAsaQRmtTxdS fiGqx7ZHW3nT+KpiHGi8Q8rgwUqY2ev0qaVTa3zujXF82nix X-Developer-Key: i=manivannan.sadhasivam@oss.qualcomm.com; a=openpgp; fpr=C668AEC3C3188E4C611465E7488550E901166008 X-Proofpoint-GUID: coeKx68ZdsKRAWA5l-Qy2VpJh9GIVDis X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUxMjE2MDEwOSBTYWx0ZWRfX6PMFiCcIS8pt NPLx8W0SzrqGs1t7amiN3gwzk9j/hLeBezo9mjdLv270fjjfs9LnByLuBuh8rT4d5lx6pdV/sB7 r9q4nnnJDhikG3KTy1UBVEL1LVjkaveckMF5mjNKKo5AGOy6AhoSa6AsA9ZQg2gnS/3VIQG/DZ7 SM5KWcyryHdaI2ZeAn3b/mwMkXYZir8xJnpv+FrOGgFDrV/r0/ygREsqQNSfJQMsMGIfS0Rxd7C pzVb1bnINiQkautGQqXDphdeBtmL0Bz8JYuSzd++CfSrQEwv7rOQY6rREeXnouClRcty7hRltqv miiJ8ABv+OcDToGG7JQwgImWmjO0HYTFBDn9zHuKYTXcWxIV0dpRFuL48nabogTom6PekExAHBW 7zf5EZZ+WGyexAGg3DISu2QN6GK7yw== X-Authority-Analysis: v=2.4 cv=RKe+3oi+ c=1 sm=1 tr=0 ts=694155f9 cx=c_pps a=m5Vt/hrsBiPMCU0y4gIsQw==:117 a=wnJ2AIBC+6MZbTdryK78rQ==:17 a=IkcTkHD0fZMA:10 a=wP3pNCr1ah4A:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=EUspDBNiAAAA:8 a=cm27Pg_UAAAA:8 a=awzhGNnQlOWheNBC8EkA:9 a=QEXdDO2ut3YA:10 a=IoOABgeZipijB_acs4fv:22 X-Proofpoint-ORIG-GUID: coeKx68ZdsKRAWA5l-Qy2VpJh9GIVDis X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.9,FMLib:17.12.100.49 definitions=2025-12-16_02,2025-12-16_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 adultscore=0 spamscore=0 phishscore=0 malwarescore=0 bulkscore=0 lowpriorityscore=0 suspectscore=0 clxscore=1015 priorityscore=1501 impostorscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2510240001 definitions=main-2512160109 To allow the pwrctrl core to control the power on/off sequences of the pwrctrl drivers, add the 'struct pci_pwrctrl::power_{on/off}' callbacks and populate them in the respective pwrctrl drivers. The pwrctrl drivers still power on the resources on their own now. So there is no functional change. Co-developed-by: Krishna Chaitanya Chundru Signed-off-by: Krishna Chaitanya Chundru Tested-by: Chen-Yu Tsai Signed-off-by: Manivannan Sadhasivam --- drivers/pci/pwrctrl/pci-pwrctrl-pwrseq.c | 27 +++++++++++++++--- drivers/pci/pwrctrl/slot.c | 48 ++++++++++++++++++++++------= ---- include/linux/pci-pwrctrl.h | 4 +++ 3 files changed, 61 insertions(+), 18 deletions(-) diff --git a/drivers/pci/pwrctrl/pci-pwrctrl-pwrseq.c b/drivers/pci/pwrctrl= /pci-pwrctrl-pwrseq.c index 4e664e7b8dd2..0fb9038a1d18 100644 --- a/drivers/pci/pwrctrl/pci-pwrctrl-pwrseq.c +++ b/drivers/pci/pwrctrl/pci-pwrctrl-pwrseq.c @@ -52,11 +52,27 @@ static const struct pci_pwrctrl_pwrseq_pdata pci_pwrctr= l_pwrseq_qcom_wcn_pdata =3D .validate_device =3D pci_pwrctrl_pwrseq_qcm_wcn_validate_device, }; =20 +static int pci_pwrctrl_pwrseq_power_on(struct pci_pwrctrl *ctx) +{ + struct pci_pwrctrl_pwrseq_data *data =3D container_of(ctx, struct pci_pwr= ctrl_pwrseq_data, + ctx); + + return pwrseq_power_on(data->pwrseq); +} + +static void pci_pwrctrl_pwrseq_power_off(struct pci_pwrctrl *ctx) +{ + struct pci_pwrctrl_pwrseq_data *data =3D container_of(ctx, struct pci_pwr= ctrl_pwrseq_data, + ctx); + + pwrseq_power_off(data->pwrseq); +} + static void devm_pci_pwrctrl_pwrseq_power_off(void *data) { - struct pwrseq_desc *pwrseq =3D data; + struct pci_pwrctrl_pwrseq_data *pwrseq_data =3D data; =20 - pwrseq_power_off(pwrseq); + pci_pwrctrl_pwrseq_power_off(&pwrseq_data->ctx); } =20 static int pci_pwrctrl_pwrseq_probe(struct platform_device *pdev) @@ -85,16 +101,19 @@ static int pci_pwrctrl_pwrseq_probe(struct platform_de= vice *pdev) return dev_err_probe(dev, PTR_ERR(data->pwrseq), "Failed to get the power sequencer\n"); =20 - ret =3D pwrseq_power_on(data->pwrseq); + ret =3D pci_pwrctrl_pwrseq_power_on(&data->ctx); if (ret) return dev_err_probe(dev, ret, "Failed to power-on the device\n"); =20 ret =3D devm_add_action_or_reset(dev, devm_pci_pwrctrl_pwrseq_power_off, - data->pwrseq); + data); if (ret) return ret; =20 + data->ctx.power_on =3D pci_pwrctrl_pwrseq_power_on; + data->ctx.power_off =3D pci_pwrctrl_pwrseq_power_off; + pci_pwrctrl_init(&data->ctx, dev); =20 ret =3D devm_pci_pwrctrl_device_set_ready(dev, &data->ctx); diff --git a/drivers/pci/pwrctrl/slot.c b/drivers/pci/pwrctrl/slot.c index 3320494b62d8..14701f65f1f2 100644 --- a/drivers/pci/pwrctrl/slot.c +++ b/drivers/pci/pwrctrl/slot.c @@ -17,13 +17,36 @@ struct pci_pwrctrl_slot_data { struct pci_pwrctrl ctx; struct regulator_bulk_data *supplies; int num_supplies; + struct clk *clk; }; =20 -static void devm_pci_pwrctrl_slot_power_off(void *data) +static int pci_pwrctrl_slot_power_on(struct pci_pwrctrl *ctx) { - struct pci_pwrctrl_slot_data *slot =3D data; + struct pci_pwrctrl_slot_data *slot =3D container_of(ctx, struct pci_pwrct= rl_slot_data, ctx); + int ret; + + ret =3D regulator_bulk_enable(slot->num_supplies, slot->supplies); + if (ret < 0) { + dev_err(slot->ctx.dev, "Failed to enable slot regulators\n"); + return ret; + } + + return clk_prepare_enable(slot->clk); +} + +static void pci_pwrctrl_slot_power_off(struct pci_pwrctrl *ctx) +{ + struct pci_pwrctrl_slot_data *slot =3D container_of(ctx, struct pci_pwrct= rl_slot_data, ctx); =20 regulator_bulk_disable(slot->num_supplies, slot->supplies); + clk_disable_unprepare(slot->clk); +} + +static void devm_pci_pwrctrl_slot_release(void *data) +{ + struct pci_pwrctrl_slot_data *slot =3D data; + + pci_pwrctrl_slot_power_off(&slot->ctx); regulator_bulk_free(slot->num_supplies, slot->supplies); } =20 @@ -31,7 +54,6 @@ static int pci_pwrctrl_slot_probe(struct platform_device = *pdev) { struct pci_pwrctrl_slot_data *slot; struct device *dev =3D &pdev->dev; - struct clk *clk; int ret; =20 slot =3D devm_kzalloc(dev, sizeof(*slot), GFP_KERNEL); @@ -46,23 +68,21 @@ static int pci_pwrctrl_slot_probe(struct platform_devic= e *pdev) } =20 slot->num_supplies =3D ret; - ret =3D regulator_bulk_enable(slot->num_supplies, slot->supplies); - if (ret < 0) { - dev_err_probe(dev, ret, "Failed to enable slot regulators\n"); - regulator_bulk_free(slot->num_supplies, slot->supplies); - return ret; - } =20 - ret =3D devm_add_action_or_reset(dev, devm_pci_pwrctrl_slot_power_off, + ret =3D devm_add_action_or_reset(dev, devm_pci_pwrctrl_slot_release, slot); if (ret) return ret; =20 - clk =3D devm_clk_get_optional_enabled(dev, NULL); - if (IS_ERR(clk)) { - return dev_err_probe(dev, PTR_ERR(clk), + slot->clk =3D devm_clk_get_optional(dev, NULL); + if (IS_ERR(slot->clk)) + return dev_err_probe(dev, PTR_ERR(slot->clk), "Failed to enable slot clock\n"); - } + + pci_pwrctrl_slot_power_on(&slot->ctx); + + slot->ctx.power_on =3D pci_pwrctrl_slot_power_on; + slot->ctx.power_off =3D pci_pwrctrl_slot_power_off; =20 pci_pwrctrl_init(&slot->ctx, dev); =20 diff --git a/include/linux/pci-pwrctrl.h b/include/linux/pci-pwrctrl.h index 4aefc7901cd1..bd0ee9998125 100644 --- a/include/linux/pci-pwrctrl.h +++ b/include/linux/pci-pwrctrl.h @@ -31,6 +31,8 @@ struct device_link; /** * struct pci_pwrctrl - PCI device power control context. * @dev: Address of the power controlling device. + * @power_on: Callback to power on the power controlling device. + * @power_off: Callback to power off the power controlling device. * * An object of this type must be allocated by the PCI power control devic= e and * passed to the pwrctrl subsystem to trigger a bus rescan and setup a dev= ice @@ -38,6 +40,8 @@ struct device_link; */ struct pci_pwrctrl { struct device *dev; + int (*power_on)(struct pci_pwrctrl *pwrctrl); + void (*power_off)(struct pci_pwrctrl *pwrctrl); =20 /* private: internal use only */ struct notifier_block nb; --=20 2.48.1