From patchwork Tue Aug 4 17:48:37 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anson Huang X-Patchwork-Id: 6936031 Return-Path: X-Original-To: patchwork-linux-arm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 751509F373 for ; Tue, 4 Aug 2015 10:00:11 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 636DF20429 for ; Tue, 4 Aug 2015 10:00:10 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) (using TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 9CC362041E for ; Tue, 4 Aug 2015 10:00:04 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1ZMYz9-00009I-SG; Tue, 04 Aug 2015 09:58:15 +0000 Received: from mail-bn1bon0132.outbound.protection.outlook.com ([157.56.111.132] helo=na01-bn1-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1ZMYyl-0008GD-Vw for linux-arm-kernel@lists.infradead.org; Tue, 04 Aug 2015 09:57:54 +0000 Received: from CO2PR03CA0013.namprd03.prod.outlook.com (10.141.194.140) by BLUPR03MB487.namprd03.prod.outlook.com (10.141.79.27) with Microsoft SMTP Server (TLS) id 15.1.231.11; Tue, 4 Aug 2015 09:57:30 +0000 Received: from BN1AFFO11FD013.protection.gbl (2a01:111:f400:7c10::141) by CO2PR03CA0013.outlook.office365.com (2a01:111:e400:1414::12) with Microsoft SMTP Server (TLS) id 15.1.225.19 via Frontend Transport; Tue, 4 Aug 2015 09:57:29 +0000 Authentication-Results: spf=fail (sender IP is 192.88.168.50) smtp.mailfrom=freescale.com; pengutronix.de; dkim=none (message not signed) header.d=none; Received-SPF: Fail (protection.outlook.com: domain of freescale.com does not designate 192.88.168.50 as permitted sender) receiver=protection.outlook.com; client-ip=192.88.168.50; helo=tx30smr01.am.freescale.net; Received: from tx30smr01.am.freescale.net (192.88.168.50) by BN1AFFO11FD013.mail.protection.outlook.com (10.58.52.73) with Microsoft SMTP Server (TLS) id 15.1.243.9 via Frontend Transport; Tue, 4 Aug 2015 09:57:28 +0000 Received: from anson-OptiPlex-790.ap.freescale.net (anson-OptiPlex-790.ap.freescale.net [10.192.242.118]) by tx30smr01.am.freescale.net (8.14.3/8.14.0) with ESMTP id t749vKHp020803; Tue, 4 Aug 2015 02:57:26 -0700 From: Anson Huang To: , Subject: [PATCH 3/3] ARM: imx: add suspend/resume support for i.mx6ul Date: Wed, 5 Aug 2015 01:48:37 +0800 Message-ID: <1438710517-6515-3-git-send-email-b20788@freescale.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1438710517-6515-1-git-send-email-b20788@freescale.com> References: <1438710517-6515-1-git-send-email-b20788@freescale.com> X-EOPAttributedMessage: 0 X-Microsoft-Exchange-Diagnostics: 1; BN1AFFO11FD013; 1:MT1gvj6x0qTn+J9J55+WiaRZ+iqcPGsNswtD2pfwLxGazOuOjJzIiEn9JIRzpa+YgYuzr9ow8P65gqrGA2dYQEpPcVy9u74bXHeUewTg4zz+VvAiVZUFH8LuFlPoLTaAOBaZ5/xy/MdWizihCswR0A6s7acVW4opACAKbLWYkIImtHyONTeRdpnhwJq6ydvRSeDqUPAGlUV6ZWGmASh912eWn+nGgQMzTsUuZRpUrIexvdQKdLKiy97y7g0oDD8tAmKMU13LvHeTPOcOJ2qJdiRBgtDYbBoOdueIKIssNF+C5MlcyIbUNzbqvw+uiDOa X-Forefront-Antispam-Report: CIP:192.88.168.50; CTRY:US; IPV:NLI; EFV:NLI; SFV:NSPM; SFS:(10019020)(6009001)(2980300002)(339900001)(199003)(189002)(189998001)(47776003)(229853001)(5001770100001)(77096005)(19580395003)(6806004)(33646002)(19580405001)(77156002)(575784001)(50226001)(50466002)(62966003)(48376002)(92566002)(2950100001)(87936001)(85426001)(5001960100002)(97736004)(5001830100001)(46102003)(76176999)(104016003)(4001540100001)(68736005)(50986999)(106466001)(81156007)(105606002)(36756003)(64706001)(5001860100001)(5003940100001)(42262002); DIR:OUT; SFP:1102; SCL:1; SRVR:BLUPR03MB487; H:tx30smr01.am.freescale.net; FPR:; SPF:Fail; PTR:InfoDomainNonexistent; A:1; MX:1; LANG:en; MIME-Version: 1.0 X-Microsoft-Exchange-Diagnostics: 1; BLUPR03MB487; 2:q5g+jyPjCdB6zP8nEgJeAFmjm8+Fjo0qxg2rW6eVbew9a8ncuG9Oyg/z8WeKAdDQyDfDS1QEFTvd72128SAaTmf462tWmEMH1gYffjPqR0BJm693xJqAddSa2VpVqzgF8DqyUpcHF5QN5ktjJPsJYDQ7qyeKFAIMNgeOryrDHyE=; 3:6qHkPB33d+zrqgvkaYupN3LuNcdCWkaP5RWjouOIVkvC72SjG5K60UBKAhf3CK67Ieix6JJLPb/i3D22Aqe2f/bgvaagvnFfeS2OSNifeksz8LjDH+vn5f8rEEIeVMxSmicBpXIGSAAZgcDT8y526D8hCz+GTPcNIwmF+eOvgjNiAsyTe5pfI0o89JUvXYvJp4tnfFt135BXBJEcYGCEWLhDoxeErO0H/vr9vFI0sCA=; 25:F+52vPJx+rP6n8hv6FIj4g7VVvaBDYS+cJaT9xYYwVuvcPF9csHPakYbjMlVFX8yk3k06rZuyJIsHkIQZSLkty1YLaZxOCrTZ9Z1QT6wDjjopLlkOLsAqf3AOYCpdz+9UfbVp6iBFrg65Y9dKB/zuIzQVxEU5/q2Ne1B815RzKe2gpJXo+kpZu9AEXfsZzaXrwIyP8M1h+4ld5tJbwQLnpJTM7duTtKU/9aTyrrsGxZVLVi2Czn3PyXEhs95UtGPgxLsmYawnBCN5VDppvyzsA== X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:BLUPR03MB487; X-Microsoft-Exchange-Diagnostics: 1; BLUPR03MB487; 20:oDDrwiGPMtQGhpHfTHKnZuU+uYURNWavlDHS7Mlr5SgBL9hHi5lNVAHz4zt/9pIy/rXFjzFFhEFQsz3qQfmn2ydEUZDck4IG7iFh01js1tVR2Z4wDDkstkXkNFU76bcL/4ROJjX08tIeDa4S5bcKIBPZlD8JduyO/NQhazZZcnKEDhKdSOpAiDKDWPAsAWTAPzVfexw/8/7Dg2qeJy1QFtCP8CybQJWI40S9Vd3GMDkrMDdu6SM2iGnJzzdQIDijwb8OoHxjDBYcZS1Xj0vFDWYvqcrSijxs+v+F3NA2r5joO2jsBksIp/MYRTmsFyev21ZFCLL9aascuKeFyG8BThOyayAlTcqOqlr/RHtD9K8=; 4:qgCsW0QieFqYHzFsBxAGO1DmcYmM2yVceTpWAgvQds8hmYNWyFV5bwUC+tQop7KH5yA7TPYXKQU9eF4Pk0ixI+s5iSENptQx7nEvZ/HwDsOomuczptkMn44jxXaYEZ/e8E7L9kwPnFNbztvqEqCiV8Es5MolCtdAxANgGQiScQ1bax3SOp9lMXKSfN1WsEuiapKKM4TTbGBy3AKOU1f9owHNBOF0c3xEcUmy9hVDc2B2NSwFuzPUoy+O/dTML5HF+IJm2JMuPiPtZhoshCB6yUwb2TsRpudj5ZlDqbateUc= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(601004)(5005006)(3002001); SRVR:BLUPR03MB487; BCL:0; PCL:0; RULEID:; SRVR:BLUPR03MB487; X-Forefront-PRVS: 0658BAF71F X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; BLUPR03MB487; 23:WFAn40WfpkeEkgCKRIdgZIsG0tVAHPpi2F9FAOz0h1?= =?us-ascii?Q?5Afz/+Pj+YdO6KgV2gxDc1xb1j7B6IciB503SUrQ6x+B9Pxqbfewgfgb7M44?= =?us-ascii?Q?/xTBKx3IA05UuZuJrRhpXUH/0w/vee9f9xBOXOHUPEvBbP3a1wS6MxDBh6N+?= =?us-ascii?Q?iwhqJOK1W4UQ1bSZAiXcelzzQkeINvgKIs73HTZQDSs1GJnYPqZcwEd25Noo?= =?us-ascii?Q?neI1zw30fgsCSLexLQh+NDBLBI4aXtzJZ+5osFm0S6HZDfmay5DKMndka+r2?= =?us-ascii?Q?1pIJIXFw7Bx3LtsPM3R5NpWVxpb0gACpw6ZVO4GM1tI2ORfyrwpznR3gU3tD?= =?us-ascii?Q?Y9dRDe4NVnx5MG/mAXExNXCa7becJLGy8tdEKWQPTr+NxbpI/zwC16RDXkUN?= =?us-ascii?Q?EgX2Llc8N0KgXZdaC8ZrJJ/vlQYaRHzNsxhfub55bPd9L2dMB14Zj6xNyKuF?= =?us-ascii?Q?S+GrRULhEy+6amTd97UK2+ZhDwzbnP7Lu8DbWR5gbCC0BKkl5s2fBZiwRtt4?= =?us-ascii?Q?JijT6gcm/+E2yoXH4hzdbYxlQXHF6oLorwrd7YHjR7WIlccg5Aw8rnYne48z?= =?us-ascii?Q?SN9z6rDBUbuOzXp6Mr7Q93B430obTPQLKxz85nyvXR1IOc5US5Iwr4SjRUxU?= =?us-ascii?Q?xPrwt3us6IvvgwPEXFWjSUjpVfNolmCGdoeryKbz15WAISiwa9BhGlMb8Nen?= =?us-ascii?Q?pa2T4oLelGsHvOh3IShg10T/RTXyeK+S4q3AZpK0Mm4MSZsyZgtXL/HZRlne?= =?us-ascii?Q?2QbZzoybsN1fhY5eLq9mUm45a1Q3qSOf+BdILNGTYHmoRv91flfQxodS3ODW?= =?us-ascii?Q?B/9vgKirHRXTwLS/3wI6gtoZGEG/tFGu4rDGSHeq2eaQtzqEL5X1rzobdIrU?= =?us-ascii?Q?G9h1C03EZfDdbKTHDrLaBdN0YAvHGkPM6JgkDpaXEagsvJ1cCw36s+R9U78K?= =?us-ascii?Q?g+4bYu9Uu7EKuSwX08p6OfgJUfDXhX5hgC5a0UrVzjrYf2HP+Y5snRKIKSky?= =?us-ascii?Q?dFsZFlTz2k/8hPenR3JsbewjqM/gHlGSyyIQt0Vp//oxJ7xRyWAUl8bSWSzg?= =?us-ascii?Q?guO21zqzK/z4TO53OdGl0QtgsEhaGtQhRkzUKjwcz3rFYbl8YyF/qicvRybK?= =?us-ascii?Q?sj7GZZTmM=3D?= X-Microsoft-Exchange-Diagnostics: 1; BLUPR03MB487; 5:gd6bQdPZ0Kx2CXyAL6kd8yO9aQ+E8Vpoj+MMcbClxfGSWk25B/MIPNBarDpxYFX7nuMlq2IdFGmHsQrW/vA1tMtFdrphgOjEew32Q4aAHNAZFKfZwE4/3UVCNjO8vLONgs5nLAhyo9D8ymZEWjUVCQ==; 24:mefrkNpua4SGcca8tBGPdaj8HI6rplo5A4w4sfakSXtkfE5nqcpyGZpgOJAOYMFOMzkQ2x5Uc4t98GJ0hZw7UduC5eMhIKIWLaLa296H6HI=; 20:GWHi1VKdapTxejED8OqtagDMiSWYQaUHSqQLCyUz2axmpYPOF5F7k/ohs2SyFeLXCIItgUFsyCyZ99QIviHc3A== X-OriginatorOrg: freescale.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 04 Aug 2015 09:57:28.7804 (UTC) X-MS-Exchange-CrossTenant-Id: 710a03f5-10f6-4d38-9ff4-a80b81da590d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=710a03f5-10f6-4d38-9ff4-a80b81da590d; Ip=[192.88.168.50]; Helo=[tx30smr01.am.freescale.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BLUPR03MB487 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20150804_025752_413940_196D7B8F X-CRM114-Status: GOOD ( 24.16 ) X-Spam-Score: 0.0 (/) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: shawnguo@kernel.org, kernel@pengutronix.de Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Spam-Status: No, score=-2.4 required=5.0 tests=BAD_ENC_HEADER,BAYES_00, DATE_IN_FUTURE_06_12, RCVD_IN_DNSWL_MED, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP This patch adds suspend function for i.MX6UL, it supports "standby" and "mem" mode, for "standby" mode, SoC will enter STOP mode only, while for "mem" mode, SoC will enter STOP mode and DDR IO will be set to low power mode. As i.MX6UL contains a "Cortex-A7" ARM core which has no PL310, so we need to avoid any PL310 operations during suspend/resume, also, we need to flush Cortex-A7's inernal L2 cache before suspend. Signed-off-by: Anson Huang --- arch/arm/mach-imx/common.h | 1 + arch/arm/mach-imx/mach-imx6ul.c | 2 ++ arch/arm/mach-imx/pm-imx6.c | 46 ++++++++++++++++++++++++++++++++++------ arch/arm/mach-imx/suspend-imx6.S | 3 +++ 4 files changed, 46 insertions(+), 6 deletions(-) diff --git a/arch/arm/mach-imx/common.h b/arch/arm/mach-imx/common.h index 21e4e86..e2d5383 100644 --- a/arch/arm/mach-imx/common.h +++ b/arch/arm/mach-imx/common.h @@ -131,6 +131,7 @@ void imx6q_pm_init(void); void imx6dl_pm_init(void); void imx6sl_pm_init(void); void imx6sx_pm_init(void); +void imx6ul_pm_init(void); #ifdef CONFIG_PM void imx51_pm_init(void); diff --git a/arch/arm/mach-imx/mach-imx6ul.c b/arch/arm/mach-imx/mach-imx6ul.c index f206506..f78c107 100644 --- a/arch/arm/mach-imx/mach-imx6ul.c +++ b/arch/arm/mach-imx/mach-imx6ul.c @@ -22,6 +22,7 @@ static void __init imx6ul_init_machine(void) of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); imx_anatop_init(); + imx6ul_pm_init(); } static void __init imx6ul_init_irq(void) @@ -29,6 +30,7 @@ static void __init imx6ul_init_irq(void) imx_init_revision_from_anatop(); imx_src_init(); irqchip_init(); + imx6_pm_ccm_init("fsl,imx6ul-ccm"); } static const char *imx6ul_dt_compat[] __initconst = { diff --git a/arch/arm/mach-imx/pm-imx6.c b/arch/arm/mach-imx/pm-imx6.c index 8ff8fc0..4470376 100644 --- a/arch/arm/mach-imx/pm-imx6.c +++ b/arch/arm/mach-imx/pm-imx6.c @@ -93,6 +93,7 @@ struct imx6_pm_socdata { const char *src_compat; const char *iomuxc_compat; const char *gpc_compat; + const char *pl310_compat; const u32 mmdc_io_num; const u32 *mmdc_io_offset; }; @@ -137,11 +138,19 @@ static const u32 imx6sx_mmdc_io_offset[] __initconst = { 0x330, 0x334, 0x338, 0x33c, /* SDQS0 ~ SDQS3 */ }; +static const u32 imx6ul_mmdc_io_offset[] __initconst = { + 0x244, 0x248, 0x24c, 0x250, /* DQM0, DQM1, RAS, CAS */ + 0x27c, 0x498, 0x4a4, 0x490, /* SDCLK0, GPR_B0DS-B1DS, GPR_ADDS */ + 0x280, 0x284, 0x260, 0x264, /* SDQS0~1, SODT0, SODT1 */ + 0x494, 0x4b0, /* MODE_CTL, MODE, */ +}; + static const struct imx6_pm_socdata imx6q_pm_data __initconst = { .mmdc_compat = "fsl,imx6q-mmdc", .src_compat = "fsl,imx6q-src", .iomuxc_compat = "fsl,imx6q-iomuxc", .gpc_compat = "fsl,imx6q-gpc", + .pl310_compat = "arm,pl310-cache", .mmdc_io_num = ARRAY_SIZE(imx6q_mmdc_io_offset), .mmdc_io_offset = imx6q_mmdc_io_offset, }; @@ -151,6 +160,7 @@ static const struct imx6_pm_socdata imx6dl_pm_data __initconst = { .src_compat = "fsl,imx6q-src", .iomuxc_compat = "fsl,imx6dl-iomuxc", .gpc_compat = "fsl,imx6q-gpc", + .pl310_compat = "arm,pl310-cache", .mmdc_io_num = ARRAY_SIZE(imx6dl_mmdc_io_offset), .mmdc_io_offset = imx6dl_mmdc_io_offset, }; @@ -160,6 +170,7 @@ static const struct imx6_pm_socdata imx6sl_pm_data __initconst = { .src_compat = "fsl,imx6sl-src", .iomuxc_compat = "fsl,imx6sl-iomuxc", .gpc_compat = "fsl,imx6sl-gpc", + .pl310_compat = "arm,pl310-cache", .mmdc_io_num = ARRAY_SIZE(imx6sl_mmdc_io_offset), .mmdc_io_offset = imx6sl_mmdc_io_offset, }; @@ -169,10 +180,21 @@ static const struct imx6_pm_socdata imx6sx_pm_data __initconst = { .src_compat = "fsl,imx6sx-src", .iomuxc_compat = "fsl,imx6sx-iomuxc", .gpc_compat = "fsl,imx6sx-gpc", + .pl310_compat = "arm,pl310-cache", .mmdc_io_num = ARRAY_SIZE(imx6sx_mmdc_io_offset), .mmdc_io_offset = imx6sx_mmdc_io_offset, }; +static const struct imx6_pm_socdata imx6ul_pm_data __initconst = { + .mmdc_compat = "fsl,imx6ul-mmdc", + .src_compat = "fsl,imx6ul-src", + .iomuxc_compat = "fsl,imx6ul-iomuxc", + .gpc_compat = "fsl,imx6ul-gpc", + .pl310_compat = NULL, + .mmdc_io_num = ARRAY_SIZE(imx6ul_mmdc_io_offset), + .mmdc_io_offset = imx6ul_mmdc_io_offset, +}; + /* * This structure is for passing necessary data for low level ocram * suspend code(arch/arm/mach-imx/suspend-imx6.S), if this struct @@ -290,7 +312,7 @@ int imx6_set_lpm(enum mxc_cpu_pwr_mode mode) val |= BM_CLPCR_SBYOS; if (cpu_is_imx6sl()) val |= BM_CLPCR_BYPASS_PMIC_READY; - if (cpu_is_imx6sl() || cpu_is_imx6sx()) + if (cpu_is_imx6sl() || cpu_is_imx6sx() || cpu_is_imx6ul()) val |= BM_CLPCR_BYP_MMDC_CH0_LPM_HS; else val |= BM_CLPCR_BYP_MMDC_CH1_LPM_HS; @@ -330,6 +352,10 @@ static int imx6q_suspend_finish(unsigned long val) * as we need to float DDR IO. */ local_flush_tlb_all(); + /* check if need to flush internal L2 cache */ + if (!((struct imx6_cpu_pm_info *) + suspend_ocram_base)->l2_base.vbase) + flush_cache_all(); imx6_suspend_in_ocram_fn(suspend_ocram_base); } @@ -470,6 +496,7 @@ static int __init imx6q_suspend_init(const struct imx6_pm_socdata *socdata) suspend_ocram_base = __arm_ioremap_exec(ocram_pbase, MX6Q_SUSPEND_OCRAM_SIZE, false); + memset(suspend_ocram_base, 0, sizeof(*pm_info)); pm_info = suspend_ocram_base; pm_info->pbase = ocram_pbase; pm_info->resume_addr = virt_to_phys(v7_cpu_resume); @@ -505,11 +532,13 @@ static int __init imx6q_suspend_init(const struct imx6_pm_socdata *socdata) goto gpc_map_failed; } - ret = imx6_pm_get_base(&pm_info->l2_base, "arm,pl310-cache"); - if (ret) { - pr_warn("%s: failed to get pl310-cache base %d!\n", - __func__, ret); - goto pl310_cache_map_failed; + if (socdata->pl310_compat) { + ret = imx6_pm_get_base(&pm_info->l2_base, socdata->pl310_compat); + if (ret) { + pr_warn("%s: failed to get pl310-cache base %d!\n", + __func__, ret); + goto pl310_cache_map_failed; + } } pm_info->ddr_type = imx_mmdc_get_ddr_type(); @@ -610,3 +639,8 @@ void __init imx6sx_pm_init(void) { imx6_pm_common_init(&imx6sx_pm_data); } + +void __init imx6ul_pm_init(void) +{ + imx6_pm_common_init(&imx6ul_pm_data); +} diff --git a/arch/arm/mach-imx/suspend-imx6.S b/arch/arm/mach-imx/suspend-imx6.S index b99987b..76ee2ce 100644 --- a/arch/arm/mach-imx/suspend-imx6.S +++ b/arch/arm/mach-imx/suspend-imx6.S @@ -79,12 +79,15 @@ /* sync L2 cache to drain L2's buffers to DRAM. */ #ifdef CONFIG_CACHE_L2X0 ldr r11, [r0, #PM_INFO_MX6Q_L2_V_OFFSET] + teq r11, #0 + beq 6f mov r6, #0x0 str r6, [r11, #L2X0_CACHE_SYNC] 1: ldr r6, [r11, #L2X0_CACHE_SYNC] ands r6, r6, #0x1 bne 1b +6: #endif .endm