Received: by 2002:a89:413:0:b0:1fd:dba5:e537 with SMTP id m19csp654429lqs; Fri, 14 Jun 2024 01:16:42 -0700 (PDT) X-Forwarded-Encrypted: i=3; AJvYcCUoBjcXIeMVs7NlE/4iBc2Y6Ep/uyH8ZOQl92ehrNI+IMa+rIPt/0O/AFBEXudb1LwaRw/tHabOixpxQgWU8e1wofQjY7oZjeFId4D/DQ== X-Google-Smtp-Source: AGHT+IEnEXd3IdJS5ucBCWv/qehFmJugp0tBI/OxtqKXnEbyG3zH0eXRMToEdXCww59QYe1LRbue X-Received: by 2002:a05:690c:7003:b0:62f:90df:fae3 with SMTP id 00721157ae682-63222a57b56mr19039737b3.20.1718353001891; Fri, 14 Jun 2024 01:16:41 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1718353001; cv=pass; d=google.com; s=arc-20160816; b=asR6gwnSUsz9yubVLKMtrka1sHX0z3NBhA7Ilah1udhXNq+DqGgdeyvKSZN5K2L5vG e9cpiO185ryyaJnN/CB3eStRhzWp0gCaPF3fYtNnTMcyFNoRupIo1oJM+6VtQY6yE89n ffDJYDqLLNLmIn4TltfNltypBTL1VCffWK+mxPIgfrCuNfimnfkU+G0zJny6EoKElpo/ VecSoSk1QvO6CeNnDAKvn9P2uDZmIKQo2A4gzA51S+a7Iejt7MArHIsbjseNBHoh/b2d Ys3/nSqppH9mq2ICrBBfzBTi96Et4iBkkV1ON48qTTtm1ArwX2Np2/dfoVBJ0CGhW6K0 jPSA== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:in-reply-to:autocrypt:from :content-language:references:cc:to:subject:user-agent:mime-version :list-unsubscribe:list-subscribe:list-id:precedence:date:message-id :dkim-signature:dkim-signature:dkim-signature:dkim-signature; bh=6LoGxfJP3NSybvTfW3xLIcUrYqsNTqARgsCRE4cnrlA=; fh=sntKXcU6VJsiW8/dxJmnptdAHjXNI0FuWnpXvQCco3w=; b=h2ZnJodofH61OinE9xfZWY/YWObuWorelqj//mA+9Rqhrpyd2JC8mBkACsjUk7cYIT yM6yyYTn2YFs+T6bwWZCwBvwSbRraHRrqyQlUN3ajx0SDmp798IapL1vaBuGZNBucyYA 0wAW1oOYSxyXPbZ72ITRE2ujo+9G3hJkiaLIhMnIDNkgd1NmK1ui+PAKOqBDZIAuCVwo DwoWpBCefdS/rBXxYlizJAUzS2HXi0HwdUv2bJCe06Av7YBDFW+WBfFdR9xfCrzXG7rF 1M0Hyo1bgzis15n4n5xXLvoAi8eY93jJ53sNMxXiOn60PNrboE99e9CSOpjPtCdKO2bz I/8w==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@suse.de header.s=susede2_rsa header.b=SF+M5d3L; dkim=neutral (no key) header.i=@suse.de header.s=susede2_ed25519; dkim=pass header.i=@suse.de header.s=susede2_rsa header.b=b4I9Hbjx; dkim=neutral (no key) header.i=@suse.de header.s=susede2_ed25519; arc=pass (i=1 spf=pass spfdomain=suse.de dkim=pass dkdomain=suse.de dkim=pass dkdomain=suse.de dmarc=pass fromdomain=suse.de); spf=pass (google.com: domain of linux-kernel+bounces-214527-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-214527-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=suse.de Return-Path: Received: from ny.mirrors.kernel.org (ny.mirrors.kernel.org. [2604:1380:45d1:ec00::1]) by mx.google.com with ESMTPS id 6a1803df08f44-6b2a5afdbb2si15315326d6.292.2024.06.14.01.16.41 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 14 Jun 2024 01:16:41 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel+bounces-214527-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) client-ip=2604:1380:45d1:ec00::1; Authentication-Results: mx.google.com; dkim=pass header.i=@suse.de header.s=susede2_rsa header.b=SF+M5d3L; dkim=neutral (no key) header.i=@suse.de header.s=susede2_ed25519; dkim=pass header.i=@suse.de header.s=susede2_rsa header.b=b4I9Hbjx; dkim=neutral (no key) header.i=@suse.de header.s=susede2_ed25519; arc=pass (i=1 spf=pass spfdomain=suse.de dkim=pass dkdomain=suse.de dkim=pass dkdomain=suse.de dmarc=pass fromdomain=suse.de); spf=pass (google.com: domain of linux-kernel+bounces-214527-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-214527-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=suse.de Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ny.mirrors.kernel.org (Postfix) with ESMTPS id 88AFC1C2241E for ; Fri, 14 Jun 2024 08:16:41 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id EE402185085; Fri, 14 Jun 2024 08:16:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="SF+M5d3L"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="21yxkPuf"; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="b4I9Hbjx"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="vVTOJreZ" Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.223.131]) (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 1F0F4185082 for ; Fri, 14 Jun 2024 08:16:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=195.135.223.131 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1718352965; cv=none; b=NWbNFKNqSUGzOHDDV2LD4MqAjH+BOrRfIva9OCTZsscALo1Fk+h54RNPoCAt4HxLycQhkdb3YKJBlwj+m2fB22jOcLbUpQkNxZrW86uM0mVcfzxBc6/Iu7eYEN9Omq2kHebrfkPKLC9UsECbzV7C7ViLEhNc/JM6CnmfB9Ap9ok= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1718352965; c=relaxed/simple; bh=wcehNLrpht/MugdmYesfBf1F3dAm2Titz8hi7VGBa8w=; h=Message-ID:Date:MIME-Version:Subject:To:Cc:References:From: In-Reply-To:Content-Type; b=VksfPD1cA4R6t9otqkirBAAR6i5JDemLqhJgeP754kzsGqCntjisvp9zb72NYOEwoSEpm0Pi+o6lNrwg6MkUgyBVoDEVIhEB/WiN+BA+AU8kyamMW5s6eQ9q93HxupSYCNxXOB2KhoXmB8aeQGJxgXJMB2fKFx5MKUPZFLC2/ZA= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=suse.de; spf=pass smtp.mailfrom=suse.de; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b=SF+M5d3L; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b=21yxkPuf; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b=b4I9Hbjx; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b=vVTOJreZ; arc=none smtp.client-ip=195.135.223.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=suse.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=suse.de Received: from imap1.dmz-prg2.suse.org (unknown [10.150.64.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by smtp-out2.suse.de (Postfix) with ESMTPS id 15AC020201; Fri, 14 Jun 2024 08:15:54 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1718352955; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:autocrypt:autocrypt; bh=6LoGxfJP3NSybvTfW3xLIcUrYqsNTqARgsCRE4cnrlA=; b=SF+M5d3LtRJ6D/3p9qaVV+TV37UVt09yV+VBF1Wbt70WWQPE32EJBJe7G/iIHIBkcGZcCD iFTgOBBCNDUaVfYT9nCWGEQlWxhf2C26X25w1i+AT5oT607pBsYVkJ10ztz8yRtb3L8P18 A6mcvQ2B75E/0T/ue/1TLLj/A/BlNIU= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1718352955; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:autocrypt:autocrypt; bh=6LoGxfJP3NSybvTfW3xLIcUrYqsNTqARgsCRE4cnrlA=; b=21yxkPufH1IMmaiPDmGmFpzvMf1+IshWnmfGpdXWoqE2owZJstd6B0f+lADvjMz2CbEgZj YN7pJgMwoKlZitAA== Authentication-Results: smtp-out2.suse.de; none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1718352954; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:autocrypt:autocrypt; bh=6LoGxfJP3NSybvTfW3xLIcUrYqsNTqARgsCRE4cnrlA=; b=b4I9Hbjxr+091JDb8ZlMY+qoW5zOpV5YamNIwyo/Ya4M4Aa8LVYNcYAREa8JLgoam0pJ3+ n9hl0SEdixKwLyimOA56KwXDIHLzEj/Nw1Uk01coWjjfCGFzEE+qxBRRbwCBXU2S/Uklep 8pWGzc+2gDKtvirzBaCVEn2xCKLmZ2k= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1718352954; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:autocrypt:autocrypt; bh=6LoGxfJP3NSybvTfW3xLIcUrYqsNTqARgsCRE4cnrlA=; b=vVTOJreZGK0vaOT/BaQVi2Ff1kpu/TTHdCWjmY50O9U5q7HVbMZlT1yO94eI/+l6wib3dr w/pEG9CO5hkf1eDw== Received: from imap1.dmz-prg2.suse.org (localhost [127.0.0.1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by imap1.dmz-prg2.suse.org (Postfix) with ESMTPS id C7E6713AB1; Fri, 14 Jun 2024 08:15:53 +0000 (UTC) Received: from dovecot-director2.suse.de ([2a07:de40:b281:106:10:150:64:167]) by imap1.dmz-prg2.suse.org with ESMTPSA id LxHtLjn8a2YVYAAAD6G6ig (envelope-from ); Fri, 14 Jun 2024 08:15:53 +0000 Message-ID: Date: Fri, 14 Jun 2024 10:15:53 +0200 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH v3] drm/fb-helper: Detect when lid is closed during initialization To: Mario Limonciello , Maarten Lankhorst , Maxime Ripard Cc: David Airlie , Daniel Vetter , "open list:DRM DRIVERS" , open list , amd-gfx@lists.freedesktop.org, Dmitry Torokhov , Chris Bainbridge References: <20240613051700.1112-1-mario.limonciello@amd.com> Content-Language: en-US From: Thomas Zimmermann Autocrypt: addr=tzimmermann@suse.de; keydata= xsBNBFs50uABCADEHPidWt974CaxBVbrIBwqcq/WURinJ3+2WlIrKWspiP83vfZKaXhFYsdg XH47fDVbPPj+d6tQrw5lPQCyqjwrCPYnq3WlIBnGPJ4/jreTL6V+qfKRDlGLWFjZcsrPJGE0 BeB5BbqP5erN1qylK9i3gPoQjXGhpBpQYwRrEyQyjuvk+Ev0K1Jc5tVDeJAuau3TGNgah4Yc hdHm3bkPjz9EErV85RwvImQ1dptvx6s7xzwXTgGAsaYZsL8WCwDaTuqFa1d1jjlaxg6+tZsB 9GluwvIhSezPgnEmimZDkGnZRRSFiGP8yjqTjjWuf0bSj5rUnTGiyLyRZRNGcXmu6hjlABEB AAHNJ1Rob21hcyBaaW1tZXJtYW5uIDx0emltbWVybWFubkBzdXNlLmRlPsLAjgQTAQgAOAIb AwULCQgHAgYVCgkICwIEFgIDAQIeAQIXgBYhBHIX+6yM6c9jRKFo5WgNwR1TC3ojBQJftODH AAoJEGgNwR1TC3ojx1wH/0hKGWugiqDgLNXLRD/4TfHBEKmxIrmfu9Z5t7vwUKfwhFL6hqvo lXPJJKQpQ2z8+X2vZm/slsLn7J1yjrOsoJhKABDi+3QWWSGkaGwRJAdPVVyJMfJRNNNIKwVb U6B1BkX2XDKDGffF4TxlOpSQzdtNI/9gleOoUA8+jy8knnDYzjBNOZqLG2FuTdicBXblz0Mf vg41gd9kCwYXDnD91rJU8tzylXv03E75NCaTxTM+FBXPmsAVYQ4GYhhgFt8S2UWMoaaABLDe 7l5FdnLdDEcbmd8uLU2CaG4W2cLrUaI4jz2XbkcPQkqTQ3EB67hYkjiEE6Zy3ggOitiQGcqp j//OwE0EWznS4AEIAMYmP4M/V+T5RY5at/g7rUdNsLhWv1APYrh9RQefODYHrNRHUE9eosYb T6XMryR9hT8XlGOYRwKWwiQBoWSDiTMo/Xi29jUnn4BXfI2px2DTXwc22LKtLAgTRjP+qbU6 3Y0xnQN29UGDbYgyyK51DW3H0If2a3JNsheAAK+Xc9baj0LGIc8T9uiEWHBnCH+RdhgATnWW GKdDegUR5BkDfDg5O/FISymJBHx2Dyoklv5g4BzkgqTqwmaYzsl8UxZKvbaxq0zbehDda8lv hFXodNFMAgTLJlLuDYOGLK2AwbrS3Sp0AEbkpdJBb44qVlGm5bApZouHeJ/+n+7r12+lqdsA EQEAAcLAdgQYAQgAIAIbDBYhBHIX+6yM6c9jRKFo5WgNwR1TC3ojBQJftOH6AAoJEGgNwR1T C3ojVSkIALpAPkIJPQoURPb1VWjh34l0HlglmYHvZszJWTXYwavHR8+k6Baa6H7ufXNQtThR yIxJrQLW6rV5lm7TjhffEhxVCn37+cg0zZ3j7zIsSS0rx/aMwi6VhFJA5hfn3T0TtrijKP4A SAQO9xD1Zk9/61JWk8OysuIh7MXkl0fxbRKWE93XeQBhIJHQfnc+YBLprdnxR446Sh8Wn/2D Ya8cavuWf2zrB6cZurs048xe0UbSW5AOSo4V9M0jzYI4nZqTmPxYyXbm30Kvmz0rYVRaitYJ 4kyYYMhuULvrJDMjZRvaNe52tkKAvMevcGdt38H4KSVXAylqyQOW5zvPc4/sq9c= In-Reply-To: <20240613051700.1112-1-mario.limonciello@amd.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Spam-Score: -2.79 X-Spam-Level: X-Spam-Flag: NO X-Spamd-Result: default: False [-2.79 / 50.00]; BAYES_HAM(-3.00)[100.00%]; SUSPICIOUS_RECIPS(1.50)[]; NEURAL_HAM_LONG(-1.00)[-1.000]; NEURAL_HAM_SHORT(-0.20)[-1.000]; MIME_GOOD(-0.10)[text/plain]; XM_UA_NO_VERSION(0.01)[]; RCVD_TLS_ALL(0.00)[]; TAGGED_RCPT(0.00)[]; RCVD_VIA_SMTP_AUTH(0.00)[]; ARC_NA(0.00)[]; RCPT_COUNT_SEVEN(0.00)[10]; MIME_TRACE(0.00)[0:+]; MID_RHS_MATCH_FROM(0.00)[]; FREEMAIL_ENVRCPT(0.00)[gmail.com]; DKIM_SIGNED(0.00)[suse.de:s=susede2_rsa,suse.de:s=susede2_ed25519]; FROM_HAS_DN(0.00)[]; FREEMAIL_CC(0.00)[gmail.com,ffwll.ch,lists.freedesktop.org,vger.kernel.org]; TO_DN_SOME(0.00)[]; FROM_EQ_ENVFROM(0.00)[]; RCVD_COUNT_TWO(0.00)[2]; TO_MATCH_ENVRCPT_ALL(0.00)[]; FUZZY_BLOCKED(0.00)[rspamd.com]; DBL_BLOCKED_OPENRESOLVER(0.00)[imap1.dmz-prg2.suse.org:helo,gitlab.freedesktop.org:url,amd.com:email] Hi Mario Am 13.06.24 um 07:17 schrieb Mario Limonciello: > If the lid on a laptop is closed when eDP connectors are populated > then it remains enabled when the initial framebuffer configuration > is built. > > When creating the initial framebuffer configuration detect the > lid status and if it's closed disable any eDP connectors. > > Also set up a workqueue to monitor for any future lid events. After reading through this patchset, I think fbdev emulation is not the right place for this code, as lid state is global. You could put this into drm_client_modeset.c and track lid state per client. drm_fb_helper_lid_work() would call the client's hotplug callback. But preferable, lid state should be tracked per DRM device in struct drm_mode_config and call drm_client_dev_hotplug() on each lid-state event. Thoughts? Best regards Thomas > > Suggested-by: Dmitry Torokhov > Reported-by: Chris Bainbridge > Closes: https://gitlab.freedesktop.org/drm/amd/-/issues/3349 > Signed-off-by: Mario Limonciello > --- > v2->v3: > * Use input device instead of ACPI device > * Detect lid open/close events > --- > drivers/gpu/drm/drm_client_modeset.c | 29 ++++++ > drivers/gpu/drm/drm_fb_helper.c | 132 +++++++++++++++++++++++++++ > include/drm/drm_device.h | 6 ++ > include/drm/drm_fb_helper.h | 2 + > 4 files changed, 169 insertions(+) > > diff --git a/drivers/gpu/drm/drm_client_modeset.c b/drivers/gpu/drm/drm_client_modeset.c > index 31af5cf37a09..b8adfe87334b 100644 > --- a/drivers/gpu/drm/drm_client_modeset.c > +++ b/drivers/gpu/drm/drm_client_modeset.c > @@ -257,6 +257,34 @@ static void drm_client_connectors_enabled(struct drm_connector **connectors, > enabled[i] = drm_connector_enabled(connectors[i], false); > } > > +static void drm_client_match_edp_lid(struct drm_device *dev, > + struct drm_connector **connectors, > + unsigned int connector_count, > + bool *enabled) > +{ > + int i; > + > + for (i = 0; i < connector_count; i++) { > + struct drm_connector *connector = connectors[i]; > + > + switch (connector->connector_type) { > + case DRM_MODE_CONNECTOR_LVDS: > + case DRM_MODE_CONNECTOR_eDP: > + if (!enabled[i]) > + continue; > + break; > + default: > + continue; > + } > + > + if (dev->lid_closed) { > + drm_dbg_kms(dev, "[CONNECTOR:%d:%s] lid is closed, disabling\n", > + connector->base.id, connector->name); > + enabled[i] = false; > + } > + } > +} > + > static bool drm_client_target_cloned(struct drm_device *dev, > struct drm_connector **connectors, > unsigned int connector_count, > @@ -844,6 +872,7 @@ int drm_client_modeset_probe(struct drm_client_dev *client, unsigned int width, > memset(crtcs, 0, connector_count * sizeof(*crtcs)); > memset(offsets, 0, connector_count * sizeof(*offsets)); > > + drm_client_match_edp_lid(dev, connectors, connector_count, enabled); > if (!drm_client_target_cloned(dev, connectors, connector_count, modes, > offsets, enabled, width, height) && > !drm_client_target_preferred(dev, connectors, connector_count, modes, > diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c > index d612133e2cf7..41dd5887599a 100644 > --- a/drivers/gpu/drm/drm_fb_helper.c > +++ b/drivers/gpu/drm/drm_fb_helper.c > @@ -30,6 +30,8 @@ > #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt > > #include > +#include > +#include > #include > #include > #include > @@ -413,6 +415,128 @@ static void drm_fb_helper_damage_work(struct work_struct *work) > drm_fb_helper_fb_dirty(helper); > } > > +static void drm_fb_helper_lid_event(struct input_handle *handle, unsigned int type, > + unsigned int code, int value) > +{ > + if (type == EV_SW && code == SW_LID) { > + struct drm_fb_helper *fb_helper = handle->handler->private; > + > + if (value != fb_helper->dev->lid_closed) { > + fb_helper->dev->lid_closed = value; > + queue_work(fb_helper->input_wq, &fb_helper->lid_work); > + } > + } > +} > + > +struct drm_fb_lid { > + struct input_handle handle; > +}; > + > +static int drm_fb_helper_lid_connect(struct input_handler *handler, > + struct input_dev *dev, > + const struct input_device_id *id) > +{ > + struct drm_fb_helper *fb_helper = handler->private; > + struct drm_fb_lid *lid; > + char *name; > + int error; > + > + lid = kzalloc(sizeof(*lid), GFP_KERNEL); > + if (!lid) > + return -ENOMEM; > + > + name = kasprintf(GFP_KERNEL, "drm-fb-helper-lid-%s", dev_name(&dev->dev)); > + if (!name) { > + error = -ENOMEM; > + goto err_free_lid; > + } > + > + lid->handle.dev = dev; > + lid->handle.handler = handler; > + lid->handle.name = name; > + lid->handle.private = lid; > + > + error = input_register_handle(&lid->handle); > + if (error) > + goto err_free_name; > + > + error = input_open_device(&lid->handle); > + if (error) > + goto err_unregister_handle; > + > + fb_helper->dev->lid_closed = dev->sw[SW_LID]; > + drm_dbg_kms(fb_helper->dev, "initial lid state is set to %d\n", fb_helper->dev->lid_closed); > + > + return 0; > + > +err_unregister_handle: > + input_unregister_handle(&lid->handle); > +err_free_name: > + kfree(name); > +err_free_lid: > + kfree(lid); > + return error; > +} > + > +static void drm_fb_helper_lid_disconnect(struct input_handle *handle) > +{ > + struct drm_fb_lid *lid = handle->private; > + > + input_close_device(handle); > + input_unregister_handle(handle); > + > + kfree(handle->name); > + kfree(lid); > +} > + > +static const struct input_device_id drm_fb_helper_lid_ids[] = { > + { > + .flags = INPUT_DEVICE_ID_MATCH_EVBIT | INPUT_DEVICE_ID_MATCH_SWBIT, > + .evbit = { BIT_MASK(EV_SW) }, > + .swbit = { [BIT_WORD(SW_LID)] = BIT_MASK(SW_LID) }, > + }, > + { }, > +}; > + > +static struct input_handler drm_fb_helper_lid_handler = { > + .event = drm_fb_helper_lid_event, > + .connect = drm_fb_helper_lid_connect, > + .disconnect = drm_fb_helper_lid_disconnect, > + .name = "drm-fb-helper-lid", > + .id_table = drm_fb_helper_lid_ids, > +}; > + > +static void drm_fb_helper_lid_work(struct work_struct *work) > +{ > + struct drm_fb_helper *fb_helper = container_of(work, struct drm_fb_helper, > + lid_work); > + drm_fb_helper_hotplug_event(fb_helper); > +} > + > +static int drm_fb_helper_create_lid_handler(struct drm_fb_helper *fb_helper) > +{ > + int ret = 0; > + > + if (fb_helper->deferred_setup) > + return 0; > + > + fb_helper->input_wq = create_singlethread_workqueue("drm-fb-lid"); > + if (fb_helper->input_wq == NULL) > + return -ENOMEM; > + > + drm_fb_helper_lid_handler.private = fb_helper; > + ret = input_register_handler(&drm_fb_helper_lid_handler); > + if (ret) > + goto remove_wq; > + > + return 0; > + > +remove_wq: > + destroy_workqueue(fb_helper->input_wq); > + fb_helper->input_wq = NULL; > + return ret; > +} > + > /** > * drm_fb_helper_prepare - setup a drm_fb_helper structure > * @dev: DRM device > @@ -445,6 +569,7 @@ void drm_fb_helper_prepare(struct drm_device *dev, struct drm_fb_helper *helper, > spin_lock_init(&helper->damage_lock); > INIT_WORK(&helper->resume_work, drm_fb_helper_resume_worker); > INIT_WORK(&helper->damage_work, drm_fb_helper_damage_work); > + INIT_WORK(&helper->lid_work, drm_fb_helper_lid_work); > helper->damage_clip.x1 = helper->damage_clip.y1 = ~0; > mutex_init(&helper->lock); > helper->funcs = funcs; > @@ -593,6 +718,9 @@ void drm_fb_helper_fini(struct drm_fb_helper *fb_helper) > if (!drm_fbdev_emulation) > return; > > + input_unregister_handler(&drm_fb_helper_lid_handler); > + destroy_workqueue(fb_helper->input_wq); > + > cancel_work_sync(&fb_helper->resume_work); > cancel_work_sync(&fb_helper->damage_work); > > @@ -1842,6 +1970,10 @@ __drm_fb_helper_initial_config_and_unlock(struct drm_fb_helper *fb_helper) > width = dev->mode_config.max_width; > height = dev->mode_config.max_height; > > + ret = drm_fb_helper_create_lid_handler(fb_helper); > + if (ret) > + return ret; > + > drm_client_modeset_probe(&fb_helper->client, width, height); > ret = drm_fb_helper_single_fb_probe(fb_helper); > if (ret < 0) { > diff --git a/include/drm/drm_device.h b/include/drm/drm_device.h > index 63767cf24371..619af597784c 100644 > --- a/include/drm/drm_device.h > +++ b/include/drm/drm_device.h > @@ -316,6 +316,12 @@ struct drm_device { > * Root directory for debugfs files. > */ > struct dentry *debugfs_root; > + > + /** > + * @lid_closed: Flag to tell the lid switch state > + */ > + bool lid_closed; > + > }; > > #endif > diff --git a/include/drm/drm_fb_helper.h b/include/drm/drm_fb_helper.h > index 375737fd6c36..7fb36c10299d 100644 > --- a/include/drm/drm_fb_helper.h > +++ b/include/drm/drm_fb_helper.h > @@ -143,6 +143,8 @@ struct drm_fb_helper { > spinlock_t damage_lock; > struct work_struct damage_work; > struct work_struct resume_work; > + struct work_struct lid_work; > + struct workqueue_struct *input_wq; > > /** > * @lock: -- -- Thomas Zimmermann Graphics Driver Developer SUSE Software Solutions Germany GmbH Frankenstrasse 146, 90461 Nuernberg, Germany GF: Ivo Totev, Andrew Myers, Andrew McDonald, Boudien Moerman HRB 36809 (AG Nuernberg)