From patchwork Wed Oct 25 12:45:50 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: 'Max Staudt X-Patchwork-Id: 10026663 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 73C67601E8 for ; Wed, 25 Oct 2017 12:49:34 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 71CAB2841D for ; Wed, 25 Oct 2017 12:49:34 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 66D6A28497; Wed, 25 Oct 2017 12:49:34 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.9 required=2.0 tests=BAYES_00,RCVD_IN_DNSWL_HI autolearn=unavailable version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 179702841D for ; Wed, 25 Oct 2017 12:49:34 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751753AbdJYMtS (ORCPT ); Wed, 25 Oct 2017 08:49:18 -0400 Received: from mx2.suse.de ([195.135.220.15]:36131 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750949AbdJYMqa (ORCPT ); Wed, 25 Oct 2017 08:46:30 -0400 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 45CD3AD24; Wed, 25 Oct 2017 12:46:28 +0000 (UTC) From: Max Staudt To: b.zolnierkie@samsung.com, linux-fbdev@vger.kernel.org Cc: mstaudt@suse.de, tiwai@suse.com, oneukum@suse.com, msrb@suse.com, sndirsch@suse.com, michal@markovi.net, linux-kernel@vger.kernel.org Subject: [RFC 02/14] bootsplash: Add platform device Date: Wed, 25 Oct 2017 14:45:50 +0200 Message-Id: <20171025124602.28292-3-mstaudt@suse.de> X-Mailer: git-send-email 2.12.3 In-Reply-To: <20171025124602.28292-1-mstaudt@suse.de> References: <20171025124602.28292-1-mstaudt@suse.de> Sender: linux-fbdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-fbdev@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP This allows us to export a userland API via sysfs, showing/hiding the splash on request by dracut, systemd, or other init systems. Signed-off-by: Max Staudt Reviewed-by: Oliver Neukum --- drivers/video/fbdev/core/bootsplash.c | 83 ++++++++++++++++++++++++++ drivers/video/fbdev/core/bootsplash_internal.h | 3 + 2 files changed, 86 insertions(+) diff --git a/drivers/video/fbdev/core/bootsplash.c b/drivers/video/fbdev/core/bootsplash.c index 7a6fd6f8076a..7eb2126c3a31 100644 --- a/drivers/video/fbdev/core/bootsplash.c +++ b/drivers/video/fbdev/core/bootsplash.c @@ -198,6 +198,58 @@ void bootsplash_enable(void) /* + * Userland API via platform device in sysfs + */ + +static ssize_t splash_show_enabled(struct device *dev, + struct device_attribute *attr, char *buf) +{ + return sprintf(buf, "%d\n", splash_global.enabled); +} + +static ssize_t splash_store_enabled(struct device *device, + struct device_attribute *attr, + const char *buf, size_t count) +{ + bool enable; + int err; + + if (!buf || !count) + return -EFAULT; + + err = kstrtobool(buf, &enable); + if (err) + return err; + + if (enable) + bootsplash_enable(); + else + bootsplash_disable(); + + return count; +} + +static DEVICE_ATTR(enabled, 0644, splash_show_enabled, splash_store_enabled); + + +static struct attribute *splash_dev_attrs[] = { + &dev_attr_enabled.attr, + NULL +}; + +ATTRIBUTE_GROUPS(splash_dev); + + +static struct platform_driver splash_driver = { + .driver = { + .name = "bootsplash", + }, +}; + + + + +/* * Main init/exit functions */ @@ -208,6 +260,32 @@ void bootsplash_init(void) return; + /* Register platform device to export user API */ + if (!splash_global.splash_device) { + int ret; + + ret = platform_driver_register(&splash_driver); + if (ret) { + pr_err("platform_driver_register() failed: %d\n", ret); + goto err; + } + + splash_global.splash_device + = platform_device_alloc("bootsplash", 0); + + if (!splash_global.splash_device) { + goto err_driver; + } + + splash_global.splash_device->dev.groups = splash_dev_groups; + + platform_device_add(splash_global.splash_device); + if (ret) { + pr_err("platform_device_add() failed: %d\n", ret); + goto err_device; + } + } + spin_lock_init(&splash_global.state_lock); if (!splash_global.wq) splash_global.wq = alloc_workqueue("bootsplash", @@ -220,6 +298,11 @@ void bootsplash_init(void) return; +err_device: + platform_device_put(splash_global.splash_device); + splash_global.splash_device = NULL; +err_driver: + platform_driver_unregister(&splash_driver); err: pr_err("Failed to initialize.\n"); } diff --git a/drivers/video/fbdev/core/bootsplash_internal.h b/drivers/video/fbdev/core/bootsplash_internal.h index 4cec02774652..41d519d88baa 100644 --- a/drivers/video/fbdev/core/bootsplash_internal.h +++ b/drivers/video/fbdev/core/bootsplash_internal.h @@ -41,6 +41,9 @@ struct splash_priv { spinlock_t state_lock; bool enabled; + /* Our gateway to userland via sysfs */ + struct platform_device *splash_device; + /* We use our own workqueue so we don't have to worry about blocking * on console_lock() while animating and thus freezing the system * during suspend.