blob: efe178861a328a65f22690d9f208034ceb1defc9 [file] [log] [blame]
/*
* Copyright (c) 2024 Trackunit Corporation
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr/modem/pipe.h>
#include <zephyr/devicetree.h>
#include <zephyr/sys/util.h>
#ifndef ZEPHYR_MODEM_PIPELINK_
#define ZEPHYR_MODEM_PIPELINK_
/** Pipelink event */
enum modem_pipelink_event {
/** Modem pipe has been connected and can be opened */
MODEM_PIPELINK_EVENT_CONNECTED = 0,
/** Modem pipe has been disconnected and can't be opened */
MODEM_PIPELINK_EVENT_DISCONNECTED,
};
/** @cond INTERNAL_HIDDEN */
/** Forward declaration */
struct modem_pipelink;
/** @endcond */
/**
* @brief Pipelink callback definition
* @param link Modem pipelink instance
* @param event Modem pipelink event
* @param user_data User data passed to modem_pipelink_attach()
*/
typedef void (*modem_pipelink_callback)(struct modem_pipelink *link,
enum modem_pipelink_event event,
void *user_data);
/** @cond INTERNAL_HIDDEN */
/** Pipelink structure */
struct modem_pipelink {
struct modem_pipe *pipe;
modem_pipelink_callback callback;
void *user_data;
bool connected;
struct k_spinlock spinlock;
};
/** @endcond */
/**
* @brief Attach callback to pipelink
* @param link Pipelink instance
* @param callback Pipelink callback
* @param user_data User data passed to pipelink callback
*/
void modem_pipelink_attach(struct modem_pipelink *link,
modem_pipelink_callback callback,
void *user_data);
/**
* @brief Check whether pipelink pipe is connected
* @param link Pipelink instance
* @retval true if pipe is connected
* @retval false if pipe is not connected
*/
bool modem_pipelink_is_connected(struct modem_pipelink *link);
/**
* @brief Get pipe from pipelink
* @param link Pipelink instance
* @retval Pointer to pipe if pipelink has been initialized
* @retval NULL if pipelink has not been initialized
*/
struct modem_pipe *modem_pipelink_get_pipe(struct modem_pipelink *link);
/**
* @brief Clear callback
* @param link Pipelink instance
*/
void modem_pipelink_release(struct modem_pipelink *link);
/** @cond INTERNAL_HIDDEN */
/** Initialize modem pipelink */
void modem_pipelink_init(struct modem_pipelink *link, struct modem_pipe *pipe);
/** Notify user of pipelink that pipe has been connected */
void modem_pipelink_notify_connected(struct modem_pipelink *link);
/** Notify user of pipelink that pipe has been disconnected */
void modem_pipelink_notify_disconnected(struct modem_pipelink *link);
/** @endcond */
/** @cond INTERNAL_HIDDEN */
/**
* @brief Synthesize pipelink symbol from devicetree node identifier and name
* @param node_id Devicetree node identifier
* @param name Pipelink name
*/
#define MODEM_PIPELINK_DT_SYM(node_id, name) \
_CONCAT_4(__modem_pipelink_, DT_DEP_ORD(node_id), _, name)
/** @endcond */
/**
* @brief Declare pipelink from devicetree node identifier and name
* @param node_id Devicetree node identifier
* @param name Pipelink name
*/
#define MODEM_PIPELINK_DT_DECLARE(node_id, name) \
extern struct modem_pipelink MODEM_PIPELINK_DT_SYM(node_id, name)
/**
* @brief Define pipelink from devicetree node identifier and name
* @param node_id Devicetree node identifier
* @param name Pipelink name
*/
#define MODEM_PIPELINK_DT_DEFINE(node_id, name) \
struct modem_pipelink MODEM_PIPELINK_DT_SYM(node_id, name)
/**
* @brief Get pointer to pipelink from devicetree node identifier and name
* @param node_id Devicetree node identifier
* @param name Pipelink name
*/
#define MODEM_PIPELINK_DT_GET(node_id, name) \
(&MODEM_PIPELINK_DT_SYM(node_id, name))
/**
* @brief Device driver instance variants of MODEM_PIPELINK_DT macros
* @{
*/
#define MODEM_PIPELINK_DT_INST_DECLARE(inst, name) \
MODEM_PIPELINK_DT_DECLARE(DT_DRV_INST(inst), name)
#define MODEM_PIPELINK_DT_INST_DEFINE(inst, name) \
MODEM_PIPELINK_DT_DEFINE(DT_DRV_INST(inst), name)
#define MODEM_PIPELINK_DT_INST_GET(inst, name) \
MODEM_PIPELINK_DT_GET(DT_DRV_INST(inst), name)
/** @} */
#endif /* ZEPHYR_MODEM_PIPELINK_ */