Received: by 2002:a05:6a10:1287:0:0:0:0 with SMTP id d7csp1631836pxv; Fri, 16 Jul 2021 13:56:32 -0700 (PDT) X-Google-Smtp-Source: ABdhPJw4/Puka0EcTP6ry5zIN5J5tBRl1AyBdBhyeByutLQUL4ZYPwF/GbHXWmyGPPDeLOEwiRGT X-Received: by 2002:a02:cc19:: with SMTP id n25mr10560485jap.140.1626468992496; Fri, 16 Jul 2021 13:56:32 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1626468992; cv=none; d=google.com; s=arc-20160816; b=TSD7xg4aW58qo6XEj5YSZqywAE/Uo5aNQqZAWrCc6KEfRA9E0iE5F4Tz08zIziPqOM DA+wju91Dv+FXJaGJXsmxhcTlQBOYiO0kwTWUU+3yg+BSX65ZXJWQraFB2Bz+2/6/Aag FV5CGKdYo4o/xh2EEEvBfgJ9PoivPXwH1OzUd140DPQ++CBtyzf0ZIskmvQf4pXoxDnk cRX5c5uzX9yiAY2NUGa0gEElaPYc8hkVPDMQ39Nxk7Nwt7jSp8Hu3dOxIG7StBulSbAt cUOuWWo32ZJ5Yn4xaLc/XTqeDSlsAhHBlmuoGEGPwOIujn9t+29/payzEp44xDeSA3v4 edYA== 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 :references:in-reply-to:message-id:date:subject:cc:to:from; bh=QQRcTSve7EdWBd95/bLRE1usU1F1qS6AtQTboDxQPZA=; b=bkuRXXV0oxLV80vU7N5kvB07NbRsHAB7U/j8xRQtXirZozUNpUjARsd1troMz6E3dH YneCeagYRMUfammfAoDa73ei2H8ACsTCTo8Ac6NllmvczDKVvB4Dgb1ci1C3e59zKCeo UXs1/fEa61g1DjcJnBQjBPgGdLMy7Rlig6aYDxIhqz/yaAZA/zoEgv1zyC5YSwFBDmf6 eNjB9KR8WdkIMzty4WlXPBgUfz12plxbAdtvsqFjjwDasGz310M3QJ/vxOGBjyxo/NKV rlbQcdUU4Eo1zp93URz8jvdSLj+FaWBQD+qp3pnHxmmmbwS760f+6cObkloRBM78GTFv fYNQ== ARC-Authentication-Results: i=1; mx.google.com; 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=fail (p=NONE sp=NONE dis=NONE) header.from=analog.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id t11si11774454ils.106.2021.07.16.13.56.19; Fri, 16 Jul 2021 13:56:32 -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; 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=fail (p=NONE sp=NONE dis=NONE) header.from=analog.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234610AbhGPU5b (ORCPT + 99 others); Fri, 16 Jul 2021 16:57:31 -0400 Received: from mx0a-00128a01.pphosted.com ([148.163.135.77]:8462 "EHLO mx0a-00128a01.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230415AbhGPU5a (ORCPT ); Fri, 16 Jul 2021 16:57:30 -0400 Received: from pps.filterd (m0167089.ppops.net [127.0.0.1]) by mx0a-00128a01.pphosted.com (8.16.0.43/8.16.0.43) with SMTP id 16GKfGVM011753; Fri, 16 Jul 2021 16:54:31 -0400 Received: from nwd2mta4.analog.com ([137.71.173.58]) by mx0a-00128a01.pphosted.com with ESMTP id 39tw63kv3e-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 16 Jul 2021 16:54:31 -0400 Received: from SCSQMBX11.ad.analog.com (SCSQMBX11.ad.analog.com [10.77.17.10]) by nwd2mta4.analog.com (8.14.7/8.14.7) with ESMTP id 16GKsTNl048128 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Fri, 16 Jul 2021 16:54:29 -0400 Received: from SCSQMBX11.ad.analog.com (10.77.17.10) by SCSQMBX11.ad.analog.com (10.77.17.10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.858.5; Fri, 16 Jul 2021 13:54:28 -0700 Received: from zeus.spd.analog.com (10.66.68.11) by scsqmbx11.ad.analog.com (10.77.17.10) with Microsoft SMTP Server id 15.2.858.5 via Frontend Transport; Fri, 16 Jul 2021 13:54:27 -0700 Received: from localhost.localdomain ([10.48.65.12]) by zeus.spd.analog.com (8.15.1/8.15.1) with ESMTP id 16GKsNDT003387; Fri, 16 Jul 2021 16:54:25 -0400 From: To: , , CC: , , , , , , , Alexandru Tachici Subject: [PATCH 1/1] spi: spi-bcm2835: Fix deadlock Date: Sat, 17 Jul 2021 00:02:45 +0300 Message-ID: <20210716210245.13240-2-alexandru.tachici@analog.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20210716210245.13240-1-alexandru.tachici@analog.com> References: <20210716210245.13240-1-alexandru.tachici@analog.com> MIME-Version: 1.0 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 8bit X-ADIRuleOP-NewSCL: Rule Triggered X-Proofpoint-GUID: jOCQ3VaieD2Z6CMh00k2QwwuZfjBWmjl X-Proofpoint-ORIG-GUID: jOCQ3VaieD2Z6CMh00k2QwwuZfjBWmjl X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.391,18.0.790 definitions=2021-07-16_09:2021-07-16,2021-07-16 signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 mlxscore=0 suspectscore=0 impostorscore=0 mlxlogscore=841 spamscore=0 lowpriorityscore=0 malwarescore=0 clxscore=1015 phishscore=0 priorityscore=1501 adultscore=0 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2104190000 definitions=main-2107160131 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Alexandru Tachici 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") --- 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 5f8771fe1a31..775c0bf2f923 100644 --- a/drivers/spi/spi-bcm2835.c +++ b/drivers/spi/spi-bcm2835.c @@ -83,6 +83,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 @@ -116,6 +117,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; @@ -1045,19 +1047,18 @@ static int bcm2835_spi_transfer_one(struct spi_controller *ctlr, { struct bcm2835_spi *bs = spi_controller_get_devdata(ctlr); struct bcm2835_spidev *slv = spi_get_ctldata(spi); - unsigned long spi_hz, clk_hz, cdiv; + unsigned long spi_hz, cdiv; unsigned long hz_per_byte, byte_limit; u32 cs = slv->prepare_cs; /* 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) @@ -1065,7 +1066,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 */ @@ -1354,6 +1355,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.25.1