From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pf1-f180.google.com (mail-pf1-f180.google.com [209.85.210.180]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 59BE2322527 for ; Wed, 15 Apr 2026 05:08:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.180 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776229698; cv=none; b=Mgxuw8hRO6c6ZPPFPwHnAIR+Awpev9NoxvogDE7TUrjmd9S6Rtt5JCtbz1729EAKDbGSGr6QBIWRIWWXBlMFPLq+T7cOZhEI7jwxM9Xrzhg+edj5NTAfj4eP0TcYD0O1Ziu4Uzd/XsxERCUIAV9s6PsOlrM3K9Vu8ToaoOi2PWs= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776229698; c=relaxed/simple; bh=LOhrsG8Pz8jrQhalvA+AyiSQI74st8YiwXNOTXJehnk=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=WkQvlig4yqXAA3vryXtoAuP44lyfckH0fJXq19v5ZKqiZDyfmxJm1HOc+35BkpW8amLp2S8fdqwbsx6V/MBjEeKTelQwYmXZjjmP6xUMPYGYMUIr/wL725RFPjCwHCb50hTP+8IbbPYkckv3UltX12Axa31gHC0BDM5wNJffirU= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=XkebxE/u; arc=none smtp.client-ip=209.85.210.180 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="XkebxE/u" Received: by mail-pf1-f180.google.com with SMTP id d2e1a72fcca58-82c70e4654eso2736174b3a.2 for ; Tue, 14 Apr 2026 22:08:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1776229697; x=1776834497; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=yv0u5blj3D1Jrxi3hUt1Z6abAjaZCmKIFZM6/uPjCsQ=; b=XkebxE/uaGNv949R4rAzEQ6MOJpComPJxtPxRFLIq0iQt2dCnXetVcHH4mG22yWdrJ OzEkX63VEanMaN2uwHgNs/pPU+YzoDeEDPXcQ4c+BLyFX1Z7iPsUh6a9nrd3LHgPdG2d 8nze1bZK1yR2HkyHcjG8FeA/UE9s05fD6gqM56wVRwj4M4UC9vScb6V5+326VV0K0k3V YsNz4VLYSm/pamxIU2ZsIiiOJtnY1htDCn2JwzqSH6pcLRxSCYau746Xdgvyw1IGqLP5 FxjJpkWDyZ45L8vQt0KoKtpRPg/poO/Z1SiPpW5Up9lIrvbYo403rotE83k+VtNv/ZqC +f0A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776229697; x=1776834497; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=yv0u5blj3D1Jrxi3hUt1Z6abAjaZCmKIFZM6/uPjCsQ=; b=E96oKi0RtPKd/8ViU3s9m3mPRg90MaGCYe4SXkR1Guay0uVraM/zmEG9eUicBGTiPB hVu+30RNzP4b5DoQEbyh3fG3xzoG0vcw9N4bZrBRJ2OP8Gus3XaKgQ0VFtLKdROHqVG8 JR1+XuMpbxWT9azQrrITw6HqokKmkERh2XIcwrLXOeQ7Q7udoqskwd90aUgYfGJuI8Uh KqzWLL0ucnG94QQMN7lT1WNoMxJc94oRyWPwd47Qokk0dTjiZIypDRZnXFwlmB3MECAs OOZMpZrZ7QaVD7pAgsLxI5AAt3E+2pHIfbQZXe9EB4ynwI9I3+rSGzZ4uUQ+R3tkAPnJ 7oPA== X-Forwarded-Encrypted: i=1; AFNElJ/CnIsrz0+lZQ1vFPziI9VF0HgOCPqppjfVcdJ+XstktWUf4BC1m/KpbZcL6qXLPqGN289lYwu6iVExkjo=@vger.kernel.org X-Gm-Message-State: AOJu0YxiWe+8VMjieOxk4VXrQtO4Z0gjaBObAW0Ji+oQgT4xEPvdlce1 IyMe5xFncl/yrSqruetHlkRAitxU472XXhy/2/S+kJnuOt0sA8oWQ+Ju X-Gm-Gg: AeBDiet1/umA1fjHVWtUZm3+SOdYBG59CL98t3sTj2D0dWSFNNFjPonqvgDDYVSwlSQ 6r7slD3tXduCLusTpeLo6IZe61F8zs7OBN67GFIVc3eW5sHX3eF1MtQbybTOrZWEy2jlJ3zQQa3 OxBaZ3/Gu1hGGzrthR8XboLkroaaoQg86HEosO7lWau+mycfamvM4YOnWVGLHCWb0b/UPf//vZp TvG44HJxYMOZcM82PIUjHqoA8xelj5BEsvL+I+V7oQpTW12Sf9B9gNAsKqKiZBY5+ku1pxBoh29 UyeV0+/J4n+UF67QEsCUhIBwo+VI6TvsIkkWqwXJcqekGN+nDDjFo0GOu2psvT3liS2OGEsp7vm BShjFoTPNqiG/kKRuzEvYp6Hb2t8sOIGmWS2VvG0g1uVZz6vGe918R4ONSHJvyMoIzShX13b6Gp bTpxGkxDyvKhKWTCe6Nz6C7uAz3xnBDB+S72anjTYEeMP7lcYfgxoYqxDAfyO0HOIP46HBBw== X-Received: by 2002:a05:6a00:12d3:b0:829:7e6d:cf22 with SMTP id d2e1a72fcca58-82f0c317a4emr20911335b3a.43.1776229696674; Tue, 14 Apr 2026 22:08:16 -0700 (PDT) Received: from hu-ckantibh-hyd.qualcomm.com ([202.46.23.25]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-82f67469dc3sm763706b3a.58.2026.04.14.22.08.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 14 Apr 2026 22:08:16 -0700 (PDT) From: Sanjay Chitroda X-Google-Original-From: Sanjay Chitroda To: jic23@kernel.org Cc: dlechner@baylibre.com, nuno.sa@analog.com, andy@kernel.org, sanjayembeddedse@gmail.com, tglx@kernel.org, christophe.jaillet@wanadoo.fr, mingo@kernel.org, nabijaczleweli@nabijaczleweli.xyz, kees@kernel.org, linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v6 5/7] iio: ssp_sensors: convert probe and teardown to devm-managed resources Date: Wed, 15 Apr 2026 10:37:47 +0530 Message-Id: <20260415050749.3858046-6-sanjayembedded@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260415050749.3858046-1-sanjayembedded@gmail.com> References: <20260415050749.3858046-1-sanjayembedded@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit From: Sanjay Chitroda Convert SSP driver resource management to use devm-managed helpers and devm actions, tying the lifetime of all resources to the device. Mutex initialization, IRQ registration, work items, timers, and MFD resource are now managed using devm APIs. Cleanup logic previously handled explicitly in probe error paths and the remove callback is replaced with devm_add_action_or_reset(), ensuring correct teardown ordering and consistent behaviour on probe failure and device unbind. This simplifies the probe path by removing goto-based error handling, eliminates the remove callback entirely. No functional change intended. Signed-off-by: Sanjay Chitroda --- Changes in v6: - Drop remove path completely using devm_action with review comment from David - Convert MFD device to manage resource along with mutex and IRQ - Link to v5: https://lore.kernel.org/all/20260406080852.2727453-1-sanjayembedded@gmail.com/ --- drivers/iio/common/ssp_sensors/ssp_dev.c | 88 ++++++++++-------------- 1 file changed, 38 insertions(+), 50 deletions(-) diff --git a/drivers/iio/common/ssp_sensors/ssp_dev.c b/drivers/iio/common/ssp_sensors/ssp_dev.c index cb4c26a6b76c..94ecc794f926 100644 --- a/drivers/iio/common/ssp_sensors/ssp_dev.c +++ b/drivers/iio/common/ssp_sensors/ssp_dev.c @@ -194,6 +194,16 @@ static void ssp_disable_wdt_timer(struct ssp_data *data) cancel_work_sync(&data->work_wdt); } +static void ssp_shutdown_action(struct ssp_data *data) +{ + if (ssp_command(data, SSP_MSG2SSP_AP_STATUS_SHUTDOWN, 0) < 0) + dev_err(&data->spi->dev, + "SSP_MSG2SSP_AP_STATUS_SHUTDOWN failed\n"); + + ssp_enable_mcu(data, false); + ssp_clean_pending_list(data); +} + /** * ssp_get_sensor_delay() - gets sensor data acquisition period * @data: sensorhub structure @@ -491,9 +501,9 @@ static int ssp_probe(struct spi_device *spi) return -ENODEV; } - ret = mfd_add_devices(&spi->dev, PLATFORM_DEVID_NONE, - sensorhub_sensor_devs, - ARRAY_SIZE(sensorhub_sensor_devs), NULL, 0, NULL); + ret = devm_mfd_add_devices(&spi->dev, PLATFORM_DEVID_NONE, + sensorhub_sensor_devs, + ARRAY_SIZE(sensorhub_sensor_devs), NULL, 0, NULL); if (ret < 0) { dev_err(&spi->dev, "mfd add devices fail\n"); return ret; @@ -503,14 +513,16 @@ static int ssp_probe(struct spi_device *spi) ret = spi_setup(spi); if (ret < 0) { dev_err(&spi->dev, "Failed to setup spi\n"); - goto err_setup_spi; + return ret; } data->fw_dl_state = SSP_FW_DL_STATE_NONE; data->spi = spi; spi_set_drvdata(spi, data); - mutex_init(&data->comm_lock); + ret = devm_mutex_init(&spi->dev, &data->comm_lock); + if (ret < 0) + return ret; for (i = 0; i < SSP_SENSOR_MAX; ++i) { data->delay_buf[i] = SSP_DEFAULT_POLLING_DELAY; @@ -523,7 +535,9 @@ static int ssp_probe(struct spi_device *spi) data->time_syncing = true; - mutex_init(&data->pending_lock); + ret = devm_mutex_init(&spi->dev, &data->pending_lock); + if (ret < 0) + return ret; INIT_LIST_HEAD(&data->pending_list); atomic_set(&data->enable_refcount, 0); @@ -533,14 +547,17 @@ static int ssp_probe(struct spi_device *spi) timer_setup(&data->wdt_timer, ssp_wdt_timer_func, 0); - ret = request_threaded_irq(data->spi->irq, NULL, - ssp_irq_thread_fn, - IRQF_TRIGGER_FALLING | IRQF_ONESHOT, - "SSP_Int", data); - if (ret < 0) { - dev_err(&spi->dev, "Irq request fail\n"); - goto err_setup_irq; - } + ret = devm_add_action_or_reset(&spi->dev, + ssp_disable_wdt_timer, data); + if (ret) + return ret; + + ret = devm_request_threaded_irq(&spi->dev, data->spi->irq, NULL, + ssp_irq_thread_fn, + IRQF_TRIGGER_FALLING | IRQF_ONESHOT, + "SSP_Int", data); + if (ret < 0) + return ret; /* Let's start with enabled one so irq balance could be ok */ data->shut_down = false; @@ -548,53 +565,24 @@ static int ssp_probe(struct spi_device *spi) /* just to avoid unbalanced irq set wake up */ enable_irq_wake(data->spi->irq); + ret = devm_add_action_or_reset(&spi->dev, + ssp_shutdown_action, data); + if (ret) + return ret; + data->fw_dl_state = ssp_check_fwbl(data); if (data->fw_dl_state == SSP_FW_DL_STATE_NONE) { ret = ssp_initialize_mcu(data); if (ret < 0) { dev_err(&spi->dev, "Initialize_mcu failed\n"); - goto err_read_reg; + return ret; } } else { dev_err(&spi->dev, "Firmware version not supported\n"); - ret = -EPERM; - goto err_read_reg; + return -EPERM; } return 0; - -err_read_reg: - free_irq(data->spi->irq, data); -err_setup_irq: - mutex_destroy(&data->pending_lock); - mutex_destroy(&data->comm_lock); -err_setup_spi: - mfd_remove_devices(&spi->dev); - - dev_err(&spi->dev, "Probe failed!\n"); - - return ret; -} - -static void ssp_remove(struct spi_device *spi) -{ - struct ssp_data *data = spi_get_drvdata(spi); - - if (ssp_command(data, SSP_MSG2SSP_AP_STATUS_SHUTDOWN, 0) < 0) - dev_err(&data->spi->dev, - "SSP_MSG2SSP_AP_STATUS_SHUTDOWN failed\n"); - - ssp_enable_mcu(data, false); - ssp_clean_pending_list(data); - - free_irq(data->spi->irq, data); - - ssp_disable_wdt_timer(data); - - mutex_destroy(&data->comm_lock); - mutex_destroy(&data->pending_lock); - - mfd_remove_devices(&spi->dev); } static int ssp_suspend(struct device *dev) -- 2.34.1