Lines Matching +full:parent +full:- +full:locked
1 // SPDX-License-Identifier: MIT
3 * Copyright (C) 2020 - 2021 Red Hat, Inc.
24 * register a privacy-screen device, which the KMS drivers can then use
25 * to implement the standard privacy-screen properties, see
28 * KMS drivers using a privacy-screen class device are advised to use the
45 * drm_privacy_screen_lookup_add - add an entry to the static privacy-screen
49 * Add an entry to the static privacy-screen lookup list. Note the
51 * gets added to a list owned by the privacy-screen core. So the passed in
52 * &struct drm_privacy_screen_lookup must not be free-ed until it is removed
58 list_add(&lookup->list, &drm_privacy_screen_lookup_list); in drm_privacy_screen_lookup_add()
64 * drm_privacy_screen_lookup_remove - remove an entry to the static
65 * privacy-screen lookup list
69 * from the static privacy-screen lookup list.
74 list_del(&lookup->list); in drm_privacy_screen_lookup_remove()
90 if (strcmp(dev_name(&priv->dev), name) == 0) { in drm_privacy_screen_get_by_name()
91 dev = get_device(&priv->dev); in drm_privacy_screen_get_by_name()
102 * drm_privacy_screen_get - get a privacy-screen provider
103 * @dev: consumer-device for which to get a privacy-screen provider
104 * @con_id: (video)connector name for which to get a privacy-screen provider
106 * Get a privacy-screen provider for a privacy-screen attached to the
111 * * ERR_PTR(-ENODEV) if no matching privacy-screen is found
112 * * ERR_PTR(-EPROBE_DEFER) if there is a matching privacy-screen,
122 int match, best = -1; in drm_privacy_screen_get()
127 * be extended with device-tree / fw_node lookup when support is added in drm_privacy_screen_get()
128 * for device-tree using hardware with a privacy-screen. in drm_privacy_screen_get()
137 * Then we take the most specific entry - with the following order in drm_privacy_screen_get()
145 if (l->dev_id) { in drm_privacy_screen_get()
146 if (!dev_id || strcmp(l->dev_id, dev_id)) in drm_privacy_screen_get()
152 if (l->con_id) { in drm_privacy_screen_get()
153 if (!con_id || strcmp(l->con_id, con_id)) in drm_privacy_screen_get()
160 provider = l->provider; in drm_privacy_screen_get()
168 return ERR_PTR(-ENODEV); in drm_privacy_screen_get()
172 return ERR_PTR(-EPROBE_DEFER); in drm_privacy_screen_get()
179 * drm_privacy_screen_put - release a privacy-screen reference
182 * Release a privacy-screen provider reference gotten through
184 * in which case it is a no-op.
191 put_device(&priv->dev); in drm_privacy_screen_put()
196 * drm_privacy_screen_set_sw_state - set a privacy-screen's sw-state
197 * @priv: privacy screen to set the sw-state for
198 * @sw_state: new sw-state value to set
200 * Set the sw-state of a privacy screen. If the privacy-screen is not
201 * in a locked hw-state, then the actual and hw-state of the privacy-screen
202 * will be immediately updated to the new value. If the privacy-screen is
203 * in a locked hw-state, then the new sw-state will be remembered as the
204 * requested state to put the privacy-screen in when it becomes unlocked.
213 mutex_lock(&priv->lock); in drm_privacy_screen_set_sw_state()
215 if (!priv->ops) { in drm_privacy_screen_set_sw_state()
216 ret = -ENODEV; in drm_privacy_screen_set_sw_state()
222 * sw_state while the hw_state is locked is allowed. In this case in drm_privacy_screen_set_sw_state()
223 * it is a no-op other then storing the new sw_state so that it in drm_privacy_screen_set_sw_state()
227 if (priv->hw_state >= PRIVACY_SCREEN_DISABLED_LOCKED || in drm_privacy_screen_set_sw_state()
228 priv->hw_state == sw_state) { in drm_privacy_screen_set_sw_state()
229 priv->sw_state = sw_state; in drm_privacy_screen_set_sw_state()
233 ret = priv->ops->set_sw_state(priv, sw_state); in drm_privacy_screen_set_sw_state()
235 mutex_unlock(&priv->lock); in drm_privacy_screen_set_sw_state()
241 * drm_privacy_screen_get_state - get privacy-screen's current state
243 * @sw_state_ret: address where to store the privacy-screens current sw-state
244 * @hw_state_ret: address where to store the privacy-screens current hw-state
246 * Get the current state of a privacy-screen, both the sw-state and the
247 * hw-state.
253 mutex_lock(&priv->lock); in drm_privacy_screen_get_state()
254 *sw_state_ret = priv->sw_state; in drm_privacy_screen_get_state()
255 *hw_state_ret = priv->hw_state; in drm_privacy_screen_get_state()
256 mutex_unlock(&priv->lock); in drm_privacy_screen_get_state()
261 * drm_privacy_screen_register_notifier - register a notifier
263 * @nb: Notifier-block for the notifier to register
265 * Register a notifier with the privacy-screen to be notified of changes made
266 * to the privacy-screen state from outside of the privacy-screen class.
283 return blocking_notifier_chain_register(&priv->notifier_head, nb); in drm_privacy_screen_register_notifier()
288 * drm_privacy_screen_unregister_notifier - unregister a notifier
290 * @nb: Notifier-block for the notifier to register
299 return blocking_notifier_chain_unregister(&priv->notifier_head, nb); in drm_privacy_screen_unregister_notifier()
315 mutex_lock(&priv->lock); in sw_state_show()
317 if (!priv->ops) in sw_state_show()
318 ret = -ENODEV; in sw_state_show()
319 else if (WARN_ON(priv->sw_state >= ARRAY_SIZE(sw_state_names))) in sw_state_show()
320 ret = -ENXIO; in sw_state_show()
322 ret = sprintf(buf, "%s\n", sw_state_names[priv->sw_state]); in sw_state_show()
324 mutex_unlock(&priv->lock); in sw_state_show()
340 "Disabled, locked", in hw_state_show()
341 "Enabled, locked", in hw_state_show()
345 mutex_lock(&priv->lock); in hw_state_show()
347 if (!priv->ops) in hw_state_show()
348 ret = -ENODEV; in hw_state_show()
349 else if (WARN_ON(priv->hw_state >= ARRAY_SIZE(hw_state_names))) in hw_state_show()
350 ret = -ENXIO; in hw_state_show()
352 ret = sprintf(buf, "%s\n", hw_state_names[priv->hw_state]); in hw_state_show()
354 mutex_unlock(&priv->lock); in hw_state_show()
379 * drm_privacy_screen_register - register a privacy-screen
380 * @parent: parent-device for the privacy-screen
381 * @ops: &struct drm_privacy_screen_ops pointer with ops for the privacy-screen
384 * Create and register a privacy-screen.
387 * * A pointer to the created privacy-screen on success.
391 struct device *parent, const struct drm_privacy_screen_ops *ops, in drm_privacy_screen_register() argument
399 return ERR_PTR(-ENOMEM); in drm_privacy_screen_register()
401 mutex_init(&priv->lock); in drm_privacy_screen_register()
402 BLOCKING_INIT_NOTIFIER_HEAD(&priv->notifier_head); in drm_privacy_screen_register()
404 priv->dev.class = drm_class; in drm_privacy_screen_register()
405 priv->dev.type = &drm_privacy_screen_type; in drm_privacy_screen_register()
406 priv->dev.parent = parent; in drm_privacy_screen_register()
407 priv->dev.release = drm_privacy_screen_device_release; in drm_privacy_screen_register()
408 dev_set_name(&priv->dev, "privacy_screen-%s", dev_name(parent)); in drm_privacy_screen_register()
409 priv->drvdata = data; in drm_privacy_screen_register()
410 priv->ops = ops; in drm_privacy_screen_register()
412 priv->ops->get_hw_state(priv); in drm_privacy_screen_register()
414 ret = device_register(&priv->dev); in drm_privacy_screen_register()
416 put_device(&priv->dev); in drm_privacy_screen_register()
421 list_add(&priv->list, &drm_privacy_screen_devs); in drm_privacy_screen_register()
429 * drm_privacy_screen_unregister - unregister privacy-screen
430 * @priv: privacy-screen to unregister
432 * Unregister a privacy-screen registered with drm_privacy_screen_register().
433 * May be called with a NULL or ERR_PTR, in which case it is a no-op.
441 list_del(&priv->list); in drm_privacy_screen_unregister()
444 mutex_lock(&priv->lock); in drm_privacy_screen_unregister()
445 priv->drvdata = NULL; in drm_privacy_screen_unregister()
446 priv->ops = NULL; in drm_privacy_screen_unregister()
447 mutex_unlock(&priv->lock); in drm_privacy_screen_unregister()
449 device_unregister(&priv->dev); in drm_privacy_screen_unregister()
454 * drm_privacy_screen_call_notifier_chain - notify consumers of state change
457 * A privacy-screen provider driver can call this functions upon external
458 * changes to the privacy-screen state. E.g. the state may be changed by the
460 * This function must be called without holding the privacy-screen lock.
469 blocking_notifier_call_chain(&priv->notifier_head, 0, priv); in drm_privacy_screen_call_notifier_chain()