Received: by 2002:a05:6a10:1287:0:0:0:0 with SMTP id d7csp3698880pxv; Mon, 26 Jul 2021 09:40:25 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwTdgyS8ndOl0yZ6k4Lbrn9vUwqvGaPPsfVOOot3deVGKxmJqrfpP5E2BDNGhfIY+y6IlhN X-Received: by 2002:a17:906:1685:: with SMTP id s5mr4574025ejd.370.1627317508300; Mon, 26 Jul 2021 09:38:28 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1627317508; cv=none; d=google.com; s=arc-20160816; b=VsIcrgq+B/lSIGWLFjEpFcNHw6UoFZm/N77eXNTz/HEkDo+Org6xHLacyVXn8AnWjG f8yPyzVpFuuVU/uveSGlMKw1yQyVkWdsRSmxTtbuaNM4Dm7M6dpvfGdVonY+otlzMhk6 N2zWJoYRXKdF/+RIZC1sBcVMUX/lfQm7B8kP9Zhcyvpnt0NoHg5PrADNYVFIOnVbr2Yz huGjK82B1l68LV3weDIIiRtV0RVgkQ6Wg7QPvBENgMnLkAKGIIaunaO9lZutjtwrW5X2 oA/nzQm0qpqjB54pFVof4XfeWYUZSyXC/uifbL6YIQ0M4YSRv80Z6SZV9RDX+oaaqyZv 9OgQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=5dxPMXCytAigy3zA1kQvzLHF9MHZE5J8GWlJw8b++yY=; b=SLs6o9yLdoCs0+ImYjL958XdZDjqT6MC9a1dKDElUAs4rtrTKf24EZPNqT7yZmwe2r PD1TJ4Z9j/OEtdqr/NjTsu82AFnH4KhqF5wvNfSyiyDes4nnnV4dCrPTIPfUXNV9AlJx teNx3jNDsLHswnIcPj5kPQbtRNW0TmFNC2nXGvBaH+ew5BthltoIOfLbMIRtOd1SyCre 5JPzuNhZUJ9Ilwzitju8bKJB0t/QPnQou5ndAoO1mpJ3rrU29boA5dPOr498cEjCMRrX /pI1vYdMARVlqdxlsY/EPKZC0QXO2ssO/O13rjrj1vyQUYGEdclbpuW5aYjGTXPaJVP3 z35g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=SJ9PT+q2; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id f12si399450edw.528.2021.07.26.09.38.05; Mon, 26 Jul 2021 09:38:28 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=SJ9PT+q2; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239691AbhGZPyO (ORCPT + 99 others); Mon, 26 Jul 2021 11:54:14 -0400 Received: from mail.kernel.org ([198.145.29.99]:49582 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233477AbhGZPcz (ORCPT ); Mon, 26 Jul 2021 11:32:55 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 79A8F60F5D; Mon, 26 Jul 2021 16:13:23 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1627316004; bh=SxQffA4RCMBq+iFwtYtOSme/ywGd6w1uoHDyzguM2BM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=SJ9PT+q2i2Wn+aRl6aZBITkY5JiiKtKeLyMGgwRxKRCbKM1R6h5+/0kWSY82ZhD1U aIL3tfujb+Bx21LolZRzcLFrrS3c7hCA/n49W1zcXoA63VT3S3ivzg5XjXOJTO/tf/ uO1oW/BzCxbp6STksEdlg8KdFiJC19eUAfGL/9kA= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Alexandru Tachici , Florian Fainelli , Mark Brown , Sasha Levin Subject: [PATCH 5.13 115/223] spi: spi-bcm2835: Fix deadlock Date: Mon, 26 Jul 2021 17:38:27 +0200 Message-Id: <20210726153850.035394678@linuxfoundation.org> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20210726153846.245305071@linuxfoundation.org> References: <20210726153846.245305071@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Alexandru Tachici [ Upstream commit c45c1e82bba130db4f19d9dbc1deefcf4ea994ed ] The bcm2835_spi_transfer_one function can create a deadlock if it is called while another thread already has the CCF lock. Signed-off-by: Alexandru Tachici Fixes: f8043872e796 ("spi: add driver for BCM2835") Reviewed-by: Florian Fainelli Link: https://lore.kernel.org/r/20210716210245.13240-2-alexandru.tachici@analog.com Signed-off-by: Mark Brown Signed-off-by: Sasha Levin --- drivers/spi/spi-bcm2835.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/drivers/spi/spi-bcm2835.c b/drivers/spi/spi-bcm2835.c index fe40626e45aa..61cbcc7e2121 100644 --- a/drivers/spi/spi-bcm2835.c +++ b/drivers/spi/spi-bcm2835.c @@ -84,6 +84,7 @@ MODULE_PARM_DESC(polling_limit_us, * struct bcm2835_spi - BCM2835 SPI controller * @regs: base address of register map * @clk: core clock, divided to calculate serial clock + * @clk_hz: core clock cached speed * @irq: interrupt, signals TX FIFO empty or RX FIFO ¾ full * @tfr: SPI transfer currently processed * @ctlr: SPI controller reverse lookup @@ -124,6 +125,7 @@ MODULE_PARM_DESC(polling_limit_us, struct bcm2835_spi { void __iomem *regs; struct clk *clk; + unsigned long clk_hz; int irq; struct spi_transfer *tfr; struct spi_controller *ctlr; @@ -1082,19 +1084,18 @@ static int bcm2835_spi_transfer_one(struct spi_controller *ctlr, struct spi_transfer *tfr) { struct bcm2835_spi *bs = spi_controller_get_devdata(ctlr); - unsigned long spi_hz, clk_hz, cdiv; + unsigned long spi_hz, cdiv; unsigned long hz_per_byte, byte_limit; u32 cs = bs->prepare_cs[spi->chip_select]; /* set clock */ spi_hz = tfr->speed_hz; - clk_hz = clk_get_rate(bs->clk); - if (spi_hz >= clk_hz / 2) { + if (spi_hz >= bs->clk_hz / 2) { cdiv = 2; /* clk_hz/2 is the fastest we can go */ } else if (spi_hz) { /* CDIV must be a multiple of two */ - cdiv = DIV_ROUND_UP(clk_hz, spi_hz); + cdiv = DIV_ROUND_UP(bs->clk_hz, spi_hz); cdiv += (cdiv % 2); if (cdiv >= 65536) @@ -1102,7 +1103,7 @@ static int bcm2835_spi_transfer_one(struct spi_controller *ctlr, } else { cdiv = 0; /* 0 is the slowest we can go */ } - tfr->effective_speed_hz = cdiv ? (clk_hz / cdiv) : (clk_hz / 65536); + tfr->effective_speed_hz = cdiv ? (bs->clk_hz / cdiv) : (bs->clk_hz / 65536); bcm2835_wr(bs, BCM2835_SPI_CLK, cdiv); /* handle all the 3-wire mode */ @@ -1320,6 +1321,7 @@ static int bcm2835_spi_probe(struct platform_device *pdev) return bs->irq ? bs->irq : -ENODEV; clk_prepare_enable(bs->clk); + bs->clk_hz = clk_get_rate(bs->clk); err = bcm2835_dma_init(ctlr, &pdev->dev, bs); if (err) -- 2.30.2