From nobody Fri Sep 20 01:36:37 2024 Received: from mail-ej1-f49.google.com (mail-ej1-f49.google.com [209.85.218.49]) (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 0EB526E602 for ; Tue, 2 Apr 2024 12:07:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.49 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712059681; cv=none; b=h0b9GYvf+GUjPeS4DMXSXMxG+NSQMghpMbombWL/fdj5MDkBak+mpJfS+90LUf+inyHPhDn3NoBTQ7EqDIH23IWW5MQsL9HxfbrqH+lKaGnV0OCN0hqdTCKL2OrS+IiklVWjWRIHsuVdK/gUS/M/wTF66PXTldI9f3epUYcO7MM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712059681; c=relaxed/simple; bh=H2L6hk3BSbGZWXsaMqnOwDhN0rNiIn1lAFbUz+5zVTU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=AZhcKR6b6iwi+FRzQ7B3AlBqMl2MjsI6FjazTDT30ZwUuo49bNEDGAG8/aMI4lWgCfJhOqxhPIbHNDo8CI5PD8x5kk0FsZFbObat5FqMsVtbOk2n2c9re4mhaelU8uWB4KSsZBioov7CdD6NpxyH238MPOWJZCwvRl4MIvmQfq8= 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; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=MBnnSfN5; arc=none smtp.client-ip=209.85.218.49 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 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="MBnnSfN5" Received: by mail-ej1-f49.google.com with SMTP id a640c23a62f3a-a468226e135so610486466b.0 for ; Tue, 02 Apr 2024 05:07:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1712059678; x=1712664478; 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=e0l9XqgR5rgZt/McZ1+LYeV2+Ae3g0xUIEFWoqdq9PI=; b=MBnnSfN5Jk0Ktd6h1QNuvR6ftInUZOne11unhgCIHkl+aJGVTMN9jVdYdoVzzP/+iJ m0hEz3wIJDN/5nLauEyybGRKFaFnxueCnjt99yXWs0SrWHrT4kh7b6UBlPFTRbpEb0kY mGSbkPafNxbwS5x0W8EtjaDM++AHpBB83vLopV6SsooecdX4hKJ8ZLIJnxW/d9gKu10o frh+HHXy0M3LrAJ0ckQR1PwBZDVwZZRGP6OrC9ZP0peh7scupZ/xWoinze4W1J1xiA92 c+J4sA8gKZqhupO9Dk0PfWQdTCq+X8WqILjQaKe2BnlrwXNdQTQUumrIQouzPM6Rk/0h st9g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1712059678; x=1712664478; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=e0l9XqgR5rgZt/McZ1+LYeV2+Ae3g0xUIEFWoqdq9PI=; b=mUdCgcjDwE9EkhNpSaVsu6bu27ogHzcvp/orvV9ZnZRd7VJAd1/5p/TIiQ30dNC2fe mI8drRpIgv1UOaq7K7STU0+YjwheU1drRq/MUXF73I1rcHGnvgYM57+QalSE8aeKdbbP MzowkZcbNCDhXiIUEJt0pnC1ekeNyvDNUIJGegyAwyvJB4ygYTMRTwD7aL9oQEHZgk6z IRa4LxcEcd6itp+hPUOK6V040mj9lQarVjxhoLCKVpSl4tm/iDpB/2Q+SLwGKHVyMXrV Jl78so4W3ZmVVSpDmH+1UMH0LakcLFcng3W+q/KCWWlw+VzqDMgyDv/IPzpkyAJHbGj6 DtMw== X-Forwarded-Encrypted: i=1; AJvYcCXi+SkIVmHmOFkTH3aOt62jQf/8kJWJjDghr1LOQLU1sdqAooBb2lMfV92PbA/vlz1fD1Z0ADX8J3q7F+A3EKYE2Jd8PF9VODNIpY+J X-Gm-Message-State: AOJu0Yxe6yU567RxcoOeGL+VbFZPluW2n8ZxzxmrT7J/+PN3Z8yO1KXN BCAI3QwqgOh1Ocf8A2b6esjB86zxuvyr7U4nJzjGFPh1LaILGv9ReEgxop+2BK0cMcu78hxf9OT 9 X-Google-Smtp-Source: AGHT+IEJul2UyOBnNzX9jiFv2kE1saST7wjLNXY/wrt3Zz1YliDjZ/vc/6cnOv5WctEGKams9g+fsg== X-Received: by 2002:a17:907:961e:b0:a4e:9197:7f21 with SMTP id gb30-20020a170907961e00b00a4e91977f21mr679253ejc.30.1712059677980; Tue, 02 Apr 2024 05:07:57 -0700 (PDT) Received: from [127.0.1.1] ([79.114.172.194]) by smtp.gmail.com with ESMTPSA id l13-20020a1709065a8d00b00a4df251a601sm6519384ejq.77.2024.04.02.05.07.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 02 Apr 2024 05:07:57 -0700 (PDT) From: Abel Vesa Date: Tue, 02 Apr 2024 15:07:30 +0300 Subject: [PATCH v8 1/7] dt-bindings: spmi: Add X1E80100 SPMI PMIC ARB schema 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: <20240402-spmi-multi-master-support-v8-1-ce6f2d14a058@linaro.org> References: <20240402-spmi-multi-master-support-v8-0-ce6f2d14a058@linaro.org> In-Reply-To: <20240402-spmi-multi-master-support-v8-0-ce6f2d14a058@linaro.org> To: Stephen Boyd , Matthias Brugger , Bjorn Andersson , Konrad Dybcio , Dmitry Baryshkov , Neil Armstrong , AngeloGioacchino Del Regno , Rob Herring , Krzysztof Kozlowski , Conor Dooley Cc: Srini Kandagatla , Johan Hovold , linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-arm-msm@vger.kernel.org, linux-mediatek@lists.infradead.org, devicetree@vger.kernel.org, Abel Vesa , Krzysztof Kozlowski X-Mailer: b4 0.13.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=4280; i=abel.vesa@linaro.org; h=from:subject:message-id; bh=H2L6hk3BSbGZWXsaMqnOwDhN0rNiIn1lAFbUz+5zVTU=; b=owEBbQKS/ZANAwAKARtfRMkAlRVWAcsmYgBmC/UPXfe0w39Yxj5a+0jZ+tGvt2H1SNZQbKYzl nglHQRsoHOJAjMEAAEKAB0WIQRO8+4RTnqPKsqn0bgbX0TJAJUVVgUCZgv1DwAKCRAbX0TJAJUV VuamEACbNcLnCQcnz4W18nC7uDvgNVQB0DJoknwroD1Ma5Q7R0sJFX7R8Htqoh8oIvdJxoO/vrq iHkbdbyh9l0Oe5PuFdWnXoLNrd9EcCV/zxHnNOMOZbEev3qRIDf8tWsPMpSNFbtcr9AuLwGpBCB T4AA/c78OtLRS5S4NeKTDlDt1XlNDAQKYz4uYp90uYjC8TQZoMxckOTESiolJqg6//Hs/JCjeiq Dbl5T/d8divypDYuvcpxCv/ikxnW9SOIi9hQq83uYogMDL3sKbuPysObHynwCKlrgn3sxj9prTA kCD4zMn2TFfYDh+DatI5BuakEbKZwSitdFMLXZe/CZYxkHOH7gm1dj77skgRabBjucxG6xnwyAW x+oMx3hIHn2wuULBfWBl7WS9sjA/32Guspi4CVYzTATB68b+6W6zKemOtUeOjz6vdPWh2ctzxqi K2Z74OQpZVw8dydP1oJItac98gloxs0Y4IGmhYYVrDbbz4lCC8Yk/7DdjUWkXZIL15NIeaBiTnm bc0pCUM1JmTqktZIrxy8bb7iAWXjlrBhn3eupslmV+AetOZ0G45G+8XF5k35hnoGwK4w8ixwVwr O5srV5H56hWPW+oJT4Yg0ILukYwcfjpoNNUyb1dV+ASM8bHbW7cbgE6G3mzQqrrfqq59n0uj9rt wvxqwRk60deyWBQ== X-Developer-Key: i=abel.vesa@linaro.org; a=openpgp; fpr=6AFF162D57F4223A8770EF5AF7BF214136F41FAE Add dedicated schema for X1E80100 PMIC ARB (v7) as it allows multiple buses by declaring them as child nodes. Reviewed-by: Krzysztof Kozlowski Signed-off-by: Abel Vesa --- .../bindings/spmi/qcom,x1e80100-spmi-pmic-arb.yaml | 136 +++++++++++++++++= ++++ 1 file changed, 136 insertions(+) diff --git a/Documentation/devicetree/bindings/spmi/qcom,x1e80100-spmi-pmic= -arb.yaml b/Documentation/devicetree/bindings/spmi/qcom,x1e80100-spmi-pmic-= arb.yaml new file mode 100644 index 000000000000..f32a7ae33b4b --- /dev/null +++ b/Documentation/devicetree/bindings/spmi/qcom,x1e80100-spmi-pmic-arb.ya= ml @@ -0,0 +1,136 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/spmi/qcom,x1e80100-spmi-pmic-arb.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Qualcomm X1E80100 SPMI Controller (PMIC Arbiter v7) + +maintainers: + - Stephen Boyd + +description: | + The X1E80100 SPMI PMIC Arbiter implements HW version 7 and it's an SPMI + controller with wrapping arbitration logic to allow for multiple on-chip + devices to control up to 2 SPMI separate buses. + + The PMIC Arbiter can also act as an interrupt controller, providing inte= rrupts + to slave devices. + +properties: + compatible: + const: qcom,x1e80100-spmi-pmic-arb + + reg: + items: + - description: core registers + - description: tx-channel per virtual slave regosters + - description: rx-channel (called observer) per virtual slave regist= ers + + reg-names: + items: + - const: core + - const: chnls + - const: obsrvr + + ranges: true + + '#address-cells': + const: 2 + + '#size-cells': + const: 2 + + qcom,ee: + $ref: /schemas/types.yaml#/definitions/uint32 + minimum: 0 + maximum: 5 + description: > + indicates the active Execution Environment identifier + + qcom,channel: + $ref: /schemas/types.yaml#/definitions/uint32 + minimum: 0 + maximum: 5 + description: > + which of the PMIC Arb provided channels to use for accesses + +patternProperties: + "^spmi@[a-f0-9]+$": + type: object + $ref: /schemas/spmi/spmi.yaml + unevaluatedProperties: false + + properties: + reg: + items: + - description: configuration registers + - description: interrupt controller registers + + reg-names: + items: + - const: cnfg + - const: intr + + interrupts: + maxItems: 1 + + interrupt-names: + const: periph_irq + + interrupt-controller: true + + '#interrupt-cells': + const: 4 + description: | + cell 1: slave ID for the requested interrupt (0-15) + cell 2: peripheral ID for requested interrupt (0-255) + cell 3: the requested peripheral interrupt (0-7) + cell 4: interrupt flags indicating level-sense information, + as defined in dt-bindings/interrupt-controller/irq.h + +required: + - compatible + - reg-names + - qcom,ee + - qcom,channel + +additionalProperties: false + +examples: + - | + #include + + soc { + #address-cells =3D <2>; + #size-cells =3D <2>; + + spmi: arbiter@c400000 { + compatible =3D "qcom,x1e80100-spmi-pmic-arb"; + reg =3D <0 0x0c400000 0 0x3000>, + <0 0x0c500000 0 0x4000000>, + <0 0x0c440000 0 0x80000>; + reg-names =3D "core", "chnls", "obsrvr"; + + qcom,ee =3D <0>; + qcom,channel =3D <0>; + + #address-cells =3D <2>; + #size-cells =3D <2>; + ranges; + + spmi_bus0: spmi@c42d000 { + reg =3D <0 0x0c42d000 0 0x4000>, + <0 0x0c4c0000 0 0x10000>; + reg-names =3D "cnfg", "intr"; + + interrupt-names =3D "periph_irq"; + interrupts-extended =3D <&pdc 1 IRQ_TYPE_LEVEL_HIGH>; + interrupt-controller; + #interrupt-cells =3D <4>; + + #address-cells =3D <2>; + #size-cells =3D <0>; + }; + }; + }; --=20 2.34.1 From nobody Fri Sep 20 01:36:37 2024 Received: from mail-ej1-f52.google.com (mail-ej1-f52.google.com [209.85.218.52]) (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 A505B76F17 for ; Tue, 2 Apr 2024 12:08:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.52 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712059683; cv=none; b=NnP1mEceJQkZs8RGjyeU5qpFpdUQHP/inHqFqgT7KUqgpx/9MMvLZedJmb+c+ZhcOH0avHbcE/fiZAO9QliXgIlnGIWAzo8ooihBEHF+yvBJWh17t/rkgzP/7qN0nfmMh+orgpJFh95mx+X3gYEaxAZcYwatg70Y1ZYrFZfjUEE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712059683; c=relaxed/simple; bh=f1k2/XtnKKT0QabjDTtzy+0Tu+D0+1BkiYHMuQzuNWI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=T3szzy7Ch1W7TmCaQMhBw1srZ96NIUyVfa56m/8kazaiTpg2pFgkAiZXt4qKJvleDwNNmnaqy4IvFuf+B1m8pHBwAAuDOZNlX0lnkjKXfWin8YVit/FSMqkITKgXpf2ZHzXmbiaj27pPQYg1MHfizrdQqkQXIceTYBg2iaiSneg= 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; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=Atpfl7GC; arc=none smtp.client-ip=209.85.218.52 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 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="Atpfl7GC" Received: by mail-ej1-f52.google.com with SMTP id a640c23a62f3a-a4e65dec03eso261574766b.0 for ; Tue, 02 Apr 2024 05:08:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1712059680; x=1712664480; 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=8lYudh1XGipLZp45Ed9irT2kjTBzp7nX6WUMRhG9/PM=; b=Atpfl7GCACBiZg7Ys5XDmXD1K46kBxqz4yGtQQijYMkBWgLJNvOveukP5I6+AWrULO ef0MdmfJrThuJSquEaTM9jeFxBU7d/aa9dWzu6/S3x2IJbhYGzByzs4t0XCJtl9TtH/b Rk7hT4uXLgJ74+sazNxRq7iYFSbFeQQMnqSg9syqWwjJfPPpa1tc618K7YcOgWyHRo27 ceEIYEXW7wdJ7gIF/7LxowpQCp0pPbyc8nMvkE8ZG8X4O86IG497ClVyawt184Tf/s09 QlvYeX/yaQKDqnH76uEUIAmyGf9MVaPe+LJp3ejv9fjv0MU4tqXR4aW2vF9GjsOHTz6a fsZg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1712059680; x=1712664480; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=8lYudh1XGipLZp45Ed9irT2kjTBzp7nX6WUMRhG9/PM=; b=dqV9+3lyRoWSkqdWamtI9jjGMqb7Pu93awp2JXalAfeUn5iHzPNZECM62BIoImqjld PEu5UKgfzvtXb7b5sZRIdl9EvItZTS4HSAKdtnXlKpts7jJAXUxZ567d4V5DzHMfghdU HmqVtmz9ecxEJfebdhJBH2VlcWK/NYYY88ZzcScxJMKoPprfxqud1fJcbTJK1yDK+ebg 9JxSRVO+L4kYqAwR++NChqTxhkjLmDpmU3DlfZDA+JK0k1L+jOgz+Oe4Ktw/A37C5NQQ xS1aWDCq9nbcv6eeq+jV/mQu4sMcn/He4zxOIB68QfSXfbpXpk7KSvUCE4mt/bzVOjyW nyLw== X-Forwarded-Encrypted: i=1; AJvYcCWVvFBwCqgqAN2SOI13+ividUFEhBgi2sWkNGl54Sv8/FHp2f6a/twcvsQFzYsyRkbp49oJp25WWTHuI3Y8UtnUOm1W/liOjtlMQ79B X-Gm-Message-State: AOJu0Yyh2P7+Bny6ziKTsQfHrhtVWFMCeE4Y6AGK7NG94ZXaFnNNMgJe 7RKh2PERbfm9wkDQ/j//ZVav1FWEFSbf5O5zyRRLNOvU2FtxGMuluI+SRh9nVo0= X-Google-Smtp-Source: AGHT+IFic8oTxMWwbq/opl+R/WMY4B81eIyhGlcF04iuyhaO02RdXMJ+iUNSsBYJ7n5NMVSgBWknQA== X-Received: by 2002:a17:906:1809:b0:a4e:1449:511d with SMTP id v9-20020a170906180900b00a4e1449511dmr8612893eje.46.1712059679543; Tue, 02 Apr 2024 05:07:59 -0700 (PDT) Received: from [127.0.1.1] ([79.114.172.194]) by smtp.gmail.com with ESMTPSA id l13-20020a1709065a8d00b00a4df251a601sm6519384ejq.77.2024.04.02.05.07.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 02 Apr 2024 05:07:59 -0700 (PDT) From: Abel Vesa Date: Tue, 02 Apr 2024 15:07:31 +0300 Subject: [PATCH v8 2/7] dt-bindings: spmi: Deprecate qcom,bus-id 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: <20240402-spmi-multi-master-support-v8-2-ce6f2d14a058@linaro.org> References: <20240402-spmi-multi-master-support-v8-0-ce6f2d14a058@linaro.org> In-Reply-To: <20240402-spmi-multi-master-support-v8-0-ce6f2d14a058@linaro.org> To: Stephen Boyd , Matthias Brugger , Bjorn Andersson , Konrad Dybcio , Dmitry Baryshkov , Neil Armstrong , AngeloGioacchino Del Regno , Rob Herring , Krzysztof Kozlowski , Conor Dooley Cc: Srini Kandagatla , Johan Hovold , linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-arm-msm@vger.kernel.org, linux-mediatek@lists.infradead.org, devicetree@vger.kernel.org, Abel Vesa , Krzysztof Kozlowski X-Mailer: b4 0.13.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=1023; i=abel.vesa@linaro.org; h=from:subject:message-id; bh=f1k2/XtnKKT0QabjDTtzy+0Tu+D0+1BkiYHMuQzuNWI=; b=owEBbQKS/ZANAwAKARtfRMkAlRVWAcsmYgBmC/URJbnokK1pOxrlYzamDCfFKUmEZT+B4Is74 Ejx10d2ideJAjMEAAEKAB0WIQRO8+4RTnqPKsqn0bgbX0TJAJUVVgUCZgv1EQAKCRAbX0TJAJUV VucqD/40449kY2bmDx8dRfmVCXUNV2maAgBuk+qFdisysi/c5g25GTKPHDPEkoHQK5092FeSdFM mSQ4TUiu1MKT7Q6FQTT1lzU6utya7fHEwJsSr2811MozIiGezifkL8lhOQ4YBCqZuGom23Cw+dC beZ3C/BT2JioCtDx1exH7gNkul1SHK4sunrpYPHHRV7PI34dIXTRsLH4J1fE+w7F0fUARv1KZ2v 8iQKMQnTH0eaSkXP7NQ/og20GOccJYfu7FXQgPtmYWb6JQEv3SeQrM2dXr4mQ2IGEkgYJ29oSyl p4GUue5hL2exrGFO4bKaWRr0hrzwa9J3hxaQ94XcvjMjBvhAWhhHW00NsWR0QTpBmRHO2aaRkke R7OYMVvFqb7hIryD506O/5ZCC6KUPlwLBQFenTabd8JhLDAbJ51RgFV7zYaHEOR6s+YWv+86Xts zjJrJo41C/+44LEsgr1K6vnJQwyrQpukM/khxcKJDHwpHhrCSUAwfN4gZ4VetsDSoxouJuyoAhF bCCs/F42Ih4p6ish3ReuX8gviUfx65ATl7+7WjB/nUk0U5Pzz4qN6dqNndDAVSmdPG2t+Gw4VTi FJu+e7D/MQOxH3IERM0IcFP5s78WGoxzWXWYNYK1SSZyxE9yfABpDHNPBI/aEe19vqV5SBDtbKC H8HKQO+70CsB6CQ== X-Developer-Key: i=abel.vesa@linaro.org; a=openpgp; fpr=6AFF162D57F4223A8770EF5AF7BF214136F41FAE As it is optional and no platform is actually using the secondary bus, deprecate the qcom,bus-id property. For newer platforms that implement SPMI PMIC ARB v7 in HW, the X1E80100 approach should be used. Reviewed-by: Krzysztof Kozlowski Signed-off-by: Abel Vesa --- Documentation/devicetree/bindings/spmi/qcom,spmi-pmic-arb.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/Documentation/devicetree/bindings/spmi/qcom,spmi-pmic-arb.yaml= b/Documentation/devicetree/bindings/spmi/qcom,spmi-pmic-arb.yaml index f983b4af6db9..51daf1b847a9 100644 --- a/Documentation/devicetree/bindings/spmi/qcom,spmi-pmic-arb.yaml +++ b/Documentation/devicetree/bindings/spmi/qcom,spmi-pmic-arb.yaml @@ -92,6 +92,7 @@ properties: description: > SPMI bus instance. only applicable to PMIC arbiter version 7 and bey= ond. Supported values, 0 =3D primary bus, 1 =3D secondary bus + deprecated: true =20 required: - compatible --=20 2.34.1 From nobody Fri Sep 20 01:36:37 2024 Received: from mail-ej1-f42.google.com (mail-ej1-f42.google.com [209.85.218.42]) (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 C7EE777623 for ; Tue, 2 Apr 2024 12:08:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.42 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712059684; cv=none; b=Mw6vIL0aEdR1HnZXWybJ1ruP+QkgUuobEtDZ+D8eW6dQB1m9g25WIrVHngUqP33L9+kjL23UodOYzlC6sdBrHlHqrfPyVKKHbGmVFn2JijtAF4w4/HY16ZI5pjzu+0pW1j6xW7scPXgj/3qIY01zWyKnkUhwWTC0iJzgm9IJxsc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712059684; c=relaxed/simple; bh=itu5VhzRY7+Uox8ZWhW8LPb8PjDEzOtU9DaWueGgr6c=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=MurHjDpuRKlGYJptuix78p2oc1ISCWfw7OnG6n6J7ds3mX60BNy591WObBb//deIjezBLR4zciPRtLI7h1NwHpx6PsrxkG77wlkI6wbYMLxNVKJBat7ZIfCp/yFzRu3ARUgLmFTvirbEBlzpMmDdFrgrWr0pjet5lYNr8lzDbhw= 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; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=FhzEDAYD; arc=none smtp.client-ip=209.85.218.42 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 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="FhzEDAYD" Received: by mail-ej1-f42.google.com with SMTP id a640c23a62f3a-a46ea03c2a5so923757666b.1 for ; Tue, 02 Apr 2024 05:08:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1712059681; x=1712664481; 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=Opu1+fgnwfiqRAjomE33LCew5lDraMk9w2Ix7h0wG/Q=; b=FhzEDAYDEtuODeHOwOybSx9TaRHqSwRwUM7VqtwFlmN9B6oL6ln3/1t0ooykinF4Qp U9Z9yhW8gXsSlw4Qv2s2v4UgbqdW1hpBSBrlHO79KUPkXVaRIcFKbwWcyTi72G15sQ4r Xfg7j+6YpJKE404bXjtqqlmcu92eDfwncaRIoYb2eczRw0/1kW1X9Hk0lrea37MLaLBq f0hCD44DmAuw+dCK0zUxOmCyLL+jlFN/HuDvTQH04Ne4omDw8Bgb6Dg15Us8THAV6Dsp iRzRiEgJQZGTfHQA+zgbmc0AVE+zEWyqigcSgAtYF/XJUNUblGZODjhwQRjBA5oXfusH 8ONA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1712059681; x=1712664481; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Opu1+fgnwfiqRAjomE33LCew5lDraMk9w2Ix7h0wG/Q=; b=mbedFhnslbzAEJeUKTREMQ0vbP4+jXXRZf7nP7s2XQicrktr02TrSURrksfc3fPUBg peJ0wk384ByN2VQy5Yg9BNEEqC/rVetuzG23TiML7TyJjWpSUtB6CnBOuz5Ft4JIDS50 nmqCHPrlTxWUE/CQXsYC8UuiPPZMWywQ7RGyzJIu/UStxr9Fpm4cuPoSSShSQgGricl3 cNpbX464fec3bY8CJRvko1uw7o26rj9pDoc5FmMAEKLjQHJMJpa8N7c94apem5xnzNEd PxuwkzLw0aMesC3tjY7XCWT054y6G2NVC3LQaA63rae5IiFNET7/oxrIiuP9O5J8OpTs X74w== X-Forwarded-Encrypted: i=1; AJvYcCXHgSdt4NTrb0v8MalFJJXlBN/U6iNG5vHsDi+kMP/fFDhICo/Ddc7mWMn20RACJomXUQPJg8UfWhfKdeSoyBw7zaHU0w1QaANx8wxw X-Gm-Message-State: AOJu0YztJwV6oD3rBpm6wQxbw6Nzi5rp2ZwihPFTdSjXfRlJ1YbDJupt IYo48qMgCPU5U2bLV+ttk+JaK6wKpBmk82Nmlo/g1oH4NAsbet28XOvqzcKocJo= X-Google-Smtp-Source: AGHT+IEh9Scg5RaWBPAQy9YV3zDNFVbPkDw+tNiOCwdJ9q1APPFj3+6+kqkTVUmlVfH7Rp7t9wFBgQ== X-Received: by 2002:a17:907:7e9b:b0:a47:3afd:4739 with SMTP id qb27-20020a1709077e9b00b00a473afd4739mr15686749ejc.6.1712059681089; Tue, 02 Apr 2024 05:08:01 -0700 (PDT) Received: from [127.0.1.1] ([79.114.172.194]) by smtp.gmail.com with ESMTPSA id l13-20020a1709065a8d00b00a4df251a601sm6519384ejq.77.2024.04.02.05.07.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 02 Apr 2024 05:08:00 -0700 (PDT) From: Abel Vesa Date: Tue, 02 Apr 2024 15:07:32 +0300 Subject: [PATCH v8 3/7] spmi: pmic-arb: Fix some compile warnings about members not being described 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: <20240402-spmi-multi-master-support-v8-3-ce6f2d14a058@linaro.org> References: <20240402-spmi-multi-master-support-v8-0-ce6f2d14a058@linaro.org> In-Reply-To: <20240402-spmi-multi-master-support-v8-0-ce6f2d14a058@linaro.org> To: Stephen Boyd , Matthias Brugger , Bjorn Andersson , Konrad Dybcio , Dmitry Baryshkov , Neil Armstrong , AngeloGioacchino Del Regno , Rob Herring , Krzysztof Kozlowski , Conor Dooley Cc: Srini Kandagatla , Johan Hovold , linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-arm-msm@vger.kernel.org, linux-mediatek@lists.infradead.org, devicetree@vger.kernel.org, Abel Vesa X-Mailer: b4 0.13.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=2422; i=abel.vesa@linaro.org; h=from:subject:message-id; bh=itu5VhzRY7+Uox8ZWhW8LPb8PjDEzOtU9DaWueGgr6c=; b=owEBbQKS/ZANAwAKARtfRMkAlRVWAcsmYgBmC/USt2OJhH/CwprexawX8WQiCTrUZ/JwoYHDt lhJSzZcFsmJAjMEAAEKAB0WIQRO8+4RTnqPKsqn0bgbX0TJAJUVVgUCZgv1EgAKCRAbX0TJAJUV VsBnEAC8IyeAcovEWVj5iC/wADmCZjSgb9pbAnqUPt70WMLSgJ4HRbEjWF36d6LGFaSjETGMI4A xOyjGogFEFo8l0vmThd4x4AKRTQTnx0bFyQImr/uQQa9gKWsEaMkmVPbSkt1B1tzmMPaiByOwfv HPxdZCWtH+V8te9gxZ0SSDwF+bSceX1ODUN1TRZWPvsubYKXQ5DqY2A8yTe19sHk8gPTgT/BsBm MM9IpNRw86t99t/5tLYjYCBb7t/tX2FcM7HHFb8y2VuoyrPJNeVhCefulUftkPcrRzeWK/zAhuR yJT8qFV5r1RR/cu1BS772cNY/BgARjlm1ro8D5DxsGx1rKqbTe3K3vcfmJ5p15Ab5kg+AavCX5z KNngO2/LBqk/8fyHfQ7CCUklV4BlBWFxgxBYYnUJvdLYNQ7k6hrZWjozlfNSJxh1wlSOmCAFkD3 JvcdP4Sil7lGTrtAgtr0F8mIz4d1f7i6By4DYXs03w/CADTsv1657RT9Dn0M9YGRxTYYFA82DmC tgRudjlugcxgFsepVgqEAzHVTrBTtP4BwdolnYLfU4Tgg7FCbmsfSIRYG8c8YQnoj12617TH7Y8 uHJTvirYpo6xbCLiirhTAH6xA3F/HACb6Fnr0O5Uo3bosdFrkRb2VQDMOmL7+qt5v2CRySQrcUd ZNnPnz120EcwJKA== X-Developer-Key: i=abel.vesa@linaro.org; a=openpgp; fpr=6AFF162D57F4223A8770EF5AF7BF214136F41FAE Fix the following compile warnings: warning: Function parameter or struct member 'core' not described in 'spmi= _pmic_arb' warning: Function parameter or struct member 'core_size' not described in = 'spmi_pmic_arb' warning: Function parameter or struct member 'mapping_table_valid' not des= cribed in 'spmi_pmic_arb' warning: Function parameter or struct member 'pmic_arb' not described in '= pmic_arb_read_data' warning: Function parameter or struct member 'pmic_arb' not described in '= pmic_arb_write_data' Signed-off-by: Abel Vesa Reviewed-by: Neil Armstrong --- drivers/spmi/spmi-pmic-arb.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/spmi/spmi-pmic-arb.c b/drivers/spmi/spmi-pmic-arb.c index 9ed1180fe31f..704fd4506971 100644 --- a/drivers/spmi/spmi-pmic-arb.c +++ b/drivers/spmi/spmi-pmic-arb.c @@ -132,6 +132,8 @@ struct apid_data { * @wr_base: on v1 "core", on v2 "chnls" register base off DT. * @intr: address of the SPMI interrupt control registers. * @cnfg: address of the PMIC Arbiter configuration registers. + * @core: core register base for v2 and above only (see above) + * @core_size: core register base size * @lock: lock to synchronize accesses. * @channel: execution environment channel to use for accesses. * @irq: PMIC ARB interrupt. @@ -144,6 +146,7 @@ struct apid_data { * @apid_count: on v5 and v7: number of APIDs associated with the * particular SPMI bus instance * @mapping_table: in-memory copy of PPID -> APID mapping table. + * @mapping_table_valid:bitmap containing valid-only periphs * @domain: irq domain object for PMIC IRQ domain * @spmic: SPMI controller object * @ver_ops: version dependent operations. @@ -232,6 +235,7 @@ static inline void pmic_arb_set_rd_cmd(struct spmi_pmic= _arb *pmic_arb, =20 /** * pmic_arb_read_data: reads pmic-arb's register and copy 1..4 bytes to buf + * @pmic_arb: the SPMI PMIC arbiter * @bc: byte count -1. range: 0..3 * @reg: register's address * @buf: output parameter, length must be bc + 1 @@ -246,6 +250,7 @@ pmic_arb_read_data(struct spmi_pmic_arb *pmic_arb, u8 *= buf, u32 reg, u8 bc) =20 /** * pmic_arb_write_data: write 1..4 bytes from buf to pmic-arb's register + * @pmic_arb: the SPMI PMIC arbiter * @bc: byte-count -1. range: 0..3. * @reg: register's address. * @buf: buffer to write. length must be bc + 1. --=20 2.34.1 From nobody Fri Sep 20 01:36:37 2024 Received: from mail-ej1-f44.google.com (mail-ej1-f44.google.com [209.85.218.44]) (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 530AE7A15A for ; Tue, 2 Apr 2024 12:08:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712059686; cv=none; b=gIB5ln4DLWMoyMM1OXQXD/03bTLeXkpKsu0cy14+zRWmmO79QK2sgIjEAaFG/ZVPObihJhz+/iFvL5k3YG+Iqu1ZYvd+2qrCtHqaxXksiftP4DnfpYslvM6WKn9Zlj6J1AxlvWFzrjGZbNWlsc0N8uGoFiOCPDCESg9AzdatPsA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712059686; c=relaxed/simple; bh=0hIdOnPxC6/IlNZDC4oQnGBBsSrIsuVpzjKgCwMCAOo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=eDQBJ0ipOzVb/ptEDWQbaeMwXTwKBoQ0y2b344rvAOLlqK2FdsC3KjEqBzWQ/Syy3o6aoIZCikeExNY9Jh/8w9oL1zE9leNECmVyl4RYHjUr56N9mTgQrSHkUuYNPBpxxCEt0qpbQd9iIino2X6bS+Jq6UuXp+sCw4yxuhx1ZWs= 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; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=XbKokDz6; arc=none smtp.client-ip=209.85.218.44 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 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="XbKokDz6" Received: by mail-ej1-f44.google.com with SMTP id a640c23a62f3a-a46a7208eedso657550066b.0 for ; Tue, 02 Apr 2024 05:08:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1712059683; x=1712664483; 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=Z7Pnr6PoGhceBp/MkaACIjm9COgBNW2tpmbpLJHir3Y=; b=XbKokDz6h+01q0jdLpPMELXEtqOmEqkIo8gL5pajNnz1l5kV8UnrvcfLyGDfNkZS0h f5+DI3ZK1JrEQGuAPOe4y9e6EhOruq6cYwmeIoKH8b7xxMpCVPhHPWorVO7cYc7op1Lw cfHnpRCiHlJ2ftwo/5fE6Jj8/lcfZCkK2Mkf+2OgwFfRXfxU7WksJ93T5qtMaA91lQhG 46d7vupERK7xG0ZMNX+R4+xX/jYojy6+JSqqKG24r18MdUgT3mrp0Qq8HJwJI++YpiVg d2cNVTUaAV7HJDILV9gtzSmxI4HdsBQfS7X8kfFo1aw7n/FqGX6vCEHRVcxggw5mNFXs rF9A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1712059683; x=1712664483; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Z7Pnr6PoGhceBp/MkaACIjm9COgBNW2tpmbpLJHir3Y=; b=Hb/4T+2/d/sUXR4ifJOXYR8tMWLYwzkDcwPlqFgZU+PDPdOEYfgv8NPaRpn1QOZunv L388yDEyA2yvoam6Yc/2khTvPj/hxc32WH2Pd9o3yuyuJleSh9thxH4JUQdmkBKmtKEt WO1D+mbNnoBTpnUJKAji8lwffxRO8PeDoBq8e0wQTbSKfIPI+4JjhSX3Z8Ma8oYPxQqP hBVJXK63f6ftLagsxCNk5dVFyXVhCiHLTUjqtzysrWoB6fL6gyjhoRdi3pfBVyMIjrQF Xj/attH7FfXgyYo8bzSb7IC0j0UabxlVN7Ra/omSnUBk4RDl/NAyJODccSou4od7rHme dfGg== X-Forwarded-Encrypted: i=1; AJvYcCWZ46uTCDJ1Cif8ayIsnftfYEBJW/gZM3QrKVuevFonAneqNybe2JnHhh8JhJwAEgd5ITzW1zC8xqCEDyjNSHDpg7AgYDiDkVqbMS9T X-Gm-Message-State: AOJu0YxJhiqdJoXoWXRoCLG82F7AfzrwUzQE49Ol1U0mDmVwqkMh4Oq6 WWqQ5KudvlQYnsQb4lHGtC0CWB+MPot3Pxju8pK88qSLIsaXsCGj6D3L7a5f5T8= X-Google-Smtp-Source: AGHT+IFwds7j5Oy1CAS64f68Ezrxjls4edaFYUTYmJQDs6h26uVyX/Ha/d2VYKUFNfRhPWQzeA7LaQ== X-Received: by 2002:a17:906:f754:b0:a47:183d:6c82 with SMTP id jp20-20020a170906f75400b00a47183d6c82mr7038780ejb.31.1712059682557; Tue, 02 Apr 2024 05:08:02 -0700 (PDT) Received: from [127.0.1.1] ([79.114.172.194]) by smtp.gmail.com with ESMTPSA id l13-20020a1709065a8d00b00a4df251a601sm6519384ejq.77.2024.04.02.05.08.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 02 Apr 2024 05:08:02 -0700 (PDT) From: Abel Vesa Date: Tue, 02 Apr 2024 15:07:33 +0300 Subject: [PATCH v8 4/7] spmi: pmic-arb: Make the APID init a version operation 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: <20240402-spmi-multi-master-support-v8-4-ce6f2d14a058@linaro.org> References: <20240402-spmi-multi-master-support-v8-0-ce6f2d14a058@linaro.org> In-Reply-To: <20240402-spmi-multi-master-support-v8-0-ce6f2d14a058@linaro.org> To: Stephen Boyd , Matthias Brugger , Bjorn Andersson , Konrad Dybcio , Dmitry Baryshkov , Neil Armstrong , AngeloGioacchino Del Regno , Rob Herring , Krzysztof Kozlowski , Conor Dooley Cc: Srini Kandagatla , Johan Hovold , linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-arm-msm@vger.kernel.org, linux-mediatek@lists.infradead.org, devicetree@vger.kernel.org, Abel Vesa X-Mailer: b4 0.13.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=9054; i=abel.vesa@linaro.org; h=from:subject:message-id; bh=0hIdOnPxC6/IlNZDC4oQnGBBsSrIsuVpzjKgCwMCAOo=; b=owEBbQKS/ZANAwAKARtfRMkAlRVWAcsmYgBmC/UU4XmfotH+ILXtrDAyYAY2eFzmgr0ENVhS/ xJc3ChnLoaJAjMEAAEKAB0WIQRO8+4RTnqPKsqn0bgbX0TJAJUVVgUCZgv1FAAKCRAbX0TJAJUV Vh4WEACJIpSwO9kKQF5zttWad6DOjL+Pj235726jT1wwuv1gTQaf62i4YIDB8Jpav1yAwls/F73 h59aK4lBjqnBcV9JetxIMKPYW/nsCAaWGydvquEC58diCZTY2xqItu41zyMaiSBAx3ovU1LJGwH I8KbKjYdUrZdpCYnbnVYkuhCo+AK096bXmEyV8I47kErU1zjo3ZJ/heV67mFY9qeNI91L5ojUHr f4J0BcHBfLQuk/Qm6uaNfOt3oUFzZrI8JgSoWNfxBIhCkPwM8Tkoe4EhgzH6SXKXiDE4LHY2/4Q 3ToAQGR1axG8seUfE3/+QivgMlZTT9KLyns59xfNrn30Bi2TIoooeJ/Txp4eM8Yv/rnR7+GiSJa vRbBa23cH4wzVFFkBCq3SKCxk6+tozUpkDuZrgVFKbnpQ0jpCCgKC91YN/A3YHu4t13X5hG6Vvq 2jKbS8Y7aYIbpnbyAA02jaCOUZMYuwDIpDE4JKyl3Id5kRxvekF3LqHqY9pA7ll6KtvLmJhxL+Q iKfZ9rr1wUIkbwSyz8cqwbjMtV+fientogkNtzwK3l6utP0D7CZRTWdTGL09Wj9xIeW8idY6RE1 3TBDhFu6ma/Ta+xys3lIzkjfphGhQc54QsR9rCx5MZvdR8nTphD3P690PQoRbEX9dciciazE5u6 Q/O/WuwAriDT5tg== X-Developer-Key: i=abel.vesa@linaro.org; a=openpgp; fpr=6AFF162D57F4223A8770EF5AF7BF214136F41FAE Rather than using conditionals in probe function, add the APID init as a version specific operation. Due to v7, which supports multiple buses, pass on the bus index to be used for sorting out the apid base and count. Reviewed-by: Neil Armstrong Signed-off-by: Abel Vesa --- drivers/spmi/spmi-pmic-arb.c | 144 +++++++++++++++++++++------------------= ---- 1 file changed, 69 insertions(+), 75 deletions(-) diff --git a/drivers/spmi/spmi-pmic-arb.c b/drivers/spmi/spmi-pmic-arb.c index 704fd4506971..dc969f8bed18 100644 --- a/drivers/spmi/spmi-pmic-arb.c +++ b/drivers/spmi/spmi-pmic-arb.c @@ -186,6 +186,7 @@ struct spmi_pmic_arb { * struct pmic_arb_ver_ops - version dependent functionality. * * @ver_str: version string. + * @init_apid: finds the apid base and count * @ppid_to_apid: finds the apid for a given ppid. * @non_data_cmd: on v1 issues an spmi non-data command. * on v2 no HW support, returns -EOPNOTSUPP. @@ -205,6 +206,7 @@ struct spmi_pmic_arb { */ struct pmic_arb_ver_ops { const char *ver_str; + int (*init_apid)(struct spmi_pmic_arb *pmic_arb); int (*ppid_to_apid)(struct spmi_pmic_arb *pmic_arb, u16 ppid); /* spmi commands (read_cmd, write_cmd, cmd) functionality */ int (*offset)(struct spmi_pmic_arb *pmic_arb, u8 sid, u16 addr, @@ -947,6 +949,32 @@ static int qpnpint_irq_domain_alloc(struct irq_domain = *domain, return 0; } =20 +static int pmic_arb_init_apid_min_max(struct spmi_pmic_arb *pmic_arb) +{ + /* + * Initialize max_apid/min_apid to the opposite bounds, during + * the irq domain translation, we are sure to update these + */ + pmic_arb->max_apid =3D 0; + pmic_arb->min_apid =3D pmic_arb->max_periphs - 1; + + return 0; +} + +static int pmic_arb_init_apid_v1(struct spmi_pmic_arb *pmic_arb) +{ + u32 *mapping_table; + + mapping_table =3D devm_kcalloc(&pmic_arb->spmic->dev, pmic_arb->max_perip= hs, + sizeof(*mapping_table), GFP_KERNEL); + if (!mapping_table) + return -ENOMEM; + + pmic_arb->mapping_table =3D mapping_table; + + return pmic_arb_init_apid_min_max(pmic_arb); +} + static int pmic_arb_ppid_to_apid_v1(struct spmi_pmic_arb *pmic_arb, u16 pp= id) { u32 *mapping_table =3D pmic_arb->mapping_table; @@ -1149,6 +1177,34 @@ static int pmic_arb_offset_v2(struct spmi_pmic_arb *= pmic_arb, u8 sid, u16 addr, return 0x1000 * pmic_arb->ee + 0x8000 * apid; } =20 +static int pmic_arb_init_apid_v5(struct spmi_pmic_arb *pmic_arb) +{ + int ret; + + pmic_arb->base_apid =3D 0; + pmic_arb->apid_count =3D readl_relaxed(pmic_arb->core + PMIC_ARB_FEATURES= ) & + PMIC_ARB_FEATURES_PERIPH_MASK; + + if (pmic_arb->base_apid + pmic_arb->apid_count > pmic_arb->max_periphs) { + dev_err(&pmic_arb->spmic->dev, "Unsupported APID count %d detected\n", + pmic_arb->base_apid + pmic_arb->apid_count); + return -EINVAL; + } + + ret =3D pmic_arb_init_apid_min_max(pmic_arb); + if (ret) + return ret; + + ret =3D pmic_arb_read_apid_map_v5(pmic_arb); + if (ret) { + dev_err(&pmic_arb->spmic->dev, "could not read APID->PPID mapping table,= rc=3D %d\n", + ret); + return ret; + } + + return 0; +} + /* * v5 offset per ee and per apid for observer channels and per apid for * read/write channels. @@ -1363,6 +1419,7 @@ pmic_arb_apid_owner_v7(struct spmi_pmic_arb *pmic_arb= , u16 n) =20 static const struct pmic_arb_ver_ops pmic_arb_v1 =3D { .ver_str =3D "v1", + .init_apid =3D pmic_arb_init_apid_v1, .ppid_to_apid =3D pmic_arb_ppid_to_apid_v1, .non_data_cmd =3D pmic_arb_non_data_cmd_v1, .offset =3D pmic_arb_offset_v1, @@ -1377,6 +1434,7 @@ static const struct pmic_arb_ver_ops pmic_arb_v1 =3D { =20 static const struct pmic_arb_ver_ops pmic_arb_v2 =3D { .ver_str =3D "v2", + .init_apid =3D pmic_arb_init_apid_v1, .ppid_to_apid =3D pmic_arb_ppid_to_apid_v2, .non_data_cmd =3D pmic_arb_non_data_cmd_v2, .offset =3D pmic_arb_offset_v2, @@ -1391,6 +1449,7 @@ static const struct pmic_arb_ver_ops pmic_arb_v2 =3D { =20 static const struct pmic_arb_ver_ops pmic_arb_v3 =3D { .ver_str =3D "v3", + .init_apid =3D pmic_arb_init_apid_v1, .ppid_to_apid =3D pmic_arb_ppid_to_apid_v2, .non_data_cmd =3D pmic_arb_non_data_cmd_v2, .offset =3D pmic_arb_offset_v2, @@ -1405,6 +1464,7 @@ static const struct pmic_arb_ver_ops pmic_arb_v3 =3D { =20 static const struct pmic_arb_ver_ops pmic_arb_v5 =3D { .ver_str =3D "v5", + .init_apid =3D pmic_arb_init_apid_v5, .ppid_to_apid =3D pmic_arb_ppid_to_apid_v5, .non_data_cmd =3D pmic_arb_non_data_cmd_v2, .offset =3D pmic_arb_offset_v5, @@ -1419,6 +1479,7 @@ static const struct pmic_arb_ver_ops pmic_arb_v5 =3D { =20 static const struct pmic_arb_ver_ops pmic_arb_v7 =3D { .ver_str =3D "v7", + .init_apid =3D pmic_arb_init_apid_v5, .ppid_to_apid =3D pmic_arb_ppid_to_apid_v5, .non_data_cmd =3D pmic_arb_non_data_cmd_v2, .offset =3D pmic_arb_offset_v7, @@ -1444,7 +1505,6 @@ static int spmi_pmic_arb_probe(struct platform_device= *pdev) struct spmi_controller *ctrl; struct resource *res; void __iomem *core; - u32 *mapping_table; u32 channel, ee, hw_ver; int err; =20 @@ -1472,12 +1532,6 @@ static int spmi_pmic_arb_probe(struct platform_devic= e *pdev) =20 pmic_arb->core_size =3D resource_size(res); =20 - pmic_arb->ppid_to_apid =3D devm_kcalloc(&ctrl->dev, PMIC_ARB_MAX_PPID, - sizeof(*pmic_arb->ppid_to_apid), - GFP_KERNEL); - if (!pmic_arb->ppid_to_apid) - return -ENOMEM; - hw_ver =3D readl_relaxed(core + PMIC_ARB_VERSION); =20 if (hw_ver < PMIC_ARB_VERSION_V2_MIN) { @@ -1511,58 +1565,17 @@ static int spmi_pmic_arb_probe(struct platform_devi= ce *pdev) return PTR_ERR(pmic_arb->wr_base); } =20 - pmic_arb->max_periphs =3D PMIC_ARB_MAX_PERIPHS; + dev_info(&ctrl->dev, "PMIC arbiter version %s (0x%x)\n", + pmic_arb->ver_ops->ver_str, hw_ver); =20 - if (hw_ver >=3D PMIC_ARB_VERSION_V7_MIN) { + if (hw_ver < PMIC_ARB_VERSION_V7_MIN) + pmic_arb->max_periphs =3D PMIC_ARB_MAX_PERIPHS; + else pmic_arb->max_periphs =3D PMIC_ARB_MAX_PERIPHS_V7; - /* Optional property for v7: */ - of_property_read_u32(pdev->dev.of_node, "qcom,bus-id", - &pmic_arb->bus_instance); - if (pmic_arb->bus_instance > 1) { - dev_err(&pdev->dev, "invalid bus instance (%u) specified\n", - pmic_arb->bus_instance); - return -EINVAL; - } =20 - if (pmic_arb->bus_instance =3D=3D 0) { - pmic_arb->base_apid =3D 0; - pmic_arb->apid_count =3D - readl_relaxed(core + PMIC_ARB_FEATURES) & - PMIC_ARB_FEATURES_PERIPH_MASK; - } else { - pmic_arb->base_apid =3D - readl_relaxed(core + PMIC_ARB_FEATURES) & - PMIC_ARB_FEATURES_PERIPH_MASK; - pmic_arb->apid_count =3D - readl_relaxed(core + PMIC_ARB_FEATURES1) & - PMIC_ARB_FEATURES_PERIPH_MASK; - } - - if (pmic_arb->base_apid + pmic_arb->apid_count > pmic_arb->max_periphs) { - dev_err(&pdev->dev, "Unsupported APID count %d detected\n", - pmic_arb->base_apid + pmic_arb->apid_count); - return -EINVAL; - } - } else if (hw_ver >=3D PMIC_ARB_VERSION_V5_MIN) { - pmic_arb->base_apid =3D 0; - pmic_arb->apid_count =3D readl_relaxed(core + PMIC_ARB_FEATURES) & - PMIC_ARB_FEATURES_PERIPH_MASK; - - if (pmic_arb->apid_count > pmic_arb->max_periphs) { - dev_err(&pdev->dev, "Unsupported APID count %d detected\n", - pmic_arb->apid_count); - return -EINVAL; - } - } - - pmic_arb->apid_data =3D devm_kcalloc(&ctrl->dev, pmic_arb->max_periphs, - sizeof(*pmic_arb->apid_data), - GFP_KERNEL); - if (!pmic_arb->apid_data) - return -ENOMEM; - - dev_info(&ctrl->dev, "PMIC arbiter version %s (0x%x)\n", - pmic_arb->ver_ops->ver_str, hw_ver); + err =3D pmic_arb->ver_ops->init_apid(pmic_arb); + if (err) + return err; =20 res =3D platform_get_resource_byname(pdev, IORESOURCE_MEM, "intr"); pmic_arb->intr =3D devm_ioremap_resource(&ctrl->dev, res); @@ -1604,16 +1617,6 @@ static int spmi_pmic_arb_probe(struct platform_devic= e *pdev) } =20 pmic_arb->ee =3D ee; - mapping_table =3D devm_kcalloc(&ctrl->dev, pmic_arb->max_periphs, - sizeof(*mapping_table), GFP_KERNEL); - if (!mapping_table) - return -ENOMEM; - - pmic_arb->mapping_table =3D mapping_table; - /* Initialize max_apid/min_apid to the opposite bounds, during - * the irq domain translation, we are sure to update these */ - pmic_arb->max_apid =3D 0; - pmic_arb->min_apid =3D pmic_arb->max_periphs - 1; =20 platform_set_drvdata(pdev, ctrl); raw_spin_lock_init(&pmic_arb->lock); @@ -1622,15 +1625,6 @@ static int spmi_pmic_arb_probe(struct platform_devic= e *pdev) ctrl->read_cmd =3D pmic_arb_read_cmd; ctrl->write_cmd =3D pmic_arb_write_cmd; =20 - if (hw_ver >=3D PMIC_ARB_VERSION_V5_MIN) { - err =3D pmic_arb_read_apid_map_v5(pmic_arb); - if (err) { - dev_err(&pdev->dev, "could not read APID->PPID mapping table, rc=3D %d\= n", - err); - return err; - } - } - dev_dbg(&pdev->dev, "adding irq domain\n"); pmic_arb->domain =3D irq_domain_add_tree(pdev->dev.of_node, &pmic_arb_irq_domain_ops, pmic_arb); --=20 2.34.1 From nobody Fri Sep 20 01:36:37 2024 Received: from mail-ej1-f50.google.com (mail-ej1-f50.google.com [209.85.218.50]) (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 0FFC97FBA0 for ; Tue, 2 Apr 2024 12:08:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.50 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712059688; cv=none; b=CI+Fp5fWGQc8BzF4DWjylcNZ4lBT1x9d0YuAVa1XtDn3/LPQgvurH7oprfesuu0fmMErF2BPNjiu1IRR9reDeZdSP4O4K5kKQnBTkzA3thff/Glnlix+S5gIzm3xYeTGWMvYvArTbI9MrKUIDaAr6KvPAa/DqXOJQy7dbhqM8Sg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712059688; c=relaxed/simple; bh=O7cNoZmVJWFEFWJmtPJYuOXR0ryp+dBLUdbgokTOciQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=rFzzBJO0gHAqHajomfV76FQ5YW3V3KCVVm2Wl5qNbNjNKSMRX76Iy5Qjx3h7QjMRTo2C1ySqFOBx48P92ZXsUKBf7mbORWMWAzCS2ZYVdsKD4cOESHzXYMyfLnrNPEOA5y9IeZ5gSEC21YiZsASP0v/zq5W/DdI+/XewYPGixUY= 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; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=yJ7gpiI+; arc=none smtp.client-ip=209.85.218.50 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 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="yJ7gpiI+" Received: by mail-ej1-f50.google.com with SMTP id a640c23a62f3a-a4715991c32so634360466b.1 for ; Tue, 02 Apr 2024 05:08:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1712059684; x=1712664484; 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=OLN9WNUdytta+DCs//0H8ccz+F/CN1L2bvQTLnp2UBE=; b=yJ7gpiI+97oa7+iJhOskoktzV+EL0sC6ERGJA0paiimfPKdjdAolw6JSGMHGo/ZmDm u050v8LNg7FDBwO60mc0IegIiBRkzk2i2VBV49+5WQjPrxzyGdv/PSKoqQDmrfRScXF/ U5TM1FlhaFtgpdzTv2MTplwZgiwdangE8X9keOu5cpbay30iZoEBC74beKWp6QQV1LDZ dhpyLz9LKsAq0nt9noUEAi+NAkgi5BC708GDIZ2udsl+Y2/N6dYXkNzhNo4Ade95FNfw Hgi9tDNKMW2+qmcCq4EmO5dLDH41G6dlbC7CA3nRRQlCPXmcg2zQRyp/nKx8/qhfQK2G /kjg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1712059684; x=1712664484; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=OLN9WNUdytta+DCs//0H8ccz+F/CN1L2bvQTLnp2UBE=; b=lj9+mKG+4eHUpCs+gNTrNRovWqadX2BMY5gMPhjWxAW+HaZO1Zm7Z7dy1kZWAcRwzr egS4rYK657OXaoijJ6F23B0wMEPn6TT/SYNHuHjs7w6lv4QzEVt+BSwySM1vnrLWyEEP 0jTZco9ogWRra9IUUT5cEibkB0f0Xkm7bR+C/JzCP24ZKG380sH0LA9aYukqSV5CrIuZ NcJ4pGMSxhMEiadKc5QzxDxJfelYfl0dxHrBJkoyc3jRFGvxafA+mEHo7r3I+A+GaMQP YGQ/y0WbFlb2rJK2yiL/KYMv2L6iEvzVEewoFBQImTEzXzk5cdXZfObjQqgAPjSfu4u5 YBMw== X-Forwarded-Encrypted: i=1; AJvYcCUHOeOXvCxfnM74vQKRBT0RNZrXb6GPS8WDN5KNlVqUHAxdr0vhNPxqA5HGP9TwdmBJ5ixp1lmvMu8UwyRAE4vOrFkWt6RDeuHM3XxP X-Gm-Message-State: AOJu0Yzv3hGSTODuwQi7wk9ZLX3x6ml/GpevjRayhw81yRghUQyMQ0/E ktLmomXENmUEoE4S3sIwG6V2OfvZViBg4Wu38GtvZwmm2PFyRTKHdUQ1VVdfI6s= X-Google-Smtp-Source: AGHT+IFykqzhuay1j/sfklQEoJnE1/8PVJNqyR7rbL1TlN2gu47JERvBgxs48GHilPxZUhuDj1JzFA== X-Received: by 2002:a17:906:f0cc:b0:a47:3428:2b2f with SMTP id dk12-20020a170906f0cc00b00a4734282b2fmr7437788ejb.64.1712059684163; Tue, 02 Apr 2024 05:08:04 -0700 (PDT) Received: from [127.0.1.1] ([79.114.172.194]) by smtp.gmail.com with ESMTPSA id l13-20020a1709065a8d00b00a4df251a601sm6519384ejq.77.2024.04.02.05.08.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 02 Apr 2024 05:08:03 -0700 (PDT) From: Abel Vesa Date: Tue, 02 Apr 2024 15:07:34 +0300 Subject: [PATCH v8 5/7] spmi: pmic-arb: Make core resources acquiring a version operation 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: <20240402-spmi-multi-master-support-v8-5-ce6f2d14a058@linaro.org> References: <20240402-spmi-multi-master-support-v8-0-ce6f2d14a058@linaro.org> In-Reply-To: <20240402-spmi-multi-master-support-v8-0-ce6f2d14a058@linaro.org> To: Stephen Boyd , Matthias Brugger , Bjorn Andersson , Konrad Dybcio , Dmitry Baryshkov , Neil Armstrong , AngeloGioacchino Del Regno , Rob Herring , Krzysztof Kozlowski , Conor Dooley Cc: Srini Kandagatla , Johan Hovold , linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-arm-msm@vger.kernel.org, linux-mediatek@lists.infradead.org, devicetree@vger.kernel.org, Abel Vesa X-Mailer: b4 0.13.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=8237; i=abel.vesa@linaro.org; h=from:subject:message-id; bh=O7cNoZmVJWFEFWJmtPJYuOXR0ryp+dBLUdbgokTOciQ=; b=owEBbQKS/ZANAwAKARtfRMkAlRVWAcsmYgBmC/UW/l9NfW87+6fhsij0uYti2odDmCnO7Rr5g RIiXvqys2aJAjMEAAEKAB0WIQRO8+4RTnqPKsqn0bgbX0TJAJUVVgUCZgv1FgAKCRAbX0TJAJUV VgKhD/4kjFXwwb70eAQh4aH2yC5sviEPNz2a0eR8CzUhs0oWyBdP3MqvcBwLhdWDgnXV2Uv2VnB qV4fTiKbFJJKgZ2anVsJjuJN4KzmF3xD4y47NwXIiYMpzfKxfSm0kOXbJvRNTRlWuNDjdjHQ5s8 33V/Rq1hA/f1U/92uicRL9aBoBV94FIhRMp7ifJnjeGt+DJIq5BkDljB0PqFl0J8g8DHrqBgaIo GHU0H2B4B0JQPlQKz0JZjiXyaISI0z1tLhXIIuyzXZgs2O293ApFVzchkz0EUwjFCYPOk2vOc63 a0doCCaSbfZJQaqjadKV6MdcB37aSWbwl2pV9Msg4nMNtA1RqWKJv/H1G792sFfV0Lu6wPRoqs+ p8bf7h6rJpw5J0wdppny3kDfqEL887w08ZapP/Z7nGb7D5kLxsGYCp2KQ7nILl7maEDeSg3VhFv b4mhTOwtosRMdWazFvpWWIL3kv0AIvStXx9op6O95QPoFJKEizTVkC+3urdwr75GzilCWipAFIs azeXQWRpgUCGR06jCVUcwNg8q6I0bf9CDkoJfF4+jQMlK6iXsoz4xRlAsm/HkwcWooVVX3dAIeB MLwcNlDwYEfhp0MX5uJoLPpMXLRL3Oa0FEK2v4XA1RB1f1/YVV2qiTPc3NRKd8tAx9YxbfJtvJX AipvK/ZjarLADHA== X-Developer-Key: i=abel.vesa@linaro.org; a=openpgp; fpr=6AFF162D57F4223A8770EF5AF7BF214136F41FAE Rather than setting up the core, obsrv and chnls in probe by using version specific conditionals, add a dedicated "get_core_resources" version specific op and move the acquiring in there. Since there are no current users of the second bus yet, drop the comment about why devm_platform_ioremap_resource can't be used in case of "core", as it is not applicable anymore. Don't switch to devm_platform_ioremap_resource though as we need to keep track of core size. Reviewed-by: Neil Armstrong Signed-off-by: Abel Vesa --- drivers/spmi/spmi-pmic-arb.c | 114 +++++++++++++++++++++++++++------------= ---- 1 file changed, 71 insertions(+), 43 deletions(-) diff --git a/drivers/spmi/spmi-pmic-arb.c b/drivers/spmi/spmi-pmic-arb.c index dc969f8bed18..ff777b4a6f33 100644 --- a/drivers/spmi/spmi-pmic-arb.c +++ b/drivers/spmi/spmi-pmic-arb.c @@ -186,6 +186,7 @@ struct spmi_pmic_arb { * struct pmic_arb_ver_ops - version dependent functionality. * * @ver_str: version string. + * @get_core_resources: initializes the core, observer and channels * @init_apid: finds the apid base and count * @ppid_to_apid: finds the apid for a given ppid. * @non_data_cmd: on v1 issues an spmi non-data command. @@ -206,6 +207,7 @@ struct spmi_pmic_arb { */ struct pmic_arb_ver_ops { const char *ver_str; + int (*get_core_resources)(struct platform_device *pdev, void __iomem *cor= e); int (*init_apid)(struct spmi_pmic_arb *pmic_arb); int (*ppid_to_apid)(struct spmi_pmic_arb *pmic_arb, u16 ppid); /* spmi commands (read_cmd, write_cmd, cmd) functionality */ @@ -961,6 +963,19 @@ static int pmic_arb_init_apid_min_max(struct spmi_pmic= _arb *pmic_arb) return 0; } =20 +static int pmic_arb_get_core_resources_v1(struct platform_device *pdev, + void __iomem *core) +{ + struct spmi_pmic_arb *pmic_arb =3D platform_get_drvdata(pdev); + + pmic_arb->wr_base =3D core; + pmic_arb->rd_base =3D core; + + pmic_arb->max_periphs =3D PMIC_ARB_MAX_PERIPHS; + + return 0; +} + static int pmic_arb_init_apid_v1(struct spmi_pmic_arb *pmic_arb) { u32 *mapping_table; @@ -1062,6 +1077,33 @@ static u16 pmic_arb_find_apid(struct spmi_pmic_arb *= pmic_arb, u16 ppid) return apid; } =20 +static int pmic_arb_get_obsrvr_chnls_v2(struct platform_device *pdev) +{ + struct spmi_pmic_arb *pmic_arb =3D platform_get_drvdata(pdev); + + pmic_arb->rd_base =3D devm_platform_ioremap_resource_byname(pdev, "obsrvr= "); + if (IS_ERR(pmic_arb->rd_base)) + return PTR_ERR(pmic_arb->rd_base); + + pmic_arb->wr_base =3D devm_platform_ioremap_resource_byname(pdev, "chnls"= ); + if (IS_ERR(pmic_arb->wr_base)) + return PTR_ERR(pmic_arb->wr_base); + + return 0; +} + +static int pmic_arb_get_core_resources_v2(struct platform_device *pdev, + void __iomem *core) +{ + struct spmi_pmic_arb *pmic_arb =3D platform_get_drvdata(pdev); + + pmic_arb->core =3D core; + + pmic_arb->max_periphs =3D PMIC_ARB_MAX_PERIPHS; + + return pmic_arb_get_obsrvr_chnls_v2(pdev); +} + static int pmic_arb_ppid_to_apid_v2(struct spmi_pmic_arb *pmic_arb, u16 pp= id) { u16 apid_valid; @@ -1239,6 +1281,18 @@ static int pmic_arb_offset_v5(struct spmi_pmic_arb *= pmic_arb, u8 sid, u16 addr, return offset; } =20 +static int pmic_arb_get_core_resources_v7(struct platform_device *pdev, + void __iomem *core) +{ + struct spmi_pmic_arb *pmic_arb =3D platform_get_drvdata(pdev); + + pmic_arb->core =3D core; + + pmic_arb->max_periphs =3D PMIC_ARB_MAX_PERIPHS_V7; + + return pmic_arb_get_obsrvr_chnls_v2(pdev); +} + /* * v7 offset per ee and per apid for observer channels and per apid for * read/write channels. @@ -1419,6 +1473,7 @@ pmic_arb_apid_owner_v7(struct spmi_pmic_arb *pmic_arb= , u16 n) =20 static const struct pmic_arb_ver_ops pmic_arb_v1 =3D { .ver_str =3D "v1", + .get_core_resources =3D pmic_arb_get_core_resources_v1, .init_apid =3D pmic_arb_init_apid_v1, .ppid_to_apid =3D pmic_arb_ppid_to_apid_v1, .non_data_cmd =3D pmic_arb_non_data_cmd_v1, @@ -1434,6 +1489,7 @@ static const struct pmic_arb_ver_ops pmic_arb_v1 =3D { =20 static const struct pmic_arb_ver_ops pmic_arb_v2 =3D { .ver_str =3D "v2", + .get_core_resources =3D pmic_arb_get_core_resources_v2, .init_apid =3D pmic_arb_init_apid_v1, .ppid_to_apid =3D pmic_arb_ppid_to_apid_v2, .non_data_cmd =3D pmic_arb_non_data_cmd_v2, @@ -1449,6 +1505,7 @@ static const struct pmic_arb_ver_ops pmic_arb_v2 =3D { =20 static const struct pmic_arb_ver_ops pmic_arb_v3 =3D { .ver_str =3D "v3", + .get_core_resources =3D pmic_arb_get_core_resources_v2, .init_apid =3D pmic_arb_init_apid_v1, .ppid_to_apid =3D pmic_arb_ppid_to_apid_v2, .non_data_cmd =3D pmic_arb_non_data_cmd_v2, @@ -1464,6 +1521,7 @@ static const struct pmic_arb_ver_ops pmic_arb_v3 =3D { =20 static const struct pmic_arb_ver_ops pmic_arb_v5 =3D { .ver_str =3D "v5", + .get_core_resources =3D pmic_arb_get_core_resources_v2, .init_apid =3D pmic_arb_init_apid_v5, .ppid_to_apid =3D pmic_arb_ppid_to_apid_v5, .non_data_cmd =3D pmic_arb_non_data_cmd_v2, @@ -1479,6 +1537,7 @@ static const struct pmic_arb_ver_ops pmic_arb_v5 =3D { =20 static const struct pmic_arb_ver_ops pmic_arb_v7 =3D { .ver_str =3D "v7", + .get_core_resources =3D pmic_arb_get_core_resources_v7, .init_apid =3D pmic_arb_init_apid_v5, .ppid_to_apid =3D pmic_arb_ppid_to_apid_v5, .non_data_cmd =3D pmic_arb_non_data_cmd_v2, @@ -1515,16 +1574,6 @@ static int spmi_pmic_arb_probe(struct platform_devic= e *pdev) pmic_arb =3D spmi_controller_get_drvdata(ctrl); pmic_arb->spmic =3D ctrl; =20 - /* - * Please don't replace this with devm_platform_ioremap_resource() or - * devm_ioremap_resource(). These both result in a call to - * devm_request_mem_region() which prevents multiple mappings of this - * register address range. SoCs with PMIC arbiter v7 may define two - * arbiter devices, for the two physical SPMI interfaces, which share - * some register address ranges (i.e. "core", "obsrvr", and "chnls"). - * Ensure that both devices probe successfully by calling devm_ioremap() - * which does not result in a devm_request_mem_region() call. - */ res =3D platform_get_resource_byname(pdev, IORESOURCE_MEM, "core"); core =3D devm_ioremap(&ctrl->dev, res->start, resource_size(res)); if (IS_ERR(core)) @@ -1534,44 +1583,23 @@ static int spmi_pmic_arb_probe(struct platform_devi= ce *pdev) =20 hw_ver =3D readl_relaxed(core + PMIC_ARB_VERSION); =20 - if (hw_ver < PMIC_ARB_VERSION_V2_MIN) { + if (hw_ver < PMIC_ARB_VERSION_V2_MIN) pmic_arb->ver_ops =3D &pmic_arb_v1; - pmic_arb->wr_base =3D core; - pmic_arb->rd_base =3D core; - } else { - pmic_arb->core =3D core; - - if (hw_ver < PMIC_ARB_VERSION_V3_MIN) - pmic_arb->ver_ops =3D &pmic_arb_v2; - else if (hw_ver < PMIC_ARB_VERSION_V5_MIN) - pmic_arb->ver_ops =3D &pmic_arb_v3; - else if (hw_ver < PMIC_ARB_VERSION_V7_MIN) - pmic_arb->ver_ops =3D &pmic_arb_v5; - else - pmic_arb->ver_ops =3D &pmic_arb_v7; - - res =3D platform_get_resource_byname(pdev, IORESOURCE_MEM, - "obsrvr"); - pmic_arb->rd_base =3D devm_ioremap(&ctrl->dev, res->start, - resource_size(res)); - if (IS_ERR(pmic_arb->rd_base)) - return PTR_ERR(pmic_arb->rd_base); - - res =3D platform_get_resource_byname(pdev, IORESOURCE_MEM, - "chnls"); - pmic_arb->wr_base =3D devm_ioremap(&ctrl->dev, res->start, - resource_size(res)); - if (IS_ERR(pmic_arb->wr_base)) - return PTR_ERR(pmic_arb->wr_base); - } + else if (hw_ver < PMIC_ARB_VERSION_V3_MIN) + pmic_arb->ver_ops =3D &pmic_arb_v2; + else if (hw_ver < PMIC_ARB_VERSION_V5_MIN) + pmic_arb->ver_ops =3D &pmic_arb_v3; + else if (hw_ver < PMIC_ARB_VERSION_V7_MIN) + pmic_arb->ver_ops =3D &pmic_arb_v5; + else + pmic_arb->ver_ops =3D &pmic_arb_v7; =20 dev_info(&ctrl->dev, "PMIC arbiter version %s (0x%x)\n", pmic_arb->ver_ops->ver_str, hw_ver); =20 - if (hw_ver < PMIC_ARB_VERSION_V7_MIN) - pmic_arb->max_periphs =3D PMIC_ARB_MAX_PERIPHS; - else - pmic_arb->max_periphs =3D PMIC_ARB_MAX_PERIPHS_V7; + err =3D pmic_arb->ver_ops->get_core_resources(pdev, core); + if (err) + return err; =20 err =3D pmic_arb->ver_ops->init_apid(pmic_arb); if (err) --=20 2.34.1 From nobody Fri Sep 20 01:36:37 2024 Received: from mail-ej1-f49.google.com (mail-ej1-f49.google.com [209.85.218.49]) (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 A227F81211 for ; Tue, 2 Apr 2024 12:08:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.49 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712059692; cv=none; b=XF/0wLhmWqpf0OgmW5sjBHJi1LNnMGe1K/GG3GiUrj8MrlMZrGwB6Xy3RDDJ1zXbJSOTHmbW/ALDwJZZRdF0xcHn1m62P1tGNk7ARqoyYstMzl69fI8jrrSG4pL5n/m4V1Jnxt/Jr++ClpLhkfjsD6azCNeSq8bOZKkohtf0MNQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712059692; c=relaxed/simple; bh=y6aP0S0641yIqRSyX/JFn7ejAcyqC1XEM4vq1tV8obU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=tsK0SJOtq3H40YHMN/09x0Xsgky3LgEIlI8JLbEvYzIwaYKE8qH6PCkQAtUrqUKNkJ5ytd6urUDp2B/Pco2DkkXslOBXcpaZgyBa226xOkMwHIHGVRFclGkcC7oRi5tRtfANVpqAYD8CTJMWTnW2RDc79+t5ERODfLCN7lGfDdI= 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; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=W3FMf53y; arc=none smtp.client-ip=209.85.218.49 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 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="W3FMf53y" Received: by mail-ej1-f49.google.com with SMTP id a640c23a62f3a-a46ba938de0so670085166b.3 for ; Tue, 02 Apr 2024 05:08:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1712059686; x=1712664486; 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=jQ7+cES/QwVOtTINXizc+29+kwqiiUr23ae3QUu+Yzc=; b=W3FMf53ynzvs2up9taJqTzs/PqgIunlKrSF6RqwdSZLrNlQoNT0qiwbLiwRLOM/Wrw HCjMYti510ULrAIP7opugnQ28g2J2vRLX8pKFequqOc8KHQQv5D/yiyHad1mTtCV20yx CsEebY04Vyfv92FpPU+w7IcdIkk/j0DcprcYEQS3WMq85lrz05GrRYepLnPWl6g3z/l1 rj2IK49e31xRiQUbqQFUs7Pm50LQKSl75sH9GehQZbOdlKPSwJFGn5hpOu0KziXQxGs1 ++q1xHF3GG2wjfkYRepOJnX2dIuJgTd2I7qujID/QnNXmLGTnK1vkVQnT1I7M5tJwTh5 NC2Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1712059686; x=1712664486; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=jQ7+cES/QwVOtTINXizc+29+kwqiiUr23ae3QUu+Yzc=; b=t1anS2nGa4eSdF0EhPrmdPBQJP7aPRhMoZ3qKyij/OqnUIuyMKKtVWAAbuzcKmOxZ6 09fmz1i4aLnPOJ/dhNKtry2pOab3htk9cpCrmyH+BLJwSbCRAjxAV9nLHRcaSJBXqRgP Ac5aQiujBdIBlrvTrMHXzn+GfJwAVTXpX/FCrMsU8GHNzLASsaoWv9pt0QZoJT6Nyy47 MfmNW6cnxyIjyFa1AvAvrhC8htjW98OxCEYGtTyX/M3Ew+2CAIl7ateiYhSLD/MlxHgt 8OSj7ZNeAVGbL8v10a2N/dLkvKe7vTzkHa8kfTdohjp9q1eKRbIyqXFqJqJGLP0DRSuf SJQw== X-Forwarded-Encrypted: i=1; AJvYcCXy/iZghBl1fRZ6othPGzvQmFoZ0pDwchqRBagvYBLvOPyll4SofZ2wffFOsL7vTE/qGoXsjUUn5xg4u4PGWtJcygPjynDnGeNPHmGc X-Gm-Message-State: AOJu0YwmaC/KQJohr7xQAaLHN7Z934VRH17v5AAX4eT7eogQSVRxRlUJ JKEcCQ1Y9WjB/UYLY/ArpGeY+R3OSn2qSMG4tJK1aUrzFs7I4yy4ijiQvqSfN4I= X-Google-Smtp-Source: AGHT+IH4p+VDceDsj0JN63d/fEUn+sueOaQf5msHBW2fEDe7ORe6aPkjMGWOYPpFK6j/kXt4B3Rrgg== X-Received: by 2002:a17:907:7da1:b0:a4e:6957:de25 with SMTP id oz33-20020a1709077da100b00a4e6957de25mr4604736ejc.57.1712059685793; Tue, 02 Apr 2024 05:08:05 -0700 (PDT) Received: from [127.0.1.1] ([79.114.172.194]) by smtp.gmail.com with ESMTPSA id l13-20020a1709065a8d00b00a4df251a601sm6519384ejq.77.2024.04.02.05.08.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 02 Apr 2024 05:08:05 -0700 (PDT) From: Abel Vesa Date: Tue, 02 Apr 2024 15:07:35 +0300 Subject: [PATCH v8 6/7] spmi: pmic-arb: Register controller for bus instead of arbiter 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: <20240402-spmi-multi-master-support-v8-6-ce6f2d14a058@linaro.org> References: <20240402-spmi-multi-master-support-v8-0-ce6f2d14a058@linaro.org> In-Reply-To: <20240402-spmi-multi-master-support-v8-0-ce6f2d14a058@linaro.org> To: Stephen Boyd , Matthias Brugger , Bjorn Andersson , Konrad Dybcio , Dmitry Baryshkov , Neil Armstrong , AngeloGioacchino Del Regno , Rob Herring , Krzysztof Kozlowski , Conor Dooley Cc: Srini Kandagatla , Johan Hovold , linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-arm-msm@vger.kernel.org, linux-mediatek@lists.infradead.org, devicetree@vger.kernel.org, Abel Vesa X-Mailer: b4 0.13.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=50106; i=abel.vesa@linaro.org; h=from:subject:message-id; bh=y6aP0S0641yIqRSyX/JFn7ejAcyqC1XEM4vq1tV8obU=; b=owEBbQKS/ZANAwAKARtfRMkAlRVWAcsmYgBmC/UX7vLVhVbvd07jv5kC+zAiq9Knst1RJDQ1m kz3SokHz4WJAjMEAAEKAB0WIQRO8+4RTnqPKsqn0bgbX0TJAJUVVgUCZgv1FwAKCRAbX0TJAJUV VguDEACGvKsEwKT8rSO0xg0ncsdH1E03EiWUmco5CSB3cNhaVheumZdaAVfVyWiRXhlx92AIuep qzmgw1SsgidL0KAjcYw8e4KCrbuFnwSHaTmhwlp6h8A/dg5p4N+yZtFmkgZjJI2hxtNbvKRYtT/ rjD74DQkTY/FsmfWk1RKFapW6+P+R65GCCnBDLjYwmMrTq8GRAc+dQ2og1C5tubI6evzIQj4D6K bAmEwydAK9fiZt2+5+/XxHrlR//Vc2+mJr803Ia98MMBxDMsnC2Y6tbUixLhwZSPtFi2Cijs6OT uTwgyFYqYV4dvnWLI0DNH7iNjccaSo5Ya7La+0LaOBFv55lrJenD0B48lVwOBujHvueILFR4+S1 LrDi3JHWS2gEz3772fYvxjhG5ABNAHDBFuTU0DLhAIXAcXtjj3mUo4Q9n+AmeO9pkFJN0g6Gkb3 qGYpa/v5/MfH/pWRiM80FsD7Z1pI1RvgKIlxUPoONzsfTGxGX0o5Hrp9t41RRw995to/9JiO5iR sAGRFLkTk0UsIRHSIXplwx0dTemj9e1A4qzPm0ETjqcvr3zxaDU0RlJnMS8JhPlg7zqpY7Qu1H9 0n5QxD/e9PVxPf/bhc/LE+qfnBalyeaOyPe1MyqwvjPMxGEvR8KTNivBBNlmiHdgOgKZPwqv+dV Nv57X5k5DEOkSbQ== X-Developer-Key: i=abel.vesa@linaro.org; a=openpgp; fpr=6AFF162D57F4223A8770EF5AF7BF214136F41FAE Introduce the bus object in order to decouple the resources that are bus specific from the arbiter. This way the SPMI controller is registered with the generic framework at a bus level rather than arbiter. This is needed in order to prepare for multi bus support. Signed-off-by: Abel Vesa Reviewed-by: Neil Armstrong --- drivers/spmi/spmi-pmic-arb.c | 647 ++++++++++++++++++++++++---------------= ---- 1 file changed, 369 insertions(+), 278 deletions(-) diff --git a/drivers/spmi/spmi-pmic-arb.c b/drivers/spmi/spmi-pmic-arb.c index ff777b4a6f33..3db622ed80de 100644 --- a/drivers/spmi/spmi-pmic-arb.c +++ b/drivers/spmi/spmi-pmic-arb.c @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -125,61 +126,72 @@ struct apid_data { u8 irq_ee; }; =20 +struct spmi_pmic_arb; + /** - * struct spmi_pmic_arb - SPMI PMIC Arbiter object + * struct spmi_pmic_arb_bus - SPMI PMIC Arbiter Bus object * - * @rd_base: on v1 "core", on v2 "observer" register base off DT. - * @wr_base: on v1 "core", on v2 "chnls" register base off DT. + * @pmic_arb: the SPMI PMIC Arbiter the bus belongs to. + * @domain: irq domain object for PMIC IRQ domain * @intr: address of the SPMI interrupt control registers. * @cnfg: address of the PMIC Arbiter configuration registers. - * @core: core register base for v2 and above only (see above) - * @core_size: core register base size - * @lock: lock to synchronize accesses. - * @channel: execution environment channel to use for accesses. - * @irq: PMIC ARB interrupt. - * @ee: the current Execution Environment - * @bus_instance: on v7: 0 =3D primary SPMI bus, 1 =3D secondary SPMI bus - * @min_apid: minimum APID (used for bounding IRQ search) - * @max_apid: maximum APID + * @spmic: spmi controller registered for this bus * @base_apid: on v7: minimum APID associated with the particular SPMI * bus instance * @apid_count: on v5 and v7: number of APIDs associated with the * particular SPMI bus instance * @mapping_table: in-memory copy of PPID -> APID mapping table. * @mapping_table_valid:bitmap containing valid-only periphs - * @domain: irq domain object for PMIC IRQ domain - * @spmic: SPMI controller object - * @ver_ops: version dependent operations. * @ppid_to_apid: in-memory copy of PPID -> APID mapping table. * @last_apid: Highest value APID in use * @apid_data: Table of data for all APIDs + * @min_apid: minimum APID (used for bounding IRQ search) + * @max_apid: maximum APID + * @irq: PMIC ARB interrupt. + */ +struct spmi_pmic_arb_bus { + struct spmi_pmic_arb *pmic_arb; + struct irq_domain *domain; + void __iomem *intr; + void __iomem *cnfg; + struct spmi_controller *spmic; + u16 base_apid; + int apid_count; + u32 *mapping_table; + DECLARE_BITMAP(mapping_table_valid, PMIC_ARB_MAX_PERIPHS); + u16 *ppid_to_apid; + u16 last_apid; + struct apid_data *apid_data; + u16 min_apid; + u16 max_apid; + int irq; +}; + +/** + * struct spmi_pmic_arb - SPMI PMIC Arbiter object + * + * @rd_base: on v1 "core", on v2 "observer" register base off DT. + * @wr_base: on v1 "core", on v2 "chnls" register base off DT. + * @core: core register base for v2 and above only (see above) + * @core_size: core register base size + * @lock: lock to synchronize accesses. + * @channel: execution environment channel to use for accesses. + * @ee: the current Execution Environment + * @ver_ops: version dependent operations. * @max_periphs: Number of elements in apid_data[] + * @bus: per arbiter bus instance */ struct spmi_pmic_arb { void __iomem *rd_base; void __iomem *wr_base; - void __iomem *intr; - void __iomem *cnfg; void __iomem *core; resource_size_t core_size; raw_spinlock_t lock; u8 channel; - int irq; u8 ee; - u32 bus_instance; - u16 min_apid; - u16 max_apid; - u16 base_apid; - int apid_count; - u32 *mapping_table; - DECLARE_BITMAP(mapping_table_valid, PMIC_ARB_MAX_PERIPHS); - struct irq_domain *domain; - struct spmi_controller *spmic; const struct pmic_arb_ver_ops *ver_ops; - u16 *ppid_to_apid; - u16 last_apid; - struct apid_data *apid_data; int max_periphs; + struct spmi_pmic_arb_bus *bus; }; =20 /** @@ -208,21 +220,21 @@ struct spmi_pmic_arb { struct pmic_arb_ver_ops { const char *ver_str; int (*get_core_resources)(struct platform_device *pdev, void __iomem *cor= e); - int (*init_apid)(struct spmi_pmic_arb *pmic_arb); - int (*ppid_to_apid)(struct spmi_pmic_arb *pmic_arb, u16 ppid); + int (*init_apid)(struct spmi_pmic_arb_bus *bus); + int (*ppid_to_apid)(struct spmi_pmic_arb_bus *bus, u16 ppid); /* spmi commands (read_cmd, write_cmd, cmd) functionality */ - int (*offset)(struct spmi_pmic_arb *pmic_arb, u8 sid, u16 addr, - enum pmic_arb_channel ch_type); + int (*offset)(struct spmi_pmic_arb_bus *bus, u8 sid, u16 addr, + enum pmic_arb_channel ch_type); u32 (*fmt_cmd)(u8 opc, u8 sid, u16 addr, u8 bc); int (*non_data_cmd)(struct spmi_controller *ctrl, u8 opc, u8 sid); /* Interrupts controller functionality (offset of PIC registers) */ - void __iomem *(*owner_acc_status)(struct spmi_pmic_arb *pmic_arb, u8 m, + void __iomem *(*owner_acc_status)(struct spmi_pmic_arb_bus *bus, u8 m, u16 n); - void __iomem *(*acc_enable)(struct spmi_pmic_arb *pmic_arb, u16 n); - void __iomem *(*irq_status)(struct spmi_pmic_arb *pmic_arb, u16 n); - void __iomem *(*irq_clear)(struct spmi_pmic_arb *pmic_arb, u16 n); + void __iomem *(*acc_enable)(struct spmi_pmic_arb_bus *bus, u16 n); + void __iomem *(*irq_status)(struct spmi_pmic_arb_bus *bus, u16 n); + void __iomem *(*irq_clear)(struct spmi_pmic_arb_bus *bus, u16 n); u32 (*apid_map_offset)(u16 n); - void __iomem *(*apid_owner)(struct spmi_pmic_arb *pmic_arb, u16 n); + void __iomem *(*apid_owner)(struct spmi_pmic_arb_bus *bus, u16 n); }; =20 static inline void pmic_arb_base_write(struct spmi_pmic_arb *pmic_arb, @@ -272,13 +284,14 @@ static int pmic_arb_wait_for_done(struct spmi_control= ler *ctrl, void __iomem *base, u8 sid, u16 addr, enum pmic_arb_channel ch_type) { - struct spmi_pmic_arb *pmic_arb =3D spmi_controller_get_drvdata(ctrl); + struct spmi_pmic_arb_bus *bus =3D spmi_controller_get_drvdata(ctrl); + struct spmi_pmic_arb *pmic_arb =3D bus->pmic_arb; u32 status =3D 0; u32 timeout =3D PMIC_ARB_TIMEOUT_US; u32 offset; int rc; =20 - rc =3D pmic_arb->ver_ops->offset(pmic_arb, sid, addr, ch_type); + rc =3D pmic_arb->ver_ops->offset(bus, sid, addr, ch_type); if (rc < 0) return rc; =20 @@ -321,13 +334,14 @@ static int pmic_arb_wait_for_done(struct spmi_control= ler *ctrl, static int pmic_arb_non_data_cmd_v1(struct spmi_controller *ctrl, u8 opc, u8 sid) { - struct spmi_pmic_arb *pmic_arb =3D spmi_controller_get_drvdata(ctrl); + struct spmi_pmic_arb_bus *bus =3D spmi_controller_get_drvdata(ctrl); + struct spmi_pmic_arb *pmic_arb =3D bus->pmic_arb; unsigned long flags; u32 cmd; int rc; u32 offset; =20 - rc =3D pmic_arb->ver_ops->offset(pmic_arb, sid, 0, PMIC_ARB_CHANNEL_RW); + rc =3D pmic_arb->ver_ops->offset(bus, sid, 0, PMIC_ARB_CHANNEL_RW); if (rc < 0) return rc; =20 @@ -363,20 +377,21 @@ static int pmic_arb_cmd(struct spmi_controller *ctrl,= u8 opc, u8 sid) return pmic_arb->ver_ops->non_data_cmd(ctrl, opc, sid); } =20 -static int pmic_arb_fmt_read_cmd(struct spmi_pmic_arb *pmic_arb, u8 opc, u= 8 sid, +static int pmic_arb_fmt_read_cmd(struct spmi_pmic_arb_bus *bus, u8 opc, u8= sid, u16 addr, size_t len, u32 *cmd, u32 *offset) { + struct spmi_pmic_arb *pmic_arb =3D bus->pmic_arb; u8 bc =3D len - 1; int rc; =20 - rc =3D pmic_arb->ver_ops->offset(pmic_arb, sid, addr, + rc =3D pmic_arb->ver_ops->offset(bus, sid, addr, PMIC_ARB_CHANNEL_OBS); if (rc < 0) return rc; =20 *offset =3D rc; if (bc >=3D PMIC_ARB_MAX_TRANS_BYTES) { - dev_err(&pmic_arb->spmic->dev, "pmic-arb supports 1..%d bytes per trans,= but:%zu requested", + dev_err(&bus->spmic->dev, "pmic-arb supports 1..%d bytes per trans, but:= %zu requested", PMIC_ARB_MAX_TRANS_BYTES, len); return -EINVAL; } @@ -400,7 +415,8 @@ static int pmic_arb_read_cmd_unlocked(struct spmi_contr= oller *ctrl, u32 cmd, u32 offset, u8 sid, u16 addr, u8 *buf, size_t len) { - struct spmi_pmic_arb *pmic_arb =3D spmi_controller_get_drvdata(ctrl); + struct spmi_pmic_arb_bus *bus =3D spmi_controller_get_drvdata(ctrl); + struct spmi_pmic_arb *pmic_arb =3D bus->pmic_arb; u8 bc =3D len - 1; int rc; =20 @@ -422,12 +438,13 @@ static int pmic_arb_read_cmd_unlocked(struct spmi_con= troller *ctrl, u32 cmd, static int pmic_arb_read_cmd(struct spmi_controller *ctrl, u8 opc, u8 sid, u16 addr, u8 *buf, size_t len) { - struct spmi_pmic_arb *pmic_arb =3D spmi_controller_get_drvdata(ctrl); + struct spmi_pmic_arb_bus *bus =3D spmi_controller_get_drvdata(ctrl); + struct spmi_pmic_arb *pmic_arb =3D bus->pmic_arb; unsigned long flags; u32 cmd, offset; int rc; =20 - rc =3D pmic_arb_fmt_read_cmd(pmic_arb, opc, sid, addr, len, &cmd, + rc =3D pmic_arb_fmt_read_cmd(bus, opc, sid, addr, len, &cmd, &offset); if (rc) return rc; @@ -439,21 +456,22 @@ static int pmic_arb_read_cmd(struct spmi_controller *= ctrl, u8 opc, u8 sid, return rc; } =20 -static int pmic_arb_fmt_write_cmd(struct spmi_pmic_arb *pmic_arb, u8 opc, +static int pmic_arb_fmt_write_cmd(struct spmi_pmic_arb_bus *bus, u8 opc, u8 sid, u16 addr, size_t len, u32 *cmd, u32 *offset) { + struct spmi_pmic_arb *pmic_arb =3D bus->pmic_arb; u8 bc =3D len - 1; int rc; =20 - rc =3D pmic_arb->ver_ops->offset(pmic_arb, sid, addr, + rc =3D pmic_arb->ver_ops->offset(bus, sid, addr, PMIC_ARB_CHANNEL_RW); if (rc < 0) return rc; =20 *offset =3D rc; if (bc >=3D PMIC_ARB_MAX_TRANS_BYTES) { - dev_err(&pmic_arb->spmic->dev, "pmic-arb supports 1..%d bytes per trans,= but:%zu requested", + dev_err(&bus->spmic->dev, "pmic-arb supports 1..%d bytes per trans, but:= %zu requested", PMIC_ARB_MAX_TRANS_BYTES, len); return -EINVAL; } @@ -479,7 +497,8 @@ static int pmic_arb_write_cmd_unlocked(struct spmi_cont= roller *ctrl, u32 cmd, u32 offset, u8 sid, u16 addr, const u8 *buf, size_t len) { - struct spmi_pmic_arb *pmic_arb =3D spmi_controller_get_drvdata(ctrl); + struct spmi_pmic_arb_bus *bus =3D spmi_controller_get_drvdata(ctrl); + struct spmi_pmic_arb *pmic_arb =3D bus->pmic_arb; u8 bc =3D len - 1; =20 /* Write data to FIFOs */ @@ -498,12 +517,13 @@ static int pmic_arb_write_cmd_unlocked(struct spmi_co= ntroller *ctrl, u32 cmd, static int pmic_arb_write_cmd(struct spmi_controller *ctrl, u8 opc, u8 sid, u16 addr, const u8 *buf, size_t len) { - struct spmi_pmic_arb *pmic_arb =3D spmi_controller_get_drvdata(ctrl); + struct spmi_pmic_arb_bus *bus =3D spmi_controller_get_drvdata(ctrl); + struct spmi_pmic_arb *pmic_arb =3D bus->pmic_arb; unsigned long flags; u32 cmd, offset; int rc; =20 - rc =3D pmic_arb_fmt_write_cmd(pmic_arb, opc, sid, addr, len, &cmd, + rc =3D pmic_arb_fmt_write_cmd(bus, opc, sid, addr, len, &cmd, &offset); if (rc) return rc; @@ -519,18 +539,19 @@ static int pmic_arb_write_cmd(struct spmi_controller = *ctrl, u8 opc, u8 sid, static int pmic_arb_masked_write(struct spmi_controller *ctrl, u8 sid, u16= addr, const u8 *buf, const u8 *mask, size_t len) { - struct spmi_pmic_arb *pmic_arb =3D spmi_controller_get_drvdata(ctrl); + struct spmi_pmic_arb_bus *bus =3D spmi_controller_get_drvdata(ctrl); + struct spmi_pmic_arb *pmic_arb =3D bus->pmic_arb; u32 read_cmd, read_offset, write_cmd, write_offset; u8 temp[PMIC_ARB_MAX_TRANS_BYTES]; unsigned long flags; int rc, i; =20 - rc =3D pmic_arb_fmt_read_cmd(pmic_arb, SPMI_CMD_EXT_READL, sid, addr, len, + rc =3D pmic_arb_fmt_read_cmd(bus, SPMI_CMD_EXT_READL, sid, addr, len, &read_cmd, &read_offset); if (rc) return rc; =20 - rc =3D pmic_arb_fmt_write_cmd(pmic_arb, SPMI_CMD_EXT_WRITEL, sid, addr, + rc =3D pmic_arb_fmt_write_cmd(bus, SPMI_CMD_EXT_WRITEL, sid, addr, len, &write_cmd, &write_offset); if (rc) return rc; @@ -573,25 +594,25 @@ struct spmi_pmic_arb_qpnpint_type { static void qpnpint_spmi_write(struct irq_data *d, u8 reg, void *buf, size_t len) { - struct spmi_pmic_arb *pmic_arb =3D irq_data_get_irq_chip_data(d); + struct spmi_pmic_arb_bus *bus =3D irq_data_get_irq_chip_data(d); u8 sid =3D hwirq_to_sid(d->hwirq); u8 per =3D hwirq_to_per(d->hwirq); =20 - if (pmic_arb_write_cmd(pmic_arb->spmic, SPMI_CMD_EXT_WRITEL, sid, + if (pmic_arb_write_cmd(bus->spmic, SPMI_CMD_EXT_WRITEL, sid, (per << 8) + reg, buf, len)) - dev_err_ratelimited(&pmic_arb->spmic->dev, "failed irqchip transaction o= n %x\n", + dev_err_ratelimited(&bus->spmic->dev, "failed irqchip transaction on %x\= n", d->irq); } =20 static void qpnpint_spmi_read(struct irq_data *d, u8 reg, void *buf, size_= t len) { - struct spmi_pmic_arb *pmic_arb =3D irq_data_get_irq_chip_data(d); + struct spmi_pmic_arb_bus *bus =3D irq_data_get_irq_chip_data(d); u8 sid =3D hwirq_to_sid(d->hwirq); u8 per =3D hwirq_to_per(d->hwirq); =20 - if (pmic_arb_read_cmd(pmic_arb->spmic, SPMI_CMD_EXT_READL, sid, + if (pmic_arb_read_cmd(bus->spmic, SPMI_CMD_EXT_READL, sid, (per << 8) + reg, buf, len)) - dev_err_ratelimited(&pmic_arb->spmic->dev, "failed irqchip transaction o= n %x\n", + dev_err_ratelimited(&bus->spmic->dev, "failed irqchip transaction on %x\= n", d->irq); } =20 @@ -599,47 +620,49 @@ static int qpnpint_spmi_masked_write(struct irq_data = *d, u8 reg, const void *buf, const void *mask, size_t len) { - struct spmi_pmic_arb *pmic_arb =3D irq_data_get_irq_chip_data(d); + struct spmi_pmic_arb_bus *bus =3D irq_data_get_irq_chip_data(d); u8 sid =3D hwirq_to_sid(d->hwirq); u8 per =3D hwirq_to_per(d->hwirq); int rc; =20 - rc =3D pmic_arb_masked_write(pmic_arb->spmic, sid, (per << 8) + reg, buf, + rc =3D pmic_arb_masked_write(bus->spmic, sid, (per << 8) + reg, buf, mask, len); if (rc) - dev_err_ratelimited(&pmic_arb->spmic->dev, "failed irqchip transaction o= n %x rc=3D%d\n", + dev_err_ratelimited(&bus->spmic->dev, "failed irqchip transaction on %x = rc=3D%d\n", d->irq, rc); return rc; } =20 -static void cleanup_irq(struct spmi_pmic_arb *pmic_arb, u16 apid, int id) +static void cleanup_irq(struct spmi_pmic_arb_bus *bus, u16 apid, int id) { - u16 ppid =3D pmic_arb->apid_data[apid].ppid; + struct spmi_pmic_arb *pmic_arb =3D bus->pmic_arb; + u16 ppid =3D bus->apid_data[apid].ppid; u8 sid =3D ppid >> 8; u8 per =3D ppid & 0xFF; u8 irq_mask =3D BIT(id); =20 - dev_err_ratelimited(&pmic_arb->spmic->dev, "%s apid=3D%d sid=3D0x%x per= =3D0x%x irq=3D%d\n", - __func__, apid, sid, per, id); - writel_relaxed(irq_mask, pmic_arb->ver_ops->irq_clear(pmic_arb, apid)); + dev_err_ratelimited(&bus->spmic->dev, "%s apid=3D%d sid=3D0x%x per=3D0x%x= irq=3D%d\n", + __func__, apid, sid, per, id); + writel_relaxed(irq_mask, pmic_arb->ver_ops->irq_clear(bus, apid)); } =20 -static int periph_interrupt(struct spmi_pmic_arb *pmic_arb, u16 apid) +static int periph_interrupt(struct spmi_pmic_arb_bus *bus, u16 apid) { + struct spmi_pmic_arb *pmic_arb =3D bus->pmic_arb; unsigned int irq; u32 status, id; int handled =3D 0; - u8 sid =3D (pmic_arb->apid_data[apid].ppid >> 8) & 0xF; - u8 per =3D pmic_arb->apid_data[apid].ppid & 0xFF; + u8 sid =3D (bus->apid_data[apid].ppid >> 8) & 0xF; + u8 per =3D bus->apid_data[apid].ppid & 0xFF; =20 - status =3D readl_relaxed(pmic_arb->ver_ops->irq_status(pmic_arb, apid)); + status =3D readl_relaxed(pmic_arb->ver_ops->irq_status(bus, apid)); while (status) { id =3D ffs(status) - 1; status &=3D ~BIT(id); - irq =3D irq_find_mapping(pmic_arb->domain, - spec_to_hwirq(sid, per, id, apid)); + irq =3D irq_find_mapping(bus->domain, + spec_to_hwirq(sid, per, id, apid)); if (irq =3D=3D 0) { - cleanup_irq(pmic_arb, apid, id); + cleanup_irq(bus, apid, id); continue; } generic_handle_irq(irq); @@ -651,16 +674,17 @@ static int periph_interrupt(struct spmi_pmic_arb *pmi= c_arb, u16 apid) =20 static void pmic_arb_chained_irq(struct irq_desc *desc) { - struct spmi_pmic_arb *pmic_arb =3D irq_desc_get_handler_data(desc); + struct spmi_pmic_arb_bus *bus =3D irq_desc_get_handler_data(desc); + struct spmi_pmic_arb *pmic_arb =3D bus->pmic_arb; const struct pmic_arb_ver_ops *ver_ops =3D pmic_arb->ver_ops; struct irq_chip *chip =3D irq_desc_get_chip(desc); - int first =3D pmic_arb->min_apid; - int last =3D pmic_arb->max_apid; + int first =3D bus->min_apid; + int last =3D bus->max_apid; /* * acc_offset will be non-zero for the secondary SPMI bus instance on * v7 controllers. */ - int acc_offset =3D pmic_arb->base_apid >> 5; + int acc_offset =3D bus->base_apid >> 5; u8 ee =3D pmic_arb->ee; u32 status, enable, handled =3D 0; int i, id, apid; @@ -671,7 +695,7 @@ static void pmic_arb_chained_irq(struct irq_desc *desc) chained_irq_enter(chip, desc); =20 for (i =3D first >> 5; i <=3D last >> 5; ++i) { - status =3D readl_relaxed(ver_ops->owner_acc_status(pmic_arb, ee, i - acc= _offset)); + status =3D readl_relaxed(ver_ops->owner_acc_status(bus, ee, i - acc_offs= et)); if (status) acc_valid =3D true; =20 @@ -685,9 +709,9 @@ static void pmic_arb_chained_irq(struct irq_desc *desc) continue; } enable =3D readl_relaxed( - ver_ops->acc_enable(pmic_arb, apid)); + ver_ops->acc_enable(bus, apid)); if (enable & SPMI_PIC_ACC_ENABLE_BIT) - if (periph_interrupt(pmic_arb, apid) !=3D 0) + if (periph_interrupt(bus, apid) !=3D 0) handled++; } } @@ -696,19 +720,19 @@ static void pmic_arb_chained_irq(struct irq_desc *des= c) if (!acc_valid) { for (i =3D first; i <=3D last; i++) { /* skip if APPS is not irq owner */ - if (pmic_arb->apid_data[i].irq_ee !=3D pmic_arb->ee) + if (bus->apid_data[i].irq_ee !=3D pmic_arb->ee) continue; =20 irq_status =3D readl_relaxed( - ver_ops->irq_status(pmic_arb, i)); + ver_ops->irq_status(bus, i)); if (irq_status) { enable =3D readl_relaxed( - ver_ops->acc_enable(pmic_arb, i)); + ver_ops->acc_enable(bus, i)); if (enable & SPMI_PIC_ACC_ENABLE_BIT) { - dev_dbg(&pmic_arb->spmic->dev, + dev_dbg(&bus->spmic->dev, "Dispatching IRQ for apid=3D%d status=3D%x\n", i, irq_status); - if (periph_interrupt(pmic_arb, i) !=3D 0) + if (periph_interrupt(bus, i) !=3D 0) handled++; } } @@ -723,12 +747,13 @@ static void pmic_arb_chained_irq(struct irq_desc *des= c) =20 static void qpnpint_irq_ack(struct irq_data *d) { - struct spmi_pmic_arb *pmic_arb =3D irq_data_get_irq_chip_data(d); + struct spmi_pmic_arb_bus *bus =3D irq_data_get_irq_chip_data(d); + struct spmi_pmic_arb *pmic_arb =3D bus->pmic_arb; u8 irq =3D hwirq_to_irq(d->hwirq); u16 apid =3D hwirq_to_apid(d->hwirq); u8 data; =20 - writel_relaxed(BIT(irq), pmic_arb->ver_ops->irq_clear(pmic_arb, apid)); + writel_relaxed(BIT(irq), pmic_arb->ver_ops->irq_clear(bus, apid)); =20 data =3D BIT(irq); qpnpint_spmi_write(d, QPNPINT_REG_LATCHED_CLR, &data, 1); @@ -744,14 +769,15 @@ static void qpnpint_irq_mask(struct irq_data *d) =20 static void qpnpint_irq_unmask(struct irq_data *d) { - struct spmi_pmic_arb *pmic_arb =3D irq_data_get_irq_chip_data(d); + struct spmi_pmic_arb_bus *bus =3D irq_data_get_irq_chip_data(d); + struct spmi_pmic_arb *pmic_arb =3D bus->pmic_arb; const struct pmic_arb_ver_ops *ver_ops =3D pmic_arb->ver_ops; u8 irq =3D hwirq_to_irq(d->hwirq); u16 apid =3D hwirq_to_apid(d->hwirq); u8 buf[2]; =20 writel_relaxed(SPMI_PIC_ACC_ENABLE_BIT, - ver_ops->acc_enable(pmic_arb, apid)); + ver_ops->acc_enable(bus, apid)); =20 qpnpint_spmi_read(d, QPNPINT_REG_EN_SET, &buf[0], 1); if (!(buf[0] & BIT(irq))) { @@ -808,9 +834,9 @@ static int qpnpint_irq_set_type(struct irq_data *d, uns= igned int flow_type) =20 static int qpnpint_irq_set_wake(struct irq_data *d, unsigned int on) { - struct spmi_pmic_arb *pmic_arb =3D irq_data_get_irq_chip_data(d); + struct spmi_pmic_arb_bus *bus =3D irq_data_get_irq_chip_data(d); =20 - return irq_set_irq_wake(pmic_arb->irq, on); + return irq_set_irq_wake(bus->irq, on); } =20 static int qpnpint_get_irqchip_state(struct irq_data *d, @@ -832,17 +858,18 @@ static int qpnpint_get_irqchip_state(struct irq_data = *d, static int qpnpint_irq_domain_activate(struct irq_domain *domain, struct irq_data *d, bool reserve) { - struct spmi_pmic_arb *pmic_arb =3D irq_data_get_irq_chip_data(d); + struct spmi_pmic_arb_bus *bus =3D irq_data_get_irq_chip_data(d); + struct spmi_pmic_arb *pmic_arb =3D bus->pmic_arb; u16 periph =3D hwirq_to_per(d->hwirq); u16 apid =3D hwirq_to_apid(d->hwirq); u16 sid =3D hwirq_to_sid(d->hwirq); u16 irq =3D hwirq_to_irq(d->hwirq); u8 buf; =20 - if (pmic_arb->apid_data[apid].irq_ee !=3D pmic_arb->ee) { - dev_err(&pmic_arb->spmic->dev, "failed to xlate sid =3D %#x, periph =3D = %#x, irq =3D %u: ee=3D%u but owner=3D%u\n", + if (bus->apid_data[apid].irq_ee !=3D pmic_arb->ee) { + dev_err(&bus->spmic->dev, "failed to xlate sid =3D %#x, periph =3D %#x, = irq =3D %u: ee=3D%u but owner=3D%u\n", sid, periph, irq, pmic_arb->ee, - pmic_arb->apid_data[apid].irq_ee); + bus->apid_data[apid].irq_ee); return -ENODEV; } =20 @@ -869,15 +896,16 @@ static int qpnpint_irq_domain_translate(struct irq_do= main *d, unsigned long *out_hwirq, unsigned int *out_type) { - struct spmi_pmic_arb *pmic_arb =3D d->host_data; + struct spmi_pmic_arb_bus *bus =3D d->host_data; + struct spmi_pmic_arb *pmic_arb =3D bus->pmic_arb; u32 *intspec =3D fwspec->param; u16 apid, ppid; int rc; =20 - dev_dbg(&pmic_arb->spmic->dev, "intspec[0] 0x%1x intspec[1] 0x%02x intspe= c[2] 0x%02x\n", + dev_dbg(&bus->spmic->dev, "intspec[0] 0x%1x intspec[1] 0x%02x intspec[2] = 0x%02x\n", intspec[0], intspec[1], intspec[2]); =20 - if (irq_domain_get_of_node(d) !=3D pmic_arb->spmic->dev.of_node) + if (irq_domain_get_of_node(d) !=3D bus->spmic->dev.of_node) return -EINVAL; if (fwspec->param_count !=3D 4) return -EINVAL; @@ -885,37 +913,37 @@ static int qpnpint_irq_domain_translate(struct irq_do= main *d, return -EINVAL; =20 ppid =3D intspec[0] << 8 | intspec[1]; - rc =3D pmic_arb->ver_ops->ppid_to_apid(pmic_arb, ppid); + rc =3D pmic_arb->ver_ops->ppid_to_apid(bus, ppid); if (rc < 0) { - dev_err(&pmic_arb->spmic->dev, "failed to xlate sid =3D %#x, periph =3D = %#x, irq =3D %u rc =3D %d\n", - intspec[0], intspec[1], intspec[2], rc); + dev_err(&bus->spmic->dev, "failed to xlate sid =3D %#x, periph =3D %#x, = irq =3D %u rc =3D %d\n", + intspec[0], intspec[1], intspec[2], rc); return rc; } =20 apid =3D rc; /* Keep track of {max,min}_apid for bounding search during interrupt */ - if (apid > pmic_arb->max_apid) - pmic_arb->max_apid =3D apid; - if (apid < pmic_arb->min_apid) - pmic_arb->min_apid =3D apid; + if (apid > bus->max_apid) + bus->max_apid =3D apid; + if (apid < bus->min_apid) + bus->min_apid =3D apid; =20 *out_hwirq =3D spec_to_hwirq(intspec[0], intspec[1], intspec[2], apid); *out_type =3D intspec[3] & IRQ_TYPE_SENSE_MASK; =20 - dev_dbg(&pmic_arb->spmic->dev, "out_hwirq =3D %lu\n", *out_hwirq); + dev_dbg(&bus->spmic->dev, "out_hwirq =3D %lu\n", *out_hwirq); =20 return 0; } =20 static struct lock_class_key qpnpint_irq_lock_class, qpnpint_irq_request_c= lass; =20 -static void qpnpint_irq_domain_map(struct spmi_pmic_arb *pmic_arb, +static void qpnpint_irq_domain_map(struct spmi_pmic_arb_bus *bus, struct irq_domain *domain, unsigned int virq, irq_hw_number_t hwirq, unsigned int type) { irq_flow_handler_t handler; =20 - dev_dbg(&pmic_arb->spmic->dev, "virq =3D %u, hwirq =3D %lu, type =3D %u\n= ", + dev_dbg(&bus->spmic->dev, "virq =3D %u, hwirq =3D %lu, type =3D %u\n", virq, hwirq, type); =20 if (type & IRQ_TYPE_EDGE_BOTH) @@ -926,7 +954,7 @@ static void qpnpint_irq_domain_map(struct spmi_pmic_arb= *pmic_arb, =20 irq_set_lockdep_class(virq, &qpnpint_irq_lock_class, &qpnpint_irq_request_class); - irq_domain_set_info(domain, virq, hwirq, &pmic_arb_irqchip, pmic_arb, + irq_domain_set_info(domain, virq, hwirq, &pmic_arb_irqchip, bus, handler, NULL, NULL); } =20 @@ -934,7 +962,7 @@ static int qpnpint_irq_domain_alloc(struct irq_domain *= domain, unsigned int virq, unsigned int nr_irqs, void *data) { - struct spmi_pmic_arb *pmic_arb =3D domain->host_data; + struct spmi_pmic_arb_bus *bus =3D domain->host_data; struct irq_fwspec *fwspec =3D data; irq_hw_number_t hwirq; unsigned int type; @@ -945,20 +973,22 @@ static int qpnpint_irq_domain_alloc(struct irq_domain= *domain, return ret; =20 for (i =3D 0; i < nr_irqs; i++) - qpnpint_irq_domain_map(pmic_arb, domain, virq + i, hwirq + i, + qpnpint_irq_domain_map(bus, domain, virq + i, hwirq + i, type); =20 return 0; } =20 -static int pmic_arb_init_apid_min_max(struct spmi_pmic_arb *pmic_arb) +static int pmic_arb_init_apid_min_max(struct spmi_pmic_arb_bus *bus) { + struct spmi_pmic_arb *pmic_arb =3D bus->pmic_arb; + /* * Initialize max_apid/min_apid to the opposite bounds, during * the irq domain translation, we are sure to update these */ - pmic_arb->max_apid =3D 0; - pmic_arb->min_apid =3D pmic_arb->max_periphs - 1; + bus->max_apid =3D 0; + bus->min_apid =3D pmic_arb->max_periphs - 1; =20 return 0; } @@ -976,37 +1006,38 @@ static int pmic_arb_get_core_resources_v1(struct pla= tform_device *pdev, return 0; } =20 -static int pmic_arb_init_apid_v1(struct spmi_pmic_arb *pmic_arb) +static int pmic_arb_init_apid_v1(struct spmi_pmic_arb_bus *bus) { + struct spmi_pmic_arb *pmic_arb =3D bus->pmic_arb; u32 *mapping_table; =20 - mapping_table =3D devm_kcalloc(&pmic_arb->spmic->dev, pmic_arb->max_perip= hs, + mapping_table =3D devm_kcalloc(&bus->spmic->dev, pmic_arb->max_periphs, sizeof(*mapping_table), GFP_KERNEL); if (!mapping_table) return -ENOMEM; =20 - pmic_arb->mapping_table =3D mapping_table; + bus->mapping_table =3D mapping_table; =20 - return pmic_arb_init_apid_min_max(pmic_arb); + return pmic_arb_init_apid_min_max(bus); } =20 -static int pmic_arb_ppid_to_apid_v1(struct spmi_pmic_arb *pmic_arb, u16 pp= id) +static int pmic_arb_ppid_to_apid_v1(struct spmi_pmic_arb_bus *bus, u16 ppi= d) { - u32 *mapping_table =3D pmic_arb->mapping_table; + u32 *mapping_table =3D bus->mapping_table; int index =3D 0, i; u16 apid_valid; u16 apid; u32 data; =20 - apid_valid =3D pmic_arb->ppid_to_apid[ppid]; + apid_valid =3D bus->ppid_to_apid[ppid]; if (apid_valid & PMIC_ARB_APID_VALID) { apid =3D apid_valid & ~PMIC_ARB_APID_VALID; return apid; } =20 for (i =3D 0; i < SPMI_MAPPING_TABLE_TREE_DEPTH; ++i) { - if (!test_and_set_bit(index, pmic_arb->mapping_table_valid)) - mapping_table[index] =3D readl_relaxed(pmic_arb->cnfg + + if (!test_and_set_bit(index, bus->mapping_table_valid)) + mapping_table[index] =3D readl_relaxed(bus->cnfg + SPMI_MAPPING_TABLE_REG(index)); =20 data =3D mapping_table[index]; @@ -1016,9 +1047,9 @@ static int pmic_arb_ppid_to_apid_v1(struct spmi_pmic_= arb *pmic_arb, u16 ppid) index =3D SPMI_MAPPING_BIT_IS_1_RESULT(data); } else { apid =3D SPMI_MAPPING_BIT_IS_1_RESULT(data); - pmic_arb->ppid_to_apid[ppid] + bus->ppid_to_apid[ppid] =3D apid | PMIC_ARB_APID_VALID; - pmic_arb->apid_data[apid].ppid =3D ppid; + bus->apid_data[apid].ppid =3D ppid; return apid; } } else { @@ -1026,9 +1057,9 @@ static int pmic_arb_ppid_to_apid_v1(struct spmi_pmic_= arb *pmic_arb, u16 ppid) index =3D SPMI_MAPPING_BIT_IS_0_RESULT(data); } else { apid =3D SPMI_MAPPING_BIT_IS_0_RESULT(data); - pmic_arb->ppid_to_apid[ppid] + bus->ppid_to_apid[ppid] =3D apid | PMIC_ARB_APID_VALID; - pmic_arb->apid_data[apid].ppid =3D ppid; + bus->apid_data[apid].ppid =3D ppid; return apid; } } @@ -1038,24 +1069,26 @@ static int pmic_arb_ppid_to_apid_v1(struct spmi_pmi= c_arb *pmic_arb, u16 ppid) } =20 /* v1 offset per ee */ -static int pmic_arb_offset_v1(struct spmi_pmic_arb *pmic_arb, u8 sid, u16 = addr, - enum pmic_arb_channel ch_type) +static int pmic_arb_offset_v1(struct spmi_pmic_arb_bus *bus, u8 sid, u16 a= ddr, + enum pmic_arb_channel ch_type) { + struct spmi_pmic_arb *pmic_arb =3D bus->pmic_arb; return 0x800 + 0x80 * pmic_arb->channel; } =20 -static u16 pmic_arb_find_apid(struct spmi_pmic_arb *pmic_arb, u16 ppid) +static u16 pmic_arb_find_apid(struct spmi_pmic_arb_bus *bus, u16 ppid) { - struct apid_data *apidd =3D &pmic_arb->apid_data[pmic_arb->last_apid]; + struct spmi_pmic_arb *pmic_arb =3D bus->pmic_arb; + struct apid_data *apidd =3D &bus->apid_data[bus->last_apid]; u32 regval, offset; u16 id, apid; =20 - for (apid =3D pmic_arb->last_apid; ; apid++, apidd++) { + for (apid =3D bus->last_apid; ; apid++, apidd++) { offset =3D pmic_arb->ver_ops->apid_map_offset(apid); if (offset >=3D pmic_arb->core_size) break; =20 - regval =3D readl_relaxed(pmic_arb->ver_ops->apid_owner(pmic_arb, + regval =3D readl_relaxed(pmic_arb->ver_ops->apid_owner(bus, apid)); apidd->irq_ee =3D SPMI_OWNERSHIP_PERIPH2OWNER(regval); apidd->write_ee =3D apidd->irq_ee; @@ -1065,14 +1098,14 @@ static u16 pmic_arb_find_apid(struct spmi_pmic_arb = *pmic_arb, u16 ppid) continue; =20 id =3D (regval >> 8) & PMIC_ARB_PPID_MASK; - pmic_arb->ppid_to_apid[id] =3D apid | PMIC_ARB_APID_VALID; + bus->ppid_to_apid[id] =3D apid | PMIC_ARB_APID_VALID; apidd->ppid =3D id; if (id =3D=3D ppid) { apid |=3D PMIC_ARB_APID_VALID; break; } } - pmic_arb->last_apid =3D apid & ~PMIC_ARB_APID_VALID; + bus->last_apid =3D apid & ~PMIC_ARB_APID_VALID; =20 return apid; } @@ -1104,21 +1137,22 @@ static int pmic_arb_get_core_resources_v2(struct pl= atform_device *pdev, return pmic_arb_get_obsrvr_chnls_v2(pdev); } =20 -static int pmic_arb_ppid_to_apid_v2(struct spmi_pmic_arb *pmic_arb, u16 pp= id) +static int pmic_arb_ppid_to_apid_v2(struct spmi_pmic_arb_bus *bus, u16 ppi= d) { u16 apid_valid; =20 - apid_valid =3D pmic_arb->ppid_to_apid[ppid]; + apid_valid =3D bus->ppid_to_apid[ppid]; if (!(apid_valid & PMIC_ARB_APID_VALID)) - apid_valid =3D pmic_arb_find_apid(pmic_arb, ppid); + apid_valid =3D pmic_arb_find_apid(bus, ppid); if (!(apid_valid & PMIC_ARB_APID_VALID)) return -ENODEV; =20 return apid_valid & ~PMIC_ARB_APID_VALID; } =20 -static int pmic_arb_read_apid_map_v5(struct spmi_pmic_arb *pmic_arb) +static int pmic_arb_read_apid_map_v5(struct spmi_pmic_arb_bus *bus) { + struct spmi_pmic_arb *pmic_arb =3D bus->pmic_arb; struct apid_data *apidd; struct apid_data *prev_apidd; u16 i, apid, ppid, apid_max; @@ -1140,9 +1174,9 @@ static int pmic_arb_read_apid_map_v5(struct spmi_pmic= _arb *pmic_arb) * where N =3D number of APIDs supported by the primary bus and * M =3D number of APIDs supported by the secondary bus */ - apidd =3D &pmic_arb->apid_data[pmic_arb->base_apid]; - apid_max =3D pmic_arb->base_apid + pmic_arb->apid_count; - for (i =3D pmic_arb->base_apid; i < apid_max; i++, apidd++) { + apidd =3D &bus->apid_data[bus->base_apid]; + apid_max =3D bus->base_apid + bus->apid_count; + for (i =3D bus->base_apid; i < apid_max; i++, apidd++) { offset =3D pmic_arb->ver_ops->apid_map_offset(i); if (offset >=3D pmic_arb->core_size) break; @@ -1153,19 +1187,18 @@ static int pmic_arb_read_apid_map_v5(struct spmi_pm= ic_arb *pmic_arb) ppid =3D (regval >> 8) & PMIC_ARB_PPID_MASK; is_irq_ee =3D PMIC_ARB_CHAN_IS_IRQ_OWNER(regval); =20 - regval =3D readl_relaxed(pmic_arb->ver_ops->apid_owner(pmic_arb, - i)); + regval =3D readl_relaxed(pmic_arb->ver_ops->apid_owner(bus, i)); apidd->write_ee =3D SPMI_OWNERSHIP_PERIPH2OWNER(regval); =20 apidd->irq_ee =3D is_irq_ee ? apidd->write_ee : INVALID_EE; =20 - valid =3D pmic_arb->ppid_to_apid[ppid] & PMIC_ARB_APID_VALID; - apid =3D pmic_arb->ppid_to_apid[ppid] & ~PMIC_ARB_APID_VALID; - prev_apidd =3D &pmic_arb->apid_data[apid]; + valid =3D bus->ppid_to_apid[ppid] & PMIC_ARB_APID_VALID; + apid =3D bus->ppid_to_apid[ppid] & ~PMIC_ARB_APID_VALID; + prev_apidd =3D &bus->apid_data[apid]; =20 if (!valid || apidd->write_ee =3D=3D pmic_arb->ee) { /* First PPID mapping or one for this EE */ - pmic_arb->ppid_to_apid[ppid] =3D i | PMIC_ARB_APID_VALID; + bus->ppid_to_apid[ppid] =3D i | PMIC_ARB_APID_VALID; } else if (valid && is_irq_ee && prev_apidd->write_ee =3D=3D pmic_arb->ee) { /* @@ -1176,42 +1209,43 @@ static int pmic_arb_read_apid_map_v5(struct spmi_pm= ic_arb *pmic_arb) } =20 apidd->ppid =3D ppid; - pmic_arb->last_apid =3D i; + bus->last_apid =3D i; } =20 /* Dump the mapping table for debug purposes. */ - dev_dbg(&pmic_arb->spmic->dev, "PPID APID Write-EE IRQ-EE\n"); + dev_dbg(&bus->spmic->dev, "PPID APID Write-EE IRQ-EE\n"); for (ppid =3D 0; ppid < PMIC_ARB_MAX_PPID; ppid++) { - apid =3D pmic_arb->ppid_to_apid[ppid]; + apid =3D bus->ppid_to_apid[ppid]; if (apid & PMIC_ARB_APID_VALID) { apid &=3D ~PMIC_ARB_APID_VALID; - apidd =3D &pmic_arb->apid_data[apid]; - dev_dbg(&pmic_arb->spmic->dev, "%#03X %3u %2u %2u\n", - ppid, apid, apidd->write_ee, apidd->irq_ee); + apidd =3D &bus->apid_data[apid]; + dev_dbg(&bus->spmic->dev, "%#03X %3u %2u %2u\n", + ppid, apid, apidd->write_ee, apidd->irq_ee); } } =20 return 0; } =20 -static int pmic_arb_ppid_to_apid_v5(struct spmi_pmic_arb *pmic_arb, u16 pp= id) +static int pmic_arb_ppid_to_apid_v5(struct spmi_pmic_arb_bus *bus, u16 ppi= d) { - if (!(pmic_arb->ppid_to_apid[ppid] & PMIC_ARB_APID_VALID)) + if (!(bus->ppid_to_apid[ppid] & PMIC_ARB_APID_VALID)) return -ENODEV; =20 - return pmic_arb->ppid_to_apid[ppid] & ~PMIC_ARB_APID_VALID; + return bus->ppid_to_apid[ppid] & ~PMIC_ARB_APID_VALID; } =20 /* v2 offset per ppid and per ee */ -static int pmic_arb_offset_v2(struct spmi_pmic_arb *pmic_arb, u8 sid, u16 = addr, - enum pmic_arb_channel ch_type) +static int pmic_arb_offset_v2(struct spmi_pmic_arb_bus *bus, u8 sid, u16 a= ddr, + enum pmic_arb_channel ch_type) { + struct spmi_pmic_arb *pmic_arb =3D bus->pmic_arb; u16 apid; u16 ppid; int rc; =20 ppid =3D sid << 8 | ((addr >> 8) & 0xFF); - rc =3D pmic_arb_ppid_to_apid_v2(pmic_arb, ppid); + rc =3D pmic_arb_ppid_to_apid_v2(bus, ppid); if (rc < 0) return rc; =20 @@ -1219,27 +1253,28 @@ static int pmic_arb_offset_v2(struct spmi_pmic_arb = *pmic_arb, u8 sid, u16 addr, return 0x1000 * pmic_arb->ee + 0x8000 * apid; } =20 -static int pmic_arb_init_apid_v5(struct spmi_pmic_arb *pmic_arb) +static int pmic_arb_init_apid_v5(struct spmi_pmic_arb_bus *bus) { + struct spmi_pmic_arb *pmic_arb =3D bus->pmic_arb; int ret; =20 - pmic_arb->base_apid =3D 0; - pmic_arb->apid_count =3D readl_relaxed(pmic_arb->core + PMIC_ARB_FEATURES= ) & - PMIC_ARB_FEATURES_PERIPH_MASK; + bus->base_apid =3D 0; + bus->apid_count =3D readl_relaxed(pmic_arb->core + PMIC_ARB_FEATURES) & + PMIC_ARB_FEATURES_PERIPH_MASK; =20 - if (pmic_arb->base_apid + pmic_arb->apid_count > pmic_arb->max_periphs) { - dev_err(&pmic_arb->spmic->dev, "Unsupported APID count %d detected\n", - pmic_arb->base_apid + pmic_arb->apid_count); + if (bus->base_apid + bus->apid_count > pmic_arb->max_periphs) { + dev_err(&bus->spmic->dev, "Unsupported APID count %d detected\n", + bus->base_apid + bus->apid_count); return -EINVAL; } =20 - ret =3D pmic_arb_init_apid_min_max(pmic_arb); + ret =3D pmic_arb_init_apid_min_max(bus); if (ret) return ret; =20 - ret =3D pmic_arb_read_apid_map_v5(pmic_arb); + ret =3D pmic_arb_read_apid_map_v5(bus); if (ret) { - dev_err(&pmic_arb->spmic->dev, "could not read APID->PPID mapping table,= rc=3D %d\n", + dev_err(&bus->spmic->dev, "could not read APID->PPID mapping table, rc= =3D %d\n", ret); return ret; } @@ -1251,15 +1286,16 @@ static int pmic_arb_init_apid_v5(struct spmi_pmic_a= rb *pmic_arb) * v5 offset per ee and per apid for observer channels and per apid for * read/write channels. */ -static int pmic_arb_offset_v5(struct spmi_pmic_arb *pmic_arb, u8 sid, u16 = addr, - enum pmic_arb_channel ch_type) +static int pmic_arb_offset_v5(struct spmi_pmic_arb_bus *bus, u8 sid, u16 a= ddr, + enum pmic_arb_channel ch_type) { + struct spmi_pmic_arb *pmic_arb =3D bus->pmic_arb; u16 apid; int rc; u32 offset =3D 0; u16 ppid =3D (sid << 8) | (addr >> 8); =20 - rc =3D pmic_arb_ppid_to_apid_v5(pmic_arb, ppid); + rc =3D pmic_arb_ppid_to_apid_v5(bus, ppid); if (rc < 0) return rc; =20 @@ -1269,8 +1305,8 @@ static int pmic_arb_offset_v5(struct spmi_pmic_arb *p= mic_arb, u8 sid, u16 addr, offset =3D 0x10000 * pmic_arb->ee + 0x80 * apid; break; case PMIC_ARB_CHANNEL_RW: - if (pmic_arb->apid_data[apid].write_ee !=3D pmic_arb->ee) { - dev_err(&pmic_arb->spmic->dev, "disallowed SPMI write to sid=3D%u, addr= =3D0x%04X\n", + if (bus->apid_data[apid].write_ee !=3D pmic_arb->ee) { + dev_err(&bus->spmic->dev, "disallowed SPMI write to sid=3D%u, addr=3D0x= %04X\n", sid, addr); return -EPERM; } @@ -1297,15 +1333,16 @@ static int pmic_arb_get_core_resources_v7(struct pl= atform_device *pdev, * v7 offset per ee and per apid for observer channels and per apid for * read/write channels. */ -static int pmic_arb_offset_v7(struct spmi_pmic_arb *pmic_arb, u8 sid, u16 = addr, - enum pmic_arb_channel ch_type) +static int pmic_arb_offset_v7(struct spmi_pmic_arb_bus *bus, u8 sid, u16 a= ddr, + enum pmic_arb_channel ch_type) { + struct spmi_pmic_arb *pmic_arb =3D bus->pmic_arb; u16 apid; int rc; u32 offset =3D 0; u16 ppid =3D (sid << 8) | (addr >> 8); =20 - rc =3D pmic_arb->ver_ops->ppid_to_apid(pmic_arb, ppid); + rc =3D pmic_arb->ver_ops->ppid_to_apid(bus, ppid); if (rc < 0) return rc; =20 @@ -1315,8 +1352,8 @@ static int pmic_arb_offset_v7(struct spmi_pmic_arb *p= mic_arb, u8 sid, u16 addr, offset =3D 0x8000 * pmic_arb->ee + 0x20 * apid; break; case PMIC_ARB_CHANNEL_RW: - if (pmic_arb->apid_data[apid].write_ee !=3D pmic_arb->ee) { - dev_err(&pmic_arb->spmic->dev, "disallowed SPMI write to sid=3D%u, addr= =3D0x%04X\n", + if (bus->apid_data[apid].write_ee !=3D pmic_arb->ee) { + dev_err(&bus->spmic->dev, "disallowed SPMI write to sid=3D%u, addr=3D0x= %04X\n", sid, addr); return -EPERM; } @@ -1338,104 +1375,110 @@ static u32 pmic_arb_fmt_cmd_v2(u8 opc, u8 sid, u1= 6 addr, u8 bc) } =20 static void __iomem * -pmic_arb_owner_acc_status_v1(struct spmi_pmic_arb *pmic_arb, u8 m, u16 n) +pmic_arb_owner_acc_status_v1(struct spmi_pmic_arb_bus *bus, u8 m, u16 n) { - return pmic_arb->intr + 0x20 * m + 0x4 * n; + return bus->intr + 0x20 * m + 0x4 * n; } =20 static void __iomem * -pmic_arb_owner_acc_status_v2(struct spmi_pmic_arb *pmic_arb, u8 m, u16 n) +pmic_arb_owner_acc_status_v2(struct spmi_pmic_arb_bus *bus, u8 m, u16 n) { - return pmic_arb->intr + 0x100000 + 0x1000 * m + 0x4 * n; + return bus->intr + 0x100000 + 0x1000 * m + 0x4 * n; } =20 static void __iomem * -pmic_arb_owner_acc_status_v3(struct spmi_pmic_arb *pmic_arb, u8 m, u16 n) +pmic_arb_owner_acc_status_v3(struct spmi_pmic_arb_bus *bus, u8 m, u16 n) { - return pmic_arb->intr + 0x200000 + 0x1000 * m + 0x4 * n; + return bus->intr + 0x200000 + 0x1000 * m + 0x4 * n; } =20 static void __iomem * -pmic_arb_owner_acc_status_v5(struct spmi_pmic_arb *pmic_arb, u8 m, u16 n) +pmic_arb_owner_acc_status_v5(struct spmi_pmic_arb_bus *bus, u8 m, u16 n) { - return pmic_arb->intr + 0x10000 * m + 0x4 * n; + return bus->intr + 0x10000 * m + 0x4 * n; } =20 static void __iomem * -pmic_arb_owner_acc_status_v7(struct spmi_pmic_arb *pmic_arb, u8 m, u16 n) +pmic_arb_owner_acc_status_v7(struct spmi_pmic_arb_bus *bus, u8 m, u16 n) { - return pmic_arb->intr + 0x1000 * m + 0x4 * n; + return bus->intr + 0x1000 * m + 0x4 * n; } =20 static void __iomem * -pmic_arb_acc_enable_v1(struct spmi_pmic_arb *pmic_arb, u16 n) +pmic_arb_acc_enable_v1(struct spmi_pmic_arb_bus *bus, u16 n) { - return pmic_arb->intr + 0x200 + 0x4 * n; + return bus->intr + 0x200 + 0x4 * n; } =20 static void __iomem * -pmic_arb_acc_enable_v2(struct spmi_pmic_arb *pmic_arb, u16 n) +pmic_arb_acc_enable_v2(struct spmi_pmic_arb_bus *bus, u16 n) { - return pmic_arb->intr + 0x1000 * n; + return bus->intr + 0x1000 * n; } =20 static void __iomem * -pmic_arb_acc_enable_v5(struct spmi_pmic_arb *pmic_arb, u16 n) +pmic_arb_acc_enable_v5(struct spmi_pmic_arb_bus *bus, u16 n) { + struct spmi_pmic_arb *pmic_arb =3D bus->pmic_arb; return pmic_arb->wr_base + 0x100 + 0x10000 * n; } =20 static void __iomem * -pmic_arb_acc_enable_v7(struct spmi_pmic_arb *pmic_arb, u16 n) +pmic_arb_acc_enable_v7(struct spmi_pmic_arb_bus *bus, u16 n) { + struct spmi_pmic_arb *pmic_arb =3D bus->pmic_arb; return pmic_arb->wr_base + 0x100 + 0x1000 * n; } =20 static void __iomem * -pmic_arb_irq_status_v1(struct spmi_pmic_arb *pmic_arb, u16 n) +pmic_arb_irq_status_v1(struct spmi_pmic_arb_bus *bus, u16 n) { - return pmic_arb->intr + 0x600 + 0x4 * n; + return bus->intr + 0x600 + 0x4 * n; } =20 static void __iomem * -pmic_arb_irq_status_v2(struct spmi_pmic_arb *pmic_arb, u16 n) +pmic_arb_irq_status_v2(struct spmi_pmic_arb_bus *bus, u16 n) { - return pmic_arb->intr + 0x4 + 0x1000 * n; + return bus->intr + 0x4 + 0x1000 * n; } =20 static void __iomem * -pmic_arb_irq_status_v5(struct spmi_pmic_arb *pmic_arb, u16 n) +pmic_arb_irq_status_v5(struct spmi_pmic_arb_bus *bus, u16 n) { + struct spmi_pmic_arb *pmic_arb =3D bus->pmic_arb; return pmic_arb->wr_base + 0x104 + 0x10000 * n; } =20 static void __iomem * -pmic_arb_irq_status_v7(struct spmi_pmic_arb *pmic_arb, u16 n) +pmic_arb_irq_status_v7(struct spmi_pmic_arb_bus *bus, u16 n) { + struct spmi_pmic_arb *pmic_arb =3D bus->pmic_arb; return pmic_arb->wr_base + 0x104 + 0x1000 * n; } =20 static void __iomem * -pmic_arb_irq_clear_v1(struct spmi_pmic_arb *pmic_arb, u16 n) +pmic_arb_irq_clear_v1(struct spmi_pmic_arb_bus *bus, u16 n) { - return pmic_arb->intr + 0xA00 + 0x4 * n; + return bus->intr + 0xA00 + 0x4 * n; } =20 static void __iomem * -pmic_arb_irq_clear_v2(struct spmi_pmic_arb *pmic_arb, u16 n) +pmic_arb_irq_clear_v2(struct spmi_pmic_arb_bus *bus, u16 n) { - return pmic_arb->intr + 0x8 + 0x1000 * n; + return bus->intr + 0x8 + 0x1000 * n; } =20 static void __iomem * -pmic_arb_irq_clear_v5(struct spmi_pmic_arb *pmic_arb, u16 n) +pmic_arb_irq_clear_v5(struct spmi_pmic_arb_bus *bus, u16 n) { + struct spmi_pmic_arb *pmic_arb =3D bus->pmic_arb; return pmic_arb->wr_base + 0x108 + 0x10000 * n; } =20 static void __iomem * -pmic_arb_irq_clear_v7(struct spmi_pmic_arb *pmic_arb, u16 n) +pmic_arb_irq_clear_v7(struct spmi_pmic_arb_bus *bus, u16 n) { + struct spmi_pmic_arb *pmic_arb =3D bus->pmic_arb; return pmic_arb->wr_base + 0x108 + 0x1000 * n; } =20 @@ -1455,9 +1498,9 @@ static u32 pmic_arb_apid_map_offset_v7(u16 n) } =20 static void __iomem * -pmic_arb_apid_owner_v2(struct spmi_pmic_arb *pmic_arb, u16 n) +pmic_arb_apid_owner_v2(struct spmi_pmic_arb_bus *bus, u16 n) { - return pmic_arb->cnfg + 0x700 + 0x4 * n; + return bus->cnfg + 0x700 + 0x4 * n; } =20 /* @@ -1466,9 +1509,9 @@ pmic_arb_apid_owner_v2(struct spmi_pmic_arb *pmic_arb= , u16 n) * 0. */ static void __iomem * -pmic_arb_apid_owner_v7(struct spmi_pmic_arb *pmic_arb, u16 n) +pmic_arb_apid_owner_v7(struct spmi_pmic_arb_bus *bus, u16 n) { - return pmic_arb->cnfg + 0x4 * (n - pmic_arb->base_apid); + return bus->cnfg + 0x4 * (n - bus->base_apid); } =20 static const struct pmic_arb_ver_ops pmic_arb_v1 =3D { @@ -1558,29 +1601,120 @@ static const struct irq_domain_ops pmic_arb_irq_do= main_ops =3D { .translate =3D qpnpint_irq_domain_translate, }; =20 +static int spmi_pmic_arb_bus_init(struct platform_device *pdev, + struct device_node *node, + struct spmi_pmic_arb *pmic_arb) +{ + struct spmi_pmic_arb_bus *bus; + struct device *dev =3D &pdev->dev; + struct spmi_controller *ctrl; + void __iomem *intr; + void __iomem *cnfg; + int index, ret; + u32 irq; + + ctrl =3D devm_spmi_controller_alloc(dev, sizeof(*bus)); + if (IS_ERR(ctrl)) + return PTR_ERR(ctrl); + + ctrl->cmd =3D pmic_arb_cmd; + ctrl->read_cmd =3D pmic_arb_read_cmd; + ctrl->write_cmd =3D pmic_arb_write_cmd; + + bus =3D spmi_controller_get_drvdata(ctrl); + + pmic_arb->bus =3D bus; + + bus->ppid_to_apid =3D devm_kcalloc(dev, PMIC_ARB_MAX_PPID, + sizeof(*bus->ppid_to_apid), + GFP_KERNEL); + if (!bus->ppid_to_apid) + return -ENOMEM; + + bus->apid_data =3D devm_kcalloc(dev, pmic_arb->max_periphs, + sizeof(*bus->apid_data), + GFP_KERNEL); + if (!bus->apid_data) + return -ENOMEM; + + index =3D of_property_match_string(node, "reg-names", "cnfg"); + if (index < 0) { + dev_err(dev, "cnfg reg region missing"); + return -EINVAL; + } + + cnfg =3D devm_of_iomap(dev, node, index, NULL); + if (IS_ERR(cnfg)) + return PTR_ERR(cnfg); + + index =3D of_property_match_string(node, "reg-names", "intr"); + if (index < 0) { + dev_err(dev, "intr reg region missing"); + return -EINVAL; + } + + intr =3D devm_of_iomap(dev, node, index, NULL); + if (IS_ERR(intr)) + return PTR_ERR(intr); + + irq =3D of_irq_get_byname(node, "periph_irq"); + if (irq < 0) + return irq; + + bus->pmic_arb =3D pmic_arb; + bus->intr =3D intr; + bus->cnfg =3D cnfg; + bus->irq =3D irq; + bus->spmic =3D ctrl; + + ret =3D pmic_arb->ver_ops->init_apid(bus); + if (ret) + return ret; + + dev_dbg(&pdev->dev, "adding irq domain\n"); + + bus->domain =3D irq_domain_add_tree(dev->of_node, + &pmic_arb_irq_domain_ops, bus); + if (!bus->domain) { + dev_err(&pdev->dev, "unable to create irq_domain\n"); + return -ENOMEM; + } + + irq_set_chained_handler_and_data(bus->irq, + pmic_arb_chained_irq, bus); + + ctrl->dev.of_node =3D node; + + ret =3D devm_spmi_controller_add(dev, ctrl); + if (ret) + return ret; + + return 0; +} + static int spmi_pmic_arb_probe(struct platform_device *pdev) { struct spmi_pmic_arb *pmic_arb; - struct spmi_controller *ctrl; + struct device *dev =3D &pdev->dev; struct resource *res; void __iomem *core; u32 channel, ee, hw_ver; int err; =20 - ctrl =3D devm_spmi_controller_alloc(&pdev->dev, sizeof(*pmic_arb)); - if (IS_ERR(ctrl)) - return PTR_ERR(ctrl); - - pmic_arb =3D spmi_controller_get_drvdata(ctrl); - pmic_arb->spmic =3D ctrl; + pmic_arb =3D devm_kzalloc(dev, sizeof(*pmic_arb), GFP_KERNEL); + if (!pmic_arb) + return -ENOMEM; =20 res =3D platform_get_resource_byname(pdev, IORESOURCE_MEM, "core"); - core =3D devm_ioremap(&ctrl->dev, res->start, resource_size(res)); + core =3D devm_ioremap(dev, res->start, resource_size(res)); if (IS_ERR(core)) return PTR_ERR(core); =20 pmic_arb->core_size =3D resource_size(res); =20 + platform_set_drvdata(pdev, pmic_arb); + raw_spin_lock_init(&pmic_arb->lock); + hw_ver =3D readl_relaxed(core + PMIC_ARB_VERSION); =20 if (hw_ver < PMIC_ARB_VERSION_V2_MIN) @@ -1594,30 +1728,12 @@ static int spmi_pmic_arb_probe(struct platform_devi= ce *pdev) else pmic_arb->ver_ops =3D &pmic_arb_v7; =20 - dev_info(&ctrl->dev, "PMIC arbiter version %s (0x%x)\n", - pmic_arb->ver_ops->ver_str, hw_ver); - err =3D pmic_arb->ver_ops->get_core_resources(pdev, core); if (err) return err; =20 - err =3D pmic_arb->ver_ops->init_apid(pmic_arb); - if (err) - return err; - - res =3D platform_get_resource_byname(pdev, IORESOURCE_MEM, "intr"); - pmic_arb->intr =3D devm_ioremap_resource(&ctrl->dev, res); - if (IS_ERR(pmic_arb->intr)) - return PTR_ERR(pmic_arb->intr); - - res =3D platform_get_resource_byname(pdev, IORESOURCE_MEM, "cnfg"); - pmic_arb->cnfg =3D devm_ioremap_resource(&ctrl->dev, res); - if (IS_ERR(pmic_arb->cnfg)) - return PTR_ERR(pmic_arb->cnfg); - - pmic_arb->irq =3D platform_get_irq_byname(pdev, "periph_irq"); - if (pmic_arb->irq < 0) - return pmic_arb->irq; + dev_info(dev, "PMIC arbiter version %s (0x%x)\n", + pmic_arb->ver_ops->ver_str, hw_ver); =20 err =3D of_property_read_u32(pdev->dev.of_node, "qcom,channel", &channel); if (err) { @@ -1646,42 +1762,17 @@ static int spmi_pmic_arb_probe(struct platform_devi= ce *pdev) =20 pmic_arb->ee =3D ee; =20 - platform_set_drvdata(pdev, ctrl); - raw_spin_lock_init(&pmic_arb->lock); - - ctrl->cmd =3D pmic_arb_cmd; - ctrl->read_cmd =3D pmic_arb_read_cmd; - ctrl->write_cmd =3D pmic_arb_write_cmd; - - dev_dbg(&pdev->dev, "adding irq domain\n"); - pmic_arb->domain =3D irq_domain_add_tree(pdev->dev.of_node, - &pmic_arb_irq_domain_ops, pmic_arb); - if (!pmic_arb->domain) { - dev_err(&pdev->dev, "unable to create irq_domain\n"); - return -ENOMEM; - } - - irq_set_chained_handler_and_data(pmic_arb->irq, pmic_arb_chained_irq, - pmic_arb); - err =3D spmi_controller_add(ctrl); - if (err) - goto err_domain_remove; - - return 0; - -err_domain_remove: - irq_set_chained_handler_and_data(pmic_arb->irq, NULL, NULL); - irq_domain_remove(pmic_arb->domain); - return err; + return spmi_pmic_arb_bus_init(pdev, dev->of_node, pmic_arb); } =20 static void spmi_pmic_arb_remove(struct platform_device *pdev) { - struct spmi_controller *ctrl =3D platform_get_drvdata(pdev); - struct spmi_pmic_arb *pmic_arb =3D spmi_controller_get_drvdata(ctrl); - spmi_controller_remove(ctrl); - irq_set_chained_handler_and_data(pmic_arb->irq, NULL, NULL); - irq_domain_remove(pmic_arb->domain); + struct spmi_pmic_arb *pmic_arb =3D platform_get_drvdata(pdev); + struct spmi_pmic_arb_bus *bus =3D pmic_arb->bus; + + irq_set_chained_handler_and_data(bus->irq, + NULL, NULL); + irq_domain_remove(bus->domain); } =20 static const struct of_device_id spmi_pmic_arb_match_table[] =3D { --=20 2.34.1 From nobody Fri Sep 20 01:36:37 2024 Received: from mail-ej1-f42.google.com (mail-ej1-f42.google.com [209.85.218.42]) (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 2BACA81752 for ; Tue, 2 Apr 2024 12:08:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.42 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712059692; cv=none; b=IsexlTLRdl4DPI4+TBn/1rf1gHoz2ZIUPkVd1GAmMB/V60zctjPOswSCkCvs/ucGb66n5NFWMobx4IQddDnvxBc2E0gXlHK4W/fC57MSa0kEevrQThcWl0Y4DwMbKpuRUYtQvnSz98LPLyC9ESvzqglY1mgnC6bHvBwMRnvNOEM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712059692; c=relaxed/simple; bh=5lzv0FCxMJV+6eMWAl2BkglRlaaER3JpeGnoI4xXHTw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=mOefcm7S5K3N9Q4RL0qQ1duR7B2zVF8oOkmztJCcwj/ISRra7oCaHJhCD1geSpM5yp7niE0V0vp1M6TsPLoDbaz2Fp+xRlZpqevIwiSm5akP/pJrFh3Tu29dKk1CrNIFPSLQTrGsPSxNIE1mv0cMiIa6R8Mzyca8zvXudJ4Xbhg= 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; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=roCwfhHK; arc=none smtp.client-ip=209.85.218.42 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 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="roCwfhHK" Received: by mail-ej1-f42.google.com with SMTP id a640c23a62f3a-a4e8904bd71so75155666b.1 for ; Tue, 02 Apr 2024 05:08:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1712059687; x=1712664487; 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=GUalNrbfbrxbwM0ycSW1gsKaZR1W99qZXQXgxCOsfPw=; b=roCwfhHK5DJcFNzYBRt/ZQnP5uR/pdDqHWgIE1k4WP9KYYEF7aLya1L/iCIzTspGWN TO3vg7AzHOMp5mkywh30cdmy4AfBLD5mT3tFVlimuldGl+hF78dgUIqSCZYOKMzVgotm kMM0uN8rBecAyUBQOrSZt16ugzo+cUGDCC8fCNr9i3v54lHOKJDuXcKQAjNyGttRW6DK qa4hA01qu9rhdJ90K4VtxTQ/+l7kZlkicN7jzEDFRzKQZr9O8z+SaxGoF+NvUra/p4Dr pbVjOq70/oB8av94ZH10LO+3+XanFBhfYcFnZ8ooRfGHkk1rwvH+MU2cmdU/NF5XMxCi PU3w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1712059687; x=1712664487; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=GUalNrbfbrxbwM0ycSW1gsKaZR1W99qZXQXgxCOsfPw=; b=VI2S7HAAJnG++ueQx3jWYXuLktvGpBUqlyfvy4QzWN2uML0roxS28TPWW0OPhUtmdn WvwWVXSVpslNeNb5FKRhvqqfXWIK3/PNj1VWTsli69/C8ugwVZaXO7QzttmteLeCPwyQ 8BB9y7aze55cRAmc8ej2fUkn3vKkhJRi0YqBeKWusLdE5v32GR+fhk8fB31i1I1q/qud bXjr8IdEIri6fP72nzUtb7ASmAPTls+tNEqVZu3epcTxykOFuevV17pZtxY22T5sf1vy GTwqYUrqrUAG3JCA8KTKkrrKKUPNOof92qL91pBbNnt9AfIBPse48x3zvwcef9ld3iWf qCKw== X-Forwarded-Encrypted: i=1; AJvYcCWXLf8ZG+PWHQ9iRhCF9AT6UyBM+Up+MBhE+ZrA9B5OCZcdsuVZih6/FCajBz60YsNaW3eIM4247zvroqOxi9Noh+qBrRNaj0qIGSrU X-Gm-Message-State: AOJu0Yzz0SIVo2PtUrBki7Di4ht4ShM66BW/9CVGYHupr07X5oWl07ut Jpftus5gfWtCywZQMldPsZYojrzQ/5oYn4WlS9GMU/PY1PXg63mkpRW4vjZLr5E= X-Google-Smtp-Source: AGHT+IHluOCa3U55gU1404/cstKM8jThiDf3RlVD44TYCRhUJKgbHehml0oDw5pmcgUz0VOCucjG9g== X-Received: by 2002:a17:907:86a9:b0:a4e:68a9:a6d2 with SMTP id qa41-20020a17090786a900b00a4e68a9a6d2mr4786542ejc.64.1712059687298; Tue, 02 Apr 2024 05:08:07 -0700 (PDT) Received: from [127.0.1.1] ([79.114.172.194]) by smtp.gmail.com with ESMTPSA id l13-20020a1709065a8d00b00a4df251a601sm6519384ejq.77.2024.04.02.05.08.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 02 Apr 2024 05:08:06 -0700 (PDT) From: Abel Vesa Date: Tue, 02 Apr 2024 15:07:36 +0300 Subject: [PATCH v8 7/7] spmi: pmic-arb: Add multi bus support 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: <20240402-spmi-multi-master-support-v8-7-ce6f2d14a058@linaro.org> References: <20240402-spmi-multi-master-support-v8-0-ce6f2d14a058@linaro.org> In-Reply-To: <20240402-spmi-multi-master-support-v8-0-ce6f2d14a058@linaro.org> To: Stephen Boyd , Matthias Brugger , Bjorn Andersson , Konrad Dybcio , Dmitry Baryshkov , Neil Armstrong , AngeloGioacchino Del Regno , Rob Herring , Krzysztof Kozlowski , Conor Dooley Cc: Srini Kandagatla , Johan Hovold , linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-arm-msm@vger.kernel.org, linux-mediatek@lists.infradead.org, devicetree@vger.kernel.org, Abel Vesa X-Mailer: b4 0.13.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=9929; i=abel.vesa@linaro.org; h=from:subject:message-id; bh=5lzv0FCxMJV+6eMWAl2BkglRlaaER3JpeGnoI4xXHTw=; b=owEBbQKS/ZANAwAKARtfRMkAlRVWAcsmYgBmC/UZuhRIavaNOOBHKBUu7LI+R3rh6XcutvCL3 qmA0I9xGcyJAjMEAAEKAB0WIQRO8+4RTnqPKsqn0bgbX0TJAJUVVgUCZgv1GQAKCRAbX0TJAJUV Vu9nD/0QtF2vIfzSVVyVdiuiXvVwd/waWHHisBGtzXCWAic97M08R9as1WjaBirT5ANE4Vm+Xzl S/rKBGU7At8neh4JamV4Liseat8mkRnGGRLW6JfG51q0wIpNFA9wqJ6GGhFSZG/NAn2QEoSSmGV pEDSwqq/PusbASTNA0duyB8JBaBB0VP8eXwMZTT9R02drLDkARimyrUKAU97L4mgwLMyYOGW7ft xP5+/jN5bAc0lf+ONKlzZBHla4fZhRmfFb6QUuQ0bGd8E3oZvHBho8JBkzXyRkU8R2qu75vWShW 4jZvs3dTwpRbq4gFLDd9xLz4QHK2VxLVziUsdTDIZrKS26ExqjDhLB0NL11lV8adgVvNy/qH02M uTb7iAolr4ufJ1a4b0hipXrM2HJKId6VMsjduYzslgDlEgiILXZ81xB/hZg5l1pg8W+XNxifQRU hS9AHXUoMEDP6mg/IJtX2Y6QiaIk6Wno/XYKmjdiODmdpVtqXPJcBZ3UjS/lws8Lb8bCfb973dV Vs3JkhVWBw0lStw6SWXa1AaPp/Wu907bfcWcXQNdiyWrB1nLPjQh2KhDb9TYeeua5uNwSHuDBYQ PDajMeV7G/M3LURjwOyGwiEoRcQ/sXXfieQJYQVtflptLsaKghR/i5bFevv9kGaFeLHVY0IJ0aH 2z+xkX923ll3kZA== X-Developer-Key: i=abel.vesa@linaro.org; a=openpgp; fpr=6AFF162D57F4223A8770EF5AF7BF214136F41FAE Starting with HW version 7, there are actually two separate buses (with two separate sets of wires). So add support for the second bus. The first platform that needs this support for the second bus is the Qualcomm X1 Elite, so add the compatible for it as well. Signed-off-by: Abel Vesa Reviewed-by: Neil Armstrong --- drivers/spmi/spmi-pmic-arb.c | 138 +++++++++++++++++++++++++++++++++++++--= ---- 1 file changed, 120 insertions(+), 18 deletions(-) diff --git a/drivers/spmi/spmi-pmic-arb.c b/drivers/spmi/spmi-pmic-arb.c index 3db622ed80de..52b9e275a7b2 100644 --- a/drivers/spmi/spmi-pmic-arb.c +++ b/drivers/spmi/spmi-pmic-arb.c @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -95,6 +96,8 @@ enum pmic_arb_channel { PMIC_ARB_CHANNEL_OBS, }; =20 +#define PMIC_ARB_MAX_BUSES 2 + /* Maximum number of support PMIC peripherals */ #define PMIC_ARB_MAX_PERIPHS 512 #define PMIC_ARB_MAX_PERIPHS_V7 1024 @@ -148,6 +151,7 @@ struct spmi_pmic_arb; * @min_apid: minimum APID (used for bounding IRQ search) * @max_apid: maximum APID * @irq: PMIC ARB interrupt. + * @id: unique ID of the bus */ struct spmi_pmic_arb_bus { struct spmi_pmic_arb *pmic_arb; @@ -165,6 +169,7 @@ struct spmi_pmic_arb_bus { u16 min_apid; u16 max_apid; int irq; + u8 id; }; =20 /** @@ -179,7 +184,8 @@ struct spmi_pmic_arb_bus { * @ee: the current Execution Environment * @ver_ops: version dependent operations. * @max_periphs: Number of elements in apid_data[] - * @bus: per arbiter bus instance + * @buses: per arbiter buses instances + * @buses_available: number of buses registered */ struct spmi_pmic_arb { void __iomem *rd_base; @@ -191,7 +197,8 @@ struct spmi_pmic_arb { u8 ee; const struct pmic_arb_ver_ops *ver_ops; int max_periphs; - struct spmi_pmic_arb_bus *bus; + struct spmi_pmic_arb_bus *buses[PMIC_ARB_MAX_BUSES]; + int buses_available; }; =20 /** @@ -220,7 +227,7 @@ struct spmi_pmic_arb { struct pmic_arb_ver_ops { const char *ver_str; int (*get_core_resources)(struct platform_device *pdev, void __iomem *cor= e); - int (*init_apid)(struct spmi_pmic_arb_bus *bus); + int (*init_apid)(struct spmi_pmic_arb_bus *bus, int index); int (*ppid_to_apid)(struct spmi_pmic_arb_bus *bus, u16 ppid); /* spmi commands (read_cmd, write_cmd, cmd) functionality */ int (*offset)(struct spmi_pmic_arb_bus *bus, u8 sid, u16 addr, @@ -309,8 +316,8 @@ static int pmic_arb_wait_for_done(struct spmi_controlle= r *ctrl, } =20 if (status & PMIC_ARB_STATUS_FAILURE) { - dev_err(&ctrl->dev, "%s: %#x %#x: transaction failed (%#x)\n", - __func__, sid, addr, status); + dev_err(&ctrl->dev, "%s: %#x %#x: transaction failed (%#x) reg: 0x%x\n= ", + __func__, sid, addr, status, offset); WARN_ON(1); return -EIO; } @@ -326,8 +333,8 @@ static int pmic_arb_wait_for_done(struct spmi_controlle= r *ctrl, udelay(1); } =20 - dev_err(&ctrl->dev, "%s: %#x %#x: timeout, status %#x\n", - __func__, sid, addr, status); + dev_err(&ctrl->dev, "%s: %#x %#x %#x: timeout, status %#x\n", + __func__, bus->id, sid, addr, status); return -ETIMEDOUT; } =20 @@ -1006,11 +1013,17 @@ static int pmic_arb_get_core_resources_v1(struct pl= atform_device *pdev, return 0; } =20 -static int pmic_arb_init_apid_v1(struct spmi_pmic_arb_bus *bus) +static int pmic_arb_init_apid_v1(struct spmi_pmic_arb_bus *bus, int index) { struct spmi_pmic_arb *pmic_arb =3D bus->pmic_arb; u32 *mapping_table; =20 + if (index) { + dev_err(&bus->spmic->dev, "Unsupported buses count %d detected\n", + index); + return -EINVAL; + } + mapping_table =3D devm_kcalloc(&bus->spmic->dev, pmic_arb->max_periphs, sizeof(*mapping_table), GFP_KERNEL); if (!mapping_table) @@ -1253,11 +1266,17 @@ static int pmic_arb_offset_v2(struct spmi_pmic_arb_= bus *bus, u8 sid, u16 addr, return 0x1000 * pmic_arb->ee + 0x8000 * apid; } =20 -static int pmic_arb_init_apid_v5(struct spmi_pmic_arb_bus *bus) +static int pmic_arb_init_apid_v5(struct spmi_pmic_arb_bus *bus, int index) { struct spmi_pmic_arb *pmic_arb =3D bus->pmic_arb; int ret; =20 + if (index) { + dev_err(&bus->spmic->dev, "Unsupported buses count %d detected\n", + index); + return -EINVAL; + } + bus->base_apid =3D 0; bus->apid_count =3D readl_relaxed(pmic_arb->core + PMIC_ARB_FEATURES) & PMIC_ARB_FEATURES_PERIPH_MASK; @@ -1329,6 +1348,50 @@ static int pmic_arb_get_core_resources_v7(struct pla= tform_device *pdev, return pmic_arb_get_obsrvr_chnls_v2(pdev); } =20 +/* + * Only v7 supports 2 buses. Each bus will get a different apid count, read + * from different registers. + */ +static int pmic_arb_init_apid_v7(struct spmi_pmic_arb_bus *bus, int index) +{ + struct spmi_pmic_arb *pmic_arb =3D bus->pmic_arb; + int ret; + + if (index =3D=3D 0) { + bus->base_apid =3D 0; + bus->apid_count =3D readl_relaxed(pmic_arb->core + PMIC_ARB_FEATURES) & + PMIC_ARB_FEATURES_PERIPH_MASK; + } else if (index =3D=3D 1) { + bus->base_apid =3D readl_relaxed(pmic_arb->core + PMIC_ARB_FEATURES) & + PMIC_ARB_FEATURES_PERIPH_MASK; + bus->apid_count =3D readl_relaxed(pmic_arb->core + PMIC_ARB_FEATURES1) & + PMIC_ARB_FEATURES_PERIPH_MASK; + } else { + dev_err(&bus->spmic->dev, "Unsupported buses count %d detected\n", + bus->id); + return -EINVAL; + } + + if (bus->base_apid + bus->apid_count > pmic_arb->max_periphs) { + dev_err(&bus->spmic->dev, "Unsupported APID count %d detected\n", + bus->base_apid + bus->apid_count); + return -EINVAL; + } + + ret =3D pmic_arb_init_apid_min_max(bus); + if (ret) + return ret; + + ret =3D pmic_arb_read_apid_map_v5(bus); + if (ret) { + dev_err(&bus->spmic->dev, "could not read APID->PPID mapping table, rc= =3D %d\n", + ret); + return ret; + } + + return 0; +} + /* * v7 offset per ee and per apid for observer channels and per apid for * read/write channels. @@ -1581,7 +1644,7 @@ static const struct pmic_arb_ver_ops pmic_arb_v5 =3D { static const struct pmic_arb_ver_ops pmic_arb_v7 =3D { .ver_str =3D "v7", .get_core_resources =3D pmic_arb_get_core_resources_v7, - .init_apid =3D pmic_arb_init_apid_v5, + .init_apid =3D pmic_arb_init_apid_v7, .ppid_to_apid =3D pmic_arb_ppid_to_apid_v5, .non_data_cmd =3D pmic_arb_non_data_cmd_v2, .offset =3D pmic_arb_offset_v7, @@ -1605,6 +1668,7 @@ static int spmi_pmic_arb_bus_init(struct platform_dev= ice *pdev, struct device_node *node, struct spmi_pmic_arb *pmic_arb) { + int bus_index =3D pmic_arb->buses_available; struct spmi_pmic_arb_bus *bus; struct device *dev =3D &pdev->dev; struct spmi_controller *ctrl; @@ -1623,7 +1687,7 @@ static int spmi_pmic_arb_bus_init(struct platform_dev= ice *pdev, =20 bus =3D spmi_controller_get_drvdata(ctrl); =20 - pmic_arb->bus =3D bus; + pmic_arb->buses[bus_index] =3D bus; =20 bus->ppid_to_apid =3D devm_kcalloc(dev, PMIC_ARB_MAX_PPID, sizeof(*bus->ppid_to_apid), @@ -1666,12 +1730,13 @@ static int spmi_pmic_arb_bus_init(struct platform_d= evice *pdev, bus->cnfg =3D cnfg; bus->irq =3D irq; bus->spmic =3D ctrl; + bus->id =3D bus_index; =20 - ret =3D pmic_arb->ver_ops->init_apid(bus); + ret =3D pmic_arb->ver_ops->init_apid(bus, bus_index); if (ret) return ret; =20 - dev_dbg(&pdev->dev, "adding irq domain\n"); + dev_dbg(&pdev->dev, "adding irq domain for bus %d\n", bus_index); =20 bus->domain =3D irq_domain_add_tree(dev->of_node, &pmic_arb_irq_domain_ops, bus); @@ -1684,14 +1749,53 @@ static int spmi_pmic_arb_bus_init(struct platform_d= evice *pdev, pmic_arb_chained_irq, bus); =20 ctrl->dev.of_node =3D node; + dev_set_name(&ctrl->dev, "spmi-%d", bus_index); =20 ret =3D devm_spmi_controller_add(dev, ctrl); if (ret) return ret; =20 + pmic_arb->buses_available++; + return 0; } =20 +static int spmi_pmic_arb_register_buses(struct spmi_pmic_arb *pmic_arb, + struct platform_device *pdev) +{ + struct device *dev =3D &pdev->dev; + struct device_node *node =3D dev->of_node; + struct device_node *child; + int ret; + + /* legacy mode doesn't provide child node for the bus */ + if (of_device_is_compatible(node, "qcom,spmi-pmic-arb")) + return spmi_pmic_arb_bus_init(pdev, node, pmic_arb); + + for_each_available_child_of_node(node, child) { + if (of_node_name_eq(child, "spmi")) { + ret =3D spmi_pmic_arb_bus_init(pdev, child, pmic_arb); + if (ret) + return ret; + } + } + + return ret; +} + +static void spmi_pmic_arb_deregister_buses(struct spmi_pmic_arb *pmic_arb) +{ + int i; + + for (i =3D 0; i < PMIC_ARB_MAX_BUSES; i++) { + struct spmi_pmic_arb_bus *bus =3D pmic_arb->buses[i]; + + irq_set_chained_handler_and_data(bus->irq, + NULL, NULL); + irq_domain_remove(bus->domain); + } +} + static int spmi_pmic_arb_probe(struct platform_device *pdev) { struct spmi_pmic_arb *pmic_arb; @@ -1762,21 +1866,19 @@ static int spmi_pmic_arb_probe(struct platform_devi= ce *pdev) =20 pmic_arb->ee =3D ee; =20 - return spmi_pmic_arb_bus_init(pdev, dev->of_node, pmic_arb); + return spmi_pmic_arb_register_buses(pmic_arb, pdev); } =20 static void spmi_pmic_arb_remove(struct platform_device *pdev) { struct spmi_pmic_arb *pmic_arb =3D platform_get_drvdata(pdev); - struct spmi_pmic_arb_bus *bus =3D pmic_arb->bus; =20 - irq_set_chained_handler_and_data(bus->irq, - NULL, NULL); - irq_domain_remove(bus->domain); + spmi_pmic_arb_deregister_buses(pmic_arb); } =20 static const struct of_device_id spmi_pmic_arb_match_table[] =3D { { .compatible =3D "qcom,spmi-pmic-arb", }, + { .compatible =3D "qcom,x1e80100-spmi-pmic-arb", }, {}, }; MODULE_DEVICE_TABLE(of, spmi_pmic_arb_match_table); --=20 2.34.1