at master 5.2 kB view raw
1/* SPDX-License-Identifier: GPL-2.0-or-later */ 2/* 3 * Generic framer header file 4 * 5 * Copyright 2023 CS GROUP France 6 * 7 * Author: Herve Codina <herve.codina@bootlin.com> 8 */ 9 10#ifndef __DRIVERS_FRAMER_H 11#define __DRIVERS_FRAMER_H 12 13#include <linux/err.h> 14#include <linux/mutex.h> 15#include <linux/notifier.h> 16#include <linux/of.h> 17#include <linux/device.h> 18#include <linux/workqueue.h> 19 20/** 21 * enum framer_iface - Framer interface 22 * @FRAMER_IFACE_E1: E1 interface 23 * @FRAMER_IFACE_T1: T1 interface 24 */ 25enum framer_iface { 26 FRAMER_IFACE_E1, 27 FRAMER_IFACE_T1, 28}; 29 30/** 31 * enum framer_clock_type - Framer clock type 32 * @FRAMER_CLOCK_EXT: External clock 33 * @FRAMER_CLOCK_INT: Internal clock 34 */ 35enum framer_clock_type { 36 FRAMER_CLOCK_EXT, 37 FRAMER_CLOCK_INT, 38}; 39 40/** 41 * struct framer_config - Framer configuration 42 * @iface: Framer line interface 43 * @clock_type: Framer clock type 44 * @line_clock_rate: Framer line clock rate 45 */ 46struct framer_config { 47 enum framer_iface iface; 48 enum framer_clock_type clock_type; 49 unsigned long line_clock_rate; 50}; 51 52/** 53 * struct framer_status - Framer status 54 * @link_is_on: Framer link state. true, the link is on, false, the link is off. 55 */ 56struct framer_status { 57 bool link_is_on; 58}; 59 60/** 61 * enum framer_event - Event available for notification 62 * @FRAMER_EVENT_STATUS: Event notified on framer_status changes 63 */ 64enum framer_event { 65 FRAMER_EVENT_STATUS, 66}; 67 68/** 69 * struct framer - represents the framer device 70 * @dev: framer device 71 * @id: id of the framer device 72 * @ops: function pointers for performing framer operations 73 * @mutex: mutex to protect framer_ops 74 * @init_count: used to protect when the framer is used by multiple consumers 75 * @power_count: used to protect when the framer is used by multiple consumers 76 * @pwr: power regulator associated with the framer 77 * @notify_status_work: work structure used for status notifications 78 * @notifier_list: notifier list used for notifications 79 * @polling_work: delayed work structure used for the polling task 80 * @prev_status: previous read status used by the polling task to detect changes 81 */ 82struct framer { 83 struct device dev; 84 int id; 85 const struct framer_ops *ops; 86 struct mutex mutex; /* Protect framer */ 87 int init_count; 88 int power_count; 89 struct regulator *pwr; 90 struct work_struct notify_status_work; 91 struct blocking_notifier_head notifier_list; 92 struct delayed_work polling_work; 93 struct framer_status prev_status; 94}; 95 96#if IS_ENABLED(CONFIG_GENERIC_FRAMER) 97int framer_pm_runtime_get(struct framer *framer); 98int framer_pm_runtime_get_sync(struct framer *framer); 99int framer_pm_runtime_put(struct framer *framer); 100int framer_pm_runtime_put_sync(struct framer *framer); 101int framer_init(struct framer *framer); 102int framer_exit(struct framer *framer); 103int framer_power_on(struct framer *framer); 104int framer_power_off(struct framer *framer); 105int framer_get_status(struct framer *framer, struct framer_status *status); 106int framer_get_config(struct framer *framer, struct framer_config *config); 107int framer_set_config(struct framer *framer, const struct framer_config *config); 108int framer_notifier_register(struct framer *framer, struct notifier_block *nb); 109int framer_notifier_unregister(struct framer *framer, struct notifier_block *nb); 110 111struct framer *framer_get(struct device *dev, const char *con_id); 112void framer_put(struct device *dev, struct framer *framer); 113 114struct framer *devm_framer_get(struct device *dev, const char *con_id); 115struct framer *devm_framer_optional_get(struct device *dev, const char *con_id); 116#else 117static inline int framer_pm_runtime_get(struct framer *framer) 118{ 119 return -ENOSYS; 120} 121 122static inline int framer_pm_runtime_get_sync(struct framer *framer) 123{ 124 return -ENOSYS; 125} 126 127static inline int framer_pm_runtime_put(struct framer *framer) 128{ 129 return -ENOSYS; 130} 131 132static inline int framer_pm_runtime_put_sync(struct framer *framer) 133{ 134 return -ENOSYS; 135} 136 137static inline int framer_init(struct framer *framer) 138{ 139 return -ENOSYS; 140} 141 142static inline int framer_exit(struct framer *framer) 143{ 144 return -ENOSYS; 145} 146 147static inline int framer_power_on(struct framer *framer) 148{ 149 return -ENOSYS; 150} 151 152static inline int framer_power_off(struct framer *framer) 153{ 154 return -ENOSYS; 155} 156 157static inline int framer_get_status(struct framer *framer, struct framer_status *status) 158{ 159 return -ENOSYS; 160} 161 162static inline int framer_get_config(struct framer *framer, struct framer_config *config) 163{ 164 return -ENOSYS; 165} 166 167static inline int framer_set_config(struct framer *framer, const struct framer_config *config) 168{ 169 return -ENOSYS; 170} 171 172static inline int framer_notifier_register(struct framer *framer, 173 struct notifier_block *nb) 174{ 175 return -ENOSYS; 176} 177 178static inline int framer_notifier_unregister(struct framer *framer, 179 struct notifier_block *nb) 180{ 181 return -ENOSYS; 182} 183 184static inline struct framer *framer_get(struct device *dev, const char *con_id) 185{ 186 return ERR_PTR(-ENOSYS); 187} 188 189static inline void framer_put(struct device *dev, struct framer *framer) 190{ 191} 192 193static inline struct framer *devm_framer_get(struct device *dev, const char *con_id) 194{ 195 return ERR_PTR(-ENOSYS); 196} 197 198static inline struct framer *devm_framer_optional_get(struct device *dev, const char *con_id) 199{ 200 return NULL; 201} 202 203#endif 204 205#endif /* __DRIVERS_FRAMER_H */