From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753806AbdA0CJa (ORCPT ); Thu, 26 Jan 2017 21:09:30 -0500 Received: from lucky1.263xmail.com ([211.157.147.131]:53408 "EHLO lucky1.263xmail.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752796AbdA0CJ1 (ORCPT ); Thu, 26 Jan 2017 21:09:27 -0500 X-263anti-spam: KSV:0;BIG:0; X-MAIL-GRAY: 1 X-MAIL-DELIVERY: 0 X-KSVirus-check: 0 X-ADDR-CHECKED4: 1 X-ABS-CHECKED: 1 X-SKE-CHECKED: 1 X-RL-SENDER: shawn.lin@rock-chips.com X-FST-TO: linux-kernel@vger.kernel.org X-SENDER-IP: 220.200.59.95 X-LOGIN-NAME: shawn.lin@rock-chips.com X-UNIQUE-TAG: X-ATTACHMENT-NUM: 0 X-DNS-TYPE: 0 Subject: Re: [PATCH 12/13] mmc: bcm2835: move timeout to thread context To: Gerd Hoffmann , linux-rpi-kernel@lists.infradead.org References: <1485473846-24537-1-git-send-email-kraxel@redhat.com> <1485473846-24537-13-git-send-email-kraxel@redhat.com> Cc: Stefan Wahren , Eric Anholt , Ulf Hansson , linux-mmc@vger.kernel.org, Florian Fainelli , Ray Jui , Scott Branden , "maintainer:BROADCOM BCM281XX/BCM11XXX/BCM216XX ARM ARCHITE..." , Stephen Warren , Lee Jones , "moderated list:BROADCOM BCM2835 ARM ARCHITECTURE" , open list From: Shawn Lin Message-ID: <6ba37cf8-7fbb-3067-1b5a-b8e01ffff532@rock-chips.com> Date: Fri, 27 Jan 2017 10:08:53 +0800 User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:45.0) Gecko/20100101 Thunderbird/45.6.0 MIME-Version: 1.0 In-Reply-To: <1485473846-24537-13-git-send-email-kraxel@redhat.com> Content-Type: text/plain; charset=gbk; format=flowed Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 2017/1/27 7:37, Gerd Hoffmann wrote: > Signed-off-by: Gerd Hoffmann > --- > drivers/mmc/host/bcm2835.c | 22 +++++++++++----------- > 1 file changed, 11 insertions(+), 11 deletions(-) > > diff --git a/drivers/mmc/host/bcm2835.c b/drivers/mmc/host/bcm2835.c > index fc2d02f..82caddc 100644 > --- a/drivers/mmc/host/bcm2835.c > +++ b/drivers/mmc/host/bcm2835.c > @@ -147,7 +147,7 @@ struct bcm2835_host { > u32 pio_timeout; /* In jiffies */ > int clock; /* Current clock speed */ > unsigned int max_clk; /* Max possible freq */ > - struct timer_list timer; /* Timer for timeouts */ > + struct delayed_work timeout_work; /* Timer for timeouts */ > struct sg_mapping_iter sg_miter; /* SG state for PIO */ > unsigned int blocks; /* remaining PIO blocks */ > int irq; /* Device IRQ */ > @@ -669,12 +669,11 @@ bool bcm2835_send_command(struct bcm2835_host *host, > return false; > } > > - timeout = jiffies; > if (!cmd->data && cmd->busy_timeout > 9000) > - timeout += DIV_ROUND_UP(cmd->busy_timeout, 1000) * HZ + HZ; > + timeout = DIV_ROUND_UP(cmd->busy_timeout, 1000) * HZ + HZ; You should elaborate more to help folks understand what you want to do here... > else > - timeout += 10 * HZ; > - mod_timer(&host->timer, timeout); > + timeout = 10 * HZ; > + schedule_delayed_work(&host->timeout_work, timeout); > > host->cmd = cmd; > > @@ -912,9 +911,11 @@ static void bcm2835_finish_command(struct bcm2835_host *host) > } > } > > -static void bcm2835_timeout(unsigned long data) > +static void bcm2835_timeout(struct work_struct *work) > { > - struct bcm2835_host *host = (struct bcm2835_host *)data; > + struct delayed_work *d = to_delayed_work(work); > + struct bcm2835_host *host = > + container_of(d, struct bcm2835_host, timeout_work); > struct device *dev = &host->pdev->dev; > > mutex_lock(&host->mutex); > @@ -1303,7 +1304,7 @@ static void bcm2835_finish_request(struct bcm2835_host *host) > struct dma_chan *terminate_chan = NULL; > struct mmc_request *mrq; > > - del_timer(&host->timer); > + cancel_delayed_work(&host->timeout_work); > > mrq = host->mrq; > > @@ -1387,8 +1388,7 @@ int bcm2835_add_host(struct bcm2835_host *host) > /* report supported voltage ranges */ > mmc->ocr_avail = MMC_VDD_32_33 | MMC_VDD_33_34; > > - setup_timer(&host->timer, bcm2835_timeout, > - (unsigned long)host); > + INIT_DELAYED_WORK(&host->timeout_work, bcm2835_timeout); > > /* Set interrupt enables */ > host->hcfg = SDHCFG_BUSY_IRPT_EN; > @@ -1523,7 +1523,7 @@ static int bcm2835_remove(struct platform_device *pdev) > > free_irq(host->irq, host); > > - del_timer_sync(&host->timer); > + cancel_delayed_work_sync(&host->timeout_work); > > mmc_free_host(host->mmc); > platform_set_drvdata(pdev, NULL); > -- Best Regards Shawn Lin