116 lines
2.9 KiB
C
116 lines
2.9 KiB
C
/*
|
|
* Copyright (c) 2024 Texas Instruments Incorporated
|
|
* Andrew Davis <afd@ti.com>
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
#define DT_DRV_COMPAT zephyr_mbox_ipm
|
|
|
|
#include <zephyr/kernel.h>
|
|
#include <zephyr/device.h>
|
|
#include <zephyr/drivers/ipm.h>
|
|
#include <zephyr/drivers/mbox.h>
|
|
|
|
#include <zephyr/logging/log.h>
|
|
LOG_MODULE_REGISTER(ipm_mbox, CONFIG_IPM_LOG_LEVEL);
|
|
|
|
struct ipm_mbox_data {
|
|
ipm_callback_t callback;
|
|
void *user_data;
|
|
};
|
|
|
|
struct ipm_mbox_config {
|
|
struct mbox_dt_spec mbox_tx;
|
|
struct mbox_dt_spec mbox_rx;
|
|
};
|
|
|
|
static void ipm_mbox_callback(const struct device *mboxdev, mbox_channel_id_t channel_id,
|
|
void *user_data, struct mbox_msg *data)
|
|
{
|
|
const struct device *ipmdev = user_data;
|
|
struct ipm_mbox_data *ipm_mbox_data = ipmdev->data;
|
|
|
|
ipm_mbox_data->callback(ipmdev, ipm_mbox_data->user_data, channel_id, (void *)data->data);
|
|
}
|
|
|
|
static int ipm_mbox_send(const struct device *ipmdev, int wait, uint32_t id,
|
|
const void *data, int size)
|
|
{
|
|
const struct ipm_mbox_config *config = ipmdev->config;
|
|
|
|
struct mbox_msg message = {
|
|
.data = data,
|
|
.size = size,
|
|
};
|
|
|
|
return mbox_send_dt(&config->mbox_tx, &message);
|
|
}
|
|
|
|
static void ipm_mbox_register_callback(const struct device *ipmdev,
|
|
ipm_callback_t cb,
|
|
void *user_data)
|
|
{
|
|
struct ipm_mbox_data *data = ipmdev->data;
|
|
|
|
data->callback = cb;
|
|
data->user_data = user_data;
|
|
}
|
|
|
|
static int ipm_mbox_get_max_data_size(const struct device *ipmdev)
|
|
{
|
|
const struct ipm_mbox_config *config = ipmdev->config;
|
|
|
|
return mbox_mtu_get_dt(&config->mbox_tx);
|
|
}
|
|
|
|
static uint32_t ipm_mbox_get_max_id(const struct device *ipmdev)
|
|
{
|
|
const struct ipm_mbox_config *config = ipmdev->config;
|
|
|
|
return mbox_max_channels_get_dt(&config->mbox_tx);
|
|
}
|
|
|
|
static int ipm_mbox_set_enable(const struct device *ipmdev, int enable)
|
|
{
|
|
const struct ipm_mbox_config *config = ipmdev->config;
|
|
|
|
mbox_set_enabled_dt(&config->mbox_rx, enable);
|
|
|
|
return 0;
|
|
}
|
|
|
|
static int ipm_mbox_init(const struct device *ipmdev)
|
|
{
|
|
const struct ipm_mbox_config *config = ipmdev->config;
|
|
|
|
mbox_register_callback_dt(&config->mbox_rx, ipm_mbox_callback, (void *)ipmdev);
|
|
|
|
return 0;
|
|
}
|
|
|
|
static const struct ipm_driver_api ipm_mbox_funcs = {
|
|
.send = ipm_mbox_send,
|
|
.register_callback = ipm_mbox_register_callback,
|
|
.max_data_size_get = ipm_mbox_get_max_data_size,
|
|
.max_id_val_get = ipm_mbox_get_max_id,
|
|
.set_enabled = ipm_mbox_set_enable,
|
|
};
|
|
|
|
#define IPM_MBOX_DEV_DEFINE(n) \
|
|
static struct ipm_mbox_data ipm_mbox_data_##n; \
|
|
static const struct ipm_mbox_config ipm_mbox_config_##n = { \
|
|
.mbox_tx = MBOX_DT_SPEC_INST_GET(n, tx), \
|
|
.mbox_rx = MBOX_DT_SPEC_INST_GET(n, rx), \
|
|
}; \
|
|
DEVICE_DT_INST_DEFINE(n, \
|
|
&ipm_mbox_init, \
|
|
NULL, \
|
|
&ipm_mbox_data_##n, \
|
|
&ipm_mbox_config_##n, \
|
|
POST_KERNEL, \
|
|
CONFIG_KERNEL_INIT_PRIORITY_DEVICE, \
|
|
&ipm_mbox_funcs);
|
|
|
|
DT_INST_FOREACH_STATUS_OKAY(IPM_MBOX_DEV_DEFINE)
|