From patchwork Tue Sep 29 02:09:19 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zhao Qiang X-Patchwork-Id: 523688 X-Patchwork-Delegate: scottwood@freescale.com Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 662D614016A for ; Tue, 29 Sep 2015 12:20:45 +1000 (AEST) Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 48A6F1A2C95 for ; Tue, 29 Sep 2015 12:20:45 +1000 (AEST) X-Original-To: linuxppc-dev@lists.ozlabs.org Delivered-To: linuxppc-dev@lists.ozlabs.org Received: from na01-bl2-obe.outbound.protection.outlook.com (mail-bl2on0130.outbound.protection.outlook.com [65.55.169.130]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 6CE171A04ED for ; Tue, 29 Sep 2015 12:15:56 +1000 (AEST) Received: from BY2PR03CA068.namprd03.prod.outlook.com (10.141.249.41) by SN1PR0301MB1551.namprd03.prod.outlook.com (10.162.129.157) with Microsoft SMTP Server (TLS) id 15.1.280.20; Tue, 29 Sep 2015 02:15:48 +0000 Received: from BN1BFFO11FD028.protection.gbl (2a01:111:f400:7c10::1:197) by BY2PR03CA068.outlook.office365.com (2a01:111:e400:2c5d::41) with Microsoft SMTP Server (TLS) id 15.1.280.20 via Frontend Transport; Tue, 29 Sep 2015 02:15:47 +0000 Authentication-Results: spf=fail (sender IP is 192.88.168.50) smtp.mailfrom=freescale.com; freescale.mail.onmicrosoft.com; dkim=none (message not signed) header.d=none; freescale.mail.onmicrosoft.com; dmarc=none action=none header.from=freescale.com; 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 BN1BFFO11FD028.mail.protection.outlook.com (10.58.144.91) with Microsoft SMTP Server (TLS) id 15.1.274.4 via Frontend Transport; Tue, 29 Sep 2015 02:15:47 +0000 Received: from titan.ap.freescale.net ([10.192.208.233]) by tx30smr01.am.freescale.net (8.14.3/8.14.0) with ESMTP id t8T2FQO5025205; Mon, 28 Sep 2015 19:15:43 -0700 From: Zhao Qiang To: Subject: [PATCH v11 4/6] QE/CPM: move muram management functions to qe_common Date: Tue, 29 Sep 2015 10:09:19 +0800 Message-ID: <1443492561-11538-4-git-send-email-qiang.zhao@freescale.com> X-Mailer: git-send-email 2.1.0.27.g96db324 In-Reply-To: <1443492561-11538-1-git-send-email-qiang.zhao@freescale.com> References: <1443492561-11538-1-git-send-email-qiang.zhao@freescale.com> X-EOPAttributedMessage: 0 X-Microsoft-Exchange-Diagnostics: 1; BN1BFFO11FD028; 1:q6mOGl9vR7T8BlvuzqNid/B0zEUGUEvgjWchfNv67QH2PsnnDvXowbG4KX7ec53sep1pm+qmvFZwTM5CQ77vlxdcFty56p0G6Tg3/KMCAG4IvczJU9LUDCESNf9HAJ5MelNorV7umKXBQmc/YDcDDZhAdoH9or8vOqvS1/tDSix6E2lnjc7D7RG/mGo4Q/Kc26JzL9sDD+Ya88eTOVsprCz448CcPFUFWfPgw5BYP3kSEAsquzfRcexrrhui7nIEpL6BDZJBfhdOCRYsklPBnepGu+HK+QdTbaW4NajgC4yqlUeWQfxVhE8FYFV/MLhJHCwizgbSRYpUweRZmqn0MwWCk+VB3MluYqSzh/dLdd90TLis8tCKDCm4Kxwe/7V80Dm0w2WAEx3YuUpskuaW2A== X-Forefront-Antispam-Report: CIP:192.88.168.50; CTRY:US; IPV:NLI; EFV:NLI; SFV:NSPM; SFS:(10019020)(6009001)(2980300002)(1110001)(1109001)(339900001)(40224003)(199003)(189002)(50466002)(48376002)(106466001)(85426001)(2351001)(87936001)(229853001)(50226001)(5007970100001)(77096005)(5001830100001)(97736004)(81156007)(68736005)(64706001)(105606002)(4001540100001)(76176999)(50986999)(92566002)(47776003)(36756003)(5001860100001)(86362001)(11100500001)(19580395003)(33646002)(62966003)(77156002)(4001450100002)(2950100001)(5001920100001)(19580405001)(110136002)(5003940100001)(107886002)(5001960100002)(189998001)(46102003)(6806005)(104016004)(2371004)(2004002)(4001430100001); DIR:OUT; SFP:1102; SCL:1; SRVR:SN1PR0301MB1551; 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; SN1PR0301MB1551; 2:L+gj0bNNXe2RUmCbP/zaMzs4uyEfxQqcBjdPDbbgSw2kRG930/Thc8oY5kD5+jg9ss5ktAC/gn6ycVv+alBLCVYS3I6AIKQaNUIcmMb9EzVdq2XT82Lw+R+VElRc2ZMLH0L9OMKzXRVlwu0tIe7RWDGZlxCSOXY0LeLjZw3yjs0=; 3:gWQNlbFDCefGvbQ72R8c0SvJJBAOj67Zv2q8r5/gYYsf1AhdvxJ09c2OX0JCeuZ4nlO0e0cHCnoFXgwj3xAPMFbVAcLEeqxVFVFTAOc8z5gE5INZ1WH9JfpjFHdaf5ACpG8hfyfQrcku8NdX6mqj3YOuKw02fAo3+voRR7vE1QUUZsu0FscZddssXHSWOYUqRlTCWi0fGfhZNYA3Gx04BSwfiHxffi/1FWKHE/U/c70=; 25:RnTKyXk4O1lLYKyEBVW9E7ILEb4nRBFhXKgBRCRFg986cKVjl3/Wkof4TLplLHERNknh+UkvkKpaNuqbCg2+pz2gGskmkAKPZG6Jf6iTKYZjsLtuA8E4G/wyqlYGdMGzmwR2qrYNjntEvRZlsEPwTkOjHBaX+MXYOzhHmi92u4ls8a05FBPiPKv2ru/5y1a29gWEvaw8e+/4nmceeFeTkXV/AR5rf8SGnUAlpHmrJ3K9hJOckx+UlgIFK4tzkl0Mp1qbvPqn9NzzcW+3GBEQRQ== X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:SN1PR0301MB1551; X-Microsoft-Exchange-Diagnostics: 1; SN1PR0301MB1551; 20:/CCN4qyJ7NmSvkGzRqBKRPvX+cVPm5TONs5mwVT/DH8vfgV0Bs9QziQuKy8sraGHazu+0pCKrGdXeAqxVAJxEmkGmZcCSqDk5E00kUQbEQ38QDsucdYfiUk/+MqxzirF1aTi5Kj9W8Mp199347VprLrebEyMMZbqqdK0cLlpWS2Y/E5o8DPi8XZF/mVDIERNil/2KNiNlsryZ8w24fCunxoAFhrQ+fMSGUFrAXUxjVxvHWM7n5nseMNDX+8+m/ZnzYEQmWc/ELUNwhHpjle9xGZYbYYHtXL3mV1lzf+BdwCOKtsfqiyfWbNyYzRPWmXhPWHa3fCoy5lsO6GCoqgVPjdp5/Jx/qeL+ykCv6zxvE8=; 4:JC5l2Bs/lkMbQI3dEo3Q2RzeoqO/KP9jrk7GJoki6JtRt8h3iJYI+bD67hkqh/aejbZxTtDLcPvPt+4DNaOp83YM5fRHYOEYz6tpctRomwOab/LpIGlC2CYjZBM9yHErDAfnPhQb88FXm15JWWqfu0bptUMIukWhfmY7+d8TcSkA2zIHEWUNWed1Z6cA7iSTOuXHsgfxvZyAK6/XZ+Pz2HEL4KfHOiHzHHp5AeaIvV22qYxE1mo36JAwcUm1Uk7p6g3rkssUBCyl5bYJmOpJWpYry7YlvTh5HdW7a8lEkytY4lq3rV9UV8BoWtRSY3U6GVJmppjbPbRebhPquxyOEkqIcgH4Pzp6XrqiDXBFEcQ= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(601004)(2401047)(8121501046)(5005006)(520078)(3002001); SRVR:SN1PR0301MB1551; BCL:0; PCL:0; RULEID:; SRVR:SN1PR0301MB1551; X-Forefront-PRVS: 0714841678 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; SN1PR0301MB1551; 23:fuCc8PI/K3cVkGmijTtIfPhYrgaFA4xmU6BF6eB?= =?us-ascii?Q?M0A3CgnL0LBnSJHHPKsSdX42nToAHKK+YnYvreGSqyl3pX2sv3fYydM+J8zi?= =?us-ascii?Q?yFF4ZRtntXYC8L7KQdgfXy86/rMklcM7Ju+14vI/nZFoCyEapu9R4QChgJg0?= =?us-ascii?Q?3gdnFl3d1ThwZpnjCNDcyB8eh7tPivToSEeAKQsWmU4KrOR9QVo3NuLrNVXn?= =?us-ascii?Q?XhO8MZe5vWkDs+CIaMSsMdtAlrMY7tL3NYLPoUJHyAwgg51nbmwbmO4fHbJG?= =?us-ascii?Q?2StzrWDwLRv3n/bjJzfthhoh8QqbgkrCneSv4rk2bvMGo7oQWn86bRcxZUXo?= =?us-ascii?Q?p3cLUbfI2H87FD8Ghh8zrWOra8TgSJJcrvfPJ6cvjvS1w1eSem+KFPjTv7Hf?= =?us-ascii?Q?RO/ocJt2qPUdPUosUobHomo0Ox0+OLAy4M0aNgtdnf9yEGvH3kN0pz5d9jTQ?= =?us-ascii?Q?M5Ck6BdTVkWsN/8M9sJHBGVtSNTtYyXTSB8CEXp6jVao442CDDG3fs5pAd5P?= =?us-ascii?Q?pmJNcRnpjvkoTUeYg1BpVnKpB8rwqI0nAP+4f0WshztS84+ZER8YmrLdT7HC?= =?us-ascii?Q?v+Ysz8fi+I7NVBcFX8JhCxqHZlUjucf2+BlrbfOlA1b6ovXp29GOjNQDFSqL?= =?us-ascii?Q?2t9oGR32BjGxRl0mLS4pnxURFqUlrULzVNivz0Y6IWZO/S7XG+wHtlOpCqQz?= =?us-ascii?Q?EWsznFvoTp2gZ5aXDYFYKaME09D80xxElXqcdyT9vKdST6El8Ezwwugl7VHI?= =?us-ascii?Q?l9d6OGDRnrxGkO/nBNA+uTspGO6QoZNRu+kyrBqWs2pAIvDpchHRkPKPNMo0?= =?us-ascii?Q?L0Ht9z1NMygyl4IACVDt5RaUJ8FYG7f4KM1Ydp6KHLFMXDYtHUpPE1z2GL8B?= =?us-ascii?Q?ToemIqtkrMM5n5HRcDQXVAcjJftLV+uai0U8HTZPj2SrxIaWnepENa5fqomI?= =?us-ascii?Q?Dt1v1hqVL2ObULhTeqkVV6SHdIhn6SBXZ89Nq/MN5iQe7uksncD3jo9A8LVC?= =?us-ascii?Q?Th9ngSdrvNXXCet+pEJYb4O9wD4pJYrdunP/w074TjCdnu/5l6HRzqTgMJvb?= =?us-ascii?Q?8+zE7843LZRA/LucZ9A5SdCC1LoatT4PIeXlDgJvuxt6ucbpMgIMHgGNkyzQ?= =?us-ascii?Q?KWnqM9RK4ExEsS3VW/8BgQmJiuT9YPn7kByF7zuMBvjvATYZ7hK4NPEzCsd2?= =?us-ascii?Q?7Oo1Ue/ZB37JDOool01lHzPz1akwmCBe4+rjNrf337ORRfgq+O+WAo8shVI8?= =?us-ascii?Q?JgYiMP5pVGMfkHUfrQyzH12BAZxUMU6IBn9JGZqm5rM6/foCubeIvHE3M8lW?= =?us-ascii?Q?WwXmAgln/+3HuVISZWI/RQga4q0EpGEFkp9UFIwZh0xGBL7ETWI7uWWMbLCp?= =?us-ascii?Q?+i61TD61+Rp/J1v+lVOEM/KGj6zA=3D?= X-Microsoft-Exchange-Diagnostics: 1; SN1PR0301MB1551; 5:hd7oJERieikOBj7iwIiCFZKKSscZExBMtAxU4az3Q198S2l5SsGiNl/oTE4ssxGnLZG0qT6E/t/zppXNED7NiyU7itdkBx/6l+kfuZPbHw6DIW+OvLSzEPMDqfGZunPUFqLPCsrnBJiWLEvp3kXlXA==; 24:MJA6MfFCO27pa+vQDR5VKQf3XIzH1Vy4QSZpTnQgOBC31h61jV5xHIatoEmozUzRlClYSPnBbtrkU9twHluLL6g1K1JT7dwMqFvCjTrqO3I=; 20:vFt6uvXMbB5rTvasCTLlcQKICWzQctrBrMX9avujB0gznB4JaGA4Qy/3yItowVWjRDWRxFUpY/c+Y8HzA2tvtg== X-OriginatorOrg: freescale.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 29 Sep 2015 02:15:47.3764 (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: SN1PR0301MB1551 X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Zhao Qiang , lauraa@codeaurora.org, linux-kernel@vger.kernel.org, paulus@samba.org, linuxppc-dev@lists.ozlabs.org, X.xie@freescale.com Errors-To: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org Sender: "Linuxppc-dev" QE and CPM have the same muram, they use the same management functions. Now QE support both ARM and PowerPC, it is necessary to move QE to "driver/soc", so move the muram management functions from cpm_common to qe_common for preparing to move QE code to "driver/soc" Signed-off-by: Zhao Qiang --- Changes for v2: - no changes Changes for v3: - no changes Changes for v4: - no changes Changes for v5: - no changes Changes for v6: - using genalloc instead rheap to manage QE MURAM - remove qe_reset from platform file, using - subsys_initcall to call qe_init function. Changes for v7: - move this patch from 3/3 to 2/3 - convert cpm with genalloc - check for gen_pool allocation failure Changes for v8: - rebase - move BD_SC_* macro instead of copy Changes for v9: - doesn't modify CPM, add a new patch to modify. - rebase Changes for v10: - rebase Changes for v11: - remove renaming - delete removing qe_reset and delete adding qe_init. arch/powerpc/include/asm/cpm.h | 44 ----- arch/powerpc/include/asm/qe.h | 16 ++ arch/powerpc/sysdev/cpm_common.c | 210 +-------------------- arch/powerpc/sysdev/qe_lib/Makefile | 2 +- .../sysdev/{cpm_common.c => qe_lib/qe_common.c} | 188 +----------------- 5 files changed, 27 insertions(+), 433 deletions(-) copy arch/powerpc/sysdev/{cpm_common.c => qe_lib/qe_common.c} (54%) diff --git a/arch/powerpc/include/asm/cpm.h b/arch/powerpc/include/asm/cpm.h index 0e1ac3f..05a1c15 100644 --- a/arch/powerpc/include/asm/cpm.h +++ b/arch/powerpc/include/asm/cpm.h @@ -155,50 +155,6 @@ typedef struct cpm_buf_desc { */ #define BD_I2C_START (0x0400) -int cpm_muram_init(void); - -#if defined(CONFIG_CPM) || defined(CONFIG_QUICC_ENGINE) -unsigned long cpm_muram_alloc(unsigned long size, unsigned long align); -int cpm_muram_free(unsigned long offset); -unsigned long cpm_muram_alloc_fixed(unsigned long offset, unsigned long size); -unsigned long cpm_muram_alloc_common(unsigned long size, void *data); -void __iomem *cpm_muram_addr(unsigned long offset); -unsigned long cpm_muram_offset(void __iomem *addr); -dma_addr_t cpm_muram_dma(void __iomem *addr); -#else -static inline unsigned long cpm_muram_alloc(unsigned long size, - unsigned long align) -{ - return -ENOSYS; -} - -static inline int cpm_muram_free(unsigned long offset) -{ - return -ENOSYS; -} - -static inline unsigned long cpm_muram_alloc_fixed(unsigned long offset, - unsigned long size) -{ - return -ENOSYS; -} - -static inline void __iomem *cpm_muram_addr(unsigned long offset) -{ - return NULL; -} - -static inline unsigned long cpm_muram_offset(void __iomem *addr) -{ - return -ENOSYS; -} - -static inline dma_addr_t cpm_muram_dma(void __iomem *addr) -{ - return 0; -} -#endif /* defined(CONFIG_CPM) || defined(CONFIG_QUICC_ENGINE) */ - #ifdef CONFIG_CPM int cpm_command(u32 command, u8 opcode); #else diff --git a/arch/powerpc/include/asm/qe.h b/arch/powerpc/include/asm/qe.h index 32b9bfa..c2dd8e6 100644 --- a/arch/powerpc/include/asm/qe.h +++ b/arch/powerpc/include/asm/qe.h @@ -16,11 +16,15 @@ #define _ASM_POWERPC_QE_H #ifdef __KERNEL__ +#include #include #include #include #include #include +#include +#include +#include #define QE_NUM_OF_SNUM 256 /* There are 256 serial number in QE */ #define QE_NUM_OF_BRGS 16 @@ -92,6 +96,18 @@ extern void qe_reset(void); static inline void qe_reset(void) {} #endif +int cpm_muram_init(void); + +#if defined(CONFIG_CPM) || defined(CONFIG_QUICC_ENGINE) +unsigned long cpm_muram_alloc(unsigned long size, unsigned long align); +int cpm_muram_free(unsigned long offset); +unsigned long cpm_muram_alloc_fixed(unsigned long offset, unsigned long size); +unsigned long cpm_muram_alloc_common(unsigned long size, void *data); +void __iomem *cpm_muram_addr(unsigned long offset); +unsigned long cpm_muram_offset(void __iomem *addr); +dma_addr_t cpm_muram_dma(void __iomem *addr); +#endif /* defined(CONFIG_CPM) || defined(CONFIG_QUICC_ENGINE) */ + /* QE PIO */ #define QE_PIO_PINS 32 diff --git a/arch/powerpc/sysdev/cpm_common.c b/arch/powerpc/sysdev/cpm_common.c index ff47072..6993aa8 100644 --- a/arch/powerpc/sysdev/cpm_common.c +++ b/arch/powerpc/sysdev/cpm_common.c @@ -17,7 +17,6 @@ * published by the Free Software Foundation. */ -#include #include #include #include @@ -29,6 +28,7 @@ #include #include #include +#include #include @@ -65,214 +65,6 @@ void __init udbg_init_cpm(void) } #endif -static struct gen_pool *muram_pool; -static spinlock_t cpm_muram_lock; -static u8 __iomem *muram_vbase; -static phys_addr_t muram_pbase; - -struct muram_block { - struct list_head head; - unsigned long start; - int size; -}; - -static LIST_HEAD(muram_block_list); - -/* max address size we deal with */ -#define OF_MAX_ADDR_CELLS 4 -#define GENPOOL_OFFSET (4096 * 8) - -int cpm_muram_init(void) -{ - struct device_node *np; - struct resource r; - u32 zero[OF_MAX_ADDR_CELLS] = {}; - resource_size_t max = 0; - int i = 0; - int ret = 0; - - if (muram_pbase) - return 0; - - spin_lock_init(&cpm_muram_lock); - np = of_find_compatible_node(NULL, NULL, "fsl,cpm-muram-data"); - if (!np) { - /* try legacy bindings */ - np = of_find_node_by_name(NULL, "data-only"); - if (!np) { - pr_err("Cannot find CPM muram data node"); - ret = -ENODEV; - goto out_muram; - } - } - - muram_pool = gen_pool_create(0, -1); - muram_pbase = of_translate_address(np, zero); - if (muram_pbase == (phys_addr_t)OF_BAD_ADDR) { - pr_err("Cannot translate zero through CPM muram node"); - ret = -ENODEV; - goto out_pool; - } - - while (of_address_to_resource(np, i++, &r) == 0) { - if (r.end > max) - max = r.end; - ret = gen_pool_add(muram_pool, r.start - muram_pbase + - GENPOOL_OFFSET, resource_size(&r), -1); - if (ret) { - pr_err("QE: couldn't add muram to pool!\n"); - goto out_pool; - } - - } - - muram_vbase = ioremap(muram_pbase, max - muram_pbase + 1); - if (!muram_vbase) { - pr_err("Cannot map QE muram"); - ret = -ENOMEM; - goto out_pool; - } - goto out_muram; -out_pool: - gen_pool_destroy(muram_pool); -out_muram: - of_node_put(np); - return ret; -} - -/* - * cpm_muram_alloc - allocate the requested size worth of multi-user ram - * @size: number of bytes to allocate - * @align: requested alignment, in bytes - * - * This function returns an offset into the muram area. - * Use cpm_dpram_addr() to get the virtual address of the area. - * Use cpm_muram_free() to free the allocation. - */ -unsigned long cpm_muram_alloc(unsigned long size, unsigned long align) -{ - unsigned long flags; - unsigned long start; - static struct genpool_data_align muram_pool_data; - spin_lock_irqsave(&cpm_muram_lock, flags); - muram_pool_data.align = align; - gen_pool_set_algo(muram_pool, gen_pool_first_fit_align, - &muram_pool_data); - start = cpm_muram_alloc_common(size, &muram_pool_data); - spin_unlock_irqrestore(&cpm_muram_lock, flags); - return start; -} -EXPORT_SYMBOL(cpm_muram_alloc); - - -/** - * cpm_muram_free - free a chunk of multi-user ram - * @offset: The beginning of the chunk as returned by cpm_muram_alloc(). - */ -int cpm_muram_free(unsigned long offset) -{ - unsigned long flags; - int size; - struct muram_block *tmp; - - size = 0; - spin_lock_irqsave(&cpm_muram_lock, flags); - list_for_each_entry(tmp, &muram_block_list, head) { - if (tmp->start == offset) { - size = tmp->size; - list_del(&tmp->head); - kfree(tmp); - break; - } - } - gen_pool_free(muram_pool, offset + GENPOOL_OFFSET, size); - spin_unlock_irqrestore(&cpm_muram_lock, flags); - - return size; -} -EXPORT_SYMBOL(cpm_muram_free); - -/* - * cpm_muram_alloc_fixed - reserve a specific region of multi-user ram - * @size: number of bytes to allocate - * @offset: offset of allocation start address - * - * This function returns an offset into the muram area. - */ -unsigned long cpm_muram_alloc_fixed(unsigned long offset, unsigned long size) -{ - - unsigned long start; - unsigned long flags; - static struct genpool_data_fixed muram_pool_data_fixed; - - spin_lock_irqsave(&cpm_muram_lock, flags); - muram_pool_data_fixed.offset = offset + GENPOOL_OFFSET; - gen_pool_set_algo(muram_pool, gen_pool_fixed_alloc, - &muram_pool_data_fixed); - start = cpm_muram_alloc_common(size, &muram_pool_data_fixed); - spin_unlock_irqrestore(&cpm_muram_lock, flags); - return start; -} -EXPORT_SYMBOL(cpm_muram_alloc_fixed); - -/* - * cpm_muram_alloc_common - cpm_muram_alloc common code - * @size: number of bytes to allocate - * @data: data for genalloc's algorithm. - * - * This function returns an offset into the muram area. - */ -unsigned long cpm_muram_alloc_common(unsigned long size, void *data) -{ - struct muram_block *entry; - unsigned long start; - - start = gen_pool_alloc_data(muram_pool, size, data); - if (!start) - goto out2; - start = start - GENPOOL_OFFSET; - memset(cpm_muram_addr(start), 0, size); - entry = kmalloc(sizeof(*entry), GFP_KERNEL); - if (!entry) - goto out1; - entry->start = start; - entry->size = size; - list_add(&entry->head, &muram_block_list); - - return start; -out1: - gen_pool_free(muram_pool, start, size); -out2: - return (unsigned long) -ENOMEM; -} - -/** - * cpm_muram_addr - turn a muram offset into a virtual address - * @offset: muram offset to convert - */ -void __iomem *cpm_muram_addr(unsigned long offset) -{ - return muram_vbase + offset; -} -EXPORT_SYMBOL(cpm_muram_addr); - -unsigned long cpm_muram_offset(void __iomem *addr) -{ - return addr - (void __iomem *)muram_vbase; -} -EXPORT_SYMBOL(cpm_muram_offset); - -/** - * cpm_muram_dma - turn a muram virtual address into a DMA address - * @offset: virtual address from cpm_muram_addr() to convert - */ -dma_addr_t cpm_muram_dma(void __iomem *addr) -{ - return muram_pbase + ((u8 __iomem *)addr - muram_vbase); -} -EXPORT_SYMBOL(cpm_muram_dma); - #if defined(CONFIG_CPM2) || defined(CONFIG_8xx_GPIO) struct cpm2_ioports { diff --git a/arch/powerpc/sysdev/qe_lib/Makefile b/arch/powerpc/sysdev/qe_lib/Makefile index f1855c1..9507a27 100644 --- a/arch/powerpc/sysdev/qe_lib/Makefile +++ b/arch/powerpc/sysdev/qe_lib/Makefile @@ -1,7 +1,7 @@ # # Makefile for the linux ppc-specific parts of QE # -obj-$(CONFIG_QUICC_ENGINE)+= qe.o qe_ic.o qe_io.o +obj-$(CONFIG_QUICC_ENGINE)+= qe.o qe_common.o qe_ic.o qe_io.o obj-$(CONFIG_UCC) += ucc.o obj-$(CONFIG_UCC_SLOW) += ucc_slow.o diff --git a/arch/powerpc/sysdev/cpm_common.c b/arch/powerpc/sysdev/qe_lib/qe_common.c similarity index 54% copy from arch/powerpc/sysdev/cpm_common.c copy to arch/powerpc/sysdev/qe_lib/qe_common.c index ff47072..0aa74ca 100644 --- a/arch/powerpc/sysdev/cpm_common.c +++ b/arch/powerpc/sysdev/qe_lib/qe_common.c @@ -1,23 +1,18 @@ /* - * Common CPM code + * Freescale QE common code * - * Author: Scott Wood + * Author: Zhao Qiang * - * Copyright 2007-2008,2010 Freescale Semiconductor, Inc. - * - * Some parts derived from commproc.c/cpm2_common.c, which is: - * Copyright (c) 1997 Dan error_act (dmalek@jlc.net) - * Copyright (c) 1999-2001 Dan Malek - * Copyright (c) 2000 MontaVista Software, Inc (source@mvista.com) - * 2006 (c) MontaVista Software, Inc. - * Vitaly Bordug + * Copyright 2015 Freescale Semiconductor, Inc. * * This program is free software; you can redistribute it and/or modify - * it under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. */ #include +#include #include #include #include @@ -26,44 +21,8 @@ #include #include -#include -#include -#include - -#include - -#if defined(CONFIG_CPM2) || defined(CONFIG_8xx_GPIO) -#include -#endif - -#ifdef CONFIG_PPC_EARLY_DEBUG_CPM -static u32 __iomem *cpm_udbg_txdesc = - (u32 __iomem __force *)CONFIG_PPC_EARLY_DEBUG_CPM_ADDR; - -static void udbg_putc_cpm(char c) -{ - u8 __iomem *txbuf = (u8 __iomem __force *)in_be32(&cpm_udbg_txdesc[1]); - - if (c == '\n') - udbg_putc_cpm('\r'); - - while (in_be32(&cpm_udbg_txdesc[0]) & 0x80000000) - ; - - out_8(txbuf, c); - out_be32(&cpm_udbg_txdesc[0], 0xa0000001); -} - -void __init udbg_init_cpm(void) -{ - if (cpm_udbg_txdesc) { -#ifdef CONFIG_CPM2 - setbat(1, 0xf0000000, 0xf0000000, 1024*1024, PAGE_KERNEL_NCG); -#endif - udbg_putc = udbg_putc_cpm; - } -} -#endif +#include +#include static struct gen_pool *muram_pool; static spinlock_t cpm_muram_lock; @@ -272,132 +231,3 @@ dma_addr_t cpm_muram_dma(void __iomem *addr) return muram_pbase + ((u8 __iomem *)addr - muram_vbase); } EXPORT_SYMBOL(cpm_muram_dma); - -#if defined(CONFIG_CPM2) || defined(CONFIG_8xx_GPIO) - -struct cpm2_ioports { - u32 dir, par, sor, odr, dat; - u32 res[3]; -}; - -struct cpm2_gpio32_chip { - struct of_mm_gpio_chip mm_gc; - spinlock_t lock; - - /* shadowed data register to clear/set bits safely */ - u32 cpdata; -}; - -static inline struct cpm2_gpio32_chip * -to_cpm2_gpio32_chip(struct of_mm_gpio_chip *mm_gc) -{ - return container_of(mm_gc, struct cpm2_gpio32_chip, mm_gc); -} - -static void cpm2_gpio32_save_regs(struct of_mm_gpio_chip *mm_gc) -{ - struct cpm2_gpio32_chip *cpm2_gc = to_cpm2_gpio32_chip(mm_gc); - struct cpm2_ioports __iomem *iop = mm_gc->regs; - - cpm2_gc->cpdata = in_be32(&iop->dat); -} - -static int cpm2_gpio32_get(struct gpio_chip *gc, unsigned int gpio) -{ - struct of_mm_gpio_chip *mm_gc = to_of_mm_gpio_chip(gc); - struct cpm2_ioports __iomem *iop = mm_gc->regs; - u32 pin_mask; - - pin_mask = 1 << (31 - gpio); - - return !!(in_be32(&iop->dat) & pin_mask); -} - -static void __cpm2_gpio32_set(struct of_mm_gpio_chip *mm_gc, u32 pin_mask, - int value) -{ - struct cpm2_gpio32_chip *cpm2_gc = to_cpm2_gpio32_chip(mm_gc); - struct cpm2_ioports __iomem *iop = mm_gc->regs; - - if (value) - cpm2_gc->cpdata |= pin_mask; - else - cpm2_gc->cpdata &= ~pin_mask; - - out_be32(&iop->dat, cpm2_gc->cpdata); -} - -static void cpm2_gpio32_set(struct gpio_chip *gc, unsigned int gpio, int value) -{ - struct of_mm_gpio_chip *mm_gc = to_of_mm_gpio_chip(gc); - struct cpm2_gpio32_chip *cpm2_gc = to_cpm2_gpio32_chip(mm_gc); - unsigned long flags; - u32 pin_mask = 1 << (31 - gpio); - - spin_lock_irqsave(&cpm2_gc->lock, flags); - - __cpm2_gpio32_set(mm_gc, pin_mask, value); - - spin_unlock_irqrestore(&cpm2_gc->lock, flags); -} - -static int cpm2_gpio32_dir_out(struct gpio_chip *gc, unsigned int gpio, int val) -{ - struct of_mm_gpio_chip *mm_gc = to_of_mm_gpio_chip(gc); - struct cpm2_gpio32_chip *cpm2_gc = to_cpm2_gpio32_chip(mm_gc); - struct cpm2_ioports __iomem *iop = mm_gc->regs; - unsigned long flags; - u32 pin_mask = 1 << (31 - gpio); - - spin_lock_irqsave(&cpm2_gc->lock, flags); - - setbits32(&iop->dir, pin_mask); - __cpm2_gpio32_set(mm_gc, pin_mask, val); - - spin_unlock_irqrestore(&cpm2_gc->lock, flags); - - return 0; -} - -static int cpm2_gpio32_dir_in(struct gpio_chip *gc, unsigned int gpio) -{ - struct of_mm_gpio_chip *mm_gc = to_of_mm_gpio_chip(gc); - struct cpm2_gpio32_chip *cpm2_gc = to_cpm2_gpio32_chip(mm_gc); - struct cpm2_ioports __iomem *iop = mm_gc->regs; - unsigned long flags; - u32 pin_mask = 1 << (31 - gpio); - - spin_lock_irqsave(&cpm2_gc->lock, flags); - - clrbits32(&iop->dir, pin_mask); - - spin_unlock_irqrestore(&cpm2_gc->lock, flags); - - return 0; -} - -int cpm2_gpiochip_add32(struct device_node *np) -{ - struct cpm2_gpio32_chip *cpm2_gc; - struct of_mm_gpio_chip *mm_gc; - struct gpio_chip *gc; - - cpm2_gc = kzalloc(sizeof(*cpm2_gc), GFP_KERNEL); - if (!cpm2_gc) - return -ENOMEM; - - spin_lock_init(&cpm2_gc->lock); - - mm_gc = &cpm2_gc->mm_gc; - gc = &mm_gc->gc; - - mm_gc->save_regs = cpm2_gpio32_save_regs; - gc->ngpio = 32; - gc->direction_input = cpm2_gpio32_dir_in; - gc->direction_output = cpm2_gpio32_dir_out; - gc->get = cpm2_gpio32_get; - gc->set = cpm2_gpio32_set; - - return of_mm_gpiochip_add(np, mm_gc); -} -#endif /* CONFIG_CPM2 || CONFIG_8xx_GPIO */