xref: /linux/include/drm/drm_privacy_screen_driver.h (revision 4f2c0a4acffbec01079c28f839422e64ddeff004)
1a1a98689SHans de Goede /* SPDX-License-Identifier: MIT */
2a1a98689SHans de Goede /*
3a1a98689SHans de Goede  * Copyright (C) 2020 Red Hat, Inc.
4a1a98689SHans de Goede  *
5a1a98689SHans de Goede  * Authors:
6a1a98689SHans de Goede  * Hans de Goede <hdegoede@redhat.com>
7a1a98689SHans de Goede  */
8a1a98689SHans de Goede 
9a1a98689SHans de Goede #ifndef __DRM_PRIVACY_SCREEN_DRIVER_H__
10a1a98689SHans de Goede #define __DRM_PRIVACY_SCREEN_DRIVER_H__
11a1a98689SHans de Goede 
12a1a98689SHans de Goede #include <linux/device.h>
13a1a98689SHans de Goede #include <linux/list.h>
14a1a98689SHans de Goede #include <linux/mutex.h>
15a1a98689SHans de Goede #include <drm/drm_connector.h>
16a1a98689SHans de Goede 
17a1a98689SHans de Goede struct drm_privacy_screen;
18a1a98689SHans de Goede 
19a1a98689SHans de Goede /**
20a1a98689SHans de Goede  * struct drm_privacy_screen_ops - drm_privacy_screen operations
21a1a98689SHans de Goede  *
22a1a98689SHans de Goede  * Defines the operations which the privacy-screen class code may call.
23a1a98689SHans de Goede  * These functions should be implemented by the privacy-screen driver.
24a1a98689SHans de Goede  */
25a1a98689SHans de Goede struct drm_privacy_screen_ops {
26a1a98689SHans de Goede 	/**
27a1a98689SHans de Goede 	 * @set_sw_state: Called to request a change of the privacy-screen
28a1a98689SHans de Goede 	 * state. The privacy-screen class code contains a check to avoid this
29a1a98689SHans de Goede 	 * getting called when the hw_state reports the state is locked.
30a1a98689SHans de Goede 	 * It is the driver's responsibility to update sw_state and hw_state.
31a1a98689SHans de Goede 	 * This is always called with the drm_privacy_screen's lock held.
32a1a98689SHans de Goede 	 */
33a1a98689SHans de Goede 	int (*set_sw_state)(struct drm_privacy_screen *priv,
34a1a98689SHans de Goede 			    enum drm_privacy_screen_status sw_state);
35a1a98689SHans de Goede 	/**
36a1a98689SHans de Goede 	 * @get_hw_state: Called to request that the driver gets the current
37a1a98689SHans de Goede 	 * privacy-screen state from the hardware and then updates sw_state and
38a1a98689SHans de Goede 	 * hw_state accordingly. This will be called by the core just before
39a1a98689SHans de Goede 	 * the privacy-screen is registered in sysfs.
40a1a98689SHans de Goede 	 */
41a1a98689SHans de Goede 	void (*get_hw_state)(struct drm_privacy_screen *priv);
42a1a98689SHans de Goede };
43a1a98689SHans de Goede 
44a1a98689SHans de Goede /**
45a1a98689SHans de Goede  * struct drm_privacy_screen - central privacy-screen structure
46a1a98689SHans de Goede  *
47a1a98689SHans de Goede  * Central privacy-screen structure, this contains the struct device used
48a1a98689SHans de Goede  * to register the screen in sysfs, the screen's state, ops, etc.
49a1a98689SHans de Goede  */
50a1a98689SHans de Goede struct drm_privacy_screen {
51a1a98689SHans de Goede 	/** @dev: device used to register the privacy-screen in sysfs. */
52a1a98689SHans de Goede 	struct device dev;
53a1a98689SHans de Goede 	/** @lock: mutex protection all fields in this struct. */
54a1a98689SHans de Goede 	struct mutex lock;
55a1a98689SHans de Goede 	/** @list: privacy-screen devices list list-entry. */
56a1a98689SHans de Goede 	struct list_head list;
578a12b170SHans de Goede 	/** @notifier_head: privacy-screen notifier head. */
588a12b170SHans de Goede 	struct blocking_notifier_head notifier_head;
59a1a98689SHans de Goede 	/**
60a1a98689SHans de Goede 	 * @ops: &struct drm_privacy_screen_ops for this privacy-screen.
61a1a98689SHans de Goede 	 * This is NULL if the driver has unregistered the privacy-screen.
62a1a98689SHans de Goede 	 */
63a1a98689SHans de Goede 	const struct drm_privacy_screen_ops *ops;
64a1a98689SHans de Goede 	/**
65a1a98689SHans de Goede 	 * @sw_state: The privacy-screen's software state, see
66a1a98689SHans de Goede 	 * :ref:`Standard Connector Properties<standard_connector_properties>`
67a1a98689SHans de Goede 	 * for more info.
68a1a98689SHans de Goede 	 */
69a1a98689SHans de Goede 	enum drm_privacy_screen_status sw_state;
70a1a98689SHans de Goede 	/**
71a1a98689SHans de Goede 	 * @hw_state: The privacy-screen's hardware state, see
72a1a98689SHans de Goede 	 * :ref:`Standard Connector Properties<standard_connector_properties>`
73a1a98689SHans de Goede 	 * for more info.
74a1a98689SHans de Goede 	 */
75a1a98689SHans de Goede 	enum drm_privacy_screen_status hw_state;
76*30598d92SRajat Jain 	/**
77*30598d92SRajat Jain 	 * @drvdata: Private data owned by the privacy screen provider
78*30598d92SRajat Jain 	 */
79*30598d92SRajat Jain 	void *drvdata;
80a1a98689SHans de Goede };
81a1a98689SHans de Goede 
82*30598d92SRajat Jain static inline
drm_privacy_screen_get_drvdata(struct drm_privacy_screen * priv)83*30598d92SRajat Jain void *drm_privacy_screen_get_drvdata(struct drm_privacy_screen *priv)
84*30598d92SRajat Jain {
85*30598d92SRajat Jain 	return priv->drvdata;
86*30598d92SRajat Jain }
87*30598d92SRajat Jain 
88a1a98689SHans de Goede struct drm_privacy_screen *drm_privacy_screen_register(
89*30598d92SRajat Jain 	struct device *parent, const struct drm_privacy_screen_ops *ops,
90*30598d92SRajat Jain 	void *data);
91a1a98689SHans de Goede void drm_privacy_screen_unregister(struct drm_privacy_screen *priv);
92a1a98689SHans de Goede 
938a12b170SHans de Goede void drm_privacy_screen_call_notifier_chain(struct drm_privacy_screen *priv);
948a12b170SHans de Goede 
95a1a98689SHans de Goede #endif
96