linux/include/media/cec-notifier.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0-only */
   2/*
   3 * cec-notifier.h - notify CEC drivers of physical address changes
   4 *
   5 * Copyright 2016 Russell King <rmk+kernel@arm.linux.org.uk>
   6 * Copyright 2016-2017 Cisco Systems, Inc. and/or its affiliates. All rights reserved.
   7 */
   8
   9#ifndef LINUX_CEC_NOTIFIER_H
  10#define LINUX_CEC_NOTIFIER_H
  11
  12#include <linux/err.h>
  13#include <media/cec.h>
  14
  15struct device;
  16struct edid;
  17struct cec_adapter;
  18struct cec_notifier;
  19
  20#if IS_REACHABLE(CONFIG_CEC_CORE) && IS_ENABLED(CONFIG_CEC_NOTIFIER)
  21
  22/**
  23 * cec_notifier_get_conn - find or create a new cec_notifier for the given
  24 * device and connector tuple.
  25 * @dev: device that sends the events.
  26 * @conn: the connector name from which the event occurs
  27 *
  28 * If a notifier for device @dev already exists, then increase the refcount
  29 * and return that notifier.
  30 *
  31 * If it doesn't exist, then allocate a new notifier struct and return a
  32 * pointer to that new struct.
  33 *
  34 * Return NULL if the memory could not be allocated.
  35 */
  36struct cec_notifier *cec_notifier_get_conn(struct device *dev,
  37                                           const char *conn);
  38
  39/**
  40 * cec_notifier_put - decrease refcount and delete when the refcount reaches 0.
  41 * @n: notifier
  42 */
  43void cec_notifier_put(struct cec_notifier *n);
  44
  45/**
  46 * cec_notifier_conn_register - find or create a new cec_notifier for the given
  47 * HDMI device and connector tuple.
  48 * @hdmi_dev: HDMI device that sends the events.
  49 * @conn_name: the connector name from which the event occurs. May be NULL
  50 * if there is always only one HDMI connector created by the HDMI device.
  51 * @conn_info: the connector info from which the event occurs (may be NULL)
  52 *
  53 * If a notifier for device @dev and connector @conn_name already exists, then
  54 * increase the refcount and return that notifier.
  55 *
  56 * If it doesn't exist, then allocate a new notifier struct and return a
  57 * pointer to that new struct.
  58 *
  59 * Return NULL if the memory could not be allocated.
  60 */
  61struct cec_notifier *
  62cec_notifier_conn_register(struct device *hdmi_dev, const char *conn_name,
  63                           const struct cec_connector_info *conn_info);
  64
  65/**
  66 * cec_notifier_conn_unregister - decrease refcount and delete when the
  67 * refcount reaches 0.
  68 * @n: notifier. If NULL, then this function does nothing.
  69 */
  70void cec_notifier_conn_unregister(struct cec_notifier *n);
  71
  72/**
  73 * cec_notifier_cec_adap_register - find or create a new cec_notifier for the
  74 * given device.
  75 * @hdmi_dev: HDMI device that sends the events.
  76 * @conn_name: the connector name from which the event occurs. May be NULL
  77 * if there is always only one HDMI connector created by the HDMI device.
  78 * @adap: the cec adapter that registered this notifier.
  79 *
  80 * If a notifier for device @dev and connector @conn_name already exists, then
  81 * increase the refcount and return that notifier.
  82 *
  83 * If it doesn't exist, then allocate a new notifier struct and return a
  84 * pointer to that new struct.
  85 *
  86 * Return NULL if the memory could not be allocated.
  87 */
  88struct cec_notifier *
  89cec_notifier_cec_adap_register(struct device *hdmi_dev, const char *conn_name,
  90                               struct cec_adapter *adap);
  91
  92/**
  93 * cec_notifier_cec_adap_unregister - decrease refcount and delete when the
  94 * refcount reaches 0.
  95 * @n: notifier. If NULL, then this function does nothing.
  96 * @adap: the cec adapter that registered this notifier.
  97 */
  98void cec_notifier_cec_adap_unregister(struct cec_notifier *n,
  99                                      struct cec_adapter *adap);
 100
 101/**
 102 * cec_notifier_set_phys_addr - set a new physical address.
 103 * @n: the CEC notifier
 104 * @pa: the CEC physical address
 105 *
 106 * Set a new CEC physical address.
 107 * Does nothing if @n == NULL.
 108 */
 109void cec_notifier_set_phys_addr(struct cec_notifier *n, u16 pa);
 110
 111/**
 112 * cec_notifier_set_phys_addr_from_edid - set parse the PA from the EDID.
 113 * @n: the CEC notifier
 114 * @edid: the struct edid pointer
 115 *
 116 * Parses the EDID to obtain the new CEC physical address and set it.
 117 * Does nothing if @n == NULL.
 118 */
 119void cec_notifier_set_phys_addr_from_edid(struct cec_notifier *n,
 120                                          const struct edid *edid);
 121
 122/**
 123 * cec_notifier_parse_hdmi_phandle - find the hdmi device from "hdmi-phandle"
 124 * @dev: the device with the "hdmi-phandle" device tree property
 125 *
 126 * Returns the device pointer referenced by the "hdmi-phandle" property.
 127 * Note that the refcount of the returned device is not incremented.
 128 * This device pointer is only used as a key value in the notifier
 129 * list, but it is never accessed by the CEC driver.
 130 */
 131struct device *cec_notifier_parse_hdmi_phandle(struct device *dev);
 132
 133#else
 134static inline struct cec_notifier *cec_notifier_get_conn(struct device *dev,
 135                                                         const char *conn)
 136{
 137        /* A non-NULL pointer is expected on success */
 138        return (struct cec_notifier *)0xdeadfeed;
 139}
 140
 141static inline void cec_notifier_put(struct cec_notifier *n)
 142{
 143}
 144
 145static inline struct cec_notifier *
 146cec_notifier_conn_register(struct device *hdmi_dev, const char *conn_name,
 147                           const struct cec_connector_info *conn_info)
 148{
 149        /* A non-NULL pointer is expected on success */
 150        return (struct cec_notifier *)0xdeadfeed;
 151}
 152
 153static inline void cec_notifier_conn_unregister(struct cec_notifier *n)
 154{
 155}
 156
 157static inline struct cec_notifier *
 158cec_notifier_cec_adap_register(struct device *hdmi_dev, const char *conn_name,
 159                               struct cec_adapter *adap)
 160{
 161        /* A non-NULL pointer is expected on success */
 162        return (struct cec_notifier *)0xdeadfeed;
 163}
 164
 165static inline void cec_notifier_cec_adap_unregister(struct cec_notifier *n,
 166                                                    struct cec_adapter *adap)
 167{
 168}
 169
 170static inline void cec_notifier_set_phys_addr(struct cec_notifier *n, u16 pa)
 171{
 172}
 173
 174static inline void cec_notifier_set_phys_addr_from_edid(struct cec_notifier *n,
 175                                                        const struct edid *edid)
 176{
 177}
 178
 179static inline struct device *cec_notifier_parse_hdmi_phandle(struct device *dev)
 180{
 181        return ERR_PTR(-ENODEV);
 182}
 183
 184#endif
 185
 186/**
 187 * cec_notifier_get - find or create a new cec_notifier for the given device.
 188 * @dev: device that sends the events.
 189 *
 190 * If a notifier for device @dev already exists, then increase the refcount
 191 * and return that notifier.
 192 *
 193 * If it doesn't exist, then allocate a new notifier struct and return a
 194 * pointer to that new struct.
 195 *
 196 * Return NULL if the memory could not be allocated.
 197 */
 198static inline struct cec_notifier *cec_notifier_get(struct device *dev)
 199{
 200        return cec_notifier_get_conn(dev, NULL);
 201}
 202
 203/**
 204 * cec_notifier_phys_addr_invalidate() - set the physical address to INVALID
 205 *
 206 * @n: the CEC notifier
 207 *
 208 * This is a simple helper function to invalidate the physical
 209 * address. Does nothing if @n == NULL.
 210 */
 211static inline void cec_notifier_phys_addr_invalidate(struct cec_notifier *n)
 212{
 213        cec_notifier_set_phys_addr(n, CEC_PHYS_ADDR_INVALID);
 214}
 215
 216#endif
 217