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;
7630598d92SRajat Jain /**
7730598d92SRajat Jain * @drvdata: Private data owned by the privacy screen provider
7830598d92SRajat Jain */
7930598d92SRajat Jain void *drvdata;
80a1a98689SHans de Goede };
81a1a98689SHans de Goede
8230598d92SRajat Jain static inline
drm_privacy_screen_get_drvdata(struct drm_privacy_screen * priv)8330598d92SRajat Jain void *drm_privacy_screen_get_drvdata(struct drm_privacy_screen *priv)
8430598d92SRajat Jain {
8530598d92SRajat Jain return priv->drvdata;
8630598d92SRajat Jain }
8730598d92SRajat Jain
88a1a98689SHans de Goede struct drm_privacy_screen *drm_privacy_screen_register(
8930598d92SRajat Jain struct device *parent, const struct drm_privacy_screen_ops *ops,
9030598d92SRajat 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