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