From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752875AbbJNHXE (ORCPT ); Wed, 14 Oct 2015 03:23:04 -0400 Received: from mail-bl2on0138.outbound.protection.outlook.com ([65.55.169.138]:3858 "EHLO na01-bl2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752744AbbJNHW5 (ORCPT ); Wed, 14 Oct 2015 03:22:57 -0400 Authentication-Results: spf=fail (sender IP is 192.88.158.2) 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; From: Zhao Qiang To: CC: , , , , , , , Zhao Qiang Subject: [PATCH v12 4/6] QE/CPM: move muram management functions to qe_common Date: Wed, 14 Oct 2015 15:16:06 +0800 Message-ID: <1444806968-4627-4-git-send-email-qiang.zhao@freescale.com> X-Mailer: git-send-email 2.1.0.27.g96db324 In-Reply-To: <1444806968-4627-1-git-send-email-qiang.zhao@freescale.com> References: <1444806968-4627-1-git-send-email-qiang.zhao@freescale.com> X-EOPAttributedMessage: 0 X-Microsoft-Exchange-Diagnostics: 1;BY2FFO11FD048;1:udYcMBR6EgXAAKNWkb6bAdTW7AIQAqcDFTVPbPZPqJyoR8js7JSKCSfWg7mNeEbWxPy0GAm36ESyWhopYJphDqogJtOkUyEnAKCHdsRsdgRaRr71xgpfUi2sFfAMR1e0/7JZrZb72MUZxPd9T3Z4sJfnolpamo+cWScx1nptTyGdQVYoXFeXmPbshQF+NmAI87WikSglTT0XztP7ecrP5L3SLCQKgtvEOVAV75yVIDaJv0O4HmzAKFmcX6bZkASw4sNlIPB96fbufrITtKpdFo42Q2dUKUtPzE8jseJJPZp8DLcH+N9KGPkkm5tIBrr0Vtu+HelA+et/eDuOs6tU0gph5NO3eSV4BkNxJbeI0fn3ZSc22QRiKJPsbm18TWau3h+MFnBRP1OvsjxXz/0tyg== X-Forefront-Antispam-Report: CIP:192.88.158.2;CTRY:US;IPV:NLI;EFV:NLI;SFV:NSPM;SFS:(10019020)(6009001)(2980300002)(1109001)(1110001)(339900001)(199003)(189002)(40224003)(107886002)(87936001)(48376002)(5001960100002)(97736004)(106466001)(110136002)(105606002)(81156007)(50466002)(2371004)(69596002)(33646002)(4001450100002)(5003940100001)(19580395003)(189998001)(104016004)(6806005)(50226001)(11100500001)(36756003)(46102003)(77096005)(85426001)(19580405001)(5008740100001)(2351001)(76176999)(229853001)(86362001)(50986999)(2950100001)(47776003)(92566002)(5007970100001)(64706001)(2004002)(4001430100001);DIR:OUT;SFP:1102;SCL:1;SRVR:CY1PR0301MB1547;H:az84smr01.freescale.net;FPR:;SPF:Fail;PTR:InfoDomainNonexistent;A:1;MX:1;LANG:en; MIME-Version: 1.0 Content-Type: text/plain X-Microsoft-Exchange-Diagnostics: 1;CY1PR0301MB1547;2:cmZAsPy5F+2VaIvULzlWEPH/UGpge5V0VVr3EOs8hJLA+HElRIWGJWkBFBI+2Vt6hXARePVVret3l5MmC2Z5PIM4j21elYXftteT/pZ5d2ND9gujzb1FZUwbGomq4tjAQrZXm1PMygRBo2KYTs4E7bCzsleyR9yQPMPxJ265xuk=;3:1SGry1enQ0lFDHR5v9JjNARiKyfsl00+v1FcbaGcVNz9u7XRURugychSLBTnYmbb+fuvBTa7XtII6S69tyTRqBqLqk3ivkQolctZECEf6ViaEQ2TcntSqZaF9OMKzDR0oWzJYxBLZM3aJEBqk6SiCulbmf3E6WOdUXrARJBBZ0dOK0Ar85fPPp+/wv5CxY6Z0eo/OZ7FL4/OzawKWdh51AY2fBeLI/4PExEiUYLLM4M=;25:5dFge099rVpMCbct1ezINurpwY56CP6CVsCz6pRdCC55WPUu6ddFWUbsvWA42jo489cS0z8SPVwfQUr05letm1IZqd+nmYsVhEkHCxV1XPqAEV7jgTQrQTAYuZ1NVcnt1SbgwbwvV+DxUsrFTSXrj1DBnTsEbSa4JRUcalIuJ3GyBWwsvPYc0fLSBp47XvSC7LmIAVwqz4fN+iB43CRI07niapUyRuT1aCDlZQARJXW8+COGKYG9M1H90C0h5VAr645YO3A2WKE7Pk/PRkcOow== X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:CY1PR0301MB1547; X-Microsoft-Exchange-Diagnostics: 1;CY1PR0301MB1547;20:zmO6NBZlQNvux20Rvx5+3X56lTCpRrbOC5Bv+ZKqck95aQK6nBgMZ59NDO+iMLU/B4Uf2XET1DljkmYVReLHCnNVBT6Ga6OkJFobsE2P70JVtY98aB79BzaQRuYfBGCGLed7dQh/WRhfd/qR4IFEXXgAHYYyHTLONjoqo1MWjoxkcnA7iMfilz+6x1FHnIm1gG29JkeQ9sabWLNBAxmwerF4p8fYHP+EiklsWc95yzJQZlewqAaaaKXYPyuKkLQ49c5HTpfS9zJwhlcI5dZ5z1mP4GfMoFdFX/mN9A3b5zDvzoYGAkv7jc/f5OkUfOSMynXlFYtGYnFjHEQSCZuPcs5+YibXziE5nUQdS0pQe/E=;4:YV0kWNRwfHG74n/pyPYUW4fWIjJ+yX8rSlBKhkgJz3DDZqMAwP5PfP6I0G1iWpAhVISnjt3qIKWHBBbhAGW+PJHtyAv86xPMYLkxPfX7MBA8tvdEEKW6jvPyT/40fdf9/eECDQLLFlHudSngqwoKM/nHnr9sQv1LYSPe3/MbvPkYYbV5GvqyoUfZs/x5/m+Xz7qQYf0vC2faIXqd+hYNNDdqfabCrCqprkPW2d3QfXaz3R+xRTYw+45OsfVepVr1NsIonBoza6jrr9fe4nC4xK/FaJPfm8pz/2EMDJk5STmVXLCFO78cyUSjmFQCl/4MWwOPo9cUJa4/PdCxx/jlquXYNqqeXAqyaYzKQOfPZC8= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(101931422205132); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(601004)(2401047)(8121501046)(5005006)(520078)(3002001);SRVR:CY1PR0301MB1547;BCL:0;PCL:0;RULEID:;SRVR:CY1PR0301MB1547; X-Forefront-PRVS: 0729050452 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;CY1PR0301MB1547;23:P/5XYSzKSIprULKu/gp5iZfUgrx3K8CitEdhcR2?= =?us-ascii?Q?o9vSk9pm0cN+B3FaFn258ufZVe1vUskdTOxhwLDUMMlhKRoSF6Urwz5zFgu0?= =?us-ascii?Q?afDFIrr5FAyW86tqZgwGFaH/2wVmLK2gHiWwiBtXdmlSu3WO11PMmAYjMwhL?= =?us-ascii?Q?LsB76zd0N1B9lRygTHQ9wE703v//FteUasy/06dL6uTAZK3EdHIcY2MUDBkM?= =?us-ascii?Q?3J+H2XFnNghME2x6G8MHDsLIdWEsKp+hIRwTORTBi0ym/AMWma+bExocwUgb?= =?us-ascii?Q?zQEAYcWiAksathMhnghxwSzTAzk+Qd2LmEjDriN++XezzalbsXIwM4Ogx5Mz?= =?us-ascii?Q?8lg0wKFgIZPYgM65xbUFQNSfA5UvvoGlfkYWITK8t6SRW9JhepCmj3cDr74t?= =?us-ascii?Q?hy6dI9WSNicYOl2wNhKC5UqlVy1qE/vH3q5I4BYdq9tcW/Y2PNsE8hT056Hw?= =?us-ascii?Q?mAMW3GwO87ugDB5a+imENh6zDwpBNZFkYIGNO1+NrGwZH37+PB6fAYD1sGi2?= =?us-ascii?Q?lcjPrajdhj71+93tZTpXIGoAZ+aRZHDp64Ijm3p0778WAjc3njLdF72EVi0R?= =?us-ascii?Q?dLIJ2Z4y3AsdJB/AXiZiRi5RBO0FKOolYrQQ5zpeHpqFUKEpW//MtMlSrZ2I?= =?us-ascii?Q?X/4q0C97IUz0OoIR2uPcjXGviUvwcwnOjBbdzGRcz3C105GeOdDZDL0VSZmM?= =?us-ascii?Q?Lh7EaliPHhLq7vGyKuLnZaeENH5/8GbccTuwwHzKQUIK5iZ7p0BRKZXxqz5i?= =?us-ascii?Q?Xczt24suIDzS6R4JGIQLOEQtzergSAmFXTAPonSLkVumdKQWvb6DKwnBi7i2?= =?us-ascii?Q?fl1qPIkn1XDfseLKmvG4rzkerGgMHdnfUEumW7I2X7LOGTIO9S4sJQo7quII?= =?us-ascii?Q?pRx3qUoMtpvl1pKJii1p0RpkUIW/q9/x0OkLCJsYgRQ3wKVxxeBxcT5Hmhkn?= =?us-ascii?Q?6Sx6QSyOxWhhYRr8oeBLmY+kirth3TVVuKyaV8QEfwNrjX6N9hOuXbTdGw/t?= =?us-ascii?Q?amSDkJ4lAp1kchnHGpIhMvecpE4b7CeC+qyIoGfMZORx0h/KO5SCialr45HB?= =?us-ascii?Q?7fMl5/0oTsJfLUVd/zsIQMLf3TdvjD+/iWsPOvnhZJAsxd1IbsiXOsU4kpnv?= =?us-ascii?Q?2raim3cQHIaQX8OoP6G3DwlKXq5G1Sd7B4cl1UghDhiGpiOxyzIikb+1ELQe?= =?us-ascii?Q?ElgP5Dn+qXfxwCe/+4Ir7wX4v11Ol0Iw6fpaOP/NAE+BELXojmzFDsgLi/H5?= =?us-ascii?Q?n/h7GTox15rsX/VFk/kU=3D?= X-Microsoft-Exchange-Diagnostics: 1;CY1PR0301MB1547;5:2zRkTxXsOIBibPPQHbXjkkPPzOjUChqOjITGRg9AZHnvruW23ipxPjJR80Uheqx72+NlTrT+yY/ubpAbD35uIKJ4S4VyA4qHRPPmMfHVI96Me0Qt+40mcQEqdR9qmfFWouW0459+iOJPBUUvlGsn8Q==;24:6WVfAlObIIsAVAGFvRvRCbdASkOzMmO+hg80N1GTK/7ERGCcxknA0U0IQfmd+9eo/TsqKi1uxU2pthkM3O6SaIXmBkIhyLharO0Cz5Nl1Po=;20:4MgDTtkTNwz9KhPsfoUY1+9szYTgrsQXCbQZuwsvWhUhx4kEKnk73s/XxMvy9eDmO/z0+7rqvPb+t4dYBhX9fg== X-OriginatorOrg: freescale.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Oct 2015 07:22:53.4210 (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.158.2];Helo=[az84smr01.freescale.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY1PR0301MB1547 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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. Changes for v12: - SPI_FSL_CPM depends on QE-MURAM, select QUICC_ENGINE for it. 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 +----------------- drivers/spi/Kconfig | 1 + 6 files changed, 28 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 */ diff --git a/drivers/spi/Kconfig b/drivers/spi/Kconfig index 198f96b..406ece4 100644 --- a/drivers/spi/Kconfig +++ b/drivers/spi/Kconfig @@ -286,6 +286,7 @@ config SPI_FSL_LIB config SPI_FSL_CPM tristate depends on FSL_SOC + select QUICC_ENGINE config SPI_FSL_SPI tristate "Freescale SPI controller and Aeroflex Gaisler GRLIB SPI controller" -- 2.1.0.27.g96db324