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