From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752827AbcADFdg (ORCPT ); Mon, 4 Jan 2016 00:33:36 -0500 Received: from mail-bl2on0065.outbound.protection.outlook.com ([65.55.169.65]:52473 "EHLO na01-bl2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752632AbcADFdY (ORCPT ); Mon, 4 Jan 2016 00:33:24 -0500 Authentication-Results: spf=none (sender IP is 165.204.84.222) smtp.mailfrom=amd.com; alien8.de; dkim=none (message not signed) header.d=none;alien8.de; dmarc=permerror action=none header.from=amd.com; X-WSS-ID: 0O0EY3G-08-6AL-02 X-M-MSG: From: Wang Hongcheng To: Andy Shevchenko , Vinod Koul , Mika Westerberg , Greg Kroah-Hartman , "Rafael J. Wysocki" CC: , , , , Borislav Petkov , Huang Rui , Wan Zongshun , Ken Xue , Robin Murphy , Graeme Gregory , Tony Li , Xiangliang Yu , Wang Hongcheng Subject: [PATCH 2/6] ACPI: create setup_quirk in acpi_apd Date: Mon, 4 Jan 2016 13:31:37 +0800 Message-ID: <1451885501-2710-3-git-send-email-annie.wang@amd.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1451885501-2710-1-git-send-email-annie.wang@amd.com> References: <1451885501-2710-1-git-send-email-annie.wang@amd.com> MIME-Version: 1.0 Content-Type: text/plain X-EOPAttributedMessage: 0 X-Forefront-Antispam-Report: CIP:165.204.84.222;CTRY:US;IPV:NLI;EFV:NLI;SFV:NSPM;SFS:(10009020)(6009001)(2980300002)(428002)(199003)(189002)(19580395003)(50466002)(4326007)(19580405001)(5890100001)(5008740100001)(1220700001)(87936001)(2950100001)(48376002)(97736004)(92566002)(1096002)(47776003)(105586002)(77096005)(106466001)(50226001)(86362001)(5003600100002)(50986999)(189998001)(586003)(76176999)(101416001)(229853001)(36756003)(53416004)(5003940100001)(5001770100001)(33646002)(2004002);DIR:OUT;SFP:1101;SCL:1;SRVR:BN4PR12MB0851;H:atltwp02.amd.com;FPR:;SPF:None;PTR:InfoDomainNonexistent;A:1;MX:1;LANG:en; X-Microsoft-Exchange-Diagnostics: 1;BN4PR12MB0851;2:UwdPgInd4CvRNLQJr0gOqCXyxKI6dAh2rlThZTvN0E38Jd+P/j0tY5C1DduCvcRQ+FnA6U5nT4HfuAku2ihIxNbOLBFL6RzmAeE39TzapIiglHr/V338KWAIbaNNIl5mKjIhlOjKPo1up7Er9lm/Ow==;3:xrn/rBJVfB5MRNiNUXGwqyAfOBkq65/4cmRCrOxaH2IdA9AkcNe7qCah+Zq999vIsC+xNRlfVr7K8PeTswbeZXBlBmeXMwkHiNUemuUM5fo3gatU40+cfZswL11UopoeSCdq9FlKEQfG5Mnrxj/X3bV1uDKgV4eIgg0zS0ocJoWpwVKPEtlYrBjKvOh3YYt74V+HK/fFteY00D4hVkDifBJ/uqzikupiVnlfzB+2ggo=;25:750SSgBgoOD0LEBIUOjFEA0AQUdz4zWqzs7dyL0VPo2FBFiIuS6kWzjE9OZEmdHFCvkoxD0lk9k/RN6IC8W09cwsD3dpNXmq+GnPchnoTjgWq7YD3L+Z9rO9f6pP+IHvAtDU3cfedtuvBfDRSAtUvGbz2nMkBPmAIMMUfd6uaoKtNosuD53ASn94W9Bsu5CO486hZKRN62hPqRJFShUz7F2mj6Ozpep1lpV24zEaTwpM3ZP6WJ2FK5DyvlLtP3WSO3Zv+zsisaar6MLLLTkjtg== X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:BN4PR12MB0851; X-Microsoft-Exchange-Diagnostics: 1;BN4PR12MB0851;20:9gEkouDCo4E3mU3tEUmypFyBjI5I8DUTqUTDWiNL8wvWgimOQBwEBltASF2EiV4LN/zMK4rexlgbfdAzSYmLflvMNxvbH1DjxdaaBDkwtvSFbjmFtJfBcARU5TEr4jFk0uNS6tPGHAnzVjcXPZkMchwpdsvhlFng/SOFBqY0+D2Fya948Cd4Ifo1tm4d8JAIvFzyd36oVWiKy4JN72AejroDRYsIjhJdXA8jLRm3JaO7/dchDLeVWlxVLheaXm7U5M1Kj808V50BnMi0P+aKgUciQRVhBgIeaDZ83DyxUIQJO93wnogD6txZ2D9Jk26kAEs0fDMZsOkaqsStaP7O/xkcmDQRI7XY9kem68pbBiE4ei2ThF8LgyYNHpGMYl/R1CVkSDwuCmD6jz9bzE7IIEYV4puoBI4m9X1YFbZwLRiKpAiNnoZSVsk6SFw87qtqCM4NEUTivZXW048wzH4nvoV1vo6kk6HRTpGTD3HWJNVDJuyHE5d8k7mdnJJtDESm;4:Os/rYdipo+F03Qb6cki6LsWJ+mZhHSHOCExTb+rINZd9SW3odeiWP0P7HEmuYoSVmTRuOEZdfeo1GgFqc70dpCV4izIZx3Tm6cg3K4GK6S9AF3UICxUKrFFCSyTgqgymhdrbFG1olz8/IlcsPDY5paIS3zghOkZxSVXY/pXCm+BOfHZ6b09aQjAhHFifHtEpR/q/cm8jIqUBXU16r/lAKFf1APlwhDSfBa4vSoarz3t51ptvXLejap5B7ZnCLJXP1EfaVFHlmR6Z8NdO+41QBeIpbt4qRbcBsIsiM5niwUZQqK14ym+pup2rtE5V/hYeS3rL0j+W3uQ20GQhq/0rSWnMSse+mnsOBCP8f5+DU/QkUXBVJtYkQdfRDCmIMo0viIDKWA6ncvCSXp2fKYhd7XTJq35dDcjnHfx6xYc7R2g= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(767451399110); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(601004)(2401047)(520078)(5005006)(8121501046)(10201501046)(3002001);SRVR:BN4PR12MB0851;BCL:0;PCL:0;RULEID:;SRVR:BN4PR12MB0851; X-Forefront-PRVS: 08118EFC2B X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;BN4PR12MB0851;23:TdUPVp+d3+c593M0JdNZp7lFeeSvv21yOZ8y1SMTk?= =?us-ascii?Q?gyPGMOO1OW1nufLg4l52cD+S2kMj7c2x3pr+GRCU0TgH6b2749v2rW8cK4HQ?= =?us-ascii?Q?5L+uLQ3paP9wjgZgPso6JnYfsvg4ckiG9LTTgSiaxBG0y6tN6ToIkNq/eq9G?= =?us-ascii?Q?L+hVpe23VB2/JJB1vVoaNCqiC7ZgGZKc2WVP7LgbAqS+OL1o/rpXhbGNpa/i?= =?us-ascii?Q?PHVjDJMkUC1uhMXN7JfF0KL0xe3nXwU4WNttKPhKhRe8lv6rhdJPlfoEFCm+?= =?us-ascii?Q?PHscZy41iKFhN4YvbPxS+3AG7vSdsT5OU1dhoaGvQZ8KYbn2r495PQQFlBNv?= =?us-ascii?Q?F+6lZyYUdz8C0YtXLFUr4DI2MJ7fbqR4rikYArWnv58gYacLK3jcX06hVohK?= =?us-ascii?Q?T435yYhIUINuJ7Xg/mUoVZWF3IhxZEXgQlptjgzz9Cgpcj+D57hBFOGgWB1c?= =?us-ascii?Q?jC4xGlSl8gUeEjMXDtxW4I6xV2ZUmLVGOVZ/FJBQ0JUYP6/bEANwqrjSVDXX?= =?us-ascii?Q?MzMiQw/PtwG/ZeS0hq2Ml3tHBgiQg/tLgxPNU28ZzIXWNGyJyb/iR77gysc8?= =?us-ascii?Q?NIJQwy53wO/KNBYznNOIdWyBqHCVC12zttgaOdLdWl81xXnyy/8UOlQrhhpS?= =?us-ascii?Q?NfUxWBSXL61zWnkaa3EzPbLjw4X4lTbIfWewBEDh9BjcVWQCauYdgtrJbVNm?= =?us-ascii?Q?K5y7/hbsgUdM6Hpsdll05ZtZnblhzwiF6jdv1TLI78WnnlFEJZYD1qkVXgy4?= =?us-ascii?Q?slchihXUbN+fbuoFEc+lmXn+qb/Dp9dcHk+RdPZ6NkpyZbrCXr/HEBW4eYGC?= =?us-ascii?Q?9FRGYGv4sjt+9RoMO2XsbC3hgBfgFFdY1F0kYOcgI+N4W9uAlbag46IDHDMT?= =?us-ascii?Q?E/CVd9MwFxw7TZlwsU3IbG1MDul25KYvnz5SK6F4hBEil+u2Rj/tmNYwNmky?= =?us-ascii?Q?fi9mnWNhep6aSB2DUSEW0sPu7qbO2/nT0rgIOvT2ezaJ1vRfECUAdh7tp/NC?= =?us-ascii?Q?pi0GjYzeknvp0Hlg9nN0zog?= X-Microsoft-Exchange-Diagnostics: 1;BN4PR12MB0851;5:VrpwomLZHC1z155ja3xoGCtfVfwmazEgKXBc5BpJJnf0YwUb4ufu1qSTcx/aTXEgNu89MBSxM0rmgDG/dVxj6fzirPdZEmWhLLxU7LwL4Af125EYbWBCAUU55+phMOEFCOtg419MDGFsSPagHdoGbw==;24:y9YLlcNmDKSIUEbhV2BzvlacmEWvV+ntkG4mr5MUyNdUBWqYK2I2GjV6ULaOTNT1u2aAfEinfI/7c3sxPKFez4XQGwkVICPFCR3azSSFS1o=;20:y0byPDb0JgB4WadjA76uQURJV50kBgSewMgPu0RhRn3H7JN+p78EBGnsHr/DetGzRZmR6XGKiH7Mmm3HpBXocsY1vgHJrvHH3ekThpLShCjQcOhE13wjC4AyIvBAmIdLOlVE3Qi6FnEyIQZZlbsK95H7z5bsH6sE4xPEDRpjMrQb73wuIfrZkdoOtiwzsedwibKiQoaumi2Dj61UOuu2wwKf9cMllHVhZK5hGnqEdzcgpHb36vf1HhlpPVVfiqu2 SpamDiagnosticOutput: 1:23 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 04 Jan 2016 05:33:18.8142 (UTC) X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.222];Helo=[atltwp02.amd.com] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BN4PR12MB0851 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The post_setup hook of AMD0020 device will create an amba device as the child of a previously created platform device. Signed-off-by: Wang Hongcheng --- drivers/acpi/acpi_apd.c | 131 ++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 121 insertions(+), 10 deletions(-) diff --git a/drivers/acpi/acpi_apd.c b/drivers/acpi/acpi_apd.c index a450e7a..9520daf 100644 --- a/drivers/acpi/acpi_apd.c +++ b/drivers/acpi/acpi_apd.c @@ -3,7 +3,8 @@ * * Copyright (c) 2014,2015 AMD Corporation. * Authors: Ken Xue - * Wu, Jeff + * Jeff Wu <15618388108@163.com> + * Wang Hongcheng * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as @@ -17,6 +18,8 @@ #include #include #include +#include +#include #include "internal.h" @@ -36,19 +39,23 @@ struct apd_private_data; * @fixed_clk_rate: fixed rate input clock source for acpi device; * 0 means no fixed rate input clock source * @setup: a hook routine to set device resource during create platform device - * + * @post_setup: an additional hook routine * Device description defined as acpi_device_id.driver_data */ struct apd_device_desc { unsigned int flags; unsigned int fixed_clk_rate; + unsigned int base_offset; + unsigned int periphid; int (*setup)(struct apd_private_data *pdata); + int (*post_setup)(struct apd_private_data *pdata); }; struct apd_private_data { struct clk *clk; struct acpi_device *adev; const struct apd_device_desc *dev_desc; + struct platform_device *pdev; }; #ifdef CONFIG_X86_AMD_PLATFORM_DEVICE @@ -71,6 +78,100 @@ static int acpi_apd_setup(struct apd_private_data *pdata) return 0; } +#ifdef CONFIG_SERIAL_8250_AMD +static int acpi_apd_setup_quirks(struct apd_private_data *pdata) +{ + struct amba_device *amba_dev = NULL; + struct platform_device *pdev = pdata->pdev; + struct resource *presource, *resource = NULL; + int count = 0; + int ret = 0; + unsigned int i; + unsigned int irq[AMBA_NR_IRQS]; + struct clk *clk = ERR_PTR(-ENODEV); + char amba_devname[100]; + + resource = kzalloc(sizeof(*resource), GFP_KERNEL); + if (!resource) + goto resource_alloc_err; + + presource = platform_get_resource(pdev, IORESOURCE_MEM, 0); + resource->parent = presource; + + /* + * The memory address of AMD pl330 has an offset of ACPI + * mem resource. + */ + resource->start += presource->start + pdata->dev_desc->base_offset; + resource->end = presource->end; + + presource = pdev->resource; + for (i = 0; i < resource_size(presource); i++) { + if (presource[i].flags & IORESOURCE_IRQ) + irq[count++] = presource[i].start; + } + + sprintf(amba_devname, "%s%s", dev_name(&pdev->dev), "DMA"); + + amba_dev = amba_device_alloc(amba_devname, + resource->start, + resource_size(resource)); + + if (!amba_dev) + goto amba_alloc_err; + + amba_dev->dev.coherent_dma_mask + = acpi_dma_supported(ACPI_COMPANION(&pdev->dev)) ? DMA_BIT_MASK(64) : 0; + amba_dev->dev.fwnode = acpi_fwnode_handle(ACPI_COMPANION(&pdev->dev)); + + amba_dev->dev.parent = &pdev->dev; + amba_dev->periphid = pdata->dev_desc->periphid; + + WARN_ON_ONCE(count > AMBA_NR_IRQS); + + for (i = 0; i < count; i++) + amba_dev->irq[i] = irq[i]; + + clk = clk_register_fixed_rate(&amba_dev->dev, + dev_name(&amba_dev->dev), + NULL, CLK_IS_ROOT, + pdata->dev_desc->fixed_clk_rate); + if (IS_ERR_OR_NULL(clk)) + goto amba_register_err; + + ret = clk_register_clkdev(clk, "apb_pclk", + dev_name(&amba_dev->dev)); + if (ret) + goto amba_register_err; + + amba_dev->dev.init_name = NULL; + ret = amba_device_add(amba_dev, resource); + if (ret) + goto amba_register_err; + + kfree(resource); + return 0; + +amba_register_err: + amba_device_put(amba_dev); + +amba_alloc_err: + kfree(resource); + +resource_alloc_err: + dev_info(&pdev->dev, "AMBA device created failed.\n"); + return 0; +} + +#else + +static int acpi_apd_setup_quirks(struct apd_private_data *pdata) +{ + return 0; +} + +#endif + static struct apd_device_desc cz_i2c_desc = { .setup = acpi_apd_setup, .fixed_clk_rate = 133000000, @@ -78,7 +179,10 @@ static struct apd_device_desc cz_i2c_desc = { static struct apd_device_desc cz_uart_desc = { .setup = acpi_apd_setup, + .post_setup = acpi_apd_setup_quirks, .fixed_clk_rate = 48000000, + .periphid = 0x00041330, + .base_offset = SZ_4K, }; #else @@ -88,11 +192,11 @@ static struct apd_device_desc cz_uart_desc = { #endif /* CONFIG_X86_AMD_PLATFORM_DEVICE */ /** -* Create platform device during acpi scan attach handle. -* Return value > 0 on success of creating device. -*/ + * Create platform device during acpi scan attach handle. + * Return value > 0 on success of creating device. + */ static int acpi_apd_create_device(struct acpi_device *adev, - const struct acpi_device_id *id) + const struct acpi_device_id *id) { const struct apd_device_desc *dev_desc = (void *)id->driver_data; struct apd_private_data *pdata; @@ -118,14 +222,21 @@ static int acpi_apd_create_device(struct acpi_device *adev, } adev->driver_data = pdata; - pdev = acpi_create_platform_device(adev); - if (!IS_ERR_OR_NULL(pdev)) - return 1; + pdev = acpi_create_platform_device(adev); ret = PTR_ERR(pdev); - adev->driver_data = NULL; + if (IS_ERR_OR_NULL(pdev)) + goto err_out; + + if (dev_desc->post_setup) { + pdata->pdev = pdev; + dev_desc->post_setup(pdata); + } + + return ret; err_out: + adev->driver_data = NULL; kfree(pdata); return ret; } -- 1.9.1