182c944d0SHerve Codina /* SPDX-License-Identifier: GPL-2.0-or-later */
282c944d0SHerve Codina /*
382c944d0SHerve Codina * Generic framer header file
482c944d0SHerve Codina *
582c944d0SHerve Codina * Copyright 2023 CS GROUP France
682c944d0SHerve Codina *
782c944d0SHerve Codina * Author: Herve Codina <[email protected]>
882c944d0SHerve Codina */
982c944d0SHerve Codina
1082c944d0SHerve Codina #ifndef __DRIVERS_FRAMER_H
1182c944d0SHerve Codina #define __DRIVERS_FRAMER_H
1282c944d0SHerve Codina
1382c944d0SHerve Codina #include <linux/err.h>
1482c944d0SHerve Codina #include <linux/mutex.h>
1582c944d0SHerve Codina #include <linux/notifier.h>
1682c944d0SHerve Codina #include <linux/of.h>
1782c944d0SHerve Codina #include <linux/device.h>
1882c944d0SHerve Codina #include <linux/workqueue.h>
1982c944d0SHerve Codina
2082c944d0SHerve Codina /**
2182c944d0SHerve Codina * enum framer_iface - Framer interface
2282c944d0SHerve Codina * @FRAMER_IFACE_E1: E1 interface
2382c944d0SHerve Codina * @FRAMER_IFACE_T1: T1 interface
2482c944d0SHerve Codina */
2582c944d0SHerve Codina enum framer_iface {
2682c944d0SHerve Codina FRAMER_IFACE_E1,
2782c944d0SHerve Codina FRAMER_IFACE_T1,
2882c944d0SHerve Codina };
2982c944d0SHerve Codina
3082c944d0SHerve Codina /**
3182c944d0SHerve Codina * enum framer_clock_type - Framer clock type
3282c944d0SHerve Codina * @FRAMER_CLOCK_EXT: External clock
3382c944d0SHerve Codina * @FRAMER_CLOCK_INT: Internal clock
3482c944d0SHerve Codina */
3582c944d0SHerve Codina enum framer_clock_type {
3682c944d0SHerve Codina FRAMER_CLOCK_EXT,
3782c944d0SHerve Codina FRAMER_CLOCK_INT,
3882c944d0SHerve Codina };
3982c944d0SHerve Codina
4082c944d0SHerve Codina /**
4182c944d0SHerve Codina * struct framer_config - Framer configuration
4282c944d0SHerve Codina * @iface: Framer line interface
4382c944d0SHerve Codina * @clock_type: Framer clock type
4482c944d0SHerve Codina * @line_clock_rate: Framer line clock rate
4582c944d0SHerve Codina */
4682c944d0SHerve Codina struct framer_config {
4782c944d0SHerve Codina enum framer_iface iface;
4882c944d0SHerve Codina enum framer_clock_type clock_type;
4982c944d0SHerve Codina unsigned long line_clock_rate;
5082c944d0SHerve Codina };
5182c944d0SHerve Codina
5282c944d0SHerve Codina /**
5382c944d0SHerve Codina * struct framer_status - Framer status
5482c944d0SHerve Codina * @link_is_on: Framer link state. true, the link is on, false, the link is off.
5582c944d0SHerve Codina */
5682c944d0SHerve Codina struct framer_status {
5782c944d0SHerve Codina bool link_is_on;
5882c944d0SHerve Codina };
5982c944d0SHerve Codina
6082c944d0SHerve Codina /**
6182c944d0SHerve Codina * enum framer_event - Event available for notification
6282c944d0SHerve Codina * @FRAMER_EVENT_STATUS: Event notified on framer_status changes
6382c944d0SHerve Codina */
6482c944d0SHerve Codina enum framer_event {
6582c944d0SHerve Codina FRAMER_EVENT_STATUS,
6682c944d0SHerve Codina };
6782c944d0SHerve Codina
6882c944d0SHerve Codina /**
6982c944d0SHerve Codina * struct framer - represents the framer device
7082c944d0SHerve Codina * @dev: framer device
7182c944d0SHerve Codina * @id: id of the framer device
7282c944d0SHerve Codina * @ops: function pointers for performing framer operations
7382c944d0SHerve Codina * @mutex: mutex to protect framer_ops
7482c944d0SHerve Codina * @init_count: used to protect when the framer is used by multiple consumers
7582c944d0SHerve Codina * @power_count: used to protect when the framer is used by multiple consumers
7682c944d0SHerve Codina * @pwr: power regulator associated with the framer
7782c944d0SHerve Codina * @notify_status_work: work structure used for status notifications
7882c944d0SHerve Codina * @notifier_list: notifier list used for notifications
7982c944d0SHerve Codina * @polling_work: delayed work structure used for the polling task
8082c944d0SHerve Codina * @prev_status: previous read status used by the polling task to detect changes
8182c944d0SHerve Codina */
8282c944d0SHerve Codina struct framer {
8382c944d0SHerve Codina struct device dev;
8482c944d0SHerve Codina int id;
8582c944d0SHerve Codina const struct framer_ops *ops;
8682c944d0SHerve Codina struct mutex mutex; /* Protect framer */
8782c944d0SHerve Codina int init_count;
8882c944d0SHerve Codina int power_count;
8982c944d0SHerve Codina struct regulator *pwr;
9082c944d0SHerve Codina struct work_struct notify_status_work;
9182c944d0SHerve Codina struct blocking_notifier_head notifier_list;
9282c944d0SHerve Codina struct delayed_work polling_work;
9382c944d0SHerve Codina struct framer_status prev_status;
9482c944d0SHerve Codina };
9582c944d0SHerve Codina
9682c944d0SHerve Codina #if IS_ENABLED(CONFIG_GENERIC_FRAMER)
9782c944d0SHerve Codina int framer_pm_runtime_get(struct framer *framer);
9882c944d0SHerve Codina int framer_pm_runtime_get_sync(struct framer *framer);
9982c944d0SHerve Codina int framer_pm_runtime_put(struct framer *framer);
10082c944d0SHerve Codina int framer_pm_runtime_put_sync(struct framer *framer);
10182c944d0SHerve Codina int framer_init(struct framer *framer);
10282c944d0SHerve Codina int framer_exit(struct framer *framer);
10382c944d0SHerve Codina int framer_power_on(struct framer *framer);
10482c944d0SHerve Codina int framer_power_off(struct framer *framer);
10582c944d0SHerve Codina int framer_get_status(struct framer *framer, struct framer_status *status);
10682c944d0SHerve Codina int framer_get_config(struct framer *framer, struct framer_config *config);
10782c944d0SHerve Codina int framer_set_config(struct framer *framer, const struct framer_config *config);
10882c944d0SHerve Codina int framer_notifier_register(struct framer *framer, struct notifier_block *nb);
10982c944d0SHerve Codina int framer_notifier_unregister(struct framer *framer, struct notifier_block *nb);
11082c944d0SHerve Codina
11182c944d0SHerve Codina struct framer *framer_get(struct device *dev, const char *con_id);
11282c944d0SHerve Codina void framer_put(struct device *dev, struct framer *framer);
11382c944d0SHerve Codina
11482c944d0SHerve Codina struct framer *devm_framer_get(struct device *dev, const char *con_id);
11582c944d0SHerve Codina struct framer *devm_framer_optional_get(struct device *dev, const char *con_id);
11682c944d0SHerve Codina #else
framer_pm_runtime_get(struct framer * framer)11782c944d0SHerve Codina static inline int framer_pm_runtime_get(struct framer *framer)
11882c944d0SHerve Codina {
11982c944d0SHerve Codina return -ENOSYS;
12082c944d0SHerve Codina }
12182c944d0SHerve Codina
framer_pm_runtime_get_sync(struct framer * framer)12282c944d0SHerve Codina static inline int framer_pm_runtime_get_sync(struct framer *framer)
12382c944d0SHerve Codina {
12482c944d0SHerve Codina return -ENOSYS;
12582c944d0SHerve Codina }
12682c944d0SHerve Codina
framer_pm_runtime_put(struct framer * framer)12782c944d0SHerve Codina static inline int framer_pm_runtime_put(struct framer *framer)
12882c944d0SHerve Codina {
12982c944d0SHerve Codina return -ENOSYS;
13082c944d0SHerve Codina }
13182c944d0SHerve Codina
framer_pm_runtime_put_sync(struct framer * framer)13282c944d0SHerve Codina static inline int framer_pm_runtime_put_sync(struct framer *framer)
13382c944d0SHerve Codina {
13482c944d0SHerve Codina return -ENOSYS;
13582c944d0SHerve Codina }
13682c944d0SHerve Codina
framer_init(struct framer * framer)13782c944d0SHerve Codina static inline int framer_init(struct framer *framer)
13882c944d0SHerve Codina {
13982c944d0SHerve Codina return -ENOSYS;
14082c944d0SHerve Codina }
14182c944d0SHerve Codina
framer_exit(struct framer * framer)14282c944d0SHerve Codina static inline int framer_exit(struct framer *framer)
14382c944d0SHerve Codina {
14482c944d0SHerve Codina return -ENOSYS;
14582c944d0SHerve Codina }
14682c944d0SHerve Codina
framer_power_on(struct framer * framer)14782c944d0SHerve Codina static inline int framer_power_on(struct framer *framer)
14882c944d0SHerve Codina {
14982c944d0SHerve Codina return -ENOSYS;
15082c944d0SHerve Codina }
15182c944d0SHerve Codina
framer_power_off(struct framer * framer)15282c944d0SHerve Codina static inline int framer_power_off(struct framer *framer)
15382c944d0SHerve Codina {
15482c944d0SHerve Codina return -ENOSYS;
15582c944d0SHerve Codina }
15682c944d0SHerve Codina
framer_get_status(struct framer * framer,struct framer_status * status)15782c944d0SHerve Codina static inline int framer_get_status(struct framer *framer, struct framer_status *status)
15882c944d0SHerve Codina {
15982c944d0SHerve Codina return -ENOSYS;
16082c944d0SHerve Codina }
16182c944d0SHerve Codina
framer_get_config(struct framer * framer,struct framer_config * config)16282c944d0SHerve Codina static inline int framer_get_config(struct framer *framer, struct framer_config *config)
16382c944d0SHerve Codina {
16482c944d0SHerve Codina return -ENOSYS;
16582c944d0SHerve Codina }
16682c944d0SHerve Codina
framer_set_config(struct framer * framer,const struct framer_config * config)16782c944d0SHerve Codina static inline int framer_set_config(struct framer *framer, const struct framer_config *config)
16882c944d0SHerve Codina {
16982c944d0SHerve Codina return -ENOSYS;
17082c944d0SHerve Codina }
17182c944d0SHerve Codina
framer_notifier_register(struct framer * framer,struct notifier_block * nb)17282c944d0SHerve Codina static inline int framer_notifier_register(struct framer *framer,
17382c944d0SHerve Codina struct notifier_block *nb)
17482c944d0SHerve Codina {
17582c944d0SHerve Codina return -ENOSYS;
17682c944d0SHerve Codina }
17782c944d0SHerve Codina
framer_notifier_unregister(struct framer * framer,struct notifier_block * nb)17882c944d0SHerve Codina static inline int framer_notifier_unregister(struct framer *framer,
17982c944d0SHerve Codina struct notifier_block *nb)
18082c944d0SHerve Codina {
18182c944d0SHerve Codina return -ENOSYS;
18282c944d0SHerve Codina }
18382c944d0SHerve Codina
framer_get(struct device * dev,const char * con_id)184*ea2c0928SHerve Codina static inline struct framer *framer_get(struct device *dev, const char *con_id)
18582c944d0SHerve Codina {
18682c944d0SHerve Codina return ERR_PTR(-ENOSYS);
18782c944d0SHerve Codina }
18882c944d0SHerve Codina
framer_put(struct device * dev,struct framer * framer)189*ea2c0928SHerve Codina static inline void framer_put(struct device *dev, struct framer *framer)
19082c944d0SHerve Codina {
19182c944d0SHerve Codina }
19282c944d0SHerve Codina
devm_framer_get(struct device * dev,const char * con_id)19382c944d0SHerve Codina static inline struct framer *devm_framer_get(struct device *dev, const char *con_id)
19482c944d0SHerve Codina {
19582c944d0SHerve Codina return ERR_PTR(-ENOSYS);
19682c944d0SHerve Codina }
19782c944d0SHerve Codina
devm_framer_optional_get(struct device * dev,const char * con_id)19882c944d0SHerve Codina static inline struct framer *devm_framer_optional_get(struct device *dev, const char *con_id)
19982c944d0SHerve Codina {
20082c944d0SHerve Codina return NULL;
20182c944d0SHerve Codina }
20282c944d0SHerve Codina
20382c944d0SHerve Codina #endif
20482c944d0SHerve Codina
20582c944d0SHerve Codina #endif /* __DRIVERS_FRAMER_H */
206