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 */ 97void cec_notifier_cec_adap_unregister(struct cec_notifier *n); 98 99/** 100 * cec_notifier_set_phys_addr - set a new physical address. 101 * @n: the CEC notifier 102 * @pa: the CEC physical address 103 * 104 * Set a new CEC physical address. 105 * Does nothing if @n == NULL. 106 */ 107void cec_notifier_set_phys_addr(struct cec_notifier *n, u16 pa); 108 109/** 110 * cec_notifier_set_phys_addr_from_edid - set parse the PA from the EDID. 111 * @n: the CEC notifier 112 * @edid: the struct edid pointer 113 * 114 * Parses the EDID to obtain the new CEC physical address and set it. 115 * Does nothing if @n == NULL. 116 */ 117void cec_notifier_set_phys_addr_from_edid(struct cec_notifier *n, 118 const struct edid *edid); 119 120/** 121 * cec_notifier_parse_hdmi_phandle - find the hdmi device from "hdmi-phandle" 122 * @dev: the device with the "hdmi-phandle" device tree property 123 * 124 * Returns the device pointer referenced by the "hdmi-phandle" property. 125 * Note that the refcount of the returned device is not incremented. 126 * This device pointer is only used as a key value in the notifier 127 * list, but it is never accessed by the CEC driver. 128 */ 129struct device *cec_notifier_parse_hdmi_phandle(struct device *dev); 130 131#else 132static inline struct cec_notifier *cec_notifier_get_conn(struct device *dev, 133 const char *conn) 134{ 135 /* A non-NULL pointer is expected on success */ 136 return (struct cec_notifier *)0xdeadfeed; 137} 138 139static inline void cec_notifier_put(struct cec_notifier *n) 140{ 141} 142 143static inline struct cec_notifier * 144cec_notifier_conn_register(struct device *hdmi_dev, const char *conn_name, 145 const struct cec_connector_info *conn_info) 146{ 147 /* A non-NULL pointer is expected on success */ 148 return (struct cec_notifier *)0xdeadfeed; 149} 150 151static inline void cec_notifier_conn_unregister(struct cec_notifier *n) 152{ 153} 154 155static inline struct cec_notifier * 156cec_notifier_cec_adap_register(struct device *hdmi_dev, const char *conn_name, 157 struct cec_adapter *adap) 158{ 159 /* A non-NULL pointer is expected on success */ 160 return (struct cec_notifier *)0xdeadfeed; 161} 162 163static inline void cec_notifier_cec_adap_unregister(struct cec_notifier *n) 164{ 165} 166 167static inline void cec_notifier_set_phys_addr(struct cec_notifier *n, u16 pa) 168{ 169} 170 171static inline void cec_notifier_set_phys_addr_from_edid(struct cec_notifier *n, 172 const struct edid *edid) 173{ 174} 175 176static inline struct device *cec_notifier_parse_hdmi_phandle(struct device *dev) 177{ 178 return ERR_PTR(-ENODEV); 179} 180 181#endif 182 183/** 184 * cec_notifier_get - find or create a new cec_notifier for the given device. 185 * @dev: device that sends the events. 186 * 187 * If a notifier for device @dev already exists, then increase the refcount 188 * and return that notifier. 189 * 190 * If it doesn't exist, then allocate a new notifier struct and return a 191 * pointer to that new struct. 192 * 193 * Return NULL if the memory could not be allocated. 194 */ 195static inline struct cec_notifier *cec_notifier_get(struct device *dev) 196{ 197 return cec_notifier_get_conn(dev, NULL); 198} 199 200/** 201 * cec_notifier_phys_addr_invalidate() - set the physical address to INVALID 202 * 203 * @n: the CEC notifier 204 * 205 * This is a simple helper function to invalidate the physical 206 * address. Does nothing if @n == NULL. 207 */ 208static inline void cec_notifier_phys_addr_invalidate(struct cec_notifier *n) 209{ 210 cec_notifier_set_phys_addr(n, CEC_PHYS_ADDR_INVALID); 211} 212 213#endif 214