From patchwork Wed Aug 21 13:51:31 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Seungwon Jeon X-Patchwork-Id: 2847755 Return-Path: X-Original-To: patchwork-linux-mmc@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork2.web.kernel.org (Postfix) with ESMTP id 2C71CBF546 for ; Wed, 21 Aug 2013 13:51:37 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id D4209204CD for ; Wed, 21 Aug 2013 13:51:35 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 70AD520490 for ; Wed, 21 Aug 2013 13:51:34 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751692Ab3HUNvd (ORCPT ); Wed, 21 Aug 2013 09:51:33 -0400 Received: from mailout1.samsung.com ([203.254.224.24]:37941 "EHLO mailout1.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751574Ab3HUNvd (ORCPT ); Wed, 21 Aug 2013 09:51:33 -0400 Received: from epcpsbgr4.samsung.com (u144.gpu120.samsung.co.kr [203.254.230.144]) by mailout1.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0MRV00A0EVTL2V10@mailout1.samsung.com> for linux-mmc@vger.kernel.org; Wed, 21 Aug 2013 22:51:31 +0900 (KST) Received: from epcpsbgm2.samsung.com ( [203.254.230.49]) by epcpsbgr4.samsung.com (EPCPMTA) with SMTP id C7.7C.29708.3E5C4125; Wed, 21 Aug 2013 22:51:31 +0900 (KST) X-AuditID: cbfee690-b7f6f6d00000740c-37-5214c5e31e74 Received: from epmmp2 ( [203.254.227.17]) by epcpsbgm2.samsung.com (EPCPMTA) with SMTP id 4B.D1.31505.3E5C4125; Wed, 21 Aug 2013 22:51:31 +0900 (KST) Received: from DOTGIHJUN01 ([12.23.118.161]) by mmp2.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTPA id <0MRV001U4VTVP040@mmp2.samsung.com>; Wed, 21 Aug 2013 22:51:31 +0900 (KST) From: Seungwon Jeon To: linux-mmc@vger.kernel.org Cc: 'Chris Ball' , 'Jaehoon Chung' , 'Alim Akhtar' References: In-reply-to: Subject: [PATCH 12/14] mmc: dw_mmc: gather each reset code into functions Date: Wed, 21 Aug 2013 22:51:31 +0900 Message-id: <003101ce9e75$8aa2f260$9fe8d720$%jun@samsung.com> MIME-version: 1.0 Content-type: text/plain; charset=utf-8 Content-transfer-encoding: 7bit X-Mailer: Microsoft Office Outlook 12.0 Thread-index: Ac03z3aCvVFr8FaITt2vKVQKst76fw3OcIrwS9fJ1BA= Content-language: ko X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrKIsWRmVeSWpSXmKPExsVy+t8zQ93HR0WCDN7+0bF4MG8bm8X21xvZ LG78amO1OPK/n9GBxePQlbWMHn1bVjF6fN4kF8AcxWWTkpqTWZZapG+XwJWx8tw9loJ/GhWb j+5mb2BcqtDFyMkhIWAi8WLTKmYIW0ziwr31bF2MXBxCAssYJR6fWsQOU9T9cTcTRGI6o8Tm 34+ZIZw/jBI75i9mA6liE9CS+PvmDdgoEQFZiZ9/LoDFmQXKJN7euQ8U5wBq4JZY3RwEEuYU 4JFY96cTLCws4CnxbUkiSJhFQFWifcYLVhCbV8BWYt3UOVC2oMSPyfdYQMqZBdQlpkzJhRgu L7F5zVuwKRJA4Ud/dSH2W0kcXn6EFaJERGLfi3eMIAdLCBxil1hy8AMTxCoBiW+TD7FA9MpK bDoADQZJiYMrbrBMYJSYhWTxLITFs5AsnoVkwwJGllWMoqkFyQXFSelFJnrFibnFpXnpesn5 uZsYIVE4YQfjvQPWhxiTgbZPZJYSTc4HRnFeSbyhsZmRhamJqbGRuaUZacJK4rzqLdaBQgLp iSWp2ampBalF8UWlOanFhxiZODilGhi1z1u2JzUkFM8Re7A12fxHilzNTH+hn8JbnKJsft31 6NUxzRRfeXLiiyeHj86Y5HPCckJkO39DpwS3z6oDZpGJMkcfy81pOto6IfyYgE/sKyUlzq+n zrgtO/ju0ZF/VgcrvXqMl++p/8NXf7Spx7f+bdjqQ5v55b3DFso91/w7KWn7ko0PVSqVWIoz Eg21mIuKEwFpABZ92AIAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrEKsWRmVeSWpSXmKPExsVy+t9jQd3HR0WCDKaf1bB4MG8bm8X21xvZ LG78amO1OPK/n9GBxePQlbWMHn1bVjF6fN4kF8Ac1cBok5GamJJapJCal5yfkpmXbqvkHRzv HG9qZmCoa2hpYa6kkJeYm2qr5OIToOuWmQO0TkmhLDGnFCgUkFhcrKRvh2lCaIibrgVMY4Su b0gQXI+RARpIWMeYsfLcPZaCfxoVm4/uZm9gXKrQxcjJISFgItH9cTcThC0mceHeerYuRi4O IYHpjBKbfz9mhnD+MErsmL+YDaSKTUBL4u+bN8wgtoiArMTPPxfA4swCZRJv79wHinMANXBL rG4OAglzCvBIrPvTCRYWFvCU+LYkESTMIqAq0T7jBSuIzStgK7Fu6hwoW1Dix+R7LCDlzALq ElOm5EIMl5fYvOYt2BQJoPCjv7oQ+60kDi8/wgpRIiKx78U7xgmMQrOQDJqFMGgWkkGzkHQs YGRZxSiaWpBcUJyUnmukV5yYW1yal66XnJ+7iREc48+kdzCuarA4xCjAwajEw3thp0iQEGti WXFl7iFGCQ5mJRHez/uBQrwpiZVVqUX58UWlOanFhxiTgd6cyCwlmpwPTD95JfGGxiZmRpZG ZhZGJubmpAkrifMebLUOFBJITyxJzU5NLUgtgtnCxMEp1cDIlNZ78esygxfaZ/c6rLA8vO5+ 3aeMudP3Ff+4d8TWb3Vgee622f73TI95bmM8LeV20r72oo/P+u+Fq3UzRRc82FfO9O2N0+Pt k1zW8rW0Nx9VYeFJuhtemhUy2eBbWL3XTWcjXX5mt7nb+K9IZPzY0XvIMeru5R3Pj2Rsmclj Ppf9V3T1ok1uSizFGYmGWsxFxYkAO+uMtzUDAAA= DLP-Filter: Pass X-MTR: 20000000000000000@CPGS X-CFilter-Loop: Reflected Sender: linux-mmc-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-mmc@vger.kernel.org X-Spam-Status: No, score=-9.7 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, 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 There are three resets in CTRL register. FIFO reset is especially used in several points with the same routine. It could be replaced with one function and the others may be applied similarly if needed. So, mci_wait_reset is modified to allow various bit field of reset Signed-off-by: Seungwon Jeon --- drivers/mmc/host/dw_mmc.c | 81 ++++++++++++++++++++++++--------------------- 1 files changed, 43 insertions(+), 38 deletions(-) diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c index 2973f55e..e4ee6e5 100644 --- a/drivers/mmc/host/dw_mmc.c +++ b/drivers/mmc/host/dw_mmc.c @@ -110,6 +110,9 @@ static const u8 tuning_blk_pattern_8bit[] = { 0xff, 0x77, 0x77, 0xff, 0x77, 0xbb, 0xdd, 0xee, }; +static inline bool dw_mci_fifo_reset(struct dw_mci *host); +static inline bool dw_mci_ctrl_all_reset(struct dw_mci *host); + #if defined(CONFIG_DEBUG_FS) static int dw_mci_req_show(struct seq_file *s, void *v) { @@ -1192,7 +1195,7 @@ static int dw_mci_command_complete(struct dw_mci *host, struct mmc_command *cmd) static int dw_mci_data_complete(struct dw_mci *host, struct mmc_data *data) { - u32 status = host->data_status, ctrl; + u32 status = host->data_status; if (status & DW_MCI_DATA_ERROR_FLAGS) { if (status & SDMMC_INT_DRTO) { @@ -1222,15 +1225,9 @@ static int dw_mci_data_complete(struct dw_mci *host, struct mmc_data *data) /* * After an error, there may be data lingering - * in the FIFO, so reset it - doing so - * generates a block interrupt, hence setting - * the scatter-gather pointer to NULL. + * in the FIFO */ - sg_miter_stop(&host->sg_miter); - host->sg = NULL; - ctrl = mci_readl(host, CTRL); - ctrl |= SDMMC_CTRL_FIFO_RESET; - mci_writel(host, CTRL, ctrl); + dw_mci_fifo_reset(host); } else { data->bytes_xfered = data->blocks * data->blksz; data->error = 0; @@ -1247,7 +1244,6 @@ static void dw_mci_tasklet_func(unsigned long priv) struct mmc_request *mrq; enum dw_mci_state state; enum dw_mci_state prev_state; - u32 ctrl; unsigned int err; spin_lock(&host->lock); @@ -1347,13 +1343,8 @@ static void dw_mci_tasklet_func(unsigned long priv) break; /* CMD error in data command */ - if (mrq->cmd->error && mrq->data) { - sg_miter_stop(&host->sg_miter); - host->sg = NULL; - ctrl = mci_readl(host, CTRL); - ctrl |= SDMMC_CTRL_FIFO_RESET; - mci_writel(host, CTRL, ctrl); - } + if (mrq->cmd->error && mrq->data) + dw_mci_fifo_reset(host); host->cmd = NULL; host->data = NULL; @@ -1973,18 +1964,8 @@ static void dw_mci_work_routine_card(struct work_struct *work) if (present == 0) { clear_bit(DW_MMC_CARD_PRESENT, &slot->flags); - /* - * Clear down the FIFO - doing so generates a - * block interrupt, hence setting the - * scatter-gather pointer to NULL. - */ - sg_miter_stop(&host->sg_miter); - host->sg = NULL; - - ctrl = mci_readl(host, CTRL); - ctrl |= SDMMC_CTRL_FIFO_RESET; - mci_writel(host, CTRL, ctrl); - + /* Clear down the FIFO */ + dw_mci_fifo_reset(host); #ifdef CONFIG_MMC_DW_IDMAC ctrl = mci_readl(host, BMOD); /* Software reset of DMA */ @@ -2288,27 +2269,51 @@ no_dma: return; } -static bool mci_wait_reset(struct device *dev, struct dw_mci *host) +static bool dw_mci_ctrl_reset(struct dw_mci *host, u32 reset) { unsigned long timeout = jiffies + msecs_to_jiffies(500); - unsigned int ctrl; + u32 ctrl; - mci_writel(host, CTRL, (SDMMC_CTRL_RESET | SDMMC_CTRL_FIFO_RESET | - SDMMC_CTRL_DMA_RESET)); + ctrl = mci_readl(host, CTRL); + ctrl |= reset; + mci_writel(host, CTRL, ctrl); /* wait till resets clear */ do { ctrl = mci_readl(host, CTRL); - if (!(ctrl & (SDMMC_CTRL_RESET | SDMMC_CTRL_FIFO_RESET | - SDMMC_CTRL_DMA_RESET))) + if (!(ctrl & reset)) return true; } while (time_before(jiffies, timeout)); - dev_err(dev, "Timeout resetting block (ctrl %#x)\n", ctrl); + dev_err(host->dev, + "Timeout resetting block (ctrl reset %#x)\n", + ctrl & reset); return false; } +static inline bool dw_mci_fifo_reset(struct dw_mci *host) +{ + /* + * Reseting generates a block interrupt, hence setting + * the scatter-gather pointer to NULL. + */ + if (host->sg) { + sg_miter_stop(&host->sg_miter); + host->sg = NULL; + } + + return dw_mci_ctrl_reset(host, SDMMC_CTRL_FIFO_RESET); +} + +static inline bool dw_mci_ctrl_all_reset(struct dw_mci *host) +{ + return dw_mci_ctrl_reset(host, + SDMMC_CTRL_FIFO_RESET | + SDMMC_CTRL_RESET | + SDMMC_CTRL_DMA_RESET); +} + #ifdef CONFIG_OF static struct dw_mci_of_quirks { char *quirk; @@ -2507,7 +2512,7 @@ int dw_mci_probe(struct dw_mci *host) } /* Reset all blocks */ - if (!mci_wait_reset(host->dev, host)) + if (!dw_mci_ctrl_all_reset(host)) return -ENODEV; host->dma_ops = host->pdata->dma_ops; @@ -2713,7 +2718,7 @@ int dw_mci_resume(struct dw_mci *host) } } - if (!mci_wait_reset(host->dev, host)) { + if (!dw_mci_ctrl_all_reset(host)) { ret = -ENODEV; return ret; }