From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-9.8 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3637BC433E2 for ; Fri, 19 Jun 2020 16:39:08 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 0D1CB21527 for ; Fri, 19 Jun 2020 16:39:08 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1592584748; bh=TP6ABCrW69/hmiZc5C5fJ7jMLpqQ6iQU/FXYwUyuPnM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:List-ID:From; b=VphkefcCPPcGycN7aAqbTsNXySKvz4LuEbJHDBleBauzLRl5qb3bvTQfPw4SuBRfJ FEUuspz6fXcZIHwZL6JU7Y3YiHZO1xvf1lmXFC9JYBk4kN52LbA8MhuMnDfllWOWL2 QN67jt5eFVLG1xudsmIhQenPn1TFf6GgHGL3zT+A= Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2388876AbgFSOqt (ORCPT ); Fri, 19 Jun 2020 10:46:49 -0400 Received: from mail.kernel.org ([198.145.29.99]:38704 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2388283AbgFSOqs (ORCPT ); Fri, 19 Jun 2020 10:46:48 -0400 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 8DF8220DD4; Fri, 19 Jun 2020 14:46:47 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1592578008; bh=TP6ABCrW69/hmiZc5C5fJ7jMLpqQ6iQU/FXYwUyuPnM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=1yXFlPlz7hxCNYq+7LTzJrEae2q40IFLyAN8FHhI2aNcpK43ouy2IoczGCW7thCk1 FHVmLg9buJDdIWNCjxZrIY2ZGUTh/PXmWzFxkgK1/TmV1TT2M1qSZuekYViRp/LQvl h2ceBuHydwilYkAxD3RzLHhPiFB82s3N5GCRwvgI= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Lukas Wunner , Linus Walleij , Mark Brown , Sasha Levin Subject: [PATCH 4.14 046/190] spi: Fix controller unregister order Date: Fri, 19 Jun 2020 16:31:31 +0200 Message-Id: <20200619141635.900418169@linuxfoundation.org> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20200619141633.446429600@linuxfoundation.org> References: <20200619141633.446429600@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: stable-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: stable@vger.kernel.org From: Lukas Wunner [ Upstream commit 84855678add8aba927faf76bc2f130a40f94b6f7 ] When an SPI controller unregisters, it unbinds all its slave devices. For this, their drivers may need to access the SPI bus, e.g. to quiesce interrupts. However since commit ffbbdd21329f ("spi: create a message queueing infrastructure"), spi_destroy_queue() is executed before unbinding the slaves. It sets ctlr->running = false, thereby preventing SPI bus access and causing unbinding of slave devices to fail. Fix by unbinding slaves before calling spi_destroy_queue(). Fixes: ffbbdd21329f ("spi: create a message queueing infrastructure") Signed-off-by: Lukas Wunner Cc: stable@vger.kernel.org # v3.4+ Cc: Linus Walleij Link: https://lore.kernel.org/r/8aaf9d44c153fe233b17bc2dec4eb679898d7e7b.1589557526.git.lukas@wunner.de Signed-off-by: Mark Brown Signed-off-by: Sasha Levin --- drivers/spi/spi.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c index 8cc1b21d00d3..49eee894f51d 100644 --- a/drivers/spi/spi.c +++ b/drivers/spi/spi.c @@ -2265,6 +2265,8 @@ void spi_unregister_controller(struct spi_controller *ctlr) struct spi_controller *found; int id = ctlr->bus_num; + device_for_each_child(&ctlr->dev, NULL, __unregister); + /* First make sure that this controller was ever added */ mutex_lock(&board_lock); found = idr_find(&spi_master_idr, id); @@ -2277,7 +2279,6 @@ void spi_unregister_controller(struct spi_controller *ctlr) list_del(&ctlr->list); mutex_unlock(&board_lock); - device_for_each_child(&ctlr->dev, NULL, __unregister); device_unregister(&ctlr->dev); /* free bus id */ mutex_lock(&board_lock); -- 2.25.1