From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932066AbbLVJB2 (ORCPT ); Tue, 22 Dec 2015 04:01:28 -0500 Received: from mail-by2on0078.outbound.protection.outlook.com ([207.46.100.78]:27568 "EHLO na01-by2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752221AbbLVJBZ (ORCPT ); Tue, 22 Dec 2015 04:01:25 -0500 Authentication-Results: spf=none (sender IP is 165.204.84.222) smtp.mailfrom=amd.com; gmail.com; dkim=none (message not signed) header.d=none;gmail.com; dmarc=permerror action=none header.from=amd.com; X-WSS-ID: 0NZR528-08-245-02 X-M-MSG: From: Wan Zongshun To: Ulf Hansson , CC: Wan Zongshun , Borislav Petkov , , Huang Rui , Wan Zongshun Subject: [PATCH 2/3] mmc: sdhci-pci: Add platform tuning callback for amd hs200 mode Date: Tue, 22 Dec 2015 11:40:07 -0500 Message-ID: <1450802408-16354-2-git-send-email-vincent.wan@amd.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1450802408-16354-1-git-send-email-vincent.wan@amd.com> References: <1450802408-16354-1-git-send-email-vincent.wan@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)(48376002)(575784001)(189998001)(92566002)(47776003)(97736004)(11100500001)(105586002)(101416001)(229853001)(586003)(2950100001)(5008740100001)(1220700001)(33646002)(106466001)(5001770100001)(36756003)(1096002)(87936001)(50986999)(19580395003)(5003940100001)(77096005)(50466002)(76176999)(5003600100002)(86362001)(19580405001)(53416004)(50226001);DIR:OUT;SFP:1101;SCL:1;SRVR:SN1PR12MB0862;H:atltwp02.amd.com;FPR:;SPF:None;PTR:InfoDomainNonexistent;A:1;MX:1;LANG:en; X-Microsoft-Exchange-Diagnostics: 1;SN1PR12MB0862;2:flKb6ITDxXX5k+DTqlX+73SIubnLYFBElRwLwowV67gQv//lwaWtxpqHLr0ST/2AL8xOc6x9wTpJ4vdx/gOOPNrtCcfOsKhnx7Fwx2ueTsEVN281Ybu4zkE8caBPiKkQQpfTqKNdxeAWrwX/7AonPw==;3:xu0nLieQm0WUlpYXZ3VCAk5A4iwNKoK88nCwnRCGvbAhct8w3tlw/daVUqazvIwhVzyheKvWG9dTM71J0uT1jU8ElRSde9dlphPbO1DpFKUtBWtuuKvmIoxtkgcH7+IhwHL9RvW2CXcRG5AG3seO0qyKLGax2eVW/yEBOxgVJGJDckNtPAAFtXUZZar9v1F19Q/UOPPclYkMQFKx5WiLOatXQZo69pAx8BusN6fLoYI=;25:qLzUQOBTu1MhqoHt4aTzl9sYSsW1KZjJEMW0XCILyQ3j4f3coiQXVYoUvz23N9uBBEBmW70yY8xeIWB8qi6pKm5mXcXTaOa0+94KuVh/WIFlnEV+ZAIouWn1O6GH3SbISwBLbK2igs/LZHNJIA7uSno+FTDcIcd127oRdRXjTNe+sleNywfk4F43qH6iBdF/wabtP8HKUwE3TQEieZMmjg0fTHp+PU5sj7qn0s4gJ2pcKlcYNcUocStxzoc9g/Jv9FDRs6Sb/rg6nj4Lbjk9Qg== X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:SN1PR12MB0862; X-Microsoft-Exchange-Diagnostics: 1;SN1PR12MB0862;20:UtJegFbRN2Cln7q3lbXvELUelhV8++bwnuJuuVQjU/yCuv4foc8zr/wYAjwOXgzOwxI4yJ4OX37366kuTFrjH7Mj2Ii1rXJz4bLo4Rz/iA89YaYlkiaw+2C1ngMLYuVy+7fE5J2nI49tWgLWki+5yjEL2A+17i8LHVALs35yuUBCw3srf/CR0yR0OZPUauL9oZjFxkHi8x8CPXowd8ytpPZD98aWfGRpPOdvFDxvNwwKiF/HgOHug2nsv+tR2mVoAXHsYM7z++wnbteSh+WvkceLbckzXH+YGDN3HrHjheT9LczzF9N3E+aboyoR2mSnT9FWTgqvMR6dOsJ+PjIz0eAlDMuDQytRrb1bu0D3QLgKbnuOxo9pK8mxQY0s3buaeHfGlHGY2kOy401yIvkJsQj/b9yTBlO7kJ1tUWq6GifrnNDJxaxKHRRkvPJMxoSPtHppcOZXI3fR+tVw2nTdoP5t7yeYhb5PhBtUX93ertFsxmp0B7QTotncJ4r7rMEn;4:VK1lL9IrOYegxNoixYp5cZpb2nnJXJj4JUrbEaKDNENm1ZShL/kos6R7hTYVFGT5RCOk+/GVjvgq2Hk0eY+ufjr4Gqq1ZLtaXRRYzZcs58d3/nD0mWOAxIpEpdq9EozySgo4WSE1Z2Q+mWrGpAUw9iRTeguX44QpYTjA2ZbPTgR7nTefCsH5V7aubIg+fyAV52STLCwczcP8042AumcjJisouSpgemXX4Qa79mXjCDLk/Io61aiJVNE6R1Nq9qH2aGkpoHQN+TFPteA+heL7UM2DFzlyKg0VeRB1+q2Gy9W9fXKleWYD2kMDhnGKSpB1ZvkpiazLcEqnD11bTRkj7RBz7VI8ik0fLQdB9StGFuwmqh4nWeIFRskB0FXcYpe6QXvZyvl9108vgZCUPzPy14rGsRo0sH46Mk18shDGzbY= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(767451399110); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(601004)(2401047)(8121501046)(520078)(5005006)(3002001)(10201501046);SRVR:SN1PR12MB0862;BCL:0;PCL:0;RULEID:;SRVR:SN1PR12MB0862; X-Forefront-PRVS: 0798146F16 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;SN1PR12MB0862;23:lY+VkZknPhuzQ8GROLcF+sPhwMkgF+QJtIF08lV+I?= =?us-ascii?Q?gthezcfIU46InpNmie//07VnoEMWR6wtWMI8HPb64Bx/CnymGCf39DeGGsQp?= =?us-ascii?Q?UgB2xfrqgmTKNr+buHStCwv61fe3wcKLZTMLMFd3YogjLfXqZ6/kcfhAXoih?= =?us-ascii?Q?UuyvbElz6fpTv7hyhgSQAxT0x5/g1nBMtm0NYcDJuN8EB0bP0l8vLg94kUEr?= =?us-ascii?Q?7ltp7oqTmxX3vF6VsFwPU70AKqs0jbETJjBPC0qaFT1jm+WMpwO13RGFNeJc?= =?us-ascii?Q?YJGFxFnbi1dRUYdcuNlqLeXynUx4JTc9ZY5RxxNuVXe6QWggYb3cLbsojHs4?= =?us-ascii?Q?QGmmbHJ3JVyUlR08rf6jQXumdDoFD9GCbpwIlLTCjtbaQDrr4xko0NQPkOaF?= =?us-ascii?Q?c3SJTxluaVT8IKk4dgAf9/IcOh4oZ534l/EEtESw/uTMsANG5YUleXOwP/5f?= =?us-ascii?Q?wsyYaBU+9mFOAc0hkpM9mi4WYRnss4be27MVCw4KvSXCOrQ3ykzO4f1atz1A?= =?us-ascii?Q?eX2iuob42B9W/j6dsGWxJsCc51rtQtyJNoIz6HW1bxb7hfKltUZME5HDccLT?= =?us-ascii?Q?yZKrChCMinmKh6WLDFkGXsy18InYeDiNi8Mx7kskanUa+ZPBXBnTaD4/0tSd?= =?us-ascii?Q?CBvYvJQazIiKYekXF9eY4uHYdIecwEgaqJjlxTESc3RUvzF/X0A92jJYQSlP?= =?us-ascii?Q?80ExFf5s8gBkv/CMVFVglOfHYrO7rmM6vZq+FZKd0f11JaKa6AdcePqfJfJQ?= =?us-ascii?Q?iQ699xTPhSmOjI/46ntpfdQQ80XTsRRuGApQpa4KGeY4fD28aeNQkdNNwKiO?= =?us-ascii?Q?9RvJcZSoiH3uuCzc1gVb2q6F08adQ0LqPRHS5MUk4NqVpBKk69hYPFh+lWGw?= =?us-ascii?Q?PH9CJkfiN9zZoS7rIVlaeilMB1nSQrEJrBg50cyjgi0qc6q4uCrxf4c5vm6g?= =?us-ascii?Q?d6B4ryY+EszIzuWdFEu3UUrAFDNQLv5LOzNEbKJGVY17j7XVq1m3PKU/Fkht?= =?us-ascii?Q?wk=3D?= X-Microsoft-Exchange-Diagnostics: 1;SN1PR12MB0862;5:1gO7OCRDLqK4ud1MQhVFqyokuK4UDjhzViDCk/1/+ueSH+jSZNSF+khV3MKTrZm90BSiYtt5UMvXy3FjkC2gg9PYXagvESkVnjnlAIShiTLlirg0eTMcpDyCt3o8ch84EPEnAhKbXZKWyR14lnjqfg==;24:27ZWuNEyVuA2iKWe7LLwFxzPrXj7r3YdlUNkDJdTsUSz4H4dZQOT49LQ7sX3ovLir3b11LsVJ6N3hGlG57TO0+wov3eJ0VOmCmGv7VMsslQ=;20:fGdPqVc6BRxYv2au2ufkIr6O4wYXjGuzfvTKRY5iFMTE5kNnY+CzkOcDtIqMG26OD8+hqq9DJAwlz60FDihAs2w7YpU9Htc83lG7Drv/i9uP6EjiJM+/eQkJQIWBbS7z7eNvFTZ8fNJSIxKi4Oe/PfQf4GePYhUvfiEud3ZGoHuDXLcTyNdr1mAE1OMa9Wg9z4j1S9riZGUqoo3ezTEx9jquJ4xZ0bWFEMhCaO59EmE6Ev/yFP6KxFaPk0gzNblL SpamDiagnosticOutput: 1:23 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Dec 2015 09:01:22.3214 (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: SN1PR12MB0862 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Wan Zongshun AMD hs200 mode tuning mode is not compatible with standard tuning process, so we need .platform_execute_tuning callback support in sdhci-pci-core.c, this patch is to do: 1. Add platform_execute_tuning callback in sdhci_pci_slot. 2. Implement sdhci_pci_ops.platform_execute_tuning function. Signed-off-by: Wan Zongshun --- Hi Ulf, Though modifying sdhci_pci_ops to be not const that is easy to implement my requirement, I am not sure it is right to do this. So I just follow sdhci_pci_select_drive_strength style to add new callback: sdhci_pci_platform_execute_tuning. But I also met trouble in sdhci_execute_tuning of sdhci.c, I have to suppose only sdhci_pci_platform_execute_tuning is returning -EPERM(current code, my assumption is right), so that those vendor that has no slot->platform_execute_tuning could be skipped and go next standard tuning process. If you have better idea for my requirement, please correct me. Thanks! Wan Zongshun. --- drivers/mmc/host/sdhci-pci-core.c | 23 +++++++++++++++++++++++ drivers/mmc/host/sdhci-pci.h | 1 + drivers/mmc/host/sdhci.c | 3 ++- 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/drivers/mmc/host/sdhci-pci-core.c b/drivers/mmc/host/sdhci-pci-core.c index 01c5723..e7b2bbe 100644 --- a/drivers/mmc/host/sdhci-pci-core.c +++ b/drivers/mmc/host/sdhci-pci-core.c @@ -905,8 +905,19 @@ static int amd_probe(struct sdhci_pci_chip *chip) return 0; } +static int amd_probe_slot(struct sdhci_pci_slot *slot) +{ + struct sdhci_host *host = slot->host; + + if (host->quirks2 & SDHCI_QUIRK2_CLEAR_TRANSFERMODE_REG_BEFORE_CMD) + slot->platform_execute_tuning = amd_execute_tuning; + + return 0; +} + static const struct sdhci_pci_fixes sdhci_amd = { .probe = amd_probe, + .probe_slot = amd_probe_slot, }; static const struct pci_device_id pci_ids[] = { @@ -1508,6 +1519,17 @@ static int sdhci_pci_select_drive_strength(struct sdhci_host *host, card_drv, drv_type); } +static int sdhci_pci_platform_execute_tuning(struct sdhci_host *host, + u32 opcode) +{ + struct sdhci_pci_slot *slot = sdhci_priv(host); + + if (!slot->platform_execute_tuning) + return -EPERM; + + return slot->platform_execute_tuning(host, opcode); +} + static const struct sdhci_ops sdhci_pci_ops = { .set_clock = sdhci_set_clock, .enable_dma = sdhci_pci_enable_dma, @@ -1516,6 +1538,7 @@ static const struct sdhci_ops sdhci_pci_ops = { .set_uhs_signaling = sdhci_set_uhs_signaling, .hw_reset = sdhci_pci_hw_reset, .select_drive_strength = sdhci_pci_select_drive_strength, + .platform_execute_tuning = sdhci_pci_platform_execute_tuning, }; /*****************************************************************************\ diff --git a/drivers/mmc/host/sdhci-pci.h b/drivers/mmc/host/sdhci-pci.h index d1a0b4d..48d98f1 100644 --- a/drivers/mmc/host/sdhci-pci.h +++ b/drivers/mmc/host/sdhci-pci.h @@ -83,6 +83,7 @@ struct sdhci_pci_slot { struct mmc_card *card, unsigned int max_dtr, int host_drv, int card_drv, int *drv_type); + int (*platform_execute_tuning)(struct sdhci_host *host, u32 opcode); }; struct sdhci_pci_chip { diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c index 2753b722d..2a5a6ce 100644 --- a/drivers/mmc/host/sdhci.c +++ b/drivers/mmc/host/sdhci.c @@ -1937,7 +1937,8 @@ static int sdhci_execute_tuning(struct mmc_host *mmc, u32 opcode) spin_unlock_irqrestore(&host->lock, flags); err = host->ops->platform_execute_tuning(host, opcode); sdhci_runtime_pm_put(host); - return err; + if (err != EPERM) + return err; } ctrl = sdhci_readw(host, SDHCI_HOST_CONTROL2); -- 1.9.1 From mboxrd@z Thu Jan 1 00:00:00 1970 From: Wan Zongshun Subject: [PATCH 2/3] mmc: sdhci-pci: Add platform tuning callback for amd hs200 mode Date: Tue, 22 Dec 2015 11:40:07 -0500 Message-ID: <1450802408-16354-2-git-send-email-vincent.wan@amd.com> References: <1450802408-16354-1-git-send-email-vincent.wan@amd.com> Mime-Version: 1.0 Content-Type: text/plain Return-path: In-Reply-To: <1450802408-16354-1-git-send-email-vincent.wan@amd.com> Sender: linux-kernel-owner@vger.kernel.org To: Ulf Hansson , linux-mmc@vger.kernel.org Cc: Wan Zongshun , Borislav Petkov , linux-kernel@vger.kernel.org, Huang Rui , Wan Zongshun List-Id: linux-mmc@vger.kernel.org From: Wan Zongshun AMD hs200 mode tuning mode is not compatible with standard tuning process, so we need .platform_execute_tuning callback support in sdhci-pci-core.c, this patch is to do: 1. Add platform_execute_tuning callback in sdhci_pci_slot. 2. Implement sdhci_pci_ops.platform_execute_tuning function. Signed-off-by: Wan Zongshun --- Hi Ulf, Though modifying sdhci_pci_ops to be not const that is easy to implement my requirement, I am not sure it is right to do this. So I just follow sdhci_pci_select_drive_strength style to add new callback: sdhci_pci_platform_execute_tuning. But I also met trouble in sdhci_execute_tuning of sdhci.c, I have to suppose only sdhci_pci_platform_execute_tuning is returning -EPERM(current code, my assumption is right), so that those vendor that has no slot->platform_execute_tuning could be skipped and go next standard tuning process. If you have better idea for my requirement, please correct me. Thanks! Wan Zongshun. --- drivers/mmc/host/sdhci-pci-core.c | 23 +++++++++++++++++++++++ drivers/mmc/host/sdhci-pci.h | 1 + drivers/mmc/host/sdhci.c | 3 ++- 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/drivers/mmc/host/sdhci-pci-core.c b/drivers/mmc/host/sdhci-pci-core.c index 01c5723..e7b2bbe 100644 --- a/drivers/mmc/host/sdhci-pci-core.c +++ b/drivers/mmc/host/sdhci-pci-core.c @@ -905,8 +905,19 @@ static int amd_probe(struct sdhci_pci_chip *chip) return 0; } +static int amd_probe_slot(struct sdhci_pci_slot *slot) +{ + struct sdhci_host *host = slot->host; + + if (host->quirks2 & SDHCI_QUIRK2_CLEAR_TRANSFERMODE_REG_BEFORE_CMD) + slot->platform_execute_tuning = amd_execute_tuning; + + return 0; +} + static const struct sdhci_pci_fixes sdhci_amd = { .probe = amd_probe, + .probe_slot = amd_probe_slot, }; static const struct pci_device_id pci_ids[] = { @@ -1508,6 +1519,17 @@ static int sdhci_pci_select_drive_strength(struct sdhci_host *host, card_drv, drv_type); } +static int sdhci_pci_platform_execute_tuning(struct sdhci_host *host, + u32 opcode) +{ + struct sdhci_pci_slot *slot = sdhci_priv(host); + + if (!slot->platform_execute_tuning) + return -EPERM; + + return slot->platform_execute_tuning(host, opcode); +} + static const struct sdhci_ops sdhci_pci_ops = { .set_clock = sdhci_set_clock, .enable_dma = sdhci_pci_enable_dma, @@ -1516,6 +1538,7 @@ static const struct sdhci_ops sdhci_pci_ops = { .set_uhs_signaling = sdhci_set_uhs_signaling, .hw_reset = sdhci_pci_hw_reset, .select_drive_strength = sdhci_pci_select_drive_strength, + .platform_execute_tuning = sdhci_pci_platform_execute_tuning, }; /*****************************************************************************\ diff --git a/drivers/mmc/host/sdhci-pci.h b/drivers/mmc/host/sdhci-pci.h index d1a0b4d..48d98f1 100644 --- a/drivers/mmc/host/sdhci-pci.h +++ b/drivers/mmc/host/sdhci-pci.h @@ -83,6 +83,7 @@ struct sdhci_pci_slot { struct mmc_card *card, unsigned int max_dtr, int host_drv, int card_drv, int *drv_type); + int (*platform_execute_tuning)(struct sdhci_host *host, u32 opcode); }; struct sdhci_pci_chip { diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c index 2753b722d..2a5a6ce 100644 --- a/drivers/mmc/host/sdhci.c +++ b/drivers/mmc/host/sdhci.c @@ -1937,7 +1937,8 @@ static int sdhci_execute_tuning(struct mmc_host *mmc, u32 opcode) spin_unlock_irqrestore(&host->lock, flags); err = host->ops->platform_execute_tuning(host, opcode); sdhci_runtime_pm_put(host); - return err; + if (err != EPERM) + return err; } ctrl = sdhci_readw(host, SDHCI_HOST_CONTROL2); -- 1.9.1