Something went wrong. Try again.
Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205/* SPDX-License-Identifier: GPL-2.0-or-later *//* * Generic framer header file * * Copyright 2023 CS GROUP France * * Author: Herve Codina <herve.codina@bootlin.com> */
#ifndef __DRIVERS_FRAMER_H#define __DRIVERS_FRAMER_H
#include <linux/err.h>#include <linux/mutex.h>#include <linux/notifier.h>#include <linux/of.h>#include <linux/device.h>#include <linux/workqueue.h>
/** * enum framer_iface - Framer interface * @FRAMER_IFACE_E1: E1 interface * @FRAMER_IFACE_T1: T1 interface */enum framer_iface { FRAMER_IFACE_E1, FRAMER_IFACE_T1,};
/** * enum framer_clock_type - Framer clock type * @FRAMER_CLOCK_EXT: External clock * @FRAMER_CLOCK_INT: Internal clock */enum framer_clock_type { FRAMER_CLOCK_EXT, FRAMER_CLOCK_INT,};
/** * struct framer_config - Framer configuration * @iface: Framer line interface * @clock_type: Framer clock type * @line_clock_rate: Framer line clock rate */struct framer_config { enum framer_iface iface; enum framer_clock_type clock_type; unsigned long line_clock_rate;};
/** * struct framer_status - Framer status * @link_is_on: Framer link state. true, the link is on, false, the link is off. */struct framer_status { bool link_is_on;};
/** * enum framer_event - Event available for notification * @FRAMER_EVENT_STATUS: Event notified on framer_status changes */enum framer_event { FRAMER_EVENT_STATUS,};
/** * struct framer - represents the framer device * @dev: framer device * @id: id of the framer device * @ops: function pointers for performing framer operations * @mutex: mutex to protect framer_ops * @init_count: used to protect when the framer is used by multiple consumers * @power_count: used to protect when the framer is used by multiple consumers * @pwr: power regulator associated with the framer * @notify_status_work: work structure used for status notifications * @notifier_list: notifier list used for notifications * @polling_work: delayed work structure used for the polling task * @prev_status: previous read status used by the polling task to detect changes */struct framer { struct device dev; int id; const struct framer_ops *ops; struct mutex mutex; /* Protect framer */ int init_count; int power_count; struct regulator *pwr; struct work_struct notify_status_work; struct blocking_notifier_head notifier_list; struct delayed_work polling_work; struct framer_status prev_status;};
#if IS_ENABLED(CONFIG_GENERIC_FRAMER)int framer_pm_runtime_get(struct framer *framer);int framer_pm_runtime_get_sync(struct framer *framer);void framer_pm_runtime_put(struct framer *framer);int framer_pm_runtime_put_sync(struct framer *framer);int framer_init(struct framer *framer);int framer_exit(struct framer *framer);int framer_power_on(struct framer *framer);int framer_power_off(struct framer *framer);int framer_get_status(struct framer *framer, struct framer_status *status);int framer_get_config(struct framer *framer, struct framer_config *config);int framer_set_config(struct framer *framer, const struct framer_config *config);int framer_notifier_register(struct framer *framer, struct notifier_block *nb);int framer_notifier_unregister(struct framer *framer, struct notifier_block *nb);
struct framer *framer_get(struct device *dev, const char *con_id);void framer_put(struct device *dev, struct framer *framer);
struct framer *devm_framer_get(struct device *dev, const char *con_id);struct framer *devm_framer_optional_get(struct device *dev, const char *con_id);#elsestatic inline int framer_pm_runtime_get(struct framer *framer){ return -ENOSYS;}
static inline int framer_pm_runtime_get_sync(struct framer *framer){ return -ENOSYS;}
static inline void framer_pm_runtime_put(struct framer *framer){}
static inline int framer_pm_runtime_put_sync(struct framer *framer){ return -ENOSYS;}
static inline int framer_init(struct framer *framer){ return -ENOSYS;}
static inline int framer_exit(struct framer *framer){ return -ENOSYS;}
static inline int framer_power_on(struct framer *framer){ return -ENOSYS;}
static inline int framer_power_off(struct framer *framer){ return -ENOSYS;}
static inline int framer_get_status(struct framer *framer, struct framer_status *status){ return -ENOSYS;}
static inline int framer_get_config(struct framer *framer, struct framer_config *config){ return -ENOSYS;}
static inline int framer_set_config(struct framer *framer, const struct framer_config *config){ return -ENOSYS;}
static inline int framer_notifier_register(struct framer *framer, struct notifier_block *nb){ return -ENOSYS;}
static inline int framer_notifier_unregister(struct framer *framer, struct notifier_block *nb){ return -ENOSYS;}
static inline struct framer *framer_get(struct device *dev, const char *con_id){ return ERR_PTR(-ENOSYS);}
static inline void framer_put(struct device *dev, struct framer *framer){}
static inline struct framer *devm_framer_get(struct device *dev, const char *con_id){ return ERR_PTR(-ENOSYS);}
static inline struct framer *devm_framer_optional_get(struct device *dev, const char *con_id){ return NULL;}
#endif
#endif /* __DRIVERS_FRAMER_H */