From patchwork Tue Mar 1 10:16:08 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Emekcan Aras X-Patchwork-Id: 4502 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id BFEEAC4332F for ; Tue, 1 Mar 2022 10:16:24 +0000 (UTC) Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by mx.groups.io with SMTP id smtpd.web09.6650.1646129783570695125 for ; Tue, 01 Mar 2022 02:16:23 -0800 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: arm.com, ip: 217.140.110.172, mailfrom: emekcan.aras@arm.com) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 23177106F; Tue, 1 Mar 2022 02:16:23 -0800 (PST) Received: from e126835.arm.com (unknown [10.57.20.159]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id BED023F73D; Tue, 1 Mar 2022 02:16:21 -0800 (PST) From: emekcan.aras@arm.com To: meta-arm@lists.yoctoproject.org, ross.burton@arm.com Cc: nd@arm.com, Emekcan Aras Subject: [PATCH 1/2] arm-bsp/linux-yocto: upgrade corstone1000 to 5.15 Date: Tue, 1 Mar 2022 10:16:08 +0000 Message-Id: <20220301101609.40783-2-emekcan.aras@arm.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220301101609.40783-1-emekcan.aras@arm.com> References: <20220301101609.40783-1-emekcan.aras@arm.com> MIME-Version: 1.0 List-Id: X-Webhook-Received: from li982-79.members.linode.com [45.33.32.79] by aws-us-west-2-korg-lkml-1.web.codeaurora.org with HTTPS for ; Tue, 01 Mar 2022 10:16:24 -0000 X-Groupsio-URL: https://lists.yoctoproject.org/g/meta-arm/message/3079 From: Emekcan Aras Update linux-yocto to the latest version for cs1k. There is a bug in the kernel version 5.15. Following patch is applied to fix this issue and will be upstreamed soon (https://lkml.org/lkml/2022/2/18/475). Signed-off-by: Emekcan Aras emekcan.aras@arm.com --- .../conf/machine/include/corstone1000.inc | 3 +- ...rong-label-in-macro-__init_el2_gicv3.patch | 47 + ...-usb-isp1760-fix-strict-typechecking.patch | 191 -- ...0-move-to-regmap-for-register-access.patch | 2333 ----------------- ...3-usb-isp1760-use-relaxed-primitives.patch | 64 - ...remove-platform-data-struct-and-code.patch | 62 - ...cd-refactor-mempool-config-and-setup.patch | 304 --- ...0006-usb-isp1760-use-dr_mode-binding.patch | 78 - ...-usb-isp1760-add-support-for-isp1763.patch | 1894 ------------- ...indings-usb-nxp-isp1760-add-bindings.patch | 99 - ...0009-usb-isp1763-add-peripheral-mode.patch | 303 --- ...ccc-Add-SMCCC-TRNG-function-call-IDs.patch | 69 - ...smccc-Introduce-SMCCC-TRNG-framework.patch | 103 - ...v1.2-extended-input-output-registers.patch | 192 -- ...A-bus-support-for-device-enumeration.patch | 423 --- ...a-Add-initial-Arm-FFA-driver-support.patch | 422 --- ...for-SMCCC-as-transport-to-ffa-driver.patch | 119 - ...up-in-kernel-users-of-FFA-partitions.patch | 410 --- ..._ffa-Add-support-for-MEM_-interfaces.patch | 409 --- ...ure-drivers-provide-a-probe-function.patch | 40 - ...ware-arm_ffa-Simplify-probe-function.patch | 38 - ...rmware-arm_ffa-Fix-the-comment-style.patch | 41 - ...ble-ffa_linux_errmap-buffer-overflow.patch | 46 - ...760-udc-Provide-missing-description-.patch | 41 - ...Fix-meaningless-check-in-isp1763_run.patch | 38 - ...sp1760-remove-debug-message-as-error.patch | 32 - ...-do-not-sleep-in-field-register-poll.patch | 58 - ...rk-cache-initialization-error-handli.patch | 55 - ...re-return-value-for-bus-change-patte.patch | 55 - ...-check-maxpacketsize-before-using-it.patch | 40 - ...0029-usb-isp1760-do-not-reset-retval.patch | 36 - ...0-do-not-shift-in-uninitialized-slot.patch | 61 - ...clean-never-read-udc_enabled-warning.patch | 52 - ...p1760-fix-memory-pool-initialization.patch | 36 - ...0033-usb-isp1760-fix-qtd-fill-length.patch | 38 - ...write-to-status-and-address-register.patch | 90 - ...isp1760-use-the-right-irq-status-bit.patch | 72 - ...-isp1760-otg-control-register-access.patch | 134 - ...A_VERSION-compatibility-checks.patch.patch | 101 - .../linux/files/corstone1000/defconfig | 1 - .../linux/linux-arm-platforms.inc | 38 +- 41 files changed, 50 insertions(+), 8618 deletions(-) create mode 100644 meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0001-arm64-Correct-wrong-label-in-macro-__init_el2_gicv3.patch delete mode 100644 meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0001-usb-isp1760-fix-strict-typechecking.patch delete mode 100644 meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0002-usb-isp1760-move-to-regmap-for-register-access.patch delete mode 100644 meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0003-usb-isp1760-use-relaxed-primitives.patch delete mode 100644 meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0004-usb-isp1760-remove-platform-data-struct-and-code.patch delete mode 100644 meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0005-usb-isp1760-hcd-refactor-mempool-config-and-setup.patch delete mode 100644 meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0006-usb-isp1760-use-dr_mode-binding.patch delete mode 100644 meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0007-usb-isp1760-add-support-for-isp1763.patch delete mode 100644 meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0008-dt-bindings-usb-nxp-isp1760-add-bindings.patch delete mode 100644 meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0009-usb-isp1763-add-peripheral-mode.patch delete mode 100644 meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0010-firmware-smccc-Add-SMCCC-TRNG-function-call-IDs.patch delete mode 100644 meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0011-firmware-smccc-Introduce-SMCCC-TRNG-framework.patch delete mode 100644 meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0012-arm64-smccc-Add-support-for-SMCCCv1.2-extended-input-output-registers.patch delete mode 100644 meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0013-firmware-arm_ffa-Add-initial-FFA-bus-support-for-device-enumeration.patch delete mode 100644 meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0014-firmware-arm_ffa-Add-initial-Arm-FFA-driver-support.patch delete mode 100644 meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0015-firmware-arm_ffa-Add-support-for-SMCCC-as-transport-to-ffa-driver.patch delete mode 100644 meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0016-firmware-arm_ffa-Setup-in-kernel-users-of-FFA-partitions.patch delete mode 100644 meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0017-firmware-arm_ffa-Add-support-for-MEM_-interfaces.patch delete mode 100644 meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0018-firmware-arm_ffa-Ensure-drivers-provide-a-probe-function.patch delete mode 100644 meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0019-firmware-arm_ffa-Simplify-probe-function.patch delete mode 100644 meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0020-firmware-arm_ffa-Fix-the-comment-style.patch delete mode 100644 meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0021-firmware-arm_ffa-Fix-a-possible-ffa_linux_errmap-buffer-overflow.patch delete mode 100644 meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0022-usb-isp1760-isp1760-udc-Provide-missing-description-.patch delete mode 100644 meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0023-usb-isp1760-Fix-meaningless-check-in-isp1763_run.patch delete mode 100644 meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0024-usb-isp1760-remove-debug-message-as-error.patch delete mode 100644 meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0025-usb-isp1760-do-not-sleep-in-field-register-poll.patch delete mode 100644 meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0026-usb-isp1760-rework-cache-initialization-error-handli.patch delete mode 100644 meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0027-usb-isp1760-ignore-return-value-for-bus-change-patte.patch delete mode 100644 meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0028-usb-isp1760-check-maxpacketsize-before-using-it.patch delete mode 100644 meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0029-usb-isp1760-do-not-reset-retval.patch delete mode 100644 meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0030-usb-isp1760-do-not-shift-in-uninitialized-slot.patch delete mode 100644 meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0031-usb-isp1760-clean-never-read-udc_enabled-warning.patch delete mode 100644 meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0032-usb-isp1760-fix-memory-pool-initialization.patch delete mode 100644 meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0033-usb-isp1760-fix-qtd-fill-length.patch delete mode 100644 meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0034-usb-isp1760-write-to-status-and-address-register.patch delete mode 100644 meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0035-usb-isp1760-use-the-right-irq-status-bit.patch delete mode 100644 meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0036-usb-isp1760-otg-control-register-access.patch delete mode 100644 meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0037-firmware-arm_ffa-setting-the-FFA_VERSION-compatibility-checks.patch.patch diff --git a/meta-arm-bsp/conf/machine/include/corstone1000.inc b/meta-arm-bsp/conf/machine/include/corstone1000.inc index f9d301e4..1af74bd0 100644 --- a/meta-arm-bsp/conf/machine/include/corstone1000.inc +++ b/meta-arm-bsp/conf/machine/include/corstone1000.inc @@ -45,7 +45,7 @@ EXTRA_IMAGEDEPENDS += "secure-partitions" # Linux kernel PREFERRED_PROVIDER_virtual/kernel:forcevariable = "linux-yocto" -PREFERRED_VERSION_linux-yocto = "5.10%" +PREFERRED_VERSION_linux-yocto = "5.15%" KERNEL_IMAGETYPE = "Image" INITRAMFS_IMAGE_BUNDLE ?= "1" @@ -63,3 +63,4 @@ SERIAL_CONSOLES ?= "115200;ttyAMA0" WKS_FILE_DEPENDS:append = " ${EXTRA_IMAGEDEPENDS}" WKS_FILE ?= "corstone1000-image.corstone1000.wks" + diff --git a/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0001-arm64-Correct-wrong-label-in-macro-__init_el2_gicv3.patch b/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0001-arm64-Correct-wrong-label-in-macro-__init_el2_gicv3.patch new file mode 100644 index 00000000..1d205ade --- /dev/null +++ b/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0001-arm64-Correct-wrong-label-in-macro-__init_el2_gicv3.patch @@ -0,0 +1,47 @@ +Upstream-Status: Pending [Not submitted to upstream yet] +Signed-off-by: Emekcan Aras + +From 5bad687c47aa1958042e34695824da44cf28d6ff Mon Sep 17 00:00:00 2001 +From: Joakim Tjernlund +Date: Mon, 14 Feb 2022 18:56:43 +0100 +Subject: [PATCH] arm64: Correct wrong label in macro __init_el2_gicv3 + +In commit: + + 114945d84a30a5fe ("arm64: Fix labels in el2_setup macros") + +We renamed a label from '1' to '.Lskip_gicv3_\@', but failed to update +a branch to it, which now targets a later label also called '1'. + +The branch is taken rarely, when GICv3 is present but SRE is disabled +at EL3, causing a boot-time crash. + +Update the caller to the new label name. + +Fixes: 114945d84a30 ("arm64: Fix labels in el2_setup macros") +Cc: # 5.12.x +Signed-off-by: Joakim Tjernlund +Link: https://lore.kernel.org/r/20220214175643.21931-1-joakim.tjernlund@infinera.com +Reviewed-by: Mark Rutland +Reviewed-by: Marc Zyngier +Signed-off-by: Catalin Marinas +--- + arch/arm64/include/asm/el2_setup.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/arch/arm64/include/asm/el2_setup.h b/arch/arm64/include/asm/el2_setup.h +index 3198acb2aad8..7f3c87f7a0ce 100644 +--- a/arch/arm64/include/asm/el2_setup.h ++++ b/arch/arm64/include/asm/el2_setup.h +@@ -106,7 +106,7 @@ + msr_s SYS_ICC_SRE_EL2, x0 + isb // Make sure SRE is now set + mrs_s x0, SYS_ICC_SRE_EL2 // Read SRE back, +- tbz x0, #0, 1f // and check that it sticks ++ tbz x0, #0, .Lskip_gicv3_\@ // and check that it sticks + msr_s SYS_ICH_HCR_EL2, xzr // Reset ICC_HCR_EL2 to defaults + .Lskip_gicv3_\@: + .endm +-- +2.25.1 + diff --git a/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0001-usb-isp1760-fix-strict-typechecking.patch b/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0001-usb-isp1760-fix-strict-typechecking.patch deleted file mode 100644 index 1b1cb962..00000000 --- a/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0001-usb-isp1760-fix-strict-typechecking.patch +++ /dev/null @@ -1,191 +0,0 @@ -Upstream-Status: Accepted [merged with kernel 5.14.9] -Signed-off-by: Arpita S.K - -From abfabc8ae3bd625f57fa35d25f2435bb6465a3b1 Mon Sep 17 00:00:00 2001 -From: Rui Miguel Silva -Date: Thu, 13 May 2021 09:47:09 +0100 -Subject: [PATCH 01/23] usb: isp1760: fix strict typechecking - -There are a lot of pre-existing typechecking warnings around the -access and assign of elements of ptd structure of __dw type. - -sparse: warning: invalid assignment: |= -sparse: left side has type restricted __dw -sparse: right side has type unsigned int - -or - -warning: restricted __dw degrades to integer - -or - -sparse: warning: incorrect type in assignment (different base types) -sparse: expected restricted __dw [usertype] dw4 -sparse: got unsigned int [assigned] [usertype] usof - -To handle this, annotate conversions along the {TO,FROM}_DW* macros -and some assignments and function arguments. - -This clean up completely all sparse warnings for this driver. - -Signed-off-by: Rui Miguel Silva -Link: https://lore.kernel.org/r/20210513084717.2487366-2-rui.silva@linaro.org -Signed-off-by: Greg Kroah-Hartman ---- - drivers/usb/isp1760/isp1760-hcd.c | 92 ++++++++++++++++--------------- - 1 file changed, 47 insertions(+), 45 deletions(-) - -diff --git a/drivers/usb/isp1760/isp1760-hcd.c b/drivers/usb/isp1760/isp1760-hcd.c -index 33ae656c4b68..0e0a4b01c710 100644 ---- a/drivers/usb/isp1760/isp1760-hcd.c -+++ b/drivers/usb/isp1760/isp1760-hcd.c -@@ -66,44 +66,46 @@ struct ptd { - #define ATL_PTD_OFFSET 0x0c00 - #define PAYLOAD_OFFSET 0x1000 - -- --/* ATL */ --/* DW0 */ --#define DW0_VALID_BIT 1 --#define FROM_DW0_VALID(x) ((x) & 0x01) --#define TO_DW0_LENGTH(x) (((u32) x) << 3) --#define TO_DW0_MAXPACKET(x) (((u32) x) << 18) --#define TO_DW0_MULTI(x) (((u32) x) << 29) --#define TO_DW0_ENDPOINT(x) (((u32) x) << 31) -+#define TO_DW(x) ((__force __dw)x) -+#define TO_U32(x) ((__force u32)x) -+ -+ /* ATL */ -+ /* DW0 */ -+#define DW0_VALID_BIT TO_DW(1) -+#define FROM_DW0_VALID(x) (TO_U32(x) & 0x01) -+#define TO_DW0_LENGTH(x) TO_DW((((u32)x) << 3)) -+#define TO_DW0_MAXPACKET(x) TO_DW((((u32)x) << 18)) -+#define TO_DW0_MULTI(x) TO_DW((((u32)x) << 29)) -+#define TO_DW0_ENDPOINT(x) TO_DW((((u32)x) << 31)) - /* DW1 */ --#define TO_DW1_DEVICE_ADDR(x) (((u32) x) << 3) --#define TO_DW1_PID_TOKEN(x) (((u32) x) << 10) --#define DW1_TRANS_BULK ((u32) 2 << 12) --#define DW1_TRANS_INT ((u32) 3 << 12) --#define DW1_TRANS_SPLIT ((u32) 1 << 14) --#define DW1_SE_USB_LOSPEED ((u32) 2 << 16) --#define TO_DW1_PORT_NUM(x) (((u32) x) << 18) --#define TO_DW1_HUB_NUM(x) (((u32) x) << 25) -+#define TO_DW1_DEVICE_ADDR(x) TO_DW((((u32)x) << 3)) -+#define TO_DW1_PID_TOKEN(x) TO_DW((((u32)x) << 10)) -+#define DW1_TRANS_BULK TO_DW(((u32)2 << 12)) -+#define DW1_TRANS_INT TO_DW(((u32)3 << 12)) -+#define DW1_TRANS_SPLIT TO_DW(((u32)1 << 14)) -+#define DW1_SE_USB_LOSPEED TO_DW(((u32)2 << 16)) -+#define TO_DW1_PORT_NUM(x) TO_DW((((u32)x) << 18)) -+#define TO_DW1_HUB_NUM(x) TO_DW((((u32)x) << 25)) - /* DW2 */ --#define TO_DW2_DATA_START_ADDR(x) (((u32) x) << 8) --#define TO_DW2_RL(x) ((x) << 25) --#define FROM_DW2_RL(x) (((x) >> 25) & 0xf) -+#define TO_DW2_DATA_START_ADDR(x) TO_DW((((u32)x) << 8)) -+#define TO_DW2_RL(x) TO_DW(((x) << 25)) -+#define FROM_DW2_RL(x) ((TO_U32(x) >> 25) & 0xf) - /* DW3 */ --#define FROM_DW3_NRBYTESTRANSFERRED(x) ((x) & 0x7fff) --#define FROM_DW3_SCS_NRBYTESTRANSFERRED(x) ((x) & 0x07ff) --#define TO_DW3_NAKCOUNT(x) ((x) << 19) --#define FROM_DW3_NAKCOUNT(x) (((x) >> 19) & 0xf) --#define TO_DW3_CERR(x) ((x) << 23) --#define FROM_DW3_CERR(x) (((x) >> 23) & 0x3) --#define TO_DW3_DATA_TOGGLE(x) ((x) << 25) --#define FROM_DW3_DATA_TOGGLE(x) (((x) >> 25) & 0x1) --#define TO_DW3_PING(x) ((x) << 26) --#define FROM_DW3_PING(x) (((x) >> 26) & 0x1) --#define DW3_ERROR_BIT (1 << 28) --#define DW3_BABBLE_BIT (1 << 29) --#define DW3_HALT_BIT (1 << 30) --#define DW3_ACTIVE_BIT (1 << 31) --#define FROM_DW3_ACTIVE(x) (((x) >> 31) & 0x01) -+#define FROM_DW3_NRBYTESTRANSFERRED(x) TO_U32((x) & 0x7fff) -+#define FROM_DW3_SCS_NRBYTESTRANSFERRED(x) TO_U32((x) & 0x07ff) -+#define TO_DW3_NAKCOUNT(x) TO_DW(((x) << 19)) -+#define FROM_DW3_NAKCOUNT(x) ((TO_U32(x) >> 19) & 0xf) -+#define TO_DW3_CERR(x) TO_DW(((x) << 23)) -+#define FROM_DW3_CERR(x) ((TO_U32(x) >> 23) & 0x3) -+#define TO_DW3_DATA_TOGGLE(x) TO_DW(((x) << 25)) -+#define FROM_DW3_DATA_TOGGLE(x) ((TO_U32(x) >> 25) & 0x1) -+#define TO_DW3_PING(x) TO_DW(((x) << 26)) -+#define FROM_DW3_PING(x) ((TO_U32(x) >> 26) & 0x1) -+#define DW3_ERROR_BIT TO_DW((1 << 28)) -+#define DW3_BABBLE_BIT TO_DW((1 << 29)) -+#define DW3_HALT_BIT TO_DW((1 << 30)) -+#define DW3_ACTIVE_BIT TO_DW((1 << 31)) -+#define FROM_DW3_ACTIVE(x) ((TO_U32(x) >> 31) & 0x01) - - #define INT_UNDERRUN (1 << 2) - #define INT_BABBLE (1 << 1) -@@ -292,12 +294,12 @@ static void ptd_write(void __iomem *base, u32 ptd_offset, u32 slot, - struct ptd *ptd) - { - mem_writes8(base, ptd_offset + slot*sizeof(*ptd) + sizeof(ptd->dw0), -- &ptd->dw1, 7*sizeof(ptd->dw1)); -+ (__force u32 *)&ptd->dw1, 7 * sizeof(ptd->dw1)); - /* Make sure dw0 gets written last (after other dw's and after payload) - since it contains the enable bit */ - wmb(); -- mem_writes8(base, ptd_offset + slot*sizeof(*ptd), &ptd->dw0, -- sizeof(ptd->dw0)); -+ mem_writes8(base, ptd_offset + slot * sizeof(*ptd), -+ (__force u32 *)&ptd->dw0, sizeof(ptd->dw0)); - } - - -@@ -553,7 +555,7 @@ static void create_ptd_atl(struct isp1760_qh *qh, - ptd->dw0 |= TO_DW0_ENDPOINT(usb_pipeendpoint(qtd->urb->pipe)); - - /* DW1 */ -- ptd->dw1 = usb_pipeendpoint(qtd->urb->pipe) >> 1; -+ ptd->dw1 = TO_DW((usb_pipeendpoint(qtd->urb->pipe) >> 1)); - ptd->dw1 |= TO_DW1_DEVICE_ADDR(usb_pipedevice(qtd->urb->pipe)); - ptd->dw1 |= TO_DW1_PID_TOKEN(qtd->packet_type); - -@@ -575,7 +577,7 @@ static void create_ptd_atl(struct isp1760_qh *qh, - /* SE bit for Split INT transfers */ - if (usb_pipeint(qtd->urb->pipe) && - (qtd->urb->dev->speed == USB_SPEED_LOW)) -- ptd->dw1 |= 2 << 16; -+ ptd->dw1 |= DW1_SE_USB_LOSPEED; - - rl = 0; - nak = 0; -@@ -647,14 +649,14 @@ static void transform_add_int(struct isp1760_qh *qh, - * that number come from? 0xff seems to work fine... - */ - /* ptd->dw5 = 0x1c; */ -- ptd->dw5 = 0xff; /* Execute Complete Split on any uFrame */ -+ ptd->dw5 = TO_DW(0xff); /* Execute Complete Split on any uFrame */ - } - - period = period >> 1;/* Ensure equal or shorter period than requested */ - period &= 0xf8; /* Mask off too large values and lowest unused 3 bits */ - -- ptd->dw2 |= period; -- ptd->dw4 = usof; -+ ptd->dw2 |= TO_DW(period); -+ ptd->dw4 = TO_DW(usof); - } - - static void create_ptd_int(struct isp1760_qh *qh, -@@ -977,10 +979,10 @@ static void schedule_ptds(struct usb_hcd *hcd) - static int check_int_transfer(struct usb_hcd *hcd, struct ptd *ptd, - struct urb *urb) - { -- __dw dw4; -+ u32 dw4; - int i; - -- dw4 = ptd->dw4; -+ dw4 = TO_U32(ptd->dw4); - dw4 >>= 8; - - /* FIXME: ISP1761 datasheet does not say what to do with these. Do we --- -2.33.0 - diff --git a/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0002-usb-isp1760-move-to-regmap-for-register-access.patch b/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0002-usb-isp1760-move-to-regmap-for-register-access.patch deleted file mode 100644 index a3862968..00000000 --- a/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0002-usb-isp1760-move-to-regmap-for-register-access.patch +++ /dev/null @@ -1,2333 +0,0 @@ -Upstream-Status: Accepted [merged with kernel 5.14.9] -Signed-off-by: Arpita S.K - -From 1da9e1c06873350c99ba49a052f92de85f2c69f2 Mon Sep 17 00:00:00 2001 -From: Rui Miguel Silva -Date: Thu, 13 May 2021 09:47:10 +0100 -Subject: [PATCH 02/23] usb: isp1760: move to regmap for register access - -Rework access to registers and memory to use regmap framework. -No change in current feature or way of work is intended with this -change. - -This will allow to reuse this driver with other IP of this family, -for example isp1763, with little changes and effort. - -Signed-off-by: Rui Miguel Silva -Link: https://lore.kernel.org/r/20210513084717.2487366-3-rui.silva@linaro.org -Signed-off-by: Greg Kroah-Hartman ---- - drivers/usb/isp1760/Kconfig | 1 + - drivers/usb/isp1760/isp1760-core.c | 239 +++++++++++++--- - drivers/usb/isp1760/isp1760-core.h | 38 ++- - drivers/usb/isp1760/isp1760-hcd.c | 445 +++++++++++++++-------------- - drivers/usb/isp1760/isp1760-hcd.h | 18 +- - drivers/usb/isp1760/isp1760-if.c | 4 +- - drivers/usb/isp1760/isp1760-regs.h | 338 ++++++++++------------ - drivers/usb/isp1760/isp1760-udc.c | 227 ++++++++++----- - drivers/usb/isp1760/isp1760-udc.h | 10 +- - 9 files changed, 789 insertions(+), 531 deletions(-) - -diff --git a/drivers/usb/isp1760/Kconfig b/drivers/usb/isp1760/Kconfig -index b1022cc490a2..d23853f601b1 100644 ---- a/drivers/usb/isp1760/Kconfig -+++ b/drivers/usb/isp1760/Kconfig -@@ -3,6 +3,7 @@ - config USB_ISP1760 - tristate "NXP ISP 1760/1761 support" - depends on USB || USB_GADGET -+ select REGMAP_MMIO - help - Say Y or M here if your system as an ISP1760 USB host controller - or an ISP1761 USB dual-role controller. -diff --git a/drivers/usb/isp1760/isp1760-core.c b/drivers/usb/isp1760/isp1760-core.c -index fdeb4cf97cc5..c79ba98df9f9 100644 ---- a/drivers/usb/isp1760/isp1760-core.c -+++ b/drivers/usb/isp1760/isp1760-core.c -@@ -15,6 +15,7 @@ - #include - #include - #include -+#include - #include - #include - -@@ -25,8 +26,8 @@ - - static void isp1760_init_core(struct isp1760_device *isp) - { -- u32 otgctrl; -- u32 hwmode; -+ struct isp1760_hcd *hcd = &isp->hcd; -+ struct isp1760_udc *udc = &isp->udc; - - /* Low-level chip reset */ - if (isp->rst_gpio) { -@@ -39,24 +40,22 @@ static void isp1760_init_core(struct isp1760_device *isp) - * Reset the host controller, including the CPU interface - * configuration. - */ -- isp1760_write32(isp->regs, HC_RESET_REG, SW_RESET_RESET_ALL); -+ isp1760_field_set(hcd->fields, SW_RESET_RESET_ALL); - msleep(100); - - /* Setup HW Mode Control: This assumes a level active-low interrupt */ -- hwmode = HW_DATA_BUS_32BIT; -- - if (isp->devflags & ISP1760_FLAG_BUS_WIDTH_16) -- hwmode &= ~HW_DATA_BUS_32BIT; -+ isp1760_field_clear(hcd->fields, HW_DATA_BUS_WIDTH); - if (isp->devflags & ISP1760_FLAG_ANALOG_OC) -- hwmode |= HW_ANA_DIGI_OC; -+ isp1760_field_set(hcd->fields, HW_ANA_DIGI_OC); - if (isp->devflags & ISP1760_FLAG_DACK_POL_HIGH) -- hwmode |= HW_DACK_POL_HIGH; -+ isp1760_field_set(hcd->fields, HW_DACK_POL_HIGH); - if (isp->devflags & ISP1760_FLAG_DREQ_POL_HIGH) -- hwmode |= HW_DREQ_POL_HIGH; -+ isp1760_field_set(hcd->fields, HW_DREQ_POL_HIGH); - if (isp->devflags & ISP1760_FLAG_INTR_POL_HIGH) -- hwmode |= HW_INTR_HIGH_ACT; -+ isp1760_field_set(hcd->fields, HW_INTR_HIGH_ACT); - if (isp->devflags & ISP1760_FLAG_INTR_EDGE_TRIG) -- hwmode |= HW_INTR_EDGE_TRIG; -+ isp1760_field_set(hcd->fields, HW_INTR_EDGE_TRIG); - - /* - * The ISP1761 has a dedicated DC IRQ line but supports sharing the HC -@@ -65,18 +64,10 @@ static void isp1760_init_core(struct isp1760_device *isp) - * spurious interrupts during HCD registration. - */ - if (isp->devflags & ISP1760_FLAG_ISP1761) { -- isp1760_write32(isp->regs, DC_MODE, 0); -- hwmode |= HW_COMN_IRQ; -+ isp1760_reg_write(udc->regs, ISP176x_DC_MODE, 0); -+ isp1760_field_set(hcd->fields, HW_COMN_IRQ); - } - -- /* -- * We have to set this first in case we're in 16-bit mode. -- * Write it twice to ensure correct upper bits if switching -- * to 16-bit mode. -- */ -- isp1760_write32(isp->regs, HC_HW_MODE_CTRL, hwmode); -- isp1760_write32(isp->regs, HC_HW_MODE_CTRL, hwmode); -- - /* - * PORT 1 Control register of the ISP1760 is the OTG control register - * on ISP1761. -@@ -85,14 +76,15 @@ static void isp1760_init_core(struct isp1760_device *isp) - * when OTG is requested. - */ - if ((isp->devflags & ISP1760_FLAG_ISP1761) && -- (isp->devflags & ISP1760_FLAG_OTG_EN)) -- otgctrl = ((HW_DM_PULLDOWN | HW_DP_PULLDOWN) << 16) -- | HW_OTG_DISABLE; -- else -- otgctrl = (HW_SW_SEL_HC_DC << 16) -- | (HW_VBUS_DRV | HW_SEL_CP_EXT); -- -- isp1760_write32(isp->regs, HC_PORT1_CTRL, otgctrl); -+ (isp->devflags & ISP1760_FLAG_OTG_EN)) { -+ isp1760_field_set(hcd->fields, HW_DM_PULLDOWN); -+ isp1760_field_set(hcd->fields, HW_DP_PULLDOWN); -+ isp1760_field_set(hcd->fields, HW_OTG_DISABLE); -+ } else { -+ isp1760_field_set(hcd->fields, HW_SW_SEL_HC_DC); -+ isp1760_field_set(hcd->fields, HW_VBUS_DRV); -+ isp1760_field_set(hcd->fields, HW_SEL_CP_EXT); -+ } - - dev_info(isp->dev, "bus width: %u, oc: %s\n", - isp->devflags & ISP1760_FLAG_BUS_WIDTH_16 ? 16 : 32, -@@ -101,16 +93,158 @@ static void isp1760_init_core(struct isp1760_device *isp) - - void isp1760_set_pullup(struct isp1760_device *isp, bool enable) - { -- isp1760_write32(isp->regs, HW_OTG_CTRL_SET, -- enable ? HW_DP_PULLUP : HW_DP_PULLUP << 16); -+ struct isp1760_udc *udc = &isp->udc; -+ -+ if (enable) -+ isp1760_field_set(udc->fields, HW_DP_PULLUP); -+ else -+ isp1760_field_set(udc->fields, HW_DP_PULLUP_CLEAR); - } - -+static const struct regmap_range isp176x_hc_volatile_ranges[] = { -+ regmap_reg_range(ISP176x_HC_USBCMD, ISP176x_HC_ATL_PTD_LASTPTD), -+ regmap_reg_range(ISP176x_HC_BUFFER_STATUS, ISP176x_HC_MEMORY), -+ regmap_reg_range(ISP176x_HC_INTERRUPT, ISP176x_HC_ATL_IRQ_MASK_AND), -+}; -+ -+static const struct regmap_access_table isp176x_hc_volatile_table = { -+ .yes_ranges = isp176x_hc_volatile_ranges, -+ .n_yes_ranges = ARRAY_SIZE(isp176x_hc_volatile_ranges), -+}; -+ -+static struct regmap_config isp1760_hc_regmap_conf = { -+ .name = "isp1760-hc", -+ .reg_bits = 16, -+ .reg_stride = 4, -+ .val_bits = 32, -+ .fast_io = true, -+ .max_register = ISP176x_HC_MEMORY, -+ .volatile_table = &isp176x_hc_volatile_table, -+}; -+ -+static const struct reg_field isp1760_hc_reg_fields[] = { -+ [HCS_PPC] = REG_FIELD(ISP176x_HC_HCSPARAMS, 4, 4), -+ [HCS_N_PORTS] = REG_FIELD(ISP176x_HC_HCSPARAMS, 0, 3), -+ [HCC_ISOC_CACHE] = REG_FIELD(ISP176x_HC_HCCPARAMS, 7, 7), -+ [HCC_ISOC_THRES] = REG_FIELD(ISP176x_HC_HCCPARAMS, 4, 6), -+ [CMD_LRESET] = REG_FIELD(ISP176x_HC_USBCMD, 7, 7), -+ [CMD_RESET] = REG_FIELD(ISP176x_HC_USBCMD, 1, 1), -+ [CMD_RUN] = REG_FIELD(ISP176x_HC_USBCMD, 0, 0), -+ [STS_PCD] = REG_FIELD(ISP176x_HC_USBSTS, 2, 2), -+ [HC_FRINDEX] = REG_FIELD(ISP176x_HC_FRINDEX, 0, 13), -+ [FLAG_CF] = REG_FIELD(ISP176x_HC_CONFIGFLAG, 0, 0), -+ [PORT_OWNER] = REG_FIELD(ISP176x_HC_PORTSC1, 13, 13), -+ [PORT_POWER] = REG_FIELD(ISP176x_HC_PORTSC1, 12, 12), -+ [PORT_LSTATUS] = REG_FIELD(ISP176x_HC_PORTSC1, 10, 11), -+ [PORT_RESET] = REG_FIELD(ISP176x_HC_PORTSC1, 8, 8), -+ [PORT_SUSPEND] = REG_FIELD(ISP176x_HC_PORTSC1, 7, 7), -+ [PORT_RESUME] = REG_FIELD(ISP176x_HC_PORTSC1, 6, 6), -+ [PORT_PE] = REG_FIELD(ISP176x_HC_PORTSC1, 2, 2), -+ [PORT_CSC] = REG_FIELD(ISP176x_HC_PORTSC1, 1, 1), -+ [PORT_CONNECT] = REG_FIELD(ISP176x_HC_PORTSC1, 0, 0), -+ [ALL_ATX_RESET] = REG_FIELD(ISP176x_HC_HW_MODE_CTRL, 31, 31), -+ [HW_ANA_DIGI_OC] = REG_FIELD(ISP176x_HC_HW_MODE_CTRL, 15, 15), -+ [HW_COMN_IRQ] = REG_FIELD(ISP176x_HC_HW_MODE_CTRL, 10, 10), -+ [HW_DATA_BUS_WIDTH] = REG_FIELD(ISP176x_HC_HW_MODE_CTRL, 8, 8), -+ [HW_DACK_POL_HIGH] = REG_FIELD(ISP176x_HC_HW_MODE_CTRL, 6, 6), -+ [HW_DREQ_POL_HIGH] = REG_FIELD(ISP176x_HC_HW_MODE_CTRL, 5, 5), -+ [HW_INTR_HIGH_ACT] = REG_FIELD(ISP176x_HC_HW_MODE_CTRL, 2, 2), -+ [HW_INTR_EDGE_TRIG] = REG_FIELD(ISP176x_HC_HW_MODE_CTRL, 1, 1), -+ [HW_GLOBAL_INTR_EN] = REG_FIELD(ISP176x_HC_HW_MODE_CTRL, 0, 0), -+ [SW_RESET_RESET_ALL] = REG_FIELD(ISP176x_HC_RESET, 0, 0), -+ [INT_BUF_FILL] = REG_FIELD(ISP176x_HC_BUFFER_STATUS, 1, 1), -+ [ATL_BUF_FILL] = REG_FIELD(ISP176x_HC_BUFFER_STATUS, 0, 0), -+ [MEM_BANK_SEL] = REG_FIELD(ISP176x_HC_MEMORY, 16, 17), -+ [MEM_START_ADDR] = REG_FIELD(ISP176x_HC_MEMORY, 0, 15), -+ [HC_INT_ENABLE] = REG_FIELD(ISP176x_HC_INTERRUPT_ENABLE, 7, 8), -+}; -+ -+static const struct regmap_range isp176x_dc_volatile_ranges[] = { -+ regmap_reg_range(ISP176x_DC_EPMAXPKTSZ, ISP176x_DC_EPTYPE), -+ regmap_reg_range(ISP176x_DC_BUFLEN, ISP176x_DC_EPINDEX), -+ regmap_reg_range(ISP1761_DC_OTG_CTRL_SET, ISP1761_DC_OTG_CTRL_CLEAR), -+}; -+ -+static const struct regmap_access_table isp176x_dc_volatile_table = { -+ .yes_ranges = isp176x_dc_volatile_ranges, -+ .n_yes_ranges = ARRAY_SIZE(isp176x_dc_volatile_ranges), -+}; -+ -+static struct regmap_config isp1761_dc_regmap_conf = { -+ .name = "isp1761-dc", -+ .reg_bits = 16, -+ .reg_stride = 4, -+ .val_bits = 32, -+ .fast_io = true, -+ .max_register = ISP1761_DC_OTG_CTRL_CLEAR, -+ .volatile_table = &isp176x_dc_volatile_table, -+}; -+ -+static const struct reg_field isp1761_dc_reg_fields[] = { -+ [DC_DEVEN] = REG_FIELD(ISP176x_DC_ADDRESS, 7, 7), -+ [DC_DEVADDR] = REG_FIELD(ISP176x_DC_ADDRESS, 0, 6), -+ [DC_VBUSSTAT] = REG_FIELD(ISP176x_DC_MODE, 8, 8), -+ [DC_SFRESET] = REG_FIELD(ISP176x_DC_MODE, 4, 4), -+ [DC_GLINTENA] = REG_FIELD(ISP176x_DC_MODE, 3, 3), -+ [DC_CDBGMOD_ACK] = REG_FIELD(ISP176x_DC_INTCONF, 6, 6), -+ [DC_DDBGMODIN_ACK] = REG_FIELD(ISP176x_DC_INTCONF, 4, 4), -+ [DC_DDBGMODOUT_ACK] = REG_FIELD(ISP176x_DC_INTCONF, 2, 2), -+ [DC_INTPOL] = REG_FIELD(ISP176x_DC_INTCONF, 0, 0), -+ [DC_IEPRXTX_7] = REG_FIELD(ISP176x_DC_INTENABLE, 25, 25), -+ [DC_IEPRXTX_6] = REG_FIELD(ISP176x_DC_INTENABLE, 23, 23), -+ [DC_IEPRXTX_5] = REG_FIELD(ISP176x_DC_INTENABLE, 21, 21), -+ [DC_IEPRXTX_4] = REG_FIELD(ISP176x_DC_INTENABLE, 19, 19), -+ [DC_IEPRXTX_3] = REG_FIELD(ISP176x_DC_INTENABLE, 17, 17), -+ [DC_IEPRXTX_2] = REG_FIELD(ISP176x_DC_INTENABLE, 15, 15), -+ [DC_IEPRXTX_1] = REG_FIELD(ISP176x_DC_INTENABLE, 13, 13), -+ [DC_IEPRXTX_0] = REG_FIELD(ISP176x_DC_INTENABLE, 11, 11), -+ [DC_IEP0SETUP] = REG_FIELD(ISP176x_DC_INTENABLE, 8, 8), -+ [DC_IEVBUS] = REG_FIELD(ISP176x_DC_INTENABLE, 7, 7), -+ [DC_IEHS_STA] = REG_FIELD(ISP176x_DC_INTENABLE, 5, 5), -+ [DC_IERESM] = REG_FIELD(ISP176x_DC_INTENABLE, 4, 4), -+ [DC_IESUSP] = REG_FIELD(ISP176x_DC_INTENABLE, 3, 3), -+ [DC_IEBRST] = REG_FIELD(ISP176x_DC_INTENABLE, 0, 0), -+ [DC_EP0SETUP] = REG_FIELD(ISP176x_DC_EPINDEX, 5, 5), -+ [DC_ENDPIDX] = REG_FIELD(ISP176x_DC_EPINDEX, 1, 4), -+ [DC_EPDIR] = REG_FIELD(ISP176x_DC_EPINDEX, 0, 0), -+ [DC_CLBUF] = REG_FIELD(ISP176x_DC_CTRLFUNC, 4, 4), -+ [DC_VENDP] = REG_FIELD(ISP176x_DC_CTRLFUNC, 3, 3), -+ [DC_DSEN] = REG_FIELD(ISP176x_DC_CTRLFUNC, 2, 2), -+ [DC_STATUS] = REG_FIELD(ISP176x_DC_CTRLFUNC, 1, 1), -+ [DC_STALL] = REG_FIELD(ISP176x_DC_CTRLFUNC, 0, 0), -+ [DC_BUFLEN] = REG_FIELD(ISP176x_DC_BUFLEN, 0, 15), -+ [DC_FFOSZ] = REG_FIELD(ISP176x_DC_EPMAXPKTSZ, 0, 10), -+ [DC_EPENABLE] = REG_FIELD(ISP176x_DC_EPTYPE, 3, 3), -+ [DC_ENDPTYP] = REG_FIELD(ISP176x_DC_EPTYPE, 0, 1), -+ [DC_UFRAMENUM] = REG_FIELD(ISP176x_DC_FRAMENUM, 11, 13), -+ [DC_FRAMENUM] = REG_FIELD(ISP176x_DC_FRAMENUM, 0, 10), -+ [HW_OTG_DISABLE] = REG_FIELD(ISP1761_DC_OTG_CTRL_SET, 10, 10), -+ [HW_SW_SEL_HC_DC] = REG_FIELD(ISP1761_DC_OTG_CTRL_SET, 7, 7), -+ [HW_VBUS_DRV] = REG_FIELD(ISP1761_DC_OTG_CTRL_SET, 4, 4), -+ [HW_SEL_CP_EXT] = REG_FIELD(ISP1761_DC_OTG_CTRL_SET, 3, 3), -+ [HW_DM_PULLDOWN] = REG_FIELD(ISP1761_DC_OTG_CTRL_SET, 2, 2), -+ [HW_DP_PULLDOWN] = REG_FIELD(ISP1761_DC_OTG_CTRL_SET, 1, 1), -+ [HW_DP_PULLUP] = REG_FIELD(ISP1761_DC_OTG_CTRL_SET, 0, 0), -+ [HW_OTG_DISABLE_CLEAR] = REG_FIELD(ISP1761_DC_OTG_CTRL_CLEAR, 10, 10), -+ [HW_SW_SEL_HC_DC_CLEAR] = REG_FIELD(ISP1761_DC_OTG_CTRL_CLEAR, 7, 7), -+ [HW_VBUS_DRV_CLEAR] = REG_FIELD(ISP1761_DC_OTG_CTRL_CLEAR, 4, 4), -+ [HW_SEL_CP_EXT_CLEAR] = REG_FIELD(ISP1761_DC_OTG_CTRL_CLEAR, 3, 3), -+ [HW_DM_PULLDOWN_CLEAR] = REG_FIELD(ISP1761_DC_OTG_CTRL_CLEAR, 2, 2), -+ [HW_DP_PULLDOWN_CLEAR] = REG_FIELD(ISP1761_DC_OTG_CTRL_CLEAR, 1, 1), -+ [HW_DP_PULLUP_CLEAR] = REG_FIELD(ISP1761_DC_OTG_CTRL_CLEAR, 0, 0), -+}; -+ - int isp1760_register(struct resource *mem, int irq, unsigned long irqflags, - struct device *dev, unsigned int devflags) - { - struct isp1760_device *isp; -+ struct isp1760_hcd *hcd; -+ struct isp1760_udc *udc; - bool udc_disabled = !(devflags & ISP1760_FLAG_ISP1761); -+ struct regmap_field *f; -+ void __iomem *base; - int ret; -+ int i; - - /* - * If neither the HCD not the UDC is enabled return an error, as no -@@ -126,19 +260,52 @@ int isp1760_register(struct resource *mem, int irq, unsigned long irqflags, - - isp->dev = dev; - isp->devflags = devflags; -+ hcd = &isp->hcd; -+ udc = &isp->udc; -+ -+ if (devflags & ISP1760_FLAG_BUS_WIDTH_16) { -+ isp1760_hc_regmap_conf.val_bits = 16; -+ isp1761_dc_regmap_conf.val_bits = 16; -+ } - - isp->rst_gpio = devm_gpiod_get_optional(dev, NULL, GPIOD_OUT_HIGH); - if (IS_ERR(isp->rst_gpio)) - return PTR_ERR(isp->rst_gpio); - -- isp->regs = devm_ioremap_resource(dev, mem); -- if (IS_ERR(isp->regs)) -- return PTR_ERR(isp->regs); -+ hcd->base = devm_ioremap_resource(dev, mem); -+ if (IS_ERR(hcd->base)) -+ return PTR_ERR(hcd->base); -+ -+ hcd->regs = devm_regmap_init_mmio(dev, base, &isp1760_hc_regmap_conf); -+ if (IS_ERR(hcd->regs)) -+ return PTR_ERR(hcd->regs); -+ -+ for (i = 0; i < HC_FIELD_MAX; i++) { -+ f = devm_regmap_field_alloc(dev, hcd->regs, -+ isp1760_hc_reg_fields[i]); -+ if (IS_ERR(f)) -+ return PTR_ERR(f); -+ -+ hcd->fields[i] = f; -+ } -+ -+ udc->regs = devm_regmap_init_mmio(dev, base, &isp1761_dc_regmap_conf); -+ if (IS_ERR(udc->regs)) -+ return PTR_ERR(udc->regs); -+ -+ for (i = 0; i < DC_FIELD_MAX; i++) { -+ f = devm_regmap_field_alloc(dev, udc->regs, -+ isp1761_dc_reg_fields[i]); -+ if (IS_ERR(f)) -+ return PTR_ERR(f); -+ -+ udc->fields[i] = f; -+ } - - isp1760_init_core(isp); - - if (IS_ENABLED(CONFIG_USB_ISP1760_HCD) && !usb_disabled()) { -- ret = isp1760_hcd_register(&isp->hcd, isp->regs, mem, irq, -+ ret = isp1760_hcd_register(hcd, mem, irq, - irqflags | IRQF_SHARED, dev); - if (ret < 0) - return ret; -@@ -147,7 +314,7 @@ int isp1760_register(struct resource *mem, int irq, unsigned long irqflags, - if (IS_ENABLED(CONFIG_USB_ISP1761_UDC) && !udc_disabled) { - ret = isp1760_udc_register(isp, irq, irqflags); - if (ret < 0) { -- isp1760_hcd_unregister(&isp->hcd); -+ isp1760_hcd_unregister(hcd); - return ret; - } - } -diff --git a/drivers/usb/isp1760/isp1760-core.h b/drivers/usb/isp1760/isp1760-core.h -index d9a0a4cc467c..8fec6395f19f 100644 ---- a/drivers/usb/isp1760/isp1760-core.h -+++ b/drivers/usb/isp1760/isp1760-core.h -@@ -14,6 +14,7 @@ - #define _ISP1760_CORE_H_ - - #include -+#include - - #include "isp1760-hcd.h" - #include "isp1760-udc.h" -@@ -38,7 +39,6 @@ struct gpio_desc; - struct isp1760_device { - struct device *dev; - -- void __iomem *regs; - unsigned int devflags; - struct gpio_desc *rst_gpio; - -@@ -52,14 +52,42 @@ void isp1760_unregister(struct device *dev); - - void isp1760_set_pullup(struct isp1760_device *isp, bool enable); - --static inline u32 isp1760_read32(void __iomem *base, u32 reg) -+static inline u32 isp1760_field_read(struct regmap_field **fields, u32 field) - { -- return readl(base + reg); -+ unsigned int val; -+ -+ regmap_field_read(fields[field], &val); -+ -+ return val; -+} -+ -+static inline void isp1760_field_write(struct regmap_field **fields, u32 field, -+ u32 val) -+{ -+ regmap_field_write(fields[field], val); -+} -+ -+static inline void isp1760_field_set(struct regmap_field **fields, u32 field) -+{ -+ isp1760_field_write(fields, field, 0xFFFFFFFF); - } - --static inline void isp1760_write32(void __iomem *base, u32 reg, u32 val) -+static inline void isp1760_field_clear(struct regmap_field **fields, u32 field) - { -- writel(val, base + reg); -+ isp1760_field_write(fields, field, 0); - } - -+static inline u32 isp1760_reg_read(struct regmap *regs, u32 reg) -+{ -+ unsigned int val; -+ -+ regmap_read(regs, reg, &val); -+ -+ return val; -+} -+ -+static inline void isp1760_reg_write(struct regmap *regs, u32 reg, u32 val) -+{ -+ regmap_write(regs, reg, val); -+} - #endif -diff --git a/drivers/usb/isp1760/isp1760-hcd.c b/drivers/usb/isp1760/isp1760-hcd.c -index 0e0a4b01c710..20d142140574 100644 ---- a/drivers/usb/isp1760/isp1760-hcd.c -+++ b/drivers/usb/isp1760/isp1760-hcd.c -@@ -66,6 +66,11 @@ struct ptd { - #define ATL_PTD_OFFSET 0x0c00 - #define PAYLOAD_OFFSET 0x1000 - -+#define ISP_BANK_0 0x00 -+#define ISP_BANK_1 0x01 -+#define ISP_BANK_2 0x02 -+#define ISP_BANK_3 0x03 -+ - #define TO_DW(x) ((__force __dw)x) - #define TO_U32(x) ((__force u32)x) - -@@ -161,16 +166,59 @@ struct urb_listitem { - }; - - /* -- * Access functions for isp176x registers (addresses 0..0x03FF). -+ * Access functions for isp176x registers regmap fields - */ --static u32 reg_read32(void __iomem *base, u32 reg) -+static u32 isp1760_hcd_read(struct usb_hcd *hcd, u32 field) -+{ -+ struct isp1760_hcd *priv = hcd_to_priv(hcd); -+ -+ return isp1760_field_read(priv->fields, field); -+} -+ -+static void isp1760_hcd_write(struct usb_hcd *hcd, u32 field, u32 val) -+{ -+ struct isp1760_hcd *priv = hcd_to_priv(hcd); -+ -+ isp1760_field_write(priv->fields, field, val); -+} -+ -+static void isp1760_hcd_set(struct usb_hcd *hcd, u32 field) -+{ -+ isp1760_hcd_write(hcd, field, 0xFFFFFFFF); -+} -+ -+static void isp1760_hcd_clear(struct usb_hcd *hcd, u32 field) -+{ -+ isp1760_hcd_write(hcd, field, 0); -+} -+ -+static int isp1760_hcd_set_poll_timeout(struct usb_hcd *hcd, u32 field, -+ u32 timeout_us) -+{ -+ struct isp1760_hcd *priv = hcd_to_priv(hcd); -+ unsigned int val; -+ -+ isp1760_hcd_set(hcd, field); -+ -+ return regmap_field_read_poll_timeout(priv->fields[field], val, 1, 1, -+ timeout_us); -+} -+ -+static int isp1760_hcd_clear_poll_timeout(struct usb_hcd *hcd, u32 field, -+ u32 timeout_us) - { -- return isp1760_read32(base, reg); -+ struct isp1760_hcd *priv = hcd_to_priv(hcd); -+ unsigned int val; -+ -+ isp1760_hcd_clear(hcd, field); -+ -+ return regmap_field_read_poll_timeout(priv->fields[field], val, 0, 1, -+ timeout_us); - } - --static void reg_write32(void __iomem *base, u32 reg, u32 val) -+static bool isp1760_hcd_is_set(struct usb_hcd *hcd, u32 field) - { -- isp1760_write32(base, reg, val); -+ return !!isp1760_hcd_read(hcd, field); - } - - /* -@@ -233,12 +281,15 @@ static void bank_reads8(void __iomem *src_base, u32 src_offset, u32 bank_addr, - } - } - --static void mem_reads8(void __iomem *src_base, u32 src_offset, void *dst, -- u32 bytes) -+static void mem_reads8(struct usb_hcd *hcd, void __iomem *src_base, -+ u32 src_offset, void *dst, u32 bytes) - { -- reg_write32(src_base, HC_MEMORY_REG, src_offset + ISP_BANK(0)); -+ isp1760_hcd_write(hcd, MEM_BANK_SEL, ISP_BANK_0); -+ isp1760_hcd_write(hcd, MEM_START_ADDR, src_offset); -+ - ndelay(90); -- bank_reads8(src_base, src_offset, ISP_BANK(0), dst, bytes); -+ -+ bank_reads8(src_base, src_offset, ISP_BANK_0, dst, bytes); - } - - static void mem_writes8(void __iomem *dst_base, u32 dst_offset, -@@ -280,14 +331,15 @@ static void mem_writes8(void __iomem *dst_base, u32 dst_offset, - * Read and write ptds. 'ptd_offset' should be one of ISO_PTD_OFFSET, - * INT_PTD_OFFSET, and ATL_PTD_OFFSET. 'slot' should be less than 32. - */ --static void ptd_read(void __iomem *base, u32 ptd_offset, u32 slot, -- struct ptd *ptd) -+static void ptd_read(struct usb_hcd *hcd, void __iomem *base, -+ u32 ptd_offset, u32 slot, struct ptd *ptd) - { -- reg_write32(base, HC_MEMORY_REG, -- ISP_BANK(0) + ptd_offset + slot*sizeof(*ptd)); -+ isp1760_hcd_write(hcd, MEM_BANK_SEL, ISP_BANK_0); -+ isp1760_hcd_write(hcd, MEM_START_ADDR, -+ ptd_offset + slot * sizeof(*ptd)); - ndelay(90); -- bank_reads8(base, ptd_offset + slot*sizeof(*ptd), ISP_BANK(0), -- (void *) ptd, sizeof(*ptd)); -+ bank_reads8(base, ptd_offset + slot * sizeof(*ptd), ISP_BANK_0, -+ (void *)ptd, sizeof(*ptd)); - } - - static void ptd_write(void __iomem *base, u32 ptd_offset, u32 slot, -@@ -379,34 +431,15 @@ static void free_mem(struct usb_hcd *hcd, struct isp1760_qtd *qtd) - qtd->payload_addr = 0; - } - --static int handshake(struct usb_hcd *hcd, u32 reg, -- u32 mask, u32 done, int usec) --{ -- u32 result; -- int ret; -- -- ret = readl_poll_timeout_atomic(hcd->regs + reg, result, -- ((result & mask) == done || -- result == U32_MAX), 1, usec); -- if (result == U32_MAX) -- return -ENODEV; -- -- return ret; --} -- - /* reset a non-running (STS_HALT == 1) controller */ - static int ehci_reset(struct usb_hcd *hcd) - { - struct isp1760_hcd *priv = hcd_to_priv(hcd); - -- u32 command = reg_read32(hcd->regs, HC_USBCMD); -- -- command |= CMD_RESET; -- reg_write32(hcd->regs, HC_USBCMD, command); - hcd->state = HC_STATE_HALT; - priv->next_statechange = jiffies; - -- return handshake(hcd, HC_USBCMD, CMD_RESET, 0, 250 * 1000); -+ return isp1760_hcd_set_poll_timeout(hcd, CMD_RESET, 250 * 1000); - } - - static struct isp1760_qh *qh_alloc(gfp_t flags) -@@ -434,8 +467,10 @@ static void qh_free(struct isp1760_qh *qh) - /* one-time init, only for memory state */ - static int priv_init(struct usb_hcd *hcd) - { -- struct isp1760_hcd *priv = hcd_to_priv(hcd); -- u32 hcc_params; -+ struct isp1760_hcd *priv = hcd_to_priv(hcd); -+ u32 isoc_cache; -+ u32 isoc_thres; -+ - int i; - - spin_lock_init(&priv->lock); -@@ -450,12 +485,14 @@ static int priv_init(struct usb_hcd *hcd) - priv->periodic_size = DEFAULT_I_TDPS; - - /* controllers may cache some of the periodic schedule ... */ -- hcc_params = reg_read32(hcd->regs, HC_HCCPARAMS); -+ isoc_cache = isp1760_hcd_read(hcd, HCC_ISOC_CACHE); -+ isoc_thres = isp1760_hcd_read(hcd, HCC_ISOC_THRES); -+ - /* full frame cache */ -- if (HCC_ISOC_CACHE(hcc_params)) -+ if (isoc_cache) - priv->i_thresh = 8; - else /* N microframes cached */ -- priv->i_thresh = 2 + HCC_ISOC_THRES(hcc_params); -+ priv->i_thresh = 2 + isoc_thres; - - return 0; - } -@@ -464,12 +501,13 @@ static int isp1760_hc_setup(struct usb_hcd *hcd) - { - struct isp1760_hcd *priv = hcd_to_priv(hcd); - int result; -- u32 scratch, hwmode; -+ u32 scratch; -+ -+ isp1760_reg_write(priv->regs, ISP176x_HC_SCRATCH, 0xdeadbabe); - -- reg_write32(hcd->regs, HC_SCRATCH_REG, 0xdeadbabe); - /* Change bus pattern */ -- scratch = reg_read32(hcd->regs, HC_CHIP_ID_REG); -- scratch = reg_read32(hcd->regs, HC_SCRATCH_REG); -+ scratch = isp1760_reg_read(priv->regs, ISP176x_HC_CHIP_ID); -+ scratch = isp1760_reg_read(priv->regs, ISP176x_HC_SCRATCH); - if (scratch != 0xdeadbabe) { - dev_err(hcd->self.controller, "Scratch test failed.\n"); - return -ENODEV; -@@ -483,10 +521,13 @@ static int isp1760_hc_setup(struct usb_hcd *hcd) - * the host controller through the EHCI USB Command register. The device - * has been reset in core code anyway, so this shouldn't matter. - */ -- reg_write32(hcd->regs, HC_BUFFER_STATUS_REG, 0); -- reg_write32(hcd->regs, HC_ATL_PTD_SKIPMAP_REG, NO_TRANSFER_ACTIVE); -- reg_write32(hcd->regs, HC_INT_PTD_SKIPMAP_REG, NO_TRANSFER_ACTIVE); -- reg_write32(hcd->regs, HC_ISO_PTD_SKIPMAP_REG, NO_TRANSFER_ACTIVE); -+ isp1760_reg_write(priv->regs, ISP176x_HC_BUFFER_STATUS, 0); -+ isp1760_reg_write(priv->regs, ISP176x_HC_ATL_PTD_SKIPMAP, -+ NO_TRANSFER_ACTIVE); -+ isp1760_reg_write(priv->regs, ISP176x_HC_INT_PTD_SKIPMAP, -+ NO_TRANSFER_ACTIVE); -+ isp1760_reg_write(priv->regs, ISP176x_HC_ISO_PTD_SKIPMAP, -+ NO_TRANSFER_ACTIVE); - - result = ehci_reset(hcd); - if (result) -@@ -495,14 +536,11 @@ static int isp1760_hc_setup(struct usb_hcd *hcd) - /* Step 11 passed */ - - /* ATL reset */ -- hwmode = reg_read32(hcd->regs, HC_HW_MODE_CTRL) & ~ALL_ATX_RESET; -- reg_write32(hcd->regs, HC_HW_MODE_CTRL, hwmode | ALL_ATX_RESET); -+ isp1760_hcd_set(hcd, ALL_ATX_RESET); - mdelay(10); -- reg_write32(hcd->regs, HC_HW_MODE_CTRL, hwmode); -+ isp1760_hcd_clear(hcd, ALL_ATX_RESET); - -- reg_write32(hcd->regs, HC_INTERRUPT_ENABLE, INTERRUPT_ENABLE_MASK); -- -- priv->hcs_params = reg_read32(hcd->regs, HC_HCSPARAMS); -+ isp1760_hcd_set(hcd, HC_INT_ENABLE); - - return priv_init(hcd); - } -@@ -732,12 +770,12 @@ static void start_bus_transfer(struct usb_hcd *hcd, u32 ptd_offset, int slot, - - /* Make sure done map has not triggered from some unlinked transfer */ - if (ptd_offset == ATL_PTD_OFFSET) { -- priv->atl_done_map |= reg_read32(hcd->regs, -- HC_ATL_PTD_DONEMAP_REG); -+ priv->atl_done_map |= isp1760_reg_read(priv->regs, -+ ISP176x_HC_ATL_PTD_DONEMAP); - priv->atl_done_map &= ~(1 << slot); - } else { -- priv->int_done_map |= reg_read32(hcd->regs, -- HC_INT_PTD_DONEMAP_REG); -+ priv->int_done_map |= isp1760_reg_read(priv->regs, -+ ISP176x_HC_INT_PTD_DONEMAP); - priv->int_done_map &= ~(1 << slot); - } - -@@ -746,16 +784,20 @@ static void start_bus_transfer(struct usb_hcd *hcd, u32 ptd_offset, int slot, - slots[slot].timestamp = jiffies; - slots[slot].qtd = qtd; - slots[slot].qh = qh; -- ptd_write(hcd->regs, ptd_offset, slot, ptd); -+ ptd_write(priv->base, ptd_offset, slot, ptd); - - if (ptd_offset == ATL_PTD_OFFSET) { -- skip_map = reg_read32(hcd->regs, HC_ATL_PTD_SKIPMAP_REG); -+ skip_map = isp1760_reg_read(priv->regs, -+ ISP176x_HC_ATL_PTD_SKIPMAP); - skip_map &= ~(1 << qh->slot); -- reg_write32(hcd->regs, HC_ATL_PTD_SKIPMAP_REG, skip_map); -+ isp1760_reg_write(priv->regs, ISP176x_HC_ATL_PTD_SKIPMAP, -+ skip_map); - } else { -- skip_map = reg_read32(hcd->regs, HC_INT_PTD_SKIPMAP_REG); -+ skip_map = isp1760_reg_read(priv->regs, -+ ISP176x_HC_INT_PTD_SKIPMAP); - skip_map &= ~(1 << qh->slot); -- reg_write32(hcd->regs, HC_INT_PTD_SKIPMAP_REG, skip_map); -+ isp1760_reg_write(priv->regs, ISP176x_HC_INT_PTD_SKIPMAP, -+ skip_map); - } - } - -@@ -768,9 +810,10 @@ static int is_short_bulk(struct isp1760_qtd *qtd) - static void collect_qtds(struct usb_hcd *hcd, struct isp1760_qh *qh, - struct list_head *urb_list) - { -- int last_qtd; -+ struct isp1760_hcd *priv = hcd_to_priv(hcd); - struct isp1760_qtd *qtd, *qtd_next; - struct urb_listitem *urb_listitem; -+ int last_qtd; - - list_for_each_entry_safe(qtd, qtd_next, &qh->qtd_list, qtd_list) { - if (qtd->status < QTD_XFER_COMPLETE) -@@ -785,9 +828,10 @@ static void collect_qtds(struct usb_hcd *hcd, struct isp1760_qh *qh, - if (qtd->actual_length) { - switch (qtd->packet_type) { - case IN_PID: -- mem_reads8(hcd->regs, qtd->payload_addr, -- qtd->data_buffer, -- qtd->actual_length); -+ mem_reads8(hcd, priv->base, -+ qtd->payload_addr, -+ qtd->data_buffer, -+ qtd->actual_length); - fallthrough; - case OUT_PID: - qtd->urb->actual_length += -@@ -875,8 +919,8 @@ static void enqueue_qtds(struct usb_hcd *hcd, struct isp1760_qh *qh) - if ((qtd->length) && - ((qtd->packet_type == SETUP_PID) || - (qtd->packet_type == OUT_PID))) { -- mem_writes8(hcd->regs, qtd->payload_addr, -- qtd->data_buffer, qtd->length); -+ mem_writes8(priv->base, qtd->payload_addr, -+ qtd->data_buffer, qtd->length); - } - - qtd->status = QTD_PAYLOAD_ALLOC; -@@ -1076,9 +1120,9 @@ static void handle_done_ptds(struct usb_hcd *hcd) - int modified; - int skip_map; - -- skip_map = reg_read32(hcd->regs, HC_INT_PTD_SKIPMAP_REG); -+ skip_map = isp1760_reg_read(priv->regs, ISP176x_HC_INT_PTD_SKIPMAP); - priv->int_done_map &= ~skip_map; -- skip_map = reg_read32(hcd->regs, HC_ATL_PTD_SKIPMAP_REG); -+ skip_map = isp1760_reg_read(priv->regs, ISP176x_HC_ATL_PTD_SKIPMAP); - priv->atl_done_map &= ~skip_map; - - modified = priv->int_done_map || priv->atl_done_map; -@@ -1096,7 +1140,7 @@ static void handle_done_ptds(struct usb_hcd *hcd) - continue; - } - ptd_offset = INT_PTD_OFFSET; -- ptd_read(hcd->regs, INT_PTD_OFFSET, slot, &ptd); -+ ptd_read(hcd, priv->base, INT_PTD_OFFSET, slot, &ptd); - state = check_int_transfer(hcd, &ptd, - slots[slot].qtd->urb); - } else { -@@ -1111,7 +1155,7 @@ static void handle_done_ptds(struct usb_hcd *hcd) - continue; - } - ptd_offset = ATL_PTD_OFFSET; -- ptd_read(hcd->regs, ATL_PTD_OFFSET, slot, &ptd); -+ ptd_read(hcd, priv->base, ATL_PTD_OFFSET, slot, &ptd); - state = check_atl_transfer(hcd, &ptd, - slots[slot].qtd->urb); - } -@@ -1136,7 +1180,7 @@ static void handle_done_ptds(struct usb_hcd *hcd) - - qtd->status = QTD_XFER_COMPLETE; - if (list_is_last(&qtd->qtd_list, &qh->qtd_list) || -- is_short_bulk(qtd)) -+ is_short_bulk(qtd)) - qtd = NULL; - else - qtd = list_entry(qtd->qtd_list.next, -@@ -1212,13 +1256,15 @@ static irqreturn_t isp1760_irq(struct usb_hcd *hcd) - if (!(hcd->state & HC_STATE_RUNNING)) - goto leave; - -- imask = reg_read32(hcd->regs, HC_INTERRUPT_REG); -+ imask = isp1760_reg_read(priv->regs, ISP176x_HC_INTERRUPT); - if (unlikely(!imask)) - goto leave; -- reg_write32(hcd->regs, HC_INTERRUPT_REG, imask); /* Clear */ -+ isp1760_reg_write(priv->regs, ISP176x_HC_INTERRUPT, imask); /* Clear */ - -- priv->int_done_map |= reg_read32(hcd->regs, HC_INT_PTD_DONEMAP_REG); -- priv->atl_done_map |= reg_read32(hcd->regs, HC_ATL_PTD_DONEMAP_REG); -+ priv->int_done_map |= isp1760_reg_read(priv->regs, -+ ISP176x_HC_INT_PTD_DONEMAP); -+ priv->atl_done_map |= isp1760_reg_read(priv->regs, -+ ISP176x_HC_ATL_PTD_DONEMAP); - - handle_done_ptds(hcd); - -@@ -1273,7 +1319,7 @@ static void errata2_function(struct timer_list *unused) - if (priv->atl_slots[slot].qh && time_after(jiffies, - priv->atl_slots[slot].timestamp + - msecs_to_jiffies(SLOT_TIMEOUT))) { -- ptd_read(hcd->regs, ATL_PTD_OFFSET, slot, &ptd); -+ ptd_read(hcd, priv->base, ATL_PTD_OFFSET, slot, &ptd); - if (!FROM_DW0_VALID(ptd.dw0) && - !FROM_DW3_ACTIVE(ptd.dw3)) - priv->atl_done_map |= 1 << slot; -@@ -1290,9 +1336,8 @@ static void errata2_function(struct timer_list *unused) - - static int isp1760_run(struct usb_hcd *hcd) - { -+ struct isp1760_hcd *priv = hcd_to_priv(hcd); - int retval; -- u32 temp; -- u32 command; - u32 chipid; - - hcd->uses_new_polling = 1; -@@ -1300,23 +1345,20 @@ static int isp1760_run(struct usb_hcd *hcd) - hcd->state = HC_STATE_RUNNING; - - /* Set PTD interrupt AND & OR maps */ -- reg_write32(hcd->regs, HC_ATL_IRQ_MASK_AND_REG, 0); -- reg_write32(hcd->regs, HC_ATL_IRQ_MASK_OR_REG, 0xffffffff); -- reg_write32(hcd->regs, HC_INT_IRQ_MASK_AND_REG, 0); -- reg_write32(hcd->regs, HC_INT_IRQ_MASK_OR_REG, 0xffffffff); -- reg_write32(hcd->regs, HC_ISO_IRQ_MASK_AND_REG, 0); -- reg_write32(hcd->regs, HC_ISO_IRQ_MASK_OR_REG, 0xffffffff); -+ isp1760_reg_write(priv->regs, ISP176x_HC_ATL_IRQ_MASK_AND, 0); -+ isp1760_reg_write(priv->regs, ISP176x_HC_ATL_IRQ_MASK_OR, 0xffffffff); -+ isp1760_reg_write(priv->regs, ISP176x_HC_INT_IRQ_MASK_AND, 0); -+ isp1760_reg_write(priv->regs, ISP176x_HC_INT_IRQ_MASK_OR, 0xffffffff); -+ isp1760_reg_write(priv->regs, ISP176x_HC_ISO_IRQ_MASK_AND, 0); -+ isp1760_reg_write(priv->regs, ISP176x_HC_ISO_IRQ_MASK_OR, 0xffffffff); - /* step 23 passed */ - -- temp = reg_read32(hcd->regs, HC_HW_MODE_CTRL); -- reg_write32(hcd->regs, HC_HW_MODE_CTRL, temp | HW_GLOBAL_INTR_EN); -+ isp1760_hcd_set(hcd, HW_GLOBAL_INTR_EN); - -- command = reg_read32(hcd->regs, HC_USBCMD); -- command &= ~(CMD_LRESET|CMD_RESET); -- command |= CMD_RUN; -- reg_write32(hcd->regs, HC_USBCMD, command); -+ isp1760_hcd_clear(hcd, CMD_LRESET); -+ isp1760_hcd_clear(hcd, CMD_RESET); - -- retval = handshake(hcd, HC_USBCMD, CMD_RUN, CMD_RUN, 250 * 1000); -+ retval = isp1760_hcd_set_poll_timeout(hcd, CMD_RUN, 250 * 1000); - if (retval) - return retval; - -@@ -1326,9 +1368,8 @@ static int isp1760_run(struct usb_hcd *hcd) - * the semaphore while doing so. - */ - down_write(&ehci_cf_port_reset_rwsem); -- reg_write32(hcd->regs, HC_CONFIGFLAG, FLAG_CF); - -- retval = handshake(hcd, HC_CONFIGFLAG, FLAG_CF, FLAG_CF, 250 * 1000); -+ retval = isp1760_hcd_set_poll_timeout(hcd, FLAG_CF, 250 * 1000); - up_write(&ehci_cf_port_reset_rwsem); - if (retval) - return retval; -@@ -1338,21 +1379,22 @@ static int isp1760_run(struct usb_hcd *hcd) - errata2_timer.expires = jiffies + msecs_to_jiffies(SLOT_CHECK_PERIOD); - add_timer(&errata2_timer); - -- chipid = reg_read32(hcd->regs, HC_CHIP_ID_REG); -+ chipid = isp1760_reg_read(priv->regs, ISP176x_HC_CHIP_ID); - dev_info(hcd->self.controller, "USB ISP %04x HW rev. %d started\n", - chipid & 0xffff, chipid >> 16); - - /* PTD Register Init Part 2, Step 28 */ - - /* Setup registers controlling PTD checking */ -- reg_write32(hcd->regs, HC_ATL_PTD_LASTPTD_REG, 0x80000000); -- reg_write32(hcd->regs, HC_INT_PTD_LASTPTD_REG, 0x80000000); -- reg_write32(hcd->regs, HC_ISO_PTD_LASTPTD_REG, 0x00000001); -- reg_write32(hcd->regs, HC_ATL_PTD_SKIPMAP_REG, 0xffffffff); -- reg_write32(hcd->regs, HC_INT_PTD_SKIPMAP_REG, 0xffffffff); -- reg_write32(hcd->regs, HC_ISO_PTD_SKIPMAP_REG, 0xffffffff); -- reg_write32(hcd->regs, HC_BUFFER_STATUS_REG, -- ATL_BUF_FILL | INT_BUF_FILL); -+ isp1760_reg_write(priv->regs, ISP176x_HC_ATL_PTD_LASTPTD, 0x80000000); -+ isp1760_reg_write(priv->regs, ISP176x_HC_INT_PTD_LASTPTD, 0x80000000); -+ isp1760_reg_write(priv->regs, ISP176x_HC_ISO_PTD_LASTPTD, 0x00000001); -+ isp1760_reg_write(priv->regs, ISP176x_HC_ATL_PTD_SKIPMAP, 0xffffffff); -+ isp1760_reg_write(priv->regs, ISP176x_HC_INT_PTD_SKIPMAP, 0xffffffff); -+ isp1760_reg_write(priv->regs, ISP176x_HC_ISO_PTD_SKIPMAP, 0xffffffff); -+ -+ isp1760_hcd_set(hcd, ATL_BUF_FILL); -+ isp1760_hcd_set(hcd, INT_BUF_FILL); - - /* GRR this is run-once init(), being done every time the HC starts. - * So long as they're part of class devices, we can't do it init() -@@ -1586,15 +1628,19 @@ static void kill_transfer(struct usb_hcd *hcd, struct urb *urb, - /* We need to forcefully reclaim the slot since some transfers never - return, e.g. interrupt transfers and NAKed bulk transfers. */ - if (usb_pipecontrol(urb->pipe) || usb_pipebulk(urb->pipe)) { -- skip_map = reg_read32(hcd->regs, HC_ATL_PTD_SKIPMAP_REG); -+ skip_map = isp1760_reg_read(priv->regs, -+ ISP176x_HC_ATL_PTD_SKIPMAP); - skip_map |= (1 << qh->slot); -- reg_write32(hcd->regs, HC_ATL_PTD_SKIPMAP_REG, skip_map); -+ isp1760_reg_write(priv->regs, ISP176x_HC_ATL_PTD_SKIPMAP, -+ skip_map); - priv->atl_slots[qh->slot].qh = NULL; - priv->atl_slots[qh->slot].qtd = NULL; - } else { -- skip_map = reg_read32(hcd->regs, HC_INT_PTD_SKIPMAP_REG); -+ skip_map = isp1760_reg_read(priv->regs, -+ ISP176x_HC_INT_PTD_SKIPMAP); - skip_map |= (1 << qh->slot); -- reg_write32(hcd->regs, HC_INT_PTD_SKIPMAP_REG, skip_map); -+ isp1760_reg_write(priv->regs, ISP176x_HC_INT_PTD_SKIPMAP, -+ skip_map); - priv->int_slots[qh->slot].qh = NULL; - priv->int_slots[qh->slot].qtd = NULL; - } -@@ -1707,8 +1753,7 @@ static void isp1760_endpoint_disable(struct usb_hcd *hcd, - static int isp1760_hub_status_data(struct usb_hcd *hcd, char *buf) - { - struct isp1760_hcd *priv = hcd_to_priv(hcd); -- u32 temp, status = 0; -- u32 mask; -+ u32 status = 0; - int retval = 1; - unsigned long flags; - -@@ -1718,17 +1763,13 @@ static int isp1760_hub_status_data(struct usb_hcd *hcd, char *buf) - - /* init status to no-changes */ - buf[0] = 0; -- mask = PORT_CSC; - - spin_lock_irqsave(&priv->lock, flags); -- temp = reg_read32(hcd->regs, HC_PORTSC1); - -- if (temp & PORT_OWNER) { -- if (temp & PORT_CSC) { -- temp &= ~PORT_CSC; -- reg_write32(hcd->regs, HC_PORTSC1, temp); -- goto done; -- } -+ if (isp1760_hcd_is_set(hcd, PORT_OWNER) && -+ isp1760_hcd_is_set(hcd, PORT_CSC)) { -+ isp1760_hcd_clear(hcd, PORT_CSC); -+ goto done; - } - - /* -@@ -1737,11 +1778,9 @@ static int isp1760_hub_status_data(struct usb_hcd *hcd, char *buf) - * high-speed device is switched over to the companion - * controller by the user. - */ -- -- if ((temp & mask) != 0 -- || ((temp & PORT_RESUME) != 0 -- && time_after_eq(jiffies, -- priv->reset_done))) { -+ if (isp1760_hcd_is_set(hcd, PORT_CSC) || -+ (isp1760_hcd_is_set(hcd, PORT_RESUME) && -+ time_after_eq(jiffies, priv->reset_done))) { - buf [0] |= 1 << (0 + 1); - status = STS_PCD; - } -@@ -1754,9 +1793,11 @@ static int isp1760_hub_status_data(struct usb_hcd *hcd, char *buf) - static void isp1760_hub_descriptor(struct isp1760_hcd *priv, - struct usb_hub_descriptor *desc) - { -- int ports = HCS_N_PORTS(priv->hcs_params); -+ int ports; - u16 temp; - -+ ports = isp1760_hcd_read(priv->hcd, HCS_N_PORTS); -+ - desc->bDescriptorType = USB_DT_HUB; - /* priv 1.0, 2.3.9 says 20ms max */ - desc->bPwrOn2PwrGood = 10; -@@ -1772,7 +1813,7 @@ static void isp1760_hub_descriptor(struct isp1760_hcd *priv, - - /* per-port overcurrent reporting */ - temp = HUB_CHAR_INDV_PORT_OCPM; -- if (HCS_PPC(priv->hcs_params)) -+ if (isp1760_hcd_is_set(priv->hcd, HCS_PPC)) - /* per-port power control */ - temp |= HUB_CHAR_INDV_PORT_LPSM; - else -@@ -1783,38 +1824,37 @@ static void isp1760_hub_descriptor(struct isp1760_hcd *priv, - - #define PORT_WAKE_BITS (PORT_WKOC_E|PORT_WKDISC_E|PORT_WKCONN_E) - --static int check_reset_complete(struct usb_hcd *hcd, int index, -- int port_status) -+static void check_reset_complete(struct usb_hcd *hcd, int index) - { -- if (!(port_status & PORT_CONNECT)) -- return port_status; -+ if (!(isp1760_hcd_is_set(hcd, PORT_CONNECT))) -+ return; - - /* if reset finished and it's still not enabled -- handoff */ -- if (!(port_status & PORT_PE)) { -- -+ if (!isp1760_hcd_is_set(hcd, PORT_PE)) { - dev_info(hcd->self.controller, -- "port %d full speed --> companion\n", -- index + 1); -+ "port %d full speed --> companion\n", index + 1); - -- port_status |= PORT_OWNER; -- port_status &= ~PORT_RWC_BITS; -- reg_write32(hcd->regs, HC_PORTSC1, port_status); -+ isp1760_hcd_set(hcd, PORT_OWNER); - -- } else -+ isp1760_hcd_clear(hcd, PORT_CSC); -+ } else { - dev_info(hcd->self.controller, "port %d high speed\n", -- index + 1); -+ index + 1); -+ } - -- return port_status; -+ return; - } - - static int isp1760_hub_control(struct usb_hcd *hcd, u16 typeReq, - u16 wValue, u16 wIndex, char *buf, u16 wLength) - { - struct isp1760_hcd *priv = hcd_to_priv(hcd); -- int ports = HCS_N_PORTS(priv->hcs_params); -- u32 temp, status; -+ u32 status; - unsigned long flags; - int retval = 0; -+ int ports; -+ -+ ports = isp1760_hcd_read(hcd, HCS_N_PORTS); - - /* - * FIXME: support SetPortFeatures USB_PORT_FEAT_INDICATOR. -@@ -1839,7 +1879,6 @@ static int isp1760_hub_control(struct usb_hcd *hcd, u16 typeReq, - if (!wIndex || wIndex > ports) - goto error; - wIndex--; -- temp = reg_read32(hcd->regs, HC_PORTSC1); - - /* - * Even if OWNER is set, so the port is owned by the -@@ -1850,22 +1889,22 @@ static int isp1760_hub_control(struct usb_hcd *hcd, u16 typeReq, - - switch (wValue) { - case USB_PORT_FEAT_ENABLE: -- reg_write32(hcd->regs, HC_PORTSC1, temp & ~PORT_PE); -+ isp1760_hcd_clear(hcd, PORT_PE); - break; - case USB_PORT_FEAT_C_ENABLE: - /* XXX error? */ - break; - case USB_PORT_FEAT_SUSPEND: -- if (temp & PORT_RESET) -+ if (isp1760_hcd_is_set(hcd, PORT_RESET)) - goto error; - -- if (temp & PORT_SUSPEND) { -- if ((temp & PORT_PE) == 0) -+ if (isp1760_hcd_is_set(hcd, PORT_SUSPEND)) { -+ if (!isp1760_hcd_is_set(hcd, PORT_PE)) - goto error; - /* resume signaling for 20 msec */ -- temp &= ~(PORT_RWC_BITS); -- reg_write32(hcd->regs, HC_PORTSC1, -- temp | PORT_RESUME); -+ isp1760_hcd_clear(hcd, PORT_CSC); -+ isp1760_hcd_set(hcd, PORT_RESUME); -+ - priv->reset_done = jiffies + - msecs_to_jiffies(USB_RESUME_TIMEOUT); - } -@@ -1874,12 +1913,11 @@ static int isp1760_hub_control(struct usb_hcd *hcd, u16 typeReq, - /* we auto-clear this feature */ - break; - case USB_PORT_FEAT_POWER: -- if (HCS_PPC(priv->hcs_params)) -- reg_write32(hcd->regs, HC_PORTSC1, -- temp & ~PORT_POWER); -+ if (isp1760_hcd_is_set(hcd, HCS_PPC)) -+ isp1760_hcd_clear(hcd, PORT_POWER); - break; - case USB_PORT_FEAT_C_CONNECTION: -- reg_write32(hcd->regs, HC_PORTSC1, temp | PORT_CSC); -+ isp1760_hcd_set(hcd, PORT_CSC); - break; - case USB_PORT_FEAT_C_OVER_CURRENT: - /* XXX error ?*/ -@@ -1890,7 +1928,7 @@ static int isp1760_hub_control(struct usb_hcd *hcd, u16 typeReq, - default: - goto error; - } -- reg_read32(hcd->regs, HC_USBCMD); -+ isp1760_reg_read(priv->regs, ISP176x_HC_USBCMD); - break; - case GetHubDescriptor: - isp1760_hub_descriptor(priv, (struct usb_hub_descriptor *) -@@ -1905,15 +1943,14 @@ static int isp1760_hub_control(struct usb_hcd *hcd, u16 typeReq, - goto error; - wIndex--; - status = 0; -- temp = reg_read32(hcd->regs, HC_PORTSC1); - - /* wPortChange bits */ -- if (temp & PORT_CSC) -+ if (isp1760_hcd_is_set(hcd, PORT_CSC)) - status |= USB_PORT_STAT_C_CONNECTION << 16; - - - /* whoever resumes must GetPortStatus to complete it!! */ -- if (temp & PORT_RESUME) { -+ if (isp1760_hcd_is_set(hcd, PORT_RESUME)) { - dev_err(hcd->self.controller, "Port resume should be skipped.\n"); - - /* Remote Wakeup received? */ -@@ -1932,35 +1969,31 @@ static int isp1760_hub_control(struct usb_hcd *hcd, u16 typeReq, - priv->reset_done = 0; - - /* stop resume signaling */ -- temp = reg_read32(hcd->regs, HC_PORTSC1); -- reg_write32(hcd->regs, HC_PORTSC1, -- temp & ~(PORT_RWC_BITS | PORT_RESUME)); -- retval = handshake(hcd, HC_PORTSC1, -- PORT_RESUME, 0, 2000 /* 2msec */); -+ isp1760_hcd_clear(hcd, PORT_CSC); -+ -+ retval = isp1760_hcd_clear_poll_timeout(hcd, -+ PORT_RESUME, 2000); - if (retval != 0) { - dev_err(hcd->self.controller, - "port %d resume error %d\n", - wIndex + 1, retval); - goto error; - } -- temp &= ~(PORT_SUSPEND|PORT_RESUME|(3<<10)); - } - } - - /* whoever resets must GetPortStatus to complete it!! */ -- if ((temp & PORT_RESET) -- && time_after_eq(jiffies, -- priv->reset_done)) { -+ if (isp1760_hcd_is_set(hcd, PORT_RESET) && -+ time_after_eq(jiffies, priv->reset_done)) { - status |= USB_PORT_STAT_C_RESET << 16; - priv->reset_done = 0; - - /* force reset to complete */ -- reg_write32(hcd->regs, HC_PORTSC1, temp & ~PORT_RESET); - /* REVISIT: some hardware needs 550+ usec to clear - * this bit; seems too long to spin routinely... - */ -- retval = handshake(hcd, HC_PORTSC1, -- PORT_RESET, 0, 750); -+ retval = isp1760_hcd_clear_poll_timeout(hcd, PORT_RESET, -+ 750); - if (retval != 0) { - dev_err(hcd->self.controller, "port %d reset error %d\n", - wIndex + 1, retval); -@@ -1968,8 +2001,7 @@ static int isp1760_hub_control(struct usb_hcd *hcd, u16 typeReq, - } - - /* see what we found out */ -- temp = check_reset_complete(hcd, wIndex, -- reg_read32(hcd->regs, HC_PORTSC1)); -+ check_reset_complete(hcd, wIndex); - } - /* - * Even if OWNER is set, there's no harm letting hub_wq -@@ -1977,21 +2009,22 @@ static int isp1760_hub_control(struct usb_hcd *hcd, u16 typeReq, - * for PORT_POWER anyway). - */ - -- if (temp & PORT_OWNER) -+ if (isp1760_hcd_is_set(hcd, PORT_OWNER)) - dev_err(hcd->self.controller, "PORT_OWNER is set\n"); - -- if (temp & PORT_CONNECT) { -+ if (isp1760_hcd_is_set(hcd, PORT_CONNECT)) { - status |= USB_PORT_STAT_CONNECTION; - /* status may be from integrated TT */ - status |= USB_PORT_STAT_HIGH_SPEED; - } -- if (temp & PORT_PE) -+ if (isp1760_hcd_is_set(hcd, PORT_PE)) - status |= USB_PORT_STAT_ENABLE; -- if (temp & (PORT_SUSPEND|PORT_RESUME)) -+ if (isp1760_hcd_is_set(hcd, PORT_SUSPEND) && -+ isp1760_hcd_is_set(hcd, PORT_RESUME)) - status |= USB_PORT_STAT_SUSPEND; -- if (temp & PORT_RESET) -+ if (isp1760_hcd_is_set(hcd, PORT_RESET)) - status |= USB_PORT_STAT_RESET; -- if (temp & PORT_POWER) -+ if (isp1760_hcd_is_set(hcd, PORT_POWER)) - status |= USB_PORT_STAT_POWER; - - put_unaligned(cpu_to_le32(status), (__le32 *) buf); -@@ -2011,41 +2044,39 @@ static int isp1760_hub_control(struct usb_hcd *hcd, u16 typeReq, - if (!wIndex || wIndex > ports) - goto error; - wIndex--; -- temp = reg_read32(hcd->regs, HC_PORTSC1); -- if (temp & PORT_OWNER) -+ if (isp1760_hcd_is_set(hcd, PORT_OWNER)) - break; - --/* temp &= ~PORT_RWC_BITS; */ - switch (wValue) { - case USB_PORT_FEAT_ENABLE: -- reg_write32(hcd->regs, HC_PORTSC1, temp | PORT_PE); -+ isp1760_hcd_set(hcd, PORT_PE); - break; - - case USB_PORT_FEAT_SUSPEND: -- if ((temp & PORT_PE) == 0 -- || (temp & PORT_RESET) != 0) -+ if (!isp1760_hcd_is_set(hcd, PORT_PE) || -+ isp1760_hcd_is_set(hcd, PORT_RESET)) - goto error; - -- reg_write32(hcd->regs, HC_PORTSC1, temp | PORT_SUSPEND); -+ isp1760_hcd_set(hcd, PORT_SUSPEND); - break; - case USB_PORT_FEAT_POWER: -- if (HCS_PPC(priv->hcs_params)) -- reg_write32(hcd->regs, HC_PORTSC1, -- temp | PORT_POWER); -+ if (isp1760_hcd_is_set(hcd, HCS_PPC)) -+ isp1760_hcd_set(hcd, PORT_POWER); - break; - case USB_PORT_FEAT_RESET: -- if (temp & PORT_RESUME) -+ if (isp1760_hcd_is_set(hcd, PORT_RESUME)) - goto error; - /* line status bits may report this as low speed, - * which can be fine if this root hub has a - * transaction translator built in. - */ -- if ((temp & (PORT_PE|PORT_CONNECT)) == PORT_CONNECT -- && PORT_USB11(temp)) { -- temp |= PORT_OWNER; -+ if ((isp1760_hcd_is_set(hcd, PORT_CONNECT) && -+ !isp1760_hcd_is_set(hcd, PORT_PE)) && -+ (isp1760_hcd_read(hcd, PORT_LSTATUS) == 1)) { -+ isp1760_hcd_set(hcd, PORT_OWNER); - } else { -- temp |= PORT_RESET; -- temp &= ~PORT_PE; -+ isp1760_hcd_set(hcd, PORT_RESET); -+ isp1760_hcd_clear(hcd, PORT_PE); - - /* - * caller must wait, then call GetPortStatus -@@ -2054,12 +2085,11 @@ static int isp1760_hub_control(struct usb_hcd *hcd, u16 typeReq, - priv->reset_done = jiffies + - msecs_to_jiffies(50); - } -- reg_write32(hcd->regs, HC_PORTSC1, temp); - break; - default: - goto error; - } -- reg_read32(hcd->regs, HC_USBCMD); -+ isp1760_reg_read(priv->regs, ISP176x_HC_USBCMD); - break; - - default: -@@ -2076,14 +2106,13 @@ static int isp1760_get_frame(struct usb_hcd *hcd) - struct isp1760_hcd *priv = hcd_to_priv(hcd); - u32 fr; - -- fr = reg_read32(hcd->regs, HC_FRINDEX); -+ fr = isp1760_hcd_read(hcd, HC_FRINDEX); - return (fr >> 3) % priv->periodic_size; - } - - static void isp1760_stop(struct usb_hcd *hcd) - { - struct isp1760_hcd *priv = hcd_to_priv(hcd); -- u32 temp; - - del_timer(&errata2_timer); - -@@ -2094,24 +2123,19 @@ static void isp1760_stop(struct usb_hcd *hcd) - spin_lock_irq(&priv->lock); - ehci_reset(hcd); - /* Disable IRQ */ -- temp = reg_read32(hcd->regs, HC_HW_MODE_CTRL); -- reg_write32(hcd->regs, HC_HW_MODE_CTRL, temp &= ~HW_GLOBAL_INTR_EN); -+ isp1760_hcd_clear(hcd, HW_GLOBAL_INTR_EN); - spin_unlock_irq(&priv->lock); - -- reg_write32(hcd->regs, HC_CONFIGFLAG, 0); -+ isp1760_hcd_clear(hcd, FLAG_CF); - } - - static void isp1760_shutdown(struct usb_hcd *hcd) - { -- u32 command, temp; -- - isp1760_stop(hcd); -- temp = reg_read32(hcd->regs, HC_HW_MODE_CTRL); -- reg_write32(hcd->regs, HC_HW_MODE_CTRL, temp &= ~HW_GLOBAL_INTR_EN); - -- command = reg_read32(hcd->regs, HC_USBCMD); -- command &= ~CMD_RUN; -- reg_write32(hcd->regs, HC_USBCMD, command); -+ isp1760_hcd_clear(hcd, HW_GLOBAL_INTR_EN); -+ -+ isp1760_hcd_clear(hcd, CMD_RUN); - } - - static void isp1760_clear_tt_buffer_complete(struct usb_hcd *hcd, -@@ -2184,8 +2208,8 @@ void isp1760_deinit_kmem_cache(void) - kmem_cache_destroy(urb_listitem_cachep); - } - --int isp1760_hcd_register(struct isp1760_hcd *priv, void __iomem *regs, -- struct resource *mem, int irq, unsigned long irqflags, -+int isp1760_hcd_register(struct isp1760_hcd *priv, struct resource *mem, -+ int irq, unsigned long irqflags, - struct device *dev) - { - struct usb_hcd *hcd; -@@ -2202,7 +2226,6 @@ int isp1760_hcd_register(struct isp1760_hcd *priv, void __iomem *regs, - init_memory(priv); - - hcd->irq = irq; -- hcd->regs = regs; - hcd->rsrc_start = mem->start; - hcd->rsrc_len = resource_size(mem); - -diff --git a/drivers/usb/isp1760/isp1760-hcd.h b/drivers/usb/isp1760/isp1760-hcd.h -index f1bb2deb1ccf..34e1899e52c4 100644 ---- a/drivers/usb/isp1760/isp1760-hcd.h -+++ b/drivers/usb/isp1760/isp1760-hcd.h -@@ -3,6 +3,9 @@ - #define _ISP1760_HCD_H_ - - #include -+#include -+ -+#include "isp1760-regs.h" - - struct isp1760_qh; - struct isp1760_qtd; -@@ -48,10 +51,13 @@ enum isp1760_queue_head_types { - }; - - struct isp1760_hcd { --#ifdef CONFIG_USB_ISP1760_HCD - struct usb_hcd *hcd; - -- u32 hcs_params; -+ void __iomem *base; -+ -+ struct regmap *regs; -+ struct regmap_field *fields[HC_FIELD_MAX]; -+ - spinlock_t lock; - struct isp1760_slotinfo atl_slots[32]; - int atl_done_map; -@@ -66,20 +72,18 @@ struct isp1760_hcd { - unsigned i_thresh; - unsigned long reset_done; - unsigned long next_statechange; --#endif - }; - - #ifdef CONFIG_USB_ISP1760_HCD --int isp1760_hcd_register(struct isp1760_hcd *priv, void __iomem *regs, -- struct resource *mem, int irq, unsigned long irqflags, -- struct device *dev); -+int isp1760_hcd_register(struct isp1760_hcd *priv, struct resource *mem, -+ int irq, unsigned long irqflags, struct device *dev); - void isp1760_hcd_unregister(struct isp1760_hcd *priv); - - int isp1760_init_kmem_once(void); - void isp1760_deinit_kmem_cache(void); - #else - static inline int isp1760_hcd_register(struct isp1760_hcd *priv, -- void __iomem *regs, struct resource *mem, -+ struct resource *mem, - int irq, unsigned long irqflags, - struct device *dev) - { -diff --git a/drivers/usb/isp1760/isp1760-if.c b/drivers/usb/isp1760/isp1760-if.c -index ccd30f835888..abfba9f5ec23 100644 ---- a/drivers/usb/isp1760/isp1760-if.c -+++ b/drivers/usb/isp1760/isp1760-if.c -@@ -75,9 +75,9 @@ static int isp1761_pci_init(struct pci_dev *dev) - /*by default host is in 16bit mode, so - * io operations at this stage must be 16 bit - * */ -- writel(0xface, iobase + HC_SCRATCH_REG); -+ writel(0xface, iobase + ISP176x_HC_SCRATCH); - udelay(100); -- reg_data = readl(iobase + HC_SCRATCH_REG) & 0x0000ffff; -+ reg_data = readl(iobase + ISP176x_HC_SCRATCH) & 0x0000ffff; - retry_count--; - } - -diff --git a/drivers/usb/isp1760/isp1760-regs.h b/drivers/usb/isp1760/isp1760-regs.h -index fedc4f5cded0..0d5262c37c5b 100644 ---- a/drivers/usb/isp1760/isp1760-regs.h -+++ b/drivers/usb/isp1760/isp1760-regs.h -@@ -10,218 +10,182 @@ - * Laurent Pinchart - */ - --#ifndef _ISP1760_REGS_H_ --#define _ISP1760_REGS_H_ -+#ifndef _ISP176x_REGS_H_ -+#define _ISP176x_REGS_H_ - - /* ----------------------------------------------------------------------------- - * Host Controller - */ - - /* EHCI capability registers */ --#define HC_CAPLENGTH 0x000 --#define HC_LENGTH(p) (((p) >> 00) & 0x00ff) /* bits 7:0 */ --#define HC_VERSION(p) (((p) >> 16) & 0xffff) /* bits 31:16 */ -- --#define HC_HCSPARAMS 0x004 --#define HCS_INDICATOR(p) ((p) & (1 << 16)) /* true: has port indicators */ --#define HCS_PPC(p) ((p) & (1 << 4)) /* true: port power control */ --#define HCS_N_PORTS(p) (((p) >> 0) & 0xf) /* bits 3:0, ports on HC */ -- --#define HC_HCCPARAMS 0x008 --#define HCC_ISOC_CACHE(p) ((p) & (1 << 7)) /* true: can cache isoc frame */ --#define HCC_ISOC_THRES(p) (((p) >> 4) & 0x7) /* bits 6:4, uframes cached */ -+#define ISP176x_HC_CAPLENGTH 0x000 -+#define ISP176x_HC_VERSION 0x002 -+#define ISP176x_HC_HCSPARAMS 0x004 -+#define ISP176x_HC_HCCPARAMS 0x008 - - /* EHCI operational registers */ --#define HC_USBCMD 0x020 --#define CMD_LRESET (1 << 7) /* partial reset (no ports, etc) */ --#define CMD_RESET (1 << 1) /* reset HC not bus */ --#define CMD_RUN (1 << 0) /* start/stop HC */ -- --#define HC_USBSTS 0x024 --#define STS_PCD (1 << 2) /* port change detect */ -- --#define HC_FRINDEX 0x02c -- --#define HC_CONFIGFLAG 0x060 --#define FLAG_CF (1 << 0) /* true: we'll support "high speed" */ -- --#define HC_PORTSC1 0x064 --#define PORT_OWNER (1 << 13) /* true: companion hc owns this port */ --#define PORT_POWER (1 << 12) /* true: has power (see PPC) */ --#define PORT_USB11(x) (((x) & (3 << 10)) == (1 << 10)) /* USB 1.1 device */ --#define PORT_RESET (1 << 8) /* reset port */ --#define PORT_SUSPEND (1 << 7) /* suspend port */ --#define PORT_RESUME (1 << 6) /* resume it */ --#define PORT_PE (1 << 2) /* port enable */ --#define PORT_CSC (1 << 1) /* connect status change */ --#define PORT_CONNECT (1 << 0) /* device connected */ --#define PORT_RWC_BITS (PORT_CSC) -- --#define HC_ISO_PTD_DONEMAP_REG 0x130 --#define HC_ISO_PTD_SKIPMAP_REG 0x134 --#define HC_ISO_PTD_LASTPTD_REG 0x138 --#define HC_INT_PTD_DONEMAP_REG 0x140 --#define HC_INT_PTD_SKIPMAP_REG 0x144 --#define HC_INT_PTD_LASTPTD_REG 0x148 --#define HC_ATL_PTD_DONEMAP_REG 0x150 --#define HC_ATL_PTD_SKIPMAP_REG 0x154 --#define HC_ATL_PTD_LASTPTD_REG 0x158 -+#define ISP176x_HC_USBCMD 0x020 -+#define ISP176x_HC_USBSTS 0x024 -+#define ISP176x_HC_FRINDEX 0x02c -+ -+#define ISP176x_HC_CONFIGFLAG 0x060 -+#define ISP176x_HC_PORTSC1 0x064 -+ -+#define ISP176x_HC_ISO_PTD_DONEMAP 0x130 -+#define ISP176x_HC_ISO_PTD_SKIPMAP 0x134 -+#define ISP176x_HC_ISO_PTD_LASTPTD 0x138 -+#define ISP176x_HC_INT_PTD_DONEMAP 0x140 -+#define ISP176x_HC_INT_PTD_SKIPMAP 0x144 -+#define ISP176x_HC_INT_PTD_LASTPTD 0x148 -+#define ISP176x_HC_ATL_PTD_DONEMAP 0x150 -+#define ISP176x_HC_ATL_PTD_SKIPMAP 0x154 -+#define ISP176x_HC_ATL_PTD_LASTPTD 0x158 - - /* Configuration Register */ --#define HC_HW_MODE_CTRL 0x300 --#define ALL_ATX_RESET (1 << 31) --#define HW_ANA_DIGI_OC (1 << 15) --#define HW_DEV_DMA (1 << 11) --#define HW_COMN_IRQ (1 << 10) --#define HW_COMN_DMA (1 << 9) --#define HW_DATA_BUS_32BIT (1 << 8) --#define HW_DACK_POL_HIGH (1 << 6) --#define HW_DREQ_POL_HIGH (1 << 5) --#define HW_INTR_HIGH_ACT (1 << 2) --#define HW_INTR_EDGE_TRIG (1 << 1) --#define HW_GLOBAL_INTR_EN (1 << 0) -- --#define HC_CHIP_ID_REG 0x304 --#define HC_SCRATCH_REG 0x308 -- --#define HC_RESET_REG 0x30c --#define SW_RESET_RESET_HC (1 << 1) --#define SW_RESET_RESET_ALL (1 << 0) -- --#define HC_BUFFER_STATUS_REG 0x334 --#define ISO_BUF_FILL (1 << 2) --#define INT_BUF_FILL (1 << 1) --#define ATL_BUF_FILL (1 << 0) -- --#define HC_MEMORY_REG 0x33c --#define ISP_BANK(x) ((x) << 16) -- --#define HC_PORT1_CTRL 0x374 --#define PORT1_POWER (3 << 3) --#define PORT1_INIT1 (1 << 7) --#define PORT1_INIT2 (1 << 23) --#define HW_OTG_CTRL_SET 0x374 --#define HW_OTG_CTRL_CLR 0x376 --#define HW_OTG_DISABLE (1 << 10) --#define HW_OTG_SE0_EN (1 << 9) --#define HW_BDIS_ACON_EN (1 << 8) --#define HW_SW_SEL_HC_DC (1 << 7) --#define HW_VBUS_CHRG (1 << 6) --#define HW_VBUS_DISCHRG (1 << 5) --#define HW_VBUS_DRV (1 << 4) --#define HW_SEL_CP_EXT (1 << 3) --#define HW_DM_PULLDOWN (1 << 2) --#define HW_DP_PULLDOWN (1 << 1) --#define HW_DP_PULLUP (1 << 0) -+#define ISP176x_HC_HW_MODE_CTRL 0x300 -+#define ISP176x_HC_CHIP_ID 0x304 -+#define ISP176x_HC_SCRATCH 0x308 -+#define ISP176x_HC_RESET 0x30c -+#define ISP176x_HC_BUFFER_STATUS 0x334 -+#define ISP176x_HC_MEMORY 0x33c - - /* Interrupt Register */ --#define HC_INTERRUPT_REG 0x310 -- --#define HC_INTERRUPT_ENABLE 0x314 --#define HC_ISO_INT (1 << 9) --#define HC_ATL_INT (1 << 8) --#define HC_INTL_INT (1 << 7) --#define HC_EOT_INT (1 << 3) --#define HC_SOT_INT (1 << 1) --#define INTERRUPT_ENABLE_MASK (HC_INTL_INT | HC_ATL_INT) -- --#define HC_ISO_IRQ_MASK_OR_REG 0x318 --#define HC_INT_IRQ_MASK_OR_REG 0x31c --#define HC_ATL_IRQ_MASK_OR_REG 0x320 --#define HC_ISO_IRQ_MASK_AND_REG 0x324 --#define HC_INT_IRQ_MASK_AND_REG 0x328 --#define HC_ATL_IRQ_MASK_AND_REG 0x32c -+#define ISP176x_HC_INTERRUPT 0x310 -+#define ISP176x_HC_INTERRUPT_ENABLE 0x314 -+#define ISP176x_HC_ISO_IRQ_MASK_OR 0x318 -+#define ISP176x_HC_INT_IRQ_MASK_OR 0x31c -+#define ISP176x_HC_ATL_IRQ_MASK_OR 0x320 -+#define ISP176x_HC_ISO_IRQ_MASK_AND 0x324 -+#define ISP176x_HC_INT_IRQ_MASK_AND 0x328 -+#define ISP176x_HC_ATL_IRQ_MASK_AND 0x32c -+ -+enum isp176x_host_controller_fields { -+ /* HC_HCSPARAMS */ -+ HCS_PPC, HCS_N_PORTS, -+ /* HC_HCCPARAMS */ -+ HCC_ISOC_CACHE, HCC_ISOC_THRES, -+ /* HC_USBCMD */ -+ CMD_LRESET, CMD_RESET, CMD_RUN, -+ /* HC_USBSTS */ -+ STS_PCD, -+ /* HC_FRINDEX */ -+ HC_FRINDEX, -+ /* HC_CONFIGFLAG */ -+ FLAG_CF, -+ /* HC_PORTSC1 */ -+ PORT_OWNER, PORT_POWER, PORT_LSTATUS, PORT_RESET, PORT_SUSPEND, -+ PORT_RESUME, PORT_PE, PORT_CSC, PORT_CONNECT, -+ /* HC_HW_MODE_CTRL */ -+ ALL_ATX_RESET, HW_ANA_DIGI_OC, HW_DEV_DMA, HW_COMN_IRQ, HW_COMN_DMA, -+ HW_DATA_BUS_WIDTH, HW_DACK_POL_HIGH, HW_DREQ_POL_HIGH, HW_INTR_HIGH_ACT, -+ HW_INTR_EDGE_TRIG, HW_GLOBAL_INTR_EN, -+ /* HC_RESET */ -+ SW_RESET_RESET_HC, SW_RESET_RESET_ALL, -+ /* HC_BUFFER_STATUS */ -+ INT_BUF_FILL, ATL_BUF_FILL, -+ /* HC_MEMORY */ -+ MEM_BANK_SEL, MEM_START_ADDR, -+ /* HC_INTERRUPT_ENABLE */ -+ HC_INT_ENABLE, -+ /* Last element */ -+ HC_FIELD_MAX, -+}; - - /* ----------------------------------------------------------------------------- - * Peripheral Controller - */ - --/* Initialization Registers */ --#define DC_ADDRESS 0x0200 --#define DC_DEVEN (1 << 7) -- --#define DC_MODE 0x020c --#define DC_DMACLKON (1 << 9) --#define DC_VBUSSTAT (1 << 8) --#define DC_CLKAON (1 << 7) --#define DC_SNDRSU (1 << 6) --#define DC_GOSUSP (1 << 5) --#define DC_SFRESET (1 << 4) --#define DC_GLINTENA (1 << 3) --#define DC_WKUPCS (1 << 2) -- --#define DC_INTCONF 0x0210 --#define DC_CDBGMOD_ACK_NAK (0 << 6) --#define DC_CDBGMOD_ACK (1 << 6) --#define DC_CDBGMOD_ACK_1NAK (2 << 6) --#define DC_DDBGMODIN_ACK_NAK (0 << 4) --#define DC_DDBGMODIN_ACK (1 << 4) --#define DC_DDBGMODIN_ACK_1NAK (2 << 4) --#define DC_DDBGMODOUT_ACK_NYET_NAK (0 << 2) --#define DC_DDBGMODOUT_ACK_NYET (1 << 2) --#define DC_DDBGMODOUT_ACK_NYET_1NAK (2 << 2) --#define DC_INTLVL (1 << 1) --#define DC_INTPOL (1 << 0) -- --#define DC_DEBUG 0x0212 --#define DC_INTENABLE 0x0214 - #define DC_IEPTX(n) (1 << (11 + 2 * (n))) - #define DC_IEPRX(n) (1 << (10 + 2 * (n))) - #define DC_IEPRXTX(n) (3 << (10 + 2 * (n))) --#define DC_IEP0SETUP (1 << 8) --#define DC_IEVBUS (1 << 7) --#define DC_IEDMA (1 << 6) --#define DC_IEHS_STA (1 << 5) --#define DC_IERESM (1 << 4) --#define DC_IESUSP (1 << 3) --#define DC_IEPSOF (1 << 2) --#define DC_IESOF (1 << 1) --#define DC_IEBRST (1 << 0) -+ -+#define ISP176x_DC_CDBGMOD_ACK BIT(6) -+#define ISP176x_DC_DDBGMODIN_ACK BIT(4) -+#define ISP176x_DC_DDBGMODOUT_ACK BIT(2) -+ -+#define ISP176x_DC_IEP0SETUP BIT(8) -+#define ISP176x_DC_IEVBUS BIT(7) -+#define ISP176x_DC_IEHS_STA BIT(5) -+#define ISP176x_DC_IERESM BIT(4) -+#define ISP176x_DC_IESUSP BIT(3) -+#define ISP176x_DC_IEBRST BIT(0) -+ -+#define ISP176x_DC_ENDPTYP_ISOC 0x01 -+#define ISP176x_DC_ENDPTYP_BULK 0x02 -+#define ISP176x_DC_ENDPTYP_INTERRUPT 0x03 -+ -+/* Initialization Registers */ -+#define ISP176x_DC_ADDRESS 0x0200 -+#define ISP176x_DC_MODE 0x020c -+#define ISP176x_DC_INTCONF 0x0210 -+#define ISP176x_DC_DEBUG 0x0212 -+#define ISP176x_DC_INTENABLE 0x0214 - - /* Data Flow Registers */ --#define DC_EPINDEX 0x022c --#define DC_EP0SETUP (1 << 5) --#define DC_ENDPIDX(n) ((n) << 1) --#define DC_EPDIR (1 << 0) -- --#define DC_CTRLFUNC 0x0228 --#define DC_CLBUF (1 << 4) --#define DC_VENDP (1 << 3) --#define DC_DSEN (1 << 2) --#define DC_STATUS (1 << 1) --#define DC_STALL (1 << 0) -- --#define DC_DATAPORT 0x0220 --#define DC_BUFLEN 0x021c --#define DC_DATACOUNT_MASK 0xffff --#define DC_BUFSTAT 0x021e --#define DC_EPMAXPKTSZ 0x0204 -- --#define DC_EPTYPE 0x0208 --#define DC_NOEMPKT (1 << 4) --#define DC_EPENABLE (1 << 3) --#define DC_DBLBUF (1 << 2) --#define DC_ENDPTYP_ISOC (1 << 0) --#define DC_ENDPTYP_BULK (2 << 0) --#define DC_ENDPTYP_INTERRUPT (3 << 0) -+#define ISP176x_DC_EPMAXPKTSZ 0x0204 -+#define ISP176x_DC_EPTYPE 0x0208 -+ -+#define ISP176x_DC_BUFLEN 0x021c -+#define ISP176x_DC_BUFSTAT 0x021e -+#define ISP176x_DC_DATAPORT 0x0220 -+ -+#define ISP176x_DC_CTRLFUNC 0x0228 -+#define ISP176x_DC_EPINDEX 0x022c -+ -+#define ISP1761_DC_OTG_CTRL_SET 0x374 -+#define ISP1761_DC_OTG_CTRL_CLEAR 0x376 - - /* DMA Registers */ --#define DC_DMACMD 0x0230 --#define DC_DMATXCOUNT 0x0234 --#define DC_DMACONF 0x0238 --#define DC_DMAHW 0x023c --#define DC_DMAINTREASON 0x0250 --#define DC_DMAINTEN 0x0254 --#define DC_DMAEP 0x0258 --#define DC_DMABURSTCOUNT 0x0264 -+#define ISP176x_DC_DMACMD 0x0230 -+#define ISP176x_DC_DMATXCOUNT 0x0234 -+#define ISP176x_DC_DMACONF 0x0238 -+#define ISP176x_DC_DMAHW 0x023c -+#define ISP176x_DC_DMAINTREASON 0x0250 -+#define ISP176x_DC_DMAINTEN 0x0254 -+#define ISP176x_DC_DMAEP 0x0258 -+#define ISP176x_DC_DMABURSTCOUNT 0x0264 - - /* General Registers */ --#define DC_INTERRUPT 0x0218 --#define DC_CHIPID 0x0270 --#define DC_FRAMENUM 0x0274 --#define DC_SCRATCH 0x0278 --#define DC_UNLOCKDEV 0x027c --#define DC_INTPULSEWIDTH 0x0280 --#define DC_TESTMODE 0x0284 -+#define ISP176x_DC_INTERRUPT 0x0218 -+#define ISP176x_DC_CHIPID 0x0270 -+#define ISP176x_DC_FRAMENUM 0x0274 -+#define ISP176x_DC_SCRATCH 0x0278 -+#define ISP176x_DC_UNLOCKDEV 0x027c -+#define ISP176x_DC_INTPULSEWIDTH 0x0280 -+#define ISP176x_DC_TESTMODE 0x0284 -+ -+enum isp176x_device_controller_fields { -+ /* DC_ADDRESS */ -+ DC_DEVEN, DC_DEVADDR, -+ /* DC_MODE */ -+ DC_VBUSSTAT, DC_SFRESET, DC_GLINTENA, -+ /* DC_INTCONF */ -+ DC_CDBGMOD_ACK, DC_DDBGMODIN_ACK, DC_DDBGMODOUT_ACK, DC_INTPOL, -+ /* DC_INTENABLE */ -+ DC_IEPRXTX_7, DC_IEPRXTX_6, DC_IEPRXTX_5, DC_IEPRXTX_4, DC_IEPRXTX_3, -+ DC_IEPRXTX_2, DC_IEPRXTX_1, DC_IEPRXTX_0, -+ DC_IEP0SETUP, DC_IEVBUS, DC_IEHS_STA, DC_IERESM, DC_IESUSP, DC_IEBRST, -+ /* DC_EPINDEX */ -+ DC_EP0SETUP, DC_ENDPIDX, DC_EPDIR, -+ /* DC_CTRLFUNC */ -+ DC_CLBUF, DC_VENDP, DC_DSEN, DC_STATUS, DC_STALL, -+ /* DC_BUFLEN */ -+ DC_BUFLEN, -+ /* DC_EPMAXPKTSZ */ -+ DC_FFOSZ, -+ /* DC_EPTYPE */ -+ DC_EPENABLE, DC_ENDPTYP, -+ /* DC_FRAMENUM */ -+ DC_FRAMENUM, DC_UFRAMENUM, -+ /* HW_OTG_CTRL_SET */ -+ HW_OTG_DISABLE, HW_SW_SEL_HC_DC, HW_VBUS_DRV, HW_SEL_CP_EXT, -+ HW_DM_PULLDOWN, HW_DP_PULLDOWN, HW_DP_PULLUP, -+ /* HW_OTG_CTRL_CLR */ -+ HW_OTG_DISABLE_CLEAR, HW_SW_SEL_HC_DC_CLEAR, HW_VBUS_DRV_CLEAR, -+ HW_SEL_CP_EXT_CLEAR, HW_DM_PULLDOWN_CLEAR, HW_DP_PULLDOWN_CLEAR, -+ HW_DP_PULLUP_CLEAR, -+ /* Last element */ -+ DC_FIELD_MAX, -+}; - - #endif -diff --git a/drivers/usb/isp1760/isp1760-udc.c b/drivers/usb/isp1760/isp1760-udc.c -index 1714b2258b54..1e2ca43fb152 100644 ---- a/drivers/usb/isp1760/isp1760-udc.c -+++ b/drivers/usb/isp1760/isp1760-udc.c -@@ -45,16 +45,62 @@ static inline struct isp1760_request *req_to_udc_req(struct usb_request *req) - return container_of(req, struct isp1760_request, req); - } - --static inline u32 isp1760_udc_read(struct isp1760_udc *udc, u16 reg) -+static u32 isp1760_udc_read(struct isp1760_udc *udc, u16 field) - { -- return isp1760_read32(udc->regs, reg); -+ return isp1760_field_read(udc->fields, field); - } - --static inline void isp1760_udc_write(struct isp1760_udc *udc, u16 reg, u32 val) -+static void isp1760_udc_write(struct isp1760_udc *udc, u16 field, u32 val) - { -- isp1760_write32(udc->regs, reg, val); -+ isp1760_field_write(udc->fields, field, val); - } - -+static u32 isp1760_udc_read_raw(struct isp1760_udc *udc, u16 reg) -+{ -+ __le32 val; -+ -+ regmap_raw_read(udc->regs, reg, &val, 4); -+ -+ return le32_to_cpu(val); -+} -+ -+static u16 isp1760_udc_read_raw16(struct isp1760_udc *udc, u16 reg) -+{ -+ __le16 val; -+ -+ regmap_raw_read(udc->regs, reg, &val, 2); -+ -+ return le16_to_cpu(val); -+} -+ -+static void isp1760_udc_write_raw(struct isp1760_udc *udc, u16 reg, u32 val) -+{ -+ __le32 val_le = cpu_to_le32(val); -+ -+ regmap_raw_write(udc->regs, reg, &val_le, 4); -+} -+ -+static void isp1760_udc_write_raw16(struct isp1760_udc *udc, u16 reg, u16 val) -+{ -+ __le16 val_le = cpu_to_le16(val); -+ -+ regmap_raw_write(udc->regs, reg, &val_le, 2); -+} -+ -+static void isp1760_udc_set(struct isp1760_udc *udc, u32 field) -+{ -+ isp1760_udc_write(udc, field, 0xFFFFFFFF); -+} -+ -+static void isp1760_udc_clear(struct isp1760_udc *udc, u32 field) -+{ -+ isp1760_udc_write(udc, field, 0); -+} -+ -+static bool isp1760_udc_is_set(struct isp1760_udc *udc, u32 field) -+{ -+ return !!isp1760_udc_read(udc, field); -+} - /* ----------------------------------------------------------------------------- - * Endpoint Management - */ -@@ -75,11 +121,15 @@ static struct isp1760_ep *isp1760_udc_find_ep(struct isp1760_udc *udc, - return NULL; - } - --static void __isp1760_udc_select_ep(struct isp1760_ep *ep, int dir) -+static void __isp1760_udc_select_ep(struct isp1760_udc *udc, -+ struct isp1760_ep *ep, int dir) - { -- isp1760_udc_write(ep->udc, DC_EPINDEX, -- DC_ENDPIDX(ep->addr & USB_ENDPOINT_NUMBER_MASK) | -- (dir == USB_DIR_IN ? DC_EPDIR : 0)); -+ isp1760_udc_write(udc, DC_ENDPIDX, ep->addr & USB_ENDPOINT_NUMBER_MASK); -+ -+ if (dir == USB_DIR_IN) -+ isp1760_udc_set(udc, DC_EPDIR); -+ else -+ isp1760_udc_clear(udc, DC_EPDIR); - } - - /** -@@ -93,9 +143,10 @@ static void __isp1760_udc_select_ep(struct isp1760_ep *ep, int dir) - * - * Called with the UDC spinlock held. - */ --static void isp1760_udc_select_ep(struct isp1760_ep *ep) -+static void isp1760_udc_select_ep(struct isp1760_udc *udc, -+ struct isp1760_ep *ep) - { -- __isp1760_udc_select_ep(ep, ep->addr & USB_ENDPOINT_DIR_MASK); -+ __isp1760_udc_select_ep(udc, ep, ep->addr & USB_ENDPOINT_DIR_MASK); - } - - /* Called with the UDC spinlock held. */ -@@ -108,9 +159,13 @@ static void isp1760_udc_ctrl_send_status(struct isp1760_ep *ep, int dir) - * the direction opposite to the data stage data packets, we thus need - * to select the OUT/IN endpoint for IN/OUT transfers. - */ -- isp1760_udc_write(udc, DC_EPINDEX, DC_ENDPIDX(0) | -- (dir == USB_DIR_IN ? 0 : DC_EPDIR)); -- isp1760_udc_write(udc, DC_CTRLFUNC, DC_STATUS); -+ if (dir == USB_DIR_IN) -+ isp1760_udc_clear(udc, DC_EPDIR); -+ else -+ isp1760_udc_set(udc, DC_EPDIR); -+ -+ isp1760_udc_write(udc, DC_ENDPIDX, 1); -+ isp1760_udc_set(udc, DC_STATUS); - - /* - * The hardware will terminate the request automatically and go back to -@@ -157,10 +212,10 @@ static void isp1760_udc_ctrl_send_stall(struct isp1760_ep *ep) - spin_lock_irqsave(&udc->lock, flags); - - /* Stall both the IN and OUT endpoints. */ -- __isp1760_udc_select_ep(ep, USB_DIR_OUT); -- isp1760_udc_write(udc, DC_CTRLFUNC, DC_STALL); -- __isp1760_udc_select_ep(ep, USB_DIR_IN); -- isp1760_udc_write(udc, DC_CTRLFUNC, DC_STALL); -+ __isp1760_udc_select_ep(udc, ep, USB_DIR_OUT); -+ isp1760_udc_set(udc, DC_STALL); -+ __isp1760_udc_select_ep(udc, ep, USB_DIR_IN); -+ isp1760_udc_set(udc, DC_STALL); - - /* A protocol stall completes the control transaction. */ - udc->ep0_state = ISP1760_CTRL_SETUP; -@@ -181,8 +236,8 @@ static bool isp1760_udc_receive(struct isp1760_ep *ep, - u32 *buf; - int i; - -- isp1760_udc_select_ep(ep); -- len = isp1760_udc_read(udc, DC_BUFLEN) & DC_DATACOUNT_MASK; -+ isp1760_udc_select_ep(udc, ep); -+ len = isp1760_udc_read(udc, DC_BUFLEN); - - dev_dbg(udc->isp->dev, "%s: received %u bytes (%u/%u done)\n", - __func__, len, req->req.actual, req->req.length); -@@ -198,7 +253,7 @@ static bool isp1760_udc_receive(struct isp1760_ep *ep, - * datasheet doesn't clearly document how this should be - * handled. - */ -- isp1760_udc_write(udc, DC_CTRLFUNC, DC_CLBUF); -+ isp1760_udc_set(udc, DC_CLBUF); - return false; - } - -@@ -209,9 +264,9 @@ static bool isp1760_udc_receive(struct isp1760_ep *ep, - * the next packet might be removed from the FIFO. - */ - for (i = len; i > 2; i -= 4, ++buf) -- *buf = le32_to_cpu(isp1760_udc_read(udc, DC_DATAPORT)); -+ *buf = isp1760_udc_read_raw(udc, ISP176x_DC_DATAPORT); - if (i > 0) -- *(u16 *)buf = le16_to_cpu(readw(udc->regs + DC_DATAPORT)); -+ *(u16 *)buf = isp1760_udc_read_raw16(udc, ISP176x_DC_DATAPORT); - - req->req.actual += len; - -@@ -253,7 +308,7 @@ static void isp1760_udc_transmit(struct isp1760_ep *ep, - __func__, req->packet_size, req->req.actual, - req->req.length); - -- __isp1760_udc_select_ep(ep, USB_DIR_IN); -+ __isp1760_udc_select_ep(udc, ep, USB_DIR_IN); - - if (req->packet_size) - isp1760_udc_write(udc, DC_BUFLEN, req->packet_size); -@@ -265,14 +320,14 @@ static void isp1760_udc_transmit(struct isp1760_ep *ep, - * the FIFO for this kind of conditions, but doesn't seem to work. - */ - for (i = req->packet_size; i > 2; i -= 4, ++buf) -- isp1760_udc_write(udc, DC_DATAPORT, cpu_to_le32(*buf)); -+ isp1760_udc_write_raw(udc, ISP176x_DC_DATAPORT, *buf); - if (i > 0) -- writew(cpu_to_le16(*(u16 *)buf), udc->regs + DC_DATAPORT); -+ isp1760_udc_write_raw16(udc, ISP176x_DC_DATAPORT, *(u16 *)buf); - - if (ep->addr == 0) -- isp1760_udc_write(udc, DC_CTRLFUNC, DC_DSEN); -+ isp1760_udc_set(udc, DC_DSEN); - if (!req->packet_size) -- isp1760_udc_write(udc, DC_CTRLFUNC, DC_VENDP); -+ isp1760_udc_set(udc, DC_VENDP); - } - - static void isp1760_ep_rx_ready(struct isp1760_ep *ep) -@@ -408,19 +463,24 @@ static int __isp1760_udc_set_halt(struct isp1760_ep *ep, bool halt) - return -EINVAL; - } - -- isp1760_udc_select_ep(ep); -- isp1760_udc_write(udc, DC_CTRLFUNC, halt ? DC_STALL : 0); -+ isp1760_udc_select_ep(udc, ep); -+ -+ if (halt) -+ isp1760_udc_set(udc, DC_STALL); -+ else -+ isp1760_udc_clear(udc, DC_STALL); - - if (ep->addr == 0) { - /* When halting the control endpoint, stall both IN and OUT. */ -- __isp1760_udc_select_ep(ep, USB_DIR_IN); -- isp1760_udc_write(udc, DC_CTRLFUNC, halt ? DC_STALL : 0); -+ __isp1760_udc_select_ep(udc, ep, USB_DIR_IN); -+ if (halt) -+ isp1760_udc_set(udc, DC_STALL); -+ else -+ isp1760_udc_clear(udc, DC_STALL); - } else if (!halt) { - /* Reset the data PID by cycling the endpoint enable bit. */ -- u16 eptype = isp1760_udc_read(udc, DC_EPTYPE); -- -- isp1760_udc_write(udc, DC_EPTYPE, eptype & ~DC_EPENABLE); -- isp1760_udc_write(udc, DC_EPTYPE, eptype); -+ isp1760_udc_clear(udc, DC_EPENABLE); -+ isp1760_udc_set(udc, DC_EPENABLE); - - /* - * Disabling the endpoint emptied the transmit FIFO, fill it -@@ -479,12 +539,14 @@ static int isp1760_udc_get_status(struct isp1760_udc *udc, - return -EINVAL; - } - -- isp1760_udc_write(udc, DC_EPINDEX, DC_ENDPIDX(0) | DC_EPDIR); -+ isp1760_udc_set(udc, DC_EPDIR); -+ isp1760_udc_write(udc, DC_ENDPIDX, 1); -+ - isp1760_udc_write(udc, DC_BUFLEN, 2); - -- writew(cpu_to_le16(status), udc->regs + DC_DATAPORT); -+ isp1760_udc_write_raw16(udc, ISP176x_DC_DATAPORT, status); - -- isp1760_udc_write(udc, DC_CTRLFUNC, DC_DSEN); -+ isp1760_udc_set(udc, DC_DSEN); - - dev_dbg(udc->isp->dev, "%s: status 0x%04x\n", __func__, status); - -@@ -508,7 +570,8 @@ static int isp1760_udc_set_address(struct isp1760_udc *udc, u16 addr) - usb_gadget_set_state(&udc->gadget, addr ? USB_STATE_ADDRESS : - USB_STATE_DEFAULT); - -- isp1760_udc_write(udc, DC_ADDRESS, DC_DEVEN | addr); -+ isp1760_udc_write(udc, DC_DEVADDR, addr); -+ isp1760_udc_set(udc, DC_DEVEN); - - spin_lock(&udc->lock); - isp1760_udc_ctrl_send_status(&udc->ep[0], USB_DIR_OUT); -@@ -650,9 +713,9 @@ static void isp1760_ep0_setup(struct isp1760_udc *udc) - - spin_lock(&udc->lock); - -- isp1760_udc_write(udc, DC_EPINDEX, DC_EP0SETUP); -+ isp1760_udc_set(udc, DC_EP0SETUP); - -- count = isp1760_udc_read(udc, DC_BUFLEN) & DC_DATACOUNT_MASK; -+ count = isp1760_udc_read(udc, DC_BUFLEN); - if (count != sizeof(req)) { - spin_unlock(&udc->lock); - -@@ -663,8 +726,8 @@ static void isp1760_ep0_setup(struct isp1760_udc *udc) - return; - } - -- req.data[0] = isp1760_udc_read(udc, DC_DATAPORT); -- req.data[1] = isp1760_udc_read(udc, DC_DATAPORT); -+ req.data[0] = isp1760_udc_read_raw(udc, ISP176x_DC_DATAPORT); -+ req.data[1] = isp1760_udc_read_raw(udc, ISP176x_DC_DATAPORT); - - if (udc->ep0_state != ISP1760_CTRL_SETUP) { - spin_unlock(&udc->lock); -@@ -732,13 +795,13 @@ static int isp1760_ep_enable(struct usb_ep *ep, - - switch (usb_endpoint_type(desc)) { - case USB_ENDPOINT_XFER_ISOC: -- type = DC_ENDPTYP_ISOC; -+ type = ISP176x_DC_ENDPTYP_ISOC; - break; - case USB_ENDPOINT_XFER_BULK: -- type = DC_ENDPTYP_BULK; -+ type = ISP176x_DC_ENDPTYP_BULK; - break; - case USB_ENDPOINT_XFER_INT: -- type = DC_ENDPTYP_INTERRUPT; -+ type = ISP176x_DC_ENDPTYP_INTERRUPT; - break; - case USB_ENDPOINT_XFER_CONTROL: - default: -@@ -755,10 +818,13 @@ static int isp1760_ep_enable(struct usb_ep *ep, - uep->halted = false; - uep->wedged = false; - -- isp1760_udc_select_ep(uep); -- isp1760_udc_write(udc, DC_EPMAXPKTSZ, uep->maxpacket); -+ isp1760_udc_select_ep(udc, uep); -+ -+ isp1760_udc_write(udc, DC_FFOSZ, uep->maxpacket); - isp1760_udc_write(udc, DC_BUFLEN, uep->maxpacket); -- isp1760_udc_write(udc, DC_EPTYPE, DC_EPENABLE | type); -+ -+ isp1760_udc_write(udc, DC_ENDPTYP, type); -+ isp1760_udc_set(udc, DC_EPENABLE); - - spin_unlock_irqrestore(&udc->lock, flags); - -@@ -786,8 +852,9 @@ static int isp1760_ep_disable(struct usb_ep *ep) - uep->desc = NULL; - uep->maxpacket = 0; - -- isp1760_udc_select_ep(uep); -- isp1760_udc_write(udc, DC_EPTYPE, 0); -+ isp1760_udc_select_ep(udc, uep); -+ isp1760_udc_clear(udc, DC_EPENABLE); -+ isp1760_udc_clear(udc, DC_ENDPTYP); - - /* TODO Synchronize with the IRQ handler */ - -@@ -864,8 +931,8 @@ static int isp1760_ep_queue(struct usb_ep *ep, struct usb_request *_req, - - case ISP1760_CTRL_DATA_OUT: - list_add_tail(&req->queue, &uep->queue); -- __isp1760_udc_select_ep(uep, USB_DIR_OUT); -- isp1760_udc_write(udc, DC_CTRLFUNC, DC_DSEN); -+ __isp1760_udc_select_ep(udc, uep, USB_DIR_OUT); -+ isp1760_udc_set(udc, DC_DSEN); - break; - - case ISP1760_CTRL_STATUS: -@@ -1025,14 +1092,14 @@ static void isp1760_ep_fifo_flush(struct usb_ep *ep) - - spin_lock_irqsave(&udc->lock, flags); - -- isp1760_udc_select_ep(uep); -+ isp1760_udc_select_ep(udc, uep); - - /* - * Set the CLBUF bit twice to flush both buffers in case double - * buffering is enabled. - */ -- isp1760_udc_write(udc, DC_CTRLFUNC, DC_CLBUF); -- isp1760_udc_write(udc, DC_CTRLFUNC, DC_CLBUF); -+ isp1760_udc_set(udc, DC_CLBUF); -+ isp1760_udc_set(udc, DC_CLBUF); - - spin_unlock_irqrestore(&udc->lock, flags); - } -@@ -1091,19 +1158,22 @@ static void isp1760_udc_init_hw(struct isp1760_udc *udc) - * ACK tokens only (and NYET for the out pipe). The default - * configuration also generates an interrupt on the first NACK token. - */ -- isp1760_udc_write(udc, DC_INTCONF, DC_CDBGMOD_ACK | DC_DDBGMODIN_ACK | -- DC_DDBGMODOUT_ACK_NYET); -- -- isp1760_udc_write(udc, DC_INTENABLE, DC_IEPRXTX(7) | DC_IEPRXTX(6) | -- DC_IEPRXTX(5) | DC_IEPRXTX(4) | DC_IEPRXTX(3) | -- DC_IEPRXTX(2) | DC_IEPRXTX(1) | DC_IEPRXTX(0) | -- DC_IEP0SETUP | DC_IEVBUS | DC_IERESM | DC_IESUSP | -- DC_IEHS_STA | DC_IEBRST); -+ isp1760_reg_write(udc->regs, ISP176x_DC_INTCONF, -+ ISP176x_DC_CDBGMOD_ACK | ISP176x_DC_DDBGMODIN_ACK | -+ ISP176x_DC_DDBGMODOUT_ACK); -+ -+ isp1760_reg_write(udc->regs, ISP176x_DC_INTENABLE, DC_IEPRXTX(7) | -+ DC_IEPRXTX(6) | DC_IEPRXTX(5) | DC_IEPRXTX(4) | -+ DC_IEPRXTX(3) | DC_IEPRXTX(2) | DC_IEPRXTX(1) | -+ DC_IEPRXTX(0) | ISP176x_DC_IEP0SETUP | -+ ISP176x_DC_IEVBUS | ISP176x_DC_IERESM | -+ ISP176x_DC_IESUSP | ISP176x_DC_IEHS_STA | -+ ISP176x_DC_IEBRST); - - if (udc->connected) - isp1760_set_pullup(udc->isp, true); - -- isp1760_udc_write(udc, DC_ADDRESS, DC_DEVEN); -+ isp1760_udc_set(udc, DC_DEVEN); - } - - static void isp1760_udc_reset(struct isp1760_udc *udc) -@@ -1152,7 +1222,7 @@ static int isp1760_udc_get_frame(struct usb_gadget *gadget) - { - struct isp1760_udc *udc = gadget_to_udc(gadget); - -- return isp1760_udc_read(udc, DC_FRAMENUM) & ((1 << 11) - 1); -+ return isp1760_udc_read(udc, DC_FRAMENUM); - } - - static int isp1760_udc_wakeup(struct usb_gadget *gadget) -@@ -1219,7 +1289,7 @@ static int isp1760_udc_start(struct usb_gadget *gadget, - usb_gadget_set_state(&udc->gadget, USB_STATE_ATTACHED); - - /* DMA isn't supported yet, don't enable the DMA clock. */ -- isp1760_udc_write(udc, DC_MODE, DC_GLINTENA); -+ isp1760_udc_set(udc, DC_GLINTENA); - - isp1760_udc_init_hw(udc); - -@@ -1238,7 +1308,7 @@ static int isp1760_udc_stop(struct usb_gadget *gadget) - - del_timer_sync(&udc->vbus_timer); - -- isp1760_udc_write(udc, DC_MODE, 0); -+ isp1760_reg_write(udc->regs, ISP176x_DC_MODE, 0); - - spin_lock_irqsave(&udc->lock, flags); - udc->driver = NULL; -@@ -1266,9 +1336,9 @@ static irqreturn_t isp1760_udc_irq(int irq, void *dev) - unsigned int i; - u32 status; - -- status = isp1760_udc_read(udc, DC_INTERRUPT) -- & isp1760_udc_read(udc, DC_INTENABLE); -- isp1760_udc_write(udc, DC_INTERRUPT, status); -+ status = isp1760_reg_read(udc->regs, ISP176x_DC_INTERRUPT) -+ & isp1760_reg_read(udc->regs, ISP176x_DC_INTENABLE); -+ isp1760_reg_write(udc->regs, ISP176x_DC_INTERRUPT, status); - - if (status & DC_IEVBUS) { - dev_dbg(udc->isp->dev, "%s(VBUS)\n", __func__); -@@ -1313,7 +1383,7 @@ static irqreturn_t isp1760_udc_irq(int irq, void *dev) - dev_dbg(udc->isp->dev, "%s(SUSP)\n", __func__); - - spin_lock(&udc->lock); -- if (!(isp1760_udc_read(udc, DC_MODE) & DC_VBUSSTAT)) -+ if (!isp1760_udc_is_set(udc, DC_VBUSSTAT)) - isp1760_udc_disconnect(udc); - else - isp1760_udc_suspend(udc); -@@ -1335,7 +1405,7 @@ static void isp1760_udc_vbus_poll(struct timer_list *t) - - spin_lock_irqsave(&udc->lock, flags); - -- if (!(isp1760_udc_read(udc, DC_MODE) & DC_VBUSSTAT)) -+ if (!(isp1760_udc_is_set(udc, DC_VBUSSTAT))) - isp1760_udc_disconnect(udc); - else if (udc->gadget.state >= USB_STATE_POWERED) - mod_timer(&udc->vbus_timer, -@@ -1412,9 +1482,9 @@ static int isp1760_udc_init(struct isp1760_udc *udc) - * register, and reading the scratch register value back. The chip ID - * and scratch register contents must match the expected values. - */ -- isp1760_udc_write(udc, DC_SCRATCH, 0xbabe); -- chipid = isp1760_udc_read(udc, DC_CHIPID); -- scratch = isp1760_udc_read(udc, DC_SCRATCH); -+ isp1760_reg_write(udc->regs, ISP176x_DC_SCRATCH, 0xbabe); -+ chipid = isp1760_reg_read(udc->regs, ISP176x_DC_CHIPID); -+ scratch = isp1760_reg_read(udc->regs, ISP176x_DC_SCRATCH); - - if (scratch != 0xbabe) { - dev_err(udc->isp->dev, -@@ -1429,9 +1499,9 @@ static int isp1760_udc_init(struct isp1760_udc *udc) - } - - /* Reset the device controller. */ -- isp1760_udc_write(udc, DC_MODE, DC_SFRESET); -+ isp1760_udc_set(udc, DC_SFRESET); - usleep_range(10000, 11000); -- isp1760_udc_write(udc, DC_MODE, 0); -+ isp1760_reg_write(udc->regs, ISP176x_DC_MODE, 0); - usleep_range(10000, 11000); - - return 0; -@@ -1445,7 +1515,6 @@ int isp1760_udc_register(struct isp1760_device *isp, int irq, - - udc->irq = -1; - udc->isp = isp; -- udc->regs = isp->regs; - - spin_lock_init(&udc->lock); - timer_setup(&udc->vbus_timer, isp1760_udc_vbus_poll, 0); -diff --git a/drivers/usb/isp1760/isp1760-udc.h b/drivers/usb/isp1760/isp1760-udc.h -index d2df650d54e9..a49096c0ac8e 100644 ---- a/drivers/usb/isp1760/isp1760-udc.h -+++ b/drivers/usb/isp1760/isp1760-udc.h -@@ -17,6 +17,8 @@ - #include - #include - -+#include "isp1760-regs.h" -+ - struct isp1760_device; - struct isp1760_udc; - -@@ -48,7 +50,7 @@ struct isp1760_ep { - * struct isp1760_udc - UDC state information - * irq: IRQ number - * irqname: IRQ name (as passed to request_irq) -- * regs: Base address of the UDC registers -+ * regs: regmap for UDC registers - * driver: Gadget driver - * gadget: Gadget device - * lock: Protects driver, vbus_timer, ep, ep0_*, DC_EPINDEX register -@@ -59,12 +61,13 @@ struct isp1760_ep { - * connected: Tracks gadget driver bus connection state - */ - struct isp1760_udc { --#ifdef CONFIG_USB_ISP1761_UDC - struct isp1760_device *isp; - - int irq; - char *irqname; -- void __iomem *regs; -+ -+ struct regmap *regs; -+ struct regmap_field *fields[DC_FIELD_MAX]; - - struct usb_gadget_driver *driver; - struct usb_gadget gadget; -@@ -81,7 +84,6 @@ struct isp1760_udc { - bool connected; - - unsigned int devstatus; --#endif - }; - - #ifdef CONFIG_USB_ISP1761_UDC --- -2.33.0 - diff --git a/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0003-usb-isp1760-use-relaxed-primitives.patch b/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0003-usb-isp1760-use-relaxed-primitives.patch deleted file mode 100644 index 2e2e97aa..00000000 --- a/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0003-usb-isp1760-use-relaxed-primitives.patch +++ /dev/null @@ -1,64 +0,0 @@ -Upstream-Status: Accepted [merged with kernel 5.14.9] -Signed-off-by: Arpita S.K - -From 03e28d5233d50fb2a27fa02d032e77974d03eb2b Mon Sep 17 00:00:00 2001 -From: Rui Miguel Silva -Date: Thu, 13 May 2021 09:47:11 +0100 -Subject: [PATCH 03/23] usb: isp1760: use relaxed primitives - -Use io relaxed access memory primitives to satisfy strict type -checking (__force). - -This will fix some existing sparse warnings: -sparse: warning: cast to restricted __le32 - -Signed-off-by: Rui Miguel Silva -Link: https://lore.kernel.org/r/20210513084717.2487366-4-rui.silva@linaro.org -Signed-off-by: Greg Kroah-Hartman ---- - drivers/usb/isp1760/isp1760-hcd.c | 8 ++++---- - 1 file changed, 4 insertions(+), 4 deletions(-) - -diff --git a/drivers/usb/isp1760/isp1760-hcd.c b/drivers/usb/isp1760/isp1760-hcd.c -index 20d142140574..2cc0555e029d 100644 ---- a/drivers/usb/isp1760/isp1760-hcd.c -+++ b/drivers/usb/isp1760/isp1760-hcd.c -@@ -246,7 +246,7 @@ static void bank_reads8(void __iomem *src_base, u32 src_offset, u32 bank_addr, - - if (src_offset < PAYLOAD_OFFSET) { - while (bytes >= 4) { -- *dst = le32_to_cpu(__raw_readl(src)); -+ *dst = readl_relaxed(src); - bytes -= 4; - src++; - dst++; -@@ -267,7 +267,7 @@ static void bank_reads8(void __iomem *src_base, u32 src_offset, u32 bank_addr, - * allocated. - */ - if (src_offset < PAYLOAD_OFFSET) -- val = le32_to_cpu(__raw_readl(src)); -+ val = readl_relaxed(src); - else - val = __raw_readl(src); - -@@ -301,7 +301,7 @@ static void mem_writes8(void __iomem *dst_base, u32 dst_offset, - - if (dst_offset < PAYLOAD_OFFSET) { - while (bytes >= 4) { -- __raw_writel(cpu_to_le32(*src), dst); -+ writel_relaxed(*src, dst); - bytes -= 4; - src++; - dst++; -@@ -322,7 +322,7 @@ static void mem_writes8(void __iomem *dst_base, u32 dst_offset, - */ - - if (dst_offset < PAYLOAD_OFFSET) -- __raw_writel(cpu_to_le32(*src), dst); -+ writel_relaxed(*src, dst); - else - __raw_writel(*src, dst); - } --- -2.33.0 - diff --git a/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0004-usb-isp1760-remove-platform-data-struct-and-code.patch b/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0004-usb-isp1760-remove-platform-data-struct-and-code.patch deleted file mode 100644 index b8a3fabc..00000000 --- a/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0004-usb-isp1760-remove-platform-data-struct-and-code.patch +++ /dev/null @@ -1,62 +0,0 @@ -Upstream-Status: Accepted [merged with kernel 5.14.9] -Signed-off-by: Arpita S.K - -From f9a88370e6751c68a8f0d1c3f23100ca20596249 Mon Sep 17 00:00:00 2001 -From: Rui Miguel Silva -Date: Thu, 13 May 2021 09:47:12 +0100 -Subject: [PATCH 04/23] usb: isp1760: remove platform data struct and code - -Since the removal of the Blackfin port with: -commit 4ba66a976072 ("arch: remove blackfin port") - -No one is using or referencing this header and platform data struct. -Remove them. - -Signed-off-by: Rui Miguel Silva -Link: https://lore.kernel.org/r/20210513084717.2487366-5-rui.silva@linaro.org -Signed-off-by: Greg Kroah-Hartman ---- - drivers/usb/isp1760/isp1760-if.c | 20 +++----------------- - 1 file changed, 3 insertions(+), 17 deletions(-) - -diff --git a/drivers/usb/isp1760/isp1760-if.c b/drivers/usb/isp1760/isp1760-if.c -index abfba9f5ec23..fb6701608cd8 100644 ---- a/drivers/usb/isp1760/isp1760-if.c -+++ b/drivers/usb/isp1760/isp1760-if.c -@@ -16,7 +16,6 @@ - #include - #include - #include --#include - #include - - #include "isp1760-core.h" -@@ -225,22 +224,9 @@ static int isp1760_plat_probe(struct platform_device *pdev) - - if (of_property_read_bool(dp, "dreq-polarity")) - devflags |= ISP1760_FLAG_DREQ_POL_HIGH; -- } else if (dev_get_platdata(&pdev->dev)) { -- struct isp1760_platform_data *pdata = -- dev_get_platdata(&pdev->dev); -- -- if (pdata->is_isp1761) -- devflags |= ISP1760_FLAG_ISP1761; -- if (pdata->bus_width_16) -- devflags |= ISP1760_FLAG_BUS_WIDTH_16; -- if (pdata->port1_otg) -- devflags |= ISP1760_FLAG_OTG_EN; -- if (pdata->analog_oc) -- devflags |= ISP1760_FLAG_ANALOG_OC; -- if (pdata->dack_polarity_high) -- devflags |= ISP1760_FLAG_DACK_POL_HIGH; -- if (pdata->dreq_polarity_high) -- devflags |= ISP1760_FLAG_DREQ_POL_HIGH; -+ } else { -+ pr_err("isp1760: no platform data\n"); -+ return -ENXIO; - } - - ret = isp1760_register(mem_res, irq_res->start, irqflags, &pdev->dev, --- -2.33.0 - diff --git a/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0005-usb-isp1760-hcd-refactor-mempool-config-and-setup.patch b/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0005-usb-isp1760-hcd-refactor-mempool-config-and-setup.patch deleted file mode 100644 index 238c1bd4..00000000 --- a/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0005-usb-isp1760-hcd-refactor-mempool-config-and-setup.patch +++ /dev/null @@ -1,304 +0,0 @@ -Upstream-Status: Accepted [merged with kernel 5.14.9] -Signed-off-by: Arpita S.K - -From a74f639c5b5618e2c9f311c93bc3e7405de8ca85 Mon Sep 17 00:00:00 2001 -From: Rui Miguel Silva -Date: Thu, 13 May 2021 09:47:13 +0100 -Subject: [PATCH 05/23] usb: isp1760: hcd: refactor mempool config and setup - -In preparation to support other family member IP, which may have -different memory layout. Drop macros and setup a configuration -struct. - -Signed-off-by: Rui Miguel Silva -Link: https://lore.kernel.org/r/20210513084717.2487366-6-rui.silva@linaro.org -Signed-off-by: Greg Kroah-Hartman ---- - drivers/usb/isp1760/isp1760-core.c | 21 ++++++++ - drivers/usb/isp1760/isp1760-hcd.c | 83 ++++++++++++++++++++---------- - drivers/usb/isp1760/isp1760-hcd.h | 37 ++++++------- - 3 files changed, 92 insertions(+), 49 deletions(-) - -diff --git a/drivers/usb/isp1760/isp1760-core.c b/drivers/usb/isp1760/isp1760-core.c -index c79ba98df9f9..35a7667e411c 100644 ---- a/drivers/usb/isp1760/isp1760-core.c -+++ b/drivers/usb/isp1760/isp1760-core.c -@@ -101,6 +101,25 @@ void isp1760_set_pullup(struct isp1760_device *isp, bool enable) - isp1760_field_set(udc->fields, HW_DP_PULLUP_CLEAR); - } - -+/* -+ * 60kb divided in: -+ * - 32 blocks @ 256 bytes -+ * - 20 blocks @ 1024 bytes -+ * - 4 blocks @ 8192 bytes -+ */ -+static const struct isp1760_memory_layout isp176x_memory_conf = { -+ .blocks[0] = 32, -+ .blocks_size[0] = 256, -+ .blocks[1] = 20, -+ .blocks_size[1] = 1024, -+ .blocks[2] = 4, -+ .blocks_size[2] = 8192, -+ -+ .ptd_num = 32, -+ .payload_blocks = 32 + 20 + 4, -+ .payload_area_size = 0xf000, -+}; -+ - static const struct regmap_range isp176x_hc_volatile_ranges[] = { - regmap_reg_range(ISP176x_HC_USBCMD, ISP176x_HC_ATL_PTD_LASTPTD), - regmap_reg_range(ISP176x_HC_BUFFER_STATUS, ISP176x_HC_MEMORY), -@@ -302,6 +321,8 @@ int isp1760_register(struct resource *mem, int irq, unsigned long irqflags, - udc->fields[i] = f; - } - -+ hcd->memory_layout = &isp176x_memory_conf; -+ - isp1760_init_core(isp); - - if (IS_ENABLED(CONFIG_USB_ISP1760_HCD) && !usb_disabled()) { -diff --git a/drivers/usb/isp1760/isp1760-hcd.c b/drivers/usb/isp1760/isp1760-hcd.c -index 2cc0555e029d..a65f5f917ebe 100644 ---- a/drivers/usb/isp1760/isp1760-hcd.c -+++ b/drivers/usb/isp1760/isp1760-hcd.c -@@ -358,39 +358,29 @@ static void ptd_write(void __iomem *base, u32 ptd_offset, u32 slot, - /* memory management of the 60kb on the chip from 0x1000 to 0xffff */ - static void init_memory(struct isp1760_hcd *priv) - { -- int i, curr; -+ const struct isp1760_memory_layout *mem = priv->memory_layout; -+ int i, j, curr; - u32 payload_addr; - - payload_addr = PAYLOAD_OFFSET; -- for (i = 0; i < BLOCK_1_NUM; i++) { -- priv->memory_pool[i].start = payload_addr; -- priv->memory_pool[i].size = BLOCK_1_SIZE; -- priv->memory_pool[i].free = 1; -- payload_addr += priv->memory_pool[i].size; -- } -- -- curr = i; -- for (i = 0; i < BLOCK_2_NUM; i++) { -- priv->memory_pool[curr + i].start = payload_addr; -- priv->memory_pool[curr + i].size = BLOCK_2_SIZE; -- priv->memory_pool[curr + i].free = 1; -- payload_addr += priv->memory_pool[curr + i].size; -- } - -- curr = i; -- for (i = 0; i < BLOCK_3_NUM; i++) { -- priv->memory_pool[curr + i].start = payload_addr; -- priv->memory_pool[curr + i].size = BLOCK_3_SIZE; -- priv->memory_pool[curr + i].free = 1; -- payload_addr += priv->memory_pool[curr + i].size; -+ for (i = 0, curr = 0; i < ARRAY_SIZE(mem->blocks); i++) { -+ for (j = 0; j < mem->blocks[i]; j++, curr++) { -+ priv->memory_pool[curr + j].start = payload_addr; -+ priv->memory_pool[curr + j].size = mem->blocks_size[i]; -+ priv->memory_pool[curr + j].free = 1; -+ payload_addr += priv->memory_pool[curr + j].size; -+ } - } - -- WARN_ON(payload_addr - priv->memory_pool[0].start > PAYLOAD_AREA_SIZE); -+ WARN_ON(payload_addr - priv->memory_pool[0].start > -+ mem->payload_area_size); - } - - static void alloc_mem(struct usb_hcd *hcd, struct isp1760_qtd *qtd) - { - struct isp1760_hcd *priv = hcd_to_priv(hcd); -+ const struct isp1760_memory_layout *mem = priv->memory_layout; - int i; - - WARN_ON(qtd->payload_addr); -@@ -398,7 +388,7 @@ static void alloc_mem(struct usb_hcd *hcd, struct isp1760_qtd *qtd) - if (!qtd->length) - return; - -- for (i = 0; i < BLOCKS; i++) { -+ for (i = 0; i < mem->payload_blocks; i++) { - if (priv->memory_pool[i].size >= qtd->length && - priv->memory_pool[i].free) { - priv->memory_pool[i].free = 0; -@@ -411,12 +401,13 @@ static void alloc_mem(struct usb_hcd *hcd, struct isp1760_qtd *qtd) - static void free_mem(struct usb_hcd *hcd, struct isp1760_qtd *qtd) - { - struct isp1760_hcd *priv = hcd_to_priv(hcd); -+ const struct isp1760_memory_layout *mem = priv->memory_layout; - int i; - - if (!qtd->payload_addr) - return; - -- for (i = 0; i < BLOCKS; i++) { -+ for (i = 0; i < mem->payload_blocks; i++) { - if (priv->memory_pool[i].start == qtd->payload_addr) { - WARN_ON(priv->memory_pool[i].free); - priv->memory_pool[i].free = 1; -@@ -1407,8 +1398,6 @@ static int qtd_fill(struct isp1760_qtd *qtd, void *databuffer, size_t len) - { - qtd->data_buffer = databuffer; - -- if (len > MAX_PAYLOAD_SIZE) -- len = MAX_PAYLOAD_SIZE; - qtd->length = len; - - return qtd->length; -@@ -1432,6 +1421,8 @@ static void qtd_list_free(struct list_head *qtd_list) - static void packetize_urb(struct usb_hcd *hcd, - struct urb *urb, struct list_head *head, gfp_t flags) - { -+ struct isp1760_hcd *priv = hcd_to_priv(hcd); -+ const struct isp1760_memory_layout *mem = priv->memory_layout; - struct isp1760_qtd *qtd; - void *buf; - int len, maxpacketsize; -@@ -1484,6 +1475,10 @@ static void packetize_urb(struct usb_hcd *hcd, - qtd = qtd_alloc(flags, urb, packet_type); - if (!qtd) - goto cleanup; -+ -+ if (len > mem->blocks_size[ISP176x_BLOCK_NUM - 1]) -+ len = mem->blocks_size[ISP176x_BLOCK_NUM - 1]; -+ - this_qtd_len = qtd_fill(qtd, buf, len); - list_add_tail(&qtd->qtd_list, head); - -@@ -2212,6 +2207,7 @@ int isp1760_hcd_register(struct isp1760_hcd *priv, struct resource *mem, - int irq, unsigned long irqflags, - struct device *dev) - { -+ const struct isp1760_memory_layout *mem_layout = priv->memory_layout; - struct usb_hcd *hcd; - int ret; - -@@ -2223,6 +2219,28 @@ int isp1760_hcd_register(struct isp1760_hcd *priv, struct resource *mem, - - priv->hcd = hcd; - -+ priv->memory_pool = kcalloc(mem_layout->payload_blocks, -+ sizeof(struct isp1760_memory_chunk), -+ GFP_KERNEL); -+ if (!priv->memory_pool) { -+ ret = -ENOMEM; -+ goto put_hcd; -+ } -+ -+ priv->atl_slots = kcalloc(mem_layout->ptd_num, -+ sizeof(struct isp1760_slotinfo), GFP_KERNEL); -+ if (!priv->atl_slots) { -+ ret = -ENOMEM; -+ goto free_mem_pool; -+ } -+ -+ priv->int_slots = kcalloc(mem_layout->ptd_num, -+ sizeof(struct isp1760_slotinfo), GFP_KERNEL); -+ if (!priv->int_slots) { -+ ret = -ENOMEM; -+ goto free_atl_slots; -+ } -+ - init_memory(priv); - - hcd->irq = irq; -@@ -2234,13 +2252,19 @@ int isp1760_hcd_register(struct isp1760_hcd *priv, struct resource *mem, - - ret = usb_add_hcd(hcd, irq, irqflags); - if (ret) -- goto error; -+ goto free_int_slots; - - device_wakeup_enable(hcd->self.controller); - - return 0; - --error: -+free_int_slots: -+ kfree(priv->int_slots); -+free_atl_slots: -+ kfree(priv->atl_slots); -+free_mem_pool: -+ kfree(priv->memory_pool); -+put_hcd: - usb_put_hcd(hcd); - return ret; - } -@@ -2252,4 +2276,7 @@ void isp1760_hcd_unregister(struct isp1760_hcd *priv) - - usb_remove_hcd(priv->hcd); - usb_put_hcd(priv->hcd); -+ kfree(priv->atl_slots); -+ kfree(priv->int_slots); -+ kfree(priv->memory_pool); - } -diff --git a/drivers/usb/isp1760/isp1760-hcd.h b/drivers/usb/isp1760/isp1760-hcd.h -index 34e1899e52c4..9d2427ce3f1a 100644 ---- a/drivers/usb/isp1760/isp1760-hcd.h -+++ b/drivers/usb/isp1760/isp1760-hcd.h -@@ -12,24 +12,6 @@ struct isp1760_qtd; - struct resource; - struct usb_hcd; - --/* -- * 60kb divided in: -- * - 32 blocks @ 256 bytes -- * - 20 blocks @ 1024 bytes -- * - 4 blocks @ 8192 bytes -- */ -- --#define BLOCK_1_NUM 32 --#define BLOCK_2_NUM 20 --#define BLOCK_3_NUM 4 -- --#define BLOCK_1_SIZE 256 --#define BLOCK_2_SIZE 1024 --#define BLOCK_3_SIZE 8192 --#define BLOCKS (BLOCK_1_NUM + BLOCK_2_NUM + BLOCK_3_NUM) --#define MAX_PAYLOAD_SIZE BLOCK_3_SIZE --#define PAYLOAD_AREA_SIZE 0xf000 -- - struct isp1760_slotinfo { - struct isp1760_qh *qh; - struct isp1760_qtd *qtd; -@@ -37,6 +19,17 @@ struct isp1760_slotinfo { - }; - - /* chip memory management */ -+#define ISP176x_BLOCK_NUM 3 -+ -+struct isp1760_memory_layout { -+ unsigned int blocks[ISP176x_BLOCK_NUM]; -+ unsigned int blocks_size[ISP176x_BLOCK_NUM]; -+ -+ unsigned int ptd_num; -+ unsigned int payload_blocks; -+ unsigned int payload_area_size; -+}; -+ - struct isp1760_memory_chunk { - unsigned int start; - unsigned int size; -@@ -58,12 +51,14 @@ struct isp1760_hcd { - struct regmap *regs; - struct regmap_field *fields[HC_FIELD_MAX]; - -+ const struct isp1760_memory_layout *memory_layout; -+ - spinlock_t lock; -- struct isp1760_slotinfo atl_slots[32]; -+ struct isp1760_slotinfo *atl_slots; - int atl_done_map; -- struct isp1760_slotinfo int_slots[32]; -+ struct isp1760_slotinfo *int_slots; - int int_done_map; -- struct isp1760_memory_chunk memory_pool[BLOCKS]; -+ struct isp1760_memory_chunk *memory_pool; - struct list_head qh_list[QH_END]; - - /* periodic schedule support */ --- -2.33.0 - diff --git a/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0006-usb-isp1760-use-dr_mode-binding.patch b/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0006-usb-isp1760-use-dr_mode-binding.patch deleted file mode 100644 index e6965350..00000000 --- a/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0006-usb-isp1760-use-dr_mode-binding.patch +++ /dev/null @@ -1,78 +0,0 @@ -Upstream-Status: Accepted [merged with kernel 5.14.9] -Signed-off-by: Arpita S.K - -From 3eb96e04be9918afa54b64fac943de86a9798bda Mon Sep 17 00:00:00 2001 -From: Rui Miguel Silva -Date: Thu, 13 May 2021 09:47:14 +0100 -Subject: [PATCH 06/23] usb: isp1760: use dr_mode binding - -There is already a binding to describe the dual role mode (dr_mode), -use that instead of defining a new one (port1-otg). - -Update driver code and devicetree files that use that port1-otg -binding. - -Signed-off-by: Rui Miguel Silva -Link: https://lore.kernel.org/r/20210513084717.2487366-7-rui.silva@linaro.org -Signed-off-by: Greg Kroah-Hartman ---- - drivers/usb/isp1760/isp1760-core.c | 3 +-- - drivers/usb/isp1760/isp1760-core.h | 2 +- - drivers/usb/isp1760/isp1760-if.c | 5 +++-- - 3 files changed, 5 insertions(+), 5 deletions(-) - -diff --git a/drivers/usb/isp1760/isp1760-core.c b/drivers/usb/isp1760/isp1760-core.c -index 35a7667e411c..0aeeb12d3bfe 100644 ---- a/drivers/usb/isp1760/isp1760-core.c -+++ b/drivers/usb/isp1760/isp1760-core.c -@@ -73,10 +73,9 @@ static void isp1760_init_core(struct isp1760_device *isp) - * on ISP1761. - * - * TODO: Really support OTG. For now we configure port 1 in device mode -- * when OTG is requested. - */ - if ((isp->devflags & ISP1760_FLAG_ISP1761) && -- (isp->devflags & ISP1760_FLAG_OTG_EN)) { -+ (isp->devflags & ISP1760_FLAG_PERIPHERAL_EN)) { - isp1760_field_set(hcd->fields, HW_DM_PULLDOWN); - isp1760_field_set(hcd->fields, HW_DP_PULLDOWN); - isp1760_field_set(hcd->fields, HW_OTG_DISABLE); -diff --git a/drivers/usb/isp1760/isp1760-core.h b/drivers/usb/isp1760/isp1760-core.h -index 8fec6395f19f..7a6755d68d41 100644 ---- a/drivers/usb/isp1760/isp1760-core.h -+++ b/drivers/usb/isp1760/isp1760-core.h -@@ -28,7 +28,7 @@ struct gpio_desc; - * a sane default configuration. - */ - #define ISP1760_FLAG_BUS_WIDTH_16 0x00000002 /* 16-bit data bus width */ --#define ISP1760_FLAG_OTG_EN 0x00000004 /* Port 1 supports OTG */ -+#define ISP1760_FLAG_PERIPHERAL_EN 0x00000004 /* Port 1 supports Peripheral mode*/ - #define ISP1760_FLAG_ANALOG_OC 0x00000008 /* Analog overcurrent */ - #define ISP1760_FLAG_DACK_POL_HIGH 0x00000010 /* DACK active high */ - #define ISP1760_FLAG_DREQ_POL_HIGH 0x00000020 /* DREQ active high */ -diff --git a/drivers/usb/isp1760/isp1760-if.c b/drivers/usb/isp1760/isp1760-if.c -index fb6701608cd8..cb3e4d782315 100644 ---- a/drivers/usb/isp1760/isp1760-if.c -+++ b/drivers/usb/isp1760/isp1760-if.c -@@ -17,6 +17,7 @@ - #include - #include - #include -+#include - - #include "isp1760-core.h" - #include "isp1760-regs.h" -@@ -213,8 +214,8 @@ static int isp1760_plat_probe(struct platform_device *pdev) - if (bus_width == 16) - devflags |= ISP1760_FLAG_BUS_WIDTH_16; - -- if (of_property_read_bool(dp, "port1-otg")) -- devflags |= ISP1760_FLAG_OTG_EN; -+ if (usb_get_dr_mode(&pdev->dev) == USB_DR_MODE_PERIPHERAL) -+ devflags |= ISP1760_FLAG_PERIPHERAL_EN; - - if (of_property_read_bool(dp, "analog-oc")) - devflags |= ISP1760_FLAG_ANALOG_OC; --- -2.33.0 - diff --git a/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0007-usb-isp1760-add-support-for-isp1763.patch b/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0007-usb-isp1760-add-support-for-isp1763.patch deleted file mode 100644 index 78a483c7..00000000 --- a/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0007-usb-isp1760-add-support-for-isp1763.patch +++ /dev/null @@ -1,1894 +0,0 @@ -Upstream-Status: Accepted [merged with kernel 5.14.9] -Signed-off-by: Arpita S.K - -From 60d789f3bfbb7428e6ba2949de70a6db8e12e8fa Mon Sep 17 00:00:00 2001 -From: Rui Miguel Silva -Date: Thu, 13 May 2021 09:47:15 +0100 -Subject: [PATCH 07/23] usb: isp1760: add support for isp1763 - -isp1763 have some differences from the isp1760, 8 bit address for -registers and 16 bit for values, no bulk access to memory addresses, -16 PTD's instead of 32. - -Following the regmap work done before add the registers, memory access -and add the functions to support differences in setup sequences. - -Signed-off-by: Rui Miguel Silva -Link: https://lore.kernel.org/r/20210513084717.2487366-8-rui.silva@linaro.org -Signed-off-by: Greg Kroah-Hartman ---- - drivers/usb/isp1760/Kconfig | 4 +- - drivers/usb/isp1760/isp1760-core.c | 301 ++++++++++++-- - drivers/usb/isp1760/isp1760-core.h | 4 + - drivers/usb/isp1760/isp1760-hcd.c | 627 ++++++++++++++++++++++------- - drivers/usb/isp1760/isp1760-hcd.h | 6 +- - drivers/usb/isp1760/isp1760-if.c | 12 +- - drivers/usb/isp1760/isp1760-regs.h | 95 ++++- - drivers/usb/isp1760/isp1760-udc.c | 2 + - drivers/usb/isp1760/isp1760-udc.h | 2 + - 9 files changed, 849 insertions(+), 204 deletions(-) - -diff --git a/drivers/usb/isp1760/Kconfig b/drivers/usb/isp1760/Kconfig -index d23853f601b1..2ed2b73291d1 100644 ---- a/drivers/usb/isp1760/Kconfig -+++ b/drivers/usb/isp1760/Kconfig -@@ -1,11 +1,11 @@ - # SPDX-License-Identifier: GPL-2.0 - - config USB_ISP1760 -- tristate "NXP ISP 1760/1761 support" -+ tristate "NXP ISP 1760/1761/1763 support" - depends on USB || USB_GADGET - select REGMAP_MMIO - help -- Say Y or M here if your system as an ISP1760 USB host controller -+ Say Y or M here if your system as an ISP1760/1763 USB host controller - or an ISP1761 USB dual-role controller. - - This driver does not support isochronous transfers or OTG. -diff --git a/drivers/usb/isp1760/isp1760-core.c b/drivers/usb/isp1760/isp1760-core.c -index 0aeeb12d3bfe..1d847f13abab 100644 ---- a/drivers/usb/isp1760/isp1760-core.c -+++ b/drivers/usb/isp1760/isp1760-core.c -@@ -2,12 +2,14 @@ - /* - * Driver for the NXP ISP1760 chip - * -+ * Copyright 2021 Linaro, Rui Miguel Silva - * Copyright 2014 Laurent Pinchart - * Copyright 2007 Sebastian Siewior - * - * Contacts: - * Sebastian Siewior - * Laurent Pinchart -+ * Rui Miguel Silva - */ - - #include -@@ -24,7 +26,7 @@ - #include "isp1760-regs.h" - #include "isp1760-udc.h" - --static void isp1760_init_core(struct isp1760_device *isp) -+static int isp1760_init_core(struct isp1760_device *isp) - { - struct isp1760_hcd *hcd = &isp->hcd; - struct isp1760_udc *udc = &isp->udc; -@@ -44,8 +46,15 @@ static void isp1760_init_core(struct isp1760_device *isp) - msleep(100); - - /* Setup HW Mode Control: This assumes a level active-low interrupt */ -+ if ((isp->devflags & ISP1760_FLAG_ANALOG_OC) && hcd->is_isp1763) { -+ dev_err(isp->dev, "isp1763 analog overcurrent not available\n"); -+ return -EINVAL; -+ } -+ - if (isp->devflags & ISP1760_FLAG_BUS_WIDTH_16) - isp1760_field_clear(hcd->fields, HW_DATA_BUS_WIDTH); -+ if (isp->devflags & ISP1760_FLAG_BUS_WIDTH_8) -+ isp1760_field_set(hcd->fields, HW_DATA_BUS_WIDTH); - if (isp->devflags & ISP1760_FLAG_ANALOG_OC) - isp1760_field_set(hcd->fields, HW_ANA_DIGI_OC); - if (isp->devflags & ISP1760_FLAG_DACK_POL_HIGH) -@@ -85,9 +94,14 @@ static void isp1760_init_core(struct isp1760_device *isp) - isp1760_field_set(hcd->fields, HW_SEL_CP_EXT); - } - -- dev_info(isp->dev, "bus width: %u, oc: %s\n", -+ dev_info(isp->dev, "%s bus width: %u, oc: %s\n", -+ hcd->is_isp1763 ? "isp1763" : "isp1760", -+ isp->devflags & ISP1760_FLAG_BUS_WIDTH_8 ? 8 : - isp->devflags & ISP1760_FLAG_BUS_WIDTH_16 ? 16 : 32, -+ hcd->is_isp1763 ? "not available" : - isp->devflags & ISP1760_FLAG_ANALOG_OC ? "analog" : "digital"); -+ -+ return 0; - } - - void isp1760_set_pullup(struct isp1760_device *isp, bool enable) -@@ -101,6 +115,8 @@ void isp1760_set_pullup(struct isp1760_device *isp, bool enable) - } - - /* -+ * ISP1760/61: -+ * - * 60kb divided in: - * - 32 blocks @ 256 bytes - * - 20 blocks @ 1024 bytes -@@ -114,15 +130,36 @@ static const struct isp1760_memory_layout isp176x_memory_conf = { - .blocks[2] = 4, - .blocks_size[2] = 8192, - -- .ptd_num = 32, -+ .slot_num = 32, - .payload_blocks = 32 + 20 + 4, - .payload_area_size = 0xf000, - }; - -+/* -+ * ISP1763: -+ * -+ * 20kb divided in: -+ * - 8 blocks @ 256 bytes -+ * - 2 blocks @ 1024 bytes -+ * - 4 blocks @ 4096 bytes -+ */ -+static const struct isp1760_memory_layout isp1763_memory_conf = { -+ .blocks[0] = 8, -+ .blocks_size[0] = 256, -+ .blocks[1] = 2, -+ .blocks_size[1] = 1024, -+ .blocks[2] = 4, -+ .blocks_size[2] = 4096, -+ -+ .slot_num = 16, -+ .payload_blocks = 8 + 2 + 4, -+ .payload_area_size = 0x5000, -+}; -+ - static const struct regmap_range isp176x_hc_volatile_ranges[] = { - regmap_reg_range(ISP176x_HC_USBCMD, ISP176x_HC_ATL_PTD_LASTPTD), - regmap_reg_range(ISP176x_HC_BUFFER_STATUS, ISP176x_HC_MEMORY), -- regmap_reg_range(ISP176x_HC_INTERRUPT, ISP176x_HC_ATL_IRQ_MASK_AND), -+ regmap_reg_range(ISP176x_HC_INTERRUPT, ISP176x_HC_OTG_CTRL_CLEAR), - }; - - static const struct regmap_access_table isp176x_hc_volatile_table = { -@@ -130,13 +167,13 @@ static const struct regmap_access_table isp176x_hc_volatile_table = { - .n_yes_ranges = ARRAY_SIZE(isp176x_hc_volatile_ranges), - }; - --static struct regmap_config isp1760_hc_regmap_conf = { -+static const struct regmap_config isp1760_hc_regmap_conf = { - .name = "isp1760-hc", - .reg_bits = 16, - .reg_stride = 4, - .val_bits = 32, - .fast_io = true, -- .max_register = ISP176x_HC_MEMORY, -+ .max_register = ISP176x_HC_OTG_CTRL_CLEAR, - .volatile_table = &isp176x_hc_volatile_table, - }; - -@@ -151,6 +188,15 @@ static const struct reg_field isp1760_hc_reg_fields[] = { - [STS_PCD] = REG_FIELD(ISP176x_HC_USBSTS, 2, 2), - [HC_FRINDEX] = REG_FIELD(ISP176x_HC_FRINDEX, 0, 13), - [FLAG_CF] = REG_FIELD(ISP176x_HC_CONFIGFLAG, 0, 0), -+ [HC_ISO_PTD_DONEMAP] = REG_FIELD(ISP176x_HC_ISO_PTD_DONEMAP, 0, 31), -+ [HC_ISO_PTD_SKIPMAP] = REG_FIELD(ISP176x_HC_ISO_PTD_SKIPMAP, 0, 31), -+ [HC_ISO_PTD_LASTPTD] = REG_FIELD(ISP176x_HC_ISO_PTD_LASTPTD, 0, 31), -+ [HC_INT_PTD_DONEMAP] = REG_FIELD(ISP176x_HC_INT_PTD_DONEMAP, 0, 31), -+ [HC_INT_PTD_SKIPMAP] = REG_FIELD(ISP176x_HC_INT_PTD_SKIPMAP, 0, 31), -+ [HC_INT_PTD_LASTPTD] = REG_FIELD(ISP176x_HC_INT_PTD_LASTPTD, 0, 31), -+ [HC_ATL_PTD_DONEMAP] = REG_FIELD(ISP176x_HC_ATL_PTD_DONEMAP, 0, 31), -+ [HC_ATL_PTD_SKIPMAP] = REG_FIELD(ISP176x_HC_ATL_PTD_SKIPMAP, 0, 31), -+ [HC_ATL_PTD_LASTPTD] = REG_FIELD(ISP176x_HC_ATL_PTD_LASTPTD, 0, 31), - [PORT_OWNER] = REG_FIELD(ISP176x_HC_PORTSC1, 13, 13), - [PORT_POWER] = REG_FIELD(ISP176x_HC_PORTSC1, 12, 12), - [PORT_LSTATUS] = REG_FIELD(ISP176x_HC_PORTSC1, 10, 11), -@@ -169,18 +215,135 @@ static const struct reg_field isp1760_hc_reg_fields[] = { - [HW_INTR_HIGH_ACT] = REG_FIELD(ISP176x_HC_HW_MODE_CTRL, 2, 2), - [HW_INTR_EDGE_TRIG] = REG_FIELD(ISP176x_HC_HW_MODE_CTRL, 1, 1), - [HW_GLOBAL_INTR_EN] = REG_FIELD(ISP176x_HC_HW_MODE_CTRL, 0, 0), -+ [HC_CHIP_REV] = REG_FIELD(ISP176x_HC_CHIP_ID, 16, 31), -+ [HC_CHIP_ID_HIGH] = REG_FIELD(ISP176x_HC_CHIP_ID, 8, 15), -+ [HC_CHIP_ID_LOW] = REG_FIELD(ISP176x_HC_CHIP_ID, 0, 7), -+ [HC_SCRATCH] = REG_FIELD(ISP176x_HC_SCRATCH, 0, 31), - [SW_RESET_RESET_ALL] = REG_FIELD(ISP176x_HC_RESET, 0, 0), -+ [ISO_BUF_FILL] = REG_FIELD(ISP176x_HC_BUFFER_STATUS, 2, 2), - [INT_BUF_FILL] = REG_FIELD(ISP176x_HC_BUFFER_STATUS, 1, 1), - [ATL_BUF_FILL] = REG_FIELD(ISP176x_HC_BUFFER_STATUS, 0, 0), - [MEM_BANK_SEL] = REG_FIELD(ISP176x_HC_MEMORY, 16, 17), - [MEM_START_ADDR] = REG_FIELD(ISP176x_HC_MEMORY, 0, 15), -- [HC_INT_ENABLE] = REG_FIELD(ISP176x_HC_INTERRUPT_ENABLE, 7, 8), -+ [HC_INTERRUPT] = REG_FIELD(ISP176x_HC_INTERRUPT, 0, 9), -+ [HC_ATL_IRQ_ENABLE] = REG_FIELD(ISP176x_HC_INTERRUPT_ENABLE, 8, 8), -+ [HC_INT_IRQ_ENABLE] = REG_FIELD(ISP176x_HC_INTERRUPT_ENABLE, 7, 7), -+ [HC_ISO_IRQ_MASK_OR] = REG_FIELD(ISP176x_HC_ISO_IRQ_MASK_OR, 0, 31), -+ [HC_INT_IRQ_MASK_OR] = REG_FIELD(ISP176x_HC_INT_IRQ_MASK_OR, 0, 31), -+ [HC_ATL_IRQ_MASK_OR] = REG_FIELD(ISP176x_HC_ATL_IRQ_MASK_OR, 0, 31), -+ [HC_ISO_IRQ_MASK_AND] = REG_FIELD(ISP176x_HC_ISO_IRQ_MASK_AND, 0, 31), -+ [HC_INT_IRQ_MASK_AND] = REG_FIELD(ISP176x_HC_INT_IRQ_MASK_AND, 0, 31), -+ [HC_ATL_IRQ_MASK_AND] = REG_FIELD(ISP176x_HC_ATL_IRQ_MASK_AND, 0, 31), -+ [HW_OTG_DISABLE] = REG_FIELD(ISP176x_HC_OTG_CTRL_SET, 10, 10), -+ [HW_SW_SEL_HC_DC] = REG_FIELD(ISP176x_HC_OTG_CTRL_SET, 7, 7), -+ [HW_VBUS_DRV] = REG_FIELD(ISP176x_HC_OTG_CTRL_SET, 4, 4), -+ [HW_SEL_CP_EXT] = REG_FIELD(ISP176x_HC_OTG_CTRL_SET, 3, 3), -+ [HW_DM_PULLDOWN] = REG_FIELD(ISP176x_HC_OTG_CTRL_SET, 2, 2), -+ [HW_DP_PULLDOWN] = REG_FIELD(ISP176x_HC_OTG_CTRL_SET, 1, 1), -+ [HW_DP_PULLUP] = REG_FIELD(ISP176x_HC_OTG_CTRL_SET, 0, 0), -+ [HW_OTG_DISABLE_CLEAR] = REG_FIELD(ISP176x_HC_OTG_CTRL_CLEAR, 10, 10), -+ [HW_SW_SEL_HC_DC_CLEAR] = REG_FIELD(ISP176x_HC_OTG_CTRL_CLEAR, 7, 7), -+ [HW_VBUS_DRV_CLEAR] = REG_FIELD(ISP176x_HC_OTG_CTRL_CLEAR, 4, 4), -+ [HW_SEL_CP_EXT_CLEAR] = REG_FIELD(ISP176x_HC_OTG_CTRL_CLEAR, 3, 3), -+ [HW_DM_PULLDOWN_CLEAR] = REG_FIELD(ISP176x_HC_OTG_CTRL_CLEAR, 2, 2), -+ [HW_DP_PULLDOWN_CLEAR] = REG_FIELD(ISP176x_HC_OTG_CTRL_CLEAR, 1, 1), -+ [HW_DP_PULLUP_CLEAR] = REG_FIELD(ISP176x_HC_OTG_CTRL_CLEAR, 0, 0), -+}; -+ -+static const struct reg_field isp1763_hc_reg_fields[] = { -+ [CMD_LRESET] = REG_FIELD(ISP1763_HC_USBCMD, 7, 7), -+ [CMD_RESET] = REG_FIELD(ISP1763_HC_USBCMD, 1, 1), -+ [CMD_RUN] = REG_FIELD(ISP1763_HC_USBCMD, 0, 0), -+ [STS_PCD] = REG_FIELD(ISP1763_HC_USBSTS, 2, 2), -+ [HC_FRINDEX] = REG_FIELD(ISP1763_HC_FRINDEX, 0, 13), -+ [FLAG_CF] = REG_FIELD(ISP1763_HC_CONFIGFLAG, 0, 0), -+ [HC_ISO_PTD_DONEMAP] = REG_FIELD(ISP1763_HC_ISO_PTD_DONEMAP, 0, 15), -+ [HC_ISO_PTD_SKIPMAP] = REG_FIELD(ISP1763_HC_ISO_PTD_SKIPMAP, 0, 15), -+ [HC_ISO_PTD_LASTPTD] = REG_FIELD(ISP1763_HC_ISO_PTD_LASTPTD, 0, 15), -+ [HC_INT_PTD_DONEMAP] = REG_FIELD(ISP1763_HC_INT_PTD_DONEMAP, 0, 15), -+ [HC_INT_PTD_SKIPMAP] = REG_FIELD(ISP1763_HC_INT_PTD_SKIPMAP, 0, 15), -+ [HC_INT_PTD_LASTPTD] = REG_FIELD(ISP1763_HC_INT_PTD_LASTPTD, 0, 15), -+ [HC_ATL_PTD_DONEMAP] = REG_FIELD(ISP1763_HC_ATL_PTD_DONEMAP, 0, 15), -+ [HC_ATL_PTD_SKIPMAP] = REG_FIELD(ISP1763_HC_ATL_PTD_SKIPMAP, 0, 15), -+ [HC_ATL_PTD_LASTPTD] = REG_FIELD(ISP1763_HC_ATL_PTD_LASTPTD, 0, 15), -+ [PORT_OWNER] = REG_FIELD(ISP1763_HC_PORTSC1, 13, 13), -+ [PORT_POWER] = REG_FIELD(ISP1763_HC_PORTSC1, 12, 12), -+ [PORT_LSTATUS] = REG_FIELD(ISP1763_HC_PORTSC1, 10, 11), -+ [PORT_RESET] = REG_FIELD(ISP1763_HC_PORTSC1, 8, 8), -+ [PORT_SUSPEND] = REG_FIELD(ISP1763_HC_PORTSC1, 7, 7), -+ [PORT_RESUME] = REG_FIELD(ISP1763_HC_PORTSC1, 6, 6), -+ [PORT_PE] = REG_FIELD(ISP1763_HC_PORTSC1, 2, 2), -+ [PORT_CSC] = REG_FIELD(ISP1763_HC_PORTSC1, 1, 1), -+ [PORT_CONNECT] = REG_FIELD(ISP1763_HC_PORTSC1, 0, 0), -+ [HW_DATA_BUS_WIDTH] = REG_FIELD(ISP1763_HC_HW_MODE_CTRL, 4, 4), -+ [HW_DACK_POL_HIGH] = REG_FIELD(ISP1763_HC_HW_MODE_CTRL, 6, 6), -+ [HW_DREQ_POL_HIGH] = REG_FIELD(ISP1763_HC_HW_MODE_CTRL, 5, 5), -+ [HW_INTF_LOCK] = REG_FIELD(ISP1763_HC_HW_MODE_CTRL, 3, 3), -+ [HW_INTR_HIGH_ACT] = REG_FIELD(ISP1763_HC_HW_MODE_CTRL, 2, 2), -+ [HW_INTR_EDGE_TRIG] = REG_FIELD(ISP1763_HC_HW_MODE_CTRL, 1, 1), -+ [HW_GLOBAL_INTR_EN] = REG_FIELD(ISP1763_HC_HW_MODE_CTRL, 0, 0), -+ [SW_RESET_RESET_ATX] = REG_FIELD(ISP1763_HC_RESET, 3, 3), -+ [SW_RESET_RESET_ALL] = REG_FIELD(ISP1763_HC_RESET, 0, 0), -+ [HC_CHIP_ID_HIGH] = REG_FIELD(ISP1763_HC_CHIP_ID, 0, 15), -+ [HC_CHIP_ID_LOW] = REG_FIELD(ISP1763_HC_CHIP_REV, 8, 15), -+ [HC_CHIP_REV] = REG_FIELD(ISP1763_HC_CHIP_REV, 0, 7), -+ [HC_SCRATCH] = REG_FIELD(ISP1763_HC_SCRATCH, 0, 15), -+ [ISO_BUF_FILL] = REG_FIELD(ISP1763_HC_BUFFER_STATUS, 2, 2), -+ [INT_BUF_FILL] = REG_FIELD(ISP1763_HC_BUFFER_STATUS, 1, 1), -+ [ATL_BUF_FILL] = REG_FIELD(ISP1763_HC_BUFFER_STATUS, 0, 0), -+ [MEM_START_ADDR] = REG_FIELD(ISP1763_HC_MEMORY, 0, 15), -+ [HC_DATA] = REG_FIELD(ISP1763_HC_DATA, 0, 15), -+ [HC_INTERRUPT] = REG_FIELD(ISP1763_HC_INTERRUPT, 0, 10), -+ [HC_ATL_IRQ_ENABLE] = REG_FIELD(ISP1763_HC_INTERRUPT_ENABLE, 8, 8), -+ [HC_INT_IRQ_ENABLE] = REG_FIELD(ISP1763_HC_INTERRUPT_ENABLE, 7, 7), -+ [HC_ISO_IRQ_MASK_OR] = REG_FIELD(ISP1763_HC_ISO_IRQ_MASK_OR, 0, 15), -+ [HC_INT_IRQ_MASK_OR] = REG_FIELD(ISP1763_HC_INT_IRQ_MASK_OR, 0, 15), -+ [HC_ATL_IRQ_MASK_OR] = REG_FIELD(ISP1763_HC_ATL_IRQ_MASK_OR, 0, 15), -+ [HC_ISO_IRQ_MASK_AND] = REG_FIELD(ISP1763_HC_ISO_IRQ_MASK_AND, 0, 15), -+ [HC_INT_IRQ_MASK_AND] = REG_FIELD(ISP1763_HC_INT_IRQ_MASK_AND, 0, 15), -+ [HC_ATL_IRQ_MASK_AND] = REG_FIELD(ISP1763_HC_ATL_IRQ_MASK_AND, 0, 15), -+ [HW_HC_2_DIS] = REG_FIELD(ISP1763_HC_OTG_CTRL_SET, 15, 15), -+ [HW_OTG_DISABLE] = REG_FIELD(ISP1763_HC_OTG_CTRL_SET, 10, 10), -+ [HW_SW_SEL_HC_DC] = REG_FIELD(ISP1763_HC_OTG_CTRL_SET, 7, 7), -+ [HW_VBUS_DRV] = REG_FIELD(ISP1763_HC_OTG_CTRL_SET, 4, 4), -+ [HW_SEL_CP_EXT] = REG_FIELD(ISP1763_HC_OTG_CTRL_SET, 3, 3), -+ [HW_DM_PULLDOWN] = REG_FIELD(ISP1763_HC_OTG_CTRL_SET, 2, 2), -+ [HW_DP_PULLDOWN] = REG_FIELD(ISP1763_HC_OTG_CTRL_SET, 1, 1), -+ [HW_DP_PULLUP] = REG_FIELD(ISP1763_HC_OTG_CTRL_SET, 0, 0), -+ [HW_HC_2_DIS_CLEAR] = REG_FIELD(ISP1763_HC_OTG_CTRL_CLEAR, 15, 15), -+ [HW_OTG_DISABLE_CLEAR] = REG_FIELD(ISP1763_HC_OTG_CTRL_CLEAR, 10, 10), -+ [HW_SW_SEL_HC_DC_CLEAR] = REG_FIELD(ISP1763_HC_OTG_CTRL_CLEAR, 7, 7), -+ [HW_VBUS_DRV_CLEAR] = REG_FIELD(ISP1763_HC_OTG_CTRL_CLEAR, 4, 4), -+ [HW_SEL_CP_EXT_CLEAR] = REG_FIELD(ISP1763_HC_OTG_CTRL_CLEAR, 3, 3), -+ [HW_DM_PULLDOWN_CLEAR] = REG_FIELD(ISP1763_HC_OTG_CTRL_CLEAR, 2, 2), -+ [HW_DP_PULLDOWN_CLEAR] = REG_FIELD(ISP1763_HC_OTG_CTRL_CLEAR, 1, 1), -+ [HW_DP_PULLUP_CLEAR] = REG_FIELD(ISP1763_HC_OTG_CTRL_CLEAR, 0, 0), -+}; -+ -+static const struct regmap_range isp1763_hc_volatile_ranges[] = { -+ regmap_reg_range(ISP1763_HC_USBCMD, ISP1763_HC_ATL_PTD_LASTPTD), -+ regmap_reg_range(ISP1763_HC_BUFFER_STATUS, ISP1763_HC_DATA), -+ regmap_reg_range(ISP1763_HC_INTERRUPT, ISP1763_HC_OTG_CTRL_CLEAR), -+}; -+ -+static const struct regmap_access_table isp1763_hc_volatile_table = { -+ .yes_ranges = isp1763_hc_volatile_ranges, -+ .n_yes_ranges = ARRAY_SIZE(isp1763_hc_volatile_ranges), -+}; -+ -+static const struct regmap_config isp1763_hc_regmap_conf = { -+ .name = "isp1763-hc", -+ .reg_bits = 8, -+ .reg_stride = 2, -+ .val_bits = 16, -+ .fast_io = true, -+ .max_register = ISP1763_HC_OTG_CTRL_CLEAR, -+ .volatile_table = &isp1763_hc_volatile_table, - }; - - static const struct regmap_range isp176x_dc_volatile_ranges[] = { - regmap_reg_range(ISP176x_DC_EPMAXPKTSZ, ISP176x_DC_EPTYPE), - regmap_reg_range(ISP176x_DC_BUFLEN, ISP176x_DC_EPINDEX), -- regmap_reg_range(ISP1761_DC_OTG_CTRL_SET, ISP1761_DC_OTG_CTRL_CLEAR), - }; - - static const struct regmap_access_table isp176x_dc_volatile_table = { -@@ -188,13 +351,13 @@ static const struct regmap_access_table isp176x_dc_volatile_table = { - .n_yes_ranges = ARRAY_SIZE(isp176x_dc_volatile_ranges), - }; - --static struct regmap_config isp1761_dc_regmap_conf = { -+static const struct regmap_config isp1761_dc_regmap_conf = { - .name = "isp1761-dc", - .reg_bits = 16, - .reg_stride = 4, - .val_bits = 32, - .fast_io = true, -- .max_register = ISP1761_DC_OTG_CTRL_CLEAR, -+ .max_register = ISP176x_DC_TESTMODE, - .volatile_table = &isp176x_dc_volatile_table, - }; - -@@ -236,31 +399,84 @@ static const struct reg_field isp1761_dc_reg_fields[] = { - [DC_ENDPTYP] = REG_FIELD(ISP176x_DC_EPTYPE, 0, 1), - [DC_UFRAMENUM] = REG_FIELD(ISP176x_DC_FRAMENUM, 11, 13), - [DC_FRAMENUM] = REG_FIELD(ISP176x_DC_FRAMENUM, 0, 10), -- [HW_OTG_DISABLE] = REG_FIELD(ISP1761_DC_OTG_CTRL_SET, 10, 10), -- [HW_SW_SEL_HC_DC] = REG_FIELD(ISP1761_DC_OTG_CTRL_SET, 7, 7), -- [HW_VBUS_DRV] = REG_FIELD(ISP1761_DC_OTG_CTRL_SET, 4, 4), -- [HW_SEL_CP_EXT] = REG_FIELD(ISP1761_DC_OTG_CTRL_SET, 3, 3), -- [HW_DM_PULLDOWN] = REG_FIELD(ISP1761_DC_OTG_CTRL_SET, 2, 2), -- [HW_DP_PULLDOWN] = REG_FIELD(ISP1761_DC_OTG_CTRL_SET, 1, 1), -- [HW_DP_PULLUP] = REG_FIELD(ISP1761_DC_OTG_CTRL_SET, 0, 0), -- [HW_OTG_DISABLE_CLEAR] = REG_FIELD(ISP1761_DC_OTG_CTRL_CLEAR, 10, 10), -- [HW_SW_SEL_HC_DC_CLEAR] = REG_FIELD(ISP1761_DC_OTG_CTRL_CLEAR, 7, 7), -- [HW_VBUS_DRV_CLEAR] = REG_FIELD(ISP1761_DC_OTG_CTRL_CLEAR, 4, 4), -- [HW_SEL_CP_EXT_CLEAR] = REG_FIELD(ISP1761_DC_OTG_CTRL_CLEAR, 3, 3), -- [HW_DM_PULLDOWN_CLEAR] = REG_FIELD(ISP1761_DC_OTG_CTRL_CLEAR, 2, 2), -- [HW_DP_PULLDOWN_CLEAR] = REG_FIELD(ISP1761_DC_OTG_CTRL_CLEAR, 1, 1), -- [HW_DP_PULLUP_CLEAR] = REG_FIELD(ISP1761_DC_OTG_CTRL_CLEAR, 0, 0), -+ [DC_CHIP_ID_HIGH] = REG_FIELD(ISP176x_DC_CHIPID, 16, 31), -+ [DC_CHIP_ID_LOW] = REG_FIELD(ISP176x_DC_CHIPID, 0, 15), -+ [DC_SCRATCH] = REG_FIELD(ISP176x_DC_SCRATCH, 0, 15), -+}; -+ -+static const struct regmap_range isp1763_dc_volatile_ranges[] = { -+ regmap_reg_range(ISP1763_DC_EPMAXPKTSZ, ISP1763_DC_EPTYPE), -+ regmap_reg_range(ISP1763_DC_BUFLEN, ISP1763_DC_EPINDEX), -+}; -+ -+static const struct regmap_access_table isp1763_dc_volatile_table = { -+ .yes_ranges = isp1763_dc_volatile_ranges, -+ .n_yes_ranges = ARRAY_SIZE(isp1763_dc_volatile_ranges), -+}; -+ -+static const struct reg_field isp1763_dc_reg_fields[] = { -+ [DC_DEVEN] = REG_FIELD(ISP1763_DC_ADDRESS, 7, 7), -+ [DC_DEVADDR] = REG_FIELD(ISP1763_DC_ADDRESS, 0, 6), -+ [DC_VBUSSTAT] = REG_FIELD(ISP1763_DC_MODE, 8, 8), -+ [DC_SFRESET] = REG_FIELD(ISP1763_DC_MODE, 4, 4), -+ [DC_GLINTENA] = REG_FIELD(ISP1763_DC_MODE, 3, 3), -+ [DC_CDBGMOD_ACK] = REG_FIELD(ISP1763_DC_INTCONF, 6, 6), -+ [DC_DDBGMODIN_ACK] = REG_FIELD(ISP1763_DC_INTCONF, 4, 4), -+ [DC_DDBGMODOUT_ACK] = REG_FIELD(ISP1763_DC_INTCONF, 2, 2), -+ [DC_INTPOL] = REG_FIELD(ISP1763_DC_INTCONF, 0, 0), -+ [DC_IEPRXTX_7] = REG_FIELD(ISP1763_DC_INTENABLE, 25, 25), -+ [DC_IEPRXTX_6] = REG_FIELD(ISP1763_DC_INTENABLE, 23, 23), -+ [DC_IEPRXTX_5] = REG_FIELD(ISP1763_DC_INTENABLE, 21, 21), -+ [DC_IEPRXTX_4] = REG_FIELD(ISP1763_DC_INTENABLE, 19, 19), -+ [DC_IEPRXTX_3] = REG_FIELD(ISP1763_DC_INTENABLE, 17, 17), -+ [DC_IEPRXTX_2] = REG_FIELD(ISP1763_DC_INTENABLE, 15, 15), -+ [DC_IEPRXTX_1] = REG_FIELD(ISP1763_DC_INTENABLE, 13, 13), -+ [DC_IEPRXTX_0] = REG_FIELD(ISP1763_DC_INTENABLE, 11, 11), -+ [DC_IEP0SETUP] = REG_FIELD(ISP1763_DC_INTENABLE, 8, 8), -+ [DC_IEVBUS] = REG_FIELD(ISP1763_DC_INTENABLE, 7, 7), -+ [DC_IEHS_STA] = REG_FIELD(ISP1763_DC_INTENABLE, 5, 5), -+ [DC_IERESM] = REG_FIELD(ISP1763_DC_INTENABLE, 4, 4), -+ [DC_IESUSP] = REG_FIELD(ISP1763_DC_INTENABLE, 3, 3), -+ [DC_IEBRST] = REG_FIELD(ISP1763_DC_INTENABLE, 0, 0), -+ [DC_EP0SETUP] = REG_FIELD(ISP1763_DC_EPINDEX, 5, 5), -+ [DC_ENDPIDX] = REG_FIELD(ISP1763_DC_EPINDEX, 1, 4), -+ [DC_EPDIR] = REG_FIELD(ISP1763_DC_EPINDEX, 0, 0), -+ [DC_CLBUF] = REG_FIELD(ISP1763_DC_CTRLFUNC, 4, 4), -+ [DC_VENDP] = REG_FIELD(ISP1763_DC_CTRLFUNC, 3, 3), -+ [DC_DSEN] = REG_FIELD(ISP1763_DC_CTRLFUNC, 2, 2), -+ [DC_STATUS] = REG_FIELD(ISP1763_DC_CTRLFUNC, 1, 1), -+ [DC_STALL] = REG_FIELD(ISP1763_DC_CTRLFUNC, 0, 0), -+ [DC_BUFLEN] = REG_FIELD(ISP1763_DC_BUFLEN, 0, 15), -+ [DC_FFOSZ] = REG_FIELD(ISP1763_DC_EPMAXPKTSZ, 0, 10), -+ [DC_EPENABLE] = REG_FIELD(ISP1763_DC_EPTYPE, 3, 3), -+ [DC_ENDPTYP] = REG_FIELD(ISP1763_DC_EPTYPE, 0, 1), -+ [DC_UFRAMENUM] = REG_FIELD(ISP1763_DC_FRAMENUM, 11, 13), -+ [DC_FRAMENUM] = REG_FIELD(ISP1763_DC_FRAMENUM, 0, 10), -+ [DC_CHIP_ID_HIGH] = REG_FIELD(ISP1763_DC_CHIPID_HIGH, 0, 15), -+ [DC_CHIP_ID_LOW] = REG_FIELD(ISP1763_DC_CHIPID_LOW, 0, 15), -+ [DC_SCRATCH] = REG_FIELD(ISP1763_DC_SCRATCH, 0, 15), -+}; -+ -+static const struct regmap_config isp1763_dc_regmap_conf = { -+ .name = "isp1763-dc", -+ .reg_bits = 8, -+ .reg_stride = 2, -+ .val_bits = 16, -+ .fast_io = true, -+ .max_register = ISP1763_DC_TESTMODE, -+ .volatile_table = &isp1763_dc_volatile_table, - }; - - int isp1760_register(struct resource *mem, int irq, unsigned long irqflags, - struct device *dev, unsigned int devflags) - { -+ bool udc_disabled = !(devflags & ISP1760_FLAG_ISP1761); -+ const struct regmap_config *hc_regmap; -+ const struct reg_field *hc_reg_fields; - struct isp1760_device *isp; - struct isp1760_hcd *hcd; - struct isp1760_udc *udc; -- bool udc_disabled = !(devflags & ISP1760_FLAG_ISP1761); - struct regmap_field *f; -- void __iomem *base; - int ret; - int i; - -@@ -281,9 +497,19 @@ int isp1760_register(struct resource *mem, int irq, unsigned long irqflags, - hcd = &isp->hcd; - udc = &isp->udc; - -- if (devflags & ISP1760_FLAG_BUS_WIDTH_16) { -- isp1760_hc_regmap_conf.val_bits = 16; -- isp1761_dc_regmap_conf.val_bits = 16; -+ hcd->is_isp1763 = !!(devflags & ISP1760_FLAG_ISP1763); -+ -+ if (!hcd->is_isp1763 && (devflags & ISP1760_FLAG_BUS_WIDTH_8)) { -+ dev_err(dev, "isp1760/61 do not support data width 8\n"); -+ return -EINVAL; -+ } -+ -+ if (hcd->is_isp1763) { -+ hc_regmap = &isp1763_hc_regmap_conf; -+ hc_reg_fields = &isp1763_hc_reg_fields[0]; -+ } else { -+ hc_regmap = &isp1760_hc_regmap_conf; -+ hc_reg_fields = &isp1760_hc_reg_fields[0]; - } - - isp->rst_gpio = devm_gpiod_get_optional(dev, NULL, GPIOD_OUT_HIGH); -@@ -294,20 +520,20 @@ int isp1760_register(struct resource *mem, int irq, unsigned long irqflags, - if (IS_ERR(hcd->base)) - return PTR_ERR(hcd->base); - -- hcd->regs = devm_regmap_init_mmio(dev, base, &isp1760_hc_regmap_conf); -+ hcd->regs = devm_regmap_init_mmio(dev, hcd->base, hc_regmap); - if (IS_ERR(hcd->regs)) - return PTR_ERR(hcd->regs); - - for (i = 0; i < HC_FIELD_MAX; i++) { -- f = devm_regmap_field_alloc(dev, hcd->regs, -- isp1760_hc_reg_fields[i]); -+ f = devm_regmap_field_alloc(dev, hcd->regs, hc_reg_fields[i]); - if (IS_ERR(f)) - return PTR_ERR(f); - - hcd->fields[i] = f; - } - -- udc->regs = devm_regmap_init_mmio(dev, base, &isp1761_dc_regmap_conf); -+ udc->regs = devm_regmap_init_mmio(dev, hcd->base, -+ &isp1761_dc_regmap_conf); - if (IS_ERR(udc->regs)) - return PTR_ERR(udc->regs); - -@@ -320,9 +546,14 @@ int isp1760_register(struct resource *mem, int irq, unsigned long irqflags, - udc->fields[i] = f; - } - -- hcd->memory_layout = &isp176x_memory_conf; -+ if (hcd->is_isp1763) -+ hcd->memory_layout = &isp1763_memory_conf; -+ else -+ hcd->memory_layout = &isp176x_memory_conf; - -- isp1760_init_core(isp); -+ ret = isp1760_init_core(isp); -+ if (ret < 0) -+ return ret; - - if (IS_ENABLED(CONFIG_USB_ISP1760_HCD) && !usb_disabled()) { - ret = isp1760_hcd_register(hcd, mem, irq, -diff --git a/drivers/usb/isp1760/isp1760-core.h b/drivers/usb/isp1760/isp1760-core.h -index 7a6755d68d41..91e0ee3992a7 100644 ---- a/drivers/usb/isp1760/isp1760-core.h -+++ b/drivers/usb/isp1760/isp1760-core.h -@@ -2,12 +2,14 @@ - /* - * Driver for the NXP ISP1760 chip - * -+ * Copyright 2021 Linaro, Rui Miguel Silva - * Copyright 2014 Laurent Pinchart - * Copyright 2007 Sebastian Siewior - * - * Contacts: - * Sebastian Siewior - * Laurent Pinchart -+ * Rui Miguel Silva - */ - - #ifndef _ISP1760_CORE_H_ -@@ -35,6 +37,8 @@ struct gpio_desc; - #define ISP1760_FLAG_ISP1761 0x00000040 /* Chip is ISP1761 */ - #define ISP1760_FLAG_INTR_POL_HIGH 0x00000080 /* Interrupt polarity active high */ - #define ISP1760_FLAG_INTR_EDGE_TRIG 0x00000100 /* Interrupt edge triggered */ -+#define ISP1760_FLAG_ISP1763 0x00000200 /* Chip is ISP1763 */ -+#define ISP1760_FLAG_BUS_WIDTH_8 0x00000400 /* 8-bit data bus width */ - - struct isp1760_device { - struct device *dev; -diff --git a/drivers/usb/isp1760/isp1760-hcd.c b/drivers/usb/isp1760/isp1760-hcd.c -index a65f5f917ebe..016a54ea76f4 100644 ---- a/drivers/usb/isp1760/isp1760-hcd.c -+++ b/drivers/usb/isp1760/isp1760-hcd.c -@@ -11,6 +11,8 @@ - * - * (c) 2011 Arvid Brodin - * -+ * Copyright 2021 Linaro, Rui Miguel Silva -+ * - */ - #include - #include -@@ -44,6 +46,9 @@ static inline struct isp1760_hcd *hcd_to_priv(struct usb_hcd *hcd) - return *(struct isp1760_hcd **)hcd->hcd_priv; - } - -+#define dw_to_le32(x) (cpu_to_le32((__force u32)x)) -+#define le32_to_dw(x) ((__force __dw)(le32_to_cpu(x))) -+ - /* urb state*/ - #define DELETE_URB (0x0008) - #define NO_TRANSFER_ACTIVE (0xffffffff) -@@ -60,6 +65,18 @@ struct ptd { - __dw dw6; - __dw dw7; - }; -+ -+struct ptd_le32 { -+ __le32 dw0; -+ __le32 dw1; -+ __le32 dw2; -+ __le32 dw3; -+ __le32 dw4; -+ __le32 dw5; -+ __le32 dw6; -+ __le32 dw7; -+}; -+ - #define PTD_OFFSET 0x0400 - #define ISO_PTD_OFFSET 0x0400 - #define INT_PTD_OFFSET 0x0800 -@@ -96,7 +113,7 @@ struct ptd { - #define TO_DW2_RL(x) TO_DW(((x) << 25)) - #define FROM_DW2_RL(x) ((TO_U32(x) >> 25) & 0xf) - /* DW3 */ --#define FROM_DW3_NRBYTESTRANSFERRED(x) TO_U32((x) & 0x7fff) -+#define FROM_DW3_NRBYTESTRANSFERRED(x) TO_U32((x) & 0x3fff) - #define FROM_DW3_SCS_NRBYTESTRANSFERRED(x) TO_U32((x) & 0x07ff) - #define TO_DW3_NAKCOUNT(x) TO_DW(((x) << 19)) - #define FROM_DW3_NAKCOUNT(x) ((TO_U32(x) >> 19) & 0xf) -@@ -123,7 +140,7 @@ struct ptd { - /* Errata 1 */ - #define RL_COUNTER (0) - #define NAK_COUNTER (0) --#define ERR_COUNTER (2) -+#define ERR_COUNTER (3) - - struct isp1760_qtd { - u8 packet_type; -@@ -165,6 +182,18 @@ struct urb_listitem { - struct urb *urb; - }; - -+static const u32 isp1763_hc_portsc1_fields[] = { -+ [PORT_OWNER] = BIT(13), -+ [PORT_POWER] = BIT(12), -+ [PORT_LSTATUS] = BIT(10), -+ [PORT_RESET] = BIT(8), -+ [PORT_SUSPEND] = BIT(7), -+ [PORT_RESUME] = BIT(6), -+ [PORT_PE] = BIT(2), -+ [PORT_CSC] = BIT(1), -+ [PORT_CONNECT] = BIT(0), -+}; -+ - /* - * Access functions for isp176x registers regmap fields - */ -@@ -175,10 +204,30 @@ static u32 isp1760_hcd_read(struct usb_hcd *hcd, u32 field) - return isp1760_field_read(priv->fields, field); - } - -+/* -+ * We need, in isp1763, to write directly the values to the portsc1 -+ * register so it will make the other values to trigger. -+ */ -+static void isp1760_hcd_portsc1_set_clear(struct isp1760_hcd *priv, u32 field, -+ u32 val) -+{ -+ u32 bit = isp1763_hc_portsc1_fields[field]; -+ u32 port_status = readl(priv->base + ISP1763_HC_PORTSC1); -+ -+ if (val) -+ writel(port_status | bit, priv->base + ISP1763_HC_PORTSC1); -+ else -+ writel(port_status & ~bit, priv->base + ISP1763_HC_PORTSC1); -+} -+ - static void isp1760_hcd_write(struct usb_hcd *hcd, u32 field, u32 val) - { - struct isp1760_hcd *priv = hcd_to_priv(hcd); - -+ if (unlikely(priv->is_isp1763 && -+ (field >= PORT_OWNER && field <= PORT_CONNECT))) -+ return isp1760_hcd_portsc1_set_clear(priv, field, val); -+ - isp1760_field_write(priv->fields, field, val); - } - -@@ -192,28 +241,40 @@ static void isp1760_hcd_clear(struct usb_hcd *hcd, u32 field) - isp1760_hcd_write(hcd, field, 0); - } - --static int isp1760_hcd_set_poll_timeout(struct usb_hcd *hcd, u32 field, -- u32 timeout_us) -+static int isp1760_hcd_set_and_wait(struct usb_hcd *hcd, u32 field, -+ u32 timeout_us) -+{ -+ struct isp1760_hcd *priv = hcd_to_priv(hcd); -+ u32 val; -+ -+ isp1760_hcd_set(hcd, field); -+ -+ return regmap_field_read_poll_timeout(priv->fields[field], val, -+ val, 10, timeout_us); -+} -+ -+static int isp1760_hcd_set_and_wait_swap(struct usb_hcd *hcd, u32 field, -+ u32 timeout_us) - { - struct isp1760_hcd *priv = hcd_to_priv(hcd); -- unsigned int val; -+ u32 val; - - isp1760_hcd_set(hcd, field); - -- return regmap_field_read_poll_timeout(priv->fields[field], val, 1, 1, -- timeout_us); -+ return regmap_field_read_poll_timeout(priv->fields[field], val, -+ !val, 10, timeout_us); - } - --static int isp1760_hcd_clear_poll_timeout(struct usb_hcd *hcd, u32 field, -- u32 timeout_us) -+static int isp1760_hcd_clear_and_wait(struct usb_hcd *hcd, u32 field, -+ u32 timeout_us) - { - struct isp1760_hcd *priv = hcd_to_priv(hcd); -- unsigned int val; -+ u32 val; - - isp1760_hcd_clear(hcd, field); - -- return regmap_field_read_poll_timeout(priv->fields[field], val, 0, 1, -- timeout_us); -+ return regmap_field_read_poll_timeout(priv->fields[field], val, -+ !val, 10, timeout_us); - } - - static bool isp1760_hcd_is_set(struct usb_hcd *hcd, u32 field) -@@ -221,12 +282,32 @@ static bool isp1760_hcd_is_set(struct usb_hcd *hcd, u32 field) - return !!isp1760_hcd_read(hcd, field); - } - -+static bool isp1760_hcd_ppc_is_set(struct usb_hcd *hcd) -+{ -+ struct isp1760_hcd *priv = hcd_to_priv(hcd); -+ -+ if (priv->is_isp1763) -+ return true; -+ -+ return isp1760_hcd_is_set(hcd, HCS_PPC); -+} -+ -+static u32 isp1760_hcd_n_ports(struct usb_hcd *hcd) -+{ -+ struct isp1760_hcd *priv = hcd_to_priv(hcd); -+ -+ if (priv->is_isp1763) -+ return 1; -+ -+ return isp1760_hcd_read(hcd, HCS_N_PORTS); -+} -+ - /* - * Access functions for isp176x memory (offset >= 0x0400). - * - * bank_reads8() reads memory locations prefetched by an earlier write to - * HC_MEMORY_REG (see isp176x datasheet). Unless you want to do fancy multi- -- * bank optimizations, you should use the more generic mem_reads8() below. -+ * bank optimizations, you should use the more generic mem_read() below. - * - * For access to ptd memory, use the specialized ptd_read() and ptd_write() - * below. -@@ -281,19 +362,59 @@ static void bank_reads8(void __iomem *src_base, u32 src_offset, u32 bank_addr, - } - } - --static void mem_reads8(struct usb_hcd *hcd, void __iomem *src_base, -- u32 src_offset, void *dst, u32 bytes) -+static void isp1760_mem_read(struct usb_hcd *hcd, u32 src_offset, void *dst, -+ u32 bytes) - { -+ struct isp1760_hcd *priv = hcd_to_priv(hcd); -+ - isp1760_hcd_write(hcd, MEM_BANK_SEL, ISP_BANK_0); - isp1760_hcd_write(hcd, MEM_START_ADDR, src_offset); -+ ndelay(100); - -- ndelay(90); -+ bank_reads8(priv->base, src_offset, ISP_BANK_0, dst, bytes); -+} - -- bank_reads8(src_base, src_offset, ISP_BANK_0, dst, bytes); -+/* -+ * ISP1763 does not have the banks direct host controller memory access, -+ * needs to use the HC_DATA register. Add data read/write according to this, -+ * and also adjust 16bit access. -+ */ -+static void isp1763_mem_read(struct usb_hcd *hcd, u16 srcaddr, -+ u16 *dstptr, u32 bytes) -+{ -+ struct isp1760_hcd *priv = hcd_to_priv(hcd); -+ -+ /* Write the starting device address to the hcd memory register */ -+ isp1760_reg_write(priv->regs, ISP1763_HC_MEMORY, srcaddr); -+ ndelay(100); /* Delay between consecutive access */ -+ -+ /* As long there are at least 16-bit to read ... */ -+ while (bytes >= 2) { -+ *dstptr = __raw_readw(priv->base + ISP1763_HC_DATA); -+ bytes -= 2; -+ dstptr++; -+ } -+ -+ /* If there are no more bytes to read, return */ -+ if (bytes <= 0) -+ return; -+ -+ *((u8 *)dstptr) = (u8)(readw(priv->base + ISP1763_HC_DATA) & 0xFF); -+} -+ -+static void mem_read(struct usb_hcd *hcd, u32 src_offset, __u32 *dst, -+ u32 bytes) -+{ -+ struct isp1760_hcd *priv = hcd_to_priv(hcd); -+ -+ if (!priv->is_isp1763) -+ return isp1760_mem_read(hcd, src_offset, (u16 *)dst, bytes); -+ -+ isp1763_mem_read(hcd, (u16)src_offset, (u16 *)dst, bytes); - } - --static void mem_writes8(void __iomem *dst_base, u32 dst_offset, -- __u32 const *src, u32 bytes) -+static void isp1760_mem_write(void __iomem *dst_base, u32 dst_offset, -+ __u32 const *src, u32 bytes) - { - __u32 __iomem *dst; - -@@ -327,33 +448,136 @@ static void mem_writes8(void __iomem *dst_base, u32 dst_offset, - __raw_writel(*src, dst); - } - -+static void isp1763_mem_write(struct usb_hcd *hcd, u16 dstaddr, u16 *src, -+ u32 bytes) -+{ -+ struct isp1760_hcd *priv = hcd_to_priv(hcd); -+ -+ /* Write the starting device address to the hcd memory register */ -+ isp1760_reg_write(priv->regs, ISP1763_HC_MEMORY, dstaddr); -+ ndelay(100); /* Delay between consecutive access */ -+ -+ while (bytes >= 2) { -+ /* Get and write the data; then adjust the data ptr and len */ -+ __raw_writew(*src, priv->base + ISP1763_HC_DATA); -+ bytes -= 2; -+ src++; -+ } -+ -+ /* If there are no more bytes to process, return */ -+ if (bytes <= 0) -+ return; -+ -+ /* -+ * The only way to get here is if there is a single byte left, -+ * get it and write it to the data reg; -+ */ -+ writew(*((u8 *)src), priv->base + ISP1763_HC_DATA); -+} -+ -+static void mem_write(struct usb_hcd *hcd, u32 dst_offset, __u32 *src, -+ u32 bytes) -+{ -+ struct isp1760_hcd *priv = hcd_to_priv(hcd); -+ -+ if (!priv->is_isp1763) -+ return isp1760_mem_write(priv->base, dst_offset, src, bytes); -+ -+ isp1763_mem_write(hcd, dst_offset, (u16 *)src, bytes); -+} -+ - /* - * Read and write ptds. 'ptd_offset' should be one of ISO_PTD_OFFSET, - * INT_PTD_OFFSET, and ATL_PTD_OFFSET. 'slot' should be less than 32. - */ --static void ptd_read(struct usb_hcd *hcd, void __iomem *base, -- u32 ptd_offset, u32 slot, struct ptd *ptd) -+static void isp1760_ptd_read(struct usb_hcd *hcd, u32 ptd_offset, u32 slot, -+ struct ptd *ptd) - { -+ u16 src_offset = ptd_offset + slot * sizeof(*ptd); -+ struct isp1760_hcd *priv = hcd_to_priv(hcd); -+ - isp1760_hcd_write(hcd, MEM_BANK_SEL, ISP_BANK_0); -- isp1760_hcd_write(hcd, MEM_START_ADDR, -- ptd_offset + slot * sizeof(*ptd)); -+ isp1760_hcd_write(hcd, MEM_START_ADDR, src_offset); - ndelay(90); -- bank_reads8(base, ptd_offset + slot * sizeof(*ptd), ISP_BANK_0, -- (void *)ptd, sizeof(*ptd)); -+ -+ bank_reads8(priv->base, src_offset, ISP_BANK_0, (void *)ptd, -+ sizeof(*ptd)); -+} -+ -+static void isp1763_ptd_read(struct usb_hcd *hcd, u32 ptd_offset, u32 slot, -+ struct ptd *ptd) -+{ -+ u16 src_offset = ptd_offset + slot * sizeof(*ptd); -+ struct ptd_le32 le32_ptd; -+ -+ isp1763_mem_read(hcd, src_offset, (u16 *)&le32_ptd, sizeof(le32_ptd)); -+ /* Normalize the data obtained */ -+ ptd->dw0 = le32_to_dw(le32_ptd.dw0); -+ ptd->dw1 = le32_to_dw(le32_ptd.dw1); -+ ptd->dw2 = le32_to_dw(le32_ptd.dw2); -+ ptd->dw3 = le32_to_dw(le32_ptd.dw3); -+ ptd->dw4 = le32_to_dw(le32_ptd.dw4); -+ ptd->dw5 = le32_to_dw(le32_ptd.dw5); -+ ptd->dw6 = le32_to_dw(le32_ptd.dw6); -+ ptd->dw7 = le32_to_dw(le32_ptd.dw7); -+} -+ -+static void ptd_read(struct usb_hcd *hcd, u32 ptd_offset, u32 slot, -+ struct ptd *ptd) -+{ -+ struct isp1760_hcd *priv = hcd_to_priv(hcd); -+ -+ if (!priv->is_isp1763) -+ return isp1760_ptd_read(hcd, ptd_offset, slot, ptd); -+ -+ isp1763_ptd_read(hcd, ptd_offset, slot, ptd); -+} -+ -+static void isp1763_ptd_write(struct usb_hcd *hcd, u32 ptd_offset, u32 slot, -+ struct ptd *cpu_ptd) -+{ -+ u16 dst_offset = ptd_offset + slot * sizeof(*cpu_ptd); -+ struct ptd_le32 ptd; -+ -+ ptd.dw0 = dw_to_le32(cpu_ptd->dw0); -+ ptd.dw1 = dw_to_le32(cpu_ptd->dw1); -+ ptd.dw2 = dw_to_le32(cpu_ptd->dw2); -+ ptd.dw3 = dw_to_le32(cpu_ptd->dw3); -+ ptd.dw4 = dw_to_le32(cpu_ptd->dw4); -+ ptd.dw5 = dw_to_le32(cpu_ptd->dw5); -+ ptd.dw6 = dw_to_le32(cpu_ptd->dw6); -+ ptd.dw7 = dw_to_le32(cpu_ptd->dw7); -+ -+ isp1763_mem_write(hcd, dst_offset, (u16 *)&ptd.dw0, -+ 8 * sizeof(ptd.dw0)); - } - --static void ptd_write(void __iomem *base, u32 ptd_offset, u32 slot, -- struct ptd *ptd) -+static void isp1760_ptd_write(void __iomem *base, u32 ptd_offset, u32 slot, -+ struct ptd *ptd) - { -- mem_writes8(base, ptd_offset + slot*sizeof(*ptd) + sizeof(ptd->dw0), -- (__force u32 *)&ptd->dw1, 7 * sizeof(ptd->dw1)); -- /* Make sure dw0 gets written last (after other dw's and after payload) -- since it contains the enable bit */ -+ u32 dst_offset = ptd_offset + slot * sizeof(*ptd); -+ -+ /* -+ * Make sure dw0 gets written last (after other dw's and after payload) -+ * since it contains the enable bit -+ */ -+ isp1760_mem_write(base, dst_offset + sizeof(ptd->dw0), -+ (__force u32 *)&ptd->dw1, 7 * sizeof(ptd->dw1)); - wmb(); -- mem_writes8(base, ptd_offset + slot * sizeof(*ptd), -- (__force u32 *)&ptd->dw0, sizeof(ptd->dw0)); -+ isp1760_mem_write(base, dst_offset, (__force u32 *)&ptd->dw0, -+ sizeof(ptd->dw0)); - } - -+static void ptd_write(struct usb_hcd *hcd, u32 ptd_offset, u32 slot, -+ struct ptd *ptd) -+{ -+ struct isp1760_hcd *priv = hcd_to_priv(hcd); -+ -+ if (!priv->is_isp1763) -+ return isp1760_ptd_write(priv->base, ptd_offset, slot, ptd); -+ -+ isp1763_ptd_write(hcd, ptd_offset, slot, ptd); -+} - - /* memory management of the 60kb on the chip from 0x1000 to 0xffff */ - static void init_memory(struct isp1760_hcd *priv) -@@ -430,7 +654,7 @@ static int ehci_reset(struct usb_hcd *hcd) - hcd->state = HC_STATE_HALT; - priv->next_statechange = jiffies; - -- return isp1760_hcd_set_poll_timeout(hcd, CMD_RESET, 250 * 1000); -+ return isp1760_hcd_set_and_wait_swap(hcd, CMD_RESET, 250 * 1000); - } - - static struct isp1760_qh *qh_alloc(gfp_t flags) -@@ -461,7 +685,6 @@ static int priv_init(struct usb_hcd *hcd) - struct isp1760_hcd *priv = hcd_to_priv(hcd); - u32 isoc_cache; - u32 isoc_thres; -- - int i; - - spin_lock_init(&priv->lock); -@@ -475,6 +698,11 @@ static int priv_init(struct usb_hcd *hcd) - */ - priv->periodic_size = DEFAULT_I_TDPS; - -+ if (priv->is_isp1763) { -+ priv->i_thresh = 2; -+ return 0; -+ } -+ - /* controllers may cache some of the periodic schedule ... */ - isoc_cache = isp1760_hcd_read(hcd, HCC_ISOC_CACHE); - isoc_thres = isp1760_hcd_read(hcd, HCC_ISOC_THRES); -@@ -491,16 +719,24 @@ static int priv_init(struct usb_hcd *hcd) - static int isp1760_hc_setup(struct usb_hcd *hcd) - { - struct isp1760_hcd *priv = hcd_to_priv(hcd); -+ u32 atx_reset; - int result; - u32 scratch; -+ u32 pattern; - -- isp1760_reg_write(priv->regs, ISP176x_HC_SCRATCH, 0xdeadbabe); -+ if (priv->is_isp1763) -+ pattern = 0xcafe; -+ else -+ pattern = 0xdeadcafe; -+ -+ isp1760_hcd_write(hcd, HC_SCRATCH, pattern); - - /* Change bus pattern */ -- scratch = isp1760_reg_read(priv->regs, ISP176x_HC_CHIP_ID); -- scratch = isp1760_reg_read(priv->regs, ISP176x_HC_SCRATCH); -- if (scratch != 0xdeadbabe) { -- dev_err(hcd->self.controller, "Scratch test failed.\n"); -+ scratch = isp1760_hcd_read(hcd, HC_CHIP_ID_HIGH); -+ dev_err(hcd->self.controller, "Scratch test 0x%08x\n", scratch); -+ scratch = isp1760_hcd_read(hcd, HC_SCRATCH); -+ if (scratch != pattern) { -+ dev_err(hcd->self.controller, "Scratch test failed. 0x%08x\n", scratch); - return -ENODEV; - } - -@@ -512,13 +748,13 @@ static int isp1760_hc_setup(struct usb_hcd *hcd) - * the host controller through the EHCI USB Command register. The device - * has been reset in core code anyway, so this shouldn't matter. - */ -- isp1760_reg_write(priv->regs, ISP176x_HC_BUFFER_STATUS, 0); -- isp1760_reg_write(priv->regs, ISP176x_HC_ATL_PTD_SKIPMAP, -- NO_TRANSFER_ACTIVE); -- isp1760_reg_write(priv->regs, ISP176x_HC_INT_PTD_SKIPMAP, -- NO_TRANSFER_ACTIVE); -- isp1760_reg_write(priv->regs, ISP176x_HC_ISO_PTD_SKIPMAP, -- NO_TRANSFER_ACTIVE); -+ isp1760_hcd_clear(hcd, ISO_BUF_FILL); -+ isp1760_hcd_clear(hcd, INT_BUF_FILL); -+ isp1760_hcd_clear(hcd, ATL_BUF_FILL); -+ -+ isp1760_hcd_set(hcd, HC_ATL_PTD_SKIPMAP); -+ isp1760_hcd_set(hcd, HC_INT_PTD_SKIPMAP); -+ isp1760_hcd_set(hcd, HC_ISO_PTD_SKIPMAP); - - result = ehci_reset(hcd); - if (result) -@@ -527,11 +763,26 @@ static int isp1760_hc_setup(struct usb_hcd *hcd) - /* Step 11 passed */ - - /* ATL reset */ -- isp1760_hcd_set(hcd, ALL_ATX_RESET); -+ if (priv->is_isp1763) -+ atx_reset = SW_RESET_RESET_ATX; -+ else -+ atx_reset = ALL_ATX_RESET; -+ -+ isp1760_hcd_set(hcd, atx_reset); - mdelay(10); -- isp1760_hcd_clear(hcd, ALL_ATX_RESET); -+ isp1760_hcd_clear(hcd, atx_reset); - -- isp1760_hcd_set(hcd, HC_INT_ENABLE); -+ if (priv->is_isp1763) { -+ isp1760_hcd_set(hcd, HW_OTG_DISABLE); -+ isp1760_hcd_set(hcd, HW_SW_SEL_HC_DC_CLEAR); -+ isp1760_hcd_set(hcd, HW_HC_2_DIS_CLEAR); -+ mdelay(10); -+ -+ isp1760_hcd_set(hcd, HW_INTF_LOCK); -+ } -+ -+ isp1760_hcd_set(hcd, HC_INT_IRQ_ENABLE); -+ isp1760_hcd_set(hcd, HC_ATL_IRQ_ENABLE); - - return priv_init(hcd); - } -@@ -751,45 +1002,45 @@ static void start_bus_transfer(struct usb_hcd *hcd, u32 ptd_offset, int slot, - struct ptd *ptd) - { - struct isp1760_hcd *priv = hcd_to_priv(hcd); -+ const struct isp1760_memory_layout *mem = priv->memory_layout; - int skip_map; - -- WARN_ON((slot < 0) || (slot > 31)); -+ WARN_ON((slot < 0) || (slot > mem->slot_num - 1)); - WARN_ON(qtd->length && !qtd->payload_addr); - WARN_ON(slots[slot].qtd); - WARN_ON(slots[slot].qh); - WARN_ON(qtd->status != QTD_PAYLOAD_ALLOC); - -+ if (priv->is_isp1763) -+ ndelay(100); -+ - /* Make sure done map has not triggered from some unlinked transfer */ - if (ptd_offset == ATL_PTD_OFFSET) { -- priv->atl_done_map |= isp1760_reg_read(priv->regs, -- ISP176x_HC_ATL_PTD_DONEMAP); -+ skip_map = isp1760_hcd_read(hcd, HC_ATL_PTD_SKIPMAP); -+ isp1760_hcd_write(hcd, HC_ATL_PTD_SKIPMAP, -+ skip_map | (1 << slot)); -+ priv->atl_done_map |= isp1760_hcd_read(hcd, HC_ATL_PTD_DONEMAP); - priv->atl_done_map &= ~(1 << slot); - } else { -- priv->int_done_map |= isp1760_reg_read(priv->regs, -- ISP176x_HC_INT_PTD_DONEMAP); -+ skip_map = isp1760_hcd_read(hcd, HC_INT_PTD_SKIPMAP); -+ isp1760_hcd_write(hcd, HC_INT_PTD_SKIPMAP, -+ skip_map | (1 << slot)); -+ priv->int_done_map |= isp1760_hcd_read(hcd, HC_INT_PTD_DONEMAP); - priv->int_done_map &= ~(1 << slot); - } - -+ skip_map &= ~(1 << slot); - qh->slot = slot; - qtd->status = QTD_XFER_STARTED; - slots[slot].timestamp = jiffies; - slots[slot].qtd = qtd; - slots[slot].qh = qh; -- ptd_write(priv->base, ptd_offset, slot, ptd); -+ ptd_write(hcd, ptd_offset, slot, ptd); - -- if (ptd_offset == ATL_PTD_OFFSET) { -- skip_map = isp1760_reg_read(priv->regs, -- ISP176x_HC_ATL_PTD_SKIPMAP); -- skip_map &= ~(1 << qh->slot); -- isp1760_reg_write(priv->regs, ISP176x_HC_ATL_PTD_SKIPMAP, -- skip_map); -- } else { -- skip_map = isp1760_reg_read(priv->regs, -- ISP176x_HC_INT_PTD_SKIPMAP); -- skip_map &= ~(1 << qh->slot); -- isp1760_reg_write(priv->regs, ISP176x_HC_INT_PTD_SKIPMAP, -- skip_map); -- } -+ if (ptd_offset == ATL_PTD_OFFSET) -+ isp1760_hcd_write(hcd, HC_ATL_PTD_SKIPMAP, skip_map); -+ else -+ isp1760_hcd_write(hcd, HC_INT_PTD_SKIPMAP, skip_map); - } - - static int is_short_bulk(struct isp1760_qtd *qtd) -@@ -801,7 +1052,6 @@ static int is_short_bulk(struct isp1760_qtd *qtd) - static void collect_qtds(struct usb_hcd *hcd, struct isp1760_qh *qh, - struct list_head *urb_list) - { -- struct isp1760_hcd *priv = hcd_to_priv(hcd); - struct isp1760_qtd *qtd, *qtd_next; - struct urb_listitem *urb_listitem; - int last_qtd; -@@ -819,10 +1069,9 @@ static void collect_qtds(struct usb_hcd *hcd, struct isp1760_qh *qh, - if (qtd->actual_length) { - switch (qtd->packet_type) { - case IN_PID: -- mem_reads8(hcd, priv->base, -- qtd->payload_addr, -- qtd->data_buffer, -- qtd->actual_length); -+ mem_read(hcd, qtd->payload_addr, -+ qtd->data_buffer, -+ qtd->actual_length); - fallthrough; - case OUT_PID: - qtd->urb->actual_length += -@@ -866,6 +1115,8 @@ static void collect_qtds(struct usb_hcd *hcd, struct isp1760_qh *qh, - static void enqueue_qtds(struct usb_hcd *hcd, struct isp1760_qh *qh) - { - struct isp1760_hcd *priv = hcd_to_priv(hcd); -+ const struct isp1760_memory_layout *mem = priv->memory_layout; -+ int slot_num = mem->slot_num; - int ptd_offset; - struct isp1760_slotinfo *slots; - int curr_slot, free_slot; -@@ -892,7 +1143,7 @@ static void enqueue_qtds(struct usb_hcd *hcd, struct isp1760_qh *qh) - } - - free_slot = -1; -- for (curr_slot = 0; curr_slot < 32; curr_slot++) { -+ for (curr_slot = 0; curr_slot < slot_num; curr_slot++) { - if ((free_slot == -1) && (slots[curr_slot].qtd == NULL)) - free_slot = curr_slot; - if (slots[curr_slot].qh == qh) -@@ -907,11 +1158,10 @@ static void enqueue_qtds(struct usb_hcd *hcd, struct isp1760_qh *qh) - if ((qtd->length) && (!qtd->payload_addr)) - break; - -- if ((qtd->length) && -- ((qtd->packet_type == SETUP_PID) || -- (qtd->packet_type == OUT_PID))) { -- mem_writes8(priv->base, qtd->payload_addr, -- qtd->data_buffer, qtd->length); -+ if (qtd->length && (qtd->packet_type == SETUP_PID || -+ qtd->packet_type == OUT_PID)) { -+ mem_write(hcd, qtd->payload_addr, -+ qtd->data_buffer, qtd->length); - } - - qtd->status = QTD_PAYLOAD_ALLOC; -@@ -924,7 +1174,7 @@ static void enqueue_qtds(struct usb_hcd *hcd, struct isp1760_qh *qh) - "available for transfer\n", __func__); - */ - /* Start xfer for this endpoint if not already done */ -- if ((curr_slot > 31) && (free_slot > -1)) { -+ if ((curr_slot > slot_num - 1) && (free_slot > -1)) { - if (usb_pipeint(qtd->urb->pipe)) - create_ptd_int(qh, qtd, &ptd); - else -@@ -1111,9 +1361,9 @@ static void handle_done_ptds(struct usb_hcd *hcd) - int modified; - int skip_map; - -- skip_map = isp1760_reg_read(priv->regs, ISP176x_HC_INT_PTD_SKIPMAP); -+ skip_map = isp1760_hcd_read(hcd, HC_INT_PTD_SKIPMAP); - priv->int_done_map &= ~skip_map; -- skip_map = isp1760_reg_read(priv->regs, ISP176x_HC_ATL_PTD_SKIPMAP); -+ skip_map = isp1760_hcd_read(hcd, HC_ATL_PTD_SKIPMAP); - priv->atl_done_map &= ~skip_map; - - modified = priv->int_done_map || priv->atl_done_map; -@@ -1131,7 +1381,7 @@ static void handle_done_ptds(struct usb_hcd *hcd) - continue; - } - ptd_offset = INT_PTD_OFFSET; -- ptd_read(hcd, priv->base, INT_PTD_OFFSET, slot, &ptd); -+ ptd_read(hcd, INT_PTD_OFFSET, slot, &ptd); - state = check_int_transfer(hcd, &ptd, - slots[slot].qtd->urb); - } else { -@@ -1146,7 +1396,7 @@ static void handle_done_ptds(struct usb_hcd *hcd) - continue; - } - ptd_offset = ATL_PTD_OFFSET; -- ptd_read(hcd, priv->base, ATL_PTD_OFFSET, slot, &ptd); -+ ptd_read(hcd, ATL_PTD_OFFSET, slot, &ptd); - state = check_atl_transfer(hcd, &ptd, - slots[slot].qtd->urb); - } -@@ -1239,27 +1489,30 @@ static void handle_done_ptds(struct usb_hcd *hcd) - static irqreturn_t isp1760_irq(struct usb_hcd *hcd) - { - struct isp1760_hcd *priv = hcd_to_priv(hcd); -- u32 imask; - irqreturn_t irqret = IRQ_NONE; -+ u32 int_reg; -+ u32 imask; - - spin_lock(&priv->lock); - - if (!(hcd->state & HC_STATE_RUNNING)) - goto leave; - -- imask = isp1760_reg_read(priv->regs, ISP176x_HC_INTERRUPT); -+ imask = isp1760_hcd_read(hcd, HC_INTERRUPT); - if (unlikely(!imask)) - goto leave; -- isp1760_reg_write(priv->regs, ISP176x_HC_INTERRUPT, imask); /* Clear */ - -- priv->int_done_map |= isp1760_reg_read(priv->regs, -- ISP176x_HC_INT_PTD_DONEMAP); -- priv->atl_done_map |= isp1760_reg_read(priv->regs, -- ISP176x_HC_ATL_PTD_DONEMAP); -+ int_reg = priv->is_isp1763 ? ISP1763_HC_INTERRUPT : -+ ISP176x_HC_INTERRUPT; -+ isp1760_reg_write(priv->regs, int_reg, imask); -+ -+ priv->int_done_map |= isp1760_hcd_read(hcd, HC_INT_PTD_DONEMAP); -+ priv->atl_done_map |= isp1760_hcd_read(hcd, HC_ATL_PTD_DONEMAP); - - handle_done_ptds(hcd); - - irqret = IRQ_HANDLED; -+ - leave: - spin_unlock(&priv->lock); - -@@ -1300,17 +1553,18 @@ static void errata2_function(struct timer_list *unused) - { - struct usb_hcd *hcd = errata2_timer_hcd; - struct isp1760_hcd *priv = hcd_to_priv(hcd); -+ const struct isp1760_memory_layout *mem = priv->memory_layout; - int slot; - struct ptd ptd; - unsigned long spinflags; - - spin_lock_irqsave(&priv->lock, spinflags); - -- for (slot = 0; slot < 32; slot++) -+ for (slot = 0; slot < mem->slot_num; slot++) - if (priv->atl_slots[slot].qh && time_after(jiffies, - priv->atl_slots[slot].timestamp + - msecs_to_jiffies(SLOT_TIMEOUT))) { -- ptd_read(hcd, priv->base, ATL_PTD_OFFSET, slot, &ptd); -+ ptd_read(hcd, ATL_PTD_OFFSET, slot, &ptd); - if (!FROM_DW0_VALID(ptd.dw0) && - !FROM_DW3_ACTIVE(ptd.dw3)) - priv->atl_done_map |= 1 << slot; -@@ -1325,23 +1579,113 @@ static void errata2_function(struct timer_list *unused) - add_timer(&errata2_timer); - } - -+static int isp1763_run(struct usb_hcd *hcd) -+{ -+ struct isp1760_hcd *priv = hcd_to_priv(hcd); -+ int retval; -+ u32 chipid_h; -+ u32 chipid_l; -+ u32 chip_rev; -+ u32 ptd_atl_int; -+ u32 ptd_iso; -+ -+ hcd->uses_new_polling = 1; -+ hcd->state = HC_STATE_RUNNING; -+ -+ chipid_h = isp1760_hcd_read(hcd, HC_CHIP_ID_HIGH); -+ chipid_l = isp1760_hcd_read(hcd, HC_CHIP_ID_LOW); -+ chip_rev = isp1760_hcd_read(hcd, HC_CHIP_REV); -+ dev_info(hcd->self.controller, "USB ISP %02x%02x HW rev. %d started\n", -+ chipid_h, chipid_l, chip_rev); -+ -+ isp1760_hcd_clear(hcd, ISO_BUF_FILL); -+ isp1760_hcd_clear(hcd, INT_BUF_FILL); -+ isp1760_hcd_clear(hcd, ATL_BUF_FILL); -+ -+ isp1760_hcd_set(hcd, HC_ATL_PTD_SKIPMAP); -+ isp1760_hcd_set(hcd, HC_INT_PTD_SKIPMAP); -+ isp1760_hcd_set(hcd, HC_ISO_PTD_SKIPMAP); -+ ndelay(100); -+ isp1760_hcd_clear(hcd, HC_ATL_PTD_DONEMAP); -+ isp1760_hcd_clear(hcd, HC_INT_PTD_DONEMAP); -+ isp1760_hcd_clear(hcd, HC_ISO_PTD_DONEMAP); -+ -+ isp1760_hcd_set(hcd, HW_OTG_DISABLE); -+ isp1760_reg_write(priv->regs, ISP1763_HC_OTG_CTRL_CLEAR, BIT(7)); -+ isp1760_reg_write(priv->regs, ISP1763_HC_OTG_CTRL_CLEAR, BIT(15)); -+ mdelay(10); -+ -+ isp1760_hcd_set(hcd, HC_INT_IRQ_ENABLE); -+ isp1760_hcd_set(hcd, HC_ATL_IRQ_ENABLE); -+ -+ isp1760_hcd_set(hcd, HW_GLOBAL_INTR_EN); -+ -+ isp1760_hcd_clear(hcd, HC_ATL_IRQ_MASK_AND); -+ isp1760_hcd_clear(hcd, HC_INT_IRQ_MASK_AND); -+ isp1760_hcd_clear(hcd, HC_ISO_IRQ_MASK_AND); -+ -+ isp1760_hcd_set(hcd, HC_ATL_IRQ_MASK_OR); -+ isp1760_hcd_set(hcd, HC_INT_IRQ_MASK_OR); -+ isp1760_hcd_set(hcd, HC_ISO_IRQ_MASK_OR); -+ -+ ptd_atl_int = 0x8000; -+ ptd_iso = 0x0001; -+ -+ isp1760_hcd_write(hcd, HC_ATL_PTD_LASTPTD, ptd_atl_int); -+ isp1760_hcd_write(hcd, HC_INT_PTD_LASTPTD, ptd_atl_int); -+ isp1760_hcd_write(hcd, HC_ISO_PTD_LASTPTD, ptd_iso); -+ -+ isp1760_hcd_set(hcd, ATL_BUF_FILL); -+ isp1760_hcd_set(hcd, INT_BUF_FILL); -+ -+ isp1760_hcd_clear(hcd, CMD_LRESET); -+ isp1760_hcd_clear(hcd, CMD_RESET); -+ -+ retval = isp1760_hcd_set_and_wait(hcd, CMD_RUN, 250 * 1000); -+ if (retval) -+ return retval; -+ -+ down_write(&ehci_cf_port_reset_rwsem); -+ retval = isp1760_hcd_set_and_wait(hcd, FLAG_CF, 250 * 1000); -+ up_write(&ehci_cf_port_reset_rwsem); -+ retval = 0; -+ if (retval) -+ return retval; -+ -+ return 0; -+} -+ - static int isp1760_run(struct usb_hcd *hcd) - { - struct isp1760_hcd *priv = hcd_to_priv(hcd); - int retval; -- u32 chipid; -+ u32 chipid_h; -+ u32 chipid_l; -+ u32 chip_rev; -+ u32 ptd_atl_int; -+ u32 ptd_iso; -+ -+ /* -+ * ISP1763 have some differences in the setup and order to enable -+ * the ports, disable otg, setup buffers, and ATL, INT, ISO status. -+ * So, just handle it a separate sequence. -+ */ -+ if (priv->is_isp1763) -+ return isp1763_run(hcd); - - hcd->uses_new_polling = 1; - - hcd->state = HC_STATE_RUNNING; - - /* Set PTD interrupt AND & OR maps */ -- isp1760_reg_write(priv->regs, ISP176x_HC_ATL_IRQ_MASK_AND, 0); -- isp1760_reg_write(priv->regs, ISP176x_HC_ATL_IRQ_MASK_OR, 0xffffffff); -- isp1760_reg_write(priv->regs, ISP176x_HC_INT_IRQ_MASK_AND, 0); -- isp1760_reg_write(priv->regs, ISP176x_HC_INT_IRQ_MASK_OR, 0xffffffff); -- isp1760_reg_write(priv->regs, ISP176x_HC_ISO_IRQ_MASK_AND, 0); -- isp1760_reg_write(priv->regs, ISP176x_HC_ISO_IRQ_MASK_OR, 0xffffffff); -+ isp1760_hcd_clear(hcd, HC_ATL_IRQ_MASK_AND); -+ isp1760_hcd_clear(hcd, HC_INT_IRQ_MASK_AND); -+ isp1760_hcd_clear(hcd, HC_ISO_IRQ_MASK_AND); -+ -+ isp1760_hcd_set(hcd, HC_ATL_IRQ_MASK_OR); -+ isp1760_hcd_set(hcd, HC_INT_IRQ_MASK_OR); -+ isp1760_hcd_set(hcd, HC_ISO_IRQ_MASK_OR); -+ - /* step 23 passed */ - - isp1760_hcd_set(hcd, HW_GLOBAL_INTR_EN); -@@ -1349,7 +1693,7 @@ static int isp1760_run(struct usb_hcd *hcd) - isp1760_hcd_clear(hcd, CMD_LRESET); - isp1760_hcd_clear(hcd, CMD_RESET); - -- retval = isp1760_hcd_set_poll_timeout(hcd, CMD_RUN, 250 * 1000); -+ retval = isp1760_hcd_set_and_wait(hcd, CMD_RUN, 250 * 1000); - if (retval) - return retval; - -@@ -1360,7 +1704,7 @@ static int isp1760_run(struct usb_hcd *hcd) - */ - down_write(&ehci_cf_port_reset_rwsem); - -- retval = isp1760_hcd_set_poll_timeout(hcd, FLAG_CF, 250 * 1000); -+ retval = isp1760_hcd_set_and_wait(hcd, FLAG_CF, 250 * 1000); - up_write(&ehci_cf_port_reset_rwsem); - if (retval) - return retval; -@@ -1370,19 +1714,25 @@ static int isp1760_run(struct usb_hcd *hcd) - errata2_timer.expires = jiffies + msecs_to_jiffies(SLOT_CHECK_PERIOD); - add_timer(&errata2_timer); - -- chipid = isp1760_reg_read(priv->regs, ISP176x_HC_CHIP_ID); -- dev_info(hcd->self.controller, "USB ISP %04x HW rev. %d started\n", -- chipid & 0xffff, chipid >> 16); -+ chipid_h = isp1760_hcd_read(hcd, HC_CHIP_ID_HIGH); -+ chipid_l = isp1760_hcd_read(hcd, HC_CHIP_ID_LOW); -+ chip_rev = isp1760_hcd_read(hcd, HC_CHIP_REV); -+ dev_info(hcd->self.controller, "USB ISP %02x%02x HW rev. %d started\n", -+ chipid_h, chipid_l, chip_rev); - - /* PTD Register Init Part 2, Step 28 */ - - /* Setup registers controlling PTD checking */ -- isp1760_reg_write(priv->regs, ISP176x_HC_ATL_PTD_LASTPTD, 0x80000000); -- isp1760_reg_write(priv->regs, ISP176x_HC_INT_PTD_LASTPTD, 0x80000000); -- isp1760_reg_write(priv->regs, ISP176x_HC_ISO_PTD_LASTPTD, 0x00000001); -- isp1760_reg_write(priv->regs, ISP176x_HC_ATL_PTD_SKIPMAP, 0xffffffff); -- isp1760_reg_write(priv->regs, ISP176x_HC_INT_PTD_SKIPMAP, 0xffffffff); -- isp1760_reg_write(priv->regs, ISP176x_HC_ISO_PTD_SKIPMAP, 0xffffffff); -+ ptd_atl_int = 0x80000000; -+ ptd_iso = 0x00000001; -+ -+ isp1760_hcd_write(hcd, HC_ATL_PTD_LASTPTD, ptd_atl_int); -+ isp1760_hcd_write(hcd, HC_INT_PTD_LASTPTD, ptd_atl_int); -+ isp1760_hcd_write(hcd, HC_ISO_PTD_LASTPTD, ptd_iso); -+ -+ isp1760_hcd_set(hcd, HC_ATL_PTD_SKIPMAP); -+ isp1760_hcd_set(hcd, HC_INT_PTD_SKIPMAP); -+ isp1760_hcd_set(hcd, HC_ISO_PTD_SKIPMAP); - - isp1760_hcd_set(hcd, ATL_BUF_FILL); - isp1760_hcd_set(hcd, INT_BUF_FILL); -@@ -1623,19 +1973,16 @@ static void kill_transfer(struct usb_hcd *hcd, struct urb *urb, - /* We need to forcefully reclaim the slot since some transfers never - return, e.g. interrupt transfers and NAKed bulk transfers. */ - if (usb_pipecontrol(urb->pipe) || usb_pipebulk(urb->pipe)) { -- skip_map = isp1760_reg_read(priv->regs, -- ISP176x_HC_ATL_PTD_SKIPMAP); -+ skip_map = isp1760_hcd_read(hcd, HC_ATL_PTD_SKIPMAP); - skip_map |= (1 << qh->slot); -- isp1760_reg_write(priv->regs, ISP176x_HC_ATL_PTD_SKIPMAP, -- skip_map); -+ isp1760_hcd_write(hcd, HC_ATL_PTD_SKIPMAP, skip_map); -+ ndelay(100); - priv->atl_slots[qh->slot].qh = NULL; - priv->atl_slots[qh->slot].qtd = NULL; - } else { -- skip_map = isp1760_reg_read(priv->regs, -- ISP176x_HC_INT_PTD_SKIPMAP); -+ skip_map = isp1760_hcd_read(hcd, HC_INT_PTD_SKIPMAP); - skip_map |= (1 << qh->slot); -- isp1760_reg_write(priv->regs, ISP176x_HC_INT_PTD_SKIPMAP, -- skip_map); -+ isp1760_hcd_write(hcd, HC_INT_PTD_SKIPMAP, skip_map); - priv->int_slots[qh->slot].qh = NULL; - priv->int_slots[qh->slot].qtd = NULL; - } -@@ -1791,7 +2138,7 @@ static void isp1760_hub_descriptor(struct isp1760_hcd *priv, - int ports; - u16 temp; - -- ports = isp1760_hcd_read(priv->hcd, HCS_N_PORTS); -+ ports = isp1760_hcd_n_ports(priv->hcd); - - desc->bDescriptorType = USB_DT_HUB; - /* priv 1.0, 2.3.9 says 20ms max */ -@@ -1808,7 +2155,7 @@ static void isp1760_hub_descriptor(struct isp1760_hcd *priv, - - /* per-port overcurrent reporting */ - temp = HUB_CHAR_INDV_PORT_OCPM; -- if (isp1760_hcd_is_set(priv->hcd, HCS_PPC)) -+ if (isp1760_hcd_ppc_is_set(priv->hcd)) - /* per-port power control */ - temp |= HUB_CHAR_INDV_PORT_LPSM; - else -@@ -1849,7 +2196,7 @@ static int isp1760_hub_control(struct usb_hcd *hcd, u16 typeReq, - int retval = 0; - int ports; - -- ports = isp1760_hcd_read(hcd, HCS_N_PORTS); -+ ports = isp1760_hcd_n_ports(hcd); - - /* - * FIXME: support SetPortFeatures USB_PORT_FEAT_INDICATOR. -@@ -1908,7 +2255,7 @@ static int isp1760_hub_control(struct usb_hcd *hcd, u16 typeReq, - /* we auto-clear this feature */ - break; - case USB_PORT_FEAT_POWER: -- if (isp1760_hcd_is_set(hcd, HCS_PPC)) -+ if (isp1760_hcd_ppc_is_set(hcd)) - isp1760_hcd_clear(hcd, PORT_POWER); - break; - case USB_PORT_FEAT_C_CONNECTION: -@@ -1923,7 +2270,7 @@ static int isp1760_hub_control(struct usb_hcd *hcd, u16 typeReq, - default: - goto error; - } -- isp1760_reg_read(priv->regs, ISP176x_HC_USBCMD); -+ isp1760_hcd_read(hcd, CMD_RUN); - break; - case GetHubDescriptor: - isp1760_hub_descriptor(priv, (struct usb_hub_descriptor *) -@@ -1943,7 +2290,6 @@ static int isp1760_hub_control(struct usb_hcd *hcd, u16 typeReq, - if (isp1760_hcd_is_set(hcd, PORT_CSC)) - status |= USB_PORT_STAT_C_CONNECTION << 16; - -- - /* whoever resumes must GetPortStatus to complete it!! */ - if (isp1760_hcd_is_set(hcd, PORT_RESUME)) { - dev_err(hcd->self.controller, "Port resume should be skipped.\n"); -@@ -1966,7 +2312,7 @@ static int isp1760_hub_control(struct usb_hcd *hcd, u16 typeReq, - /* stop resume signaling */ - isp1760_hcd_clear(hcd, PORT_CSC); - -- retval = isp1760_hcd_clear_poll_timeout(hcd, -+ retval = isp1760_hcd_clear_and_wait(hcd, - PORT_RESUME, 2000); - if (retval != 0) { - dev_err(hcd->self.controller, -@@ -1987,11 +2333,11 @@ static int isp1760_hub_control(struct usb_hcd *hcd, u16 typeReq, - /* REVISIT: some hardware needs 550+ usec to clear - * this bit; seems too long to spin routinely... - */ -- retval = isp1760_hcd_clear_poll_timeout(hcd, PORT_RESET, -- 750); -+ retval = isp1760_hcd_clear_and_wait(hcd, PORT_RESET, -+ 750); - if (retval != 0) { - dev_err(hcd->self.controller, "port %d reset error %d\n", -- wIndex + 1, retval); -+ wIndex + 1, retval); - goto error; - } - -@@ -2039,6 +2385,7 @@ static int isp1760_hub_control(struct usb_hcd *hcd, u16 typeReq, - if (!wIndex || wIndex > ports) - goto error; - wIndex--; -+ - if (isp1760_hcd_is_set(hcd, PORT_OWNER)) - break; - -@@ -2055,7 +2402,7 @@ static int isp1760_hub_control(struct usb_hcd *hcd, u16 typeReq, - isp1760_hcd_set(hcd, PORT_SUSPEND); - break; - case USB_PORT_FEAT_POWER: -- if (isp1760_hcd_is_set(hcd, HCS_PPC)) -+ if (isp1760_hcd_ppc_is_set(hcd)) - isp1760_hcd_set(hcd, PORT_POWER); - break; - case USB_PORT_FEAT_RESET: -@@ -2084,7 +2431,6 @@ static int isp1760_hub_control(struct usb_hcd *hcd, u16 typeReq, - default: - goto error; - } -- isp1760_reg_read(priv->regs, ISP176x_HC_USBCMD); - break; - - default: -@@ -2219,22 +2565,14 @@ int isp1760_hcd_register(struct isp1760_hcd *priv, struct resource *mem, - - priv->hcd = hcd; - -- priv->memory_pool = kcalloc(mem_layout->payload_blocks, -- sizeof(struct isp1760_memory_chunk), -- GFP_KERNEL); -- if (!priv->memory_pool) { -- ret = -ENOMEM; -- goto put_hcd; -- } -- -- priv->atl_slots = kcalloc(mem_layout->ptd_num, -+ priv->atl_slots = kcalloc(mem_layout->slot_num, - sizeof(struct isp1760_slotinfo), GFP_KERNEL); - if (!priv->atl_slots) { - ret = -ENOMEM; -- goto free_mem_pool; -+ goto put_hcd; - } - -- priv->int_slots = kcalloc(mem_layout->ptd_num, -+ priv->int_slots = kcalloc(mem_layout->slot_num, - sizeof(struct isp1760_slotinfo), GFP_KERNEL); - if (!priv->int_slots) { - ret = -ENOMEM; -@@ -2262,8 +2600,6 @@ int isp1760_hcd_register(struct isp1760_hcd *priv, struct resource *mem, - kfree(priv->int_slots); - free_atl_slots: - kfree(priv->atl_slots); --free_mem_pool: -- kfree(priv->memory_pool); - put_hcd: - usb_put_hcd(hcd); - return ret; -@@ -2278,5 +2614,4 @@ void isp1760_hcd_unregister(struct isp1760_hcd *priv) - usb_put_hcd(priv->hcd); - kfree(priv->atl_slots); - kfree(priv->int_slots); -- kfree(priv->memory_pool); - } -diff --git a/drivers/usb/isp1760/isp1760-hcd.h b/drivers/usb/isp1760/isp1760-hcd.h -index 9d2427ce3f1a..ee3063a34de3 100644 ---- a/drivers/usb/isp1760/isp1760-hcd.h -+++ b/drivers/usb/isp1760/isp1760-hcd.h -@@ -19,13 +19,14 @@ struct isp1760_slotinfo { - }; - - /* chip memory management */ -+#define ISP176x_BLOCK_MAX (32 + 20 + 4) - #define ISP176x_BLOCK_NUM 3 - - struct isp1760_memory_layout { - unsigned int blocks[ISP176x_BLOCK_NUM]; - unsigned int blocks_size[ISP176x_BLOCK_NUM]; - -- unsigned int ptd_num; -+ unsigned int slot_num; - unsigned int payload_blocks; - unsigned int payload_area_size; - }; -@@ -51,6 +52,7 @@ struct isp1760_hcd { - struct regmap *regs; - struct regmap_field *fields[HC_FIELD_MAX]; - -+ bool is_isp1763; - const struct isp1760_memory_layout *memory_layout; - - spinlock_t lock; -@@ -58,7 +60,7 @@ struct isp1760_hcd { - int atl_done_map; - struct isp1760_slotinfo *int_slots; - int int_done_map; -- struct isp1760_memory_chunk *memory_pool; -+ struct isp1760_memory_chunk memory_pool[ISP176x_BLOCK_MAX]; - struct list_head qh_list[QH_END]; - - /* periodic schedule support */ -diff --git a/drivers/usb/isp1760/isp1760-if.c b/drivers/usb/isp1760/isp1760-if.c -index cb3e4d782315..7cc349c0b2ad 100644 ---- a/drivers/usb/isp1760/isp1760-if.c -+++ b/drivers/usb/isp1760/isp1760-if.c -@@ -7,6 +7,7 @@ - * - PDEV (generic platform device centralized driver model) - * - * (c) 2007 Sebastian Siewior -+ * Copyright 2021 Linaro, Rui Miguel Silva - * - */ - -@@ -209,10 +210,18 @@ static int isp1760_plat_probe(struct platform_device *pdev) - if (of_device_is_compatible(dp, "nxp,usb-isp1761")) - devflags |= ISP1760_FLAG_ISP1761; - -- /* Some systems wire up only 16 of the 32 data lines */ -+ if (of_device_is_compatible(dp, "nxp,usb-isp1763")) -+ devflags |= ISP1760_FLAG_ISP1763; -+ -+ /* -+ * Some systems wire up only 8 of 16 data lines or -+ * 16 of the 32 data lines -+ */ - of_property_read_u32(dp, "bus-width", &bus_width); - if (bus_width == 16) - devflags |= ISP1760_FLAG_BUS_WIDTH_16; -+ else if (bus_width == 8) -+ devflags |= ISP1760_FLAG_BUS_WIDTH_8; - - if (usb_get_dr_mode(&pdev->dev) == USB_DR_MODE_PERIPHERAL) - devflags |= ISP1760_FLAG_PERIPHERAL_EN; -@@ -250,6 +259,7 @@ static int isp1760_plat_remove(struct platform_device *pdev) - static const struct of_device_id isp1760_of_match[] = { - { .compatible = "nxp,usb-isp1760", }, - { .compatible = "nxp,usb-isp1761", }, -+ { .compatible = "nxp,usb-isp1763", }, - { }, - }; - MODULE_DEVICE_TABLE(of, isp1760_of_match); -diff --git a/drivers/usb/isp1760/isp1760-regs.h b/drivers/usb/isp1760/isp1760-regs.h -index 0d5262c37c5b..4f632cbbbd1f 100644 ---- a/drivers/usb/isp1760/isp1760-regs.h -+++ b/drivers/usb/isp1760/isp1760-regs.h -@@ -2,12 +2,14 @@ - /* - * Driver for the NXP ISP1760 chip - * -+ * Copyright 2021 Linaro, Rui Miguel Silva - * Copyright 2014 Laurent Pinchart - * Copyright 2007 Sebastian Siewior - * - * Contacts: - * Sebastian Siewior - * Laurent Pinchart -+ * Rui Miguel Silva - */ - - #ifndef _ISP176x_REGS_H_ -@@ -17,8 +19,8 @@ - * Host Controller - */ - -+/* ISP1760/31 */ - /* EHCI capability registers */ --#define ISP176x_HC_CAPLENGTH 0x000 - #define ISP176x_HC_VERSION 0x002 - #define ISP176x_HC_HCSPARAMS 0x004 - #define ISP176x_HC_HCCPARAMS 0x008 -@@ -59,7 +61,13 @@ - #define ISP176x_HC_INT_IRQ_MASK_AND 0x328 - #define ISP176x_HC_ATL_IRQ_MASK_AND 0x32c - -+#define ISP176x_HC_OTG_CTRL_SET 0x374 -+#define ISP176x_HC_OTG_CTRL_CLEAR 0x376 -+ - enum isp176x_host_controller_fields { -+ /* HC_PORTSC1 */ -+ PORT_OWNER, PORT_POWER, PORT_LSTATUS, PORT_RESET, PORT_SUSPEND, -+ PORT_RESUME, PORT_PE, PORT_CSC, PORT_CONNECT, - /* HC_HCSPARAMS */ - HCS_PPC, HCS_N_PORTS, - /* HC_HCCPARAMS */ -@@ -72,25 +80,86 @@ enum isp176x_host_controller_fields { - HC_FRINDEX, - /* HC_CONFIGFLAG */ - FLAG_CF, -- /* HC_PORTSC1 */ -- PORT_OWNER, PORT_POWER, PORT_LSTATUS, PORT_RESET, PORT_SUSPEND, -- PORT_RESUME, PORT_PE, PORT_CSC, PORT_CONNECT, -+ /* ISO/INT/ATL PTD */ -+ HC_ISO_PTD_DONEMAP, HC_ISO_PTD_SKIPMAP, HC_ISO_PTD_LASTPTD, -+ HC_INT_PTD_DONEMAP, HC_INT_PTD_SKIPMAP, HC_INT_PTD_LASTPTD, -+ HC_ATL_PTD_DONEMAP, HC_ATL_PTD_SKIPMAP, HC_ATL_PTD_LASTPTD, - /* HC_HW_MODE_CTRL */ - ALL_ATX_RESET, HW_ANA_DIGI_OC, HW_DEV_DMA, HW_COMN_IRQ, HW_COMN_DMA, - HW_DATA_BUS_WIDTH, HW_DACK_POL_HIGH, HW_DREQ_POL_HIGH, HW_INTR_HIGH_ACT, -- HW_INTR_EDGE_TRIG, HW_GLOBAL_INTR_EN, -+ HW_INTF_LOCK, HW_INTR_EDGE_TRIG, HW_GLOBAL_INTR_EN, -+ /* HC_CHIP_ID */ -+ HC_CHIP_ID_HIGH, HC_CHIP_ID_LOW, HC_CHIP_REV, -+ /* HC_SCRATCH */ -+ HC_SCRATCH, - /* HC_RESET */ -- SW_RESET_RESET_HC, SW_RESET_RESET_ALL, -+ SW_RESET_RESET_ATX, SW_RESET_RESET_HC, SW_RESET_RESET_ALL, - /* HC_BUFFER_STATUS */ -- INT_BUF_FILL, ATL_BUF_FILL, -+ ISO_BUF_FILL, INT_BUF_FILL, ATL_BUF_FILL, - /* HC_MEMORY */ - MEM_BANK_SEL, MEM_START_ADDR, -+ /* HC_DATA */ -+ HC_DATA, -+ /* HC_INTERRUPT */ -+ HC_INTERRUPT, - /* HC_INTERRUPT_ENABLE */ -- HC_INT_ENABLE, -+ HC_INT_IRQ_ENABLE, HC_ATL_IRQ_ENABLE, -+ /* INTERRUPT MASKS */ -+ HC_ISO_IRQ_MASK_OR, HC_INT_IRQ_MASK_OR, HC_ATL_IRQ_MASK_OR, -+ HC_ISO_IRQ_MASK_AND, HC_INT_IRQ_MASK_AND, HC_ATL_IRQ_MASK_AND, -+ /* HW_OTG_CTRL_SET */ -+ HW_OTG_DISABLE, HW_SW_SEL_HC_DC, HW_VBUS_DRV, HW_SEL_CP_EXT, -+ HW_DM_PULLDOWN, HW_DP_PULLDOWN, HW_DP_PULLUP, HW_HC_2_DIS, -+ /* HW_OTG_CTRL_CLR */ -+ HW_OTG_DISABLE_CLEAR, HW_SW_SEL_HC_DC_CLEAR, HW_VBUS_DRV_CLEAR, -+ HW_SEL_CP_EXT_CLEAR, HW_DM_PULLDOWN_CLEAR, HW_DP_PULLDOWN_CLEAR, -+ HW_DP_PULLUP_CLEAR, HW_HC_2_DIS_CLEAR, - /* Last element */ - HC_FIELD_MAX, - }; - -+/* ISP1763 */ -+/* EHCI operational registers */ -+#define ISP1763_HC_USBCMD 0x8c -+#define ISP1763_HC_USBSTS 0x90 -+#define ISP1763_HC_FRINDEX 0x98 -+ -+#define ISP1763_HC_CONFIGFLAG 0x9c -+#define ISP1763_HC_PORTSC1 0xa0 -+ -+#define ISP1763_HC_ISO_PTD_DONEMAP 0xa4 -+#define ISP1763_HC_ISO_PTD_SKIPMAP 0xa6 -+#define ISP1763_HC_ISO_PTD_LASTPTD 0xa8 -+#define ISP1763_HC_INT_PTD_DONEMAP 0xaa -+#define ISP1763_HC_INT_PTD_SKIPMAP 0xac -+#define ISP1763_HC_INT_PTD_LASTPTD 0xae -+#define ISP1763_HC_ATL_PTD_DONEMAP 0xb0 -+#define ISP1763_HC_ATL_PTD_SKIPMAP 0xb2 -+#define ISP1763_HC_ATL_PTD_LASTPTD 0xb4 -+ -+/* Configuration Register */ -+#define ISP1763_HC_HW_MODE_CTRL 0xb6 -+#define ISP1763_HC_CHIP_REV 0x70 -+#define ISP1763_HC_CHIP_ID 0x72 -+#define ISP1763_HC_SCRATCH 0x78 -+#define ISP1763_HC_RESET 0xb8 -+#define ISP1763_HC_BUFFER_STATUS 0xba -+#define ISP1763_HC_MEMORY 0xc4 -+#define ISP1763_HC_DATA 0xc6 -+ -+/* Interrupt Register */ -+#define ISP1763_HC_INTERRUPT 0xd4 -+#define ISP1763_HC_INTERRUPT_ENABLE 0xd6 -+#define ISP1763_HC_ISO_IRQ_MASK_OR 0xd8 -+#define ISP1763_HC_INT_IRQ_MASK_OR 0xda -+#define ISP1763_HC_ATL_IRQ_MASK_OR 0xdc -+#define ISP1763_HC_ISO_IRQ_MASK_AND 0xde -+#define ISP1763_HC_INT_IRQ_MASK_AND 0xe0 -+#define ISP1763_HC_ATL_IRQ_MASK_AND 0xe2 -+ -+#define ISP1763_HC_OTG_CTRL_SET 0xe4 -+#define ISP1763_HC_OTG_CTRL_CLEAR 0xe6 -+ - /* ----------------------------------------------------------------------------- - * Peripheral Controller - */ -@@ -132,9 +201,6 @@ enum isp176x_host_controller_fields { - #define ISP176x_DC_CTRLFUNC 0x0228 - #define ISP176x_DC_EPINDEX 0x022c - --#define ISP1761_DC_OTG_CTRL_SET 0x374 --#define ISP1761_DC_OTG_CTRL_CLEAR 0x376 -- - /* DMA Registers */ - #define ISP176x_DC_DMACMD 0x0230 - #define ISP176x_DC_DMATXCOUNT 0x0234 -@@ -177,13 +243,6 @@ enum isp176x_device_controller_fields { - DC_EPENABLE, DC_ENDPTYP, - /* DC_FRAMENUM */ - DC_FRAMENUM, DC_UFRAMENUM, -- /* HW_OTG_CTRL_SET */ -- HW_OTG_DISABLE, HW_SW_SEL_HC_DC, HW_VBUS_DRV, HW_SEL_CP_EXT, -- HW_DM_PULLDOWN, HW_DP_PULLDOWN, HW_DP_PULLUP, -- /* HW_OTG_CTRL_CLR */ -- HW_OTG_DISABLE_CLEAR, HW_SW_SEL_HC_DC_CLEAR, HW_VBUS_DRV_CLEAR, -- HW_SEL_CP_EXT_CLEAR, HW_DM_PULLDOWN_CLEAR, HW_DP_PULLDOWN_CLEAR, -- HW_DP_PULLUP_CLEAR, - /* Last element */ - DC_FIELD_MAX, - }; -diff --git a/drivers/usb/isp1760/isp1760-udc.c b/drivers/usb/isp1760/isp1760-udc.c -index 1e2ca43fb152..30efc9d32506 100644 ---- a/drivers/usb/isp1760/isp1760-udc.c -+++ b/drivers/usb/isp1760/isp1760-udc.c -@@ -2,10 +2,12 @@ - /* - * Driver for the NXP ISP1761 device controller - * -+ * Copyright 2021 Linaro, Rui Miguel Silva - * Copyright 2014 Ideas on Board Oy - * - * Contacts: - * Laurent Pinchart -+ * Rui Miguel Silva - */ - - #include -diff --git a/drivers/usb/isp1760/isp1760-udc.h b/drivers/usb/isp1760/isp1760-udc.h -index a49096c0ac8e..f2ab5929cc9f 100644 ---- a/drivers/usb/isp1760/isp1760-udc.h -+++ b/drivers/usb/isp1760/isp1760-udc.h -@@ -2,10 +2,12 @@ - /* - * Driver for the NXP ISP1761 device controller - * -+ * Copyright 2021 Linaro, Rui Miguel Silva - * Copyright 2014 Ideas on Board Oy - * - * Contacts: - * Laurent Pinchart -+ * Rui Miguel Silva - */ - - #ifndef _ISP1760_UDC_H_ --- -2.33.0 - diff --git a/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0008-dt-bindings-usb-nxp-isp1760-add-bindings.patch b/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0008-dt-bindings-usb-nxp-isp1760-add-bindings.patch deleted file mode 100644 index 88a701c3..00000000 --- a/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0008-dt-bindings-usb-nxp-isp1760-add-bindings.patch +++ /dev/null @@ -1,99 +0,0 @@ -Upstream-Status: Accepted [merged with kernel 5.14.9] -Signed-off-by: Arpita S.K - -From e7a990e00cb13ce66d4008e3b77e8507be0c2e27 Mon Sep 17 00:00:00 2001 -From: Rui Miguel Silva -Date: Thu, 13 May 2021 09:47:16 +0100 -Subject: [PATCH 8/9] dt-bindings: usb: nxp,isp1760: add bindings - -The nxp,isp1760 driver is old in the tree, but did not had a bindings -entry, since I am extend it to support isp1763 in the same family, use -this to add a proper yaml bindings file. - -Reviewed-by: Rob Herring -Signed-off-by: Rui Miguel Silva -Link: https://lore.kernel.org/r/20210513084717.2487366-9-rui.silva@linaro.org -Signed-off-by: Greg Kroah-Hartman ---- - .../devicetree/bindings/usb/nxp,isp1760.yaml | 69 +++++++++++++++++++ - 1 file changed, 69 insertions(+) - create mode 100644 Documentation/devicetree/bindings/usb/nxp,isp1760.yaml - -diff --git a/Documentation/devicetree/bindings/usb/nxp,isp1760.yaml b/Documentation/devicetree/bindings/usb/nxp,isp1760.yaml -new file mode 100644 -index 000000000000..a88f99adfe8e ---- /dev/null -+++ b/Documentation/devicetree/bindings/usb/nxp,isp1760.yaml -@@ -0,0 +1,69 @@ -+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) -+%YAML 1.2 -+--- -+$id: http://devicetree.org/schemas/usb/nxp,isp1760.yaml# -+$schema: http://devicetree.org/meta-schemas/core.yaml# -+ -+title: NXP ISP1760 family controller bindings -+ -+maintainers: -+ - Sebastian Siewior -+ - Laurent Pinchart -+ -+description: | -+ NXP ISP1760 family, which includes ISP1760/1761/1763 devicetree controller -+ bindings -+ -+properties: -+ compatible: -+ enum: -+ - nxp,usb-isp1760 -+ - nxp,usb-isp1761 -+ - nxp,usb-isp1763 -+ reg: -+ maxItems: 1 -+ -+ interrupts: -+ minItems: 1 -+ maxItems: 2 -+ items: -+ - description: Host controller interrupt -+ - description: Device controller interrupt in isp1761 -+ -+ interrupt-names: -+ minItems: 1 -+ maxItems: 2 -+ items: -+ - const: host -+ - const: peripheral -+ -+ bus-width: -+ description: -+ Number of data lines. -+ enum: [8, 16, 32] -+ default: 32 -+ -+ dr_mode: -+ enum: -+ - host -+ - peripheral -+ -+required: -+ - compatible -+ - reg -+ - interrupts -+ -+additionalProperties: false -+ -+examples: -+ - | -+ #include -+ usb@40200000 { -+ compatible = "nxp,usb-isp1763"; -+ reg = <0x40200000 0x100000>; -+ interrupts = ; -+ bus-width = <16>; -+ dr_mode = "host"; -+ }; -+ -+... --- -2.32.0 - diff --git a/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0009-usb-isp1763-add-peripheral-mode.patch b/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0009-usb-isp1763-add-peripheral-mode.patch deleted file mode 100644 index 7b06c913..00000000 --- a/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0009-usb-isp1763-add-peripheral-mode.patch +++ /dev/null @@ -1,303 +0,0 @@ -Upstream-Status: Accepted [merged with kernel 5.14.9] -Signed-off-by: Arpita S.K - -From d369c9187c1897ce5339716354ce47b2c2f67352 Mon Sep 17 00:00:00 2001 -From: Rui Miguel Silva -Date: Thu, 13 May 2021 09:47:17 +0100 -Subject: [PATCH 08/23] usb: isp1763: add peripheral mode - -Besides the already host mode support add peripheral mode support for -the isp1763 IP from the isp1760 family. - -Signed-off-by: Rui Miguel Silva -Link: https://lore.kernel.org/r/20210513084717.2487366-10-rui.silva@linaro.org -Signed-off-by: Greg Kroah-Hartman ---- - drivers/usb/isp1760/isp1760-core.c | 25 +++++++++++------ - drivers/usb/isp1760/isp1760-regs.h | 42 ++++++++++++++++++++++++++++ - drivers/usb/isp1760/isp1760-udc.c | 45 ++++++++++++++++++++++-------- - drivers/usb/isp1760/isp1760-udc.h | 1 + - 4 files changed, 94 insertions(+), 19 deletions(-) - -diff --git a/drivers/usb/isp1760/isp1760-core.c b/drivers/usb/isp1760/isp1760-core.c -index 1d847f13abab..ff07e2890692 100644 ---- a/drivers/usb/isp1760/isp1760-core.c -+++ b/drivers/usb/isp1760/isp1760-core.c -@@ -83,7 +83,8 @@ static int isp1760_init_core(struct isp1760_device *isp) - * - * TODO: Really support OTG. For now we configure port 1 in device mode - */ -- if ((isp->devflags & ISP1760_FLAG_ISP1761) && -+ if (((isp->devflags & ISP1760_FLAG_ISP1761) || -+ (isp->devflags & ISP1760_FLAG_ISP1763)) && - (isp->devflags & ISP1760_FLAG_PERIPHERAL_EN)) { - isp1760_field_set(hcd->fields, HW_DM_PULLDOWN); - isp1760_field_set(hcd->fields, HW_DP_PULLDOWN); -@@ -470,13 +471,15 @@ static const struct regmap_config isp1763_dc_regmap_conf = { - int isp1760_register(struct resource *mem, int irq, unsigned long irqflags, - struct device *dev, unsigned int devflags) - { -- bool udc_disabled = !(devflags & ISP1760_FLAG_ISP1761); - const struct regmap_config *hc_regmap; - const struct reg_field *hc_reg_fields; -+ const struct regmap_config *dc_regmap; -+ const struct reg_field *dc_reg_fields; - struct isp1760_device *isp; - struct isp1760_hcd *hcd; - struct isp1760_udc *udc; - struct regmap_field *f; -+ bool udc_enabled; - int ret; - int i; - -@@ -484,8 +487,11 @@ int isp1760_register(struct resource *mem, int irq, unsigned long irqflags, - * If neither the HCD not the UDC is enabled return an error, as no - * device would be registered. - */ -+ udc_enabled = ((devflags & ISP1760_FLAG_ISP1763) || -+ (devflags & ISP1760_FLAG_ISP1761)); -+ - if ((!IS_ENABLED(CONFIG_USB_ISP1760_HCD) || usb_disabled()) && -- (!IS_ENABLED(CONFIG_USB_ISP1761_UDC) || udc_disabled)) -+ (!IS_ENABLED(CONFIG_USB_ISP1761_UDC) || !udc_enabled)) - return -ENODEV; - - isp = devm_kzalloc(dev, sizeof(*isp), GFP_KERNEL); -@@ -498,6 +504,7 @@ int isp1760_register(struct resource *mem, int irq, unsigned long irqflags, - udc = &isp->udc; - - hcd->is_isp1763 = !!(devflags & ISP1760_FLAG_ISP1763); -+ udc->is_isp1763 = !!(devflags & ISP1760_FLAG_ISP1763); - - if (!hcd->is_isp1763 && (devflags & ISP1760_FLAG_BUS_WIDTH_8)) { - dev_err(dev, "isp1760/61 do not support data width 8\n"); -@@ -507,9 +514,13 @@ int isp1760_register(struct resource *mem, int irq, unsigned long irqflags, - if (hcd->is_isp1763) { - hc_regmap = &isp1763_hc_regmap_conf; - hc_reg_fields = &isp1763_hc_reg_fields[0]; -+ dc_regmap = &isp1763_dc_regmap_conf; -+ dc_reg_fields = &isp1763_dc_reg_fields[0]; - } else { - hc_regmap = &isp1760_hc_regmap_conf; - hc_reg_fields = &isp1760_hc_reg_fields[0]; -+ dc_regmap = &isp1761_dc_regmap_conf; -+ dc_reg_fields = &isp1761_dc_reg_fields[0]; - } - - isp->rst_gpio = devm_gpiod_get_optional(dev, NULL, GPIOD_OUT_HIGH); -@@ -532,14 +543,12 @@ int isp1760_register(struct resource *mem, int irq, unsigned long irqflags, - hcd->fields[i] = f; - } - -- udc->regs = devm_regmap_init_mmio(dev, hcd->base, -- &isp1761_dc_regmap_conf); -+ udc->regs = devm_regmap_init_mmio(dev, hcd->base, dc_regmap); - if (IS_ERR(udc->regs)) - return PTR_ERR(udc->regs); - - for (i = 0; i < DC_FIELD_MAX; i++) { -- f = devm_regmap_field_alloc(dev, udc->regs, -- isp1761_dc_reg_fields[i]); -+ f = devm_regmap_field_alloc(dev, udc->regs, dc_reg_fields[i]); - if (IS_ERR(f)) - return PTR_ERR(f); - -@@ -562,7 +571,7 @@ int isp1760_register(struct resource *mem, int irq, unsigned long irqflags, - return ret; - } - -- if (IS_ENABLED(CONFIG_USB_ISP1761_UDC) && !udc_disabled) { -+ if (IS_ENABLED(CONFIG_USB_ISP1761_UDC) && udc_enabled) { - ret = isp1760_udc_register(isp, irq, irqflags); - if (ret < 0) { - isp1760_hcd_unregister(hcd); -diff --git a/drivers/usb/isp1760/isp1760-regs.h b/drivers/usb/isp1760/isp1760-regs.h -index 4f632cbbbd1f..94ea60c20b2a 100644 ---- a/drivers/usb/isp1760/isp1760-regs.h -+++ b/drivers/usb/isp1760/isp1760-regs.h -@@ -243,8 +243,50 @@ enum isp176x_device_controller_fields { - DC_EPENABLE, DC_ENDPTYP, - /* DC_FRAMENUM */ - DC_FRAMENUM, DC_UFRAMENUM, -+ /* DC_CHIP_ID */ -+ DC_CHIP_ID_HIGH, DC_CHIP_ID_LOW, -+ /* DC_SCRATCH */ -+ DC_SCRATCH, - /* Last element */ - DC_FIELD_MAX, - }; - -+/* ISP1763 */ -+/* Initialization Registers */ -+#define ISP1763_DC_ADDRESS 0x00 -+#define ISP1763_DC_MODE 0x0c -+#define ISP1763_DC_INTCONF 0x10 -+#define ISP1763_DC_INTENABLE 0x14 -+ -+/* Data Flow Registers */ -+#define ISP1763_DC_EPMAXPKTSZ 0x04 -+#define ISP1763_DC_EPTYPE 0x08 -+ -+#define ISP1763_DC_BUFLEN 0x1c -+#define ISP1763_DC_BUFSTAT 0x1e -+#define ISP1763_DC_DATAPORT 0x20 -+ -+#define ISP1763_DC_CTRLFUNC 0x28 -+#define ISP1763_DC_EPINDEX 0x2c -+ -+/* DMA Registers */ -+#define ISP1763_DC_DMACMD 0x30 -+#define ISP1763_DC_DMATXCOUNT 0x34 -+#define ISP1763_DC_DMACONF 0x38 -+#define ISP1763_DC_DMAHW 0x3c -+#define ISP1763_DC_DMAINTREASON 0x50 -+#define ISP1763_DC_DMAINTEN 0x54 -+#define ISP1763_DC_DMAEP 0x58 -+#define ISP1763_DC_DMABURSTCOUNT 0x64 -+ -+/* General Registers */ -+#define ISP1763_DC_INTERRUPT 0x18 -+#define ISP1763_DC_CHIPID_LOW 0x70 -+#define ISP1763_DC_CHIPID_HIGH 0x72 -+#define ISP1763_DC_FRAMENUM 0x74 -+#define ISP1763_DC_SCRATCH 0x78 -+#define ISP1763_DC_UNLOCKDEV 0x7c -+#define ISP1763_DC_INTPULSEWIDTH 0x80 -+#define ISP1763_DC_TESTMODE 0x84 -+ - #endif -diff --git a/drivers/usb/isp1760/isp1760-udc.c b/drivers/usb/isp1760/isp1760-udc.c -index 30efc9d32506..3e05e3605435 100644 ---- a/drivers/usb/isp1760/isp1760-udc.c -+++ b/drivers/usb/isp1760/isp1760-udc.c -@@ -1151,6 +1151,10 @@ static void isp1760_udc_disconnect(struct isp1760_udc *udc) - - static void isp1760_udc_init_hw(struct isp1760_udc *udc) - { -+ u32 intconf = udc->is_isp1763 ? ISP1763_DC_INTCONF : ISP176x_DC_INTCONF; -+ u32 intena = udc->is_isp1763 ? ISP1763_DC_INTENABLE : -+ ISP176x_DC_INTENABLE; -+ - /* - * The device controller currently shares its interrupt with the host - * controller, the DC_IRQ polarity and signaling mode are ignored. Set -@@ -1160,11 +1164,11 @@ static void isp1760_udc_init_hw(struct isp1760_udc *udc) - * ACK tokens only (and NYET for the out pipe). The default - * configuration also generates an interrupt on the first NACK token. - */ -- isp1760_reg_write(udc->regs, ISP176x_DC_INTCONF, -+ isp1760_reg_write(udc->regs, intconf, - ISP176x_DC_CDBGMOD_ACK | ISP176x_DC_DDBGMODIN_ACK | - ISP176x_DC_DDBGMODOUT_ACK); - -- isp1760_reg_write(udc->regs, ISP176x_DC_INTENABLE, DC_IEPRXTX(7) | -+ isp1760_reg_write(udc->regs, intena, DC_IEPRXTX(7) | - DC_IEPRXTX(6) | DC_IEPRXTX(5) | DC_IEPRXTX(4) | - DC_IEPRXTX(3) | DC_IEPRXTX(2) | DC_IEPRXTX(1) | - DC_IEPRXTX(0) | ISP176x_DC_IEP0SETUP | -@@ -1304,13 +1308,14 @@ static int isp1760_udc_start(struct usb_gadget *gadget, - static int isp1760_udc_stop(struct usb_gadget *gadget) - { - struct isp1760_udc *udc = gadget_to_udc(gadget); -+ u32 mode_reg = udc->is_isp1763 ? ISP1763_DC_MODE : ISP176x_DC_MODE; - unsigned long flags; - - dev_dbg(udc->isp->dev, "%s\n", __func__); - - del_timer_sync(&udc->vbus_timer); - -- isp1760_reg_write(udc->regs, ISP176x_DC_MODE, 0); -+ isp1760_reg_write(udc->regs, mode_reg, 0); - - spin_lock_irqsave(&udc->lock, flags); - udc->driver = NULL; -@@ -1332,15 +1337,30 @@ static const struct usb_gadget_ops isp1760_udc_ops = { - * Interrupt Handling - */ - -+static u32 isp1760_udc_irq_get_status(struct isp1760_udc *udc) -+{ -+ u32 status; -+ -+ if (udc->is_isp1763) { -+ status = isp1760_reg_read(udc->regs, ISP1763_DC_INTERRUPT) -+ & isp1760_reg_read(udc->regs, ISP1763_DC_INTENABLE); -+ isp1760_reg_write(udc->regs, ISP1763_DC_INTERRUPT, status); -+ } else { -+ status = isp1760_reg_read(udc->regs, ISP176x_DC_INTERRUPT) -+ & isp1760_reg_read(udc->regs, ISP176x_DC_INTENABLE); -+ isp1760_reg_write(udc->regs, ISP176x_DC_INTERRUPT, status); -+ } -+ -+ return status; -+} -+ - static irqreturn_t isp1760_udc_irq(int irq, void *dev) - { - struct isp1760_udc *udc = dev; - unsigned int i; - u32 status; - -- status = isp1760_reg_read(udc->regs, ISP176x_DC_INTERRUPT) -- & isp1760_reg_read(udc->regs, ISP176x_DC_INTENABLE); -- isp1760_reg_write(udc->regs, ISP176x_DC_INTERRUPT, status); -+ status = isp1760_udc_irq_get_status(udc); - - if (status & DC_IEVBUS) { - dev_dbg(udc->isp->dev, "%s(VBUS)\n", __func__); -@@ -1475,6 +1495,7 @@ static void isp1760_udc_init_eps(struct isp1760_udc *udc) - - static int isp1760_udc_init(struct isp1760_udc *udc) - { -+ u32 mode_reg = udc->is_isp1763 ? ISP1763_DC_MODE : ISP176x_DC_MODE; - u16 scratch; - u32 chipid; - -@@ -1484,9 +1505,10 @@ static int isp1760_udc_init(struct isp1760_udc *udc) - * register, and reading the scratch register value back. The chip ID - * and scratch register contents must match the expected values. - */ -- isp1760_reg_write(udc->regs, ISP176x_DC_SCRATCH, 0xbabe); -- chipid = isp1760_reg_read(udc->regs, ISP176x_DC_CHIPID); -- scratch = isp1760_reg_read(udc->regs, ISP176x_DC_SCRATCH); -+ isp1760_udc_write(udc, DC_SCRATCH, 0xbabe); -+ chipid = isp1760_udc_read(udc, DC_CHIP_ID_HIGH) << 16; -+ chipid |= isp1760_udc_read(udc, DC_CHIP_ID_LOW); -+ scratch = isp1760_udc_read(udc, DC_SCRATCH); - - if (scratch != 0xbabe) { - dev_err(udc->isp->dev, -@@ -1495,7 +1517,8 @@ static int isp1760_udc_init(struct isp1760_udc *udc) - return -ENODEV; - } - -- if (chipid != 0x00011582 && chipid != 0x00158210) { -+ if (chipid != 0x00011582 && chipid != 0x00158210 && -+ chipid != 0x00176320) { - dev_err(udc->isp->dev, "udc: invalid chip ID 0x%08x\n", chipid); - return -ENODEV; - } -@@ -1503,7 +1526,7 @@ static int isp1760_udc_init(struct isp1760_udc *udc) - /* Reset the device controller. */ - isp1760_udc_set(udc, DC_SFRESET); - usleep_range(10000, 11000); -- isp1760_reg_write(udc->regs, ISP176x_DC_MODE, 0); -+ isp1760_reg_write(udc->regs, mode_reg, 0); - usleep_range(10000, 11000); - - return 0; -diff --git a/drivers/usb/isp1760/isp1760-udc.h b/drivers/usb/isp1760/isp1760-udc.h -index f2ab5929cc9f..22044e86bc0e 100644 ---- a/drivers/usb/isp1760/isp1760-udc.h -+++ b/drivers/usb/isp1760/isp1760-udc.h -@@ -84,6 +84,7 @@ struct isp1760_udc { - u16 ep0_length; - - bool connected; -+ bool is_isp1763; - - unsigned int devstatus; - }; --- -2.33.0 - diff --git a/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0010-firmware-smccc-Add-SMCCC-TRNG-function-call-IDs.patch b/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0010-firmware-smccc-Add-SMCCC-TRNG-function-call-IDs.patch deleted file mode 100644 index 56efe4d6..00000000 --- a/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0010-firmware-smccc-Add-SMCCC-TRNG-function-call-IDs.patch +++ /dev/null @@ -1,69 +0,0 @@ -Upstream-Status: Accepted [merged with kernel 5.14] -Signed-off-by: Arpita S.K - -From 67c6bb56b649590a3f59c2a92331aa4e83d4534c Mon Sep 17 00:00:00 2001 -From: Ard Biesheuvel -Date: Wed, 6 Jan 2021 10:34:49 +0000 -Subject: [PATCH] firmware: smccc: Add SMCCC TRNG function call IDs - -The ARM architected TRNG firmware interface, described in ARM spec -DEN0098, define an ARM SMCCC based interface to a true random number -generator, provided by firmware. - -Add the definitions of the SMCCC functions as defined by the spec. - -Signed-off-by: Ard Biesheuvel -Signed-off-by: Andre Przywara -Reviewed-by: Linus Walleij -Reviewed-by: Sudeep Holla -Link: https://lore.kernel.org/r/20210106103453.152275-2-andre.przywara@arm.com -Signed-off-by: Will Deacon ---- - include/linux/arm-smccc.h | 31 +++++++++++++++++++++++++++++++ - 1 file changed, 31 insertions(+) - -diff --git a/include/linux/arm-smccc.h b/include/linux/arm-smccc.h -index f860645f6512..62c54234576c 100644 ---- a/include/linux/arm-smccc.h -+++ b/include/linux/arm-smccc.h -@@ -102,6 +102,37 @@ - ARM_SMCCC_OWNER_STANDARD_HYP, \ - 0x21) - -+/* TRNG entropy source calls (defined by ARM DEN0098) */ -+#define ARM_SMCCC_TRNG_VERSION \ -+ ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \ -+ ARM_SMCCC_SMC_32, \ -+ ARM_SMCCC_OWNER_STANDARD, \ -+ 0x50) -+ -+#define ARM_SMCCC_TRNG_FEATURES \ -+ ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \ -+ ARM_SMCCC_SMC_32, \ -+ ARM_SMCCC_OWNER_STANDARD, \ -+ 0x51) -+ -+#define ARM_SMCCC_TRNG_GET_UUID \ -+ ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \ -+ ARM_SMCCC_SMC_32, \ -+ ARM_SMCCC_OWNER_STANDARD, \ -+ 0x52) -+ -+#define ARM_SMCCC_TRNG_RND32 \ -+ ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \ -+ ARM_SMCCC_SMC_32, \ -+ ARM_SMCCC_OWNER_STANDARD, \ -+ 0x53) -+ -+#define ARM_SMCCC_TRNG_RND64 \ -+ ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \ -+ ARM_SMCCC_SMC_64, \ -+ ARM_SMCCC_OWNER_STANDARD, \ -+ 0x53) -+ - /* - * Return codes defined in ARM DEN 0070A - * ARM DEN 0070A is now merged/consolidated into ARM DEN 0028 C --- -2.17.1 - diff --git a/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0011-firmware-smccc-Introduce-SMCCC-TRNG-framework.patch b/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0011-firmware-smccc-Introduce-SMCCC-TRNG-framework.patch deleted file mode 100644 index 44140fae..00000000 --- a/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0011-firmware-smccc-Introduce-SMCCC-TRNG-framework.patch +++ /dev/null @@ -1,103 +0,0 @@ -Upstream-Status: Accepted [merged with kernel 5.14] -Signed-off-by: Arpita S.K - -From a37e31fc97efe7f7c68cb381cf4390e472c09061 Mon Sep 17 00:00:00 2001 -From: Andre Przywara -Date: Wed, 6 Jan 2021 10:34:50 +0000 -Subject: [PATCH] firmware: smccc: Introduce SMCCC TRNG framework - -The ARM DEN0098 document describe an SMCCC based firmware service to -deliver hardware generated random numbers. Its existence is advertised -according to the SMCCC v1.1 specification. - -Add a (dummy) call to probe functions implemented in each architecture -(ARM and arm64), to determine the existence of this interface. -For now this return false, but this will be overwritten by each -architecture's support patch. - -Signed-off-by: Andre Przywara -Reviewed-by: Linus Walleij -Reviewed-by: Sudeep Holla -Signed-off-by: Will Deacon ---- - arch/arm/include/asm/archrandom.h | 10 ++++++++++ - arch/arm64/include/asm/archrandom.h | 12 ++++++++++++ - drivers/firmware/smccc/smccc.c | 6 ++++++ - 3 files changed, 28 insertions(+) - create mode 100644 arch/arm/include/asm/archrandom.h - -diff --git a/arch/arm/include/asm/archrandom.h b/arch/arm/include/asm/archrandom.h -new file mode 100644 -index 000000000000..a8e84ca5c2ee ---- /dev/null -+++ b/arch/arm/include/asm/archrandom.h -@@ -0,0 +1,10 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+#ifndef _ASM_ARCHRANDOM_H -+#define _ASM_ARCHRANDOM_H -+ -+static inline bool __init smccc_probe_trng(void) -+{ -+ return false; -+} -+ -+#endif /* _ASM_ARCHRANDOM_H */ -diff --git a/arch/arm64/include/asm/archrandom.h b/arch/arm64/include/asm/archrandom.h -index ffb1a40d5475..abe07c21da8e 100644 ---- a/arch/arm64/include/asm/archrandom.h -+++ b/arch/arm64/include/asm/archrandom.h -@@ -8,6 +8,11 @@ - #include - #include - -+static inline bool __init smccc_probe_trng(void) -+{ -+ return false; -+} -+ - static inline bool __arm64_rndr(unsigned long *v) - { - bool ok; -@@ -79,5 +84,12 @@ arch_get_random_seed_long_early(unsigned long *v) - } - #define arch_get_random_seed_long_early arch_get_random_seed_long_early - -+#else /* !CONFIG_ARCH_RANDOM */ -+ -+static inline bool __init smccc_probe_trng(void) -+{ -+ return false; -+} -+ - #endif /* CONFIG_ARCH_RANDOM */ - #endif /* _ASM_ARCHRANDOM_H */ -diff --git a/drivers/firmware/smccc/smccc.c b/drivers/firmware/smccc/smccc.c -index 00c88b809c0c..d52bfc5ed5e4 100644 ---- a/drivers/firmware/smccc/smccc.c -+++ b/drivers/firmware/smccc/smccc.c -@@ -5,16 +5,22 @@ - - #define pr_fmt(fmt) "smccc: " fmt - -+#include - #include - #include -+#include - - static u32 smccc_version = ARM_SMCCC_VERSION_1_0; - static enum arm_smccc_conduit smccc_conduit = SMCCC_CONDUIT_NONE; - -+bool __ro_after_init smccc_trng_available = false; -+ - void __init arm_smccc_version_init(u32 version, enum arm_smccc_conduit conduit) - { - smccc_version = version; - smccc_conduit = conduit; -+ -+ smccc_trng_available = smccc_probe_trng(); - } - - enum arm_smccc_conduit arm_smccc_1_1_get_conduit(void) --- -2.17.1 - diff --git a/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0012-arm64-smccc-Add-support-for-SMCCCv1.2-extended-input-output-registers.patch b/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0012-arm64-smccc-Add-support-for-SMCCCv1.2-extended-input-output-registers.patch deleted file mode 100644 index c338a501..00000000 --- a/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0012-arm64-smccc-Add-support-for-SMCCCv1.2-extended-input-output-registers.patch +++ /dev/null @@ -1,192 +0,0 @@ -Upstream-Status: Accepted [merged with kernel 5.14] -Signed-off-by: Arpita S.K - -From 3fdc0cb59d97f87e2cc708d424f1538e31744286 Mon Sep 17 00:00:00 2001 -From: Sudeep Holla -Date: Tue, 18 May 2021 17:36:18 +0100 -Subject: [PATCH] arm64: smccc: Add support for SMCCCv1.2 extended input/output - registers -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -SMCCC v1.2 allows x8-x17 to be used as parameter registers and x4—x17 -to be used as result registers in SMC64/HVC64. Arm Firmware Framework -for Armv8-A specification makes use of x0-x7 as parameter and result -registers. There are other users like Hyper-V who intend to use beyond -x0-x7 as well. - -Current SMCCC interface in the kernel just use x0-x7 as parameter and -x0-x3 as result registers as required by SMCCCv1.0. Let us add new -interface to support this extended set of input/output registers namely -x0-x17 as both parameter and result registers. - -Acked-by: Mark Rutland -Tested-by: Michael Kelley -Reviewed-by: Michael Kelley -Cc: Will Deacon -Cc: Catalin Marinas -Signed-off-by: Sudeep Holla -Reviewed-by: Mark Brown -Link: https://lore.kernel.org/r/20210518163618.43950-1-sudeep.holla@arm.com -Signed-off-by: Will Deacon ---- - arch/arm64/kernel/asm-offsets.c | 9 ++++++ - arch/arm64/kernel/smccc-call.S | 57 +++++++++++++++++++++++++++++++++ - include/linux/arm-smccc.h | 55 +++++++++++++++++++++++++++++++ - 3 files changed, 121 insertions(+) - -diff --git a/arch/arm64/kernel/asm-offsets.c b/arch/arm64/kernel/asm-offsets.c -index 0cb34ccb6e73..74321bc9a459 100644 ---- a/arch/arm64/kernel/asm-offsets.c -+++ b/arch/arm64/kernel/asm-offsets.c -@@ -138,6 +138,15 @@ int main(void) - DEFINE(ARM_SMCCC_RES_X2_OFFS, offsetof(struct arm_smccc_res, a2)); - DEFINE(ARM_SMCCC_QUIRK_ID_OFFS, offsetof(struct arm_smccc_quirk, id)); - DEFINE(ARM_SMCCC_QUIRK_STATE_OFFS, offsetof(struct arm_smccc_quirk, state)); -+ DEFINE(ARM_SMCCC_1_2_REGS_X0_OFFS, offsetof(struct arm_smccc_1_2_regs, a0)); -+ DEFINE(ARM_SMCCC_1_2_REGS_X2_OFFS, offsetof(struct arm_smccc_1_2_regs, a2)); -+ DEFINE(ARM_SMCCC_1_2_REGS_X4_OFFS, offsetof(struct arm_smccc_1_2_regs, a4)); -+ DEFINE(ARM_SMCCC_1_2_REGS_X6_OFFS, offsetof(struct arm_smccc_1_2_regs, a6)); -+ DEFINE(ARM_SMCCC_1_2_REGS_X8_OFFS, offsetof(struct arm_smccc_1_2_regs, a8)); -+ DEFINE(ARM_SMCCC_1_2_REGS_X10_OFFS, offsetof(struct arm_smccc_1_2_regs, a10)); -+ DEFINE(ARM_SMCCC_1_2_REGS_X12_OFFS, offsetof(struct arm_smccc_1_2_regs, a12)); -+ DEFINE(ARM_SMCCC_1_2_REGS_X14_OFFS, offsetof(struct arm_smccc_1_2_regs, a14)); -+ DEFINE(ARM_SMCCC_1_2_REGS_X16_OFFS, offsetof(struct arm_smccc_1_2_regs, a16)); - BLANK(); - DEFINE(HIBERN_PBE_ORIG, offsetof(struct pbe, orig_address)); - DEFINE(HIBERN_PBE_ADDR, offsetof(struct pbe, address)); -diff --git a/arch/arm64/kernel/smccc-call.S b/arch/arm64/kernel/smccc-call.S -index d62447964ed9..2def9d0dd3dd 100644 ---- a/arch/arm64/kernel/smccc-call.S -+++ b/arch/arm64/kernel/smccc-call.S -@@ -43,3 +43,60 @@ SYM_FUNC_START(__arm_smccc_hvc) - SMCCC hvc - SYM_FUNC_END(__arm_smccc_hvc) - EXPORT_SYMBOL(__arm_smccc_hvc) -+ -+ .macro SMCCC_1_2 instr -+ /* Save `res` and free a GPR that won't be clobbered */ -+ stp x1, x19, [sp, #-16]! -+ -+ /* Ensure `args` won't be clobbered while loading regs in next step */ -+ mov x19, x0 -+ -+ /* Load the registers x0 - x17 from the struct arm_smccc_1_2_regs */ -+ ldp x0, x1, [x19, #ARM_SMCCC_1_2_REGS_X0_OFFS] -+ ldp x2, x3, [x19, #ARM_SMCCC_1_2_REGS_X2_OFFS] -+ ldp x4, x5, [x19, #ARM_SMCCC_1_2_REGS_X4_OFFS] -+ ldp x6, x7, [x19, #ARM_SMCCC_1_2_REGS_X6_OFFS] -+ ldp x8, x9, [x19, #ARM_SMCCC_1_2_REGS_X8_OFFS] -+ ldp x10, x11, [x19, #ARM_SMCCC_1_2_REGS_X10_OFFS] -+ ldp x12, x13, [x19, #ARM_SMCCC_1_2_REGS_X12_OFFS] -+ ldp x14, x15, [x19, #ARM_SMCCC_1_2_REGS_X14_OFFS] -+ ldp x16, x17, [x19, #ARM_SMCCC_1_2_REGS_X16_OFFS] -+ -+ \instr #0 -+ -+ /* Load the `res` from the stack */ -+ ldr x19, [sp] -+ -+ /* Store the registers x0 - x17 into the result structure */ -+ stp x0, x1, [x19, #ARM_SMCCC_1_2_REGS_X0_OFFS] -+ stp x2, x3, [x19, #ARM_SMCCC_1_2_REGS_X2_OFFS] -+ stp x4, x5, [x19, #ARM_SMCCC_1_2_REGS_X4_OFFS] -+ stp x6, x7, [x19, #ARM_SMCCC_1_2_REGS_X6_OFFS] -+ stp x8, x9, [x19, #ARM_SMCCC_1_2_REGS_X8_OFFS] -+ stp x10, x11, [x19, #ARM_SMCCC_1_2_REGS_X10_OFFS] -+ stp x12, x13, [x19, #ARM_SMCCC_1_2_REGS_X12_OFFS] -+ stp x14, x15, [x19, #ARM_SMCCC_1_2_REGS_X14_OFFS] -+ stp x16, x17, [x19, #ARM_SMCCC_1_2_REGS_X16_OFFS] -+ -+ /* Restore original x19 */ -+ ldp xzr, x19, [sp], #16 -+ ret -+.endm -+ -+/* -+ * void arm_smccc_1_2_hvc(const struct arm_smccc_1_2_regs *args, -+ * struct arm_smccc_1_2_regs *res); -+ */ -+SYM_FUNC_START(arm_smccc_1_2_hvc) -+ SMCCC_1_2 hvc -+SYM_FUNC_END(arm_smccc_1_2_hvc) -+EXPORT_SYMBOL(arm_smccc_1_2_hvc) -+ -+/* -+ * void arm_smccc_1_2_smc(const struct arm_smccc_1_2_regs *args, -+ * struct arm_smccc_1_2_regs *res); -+ */ -+SYM_FUNC_START(arm_smccc_1_2_smc) -+ SMCCC_1_2 smc -+SYM_FUNC_END(arm_smccc_1_2_smc) -+EXPORT_SYMBOL(arm_smccc_1_2_smc) -diff --git a/include/linux/arm-smccc.h b/include/linux/arm-smccc.h -index 6861489a1890..5cef2b8b0479 100644 ---- a/include/linux/arm-smccc.h -+++ b/include/linux/arm-smccc.h -@@ -227,6 +227,61 @@ struct arm_smccc_res { - unsigned long a3; - }; - -+#ifdef CONFIG_ARM64 -+/** -+ * struct arm_smccc_1_2_regs - Arguments for or Results from SMC/HVC call -+ * @a0-a17 argument values from registers 0 to 17 -+ */ -+struct arm_smccc_1_2_regs { -+ unsigned long a0; -+ unsigned long a1; -+ unsigned long a2; -+ unsigned long a3; -+ unsigned long a4; -+ unsigned long a5; -+ unsigned long a6; -+ unsigned long a7; -+ unsigned long a8; -+ unsigned long a9; -+ unsigned long a10; -+ unsigned long a11; -+ unsigned long a12; -+ unsigned long a13; -+ unsigned long a14; -+ unsigned long a15; -+ unsigned long a16; -+ unsigned long a17; -+}; -+ -+/** -+ * arm_smccc_1_2_hvc() - make HVC calls -+ * @args: arguments passed via struct arm_smccc_1_2_regs -+ * @res: result values via struct arm_smccc_1_2_regs -+ * -+ * This function is used to make HVC calls following SMC Calling Convention -+ * v1.2 or above. The content of the supplied param are copied from the -+ * structure to registers prior to the HVC instruction. The return values -+ * are updated with the content from registers on return from the HVC -+ * instruction. -+ */ -+asmlinkage void arm_smccc_1_2_hvc(const struct arm_smccc_1_2_regs *args, -+ struct arm_smccc_1_2_regs *res); -+ -+/** -+ * arm_smccc_1_2_smc() - make SMC calls -+ * @args: arguments passed via struct arm_smccc_1_2_regs -+ * @res: result values via struct arm_smccc_1_2_regs -+ * -+ * This function is used to make SMC calls following SMC Calling Convention -+ * v1.2 or above. The content of the supplied param are copied from the -+ * structure to registers prior to the SMC instruction. The return values -+ * are updated with the content from registers on return from the SMC -+ * instruction. -+ */ -+asmlinkage void arm_smccc_1_2_smc(const struct arm_smccc_1_2_regs *args, -+ struct arm_smccc_1_2_regs *res); -+#endif -+ - /** - * struct arm_smccc_quirk - Contains quirk information - * @id: quirk identification --- -2.17.1 - diff --git a/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0013-firmware-arm_ffa-Add-initial-FFA-bus-support-for-device-enumeration.patch b/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0013-firmware-arm_ffa-Add-initial-FFA-bus-support-for-device-enumeration.patch deleted file mode 100644 index 511d63e5..00000000 --- a/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0013-firmware-arm_ffa-Add-initial-FFA-bus-support-for-device-enumeration.patch +++ /dev/null @@ -1,423 +0,0 @@ -Upstream-Status: Accepted [merged with kernel 5.14] -Signed-off-by: Arpita S.K - -From e781858488b918e30a6ff28e9eab6058b787e3b3 Mon Sep 17 00:00:00 2001 -From: Sudeep Holla -Date: Fri, 21 May 2021 16:10:29 +0100 -Subject: [PATCH] firmware: arm_ffa: Add initial FFA bus support for device - enumeration - -The Arm FF for Armv8-A specification has concept of endpoints or -partitions. In the Normal world, a partition could be a VM when -the Virtualization extension is enabled or the kernel itself. - -In order to handle multiple partitions, we can create a FFA device for -each such partition on a dedicated FFA bus. Similarly, different drivers -requiring FFA transport can be registered on the same bus. We can match -the device and drivers using UUID. This is mostly for the in-kernel -users with FFA drivers. - -Link: https://lore.kernel.org/r/20210521151033.181846-2-sudeep.holla@arm.com -Tested-by: Jens Wiklander -Signed-off-by: Sudeep Holla ---- - MAINTAINERS | 7 + - drivers/firmware/Kconfig | 1 + - drivers/firmware/Makefile | 1 + - drivers/firmware/arm_ffa/Kconfig | 16 +++ - drivers/firmware/arm_ffa/Makefile | 4 + - drivers/firmware/arm_ffa/bus.c | 207 ++++++++++++++++++++++++++++++ - include/linux/arm_ffa.h | 91 +++++++++++++ - 7 files changed, 327 insertions(+) - create mode 100644 drivers/firmware/arm_ffa/Kconfig - create mode 100644 drivers/firmware/arm_ffa/Makefile - create mode 100644 drivers/firmware/arm_ffa/bus.c - create mode 100644 include/linux/arm_ffa.h - -diff --git a/MAINTAINERS b/MAINTAINERS -index bd7aff0c120f..3b8ab94cf697 100644 ---- a/MAINTAINERS -+++ b/MAINTAINERS -@@ -7069,6 +7069,13 @@ F: include/linux/firewire.h - F: include/uapi/linux/firewire*.h - F: tools/firewire/ - -+FIRMWARE FRAMEWORK FOR ARMV8-A -+M: Sudeep Holla -+L: linux-arm-kernel@lists.infradead.org -+S: Maintained -+F: drivers/firmware/arm_ffa/ -+F: include/linux/arm_ffa.h -+ - FIRMWARE LOADER (request_firmware) - M: Luis Chamberlain - L: linux-kernel@vger.kernel.org -diff --git a/drivers/firmware/Kconfig b/drivers/firmware/Kconfig -index db0ea2d2d75a..b53ac9fc7704 100644 ---- a/drivers/firmware/Kconfig -+++ b/drivers/firmware/Kconfig -@@ -296,6 +296,7 @@ config TURRIS_MOX_RWTM - other manufacturing data and also utilize the Entropy Bit Generator - for hardware random number generation. - -+source "drivers/firmware/arm_ffa/Kconfig" - source "drivers/firmware/broadcom/Kconfig" - source "drivers/firmware/google/Kconfig" - source "drivers/firmware/efi/Kconfig" -diff --git a/drivers/firmware/Makefile b/drivers/firmware/Makefile -index 5e013b6a3692..546ac8e7f6d0 100644 ---- a/drivers/firmware/Makefile -+++ b/drivers/firmware/Makefile -@@ -22,6 +22,7 @@ obj-$(CONFIG_TI_SCI_PROTOCOL) += ti_sci.o - obj-$(CONFIG_TRUSTED_FOUNDATIONS) += trusted_foundations.o - obj-$(CONFIG_TURRIS_MOX_RWTM) += turris-mox-rwtm.o - -+obj-y += arm_ffa/ - obj-y += arm_scmi/ - obj-y += broadcom/ - obj-y += meson/ -diff --git a/drivers/firmware/arm_ffa/Kconfig b/drivers/firmware/arm_ffa/Kconfig -new file mode 100644 -index 000000000000..261a3660650a ---- /dev/null -+++ b/drivers/firmware/arm_ffa/Kconfig -@@ -0,0 +1,16 @@ -+# SPDX-License-Identifier: GPL-2.0-only -+config ARM_FFA_TRANSPORT -+ tristate "Arm Firmware Framework for Armv8-A" -+ depends on OF -+ depends on ARM64 -+ default n -+ help -+ This Firmware Framework(FF) for Arm A-profile processors describes -+ interfaces that standardize communication between the various -+ software images which includes communication between images in -+ the Secure world and Normal world. It also leverages the -+ virtualization extension to isolate software images provided -+ by an ecosystem of vendors from each other. -+ -+ This driver provides interface for all the client drivers making -+ use of the features offered by ARM FF-A. -diff --git a/drivers/firmware/arm_ffa/Makefile b/drivers/firmware/arm_ffa/Makefile -new file mode 100644 -index 000000000000..bfe4323a8784 ---- /dev/null -+++ b/drivers/firmware/arm_ffa/Makefile -@@ -0,0 +1,4 @@ -+# SPDX-License-Identifier: GPL-2.0-only -+ffa-bus-y = bus.o -+ffa-module-objs := $(ffa-bus-y) -+obj-$(CONFIG_ARM_FFA_TRANSPORT) = ffa-module.o -diff --git a/drivers/firmware/arm_ffa/bus.c b/drivers/firmware/arm_ffa/bus.c -new file mode 100644 -index 000000000000..a17874bed946 ---- /dev/null -+++ b/drivers/firmware/arm_ffa/bus.c -@@ -0,0 +1,207 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2021 ARM Ltd. -+ */ -+ -+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+static int ffa_device_match(struct device *dev, struct device_driver *drv) -+{ -+ const struct ffa_device_id *id_table; -+ struct ffa_device *ffa_dev; -+ -+ id_table = to_ffa_driver(drv)->id_table; -+ ffa_dev = to_ffa_dev(dev); -+ -+ while (!uuid_is_null(&id_table->uuid)) { -+ if (uuid_equal(&ffa_dev->uuid, &id_table->uuid)) -+ return 1; -+ id_table++; -+ } -+ -+ return 0; -+} -+ -+static int ffa_device_probe(struct device *dev) -+{ -+ struct ffa_driver *ffa_drv = to_ffa_driver(dev->driver); -+ struct ffa_device *ffa_dev = to_ffa_dev(dev); -+ -+ if (!ffa_device_match(dev, dev->driver)) -+ return -ENODEV; -+ -+ return ffa_drv->probe(ffa_dev); -+} -+ -+static int ffa_device_uevent(struct device *dev, struct kobj_uevent_env *env) -+{ -+ struct ffa_device *ffa_dev = to_ffa_dev(dev); -+ -+ return add_uevent_var(env, "MODALIAS=arm_ffa:%04x:%pUb", -+ ffa_dev->vm_id, &ffa_dev->uuid); -+} -+ -+static ssize_t partition_id_show(struct device *dev, -+ struct device_attribute *attr, char *buf) -+{ -+ struct ffa_device *ffa_dev = to_ffa_dev(dev); -+ -+ return sprintf(buf, "0x%04x\n", ffa_dev->vm_id); -+} -+static DEVICE_ATTR_RO(partition_id); -+ -+static ssize_t uuid_show(struct device *dev, struct device_attribute *attr, -+ char *buf) -+{ -+ struct ffa_device *ffa_dev = to_ffa_dev(dev); -+ -+ return sprintf(buf, "%pUb\n", &ffa_dev->uuid); -+} -+static DEVICE_ATTR_RO(uuid); -+ -+static struct attribute *ffa_device_attributes_attrs[] = { -+ &dev_attr_partition_id.attr, -+ &dev_attr_uuid.attr, -+ NULL, -+}; -+ATTRIBUTE_GROUPS(ffa_device_attributes); -+ -+struct bus_type ffa_bus_type = { -+ .name = "arm_ffa", -+ .match = ffa_device_match, -+ .probe = ffa_device_probe, -+ .uevent = ffa_device_uevent, -+ .dev_groups = ffa_device_attributes_groups, -+}; -+EXPORT_SYMBOL_GPL(ffa_bus_type); -+ -+int ffa_driver_register(struct ffa_driver *driver, struct module *owner, -+ const char *mod_name) -+{ -+ int ret; -+ -+ driver->driver.bus = &ffa_bus_type; -+ driver->driver.name = driver->name; -+ driver->driver.owner = owner; -+ driver->driver.mod_name = mod_name; -+ -+ ret = driver_register(&driver->driver); -+ if (!ret) -+ pr_debug("registered new ffa driver %s\n", driver->name); -+ -+ return ret; -+} -+EXPORT_SYMBOL_GPL(ffa_driver_register); -+ -+void ffa_driver_unregister(struct ffa_driver *driver) -+{ -+ driver_unregister(&driver->driver); -+} -+EXPORT_SYMBOL_GPL(ffa_driver_unregister); -+ -+static void ffa_release_device(struct device *dev) -+{ -+ struct ffa_device *ffa_dev = to_ffa_dev(dev); -+ -+ kfree(ffa_dev); -+} -+ -+static int __ffa_devices_unregister(struct device *dev, void *data) -+{ -+ ffa_release_device(dev); -+ -+ return 0; -+} -+ -+static void ffa_devices_unregister(void) -+{ -+ bus_for_each_dev(&ffa_bus_type, NULL, NULL, -+ __ffa_devices_unregister); -+} -+ -+bool ffa_device_is_valid(struct ffa_device *ffa_dev) -+{ -+ bool valid = false; -+ struct device *dev = NULL; -+ struct ffa_device *tmp_dev; -+ -+ do { -+ dev = bus_find_next_device(&ffa_bus_type, dev); -+ tmp_dev = to_ffa_dev(dev); -+ if (tmp_dev == ffa_dev) { -+ valid = true; -+ break; -+ } -+ put_device(dev); -+ } while (dev); -+ -+ put_device(dev); -+ -+ return valid; -+} -+ -+struct ffa_device *ffa_device_register(const uuid_t *uuid, int vm_id) -+{ -+ int ret; -+ struct device *dev; -+ struct ffa_device *ffa_dev; -+ -+ ffa_dev = kzalloc(sizeof(*ffa_dev), GFP_KERNEL); -+ if (!ffa_dev) -+ return NULL; -+ -+ dev = &ffa_dev->dev; -+ dev->bus = &ffa_bus_type; -+ dev->release = ffa_release_device; -+ dev_set_name(&ffa_dev->dev, "arm-ffa-%04x", vm_id); -+ -+ ffa_dev->vm_id = vm_id; -+ uuid_copy(&ffa_dev->uuid, uuid); -+ -+ ret = device_register(&ffa_dev->dev); -+ if (ret) { -+ dev_err(dev, "unable to register device %s err=%d\n", -+ dev_name(dev), ret); -+ put_device(dev); -+ return NULL; -+ } -+ -+ return ffa_dev; -+} -+EXPORT_SYMBOL_GPL(ffa_device_register); -+ -+void ffa_device_unregister(struct ffa_device *ffa_dev) -+{ -+ if (!ffa_dev) -+ return; -+ -+ device_unregister(&ffa_dev->dev); -+} -+EXPORT_SYMBOL_GPL(ffa_device_unregister); -+ -+static int __init arm_ffa_bus_init(void) -+{ -+ return bus_register(&ffa_bus_type); -+} -+module_init(arm_ffa_bus_init); -+ -+static void __exit arm_ffa_bus_exit(void) -+{ -+ ffa_devices_unregister(); -+ bus_unregister(&ffa_bus_type); -+} -+ -+module_exit(arm_ffa_bus_exit); -+ -+MODULE_ALIAS("arm-ffa-bus"); -+MODULE_AUTHOR("Sudeep Holla "); -+MODULE_DESCRIPTION("Arm FF-A bus driver"); -+MODULE_LICENSE("GPL v2"); -diff --git a/include/linux/arm_ffa.h b/include/linux/arm_ffa.h -new file mode 100644 -index 000000000000..331ff62c9873 ---- /dev/null -+++ b/include/linux/arm_ffa.h -@@ -0,0 +1,91 @@ -+/* SPDX-License-Identifier: GPL-2.0-only */ -+/* -+ * Copyright (C) 2021 ARM Ltd. -+ */ -+ -+#ifndef _LINUX_ARM_FFA_H -+#define _LINUX_ARM_FFA_H -+ -+#include -+#include -+#include -+#include -+#include -+ -+/* FFA Bus/Device/Driver related */ -+struct ffa_device { -+ int vm_id; -+ uuid_t uuid; -+ struct device dev; -+}; -+ -+#define to_ffa_dev(d) container_of(d, struct ffa_device, dev) -+ -+struct ffa_device_id { -+ uuid_t uuid; -+}; -+ -+struct ffa_driver { -+ const char *name; -+ int (*probe)(struct ffa_device *sdev); -+ void (*remove)(struct ffa_device *sdev); -+ const struct ffa_device_id *id_table; -+ -+ struct device_driver driver; -+}; -+ -+#define to_ffa_driver(d) container_of(d, struct ffa_driver, driver) -+ -+static inline void ffa_dev_set_drvdata(struct ffa_device *fdev, void *data) -+{ -+ fdev->dev.driver_data = data; -+} -+ -+#if IS_REACHABLE(CONFIG_ARM_FFA_TRANSPORT) -+struct ffa_device *ffa_device_register(const uuid_t *uuid, int vm_id); -+void ffa_device_unregister(struct ffa_device *ffa_dev); -+int ffa_driver_register(struct ffa_driver *driver, struct module *owner, -+ const char *mod_name); -+void ffa_driver_unregister(struct ffa_driver *driver); -+bool ffa_device_is_valid(struct ffa_device *ffa_dev); -+ -+#else -+static inline -+struct ffa_device *ffa_device_register(const uuid_t *uuid, int vm_id) -+{ -+ return NULL; -+} -+ -+static inline void ffa_device_unregister(struct ffa_device *dev) {} -+ -+static inline int -+ffa_driver_register(struct ffa_driver *driver, struct module *owner, -+ const char *mod_name) -+{ -+ return -EINVAL; -+} -+ -+static inline void ffa_driver_unregister(struct ffa_driver *driver) {} -+ -+static inline -+bool ffa_device_is_valid(struct ffa_device *ffa_dev) { return false; } -+ -+#endif /* CONFIG_ARM_FFA_TRANSPORT */ -+ -+#define ffa_register(driver) \ -+ ffa_driver_register(driver, THIS_MODULE, KBUILD_MODNAME) -+#define ffa_unregister(driver) \ -+ ffa_driver_unregister(driver) -+ -+/** -+ * module_ffa_driver() - Helper macro for registering a psa_ffa driver -+ * @__ffa_driver: ffa_driver structure -+ * -+ * Helper macro for psa_ffa drivers to set up proper module init / exit -+ * functions. Replaces module_init() and module_exit() and keeps people from -+ * printing pointless things to the kernel log when their driver is loaded. -+ */ -+#define module_ffa_driver(__ffa_driver) \ -+ module_driver(__ffa_driver, ffa_register, ffa_unregister) -+ -+#endif /* _LINUX_ARM_FFA_H */ --- -2.17.1 - diff --git a/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0014-firmware-arm_ffa-Add-initial-Arm-FFA-driver-support.patch b/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0014-firmware-arm_ffa-Add-initial-Arm-FFA-driver-support.patch deleted file mode 100644 index c0dcfdc3..00000000 --- a/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0014-firmware-arm_ffa-Add-initial-Arm-FFA-driver-support.patch +++ /dev/null @@ -1,422 +0,0 @@ -Upstream-Status: Accepted [merged with kernel 5.14] -Signed-off-by: Arpita S.K - -From 3bbfe9871005f38df2955b2e125933edf1d2feef Mon Sep 17 00:00:00 2001 -From: Sudeep Holla -Date: Fri, 21 May 2021 16:10:30 +0100 -Subject: [PATCH] firmware: arm_ffa: Add initial Arm FFA driver support - -This just add a basic driver that sets up the transport(e.g. SMCCC), -checks the FFA version implemented, get the partition ID for self and -sets up the Tx/Rx buffers for communication. - -Link: https://lore.kernel.org/r/20210521151033.181846-3-sudeep.holla@arm.com -Tested-by: Jens Wiklander -Signed-off-by: Sudeep Holla ---- - drivers/firmware/arm_ffa/Makefile | 3 +- - drivers/firmware/arm_ffa/bus.c | 14 +- - drivers/firmware/arm_ffa/common.h | 24 +++ - drivers/firmware/arm_ffa/driver.c | 311 ++++++++++++++++++++++++++++++ - 4 files changed, 341 insertions(+), 11 deletions(-) - create mode 100644 drivers/firmware/arm_ffa/common.h - create mode 100644 drivers/firmware/arm_ffa/driver.c - -diff --git a/drivers/firmware/arm_ffa/Makefile b/drivers/firmware/arm_ffa/Makefile -index bfe4323a8784..82d0d35c5324 100644 ---- a/drivers/firmware/arm_ffa/Makefile -+++ b/drivers/firmware/arm_ffa/Makefile -@@ -1,4 +1,5 @@ - # SPDX-License-Identifier: GPL-2.0-only - ffa-bus-y = bus.o --ffa-module-objs := $(ffa-bus-y) -+ffa-driver-y = driver.o -+ffa-module-objs := $(ffa-bus-y) $(ffa-driver-y) - obj-$(CONFIG_ARM_FFA_TRANSPORT) = ffa-module.o -diff --git a/drivers/firmware/arm_ffa/bus.c b/drivers/firmware/arm_ffa/bus.c -index a17874bed946..ae1eada5dc0c 100644 ---- a/drivers/firmware/arm_ffa/bus.c -+++ b/drivers/firmware/arm_ffa/bus.c -@@ -13,6 +13,8 @@ - #include - #include - -+#include "common.h" -+ - static int ffa_device_match(struct device *dev, struct device_driver *drv) - { - const struct ffa_device_id *id_table; -@@ -187,21 +189,13 @@ void ffa_device_unregister(struct ffa_device *ffa_dev) - } - EXPORT_SYMBOL_GPL(ffa_device_unregister); - --static int __init arm_ffa_bus_init(void) -+int arm_ffa_bus_init(void) - { - return bus_register(&ffa_bus_type); - } --module_init(arm_ffa_bus_init); - --static void __exit arm_ffa_bus_exit(void) -+void arm_ffa_bus_exit(void) - { - ffa_devices_unregister(); - bus_unregister(&ffa_bus_type); - } -- --module_exit(arm_ffa_bus_exit); -- --MODULE_ALIAS("arm-ffa-bus"); --MODULE_AUTHOR("Sudeep Holla "); --MODULE_DESCRIPTION("Arm FF-A bus driver"); --MODULE_LICENSE("GPL v2"); -diff --git a/drivers/firmware/arm_ffa/common.h b/drivers/firmware/arm_ffa/common.h -new file mode 100644 -index 000000000000..2d3a32f67d5d ---- /dev/null -+++ b/drivers/firmware/arm_ffa/common.h -@@ -0,0 +1,24 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * Copyright (C) 2021 ARM Ltd. -+ */ -+ -+#ifndef _FFA_COMMON_H -+#define _FFA_COMMON_H -+ -+#include -+#include -+ -+typedef struct arm_smccc_1_2_regs ffa_value_t; -+ -+typedef void (ffa_fn)(ffa_value_t, ffa_value_t *); -+ -+int arm_ffa_bus_init(void); -+void arm_ffa_bus_exit(void); -+ -+static inline int __init ffa_transport_init(ffa_fn **invoke_ffa_fn) -+{ -+ return -EOPNOTSUPP; -+} -+ -+#endif /* _FFA_COMMON_H */ -diff --git a/drivers/firmware/arm_ffa/driver.c b/drivers/firmware/arm_ffa/driver.c -new file mode 100644 -index 000000000000..4846f079dca0 ---- /dev/null -+++ b/drivers/firmware/arm_ffa/driver.c -@@ -0,0 +1,311 @@ -+// SPDX-License-Identifier: GPL-2.0-only -+/* -+ * Arm Firmware Framework for ARMv8-A(FFA) interface driver -+ * -+ * The Arm FFA specification[1] describes a software architecture to -+ * leverages the virtualization extension to isolate software images -+ * provided by an ecosystem of vendors from each other and describes -+ * interfaces that standardize communication between the various software -+ * images including communication between images in the Secure world and -+ * Normal world. Any Hypervisor could use the FFA interfaces to enable -+ * communication between VMs it manages. -+ * -+ * The Hypervisor a.k.a Partition managers in FFA terminology can assign -+ * system resources(Memory regions, Devices, CPU cycles) to the partitions -+ * and manage isolation amongst them. -+ * -+ * [1] https://developer.arm.com/docs/den0077/latest -+ * -+ * Copyright (C) 2021 ARM Ltd. -+ */ -+ -+#define DRIVER_NAME "ARM FF-A" -+#define pr_fmt(fmt) DRIVER_NAME ": " fmt -+ -+#include -+#include -+#include -+#include -+#include -+ -+#include "common.h" -+ -+#define FFA_DRIVER_VERSION FFA_VERSION_1_0 -+ -+#define FFA_SMC(calling_convention, func_num) \ -+ ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, (calling_convention), \ -+ ARM_SMCCC_OWNER_STANDARD, (func_num)) -+ -+#define FFA_SMC_32(func_num) FFA_SMC(ARM_SMCCC_SMC_32, (func_num)) -+#define FFA_SMC_64(func_num) FFA_SMC(ARM_SMCCC_SMC_64, (func_num)) -+ -+#define FFA_ERROR FFA_SMC_32(0x60) -+#define FFA_SUCCESS FFA_SMC_32(0x61) -+#define FFA_INTERRUPT FFA_SMC_32(0x62) -+#define FFA_VERSION FFA_SMC_32(0x63) -+#define FFA_FEATURES FFA_SMC_32(0x64) -+#define FFA_RX_RELEASE FFA_SMC_32(0x65) -+#define FFA_RXTX_MAP FFA_SMC_32(0x66) -+#define FFA_FN64_RXTX_MAP FFA_SMC_64(0x66) -+#define FFA_RXTX_UNMAP FFA_SMC_32(0x67) -+#define FFA_PARTITION_INFO_GET FFA_SMC_32(0x68) -+#define FFA_ID_GET FFA_SMC_32(0x69) -+#define FFA_MSG_POLL FFA_SMC_32(0x6A) -+#define FFA_MSG_WAIT FFA_SMC_32(0x6B) -+#define FFA_YIELD FFA_SMC_32(0x6C) -+#define FFA_RUN FFA_SMC_32(0x6D) -+#define FFA_MSG_SEND FFA_SMC_32(0x6E) -+#define FFA_MSG_SEND_DIRECT_REQ FFA_SMC_32(0x6F) -+#define FFA_FN64_MSG_SEND_DIRECT_REQ FFA_SMC_64(0x6F) -+#define FFA_MSG_SEND_DIRECT_RESP FFA_SMC_32(0x70) -+#define FFA_FN64_MSG_SEND_DIRECT_RESP FFA_SMC_64(0x70) -+#define FFA_MEM_DONATE FFA_SMC_32(0x71) -+#define FFA_FN64_MEM_DONATE FFA_SMC_64(0x71) -+#define FFA_MEM_LEND FFA_SMC_32(0x72) -+#define FFA_FN64_MEM_LEND FFA_SMC_64(0x72) -+#define FFA_MEM_SHARE FFA_SMC_32(0x73) -+#define FFA_FN64_MEM_SHARE FFA_SMC_64(0x73) -+#define FFA_MEM_RETRIEVE_REQ FFA_SMC_32(0x74) -+#define FFA_FN64_MEM_RETRIEVE_REQ FFA_SMC_64(0x74) -+#define FFA_MEM_RETRIEVE_RESP FFA_SMC_32(0x75) -+#define FFA_MEM_RELINQUISH FFA_SMC_32(0x76) -+#define FFA_MEM_RECLAIM FFA_SMC_32(0x77) -+#define FFA_MEM_OP_PAUSE FFA_SMC_32(0x78) -+#define FFA_MEM_OP_RESUME FFA_SMC_32(0x79) -+#define FFA_MEM_FRAG_RX FFA_SMC_32(0x7A) -+#define FFA_MEM_FRAG_TX FFA_SMC_32(0x7B) -+#define FFA_NORMAL_WORLD_RESUME FFA_SMC_32(0x7C) -+ -+/* -+ * For some calls it is necessary to use SMC64 to pass or return 64-bit values. -+ * For such calls FFA_FN_NATIVE(name) will choose the appropriate -+ * (native-width) function ID. -+ */ -+#ifdef CONFIG_64BIT -+#define FFA_FN_NATIVE(name) FFA_FN64_##name -+#else -+#define FFA_FN_NATIVE(name) FFA_##name -+#endif -+ -+/* FFA error codes. */ -+#define FFA_RET_SUCCESS (0) -+#define FFA_RET_NOT_SUPPORTED (-1) -+#define FFA_RET_INVALID_PARAMETERS (-2) -+#define FFA_RET_NO_MEMORY (-3) -+#define FFA_RET_BUSY (-4) -+#define FFA_RET_INTERRUPTED (-5) -+#define FFA_RET_DENIED (-6) -+#define FFA_RET_RETRY (-7) -+#define FFA_RET_ABORTED (-8) -+ -+#define MAJOR_VERSION_MASK GENMASK(30, 16) -+#define MINOR_VERSION_MASK GENMASK(15, 0) -+#define MAJOR_VERSION(x) ((u16)(FIELD_GET(MAJOR_VERSION_MASK, (x)))) -+#define MINOR_VERSION(x) ((u16)(FIELD_GET(MINOR_VERSION_MASK, (x)))) -+#define PACK_VERSION_INFO(major, minor) \ -+ (FIELD_PREP(MAJOR_VERSION_MASK, (major)) | \ -+ FIELD_PREP(MINOR_VERSION_MASK, (minor))) -+#define FFA_VERSION_1_0 PACK_VERSION_INFO(1, 0) -+#define FFA_MIN_VERSION FFA_VERSION_1_0 -+ -+#define SENDER_ID_MASK GENMASK(31, 16) -+#define RECEIVER_ID_MASK GENMASK(15, 0) -+#define SENDER_ID(x) ((u16)(FIELD_GET(SENDER_ID_MASK, (x)))) -+#define RECEIVER_ID(x) ((u16)(FIELD_GET(RECEIVER_ID_MASK, (x)))) -+#define PACK_TARGET_INFO(s, r) \ -+ (FIELD_PREP(SENDER_ID_MASK, (s)) | FIELD_PREP(RECEIVER_ID_MASK, (r))) -+ -+/** -+ * FF-A specification mentions explicitly about '4K pages'. This should -+ * not be confused with the kernel PAGE_SIZE, which is the translation -+ * granule kernel is configured and may be one among 4K, 16K and 64K. -+ */ -+#define FFA_PAGE_SIZE SZ_4K -+/* -+ * Keeping RX TX buffer size as 4K for now -+ * 64K may be preferred to keep it min a page in 64K PAGE_SIZE config -+ */ -+#define RXTX_BUFFER_SIZE SZ_4K -+ -+static ffa_fn *invoke_ffa_fn; -+ -+static const int ffa_linux_errmap[] = { -+ /* better than switch case as long as return value is continuous */ -+ 0, /* FFA_RET_SUCCESS */ -+ -EOPNOTSUPP, /* FFA_RET_NOT_SUPPORTED */ -+ -EINVAL, /* FFA_RET_INVALID_PARAMETERS */ -+ -ENOMEM, /* FFA_RET_NO_MEMORY */ -+ -EBUSY, /* FFA_RET_BUSY */ -+ -EINTR, /* FFA_RET_INTERRUPTED */ -+ -EACCES, /* FFA_RET_DENIED */ -+ -EAGAIN, /* FFA_RET_RETRY */ -+ -ECANCELED, /* FFA_RET_ABORTED */ -+}; -+ -+static inline int ffa_to_linux_errno(int errno) -+{ -+ if (errno < FFA_RET_SUCCESS && errno >= -ARRAY_SIZE(ffa_linux_errmap)) -+ return ffa_linux_errmap[-errno]; -+ return -EINVAL; -+} -+ -+struct ffa_drv_info { -+ u32 version; -+ u16 vm_id; -+ struct mutex rx_lock; /* lock to protect Rx buffer */ -+ struct mutex tx_lock; /* lock to protect Tx buffer */ -+ void *rx_buffer; -+ void *tx_buffer; -+}; -+ -+static struct ffa_drv_info *drv_info; -+ -+static int ffa_version_check(u32 *version) -+{ -+ ffa_value_t ver; -+ -+ invoke_ffa_fn((ffa_value_t){ -+ .a0 = FFA_VERSION, .a1 = FFA_DRIVER_VERSION, -+ }, &ver); -+ -+ if (ver.a0 == FFA_RET_NOT_SUPPORTED) { -+ pr_info("FFA_VERSION returned not supported\n"); -+ return -EOPNOTSUPP; -+ } -+ -+ if (ver.a0 < FFA_MIN_VERSION || ver.a0 > FFA_DRIVER_VERSION) { -+ pr_err("Incompatible version %d.%d found\n", -+ MAJOR_VERSION(ver.a0), MINOR_VERSION(ver.a0)); -+ return -EINVAL; -+ } -+ -+ *version = ver.a0; -+ pr_info("Version %d.%d found\n", MAJOR_VERSION(ver.a0), -+ MINOR_VERSION(ver.a0)); -+ return 0; -+} -+ -+static int ffa_rxtx_map(phys_addr_t tx_buf, phys_addr_t rx_buf, u32 pg_cnt) -+{ -+ ffa_value_t ret; -+ -+ invoke_ffa_fn((ffa_value_t){ -+ .a0 = FFA_FN_NATIVE(RXTX_MAP), -+ .a1 = tx_buf, .a2 = rx_buf, .a3 = pg_cnt, -+ }, &ret); -+ -+ if (ret.a0 == FFA_ERROR) -+ return ffa_to_linux_errno((int)ret.a2); -+ -+ return 0; -+} -+ -+static int ffa_rxtx_unmap(u16 vm_id) -+{ -+ ffa_value_t ret; -+ -+ invoke_ffa_fn((ffa_value_t){ -+ .a0 = FFA_RXTX_UNMAP, .a1 = PACK_TARGET_INFO(vm_id, 0), -+ }, &ret); -+ -+ if (ret.a0 == FFA_ERROR) -+ return ffa_to_linux_errno((int)ret.a2); -+ -+ return 0; -+} -+ -+#define VM_ID_MASK GENMASK(15, 0) -+static int ffa_id_get(u16 *vm_id) -+{ -+ ffa_value_t id; -+ -+ invoke_ffa_fn((ffa_value_t){ -+ .a0 = FFA_ID_GET, -+ }, &id); -+ -+ if (id.a0 == FFA_ERROR) -+ return ffa_to_linux_errno((int)id.a2); -+ -+ *vm_id = FIELD_GET(VM_ID_MASK, (id.a2)); -+ -+ return 0; -+} -+ -+static int __init ffa_init(void) -+{ -+ int ret; -+ -+ ret = ffa_transport_init(&invoke_ffa_fn); -+ if (ret) -+ return ret; -+ -+ ret = arm_ffa_bus_init(); -+ if (ret) -+ return ret; -+ -+ drv_info = kzalloc(sizeof(*drv_info), GFP_KERNEL); -+ if (!drv_info) { -+ ret = -ENOMEM; -+ goto ffa_bus_exit; -+ } -+ -+ ret = ffa_version_check(&drv_info->version); -+ if (ret) -+ goto free_drv_info; -+ -+ if (ffa_id_get(&drv_info->vm_id)) { -+ pr_err("failed to obtain VM id for self\n"); -+ ret = -ENODEV; -+ goto free_drv_info; -+ } -+ -+ drv_info->rx_buffer = alloc_pages_exact(RXTX_BUFFER_SIZE, GFP_KERNEL); -+ if (!drv_info->rx_buffer) { -+ ret = -ENOMEM; -+ goto free_pages; -+ } -+ -+ drv_info->tx_buffer = alloc_pages_exact(RXTX_BUFFER_SIZE, GFP_KERNEL); -+ if (!drv_info->tx_buffer) { -+ ret = -ENOMEM; -+ goto free_pages; -+ } -+ -+ ret = ffa_rxtx_map(virt_to_phys(drv_info->tx_buffer), -+ virt_to_phys(drv_info->rx_buffer), -+ RXTX_BUFFER_SIZE / FFA_PAGE_SIZE); -+ if (ret) { -+ pr_err("failed to register FFA RxTx buffers\n"); -+ goto free_pages; -+ } -+ -+ mutex_init(&drv_info->rx_lock); -+ mutex_init(&drv_info->tx_lock); -+ -+ return 0; -+free_pages: -+ if (drv_info->tx_buffer) -+ free_pages_exact(drv_info->tx_buffer, RXTX_BUFFER_SIZE); -+ free_pages_exact(drv_info->rx_buffer, RXTX_BUFFER_SIZE); -+free_drv_info: -+ kfree(drv_info); -+ffa_bus_exit: -+ arm_ffa_bus_exit(); -+ return ret; -+} -+subsys_initcall(ffa_init); -+ -+static void __exit ffa_exit(void) -+{ -+ ffa_rxtx_unmap(drv_info->vm_id); -+ free_pages_exact(drv_info->tx_buffer, RXTX_BUFFER_SIZE); -+ free_pages_exact(drv_info->rx_buffer, RXTX_BUFFER_SIZE); -+ kfree(drv_info); -+ arm_ffa_bus_exit(); -+} -+module_exit(ffa_exit); -+ -+MODULE_ALIAS("arm-ffa"); -+MODULE_AUTHOR("Sudeep Holla "); -+MODULE_DESCRIPTION("Arm FF-A interface driver"); -+MODULE_LICENSE("GPL v2"); --- -2.17.1 - diff --git a/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0015-firmware-arm_ffa-Add-support-for-SMCCC-as-transport-to-ffa-driver.patch b/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0015-firmware-arm_ffa-Add-support-for-SMCCC-as-transport-to-ffa-driver.patch deleted file mode 100644 index 0d0298cb..00000000 --- a/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0015-firmware-arm_ffa-Add-support-for-SMCCC-as-transport-to-ffa-driver.patch +++ /dev/null @@ -1,119 +0,0 @@ -Upstream-Status: Accepted [merged with kernel 5.14] -Signed-off-by: Arpita S.K - -From 714be77e976a4b013b935b3223b2ef68856084d0 Mon Sep 17 00:00:00 2001 -From: Sudeep Holla -Date: Fri, 21 May 2021 16:10:31 +0100 -Subject: [PATCH] firmware: arm_ffa: Add support for SMCCC as transport to FFA - driver - -There are requests to keep the transport separate in order to allow -other possible transports like virtio. So let us keep the SMCCC transport -specific routines abstracted. - -It is kept simple for now. Once we add another transport, we can develop -better abstraction. - -Link: https://lore.kernel.org/r/20210521151033.181846-4-sudeep.holla@arm.com -Tested-by: Jens Wiklander -Reviewed-by: Jens Wiklander -Signed-off-by: Sudeep Holla ---- - drivers/firmware/arm_ffa/Kconfig | 5 ++++ - drivers/firmware/arm_ffa/Makefile | 3 ++- - drivers/firmware/arm_ffa/common.h | 4 ++++ - drivers/firmware/arm_ffa/smccc.c | 39 +++++++++++++++++++++++++++++++ - 4 files changed, 50 insertions(+), 1 deletion(-) - create mode 100644 drivers/firmware/arm_ffa/smccc.c - -diff --git a/drivers/firmware/arm_ffa/Kconfig b/drivers/firmware/arm_ffa/Kconfig -index 261a3660650a..5e3ae5cf82e8 100644 ---- a/drivers/firmware/arm_ffa/Kconfig -+++ b/drivers/firmware/arm_ffa/Kconfig -@@ -14,3 +14,8 @@ config ARM_FFA_TRANSPORT - - This driver provides interface for all the client drivers making - use of the features offered by ARM FF-A. -+ -+config ARM_FFA_SMCCC -+ bool -+ default ARM_FFA_TRANSPORT -+ depends on ARM64 && HAVE_ARM_SMCCC_DISCOVERY -diff --git a/drivers/firmware/arm_ffa/Makefile b/drivers/firmware/arm_ffa/Makefile -index 82d0d35c5324..9d9f37523200 100644 ---- a/drivers/firmware/arm_ffa/Makefile -+++ b/drivers/firmware/arm_ffa/Makefile -@@ -1,5 +1,6 @@ - # SPDX-License-Identifier: GPL-2.0-only - ffa-bus-y = bus.o - ffa-driver-y = driver.o --ffa-module-objs := $(ffa-bus-y) $(ffa-driver-y) -+ffa-transport-$(CONFIG_ARM_FFA_SMCCC) += smccc.o -+ffa-module-objs := $(ffa-bus-y) $(ffa-driver-y) $(ffa-transport-y) - obj-$(CONFIG_ARM_FFA_TRANSPORT) = ffa-module.o -diff --git a/drivers/firmware/arm_ffa/common.h b/drivers/firmware/arm_ffa/common.h -index 2d3a32f67d5d..f24754a59f47 100644 ---- a/drivers/firmware/arm_ffa/common.h -+++ b/drivers/firmware/arm_ffa/common.h -@@ -16,9 +16,13 @@ typedef void (ffa_fn)(ffa_value_t, ffa_value_t *); - int arm_ffa_bus_init(void); - void arm_ffa_bus_exit(void); - -+#ifdef CONFIG_ARM_FFA_SMCCC -+int __init ffa_transport_init(ffa_fn **invoke_ffa_fn); -+#else - static inline int __init ffa_transport_init(ffa_fn **invoke_ffa_fn) - { - return -EOPNOTSUPP; - } -+#endif - - #endif /* _FFA_COMMON_H */ -diff --git a/drivers/firmware/arm_ffa/smccc.c b/drivers/firmware/arm_ffa/smccc.c -new file mode 100644 -index 000000000000..4d85bfff0a4e ---- /dev/null -+++ b/drivers/firmware/arm_ffa/smccc.c -@@ -0,0 +1,39 @@ -+// SPDX-License-Identifier: GPL-2.0-only -+/* -+ * Copyright (C) 2021 ARM Ltd. -+ */ -+ -+#include -+ -+#include "common.h" -+ -+static void __arm_ffa_fn_smc(ffa_value_t args, ffa_value_t *res) -+{ -+ arm_smccc_1_2_smc(&args, res); -+} -+ -+static void __arm_ffa_fn_hvc(ffa_value_t args, ffa_value_t *res) -+{ -+ arm_smccc_1_2_hvc(&args, res); -+} -+ -+int __init ffa_transport_init(ffa_fn **invoke_ffa_fn) -+{ -+ enum arm_smccc_conduit conduit; -+ -+ if (arm_smccc_get_version() < ARM_SMCCC_VERSION_1_2) -+ return -EOPNOTSUPP; -+ -+ conduit = arm_smccc_1_1_get_conduit(); -+ if (conduit == SMCCC_CONDUIT_NONE) { -+ pr_err("%s: invalid SMCCC conduit\n", __func__); -+ return -EOPNOTSUPP; -+ } -+ -+ if (conduit == SMCCC_CONDUIT_SMC) -+ *invoke_ffa_fn = __arm_ffa_fn_smc; -+ else -+ *invoke_ffa_fn = __arm_ffa_fn_hvc; -+ -+ return 0; -+} --- -2.17.1 - diff --git a/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0016-firmware-arm_ffa-Setup-in-kernel-users-of-FFA-partitions.patch b/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0016-firmware-arm_ffa-Setup-in-kernel-users-of-FFA-partitions.patch deleted file mode 100644 index 975c62e4..00000000 --- a/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0016-firmware-arm_ffa-Setup-in-kernel-users-of-FFA-partitions.patch +++ /dev/null @@ -1,410 +0,0 @@ -Upstream-Status: Accepted [merged with kernel 5.14] -Signed-off-by: Arpita S.K - -From d0c0bce831223b08e5bade2cefc93c3ddb790796 Mon Sep 17 00:00:00 2001 -From: Sudeep Holla -Date: Fri, 21 May 2021 16:10:32 +0100 -Subject: [PATCH] firmware: arm_ffa: Setup in-kernel users of FFA partitions - -Parse the FFA nodes from the device-tree and register all the partitions -whose services will be used in the kernel. - -In order to also enable in-kernel users of FFA interface, let us add -simple set of operations for such devices. - -The in-kernel users are registered without the character device interface. - -Link: https://lore.kernel.org/r/20210521151033.181846-5-sudeep.holla@arm.com -Tested-by: Jens Wiklander -Reviewed-by: Jens Wiklander -Signed-off-by: Sudeep Holla ---- - drivers/firmware/arm_ffa/bus.c | 9 ++ - drivers/firmware/arm_ffa/common.h | 3 + - drivers/firmware/arm_ffa/driver.c | 221 ++++++++++++++++++++++++++++++ - include/linux/arm_ffa.h | 39 +++++- - 4 files changed, 271 insertions(+), 1 deletion(-) - -diff --git a/drivers/firmware/arm_ffa/bus.c b/drivers/firmware/arm_ffa/bus.c -index ae1eada5dc0c..83166e02b191 100644 ---- a/drivers/firmware/arm_ffa/bus.c -+++ b/drivers/firmware/arm_ffa/bus.c -@@ -24,6 +24,15 @@ static int ffa_device_match(struct device *dev, struct device_driver *drv) - ffa_dev = to_ffa_dev(dev); - - while (!uuid_is_null(&id_table->uuid)) { -+ /* -+ * FF-A v1.0 doesn't provide discovery of UUIDs, just the -+ * partition IDs, so fetch the partitions IDs for this -+ * id_table UUID and assign the UUID to the device if the -+ * partition ID matches -+ */ -+ if (uuid_is_null(&ffa_dev->uuid)) -+ ffa_device_match_uuid(ffa_dev, &id_table->uuid); -+ - if (uuid_equal(&ffa_dev->uuid, &id_table->uuid)) - return 1; - id_table++; -diff --git a/drivers/firmware/arm_ffa/common.h b/drivers/firmware/arm_ffa/common.h -index f24754a59f47..d6eccf1fd3f6 100644 ---- a/drivers/firmware/arm_ffa/common.h -+++ b/drivers/firmware/arm_ffa/common.h -@@ -6,6 +6,7 @@ - #ifndef _FFA_COMMON_H - #define _FFA_COMMON_H - -+#include - #include - #include - -@@ -15,6 +16,8 @@ typedef void (ffa_fn)(ffa_value_t, ffa_value_t *); - - int arm_ffa_bus_init(void); - void arm_ffa_bus_exit(void); -+bool ffa_device_is_valid(struct ffa_device *ffa_dev); -+void ffa_device_match_uuid(struct ffa_device *ffa_dev, const uuid_t *uuid); - - #ifdef CONFIG_ARM_FFA_SMCCC - int __init ffa_transport_init(ffa_fn **invoke_ffa_fn); -diff --git a/drivers/firmware/arm_ffa/driver.c b/drivers/firmware/arm_ffa/driver.c -index 4846f079dca0..85b9bbdbeabe 100644 ---- a/drivers/firmware/arm_ffa/driver.c -+++ b/drivers/firmware/arm_ffa/driver.c -@@ -24,9 +24,12 @@ - - #include - #include -+#include - #include -+#include - #include - #include -+#include - - #include "common.h" - -@@ -185,6 +188,22 @@ static int ffa_version_check(u32 *version) - return 0; - } - -+static int ffa_rx_release(void) -+{ -+ ffa_value_t ret; -+ -+ invoke_ffa_fn((ffa_value_t){ -+ .a0 = FFA_RX_RELEASE, -+ }, &ret); -+ -+ if (ret.a0 == FFA_ERROR) -+ return ffa_to_linux_errno((int)ret.a2); -+ -+ /* check for ret.a0 == FFA_RX_RELEASE ? */ -+ -+ return 0; -+} -+ - static int ffa_rxtx_map(phys_addr_t tx_buf, phys_addr_t rx_buf, u32 pg_cnt) - { - ffa_value_t ret; -@@ -214,6 +233,65 @@ static int ffa_rxtx_unmap(u16 vm_id) - return 0; - } - -+/* buffer must be sizeof(struct ffa_partition_info) * num_partitions */ -+static int -+__ffa_partition_info_get(u32 uuid0, u32 uuid1, u32 uuid2, u32 uuid3, -+ struct ffa_partition_info *buffer, int num_partitions) -+{ -+ int count; -+ ffa_value_t partition_info; -+ -+ mutex_lock(&drv_info->rx_lock); -+ invoke_ffa_fn((ffa_value_t){ -+ .a0 = FFA_PARTITION_INFO_GET, -+ .a1 = uuid0, .a2 = uuid1, .a3 = uuid2, .a4 = uuid3, -+ }, &partition_info); -+ -+ if (partition_info.a0 == FFA_ERROR) { -+ mutex_unlock(&drv_info->rx_lock); -+ return ffa_to_linux_errno((int)partition_info.a2); -+ } -+ -+ count = partition_info.a2; -+ -+ if (buffer && count <= num_partitions) -+ memcpy(buffer, drv_info->rx_buffer, sizeof(*buffer) * count); -+ -+ ffa_rx_release(); -+ -+ mutex_unlock(&drv_info->rx_lock); -+ -+ return count; -+} -+ -+/* buffer is allocated and caller must free the same if returned count > 0 */ -+static int -+ffa_partition_probe(const uuid_t *uuid, struct ffa_partition_info **buffer) -+{ -+ int count; -+ u32 uuid0_4[4]; -+ struct ffa_partition_info *pbuf; -+ -+ export_uuid((u8 *)uuid0_4, uuid); -+ count = __ffa_partition_info_get(uuid0_4[0], uuid0_4[1], uuid0_4[2], -+ uuid0_4[3], NULL, 0); -+ if (count <= 0) -+ return count; -+ -+ pbuf = kcalloc(count, sizeof(*pbuf), GFP_KERNEL); -+ if (!pbuf) -+ return -ENOMEM; -+ -+ count = __ffa_partition_info_get(uuid0_4[0], uuid0_4[1], uuid0_4[2], -+ uuid0_4[3], pbuf, count); -+ if (count <= 0) -+ kfree(pbuf); -+ else -+ *buffer = pbuf; -+ -+ return count; -+} -+ - #define VM_ID_MASK GENMASK(15, 0) - static int ffa_id_get(u16 *vm_id) - { -@@ -231,6 +309,147 @@ static int ffa_id_get(u16 *vm_id) - return 0; - } - -+static int ffa_msg_send_direct_req(u16 src_id, u16 dst_id, bool mode_32bit, -+ struct ffa_send_direct_data *data) -+{ -+ u32 req_id, resp_id, src_dst_ids = PACK_TARGET_INFO(src_id, dst_id); -+ ffa_value_t ret; -+ -+ if (mode_32bit) { -+ req_id = FFA_MSG_SEND_DIRECT_REQ; -+ resp_id = FFA_MSG_SEND_DIRECT_RESP; -+ } else { -+ req_id = FFA_FN_NATIVE(MSG_SEND_DIRECT_REQ); -+ resp_id = FFA_FN_NATIVE(MSG_SEND_DIRECT_RESP); -+ } -+ -+ invoke_ffa_fn((ffa_value_t){ -+ .a0 = req_id, .a1 = src_dst_ids, .a2 = 0, -+ .a3 = data->data0, .a4 = data->data1, .a5 = data->data2, -+ .a6 = data->data3, .a7 = data->data4, -+ }, &ret); -+ -+ while (ret.a0 == FFA_INTERRUPT) -+ invoke_ffa_fn((ffa_value_t){ -+ .a0 = FFA_RUN, .a1 = ret.a1, -+ }, &ret); -+ -+ if (ret.a0 == FFA_ERROR) -+ return ffa_to_linux_errno((int)ret.a2); -+ -+ if (ret.a0 == resp_id) { -+ data->data0 = ret.a3; -+ data->data1 = ret.a4; -+ data->data2 = ret.a5; -+ data->data3 = ret.a6; -+ data->data4 = ret.a7; -+ return 0; -+ } -+ -+ return -EINVAL; -+} -+ -+static u32 ffa_api_version_get(void) -+{ -+ return drv_info->version; -+} -+ -+static int ffa_partition_info_get(const char *uuid_str, -+ struct ffa_partition_info *buffer) -+{ -+ int count; -+ uuid_t uuid; -+ struct ffa_partition_info *pbuf; -+ -+ if (uuid_parse(uuid_str, &uuid)) { -+ pr_err("invalid uuid (%s)\n", uuid_str); -+ return -ENODEV; -+ } -+ -+ count = ffa_partition_probe(&uuid_null, &pbuf); -+ if (count <= 0) -+ return -ENOENT; -+ -+ memcpy(buffer, pbuf, sizeof(*pbuf) * count); -+ kfree(pbuf); -+ return 0; -+} -+ -+static void ffa_mode_32bit_set(struct ffa_device *dev) -+{ -+ dev->mode_32bit = true; -+} -+ -+static int ffa_sync_send_receive(struct ffa_device *dev, -+ struct ffa_send_direct_data *data) -+{ -+ return ffa_msg_send_direct_req(drv_info->vm_id, dev->vm_id, -+ dev->mode_32bit, data); -+} -+ -+static const struct ffa_dev_ops ffa_ops = { -+ .api_version_get = ffa_api_version_get, -+ .partition_info_get = ffa_partition_info_get, -+ .mode_32bit_set = ffa_mode_32bit_set, -+ .sync_send_receive = ffa_sync_send_receive, -+}; -+ -+const struct ffa_dev_ops *ffa_dev_ops_get(struct ffa_device *dev) -+{ -+ if (ffa_device_is_valid(dev)) -+ return &ffa_ops; -+ -+ return NULL; -+} -+EXPORT_SYMBOL_GPL(ffa_dev_ops_get); -+ -+void ffa_device_match_uuid(struct ffa_device *ffa_dev, const uuid_t *uuid) -+{ -+ int count, idx; -+ struct ffa_partition_info *pbuf, *tpbuf; -+ -+ count = ffa_partition_probe(uuid, &pbuf); -+ if (count <= 0) -+ return; -+ -+ for (idx = 0, tpbuf = pbuf; idx < count; idx++, tpbuf++) -+ if (tpbuf->id == ffa_dev->vm_id) -+ uuid_copy(&ffa_dev->uuid, uuid); -+ kfree(pbuf); -+} -+ -+static void ffa_setup_partitions(void) -+{ -+ int count, idx; -+ struct ffa_device *ffa_dev; -+ struct ffa_partition_info *pbuf, *tpbuf; -+ -+ count = ffa_partition_probe(&uuid_null, &pbuf); -+ if (count <= 0) { -+ pr_info("%s: No partitions found, error %d\n", __func__, count); -+ return; -+ } -+ -+ for (idx = 0, tpbuf = pbuf; idx < count; idx++, tpbuf++) { -+ /* Note that the &uuid_null parameter will require -+ * ffa_device_match() to find the UUID of this partition id -+ * with help of ffa_device_match_uuid(). Once the FF-A spec -+ * is updated to provide correct UUID here for each partition -+ * as part of the discovery API, we need to pass the -+ * discovered UUID here instead. -+ */ -+ ffa_dev = ffa_device_register(&uuid_null, tpbuf->id); -+ if (!ffa_dev) { -+ pr_err("%s: failed to register partition ID 0x%x\n", -+ __func__, tpbuf->id); -+ continue; -+ } -+ -+ ffa_dev_set_drvdata(ffa_dev, drv_info); -+ } -+ kfree(pbuf); -+} -+ - static int __init ffa_init(void) - { - int ret; -@@ -282,6 +501,8 @@ static int __init ffa_init(void) - mutex_init(&drv_info->rx_lock); - mutex_init(&drv_info->tx_lock); - -+ ffa_setup_partitions(); -+ - return 0; - free_pages: - if (drv_info->tx_buffer) -diff --git a/include/linux/arm_ffa.h b/include/linux/arm_ffa.h -index 331ff62c9873..d672673fc621 100644 ---- a/include/linux/arm_ffa.h -+++ b/include/linux/arm_ffa.h -@@ -6,7 +6,6 @@ - #ifndef _LINUX_ARM_FFA_H - #define _LINUX_ARM_FFA_H - --#include - #include - #include - #include -@@ -15,6 +14,7 @@ - /* FFA Bus/Device/Driver related */ - struct ffa_device { - int vm_id; -+ bool mode_32bit; - uuid_t uuid; - struct device dev; - }; -@@ -48,6 +48,7 @@ int ffa_driver_register(struct ffa_driver *driver, struct module *owner, - const char *mod_name); - void ffa_driver_unregister(struct ffa_driver *driver); - bool ffa_device_is_valid(struct ffa_device *ffa_dev); -+const struct ffa_dev_ops *ffa_dev_ops_get(struct ffa_device *dev); - - #else - static inline -@@ -70,6 +71,11 @@ static inline void ffa_driver_unregister(struct ffa_driver *driver) {} - static inline - bool ffa_device_is_valid(struct ffa_device *ffa_dev) { return false; } - -+static inline -+const struct ffa_dev_ops *ffa_dev_ops_get(struct ffa_device *dev) -+{ -+ return NULL; -+} - #endif /* CONFIG_ARM_FFA_TRANSPORT */ - - #define ffa_register(driver) \ -@@ -88,4 +94,35 @@ bool ffa_device_is_valid(struct ffa_device *ffa_dev) { return false; } - #define module_ffa_driver(__ffa_driver) \ - module_driver(__ffa_driver, ffa_register, ffa_unregister) - -+/* FFA transport related */ -+struct ffa_partition_info { -+ u16 id; -+ u16 exec_ctxt; -+/* partition supports receipt of direct requests */ -+#define FFA_PARTITION_DIRECT_RECV BIT(0) -+/* partition can send direct requests. */ -+#define FFA_PARTITION_DIRECT_SEND BIT(1) -+/* partition can send and receive indirect messages. */ -+#define FFA_PARTITION_INDIRECT_MSG BIT(2) -+ u32 properties; -+}; -+ -+/* For use with FFA_MSG_SEND_DIRECT_{REQ,RESP} which pass data via registers */ -+struct ffa_send_direct_data { -+ unsigned long data0; /* w3/x3 */ -+ unsigned long data1; /* w4/x4 */ -+ unsigned long data2; /* w5/x5 */ -+ unsigned long data3; /* w6/x6 */ -+ unsigned long data4; /* w7/x7 */ -+}; -+ -+struct ffa_dev_ops { -+ u32 (*api_version_get)(void); -+ int (*partition_info_get)(const char *uuid_str, -+ struct ffa_partition_info *buffer); -+ void (*mode_32bit_set)(struct ffa_device *dev); -+ int (*sync_send_receive)(struct ffa_device *dev, -+ struct ffa_send_direct_data *data); -+}; -+ - #endif /* _LINUX_ARM_FFA_H */ --- -2.17.1 - diff --git a/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0017-firmware-arm_ffa-Add-support-for-MEM_-interfaces.patch b/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0017-firmware-arm_ffa-Add-support-for-MEM_-interfaces.patch deleted file mode 100644 index d1a3e938..00000000 --- a/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0017-firmware-arm_ffa-Add-support-for-MEM_-interfaces.patch +++ /dev/null @@ -1,409 +0,0 @@ -Upstream-Status: Accepted [merged with kernel 5.14] -Signed-off-by: Arpita S.K - -From cc2195fe536c28e192df5d07e6dd277af36814b4 Mon Sep 17 00:00:00 2001 -From: Sudeep Holla -Date: Fri, 21 May 2021 16:10:33 +0100 -Subject: [PATCH] firmware: arm_ffa: Add support for MEM_* interfaces - -Most of the MEM_* APIs share the same parameters, so they can be -generalised. Currently only MEM_SHARE is implemented and the user space -interface for that is not added yet. - -Link: https://lore.kernel.org/r/20210521151033.181846-6-sudeep.holla@arm.com -Tested-by: Jens Wiklander -Signed-off-by: Sudeep Holla ---- - drivers/firmware/arm_ffa/driver.c | 199 ++++++++++++++++++++++++++++++ - include/linux/arm_ffa.h | 139 +++++++++++++++++++++ - 2 files changed, 338 insertions(+) - -diff --git a/drivers/firmware/arm_ffa/driver.c b/drivers/firmware/arm_ffa/driver.c -index 85b9bbdbeabe..b1edb4b2e94a 100644 ---- a/drivers/firmware/arm_ffa/driver.c -+++ b/drivers/firmware/arm_ffa/driver.c -@@ -28,6 +28,8 @@ - #include - #include - #include -+#include -+#include - #include - #include - -@@ -349,6 +351,192 @@ static int ffa_msg_send_direct_req(u16 src_id, u16 dst_id, bool mode_32bit, - return -EINVAL; - } - -+static int ffa_mem_first_frag(u32 func_id, phys_addr_t buf, u32 buf_sz, -+ u32 frag_len, u32 len, u64 *handle) -+{ -+ ffa_value_t ret; -+ -+ invoke_ffa_fn((ffa_value_t){ -+ .a0 = func_id, .a1 = len, .a2 = frag_len, -+ .a3 = buf, .a4 = buf_sz, -+ }, &ret); -+ -+ while (ret.a0 == FFA_MEM_OP_PAUSE) -+ invoke_ffa_fn((ffa_value_t){ -+ .a0 = FFA_MEM_OP_RESUME, -+ .a1 = ret.a1, .a2 = ret.a2, -+ }, &ret); -+ -+ if (ret.a0 == FFA_ERROR) -+ return ffa_to_linux_errno((int)ret.a2); -+ -+ if (ret.a0 != FFA_SUCCESS) -+ return -EOPNOTSUPP; -+ -+ if (handle) -+ *handle = PACK_HANDLE(ret.a2, ret.a3); -+ -+ return frag_len; -+} -+ -+static int ffa_mem_next_frag(u64 handle, u32 frag_len) -+{ -+ ffa_value_t ret; -+ -+ invoke_ffa_fn((ffa_value_t){ -+ .a0 = FFA_MEM_FRAG_TX, -+ .a1 = HANDLE_LOW(handle), .a2 = HANDLE_HIGH(handle), -+ .a3 = frag_len, -+ }, &ret); -+ -+ while (ret.a0 == FFA_MEM_OP_PAUSE) -+ invoke_ffa_fn((ffa_value_t){ -+ .a0 = FFA_MEM_OP_RESUME, -+ .a1 = ret.a1, .a2 = ret.a2, -+ }, &ret); -+ -+ if (ret.a0 == FFA_ERROR) -+ return ffa_to_linux_errno((int)ret.a2); -+ -+ if (ret.a0 != FFA_MEM_FRAG_RX) -+ return -EOPNOTSUPP; -+ -+ return ret.a3; -+} -+ -+static int -+ffa_transmit_fragment(u32 func_id, phys_addr_t buf, u32 buf_sz, u32 frag_len, -+ u32 len, u64 *handle, bool first) -+{ -+ if (!first) -+ return ffa_mem_next_frag(*handle, frag_len); -+ -+ return ffa_mem_first_frag(func_id, buf, buf_sz, frag_len, len, handle); -+} -+ -+static u32 ffa_get_num_pages_sg(struct scatterlist *sg) -+{ -+ u32 num_pages = 0; -+ -+ do { -+ num_pages += sg->length / FFA_PAGE_SIZE; -+ } while ((sg = sg_next(sg))); -+ -+ return num_pages; -+} -+ -+static int -+ffa_setup_and_transmit(u32 func_id, void *buffer, u32 max_fragsize, -+ struct ffa_mem_ops_args *args) -+{ -+ int rc = 0; -+ bool first = true; -+ phys_addr_t addr = 0; -+ struct ffa_composite_mem_region *composite; -+ struct ffa_mem_region_addr_range *constituents; -+ struct ffa_mem_region_attributes *ep_mem_access; -+ struct ffa_mem_region *mem_region = buffer; -+ u32 idx, frag_len, length, buf_sz = 0, num_entries = sg_nents(args->sg); -+ -+ mem_region->tag = args->tag; -+ mem_region->flags = args->flags; -+ mem_region->sender_id = drv_info->vm_id; -+ mem_region->attributes = FFA_MEM_NORMAL | FFA_MEM_WRITE_BACK | -+ FFA_MEM_INNER_SHAREABLE; -+ ep_mem_access = &mem_region->ep_mem_access[0]; -+ -+ for (idx = 0; idx < args->nattrs; idx++, ep_mem_access++) { -+ ep_mem_access->receiver = args->attrs[idx].receiver; -+ ep_mem_access->attrs = args->attrs[idx].attrs; -+ ep_mem_access->composite_off = COMPOSITE_OFFSET(args->nattrs); -+ } -+ mem_region->ep_count = args->nattrs; -+ -+ composite = buffer + COMPOSITE_OFFSET(args->nattrs); -+ composite->total_pg_cnt = ffa_get_num_pages_sg(args->sg); -+ composite->addr_range_cnt = num_entries; -+ -+ length = COMPOSITE_CONSTITUENTS_OFFSET(args->nattrs, num_entries); -+ frag_len = COMPOSITE_CONSTITUENTS_OFFSET(args->nattrs, 0); -+ if (frag_len > max_fragsize) -+ return -ENXIO; -+ -+ if (!args->use_txbuf) { -+ addr = virt_to_phys(buffer); -+ buf_sz = max_fragsize / FFA_PAGE_SIZE; -+ } -+ -+ constituents = buffer + frag_len; -+ idx = 0; -+ do { -+ if (frag_len == max_fragsize) { -+ rc = ffa_transmit_fragment(func_id, addr, buf_sz, -+ frag_len, length, -+ &args->g_handle, first); -+ if (rc < 0) -+ return -ENXIO; -+ -+ first = false; -+ idx = 0; -+ frag_len = 0; -+ constituents = buffer; -+ } -+ -+ if ((void *)constituents - buffer > max_fragsize) { -+ pr_err("Memory Region Fragment > Tx Buffer size\n"); -+ return -EFAULT; -+ } -+ -+ constituents->address = sg_phys(args->sg); -+ constituents->pg_cnt = args->sg->length / FFA_PAGE_SIZE; -+ constituents++; -+ frag_len += sizeof(struct ffa_mem_region_addr_range); -+ } while ((args->sg = sg_next(args->sg))); -+ -+ return ffa_transmit_fragment(func_id, addr, buf_sz, frag_len, -+ length, &args->g_handle, first); -+} -+ -+static int ffa_memory_ops(u32 func_id, struct ffa_mem_ops_args *args) -+{ -+ int ret; -+ void *buffer; -+ -+ if (!args->use_txbuf) { -+ buffer = alloc_pages_exact(RXTX_BUFFER_SIZE, GFP_KERNEL); -+ if (!buffer) -+ return -ENOMEM; -+ } else { -+ buffer = drv_info->tx_buffer; -+ mutex_lock(&drv_info->tx_lock); -+ } -+ -+ ret = ffa_setup_and_transmit(func_id, buffer, RXTX_BUFFER_SIZE, args); -+ -+ if (args->use_txbuf) -+ mutex_unlock(&drv_info->tx_lock); -+ else -+ free_pages_exact(buffer, RXTX_BUFFER_SIZE); -+ -+ return ret < 0 ? ret : 0; -+} -+ -+static int ffa_memory_reclaim(u64 g_handle, u32 flags) -+{ -+ ffa_value_t ret; -+ -+ invoke_ffa_fn((ffa_value_t){ -+ .a0 = FFA_MEM_RECLAIM, -+ .a1 = HANDLE_LOW(g_handle), .a2 = HANDLE_HIGH(g_handle), -+ .a3 = flags, -+ }, &ret); -+ -+ if (ret.a0 == FFA_ERROR) -+ return ffa_to_linux_errno((int)ret.a2); -+ -+ return 0; -+} -+ - static u32 ffa_api_version_get(void) - { - return drv_info->version; -@@ -387,11 +575,22 @@ static int ffa_sync_send_receive(struct ffa_device *dev, - dev->mode_32bit, data); - } - -+static int -+ffa_memory_share(struct ffa_device *dev, struct ffa_mem_ops_args *args) -+{ -+ if (dev->mode_32bit) -+ return ffa_memory_ops(FFA_MEM_SHARE, args); -+ -+ return ffa_memory_ops(FFA_FN_NATIVE(MEM_SHARE), args); -+} -+ - static const struct ffa_dev_ops ffa_ops = { - .api_version_get = ffa_api_version_get, - .partition_info_get = ffa_partition_info_get, - .mode_32bit_set = ffa_mode_32bit_set, - .sync_send_receive = ffa_sync_send_receive, -+ .memory_reclaim = ffa_memory_reclaim, -+ .memory_share = ffa_memory_share, - }; - - const struct ffa_dev_ops *ffa_dev_ops_get(struct ffa_device *dev) -diff --git a/include/linux/arm_ffa.h b/include/linux/arm_ffa.h -index d672673fc621..505c679b6a9b 100644 ---- a/include/linux/arm_ffa.h -+++ b/include/linux/arm_ffa.h -@@ -116,6 +116,142 @@ struct ffa_send_direct_data { - unsigned long data4; /* w7/x7 */ - }; - -+struct ffa_mem_region_addr_range { -+ /* The base IPA of the constituent memory region, aligned to 4 kiB */ -+ u64 address; -+ /* The number of 4 kiB pages in the constituent memory region. */ -+ u32 pg_cnt; -+ u32 reserved; -+}; -+ -+struct ffa_composite_mem_region { -+ /* -+ * The total number of 4 kiB pages included in this memory region. This -+ * must be equal to the sum of page counts specified in each -+ * `struct ffa_mem_region_addr_range`. -+ */ -+ u32 total_pg_cnt; -+ /* The number of constituents included in this memory region range */ -+ u32 addr_range_cnt; -+ u64 reserved; -+ /** An array of `addr_range_cnt` memory region constituents. */ -+ struct ffa_mem_region_addr_range constituents[]; -+}; -+ -+struct ffa_mem_region_attributes { -+ /* The ID of the VM to which the memory is being given or shared. */ -+ u16 receiver; -+ /* -+ * The permissions with which the memory region should be mapped in the -+ * receiver's page table. -+ */ -+#define FFA_MEM_EXEC BIT(3) -+#define FFA_MEM_NO_EXEC BIT(2) -+#define FFA_MEM_RW BIT(1) -+#define FFA_MEM_RO BIT(0) -+ u8 attrs; -+ /* -+ * Flags used during FFA_MEM_RETRIEVE_REQ and FFA_MEM_RETRIEVE_RESP -+ * for memory regions with multiple borrowers. -+ */ -+#define FFA_MEM_RETRIEVE_SELF_BORROWER BIT(0) -+ u8 flag; -+ u32 composite_off; -+ /* -+ * Offset in bytes from the start of the outer `ffa_memory_region` to -+ * an `struct ffa_mem_region_addr_range`. -+ */ -+ u64 reserved; -+}; -+ -+struct ffa_mem_region { -+ /* The ID of the VM/owner which originally sent the memory region */ -+ u16 sender_id; -+#define FFA_MEM_NORMAL BIT(5) -+#define FFA_MEM_DEVICE BIT(4) -+ -+#define FFA_MEM_WRITE_BACK (3 << 2) -+#define FFA_MEM_NON_CACHEABLE (1 << 2) -+ -+#define FFA_DEV_nGnRnE (0 << 2) -+#define FFA_DEV_nGnRE (1 << 2) -+#define FFA_DEV_nGRE (2 << 2) -+#define FFA_DEV_GRE (3 << 2) -+ -+#define FFA_MEM_NON_SHAREABLE (0) -+#define FFA_MEM_OUTER_SHAREABLE (2) -+#define FFA_MEM_INNER_SHAREABLE (3) -+ u8 attributes; -+ u8 reserved_0; -+/* -+ * Clear memory region contents after unmapping it from the sender and -+ * before mapping it for any receiver. -+ */ -+#define FFA_MEM_CLEAR BIT(0) -+/* -+ * Whether the hypervisor may time slice the memory sharing or retrieval -+ * operation. -+ */ -+#define FFA_TIME_SLICE_ENABLE BIT(1) -+ -+#define FFA_MEM_RETRIEVE_TYPE_IN_RESP (0 << 3) -+#define FFA_MEM_RETRIEVE_TYPE_SHARE (1 << 3) -+#define FFA_MEM_RETRIEVE_TYPE_LEND (2 << 3) -+#define FFA_MEM_RETRIEVE_TYPE_DONATE (3 << 3) -+ -+#define FFA_MEM_RETRIEVE_ADDR_ALIGN_HINT BIT(9) -+#define FFA_MEM_RETRIEVE_ADDR_ALIGN(x) ((x) << 5) -+ /* Flags to control behaviour of the transaction. */ -+ u32 flags; -+#define HANDLE_LOW_MASK GENMASK_ULL(31, 0) -+#define HANDLE_HIGH_MASK GENMASK_ULL(63, 32) -+#define HANDLE_LOW(x) ((u32)(FIELD_GET(HANDLE_LOW_MASK, (x)))) -+#define HANDLE_HIGH(x) ((u32)(FIELD_GET(HANDLE_HIGH_MASK, (x)))) -+ -+#define PACK_HANDLE(l, h) \ -+ (FIELD_PREP(HANDLE_LOW_MASK, (l)) | FIELD_PREP(HANDLE_HIGH_MASK, (h))) -+ /* -+ * A globally-unique ID assigned by the hypervisor for a region -+ * of memory being sent between VMs. -+ */ -+ u64 handle; -+ /* -+ * An implementation defined value associated with the receiver and the -+ * memory region. -+ */ -+ u64 tag; -+ u32 reserved_1; -+ /* -+ * The number of `ffa_mem_region_attributes` entries included in this -+ * transaction. -+ */ -+ u32 ep_count; -+ /* -+ * An array of endpoint memory access descriptors. -+ * Each one specifies a memory region offset, an endpoint and the -+ * attributes with which this memory region should be mapped in that -+ * endpoint's page table. -+ */ -+ struct ffa_mem_region_attributes ep_mem_access[]; -+}; -+ -+#define COMPOSITE_OFFSET(x) \ -+ (offsetof(struct ffa_mem_region, ep_mem_access[x])) -+#define CONSTITUENTS_OFFSET(x) \ -+ (offsetof(struct ffa_composite_mem_region, constituents[x])) -+#define COMPOSITE_CONSTITUENTS_OFFSET(x, y) \ -+ (COMPOSITE_OFFSET(x) + CONSTITUENTS_OFFSET(y)) -+ -+struct ffa_mem_ops_args { -+ bool use_txbuf; -+ u32 nattrs; -+ u32 flags; -+ u64 tag; -+ u64 g_handle; -+ struct scatterlist *sg; -+ struct ffa_mem_region_attributes *attrs; -+}; -+ - struct ffa_dev_ops { - u32 (*api_version_get)(void); - int (*partition_info_get)(const char *uuid_str, -@@ -123,6 +259,9 @@ struct ffa_dev_ops { - void (*mode_32bit_set)(struct ffa_device *dev); - int (*sync_send_receive)(struct ffa_device *dev, - struct ffa_send_direct_data *data); -+ int (*memory_reclaim)(u64 g_handle, u32 flags); -+ int (*memory_share)(struct ffa_device *dev, -+ struct ffa_mem_ops_args *args); - }; - - #endif /* _LINUX_ARM_FFA_H */ --- -2.17.1 - diff --git a/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0018-firmware-arm_ffa-Ensure-drivers-provide-a-probe-function.patch b/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0018-firmware-arm_ffa-Ensure-drivers-provide-a-probe-function.patch deleted file mode 100644 index 3ecd28a3..00000000 --- a/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0018-firmware-arm_ffa-Ensure-drivers-provide-a-probe-function.patch +++ /dev/null @@ -1,40 +0,0 @@ -Upstream-Status: Accepted [merged with kernel 5.14] -Signed-off-by: Arpita S.K - -From 92743071464fca5acbbe812d9a0d88de3eaaad36 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig?= -Date: Mon, 21 Jun 2021 22:16:51 +0200 -Subject: [PATCH] firmware: arm_ffa: Ensure drivers provide a probe function -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -The bus probe callback calls the driver callback without further -checking. Better be safe than sorry and refuse registration of a driver -without a probe function to prevent a NULL pointer exception. - -Link: https://lore.kernel.org/r/20210621201652.127611-1-u.kleine-koenig@pengutronix.de -Fixes: e781858488b9 ("firmware: arm_ffa: Add initial FFA bus support for device enumeration") -Signed-off-by: Uwe Kleine-König -Signed-off-by: Sudeep Holla ---- - drivers/firmware/arm_ffa/bus.c | 3 +++ - 1 file changed, 3 insertions(+) - -diff --git a/drivers/firmware/arm_ffa/bus.c b/drivers/firmware/arm_ffa/bus.c -index 83166e02b191..d2cc24319626 100644 ---- a/drivers/firmware/arm_ffa/bus.c -+++ b/drivers/firmware/arm_ffa/bus.c -@@ -99,6 +99,9 @@ int ffa_driver_register(struct ffa_driver *driver, struct module *owner, - { - int ret; - -+ if (!driver->probe) -+ return -EINVAL; -+ - driver->driver.bus = &ffa_bus_type; - driver->driver.name = driver->name; - driver->driver.owner = owner; --- -2.17.1 - diff --git a/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0019-firmware-arm_ffa-Simplify-probe-function.patch b/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0019-firmware-arm_ffa-Simplify-probe-function.patch deleted file mode 100644 index 13035d80..00000000 --- a/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0019-firmware-arm_ffa-Simplify-probe-function.patch +++ /dev/null @@ -1,38 +0,0 @@ -Upstream-Status: Accepted [merged with kernel 5.14] -Signed-off-by: Arpita S.K - -From e362547addc39e4bb18ad5bdfd59ce4d512d0c08 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig?= -Date: Mon, 21 Jun 2021 22:16:52 +0200 -Subject: [PATCH] firmware: arm_ffa: Simplify probe function -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -When the driver core calls the probe callback it already checked that -the devices match, so there is no need to call the match callback again. - -Link: https://lore.kernel.org/r/20210621201652.127611-2-u.kleine-koenig@pengutronix.de -Signed-off-by: Uwe Kleine-König -Signed-off-by: Sudeep Holla ---- - drivers/firmware/arm_ffa/bus.c | 3 --- - 1 file changed, 3 deletions(-) - -diff --git a/drivers/firmware/arm_ffa/bus.c b/drivers/firmware/arm_ffa/bus.c -index d2cc24319626..00fe595a5bc8 100644 ---- a/drivers/firmware/arm_ffa/bus.c -+++ b/drivers/firmware/arm_ffa/bus.c -@@ -46,9 +46,6 @@ static int ffa_device_probe(struct device *dev) - struct ffa_driver *ffa_drv = to_ffa_driver(dev->driver); - struct ffa_device *ffa_dev = to_ffa_dev(dev); - -- if (!ffa_device_match(dev, dev->driver)) -- return -ENODEV; -- - return ffa_drv->probe(ffa_dev); - } - --- -2.17.1 - diff --git a/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0020-firmware-arm_ffa-Fix-the-comment-style.patch b/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0020-firmware-arm_ffa-Fix-the-comment-style.patch deleted file mode 100644 index 0850c1c5..00000000 --- a/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0020-firmware-arm_ffa-Fix-the-comment-style.patch +++ /dev/null @@ -1,41 +0,0 @@ -Upstream-Status: Accepted [merged with kernel 5.14] -Signed-off-by: Arpita S.K - -From ba684a31d3626c86cd9097e12d6ed57d224d077d Mon Sep 17 00:00:00 2001 -From: Sudeep Holla -Date: Tue, 22 Jun 2021 17:22:02 +0100 -Subject: [PATCH] firmware: arm_ffa: Fix the comment style - -clang produces the following warning: - - drivers/firmware/arm_ffa/driver.c:123: warning: expecting - prototype for FF(). Prototype was for FFA_PAGE_SIZE() instead - - This comment starts with '/**', but isn't a kernel-doc comment. - Refer Documentation/doc-guide/kernel-doc.rst - -Fix the same by removing the kernel-doc style comment here. - -Link: https://lore.kernel.org/r/20210622162202.3485866-1-sudeep.holla@arm.com -Reported-by: kernel test robot -Signed-off-by: Sudeep Holla ---- - drivers/firmware/arm_ffa/driver.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/drivers/firmware/arm_ffa/driver.c b/drivers/firmware/arm_ffa/driver.c -index b1edb4b2e94a..88b822575ac4 100644 ---- a/drivers/firmware/arm_ffa/driver.c -+++ b/drivers/firmware/arm_ffa/driver.c -@@ -120,7 +120,7 @@ - #define PACK_TARGET_INFO(s, r) \ - (FIELD_PREP(SENDER_ID_MASK, (s)) | FIELD_PREP(RECEIVER_ID_MASK, (r))) - --/** -+/* - * FF-A specification mentions explicitly about '4K pages'. This should - * not be confused with the kernel PAGE_SIZE, which is the translation - * granule kernel is configured and may be one among 4K, 16K and 64K. --- -2.17.1 - diff --git a/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0021-firmware-arm_ffa-Fix-a-possible-ffa_linux_errmap-buffer-overflow.patch b/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0021-firmware-arm_ffa-Fix-a-possible-ffa_linux_errmap-buffer-overflow.patch deleted file mode 100644 index 5575952a..00000000 --- a/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0021-firmware-arm_ffa-Fix-a-possible-ffa_linux_errmap-buffer-overflow.patch +++ /dev/null @@ -1,46 +0,0 @@ -Upstream-Status: Accepted [merged with kernel 5.14] -Signed-off-by: Arpita S.K - -From dd925db6f07556061c11ab1fbfa4a0145ae6b438 Mon Sep 17 00:00:00 2001 -From: Sudeep Holla -Date: Wed, 7 Jul 2021 14:47:39 +0100 -Subject: [PATCH] firmware: arm_ffa: Fix a possible ffa_linux_errmap buffer - overflow - -The ffa_linux_errmap buffer access index is supposed to range from 0-8 -but it ranges from 1-9 instead. It reads one element out of bounds. It -also changes the success into -EINVAL though ffa_to_linux_errno is never -used in case of success, it is expected to work for success case too. - -It is slightly confusing code as the negative of the error code -is used as index to the buffer. Fix it by negating it at the start and -make it more readable. - -Link: https://lore.kernel.org/r/20210707134739.1869481-1-sudeep.holla@arm.com -Reported-by: kernel test robot -Reported-by: Dan Carpenter -Signed-off-by: Sudeep Holla ---- - drivers/firmware/arm_ffa/driver.c | 6 ++++-- - 1 file changed, 4 insertions(+), 2 deletions(-) - -diff --git a/drivers/firmware/arm_ffa/driver.c b/drivers/firmware/arm_ffa/driver.c -index 88b822575ac4..c9fb56afbcb4 100644 ---- a/drivers/firmware/arm_ffa/driver.c -+++ b/drivers/firmware/arm_ffa/driver.c -@@ -149,8 +149,10 @@ static const int ffa_linux_errmap[] = { - - static inline int ffa_to_linux_errno(int errno) - { -- if (errno < FFA_RET_SUCCESS && errno >= -ARRAY_SIZE(ffa_linux_errmap)) -- return ffa_linux_errmap[-errno]; -+ int err_idx = -errno; -+ -+ if (err_idx >= 0 && err_idx < ARRAY_SIZE(ffa_linux_errmap)) -+ return ffa_linux_errmap[err_idx]; - return -EINVAL; - } - --- -2.17.1 - diff --git a/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0022-usb-isp1760-isp1760-udc-Provide-missing-description-.patch b/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0022-usb-isp1760-isp1760-udc-Provide-missing-description-.patch deleted file mode 100644 index 7e855956..00000000 --- a/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0022-usb-isp1760-isp1760-udc-Provide-missing-description-.patch +++ /dev/null @@ -1,41 +0,0 @@ -Upstream-Status: Accepted [merged with kernel 5.15] -Signed-off-by: Arpita S.K - -From 8268acfe1cc967dbe9fbb05b5f07a19675a81cff Mon Sep 17 00:00:00 2001 -From: Lee Jones -Date: Wed, 26 May 2021 14:00:19 +0100 -Subject: [PATCH 09/23] usb: isp1760: isp1760-udc: Provide missing description - for 'udc' param - -Fixes the following W=1 kernel build warning(s): - - drivers/usb/isp1760/isp1760-udc.c:150: warning: Function parameter or member 'udc' not described in 'isp1760_udc_select_ep' - -Cc: Greg Kroah-Hartman -Cc: Rui Miguel Silva -Cc: Laurent Pinchart -Cc: linux-usb@vger.kernel.org -Reviewed-by: Rui Miguel Silva -Signed-off-by: Lee Jones -Link: https://lore.kernel.org/r/20210526130037.856068-7-lee.jones@linaro.org -Signed-off-by: Greg Kroah-Hartman -Signed-off-by: Rui Miguel Silva ---- - drivers/usb/isp1760/isp1760-udc.c | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/drivers/usb/isp1760/isp1760-udc.c b/drivers/usb/isp1760/isp1760-udc.c -index 3e05e3605435..a78da59d6417 100644 ---- a/drivers/usb/isp1760/isp1760-udc.c -+++ b/drivers/usb/isp1760/isp1760-udc.c -@@ -137,6 +137,7 @@ static void __isp1760_udc_select_ep(struct isp1760_udc *udc, - /** - * isp1760_udc_select_ep - Select an endpoint for register access - * @ep: The endpoint -+ * @udc: Reference to the device controller - * - * The ISP1761 endpoint registers are banked. This function selects the target - * endpoint for banked register access. The selection remains valid until the --- -2.33.0 - diff --git a/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0023-usb-isp1760-Fix-meaningless-check-in-isp1763_run.patch b/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0023-usb-isp1760-Fix-meaningless-check-in-isp1763_run.patch deleted file mode 100644 index a194d7b7..00000000 --- a/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0023-usb-isp1760-Fix-meaningless-check-in-isp1763_run.patch +++ /dev/null @@ -1,38 +0,0 @@ -Upstream-Status: Accepted [merged with kernel 5.15] -Signed-off-by: Arpita S.K - -From 5f4dee73a4bc25a7781a5406b49439bc640981c2 Mon Sep 17 00:00:00 2001 -From: Tong Tiangen -Date: Fri, 11 Jun 2021 09:40:55 +0800 -Subject: [PATCH 10/23] usb: isp1760: Fix meaningless check in isp1763_run() - -Remove attribution to retval before check, which make it completely -meaningless, and does't check what it was supposed: the return -value of the timed function to set up configuration flag. - -Fixes: 60d789f3bfbb ("usb: isp1760: add support for isp1763") -Tested-by: Rui Miguel Silva -Reviewed-by: Rui Miguel Silva -Signed-off-by: Tong Tiangen -Link: https://lore.kernel.org/r/20210611014055.68551-1-tongtiangen@huawei.com -Signed-off-by: Greg Kroah-Hartman -Signed-off-by: Rui Miguel Silva ---- - drivers/usb/isp1760/isp1760-hcd.c | 1 - - 1 file changed, 1 deletion(-) - -diff --git a/drivers/usb/isp1760/isp1760-hcd.c b/drivers/usb/isp1760/isp1760-hcd.c -index 016a54ea76f4..27168b4a4ef2 100644 ---- a/drivers/usb/isp1760/isp1760-hcd.c -+++ b/drivers/usb/isp1760/isp1760-hcd.c -@@ -1648,7 +1648,6 @@ static int isp1763_run(struct usb_hcd *hcd) - down_write(&ehci_cf_port_reset_rwsem); - retval = isp1760_hcd_set_and_wait(hcd, FLAG_CF, 250 * 1000); - up_write(&ehci_cf_port_reset_rwsem); -- retval = 0; - if (retval) - return retval; - --- -2.33.0 - diff --git a/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0024-usb-isp1760-remove-debug-message-as-error.patch b/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0024-usb-isp1760-remove-debug-message-as-error.patch deleted file mode 100644 index 10ccfd7a..00000000 --- a/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0024-usb-isp1760-remove-debug-message-as-error.patch +++ /dev/null @@ -1,32 +0,0 @@ -Upstream-Status: Accepted [merged with kernel 5.15] -Signed-off-by: Arpita S.K - -From 7de14c88272c05d86fce83a5cead36832ce3a424 Mon Sep 17 00:00:00 2001 -From: Rui Miguel Silva -Date: Tue, 27 Jul 2021 11:05:14 +0100 -Subject: [PATCH 11/23] usb: isp1760: remove debug message as error - -Remove debug message leftover from the boot error buffer. - -Signed-off-by: Rui Miguel Silva -Link: https://lore.kernel.org/r/20210727100516.4190681-2-rui.silva@linaro.org -Signed-off-by: Greg Kroah-Hartman ---- - drivers/usb/isp1760/isp1760-hcd.c | 1 - - 1 file changed, 1 deletion(-) - -diff --git a/drivers/usb/isp1760/isp1760-hcd.c b/drivers/usb/isp1760/isp1760-hcd.c -index 27168b4a4ef2..a745c4c2b773 100644 ---- a/drivers/usb/isp1760/isp1760-hcd.c -+++ b/drivers/usb/isp1760/isp1760-hcd.c -@@ -733,7 +733,6 @@ static int isp1760_hc_setup(struct usb_hcd *hcd) - - /* Change bus pattern */ - scratch = isp1760_hcd_read(hcd, HC_CHIP_ID_HIGH); -- dev_err(hcd->self.controller, "Scratch test 0x%08x\n", scratch); - scratch = isp1760_hcd_read(hcd, HC_SCRATCH); - if (scratch != pattern) { - dev_err(hcd->self.controller, "Scratch test failed. 0x%08x\n", scratch); --- -2.33.0 - diff --git a/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0025-usb-isp1760-do-not-sleep-in-field-register-poll.patch b/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0025-usb-isp1760-do-not-sleep-in-field-register-poll.patch deleted file mode 100644 index ab6627e3..00000000 --- a/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0025-usb-isp1760-do-not-sleep-in-field-register-poll.patch +++ /dev/null @@ -1,58 +0,0 @@ -Upstream-Status: Accepted [merged with kernel 5.14.9] -Signed-off-by: Arpita S.K - -From 41f673183862a183d4ea0522c045fabfbd1b28c8 Mon Sep 17 00:00:00 2001 -From: Rui Miguel Silva -Date: Tue, 27 Jul 2021 11:05:15 +0100 -Subject: [PATCH 12/23] usb: isp1760: do not sleep in field register poll - -When polling for a setup or clear of a register field we were sleeping -in atomic context but using a very tight sleep interval. - -Since the use cases for this poll mechanism are only in setup and -stop paths, and in practice this poll is not used most of the times -but needs to be there to comply to hardware setup times, remove the -sleep time and make the poll loop tighter. - -Reported-by: Dan Carpenter -Signed-off-by: Rui Miguel Silva -Link: https://lore.kernel.org/r/20210727100516.4190681-3-rui.silva@linaro.org -Signed-off-by: Greg Kroah-Hartman ---- - drivers/usb/isp1760/isp1760-hcd.c | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - -diff --git a/drivers/usb/isp1760/isp1760-hcd.c b/drivers/usb/isp1760/isp1760-hcd.c -index a745c4c2b773..a018394d54f8 100644 ---- a/drivers/usb/isp1760/isp1760-hcd.c -+++ b/drivers/usb/isp1760/isp1760-hcd.c -@@ -250,7 +250,7 @@ static int isp1760_hcd_set_and_wait(struct usb_hcd *hcd, u32 field, - isp1760_hcd_set(hcd, field); - - return regmap_field_read_poll_timeout(priv->fields[field], val, -- val, 10, timeout_us); -+ val, 0, timeout_us); - } - - static int isp1760_hcd_set_and_wait_swap(struct usb_hcd *hcd, u32 field, -@@ -262,7 +262,7 @@ static int isp1760_hcd_set_and_wait_swap(struct usb_hcd *hcd, u32 field, - isp1760_hcd_set(hcd, field); - - return regmap_field_read_poll_timeout(priv->fields[field], val, -- !val, 10, timeout_us); -+ !val, 0, timeout_us); - } - - static int isp1760_hcd_clear_and_wait(struct usb_hcd *hcd, u32 field, -@@ -274,7 +274,7 @@ static int isp1760_hcd_clear_and_wait(struct usb_hcd *hcd, u32 field, - isp1760_hcd_clear(hcd, field); - - return regmap_field_read_poll_timeout(priv->fields[field], val, -- !val, 10, timeout_us); -+ !val, 0, timeout_us); - } - - static bool isp1760_hcd_is_set(struct usb_hcd *hcd, u32 field) --- -2.33.0 - diff --git a/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0026-usb-isp1760-rework-cache-initialization-error-handli.patch b/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0026-usb-isp1760-rework-cache-initialization-error-handli.patch deleted file mode 100644 index d03d6471..00000000 --- a/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0026-usb-isp1760-rework-cache-initialization-error-handli.patch +++ /dev/null @@ -1,55 +0,0 @@ -Upstream-Status: Accepted [merged with kernel 5.15] -Signed-off-by: Arpita S.K - -From cbbdb3fe0d974d655c87c3e6ba2990d5496b9f82 Mon Sep 17 00:00:00 2001 -From: Rui Miguel Silva -Date: Tue, 27 Jul 2021 11:05:16 +0100 -Subject: [PATCH 13/23] usb: isp1760: rework cache initialization error - handling - -If we fail to create qtd cache we were not destroying the -urb_listitem, rework the error handling logic to cope with that. - -Signed-off-by: Rui Miguel Silva -Link: https://lore.kernel.org/r/20210727100516.4190681-4-rui.silva@linaro.org -Signed-off-by: Greg Kroah-Hartman ---- - drivers/usb/isp1760/isp1760-hcd.c | 16 +++++++++++----- - 1 file changed, 11 insertions(+), 5 deletions(-) - -diff --git a/drivers/usb/isp1760/isp1760-hcd.c b/drivers/usb/isp1760/isp1760-hcd.c -index a018394d54f8..825be736be33 100644 ---- a/drivers/usb/isp1760/isp1760-hcd.c -+++ b/drivers/usb/isp1760/isp1760-hcd.c -@@ -2527,17 +2527,23 @@ int __init isp1760_init_kmem_once(void) - SLAB_MEM_SPREAD, NULL); - - if (!qtd_cachep) -- return -ENOMEM; -+ goto destroy_urb_listitem; - - qh_cachep = kmem_cache_create("isp1760_qh", sizeof(struct isp1760_qh), - 0, SLAB_TEMPORARY | SLAB_MEM_SPREAD, NULL); - -- if (!qh_cachep) { -- kmem_cache_destroy(qtd_cachep); -- return -ENOMEM; -- } -+ if (!qh_cachep) -+ goto destroy_qtd; - - return 0; -+ -+destroy_qtd: -+ kmem_cache_destroy(qtd_cachep); -+ -+destroy_urb_listitem: -+ kmem_cache_destroy(urb_listitem_cachep); -+ -+ return -ENOMEM; - } - - void isp1760_deinit_kmem_cache(void) --- -2.33.0 - diff --git a/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0027-usb-isp1760-ignore-return-value-for-bus-change-patte.patch b/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0027-usb-isp1760-ignore-return-value-for-bus-change-patte.patch deleted file mode 100644 index 354291a9..00000000 --- a/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0027-usb-isp1760-ignore-return-value-for-bus-change-patte.patch +++ /dev/null @@ -1,55 +0,0 @@ -Upstream-Status: Accepted [merged with kernel 5.15] -Signed-off-by: Arpita S.K - -From 8472896f39cfab2d8fec9ca746070aaf02609169 Mon Sep 17 00:00:00 2001 -From: Rui Miguel Silva -Date: Thu, 19 Aug 2021 19:09:25 +0100 -Subject: [PATCH 14/23] usb: isp1760: ignore return value for bus change - pattern - -We do not care about the return value of that read between the -scratch register write and read, we really just want to make sure that -the pattern in the bus get changed to make sure we are testing -correctly the scratch pattern. - -Clang-analyzer complains about the never read scratch variable: ->> drivers/usb/isp1760/isp1760-hcd.c:735:2: warning: Value stored to 'scratch' is never read [clang-analyzer-deadcode.DeadStores] - scratch = isp1760_hcd_read(hcd, HC_CHIP_ID_HIGH); - -Just ignore the return value of that CHIP_ID_HIGH read, add more -information to the comment above why we are doing this. And as at it, -just do a small format change in the error message bellow. - -Signed-off-by: Rui Miguel Silva -Link: https://lore.kernel.org/r/20210819180929.1327349-2-rui.silva@linaro.org -Signed-off-by: Greg Kroah-Hartman ---- - drivers/usb/isp1760/isp1760-hcd.c | 10 +++++++--- - 1 file changed, 7 insertions(+), 3 deletions(-) - -diff --git a/drivers/usb/isp1760/isp1760-hcd.c b/drivers/usb/isp1760/isp1760-hcd.c -index 825be736be33..2a21fe5aa7a8 100644 ---- a/drivers/usb/isp1760/isp1760-hcd.c -+++ b/drivers/usb/isp1760/isp1760-hcd.c -@@ -731,11 +731,15 @@ static int isp1760_hc_setup(struct usb_hcd *hcd) - - isp1760_hcd_write(hcd, HC_SCRATCH, pattern); - -- /* Change bus pattern */ -- scratch = isp1760_hcd_read(hcd, HC_CHIP_ID_HIGH); -+ /* -+ * we do not care about the read value here we just want to -+ * change bus pattern. -+ */ -+ isp1760_hcd_read(hcd, HC_CHIP_ID_HIGH); - scratch = isp1760_hcd_read(hcd, HC_SCRATCH); - if (scratch != pattern) { -- dev_err(hcd->self.controller, "Scratch test failed. 0x%08x\n", scratch); -+ dev_err(hcd->self.controller, "Scratch test failed. 0x%08x\n", -+ scratch); - return -ENODEV; - } - --- -2.33.0 - diff --git a/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0028-usb-isp1760-check-maxpacketsize-before-using-it.patch b/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0028-usb-isp1760-check-maxpacketsize-before-using-it.patch deleted file mode 100644 index 67c3585a..00000000 --- a/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0028-usb-isp1760-check-maxpacketsize-before-using-it.patch +++ /dev/null @@ -1,40 +0,0 @@ -Upstream-Status: Accepted [merged with kernel 5.15] -Signed-off-by: Arpita S.K - -From 8e58b7710d6634ed46ae26fedb8459f84f08fd51 Mon Sep 17 00:00:00 2001 -From: Rui Miguel Silva -Date: Thu, 19 Aug 2021 19:09:26 +0100 -Subject: [PATCH 15/23] usb: isp1760: check maxpacketsize before using it - -When checking if we need one more packet on a bulk pipe we may, even -though not probable at all, get there with a zero maxpacketsize. -In that case for sure no packet, no even a one more, will be -allocated. - -This will clean the clang-analyzer warning: -drivers/usb/isp1760/isp1760-hcd.c:1856:38: warning: Division by zero [clang-analyzer-core.DivideZero] - && !(urb->transfer_buffer_length % - -Signed-off-by: Rui Miguel Silva -Link: https://lore.kernel.org/r/20210819180929.1327349-3-rui.silva@linaro.org -Signed-off-by: Greg Kroah-Hartman ---- - drivers/usb/isp1760/isp1760-hcd.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/drivers/usb/isp1760/isp1760-hcd.c b/drivers/usb/isp1760/isp1760-hcd.c -index 2a21fe5aa7a8..5c947a1eae49 100644 ---- a/drivers/usb/isp1760/isp1760-hcd.c -+++ b/drivers/usb/isp1760/isp1760-hcd.c -@@ -1854,7 +1854,7 @@ static void packetize_urb(struct usb_hcd *hcd, - packet_type = OUT_PID; - else - packet_type = IN_PID; -- } else if (usb_pipebulk(urb->pipe) -+ } else if (usb_pipebulk(urb->pipe) && maxpacketsize - && (urb->transfer_flags & URB_ZERO_PACKET) - && !(urb->transfer_buffer_length % - maxpacketsize)) { --- -2.33.0 - diff --git a/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0029-usb-isp1760-do-not-reset-retval.patch b/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0029-usb-isp1760-do-not-reset-retval.patch deleted file mode 100644 index ccf3248c..00000000 --- a/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0029-usb-isp1760-do-not-reset-retval.patch +++ /dev/null @@ -1,36 +0,0 @@ -Upstream-Status: Accepted [merged with kernel 5.15] -Signed-off-by: Arpita S.K - -From 5e4cd1b6556302fe6a457e525c256cbef3563543 Mon Sep 17 00:00:00 2001 -From: Rui Miguel Silva -Date: Thu, 19 Aug 2021 19:09:27 +0100 -Subject: [PATCH 16/23] usb: isp1760: do not reset retval - -We do not really need to reset retval before get used bellow. -This will avoid the clang-analyzer warning: - -drivers/usb/isp1760/isp1760-hcd.c:1919:2: warning: Value stored to 'retval' is never read [clang-analyzer-deadcode.DeadStores] - retval = 0; - -Signed-off-by: Rui Miguel Silva -Link: https://lore.kernel.org/r/20210819180929.1327349-4-rui.silva@linaro.org -Signed-off-by: Greg Kroah-Hartman ---- - drivers/usb/isp1760/isp1760-hcd.c | 1 - - 1 file changed, 1 deletion(-) - -diff --git a/drivers/usb/isp1760/isp1760-hcd.c b/drivers/usb/isp1760/isp1760-hcd.c -index 5c947a1eae49..aed2714ce0cf 100644 ---- a/drivers/usb/isp1760/isp1760-hcd.c -+++ b/drivers/usb/isp1760/isp1760-hcd.c -@@ -1919,7 +1919,6 @@ static int isp1760_urb_enqueue(struct usb_hcd *hcd, struct urb *urb, - if (list_empty(&new_qtds)) - return -ENOMEM; - -- retval = 0; - spin_lock_irqsave(&priv->lock, spinflags); - - if (!test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags)) { --- -2.33.0 - diff --git a/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0030-usb-isp1760-do-not-shift-in-uninitialized-slot.patch b/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0030-usb-isp1760-do-not-shift-in-uninitialized-slot.patch deleted file mode 100644 index 1de6c697..00000000 --- a/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0030-usb-isp1760-do-not-shift-in-uninitialized-slot.patch +++ /dev/null @@ -1,61 +0,0 @@ -Upstream-Status: Accepted [merged with kernel 5.15] -Signed-off-by: Arpita S.K - -From 7d1d3882fd9da1ee42fe3ad3a5ffd41fb8204380 Mon Sep 17 00:00:00 2001 -From: Rui Miguel Silva -Date: Thu, 19 Aug 2021 19:09:28 +0100 -Subject: [PATCH 17/23] usb: isp1760: do not shift in uninitialized slot - -Even though it is not expected, and would trigger a WARN_ON, killing a -transfer in a uninitialized slot this sequence is warned by clang -analyzer, twice: - -drivers/usb/isp1760/isp1760-hcd.c:1976:18: warning: The result of the left shift is undefined because the right operand is negative [clang-analyzer-core.UndefinedBinaryOperatorResult] - skip_map |= (1 << qh->slot); -drivers/usb/isp1760/isp1760-hcd.c:1983:18: warning: The result of the left shift is undefined because the right operand is negative [clang-analyzer-core.UndefinedBinaryOperatorResult] - skip_map |= (1 << qh->slot); - -Only set skip map if slot is active. - -Signed-off-by: Rui Miguel Silva -Link: https://lore.kernel.org/r/20210819180929.1327349-5-rui.silva@linaro.org -Signed-off-by: Greg Kroah-Hartman ---- - drivers/usb/isp1760/isp1760-hcd.c | 18 +++++++++++------- - 1 file changed, 11 insertions(+), 7 deletions(-) - -diff --git a/drivers/usb/isp1760/isp1760-hcd.c b/drivers/usb/isp1760/isp1760-hcd.c -index aed2714ce0cf..bf8ab3fe2e5a 100644 ---- a/drivers/usb/isp1760/isp1760-hcd.c -+++ b/drivers/usb/isp1760/isp1760-hcd.c -@@ -1974,16 +1974,20 @@ static void kill_transfer(struct usb_hcd *hcd, struct urb *urb, - /* We need to forcefully reclaim the slot since some transfers never - return, e.g. interrupt transfers and NAKed bulk transfers. */ - if (usb_pipecontrol(urb->pipe) || usb_pipebulk(urb->pipe)) { -- skip_map = isp1760_hcd_read(hcd, HC_ATL_PTD_SKIPMAP); -- skip_map |= (1 << qh->slot); -- isp1760_hcd_write(hcd, HC_ATL_PTD_SKIPMAP, skip_map); -- ndelay(100); -+ if (qh->slot != -1) { -+ skip_map = isp1760_hcd_read(hcd, HC_ATL_PTD_SKIPMAP); -+ skip_map |= (1 << qh->slot); -+ isp1760_hcd_write(hcd, HC_ATL_PTD_SKIPMAP, skip_map); -+ ndelay(100); -+ } - priv->atl_slots[qh->slot].qh = NULL; - priv->atl_slots[qh->slot].qtd = NULL; - } else { -- skip_map = isp1760_hcd_read(hcd, HC_INT_PTD_SKIPMAP); -- skip_map |= (1 << qh->slot); -- isp1760_hcd_write(hcd, HC_INT_PTD_SKIPMAP, skip_map); -+ if (qh->slot != -1) { -+ skip_map = isp1760_hcd_read(hcd, HC_INT_PTD_SKIPMAP); -+ skip_map |= (1 << qh->slot); -+ isp1760_hcd_write(hcd, HC_INT_PTD_SKIPMAP, skip_map); -+ } - priv->int_slots[qh->slot].qh = NULL; - priv->int_slots[qh->slot].qtd = NULL; - } --- -2.33.0 - diff --git a/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0031-usb-isp1760-clean-never-read-udc_enabled-warning.patch b/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0031-usb-isp1760-clean-never-read-udc_enabled-warning.patch deleted file mode 100644 index 7d908dec..00000000 --- a/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0031-usb-isp1760-clean-never-read-udc_enabled-warning.patch +++ /dev/null @@ -1,52 +0,0 @@ -Upstream-Status: Accepted [merged with kernel 5.15] -Signed-off-by: Arpita S.K - -From de940244e8987a76d73fb2b0057ecd494cbfeefd Mon Sep 17 00:00:00 2001 -From: Rui Miguel Silva -Date: Thu, 19 Aug 2021 19:09:29 +0100 -Subject: [PATCH 18/23] usb: isp1760: clean never read udc_enabled warning - -When CONFIG_USB_ISP1761_UDC is not enabled the udc_enabled variable is -never used since it is short circuited before in the logic operations. - -This would trigger the following warning by clang analyzer: - -drivers/usb/isp1760/isp1760-core.c:490:2: warning: Value stored to 'udc_enabled' is never read [clang-analyzer-deadcode.DeadStores] - udc_enabled = ((devflags & ISP1760_FLAG_ISP1763) || - ^ -drivers/usb/isp1760/isp1760-core.c:490:2: note: Value stored to 'udc_enabled' is never read - -Just swap the other of the operands in the logic operations. - -Signed-off-by: Rui Miguel Silva -Link: https://lore.kernel.org/r/20210819180929.1327349-6-rui.silva@linaro.org -Signed-off-by: Greg Kroah-Hartman ---- - drivers/usb/isp1760/isp1760-core.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/drivers/usb/isp1760/isp1760-core.c b/drivers/usb/isp1760/isp1760-core.c -index ff07e2890692..cb70f9d63cdd 100644 ---- a/drivers/usb/isp1760/isp1760-core.c -+++ b/drivers/usb/isp1760/isp1760-core.c -@@ -491,7 +491,7 @@ int isp1760_register(struct resource *mem, int irq, unsigned long irqflags, - (devflags & ISP1760_FLAG_ISP1761)); - - if ((!IS_ENABLED(CONFIG_USB_ISP1760_HCD) || usb_disabled()) && -- (!IS_ENABLED(CONFIG_USB_ISP1761_UDC) || !udc_enabled)) -+ (!udc_enabled || !IS_ENABLED(CONFIG_USB_ISP1761_UDC))) - return -ENODEV; - - isp = devm_kzalloc(dev, sizeof(*isp), GFP_KERNEL); -@@ -571,7 +571,7 @@ int isp1760_register(struct resource *mem, int irq, unsigned long irqflags, - return ret; - } - -- if (IS_ENABLED(CONFIG_USB_ISP1761_UDC) && udc_enabled) { -+ if (udc_enabled && IS_ENABLED(CONFIG_USB_ISP1761_UDC)) { - ret = isp1760_udc_register(isp, irq, irqflags); - if (ret < 0) { - isp1760_hcd_unregister(hcd); --- -2.33.0 - diff --git a/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0032-usb-isp1760-fix-memory-pool-initialization.patch b/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0032-usb-isp1760-fix-memory-pool-initialization.patch deleted file mode 100644 index 6277d8a9..00000000 --- a/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0032-usb-isp1760-fix-memory-pool-initialization.patch +++ /dev/null @@ -1,36 +0,0 @@ -Upstream-Status: Accepted [merged with kernel 5.14.9] -Signed-off-by: Arpita S.K - -From d36713c344e0c963178e417911d2cd867597d2f0 Mon Sep 17 00:00:00 2001 -From: Rui Miguel Silva -Date: Fri, 27 Aug 2021 01:27:40 +0100 -Subject: [PATCH 19/23] usb: isp1760: fix memory pool initialization - -The loops to setup the memory pool were skipping some -blocks, that was not visible on the ISP1763 because it has -fewer blocks than the ISP1761. But won testing on that IP -from the family that would be an issue. - -Signed-off-by: Rui Miguel Silva ---- - drivers/usb/isp1760/isp1760-hcd.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/drivers/usb/isp1760/isp1760-hcd.c b/drivers/usb/isp1760/isp1760-hcd.c -index bf8ab3fe2e5a..b3a55c5d2155 100644 ---- a/drivers/usb/isp1760/isp1760-hcd.c -+++ b/drivers/usb/isp1760/isp1760-hcd.c -@@ -588,8 +588,8 @@ static void init_memory(struct isp1760_hcd *priv) - - payload_addr = PAYLOAD_OFFSET; - -- for (i = 0, curr = 0; i < ARRAY_SIZE(mem->blocks); i++) { -- for (j = 0; j < mem->blocks[i]; j++, curr++) { -+ for (i = 0, curr = 0; i < ARRAY_SIZE(mem->blocks); i++, curr += j) { -+ for (j = 0; j < mem->blocks[i]; j++) { - priv->memory_pool[curr + j].start = payload_addr; - priv->memory_pool[curr + j].size = mem->blocks_size[i]; - priv->memory_pool[curr + j].free = 1; --- -2.33.0 - diff --git a/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0033-usb-isp1760-fix-qtd-fill-length.patch b/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0033-usb-isp1760-fix-qtd-fill-length.patch deleted file mode 100644 index ee913bc6..00000000 --- a/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0033-usb-isp1760-fix-qtd-fill-length.patch +++ /dev/null @@ -1,38 +0,0 @@ -Upstream-Status: Accepted [merged with kernel 5.14.9] -Signed-off-by: Arpita S.K - -From fc22c0fb49d7858b3c7b8bd2a8e041263280e230 Mon Sep 17 00:00:00 2001 -From: Rui Miguel Silva -Date: Wed, 25 Aug 2021 00:10:02 +0100 -Subject: [PATCH 20/23] usb: isp1760: fix qtd fill length - -When trying to send bulks bigger than the biggest block size -we need to split them over several qtd. Fix this limiting the -maximum qtd size to largest block size. - -Signed-off-by: Rui Miguel Silva ---- - drivers/usb/isp1760/isp1760-hcd.c | 6 ++++-- - 1 file changed, 4 insertions(+), 2 deletions(-) - -diff --git a/drivers/usb/isp1760/isp1760-hcd.c b/drivers/usb/isp1760/isp1760-hcd.c -index b3a55c5d2155..fba21122bb00 100644 ---- a/drivers/usb/isp1760/isp1760-hcd.c -+++ b/drivers/usb/isp1760/isp1760-hcd.c -@@ -1829,9 +1829,11 @@ static void packetize_urb(struct usb_hcd *hcd, - goto cleanup; - - if (len > mem->blocks_size[ISP176x_BLOCK_NUM - 1]) -- len = mem->blocks_size[ISP176x_BLOCK_NUM - 1]; -+ this_qtd_len = mem->blocks_size[ISP176x_BLOCK_NUM - 1]; -+ else -+ this_qtd_len = len; - -- this_qtd_len = qtd_fill(qtd, buf, len); -+ this_qtd_len = qtd_fill(qtd, buf, this_qtd_len); - list_add_tail(&qtd->qtd_list, head); - - len -= this_qtd_len; --- -2.33.0 - diff --git a/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0034-usb-isp1760-write-to-status-and-address-register.patch b/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0034-usb-isp1760-write-to-status-and-address-register.patch deleted file mode 100644 index 7b8d8457..00000000 --- a/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0034-usb-isp1760-write-to-status-and-address-register.patch +++ /dev/null @@ -1,90 +0,0 @@ -Upstream-Status: Accepted [merged with kernel 5.14.9] -Signed-off-by: Arpita S.K - -From a5dca0d8c66fb40ef372b596cbcfad45112fa050 Mon Sep 17 00:00:00 2001 -From: Rui Miguel Silva -Date: Tue, 24 Aug 2021 09:37:27 +0100 -Subject: [PATCH 21/23] usb: isp1760: write to status and address register - -We were already writing directly the port status register to -trigger changes in isp1763. The same is needed in other IP -from the family, including also to setup the read address -before reading from device. - -Signed-off-by: Rui Miguel Silva ---- - drivers/usb/isp1760/isp1760-hcd.c | 23 +++++++++++------------ - 1 file changed, 11 insertions(+), 12 deletions(-) - -diff --git a/drivers/usb/isp1760/isp1760-hcd.c b/drivers/usb/isp1760/isp1760-hcd.c -index fba21122bb00..79d571f1429b 100644 ---- a/drivers/usb/isp1760/isp1760-hcd.c -+++ b/drivers/usb/isp1760/isp1760-hcd.c -@@ -182,7 +182,7 @@ struct urb_listitem { - struct urb *urb; - }; - --static const u32 isp1763_hc_portsc1_fields[] = { -+static const u32 isp176x_hc_portsc1_fields[] = { - [PORT_OWNER] = BIT(13), - [PORT_POWER] = BIT(12), - [PORT_LSTATUS] = BIT(10), -@@ -205,27 +205,28 @@ static u32 isp1760_hcd_read(struct usb_hcd *hcd, u32 field) - } - - /* -- * We need, in isp1763, to write directly the values to the portsc1 -+ * We need, in isp176x, to write directly the values to the portsc1 - * register so it will make the other values to trigger. - */ - static void isp1760_hcd_portsc1_set_clear(struct isp1760_hcd *priv, u32 field, - u32 val) - { -- u32 bit = isp1763_hc_portsc1_fields[field]; -- u32 port_status = readl(priv->base + ISP1763_HC_PORTSC1); -+ u32 bit = isp176x_hc_portsc1_fields[field]; -+ u16 portsc1_reg = priv->is_isp1763 ? ISP1763_HC_PORTSC1 : -+ ISP176x_HC_PORTSC1; -+ u32 port_status = readl(priv->base + portsc1_reg); - - if (val) -- writel(port_status | bit, priv->base + ISP1763_HC_PORTSC1); -+ writel(port_status | bit, priv->base + portsc1_reg); - else -- writel(port_status & ~bit, priv->base + ISP1763_HC_PORTSC1); -+ writel(port_status & ~bit, priv->base + portsc1_reg); - } - - static void isp1760_hcd_write(struct usb_hcd *hcd, u32 field, u32 val) - { - struct isp1760_hcd *priv = hcd_to_priv(hcd); - -- if (unlikely(priv->is_isp1763 && -- (field >= PORT_OWNER && field <= PORT_CONNECT))) -+ if (unlikely((field >= PORT_OWNER && field <= PORT_CONNECT))) - return isp1760_hcd_portsc1_set_clear(priv, field, val); - - isp1760_field_write(priv->fields, field, val); -@@ -367,8 +368,7 @@ static void isp1760_mem_read(struct usb_hcd *hcd, u32 src_offset, void *dst, - { - struct isp1760_hcd *priv = hcd_to_priv(hcd); - -- isp1760_hcd_write(hcd, MEM_BANK_SEL, ISP_BANK_0); -- isp1760_hcd_write(hcd, MEM_START_ADDR, src_offset); -+ isp1760_reg_write(priv->regs, ISP176x_HC_MEMORY, src_offset); - ndelay(100); - - bank_reads8(priv->base, src_offset, ISP_BANK_0, dst, bytes); -@@ -496,8 +496,7 @@ static void isp1760_ptd_read(struct usb_hcd *hcd, u32 ptd_offset, u32 slot, - u16 src_offset = ptd_offset + slot * sizeof(*ptd); - struct isp1760_hcd *priv = hcd_to_priv(hcd); - -- isp1760_hcd_write(hcd, MEM_BANK_SEL, ISP_BANK_0); -- isp1760_hcd_write(hcd, MEM_START_ADDR, src_offset); -+ isp1760_reg_write(priv->regs, ISP176x_HC_MEMORY, src_offset); - ndelay(90); - - bank_reads8(priv->base, src_offset, ISP_BANK_0, (void *)ptd, --- -2.33.0 - diff --git a/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0035-usb-isp1760-use-the-right-irq-status-bit.patch b/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0035-usb-isp1760-use-the-right-irq-status-bit.patch deleted file mode 100644 index 8faad8f8..00000000 --- a/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0035-usb-isp1760-use-the-right-irq-status-bit.patch +++ /dev/null @@ -1,72 +0,0 @@ -Upstream-Status: Accepted [merged with kernel 5.14.9] -Signed-off-by: Arpita S.K - -From 8f238acb1dada56dc6898a6ce2551feed0e6e8c2 Mon Sep 17 00:00:00 2001 -From: Rui Miguel Silva -Date: Wed, 25 Aug 2021 00:36:55 +0100 -Subject: [PATCH 22/23] usb: isp1760: use the right irq status bit - -Instead of using the fields enum values to check interrupts -trigged, use the correct bit values. - -Signed-off-by: Rui Miguel Silva ---- - drivers/usb/isp1760/isp1760-udc.c | 12 ++++++------ - 1 file changed, 6 insertions(+), 6 deletions(-) - -diff --git a/drivers/usb/isp1760/isp1760-udc.c b/drivers/usb/isp1760/isp1760-udc.c -index a78da59d6417..5cafd23345ca 100644 ---- a/drivers/usb/isp1760/isp1760-udc.c -+++ b/drivers/usb/isp1760/isp1760-udc.c -@@ -1363,7 +1363,7 @@ static irqreturn_t isp1760_udc_irq(int irq, void *dev) - - status = isp1760_udc_irq_get_status(udc); - -- if (status & DC_IEVBUS) { -+ if (status & ISP176x_DC_IEVBUS) { - dev_dbg(udc->isp->dev, "%s(VBUS)\n", __func__); - /* The VBUS interrupt is only triggered when VBUS appears. */ - spin_lock(&udc->lock); -@@ -1371,7 +1371,7 @@ static irqreturn_t isp1760_udc_irq(int irq, void *dev) - spin_unlock(&udc->lock); - } - -- if (status & DC_IEBRST) { -+ if (status & ISP176x_DC_IEBRST) { - dev_dbg(udc->isp->dev, "%s(BRST)\n", __func__); - - isp1760_udc_reset(udc); -@@ -1391,18 +1391,18 @@ static irqreturn_t isp1760_udc_irq(int irq, void *dev) - } - } - -- if (status & DC_IEP0SETUP) { -+ if (status & ISP176x_DC_IEP0SETUP) { - dev_dbg(udc->isp->dev, "%s(EP0SETUP)\n", __func__); - - isp1760_ep0_setup(udc); - } - -- if (status & DC_IERESM) { -+ if (status & ISP176x_DC_IERESM) { - dev_dbg(udc->isp->dev, "%s(RESM)\n", __func__); - isp1760_udc_resume(udc); - } - -- if (status & DC_IESUSP) { -+ if (status & ISP176x_DC_IESUSP) { - dev_dbg(udc->isp->dev, "%s(SUSP)\n", __func__); - - spin_lock(&udc->lock); -@@ -1413,7 +1413,7 @@ static irqreturn_t isp1760_udc_irq(int irq, void *dev) - spin_unlock(&udc->lock); - } - -- if (status & DC_IEHS_STA) { -+ if (status & ISP176x_DC_IEHS_STA) { - dev_dbg(udc->isp->dev, "%s(HS_STA)\n", __func__); - udc->gadget.speed = USB_SPEED_HIGH; - } --- -2.33.0 - diff --git a/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0036-usb-isp1760-otg-control-register-access.patch b/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0036-usb-isp1760-otg-control-register-access.patch deleted file mode 100644 index e7ddc89a..00000000 --- a/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0036-usb-isp1760-otg-control-register-access.patch +++ /dev/null @@ -1,134 +0,0 @@ -Upstream-Status: Accepted [merged with kernel 5.14.9] -Signed-off-by: Arpita S.K - -From 6ccc598ff04d7f7babcbf194b5a0913119abb702 Mon Sep 17 00:00:00 2001 -From: Rui Miguel Silva -Date: Fri, 27 Aug 2021 08:22:26 +0100 -Subject: [PATCH 23/23] usb: isp1760: otg control register access - -The set/clear of the otg control values is done writing to -two different 16bit registers, however we setup the regmap -width for isp1760/61 to 32bit value bits. - -So, just access the clear register address (0x376)as the high -part of the otg control register set (0x374), and write the -values in one go to make sure they get clear/set. - -Signed-off-by: Rui Miguel Silva ---- - drivers/usb/isp1760/isp1760-core.c | 50 ++++++++++++++++-------------- - drivers/usb/isp1760/isp1760-regs.h | 16 ++++++++++ - 2 files changed, 42 insertions(+), 24 deletions(-) - -diff --git a/drivers/usb/isp1760/isp1760-core.c b/drivers/usb/isp1760/isp1760-core.c -index cb70f9d63cdd..d1d9a7d5da17 100644 ---- a/drivers/usb/isp1760/isp1760-core.c -+++ b/drivers/usb/isp1760/isp1760-core.c -@@ -30,6 +30,7 @@ static int isp1760_init_core(struct isp1760_device *isp) - { - struct isp1760_hcd *hcd = &isp->hcd; - struct isp1760_udc *udc = &isp->udc; -+ u32 otg_ctrl; - - /* Low-level chip reset */ - if (isp->rst_gpio) { -@@ -83,16 +84,17 @@ static int isp1760_init_core(struct isp1760_device *isp) - * - * TODO: Really support OTG. For now we configure port 1 in device mode - */ -- if (((isp->devflags & ISP1760_FLAG_ISP1761) || -- (isp->devflags & ISP1760_FLAG_ISP1763)) && -- (isp->devflags & ISP1760_FLAG_PERIPHERAL_EN)) { -- isp1760_field_set(hcd->fields, HW_DM_PULLDOWN); -- isp1760_field_set(hcd->fields, HW_DP_PULLDOWN); -- isp1760_field_set(hcd->fields, HW_OTG_DISABLE); -- } else { -- isp1760_field_set(hcd->fields, HW_SW_SEL_HC_DC); -- isp1760_field_set(hcd->fields, HW_VBUS_DRV); -- isp1760_field_set(hcd->fields, HW_SEL_CP_EXT); -+ if (isp->devflags & ISP1760_FLAG_ISP1761) { -+ if (isp->devflags & ISP1760_FLAG_PERIPHERAL_EN) { -+ otg_ctrl = (ISP176x_HW_DM_PULLDOWN_CLEAR | -+ ISP176x_HW_DP_PULLDOWN_CLEAR | -+ ISP176x_HW_OTG_DISABLE); -+ } else { -+ otg_ctrl = (ISP176x_HW_SW_SEL_HC_DC_CLEAR | -+ ISP176x_HW_VBUS_DRV | -+ ISP176x_HW_SEL_CP_EXT); -+ } -+ isp1760_reg_write(hcd->regs, ISP176x_HC_OTG_CTRL, otg_ctrl); - } - - dev_info(isp->dev, "%s bus width: %u, oc: %s\n", -@@ -235,20 +237,20 @@ static const struct reg_field isp1760_hc_reg_fields[] = { - [HC_ISO_IRQ_MASK_AND] = REG_FIELD(ISP176x_HC_ISO_IRQ_MASK_AND, 0, 31), - [HC_INT_IRQ_MASK_AND] = REG_FIELD(ISP176x_HC_INT_IRQ_MASK_AND, 0, 31), - [HC_ATL_IRQ_MASK_AND] = REG_FIELD(ISP176x_HC_ATL_IRQ_MASK_AND, 0, 31), -- [HW_OTG_DISABLE] = REG_FIELD(ISP176x_HC_OTG_CTRL_SET, 10, 10), -- [HW_SW_SEL_HC_DC] = REG_FIELD(ISP176x_HC_OTG_CTRL_SET, 7, 7), -- [HW_VBUS_DRV] = REG_FIELD(ISP176x_HC_OTG_CTRL_SET, 4, 4), -- [HW_SEL_CP_EXT] = REG_FIELD(ISP176x_HC_OTG_CTRL_SET, 3, 3), -- [HW_DM_PULLDOWN] = REG_FIELD(ISP176x_HC_OTG_CTRL_SET, 2, 2), -- [HW_DP_PULLDOWN] = REG_FIELD(ISP176x_HC_OTG_CTRL_SET, 1, 1), -- [HW_DP_PULLUP] = REG_FIELD(ISP176x_HC_OTG_CTRL_SET, 0, 0), -- [HW_OTG_DISABLE_CLEAR] = REG_FIELD(ISP176x_HC_OTG_CTRL_CLEAR, 10, 10), -- [HW_SW_SEL_HC_DC_CLEAR] = REG_FIELD(ISP176x_HC_OTG_CTRL_CLEAR, 7, 7), -- [HW_VBUS_DRV_CLEAR] = REG_FIELD(ISP176x_HC_OTG_CTRL_CLEAR, 4, 4), -- [HW_SEL_CP_EXT_CLEAR] = REG_FIELD(ISP176x_HC_OTG_CTRL_CLEAR, 3, 3), -- [HW_DM_PULLDOWN_CLEAR] = REG_FIELD(ISP176x_HC_OTG_CTRL_CLEAR, 2, 2), -- [HW_DP_PULLDOWN_CLEAR] = REG_FIELD(ISP176x_HC_OTG_CTRL_CLEAR, 1, 1), -- [HW_DP_PULLUP_CLEAR] = REG_FIELD(ISP176x_HC_OTG_CTRL_CLEAR, 0, 0), -+ [HW_OTG_DISABLE_CLEAR] = REG_FIELD(ISP176x_HC_OTG_CTRL, 26, 26), -+ [HW_SW_SEL_HC_DC_CLEAR] = REG_FIELD(ISP176x_HC_OTG_CTRL, 23, 23), -+ [HW_VBUS_DRV_CLEAR] = REG_FIELD(ISP176x_HC_OTG_CTRL, 20, 20), -+ [HW_SEL_CP_EXT_CLEAR] = REG_FIELD(ISP176x_HC_OTG_CTRL, 19, 19), -+ [HW_DM_PULLDOWN_CLEAR] = REG_FIELD(ISP176x_HC_OTG_CTRL, 18, 18), -+ [HW_DP_PULLDOWN_CLEAR] = REG_FIELD(ISP176x_HC_OTG_CTRL, 17, 17), -+ [HW_DP_PULLUP_CLEAR] = REG_FIELD(ISP176x_HC_OTG_CTRL, 16, 16), -+ [HW_OTG_DISABLE] = REG_FIELD(ISP176x_HC_OTG_CTRL, 10, 10), -+ [HW_SW_SEL_HC_DC] = REG_FIELD(ISP176x_HC_OTG_CTRL, 7, 7), -+ [HW_VBUS_DRV] = REG_FIELD(ISP176x_HC_OTG_CTRL, 4, 4), -+ [HW_SEL_CP_EXT] = REG_FIELD(ISP176x_HC_OTG_CTRL, 3, 3), -+ [HW_DM_PULLDOWN] = REG_FIELD(ISP176x_HC_OTG_CTRL, 2, 2), -+ [HW_DP_PULLDOWN] = REG_FIELD(ISP176x_HC_OTG_CTRL, 1, 1), -+ [HW_DP_PULLUP] = REG_FIELD(ISP176x_HC_OTG_CTRL, 0, 0), - }; - - static const struct reg_field isp1763_hc_reg_fields[] = { -diff --git a/drivers/usb/isp1760/isp1760-regs.h b/drivers/usb/isp1760/isp1760-regs.h -index 94ea60c20b2a..3a6751197e97 100644 ---- a/drivers/usb/isp1760/isp1760-regs.h -+++ b/drivers/usb/isp1760/isp1760-regs.h -@@ -61,6 +61,7 @@ - #define ISP176x_HC_INT_IRQ_MASK_AND 0x328 - #define ISP176x_HC_ATL_IRQ_MASK_AND 0x32c - -+#define ISP176x_HC_OTG_CTRL 0x374 - #define ISP176x_HC_OTG_CTRL_SET 0x374 - #define ISP176x_HC_OTG_CTRL_CLEAR 0x376 - -@@ -179,6 +180,21 @@ enum isp176x_host_controller_fields { - #define ISP176x_DC_IESUSP BIT(3) - #define ISP176x_DC_IEBRST BIT(0) - -+#define ISP176x_HW_OTG_DISABLE_CLEAR BIT(26) -+#define ISP176x_HW_SW_SEL_HC_DC_CLEAR BIT(23) -+#define ISP176x_HW_VBUS_DRV_CLEAR BIT(20) -+#define ISP176x_HW_SEL_CP_EXT_CLEAR BIT(19) -+#define ISP176x_HW_DM_PULLDOWN_CLEAR BIT(18) -+#define ISP176x_HW_DP_PULLDOWN_CLEAR BIT(17) -+#define ISP176x_HW_DP_PULLUP_CLEAR BIT(16) -+#define ISP176x_HW_OTG_DISABLE BIT(10) -+#define ISP176x_HW_SW_SEL_HC_DC BIT(7) -+#define ISP176x_HW_VBUS_DRV BIT(4) -+#define ISP176x_HW_SEL_CP_EXT BIT(3) -+#define ISP176x_HW_DM_PULLDOWN BIT(2) -+#define ISP176x_HW_DP_PULLDOWN BIT(1) -+#define ISP176x_HW_DP_PULLUP BIT(0) -+ - #define ISP176x_DC_ENDPTYP_ISOC 0x01 - #define ISP176x_DC_ENDPTYP_BULK 0x02 - #define ISP176x_DC_ENDPTYP_INTERRUPT 0x03 --- -2.33.0 - diff --git a/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0037-firmware-arm_ffa-setting-the-FFA_VERSION-compatibility-checks.patch.patch b/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0037-firmware-arm_ffa-setting-the-FFA_VERSION-compatibility-checks.patch.patch deleted file mode 100644 index f5e5b81e..00000000 --- a/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/0037-firmware-arm_ffa-setting-the-FFA_VERSION-compatibility-checks.patch.patch +++ /dev/null @@ -1,101 +0,0 @@ -Upstream-Status: Pending [Not submitted to upstream yet] -Signed-off-by: Abdellatif El Khlifi - -From 045c5da54595303c8bfec54fa5bbae10fdf9f5f5 Mon Sep 17 00:00:00 2001 -From: Abdellatif El Khlifi -Date: Wed, 25 Aug 2021 11:24:35 +0100 -Subject: [PATCH 1/3] firmware: arm_ffa: setting the FFA_VERSION compatibility - checks - -This commit aligns the FF-A versions checks according to the -FF-A specification v1.0. - -The compatibility of the version number (x.y) of the caller with -the version number (a.b) of the callee can be defined as: - - If x == a and y <= b, then the versions are compatible. - Otherwise, versions are incompatible. - -Signed-off-by: Abdellatif El Khlifi ---- - drivers/firmware/arm_ffa/driver.c | 41 ++++++++++++++++++++++--------- - 1 file changed, 30 insertions(+), 11 deletions(-) - -diff --git a/drivers/firmware/arm_ffa/driver.c b/drivers/firmware/arm_ffa/driver.c -index c9fb56afbcb4..0044c928d9f2 100644 ---- a/drivers/firmware/arm_ffa/driver.c -+++ b/drivers/firmware/arm_ffa/driver.c -@@ -105,13 +105,14 @@ - - #define MAJOR_VERSION_MASK GENMASK(30, 16) - #define MINOR_VERSION_MASK GENMASK(15, 0) --#define MAJOR_VERSION(x) ((u16)(FIELD_GET(MAJOR_VERSION_MASK, (x)))) --#define MINOR_VERSION(x) ((u16)(FIELD_GET(MINOR_VERSION_MASK, (x)))) -+#define GET_FFA_MAJOR_VERSION(x) ((u16)(FIELD_GET(MAJOR_VERSION_MASK, (x)))) -+#define GET_FFA_MINOR_VERSION(x) ((u16)(FIELD_GET(MINOR_VERSION_MASK, (x)))) - #define PACK_VERSION_INFO(major, minor) \ - (FIELD_PREP(MAJOR_VERSION_MASK, (major)) | \ - FIELD_PREP(MINOR_VERSION_MASK, (minor))) --#define FFA_VERSION_1_0 PACK_VERSION_INFO(1, 0) --#define FFA_MIN_VERSION FFA_VERSION_1_0 -+#define FFA_MAJOR_VERSION (1) -+#define FFA_MINOR_VERSION (0) -+#define FFA_VERSION_1_0 PACK_VERSION_INFO(FFA_MAJOR_VERSION, FFA_MINOR_VERSION) - - #define SENDER_ID_MASK GENMASK(31, 16) - #define RECEIVER_ID_MASK GENMASK(15, 0) -@@ -170,26 +171,44 @@ static struct ffa_drv_info *drv_info; - static int ffa_version_check(u32 *version) - { - ffa_value_t ver; -+ u16 major, minor; - - invoke_ffa_fn((ffa_value_t){ - .a0 = FFA_VERSION, .a1 = FFA_DRIVER_VERSION, - }, &ver); - -+ - if (ver.a0 == FFA_RET_NOT_SUPPORTED) { -- pr_info("FFA_VERSION returned not supported\n"); -+ pr_err("A Firmware Framework implementation does not exist\n"); - return -EOPNOTSUPP; - } - -- if (ver.a0 < FFA_MIN_VERSION || ver.a0 > FFA_DRIVER_VERSION) { -- pr_err("Incompatible version %d.%d found\n", -- MAJOR_VERSION(ver.a0), MINOR_VERSION(ver.a0)); -- return -EINVAL; -+ major = GET_FFA_MAJOR_VERSION(ver.a0); -+ minor = GET_FFA_MINOR_VERSION(ver.a0); -+ -+ if ((major != FFA_MAJOR_VERSION) || (minor < FFA_MINOR_VERSION)) { -+ pr_err("Versions are incompatible\n" -+ "FF-A driver version: %d.%d\n" -+ "FF-A framework version: %d.%d\n", -+ FFA_MAJOR_VERSION, -+ FFA_MINOR_VERSION, -+ major, -+ minor); -+ return -EPROTONOSUPPORT; - } - -+ pr_info("Versions are compatible\n" -+ "FF-A driver version: %d.%d\n" -+ "FF-A framework version: %d.%d\n", -+ FFA_MAJOR_VERSION, -+ FFA_MINOR_VERSION, -+ major, -+ minor); -+ - *version = ver.a0; -- pr_info("Version %d.%d found\n", MAJOR_VERSION(ver.a0), -- MINOR_VERSION(ver.a0)); -+ - return 0; -+ - } - - static int ffa_rx_release(void) --- -2.17.1 - diff --git a/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/defconfig b/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/defconfig index c402ca23..5f0a7e91 100644 --- a/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/defconfig +++ b/meta-arm-bsp/recipes-kernel/linux/files/corstone1000/defconfig @@ -37,7 +37,6 @@ CONFIG_NETDEVICES=y # CONFIG_NET_VENDOR_AMD is not set # CONFIG_NET_VENDOR_AQUANTIA is not set # CONFIG_NET_VENDOR_ARC is not set -# CONFIG_NET_VENDOR_AURORA is not set # CONFIG_NET_VENDOR_BROADCOM is not set # CONFIG_NET_VENDOR_CADENCE is not set # CONFIG_NET_VENDOR_CAVIUM is not set diff --git a/meta-arm-bsp/recipes-kernel/linux/linux-arm-platforms.inc b/meta-arm-bsp/recipes-kernel/linux/linux-arm-platforms.inc index c68060af..2ea47bc3 100644 --- a/meta-arm-bsp/recipes-kernel/linux/linux-arm-platforms.inc +++ b/meta-arm-bsp/recipes-kernel/linux/linux-arm-platforms.inc @@ -39,43 +39,7 @@ LINUX_KERNEL_TYPE:corstone1000 = "standard" #disabling the rootfs cpio file compression so it is not compressed twice when bundled with the kernel KERNEL_EXTRA_ARGS:corstone1000 += "CONFIG_INITRAMFS_COMPRESSION_NONE=y" SRC_URI:append:corstone1000 = " \ - file://0001-usb-isp1760-fix-strict-typechecking.patch \ - file://0002-usb-isp1760-move-to-regmap-for-register-access.patch \ - file://0003-usb-isp1760-use-relaxed-primitives.patch \ - file://0004-usb-isp1760-remove-platform-data-struct-and-code.patch \ - file://0005-usb-isp1760-hcd-refactor-mempool-config-and-setup.patch \ - file://0006-usb-isp1760-use-dr_mode-binding.patch \ - file://0007-usb-isp1760-add-support-for-isp1763.patch \ - file://0008-dt-bindings-usb-nxp-isp1760-add-bindings.patch \ - file://0009-usb-isp1763-add-peripheral-mode.patch \ - file://0010-firmware-smccc-Add-SMCCC-TRNG-function-call-IDs.patch \ - file://0011-firmware-smccc-Introduce-SMCCC-TRNG-framework.patch \ - file://0012-arm64-smccc-Add-support-for-SMCCCv1.2-extended-input-output-registers.patch \ - file://0013-firmware-arm_ffa-Add-initial-FFA-bus-support-for-device-enumeration.patch \ - file://0014-firmware-arm_ffa-Add-initial-Arm-FFA-driver-support.patch \ - file://0015-firmware-arm_ffa-Add-support-for-SMCCC-as-transport-to-ffa-driver.patch \ - file://0016-firmware-arm_ffa-Setup-in-kernel-users-of-FFA-partitions.patch \ - file://0017-firmware-arm_ffa-Add-support-for-MEM_-interfaces.patch \ - file://0018-firmware-arm_ffa-Ensure-drivers-provide-a-probe-function.patch \ - file://0019-firmware-arm_ffa-Simplify-probe-function.patch \ - file://0020-firmware-arm_ffa-Fix-the-comment-style.patch \ - file://0021-firmware-arm_ffa-Fix-a-possible-ffa_linux_errmap-buffer-overflow.patch \ - file://0022-usb-isp1760-isp1760-udc-Provide-missing-description-.patch \ - file://0023-usb-isp1760-Fix-meaningless-check-in-isp1763_run.patch \ - file://0024-usb-isp1760-remove-debug-message-as-error.patch \ - file://0025-usb-isp1760-do-not-sleep-in-field-register-poll.patch \ - file://0026-usb-isp1760-rework-cache-initialization-error-handli.patch \ - file://0027-usb-isp1760-ignore-return-value-for-bus-change-patte.patch \ - file://0028-usb-isp1760-check-maxpacketsize-before-using-it.patch \ - file://0029-usb-isp1760-do-not-reset-retval.patch \ - file://0030-usb-isp1760-do-not-shift-in-uninitialized-slot.patch \ - file://0031-usb-isp1760-clean-never-read-udc_enabled-warning.patch \ - file://0032-usb-isp1760-fix-memory-pool-initialization.patch \ - file://0033-usb-isp1760-fix-qtd-fill-length.patch \ - file://0034-usb-isp1760-write-to-status-and-address-register.patch \ - file://0035-usb-isp1760-use-the-right-irq-status-bit.patch \ - file://0036-usb-isp1760-otg-control-register-access.patch \ - file://0037-firmware-arm_ffa-setting-the-FFA_VERSION-compatibility-checks.patch.patch \ + file://0001-arm64-Correct-wrong-label-in-macro-__init_el2_gicv3.patch \ file://defconfig \ " From patchwork Tue Mar 1 10:16:09 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Emekcan Aras X-Patchwork-Id: 4501 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id A17BAC433FE for ; Tue, 1 Mar 2022 10:16:25 +0000 (UTC) Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by mx.groups.io with SMTP id smtpd.web08.6561.1646129785043261810 for ; Tue, 01 Mar 2022 02:16:25 -0800 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: arm.com, ip: 217.140.110.172, mailfrom: emekcan.aras@arm.com) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 18317ED1; Tue, 1 Mar 2022 02:16:24 -0800 (PST) Received: from e126835.arm.com (unknown [10.57.20.159]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 59D773F73D; Tue, 1 Mar 2022 02:16:23 -0800 (PST) From: emekcan.aras@arm.com To: meta-arm@lists.yoctoproject.org, ross.burton@arm.com Cc: nd@arm.com, Emekcan Aras Subject: [PATCH 2/2] arm-bsp/trusted-firmware-a: corstone1000: update Tfa SHA Date: Tue, 1 Mar 2022 10:16:09 +0000 Message-Id: <20220301101609.40783-3-emekcan.aras@arm.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220301101609.40783-1-emekcan.aras@arm.com> References: <20220301101609.40783-1-emekcan.aras@arm.com> MIME-Version: 1.0 List-Id: X-Webhook-Received: from li982-79.members.linode.com [45.33.32.79] by aws-us-west-2-korg-lkml-1.web.codeaurora.org with HTTPS for ; Tue, 01 Mar 2022 10:16:25 -0000 X-Groupsio-URL: https://lists.yoctoproject.org/g/meta-arm/message/3080 From: Emekcan Aras This commit updates Tfa SHA to remove the patches from the recipe since all of them are upstreamed now. Signed-off-by: Emekcan Aras emekcan.aras@arm.com --- .../trusted-firmware-a-corstone1000.inc | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/meta-arm-bsp/recipes-bsp/trusted-firmware-a/trusted-firmware-a-corstone1000.inc b/meta-arm-bsp/recipes-bsp/trusted-firmware-a/trusted-firmware-a-corstone1000.inc index 2646259f..e59d31a7 100644 --- a/meta-arm-bsp/recipes-bsp/trusted-firmware-a/trusted-firmware-a-corstone1000.inc +++ b/meta-arm-bsp/recipes-bsp/trusted-firmware-a/trusted-firmware-a-corstone1000.inc @@ -3,13 +3,12 @@ COMPATIBLE_MACHINE = "(corstone1000)" FILESEXTRAPATHS:prepend := "${THISDIR}/files/corstone1000:" -SRC_URI:append = " \ - file://0001-Rename-Diphda-to-corstone1000.patch \ - file://0002-plat-arm-corstone1000-made-changes-to-accommodate-3M.patch \ - file://0003-corstone1000-implement-platform-specific-psci-reset.patch \ - file://0004-plat-arm-corstone1000-change-base-address-of-FIP-in-the-fl.patch \ - file://0005-plat-arm-corstone1000-identify-which-bank-to-load-fip-from.patch \ - " +SRCREV_tfa = "cf89fd57ed3286d7842eef41cd72a3977eb6d317" +PV = "2.6+git${SRCPV}" + +SRC_URI:remove = " \ + file://ssl.patch \ + " TFA_DEBUG = "1" TFA_UBOOT = "1"