From patchwork Wed Oct 11 17:49:55 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Janusz Krzysztofik X-Patchwork-Id: 13417664 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 116B5CDB470 for ; Wed, 11 Oct 2023 17:51:24 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:Message-ID:Date:Subject:Cc :To:From:Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:References: List-Owner; bh=GQzz84l20KDT42w3Z7TKr/5r1+FeJu/6AvOFjWSgNrc=; b=MRzKCPjZenQCv8 ciHLnXeM0bL7jGwhiYA9+UBBL2VLU0lpo3MDVzNNb6uNgZAPB5N/m/xDgoDSP0yVBdBW5+e4MOjnM cL40RbXefstCsz7L3cfSOCmZIJud73DJ4/9bO6pawOGEo3oK7HYDHJNe9bcG7o/QuNSwDpfGmgF9K WZNec6CBIgobdDfHvYUlRd034RjkbCTUq6vwN0qD0pPgGfljVIOXhYTdWxqZ17O35vQDUXnNaZk6F BI5jI818bFKX0DcW7BewZ2GvXDWx/nee5FbvLz+tlNTRqjdphOGDQb/NvzQC+7v8uBZVztJ/LyPwD ruZgiSgmcroQp9D6O+Ow==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1qqdM9-00GNkd-0j; Wed, 11 Oct 2023 17:50:49 +0000 Received: from mail-wm1-x331.google.com ([2a00:1450:4864:20::331]) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1qqdM6-00GNju-2X for linux-arm-kernel@lists.infradead.org; Wed, 11 Oct 2023 17:50:48 +0000 Received: by mail-wm1-x331.google.com with SMTP id 5b1f17b1804b1-40566f8a093so1606935e9.3 for ; Wed, 11 Oct 2023 10:50:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1697046644; x=1697651444; darn=lists.infradead.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=zP+zcpcY4L8UQr12IXOv8iX0tyZpjo9Hcziw+ngC5Ew=; b=Kqlx7KWdmL5fRXn3GS08XqxbIhqnY5D+ISc4mOC9gWCkkAP3ZPJ9FaUBmQMBgwJOyu Y7g7z+qXyc6504C/F7FGLUOYTH0JekX1DypMepfQYrtWaXmH9b8cUJuQ/7j5QmIXYEcP 35ZmORTNIm8PE6WX+SfMOuiiZ/9o6AbtVBbQMEGdFMrl40Ovl5d5swqUaLq/xb/29t12 xzjwdvUXLtFpDMHLSeERJ88G6gIpNjRRYfGVcInml7Tg8+WIN2XnN8yJV/3poplDJIq4 RuTTkF6iQm9MACarX7a97g6nb3mNWk85yfv7vkm6LYIjVevB2uCtEGNVcfJyw/cyBqQP Tfjg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1697046644; x=1697651444; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=zP+zcpcY4L8UQr12IXOv8iX0tyZpjo9Hcziw+ngC5Ew=; b=qMzptPuteE8Eh7tlHCN3MhWgCbeiUT44492J3UmGAj8flrYvG6l1RMgNLz752GPilg sZGfa0EX+fkZCHPEniypPLJTp3lHoHODXwgwNtnJDjPYBs6CRo4nI8YzKiBLfD4H/UAP WYsCLZSD9xgawI94opCFGs8aPu/tOscN85c3iEdkoW+/rcUPvlf5VTSQUkUtomnsu35D hV3Q73OXGlMd4d1cVF4ocsD2eEnS360pqmDjo77pI4wQUrziQRKVnjjOb6AyZY/k6SSq SLyHGlT5aD9lG6JRdyPsfRaGF8ulg5QD01evREcgoC1r14FR6k/r+3HNMRC4YJXBWS0G pgqA== X-Gm-Message-State: AOJu0YyEoRnO/glGsXm4eMuZVepUsNqi8G4skg+yBEb8Z0YEU87AoGAJ rdCDkntcxgPpHoKGWV2f5mE= X-Google-Smtp-Source: AGHT+IGnLacLwFRfiKUzu/I423WVEyqhmENuuVZ09ysfbGiuIbod3nrnsXuldgoCDGsvlZIzf6l/kQ== X-Received: by 2002:a05:600c:2146:b0:405:458d:d54 with SMTP id v6-20020a05600c214600b00405458d0d54mr19668199wml.33.1697046643995; Wed, 11 Oct 2023 10:50:43 -0700 (PDT) Received: from dell.intranet (77-255-201-154.dynamic.inetia.pl. [77.255.201.154]) by smtp.gmail.com with ESMTPSA id fl16-20020a05600c0b9000b00406847c988asm19658788wmb.12.2023.10.11.10.50.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 11 Oct 2023 10:50:43 -0700 (PDT) From: Janusz Krzysztofik To: Tony Lindgren Cc: Aaro Koskinen , Douglas Anderson , Mark Brown , linux-omap@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Janusz Krzysztofik , stable@vger.kernel.org Subject: [PATCH v2] ARM: OMAP1: ams-delta: Fix MODEM initialization failure Date: Wed, 11 Oct 2023 19:49:55 +0200 Message-ID: <20231011175038.1907629-1-jmkrzyszt@gmail.com> X-Mailer: git-send-email 2.42.0 MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20231011_105046_824455_0525C76C X-CRM114-Status: GOOD ( 22.15 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Regulator drivers were modified to use asynchronous device probe. Since then, the board .init_late hook fails to acquire a GPIO based fixed regulator needed by an on-board voice MODEM device, and unregisters the MODEM. That in turn triggers a so far not discovered bug of device unregister function called for a device with no associated release() op. serial8250 serial8250.1: incomplete constraints, dummy supplies not allowed WARNING: CPU: 0 PID: 1 at drivers/base/core.c:2486 device_release+0x98/0xa8 Device 'serial8250.1' does not have a release() function, it is broken and must be fixed. See Documentation/core-api/kobject.rst. ... put_device from platform_device_put+0x1c/0x24 platform_device_put from ams_delta_init_late+0x4c/0x68 ams_delta_init_late from init_machine_late+0x1c/0x94 init_machine_late from do_one_initcall+0x60/0x1d4 As a consequence, ASoC CODEC driver is no longer able to control its device over the voice MODEM's tty interface. cx20442-codec: ASoC: error at soc_component_write_no_lock on cx20442-codec for register: [0x00000000] -5 cx20442-codec: ASoC: error at snd_soc_component_update_bits_legacy on cx20442-codec for register: [0x00000000] -5 cx20442-codec: ASoC: error at snd_soc_component_update_bits on cx20442-codec for register: [0x00000000] -5 The regulator hangs of a GPIO pin controlled by basic-mmio-gpio driver. Unlike most GPIO drivers, that driver doesn't probe for devices before device_initcall, then GPIO pins under its control are not availabele to majority of devices probed at that phase, including regulators. On the other hand, serial8250 driver used by the MODEM device neither accepts via platform data nor handles regulators, then the board file is not able to teach that driver to return -EPROBE_DEFER when the regulator is not ready so the failed probe is retried after late_initcall. Resolve the issue by extending description of the MODEM device with a dedicated power management domain. Acquire the regulator from the domain's .activate hook and return -EPROBE_DEFER if the regulator is not available. Having that under control, add the regulator device description to the list of platform devices initialized from .init_machine and drop the no longer needed custom .init_late hook. v2: Trim down the warning for prettier git log output (Tony). Fixes: 259b93b21a9f ("regulator: Set PROBE_PREFER_ASYNCHRONOUS for drivers that existed in 4.14") Signed-off-by: Janusz Krzysztofik Cc: stable@vger.kernel.org # v6.4+ --- arch/arm/mach-omap1/board-ams-delta.c | 60 +++++++-------------------- 1 file changed, 16 insertions(+), 44 deletions(-) diff --git a/arch/arm/mach-omap1/board-ams-delta.c b/arch/arm/mach-omap1/board-ams-delta.c index 9808cd27e2cf..67de96c7717d 100644 --- a/arch/arm/mach-omap1/board-ams-delta.c +++ b/arch/arm/mach-omap1/board-ams-delta.c @@ -550,6 +550,7 @@ static struct platform_device *ams_delta_devices[] __initdata = { &ams_delta_nand_device, &ams_delta_lcd_device, &cx20442_codec_device, + &modem_nreset_device, }; static struct gpiod_lookup_table *ams_delta_gpio_tables[] __initdata = { @@ -782,26 +783,28 @@ static struct plat_serial8250_port ams_delta_modem_ports[] = { { }, }; +static int ams_delta_modem_pm_activate(struct device *dev) +{ + modem_priv.regulator = regulator_get(dev, "RESET#"); + if (IS_ERR(modem_priv.regulator)) + return -EPROBE_DEFER; + + return 0; +} + +static struct dev_pm_domain ams_delta_modem_pm_domain = { + .activate = ams_delta_modem_pm_activate, +}; + static struct platform_device ams_delta_modem_device = { .name = "serial8250", .id = PLAT8250_DEV_PLATFORM1, .dev = { .platform_data = ams_delta_modem_ports, + .pm_domain = &ams_delta_modem_pm_domain, }, }; -static int __init modem_nreset_init(void) -{ - int err; - - err = platform_device_register(&modem_nreset_device); - if (err) - pr_err("Couldn't register the modem regulator device\n"); - - return err; -} - - /* * This function expects MODEM IRQ number already assigned to the port. * The MODEM device requires its RESET# pin kept high during probe. @@ -833,37 +836,6 @@ static int __init ams_delta_modem_init(void) } arch_initcall_sync(ams_delta_modem_init); -static int __init late_init(void) -{ - int err; - - err = modem_nreset_init(); - if (err) - return err; - - /* - * Once the modem device is registered, the modem_nreset - * regulator can be requested on behalf of that device. - */ - modem_priv.regulator = regulator_get(&ams_delta_modem_device.dev, - "RESET#"); - if (IS_ERR(modem_priv.regulator)) { - err = PTR_ERR(modem_priv.regulator); - goto unregister; - } - return 0; - -unregister: - platform_device_unregister(&ams_delta_modem_device); - return err; -} - -static void __init ams_delta_init_late(void) -{ - omap1_init_late(); - late_init(); -} - static void __init ams_delta_map_io(void) { omap1_map_io(); @@ -877,7 +849,7 @@ MACHINE_START(AMS_DELTA, "Amstrad E3 (Delta)") .init_early = omap1_init_early, .init_irq = omap1_init_irq, .init_machine = ams_delta_init, - .init_late = ams_delta_init_late, + .init_late = omap1_init_late, .init_time = omap1_timer_init, .restart = omap1_restart, MACHINE_END