zephyr/include/zephyr/drivers/smbus.h
Yong Cong Sin bbe5e1e6eb build: namespace the generated headers with zephyr/
Namespaced the generated headers with `zephyr` to prevent
potential conflict with other headers.

Introduce a temporary Kconfig `LEGACY_GENERATED_INCLUDE_PATH`
that is enabled by default. This allows the developers to
continue the use of the old include paths for the time being
until it is deprecated and eventually removed. The Kconfig will
generate a build-time warning message, similar to the
`CONFIG_TIMER_RANDOM_GENERATOR`.

Updated the includes path of in-tree sources accordingly.

Most of the changes here are scripted, check the PR for more
info.

Signed-off-by: Yong Cong Sin <ycsin@meta.com>
2024-05-28 22:03:55 +02:00

1098 lines
32 KiB
C

/*
* Copyright (c) 2022 Intel Corporation
*
* SPDX-License-Identifier: Apache-2.0
*/
/**
* @file
* @brief Public SMBus Driver APIs
*/
#ifndef ZEPHYR_INCLUDE_DRIVERS_SMBUS_H_
#define ZEPHYR_INCLUDE_DRIVERS_SMBUS_H_
/**
* @brief SMBus Interface
* @defgroup smbus_interface SMBus Interface
* @since 3.4
* @version 0.1.0
* @ingroup io_interfaces
* @{
*/
#include <errno.h>
#include <zephyr/sys/slist.h>
#include <zephyr/types.h>
#include <zephyr/device.h>
#ifdef __cplusplus
extern "C" {
#endif
/**
* @name SMBus Protocol commands
* @{
*
* SMBus Specification defines the following SMBus protocols operations
*/
/**
* SMBus Quick protocol is a very simple command with no data sent or
* received. Peripheral may denote only R/W bit, which can still be
* used for the peripheral management, for example to switch peripheral
* On/Off. Quick protocol can also be used for peripheral devices
* scanning.
*
* @code
* 0 1
* 0 1 2 3 4 5 6 7 8 9 0
* +-+-+-+-+-+-+-+-+-+-+-+
* |S| Periph Addr |D|A|P|
* +-+-+-+-+-+-+-+-+-+-+-+
* @endcode
*/
#define SMBUS_CMD_QUICK 0b000
/**
* SMBus Byte protocol can send or receive one byte of data.
*
* @code
* Byte Write
*
* 0 1 2
* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* |S| Periph Addr |W|A| Command code |A|P|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
*
* Byte Read
*
* 0 1 2
* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* |S| Periph Addr |R|A| Byte received |N|P|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* @endcode
*/
#define SMBUS_CMD_BYTE 0b001
/**
* SMBus Byte Data protocol sends the first byte (command) followed
* by read or write one byte.
*
* @code
* Byte Data Write
*
* 0 1 2
* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* |S| Periph Addr |W|A| Command code |A| Data Write |A|P|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
*
* Byte Data Read
*
* 0 1 2
* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* |S| Periph Addr |W|A| Command code |A|S| Periph Addr |R|A|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* | Data Read |N|P|
* +-+-+-+-+-+-+-+-+-+-+
* @endcode
*/
#define SMBUS_CMD_BYTE_DATA 0b010
/**
* SMBus Word Data protocol sends the first byte (command) followed
* by read or write two bytes.
*
* @code
* Word Data Write
*
* 0 1 2
* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* |S| Periph Addr |W|A| Command code |A| Data Write Low|A|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* | Data Write Hi |A|P|
* +-+-+-+-+-+-+-+-+-+-+
*
* Word Data Read
*
* 0 1 2
* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* |S| Periph Addr |W|A| Command code |A|S| Periph Addr |R|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* |A| Data Read Low |A| Data Read Hi |N|P|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* @endcode
*/
#define SMBUS_CMD_WORD_DATA 0b011
/**
* SMBus Process Call protocol is Write Word followed by
* Read Word. It is named so because the command sends data and waits
* for the peripheral to return a reply.
*
* @code
* 0 1 2
* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* |S| Periph Addr |W|A| Command code |A| Data Write Low|A|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* | Data Write Hi |A|S| Periph Addr |R|A| Data Read Low |A|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* | Data Read Hi |N|P|
* +-+-+-+-+-+-+-+-+-+-+
* @endcode
*/
#define SMBUS_CMD_PROC_CALL 0b100
/**
* SMBus Block protocol reads or writes a block of data up to 32 bytes.
* The Count byte specifies the amount of data.
*
* @code
*
* SMBus Block Write
*
* 0 1 2
* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* |S| Periph Addr |W|A| Command code |A| Send Count=N |A|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* | Data Write 1 |A| ... |A| Data Write N |A|P|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
*
* SMBus Block Read
*
* 0 1 2
* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* |S| Periph Addr |W|A| Command code |A|S| Periph Addr |R|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* |A| Recv Count=N |A| Data Read 1 |A| ... |A|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* | Data Read N |N|P|
* +-+-+-+-+-+-+-+-+-+-+
* @endcode
*/
#define SMBUS_CMD_BLOCK 0b101
/**
* SMBus Block Write - Block Read Process Call protocol is
* Block Write followed by Block Read.
*
* @code
* 0 1 2
* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* |S| Periph Addr |W|A| Command code |A| Count = N |A|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* | Data Write 1 |A| ... |A| Data Write N |A|S|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* | Periph Addr |R|A| Recv Count=N |A| Data Read 1 |A| |
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* | ... |A| Data Read N |N|P|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* @endcode
*/
#define SMBUS_CMD_BLOCK_PROC 0b111
/** @} */
/** Maximum number of bytes in SMBus Block protocol */
#define SMBUS_BLOCK_BYTES_MAX 32
/**
* @name SMBus device functionality
* @{
*
* The following parameters describe the functionality of the SMBus device
*/
/** Peripheral to act as Controller. */
#define SMBUS_MODE_CONTROLLER BIT(0)
/** Support Packet Error Code (PEC) checking */
#define SMBUS_MODE_PEC BIT(1)
/** Support Host Notify functionality */
#define SMBUS_MODE_HOST_NOTIFY BIT(2)
/** Support SMBALERT signal functionality */
#define SMBUS_MODE_SMBALERT BIT(3)
/** @} */
/**
* @name SMBus special reserved addresses
* @{
*
* The following addresses are reserved by SMBus specification
*/
/**
* @brief Alert Response Address (ARA)
*
* A broadcast address used by the system host as part of the
* Alert Response Protocol.
*/
#define SMBUS_ADDRESS_ARA 0x0c
/** @} */
/**
* @name SMBus read / write direction
* @{
*/
/** @brief SMBus read / write direction */
enum smbus_direction {
/** Write a message to SMBus peripheral */
SMBUS_MSG_WRITE = 0,
/** Read a message from SMBus peripheral */
SMBUS_MSG_READ = 1,
};
/** @} */
/** @cond INTERNAL_HIDDEN */
#define SMBUS_MSG_RW_MASK BIT(0)
/** @endcond */
struct smbus_callback;
/**
* @brief Define SMBus callback handler function signature.
*
* @param dev Pointer to the device structure for the SMBus driver instance.
* @param cb Structure smbus_callback owning this handler.
* @param addr Address of the SMBus peripheral device.
*/
typedef void (*smbus_callback_handler_t)(const struct device *dev,
struct smbus_callback *cb,
uint8_t addr);
/**
* @brief SMBus callback structure
*
* Used to register a callback in the driver instance callback list.
* As many callbacks as needed can be added as long as each of them
* is a unique pointer of struct smbus_callback.
*
* Note: Such struct should not be allocated on stack.
*/
struct smbus_callback {
/** This should be used in driver for a callback list management */
sys_snode_t node;
/** Actual callback function being called when relevant */
smbus_callback_handler_t handler;
/** Peripheral device address */
uint8_t addr;
};
/**
* @brief Complete SMBus DT information
*/
struct smbus_dt_spec {
/** SMBus bus */
const struct device *bus;
/** Address of the SMBus peripheral device */
uint16_t addr;
};
/**
* @brief Structure initializer for smbus_dt_spec from devicetree
*
* This helper macro expands to a static initializer for a <tt>struct
* smbus_dt_spec</tt> by reading the relevant bus and address data from
* the devicetree.
*
* @param node_id Devicetree node identifier for the SMBus device whose
* struct smbus_dt_spec to create an initializer for
*/
#define SMBUS_DT_SPEC_GET(node_id) \
{ \
.bus = DEVICE_DT_GET(DT_BUS(node_id)), \
.addr = DT_REG_ADDR(node_id) \
}
/**
* @brief Structure initializer for smbus_dt_spec from devicetree instance
*
* This is equivalent to
* <tt>SMBUS_DT_SPEC_GET(DT_DRV_INST(inst))</tt>.
*
* @param inst Devicetree instance number
*/
#define SMBUS_DT_SPEC_INST_GET(inst) SMBUS_DT_SPEC_GET(DT_DRV_INST(inst))
/**
* @cond INTERNAL_HIDDEN
*
* These are for internal use only, so skip these in
* public documentation.
*/
typedef int (*smbus_api_configure_t)(const struct device *dev,
uint32_t dev_config);
typedef int (*smbus_api_get_config_t)(const struct device *dev,
uint32_t *dev_config);
typedef int (*smbus_api_quick_t)(const struct device *dev,
uint16_t addr, enum smbus_direction);
typedef int (*smbus_api_byte_write_t)(const struct device *dev,
uint16_t addr, uint8_t byte);
typedef int (*smbus_api_byte_read_t)(const struct device *dev,
uint16_t addr, uint8_t *byte);
typedef int (*smbus_api_byte_data_write_t)(const struct device *dev,
uint16_t addr, uint8_t cmd,
uint8_t byte);
typedef int (*smbus_api_byte_data_read_t)(const struct device *dev,
uint16_t addr, uint8_t cmd,
uint8_t *byte);
typedef int (*smbus_api_word_data_write_t)(const struct device *dev,
uint16_t addr, uint8_t cmd,
uint16_t word);
typedef int (*smbus_api_word_data_read_t)(const struct device *dev,
uint16_t addr, uint8_t cmd,
uint16_t *word);
typedef int (*smbus_api_pcall_t)(const struct device *dev,
uint16_t addr, uint8_t cmd,
uint16_t send_word, uint16_t *recv_word);
typedef int (*smbus_api_block_write_t)(const struct device *dev,
uint16_t addr, uint8_t cmd,
uint8_t count, uint8_t *buf);
typedef int (*smbus_api_block_read_t)(const struct device *dev,
uint16_t addr, uint8_t cmd,
uint8_t *count, uint8_t *buf);
typedef int (*smbus_api_block_pcall_t)(const struct device *dev,
uint16_t addr, uint8_t cmd,
uint8_t send_count, uint8_t *send_buf,
uint8_t *recv_count, uint8_t *recv_buf);
typedef int (*smbus_api_smbalert_cb_t)(const struct device *dev,
struct smbus_callback *cb);
typedef int (*smbus_api_host_notify_cb_t)(const struct device *dev,
struct smbus_callback *cb);
__subsystem struct smbus_driver_api {
smbus_api_configure_t configure;
smbus_api_get_config_t get_config;
smbus_api_quick_t smbus_quick;
smbus_api_byte_write_t smbus_byte_write;
smbus_api_byte_read_t smbus_byte_read;
smbus_api_byte_data_write_t smbus_byte_data_write;
smbus_api_byte_data_read_t smbus_byte_data_read;
smbus_api_word_data_write_t smbus_word_data_write;
smbus_api_word_data_read_t smbus_word_data_read;
smbus_api_pcall_t smbus_pcall;
smbus_api_block_write_t smbus_block_write;
smbus_api_block_read_t smbus_block_read;
smbus_api_block_pcall_t smbus_block_pcall;
smbus_api_smbalert_cb_t smbus_smbalert_set_cb;
smbus_api_smbalert_cb_t smbus_smbalert_remove_cb;
smbus_api_host_notify_cb_t smbus_host_notify_set_cb;
smbus_api_host_notify_cb_t smbus_host_notify_remove_cb;
};
/**
* @endcond
*/
#if defined(CONFIG_SMBUS_STATS) || defined(__DOXYGEN__)
#include <zephyr/stats/stats.h>
/** @cond INTERNAL_HIDDEN */
STATS_SECT_START(smbus)
STATS_SECT_ENTRY32(bytes_read)
STATS_SECT_ENTRY32(bytes_written)
STATS_SECT_ENTRY32(command_count)
STATS_SECT_END;
STATS_NAME_START(smbus)
STATS_NAME(smbus, bytes_read)
STATS_NAME(smbus, bytes_written)
STATS_NAME(smbus, command_count)
STATS_NAME_END(smbus);
struct smbus_device_state {
struct device_state devstate;
struct stats_smbus stats;
};
/**
* @brief Define a statically allocated and section assigned smbus device state
*/
#define Z_SMBUS_DEVICE_STATE_DEFINE(node_id, dev_name) \
static struct smbus_device_state Z_DEVICE_STATE_NAME(dev_name) \
__attribute__((__section__(".z_devstate")));
/**
* @brief Define an smbus device init wrapper function
*
* This does device instance specific initialization of common data
* (such as stats) and calls the given init_fn
*/
#define Z_SMBUS_INIT_FN(dev_name, init_fn) \
static inline int \
UTIL_CAT(dev_name, _init)(const struct device *dev) \
{ \
struct smbus_device_state *state = \
CONTAINER_OF(dev->state, \
struct smbus_device_state, \
devstate); \
stats_init(&state->stats.s_hdr, STATS_SIZE_32, 4, \
STATS_NAME_INIT_PARMS(smbus)); \
stats_register(dev->name, &(state->stats.s_hdr)); \
return init_fn(dev); \
}
/** @endcond */
/**
* @brief Updates the SMBus stats
*
* @param dev Pointer to the device structure for the SMBus driver instance
* to update stats for.
* @param sent Number of bytes sent
* @param recv Number of bytes received
*/
static inline void smbus_xfer_stats(const struct device *dev, uint8_t sent,
uint8_t recv)
{
struct smbus_device_state *state =
CONTAINER_OF(dev->state, struct smbus_device_state, devstate);
STATS_INC(state->stats, command_count);
STATS_INCN(state->stats, bytes_read, recv);
STATS_INCN(state->stats, bytes_written, sent);
}
/**
* @brief Like DEVICE_DT_DEFINE() with SMBus specifics.
*
* @details Defines a device which implements the SMBus API. May
* generate a custom device_state container struct and init_fn
* wrapper when needed depending on SMBus @kconfig{CONFIG_SMBUS_STATS}.
*
* @param node_id The devicetree node identifier.
*
* @param init_fn Name of the init function of the driver.
*
* @param pm_device PM device resources reference
* (NULL if device does not use PM).
*
* @param data_ptr Pointer to the device's private data.
*
* @param cfg_ptr The address to the structure containing the
* configuration information for this instance of the driver.
*
* @param level The initialization level. See SYS_INIT() for
* details.
*
* @param prio Priority within the selected initialization level. See
* SYS_INIT() for details.
*
* @param api_ptr Provides an initial pointer to the API function struct
* used by the driver. Can be NULL.
*/
#define SMBUS_DEVICE_DT_DEFINE(node_id, init_fn, pm_device, \
data_ptr, cfg_ptr, level, prio, \
api_ptr, ...) \
Z_SMBUS_DEVICE_STATE_DEFINE(node_id, \
Z_DEVICE_DT_DEV_NAME(node_id)); \
Z_SMBUS_INIT_FN(Z_DEVICE_DT_DEV_NAME(node_id), init_fn) \
Z_DEVICE_DEFINE(node_id, Z_DEVICE_DT_DEV_NAME(node_id), \
DEVICE_DT_NAME(node_id), \
&UTIL_CAT(Z_DEVICE_DT_DEV_NAME(node_id), _init),\
pm_device, \
data_ptr, cfg_ptr, level, prio, \
api_ptr, \
&(Z_DEVICE_STATE_NAME(Z_DEVICE_DT_DEV_NAME \
(node_id)).devstate), \
__VA_ARGS__)
#else /* CONFIG_SMBUS_STATS */
static inline void smbus_xfer_stats(const struct device *dev, uint8_t sent,
uint8_t recv)
{
ARG_UNUSED(dev);
ARG_UNUSED(sent);
ARG_UNUSED(recv);
}
#define SMBUS_DEVICE_DT_DEFINE(node_id, init_fn, pm_device, \
data_ptr, cfg_ptr, level, prio, \
api_ptr, ...) \
DEVICE_DT_DEFINE(node_id, &init_fn, pm_device, \
data_ptr, cfg_ptr, level, prio, \
api_ptr, __VA_ARGS__)
#endif /* CONFIG_SMBUS_STATS */
/**
* @brief Like SMBUS_DEVICE_DT_DEFINE() for an instance of a DT_DRV_COMPAT
* compatible
*
* @param inst instance number. This is replaced by
* <tt>DT_DRV_COMPAT(inst)</tt> in the call to SMBUS_DEVICE_DT_DEFINE().
*
* @param ... other parameters as expected by SMBUS_DEVICE_DT_DEFINE().
*/
#define SMBUS_DEVICE_DT_INST_DEFINE(inst, ...) \
SMBUS_DEVICE_DT_DEFINE(DT_DRV_INST(inst), __VA_ARGS__)
/**
* @brief Configure operation of a SMBus host controller.
*
* @param dev Pointer to the device structure for the SMBus driver instance.
* @param dev_config Bit-packed 32-bit value to the device runtime configuration
* for the SMBus controller.
*
* @retval 0 If successful.
* @retval -EIO General input / output error.
*/
__syscall int smbus_configure(const struct device *dev, uint32_t dev_config);
static inline int z_impl_smbus_configure(const struct device *dev,
uint32_t dev_config)
{
const struct smbus_driver_api *api =
(const struct smbus_driver_api *)dev->api;
return api->configure(dev, dev_config);
}
/**
* @brief Get configuration of a SMBus host controller.
*
* This routine provides a way to get current configuration. It is allowed to
* call the function before smbus_configure, because some SMBus ports can be
* configured during init process. However, if the SMBus port is not configured,
* smbus_get_config returns an error.
*
* smbus_get_config can return cached config or probe hardware, but it has to be
* up to date with current configuration.
*
* @param dev Pointer to the device structure for the SMBus driver instance.
* @param dev_config Pointer to return bit-packed 32-bit value of
* the SMBus controller configuration.
*
* @retval 0 If successful.
* @retval -EIO General input / output error.
* @retval -ENOSYS If function smbus_get_config() is not implemented
* by the driver.
*/
__syscall int smbus_get_config(const struct device *dev, uint32_t *dev_config);
static inline int z_impl_smbus_get_config(const struct device *dev,
uint32_t *dev_config)
{
const struct smbus_driver_api *api =
(const struct smbus_driver_api *)dev->api;
if (api->get_config == NULL) {
return -ENOSYS;
}
return api->get_config(dev, dev_config);
}
/**
* @brief Add SMBUSALERT callback for a SMBus host controller.
*
* @param dev Pointer to the device structure for the SMBus driver instance.
* @param cb Pointer to a callback structure.
*
* @retval 0 If successful.
* @retval -EIO General input / output error.
* @retval -ENOSYS If function smbus_smbalert_set_cb() is not implemented
* by the driver.
*/
static inline int smbus_smbalert_set_cb(const struct device *dev,
struct smbus_callback *cb)
{
const struct smbus_driver_api *api =
(const struct smbus_driver_api *)dev->api;
if (api->smbus_smbalert_set_cb == NULL) {
return -ENOSYS;
}
return api->smbus_smbalert_set_cb(dev, cb);
}
/**
* @brief Remove SMBUSALERT callback from a SMBus host controller.
*
* @param dev Pointer to the device structure for the SMBus driver instance.
* @param cb Pointer to a callback structure.
*
* @retval 0 If successful.
* @retval -EIO General input / output error.
* @retval -ENOSYS If function smbus_smbalert_remove_cb() is not implemented
* by the driver.
*/
__syscall int smbus_smbalert_remove_cb(const struct device *dev,
struct smbus_callback *cb);
static inline int z_impl_smbus_smbalert_remove_cb(const struct device *dev,
struct smbus_callback *cb)
{
const struct smbus_driver_api *api =
(const struct smbus_driver_api *)dev->api;
if (api->smbus_smbalert_remove_cb == NULL) {
return -ENOSYS;
}
return api->smbus_smbalert_remove_cb(dev, cb);
}
/**
* @brief Add Host Notify callback for a SMBus host controller.
*
* @param dev Pointer to the device structure for the SMBus driver instance.
* @param cb Pointer to a callback structure.
*
* @retval 0 If successful.
* @retval -EIO General input / output error.
* @retval -ENOSYS If function smbus_host_notify_set_cb() is not implemented
* by the driver.
*/
static inline int smbus_host_notify_set_cb(const struct device *dev,
struct smbus_callback *cb)
{
const struct smbus_driver_api *api =
(const struct smbus_driver_api *)dev->api;
if (api->smbus_host_notify_set_cb == NULL) {
return -ENOSYS;
}
return api->smbus_host_notify_set_cb(dev, cb);
}
/**
* @brief Remove Host Notify callback from a SMBus host controller.
*
* @param dev Pointer to the device structure for the SMBus driver instance.
* @param cb Pointer to a callback structure.
*
* @retval 0 If successful.
* @retval -EIO General input / output error.
* @retval -ENOSYS If function smbus_host_notify_remove_cb() is not implemented
* by the driver.
*/
__syscall int smbus_host_notify_remove_cb(const struct device *dev,
struct smbus_callback *cb);
static inline int z_impl_smbus_host_notify_remove_cb(const struct device *dev,
struct smbus_callback *cb)
{
const struct smbus_driver_api *api =
(const struct smbus_driver_api *)dev->api;
if (api->smbus_host_notify_remove_cb == NULL) {
return -ENOSYS;
}
return api->smbus_host_notify_remove_cb(dev, cb);
}
/**
* @brief Perform SMBus Quick operation
*
* This routine provides a generic interface to perform SMBus Quick
* operation.
*
* @param dev Pointer to the device structure for the SMBus driver instance.
* driver configured in controller mode.
* @param addr Address of the SMBus peripheral device.
* @param direction Direction Read or Write.
*
* @retval 0 If successful.
* @retval -EIO General input / output error.
* @retval -ENOSYS If function smbus_quick() is not implemented
* by the driver.
*/
__syscall int smbus_quick(const struct device *dev, uint16_t addr,
enum smbus_direction direction);
static inline int z_impl_smbus_quick(const struct device *dev, uint16_t addr,
enum smbus_direction direction)
{
const struct smbus_driver_api *api =
(const struct smbus_driver_api *)dev->api;
if (api->smbus_quick == NULL) {
return -ENOSYS;
}
if (direction != SMBUS_MSG_READ && direction != SMBUS_MSG_WRITE) {
return -EINVAL;
}
return api->smbus_quick(dev, addr, direction);
}
/**
* @brief Perform SMBus Byte Write operation
*
* This routine provides a generic interface to perform SMBus
* Byte Write operation.
*
* @param dev Pointer to the device structure for the SMBus driver instance.
* @param addr Address of the SMBus peripheral device.
* @param byte Byte to be sent to the peripheral device.
*
* @retval 0 If successful.
* @retval -EIO General input / output error.
* @retval -ENOSYS If function smbus_byte_write() is not implemented
* by the driver.
*/
__syscall int smbus_byte_write(const struct device *dev, uint16_t addr,
uint8_t byte);
static inline int z_impl_smbus_byte_write(const struct device *dev,
uint16_t addr, uint8_t byte)
{
const struct smbus_driver_api *api =
(const struct smbus_driver_api *)dev->api;
if (api->smbus_byte_write == NULL) {
return -ENOSYS;
}
return api->smbus_byte_write(dev, addr, byte);
}
/**
* @brief Perform SMBus Byte Read operation
*
* This routine provides a generic interface to perform SMBus
* Byte Read operation.
*
* @param dev Pointer to the device structure for the SMBus driver instance.
* @param addr Address of the SMBus peripheral device.
* @param byte Byte received from the peripheral device.
*
* @retval 0 If successful.
* @retval -EIO General input / output error.
* @retval -ENOSYS If function smbus_byte_read() is not implemented
* by the driver.
*/
__syscall int smbus_byte_read(const struct device *dev, uint16_t addr,
uint8_t *byte);
static inline int z_impl_smbus_byte_read(const struct device *dev,
uint16_t addr, uint8_t *byte)
{
const struct smbus_driver_api *api =
(const struct smbus_driver_api *)dev->api;
if (api->smbus_byte_read == NULL) {
return -ENOSYS;
}
return api->smbus_byte_read(dev, addr, byte);
}
/**
* @brief Perform SMBus Byte Data Write operation
*
* This routine provides a generic interface to perform SMBus
* Byte Data Write operation.
*
* @param dev Pointer to the device structure for the SMBus driver instance.
* @param addr Address of the SMBus peripheral device.
* @param cmd Command byte which is sent to peripheral device first.
* @param byte Byte to be sent to the peripheral device.
*
* @retval 0 If successful.
* @retval -EIO General input / output error.
* @retval -ENOSYS If function smbus_byte_data_write() is not implemented
* by the driver.
*/
__syscall int smbus_byte_data_write(const struct device *dev, uint16_t addr,
uint8_t cmd, uint8_t byte);
static inline int z_impl_smbus_byte_data_write(const struct device *dev,
uint16_t addr, uint8_t cmd,
uint8_t byte)
{
const struct smbus_driver_api *api =
(const struct smbus_driver_api *)dev->api;
if (api->smbus_byte_data_write == NULL) {
return -ENOSYS;
}
return api->smbus_byte_data_write(dev, addr, cmd, byte);
}
/**
* @brief Perform SMBus Byte Data Read operation
*
* This routine provides a generic interface to perform SMBus
* Byte Data Read operation.
*
* @param dev Pointer to the device structure for the SMBus driver instance.
* @param addr Address of the SMBus peripheral device.
* @param cmd Command byte which is sent to peripheral device first.
* @param byte Byte received from the peripheral device.
*
* @retval 0 If successful.
* @retval -EIO General input / output error.
* @retval -ENOSYS If function smbus_byte_data_read() is not implemented
* by the driver.
*/
__syscall int smbus_byte_data_read(const struct device *dev, uint16_t addr,
uint8_t cmd, uint8_t *byte);
static inline int z_impl_smbus_byte_data_read(const struct device *dev,
uint16_t addr, uint8_t cmd,
uint8_t *byte)
{
const struct smbus_driver_api *api =
(const struct smbus_driver_api *)dev->api;
if (api->smbus_byte_data_read == NULL) {
return -ENOSYS;
}
return api->smbus_byte_data_read(dev, addr, cmd, byte);
}
/**
* @brief Perform SMBus Word Data Write operation
*
* This routine provides a generic interface to perform SMBus
* Word Data Write operation.
*
* @param dev Pointer to the device structure for the SMBus driver instance.
* @param addr Address of the SMBus peripheral device.
* @param cmd Command byte which is sent to peripheral device first.
* @param word Word (16-bit) to be sent to the peripheral device.
*
* @retval 0 If successful.
* @retval -EIO General input / output error.
* @retval -ENOSYS If function smbus_word_data_write() is not implemented
* by the driver.
*/
__syscall int smbus_word_data_write(const struct device *dev, uint16_t addr,
uint8_t cmd, uint16_t word);
static inline int z_impl_smbus_word_data_write(const struct device *dev,
uint16_t addr, uint8_t cmd,
uint16_t word)
{
const struct smbus_driver_api *api =
(const struct smbus_driver_api *)dev->api;
if (api->smbus_word_data_write == NULL) {
return -ENOSYS;
}
return api->smbus_word_data_write(dev, addr, cmd, word);
}
/**
* @brief Perform SMBus Word Data Read operation
*
* This routine provides a generic interface to perform SMBus
* Word Data Read operation.
*
* @param dev Pointer to the device structure for the SMBus driver instance.
* @param addr Address of the SMBus peripheral device.
* @param cmd Command byte which is sent to peripheral device first.
* @param word Word (16-bit) received from the peripheral device.
*
* @retval 0 If successful.
* @retval -EIO General input / output error.
* @retval -ENOSYS If function smbus_word_data_read() is not implemented
* by the driver.
*/
__syscall int smbus_word_data_read(const struct device *dev, uint16_t addr,
uint8_t cmd, uint16_t *word);
static inline int z_impl_smbus_word_data_read(const struct device *dev,
uint16_t addr, uint8_t cmd,
uint16_t *word)
{
const struct smbus_driver_api *api =
(const struct smbus_driver_api *)dev->api;
if (api->smbus_word_data_read == NULL) {
return -ENOSYS;
}
return api->smbus_word_data_read(dev, addr, cmd, word);
}
/**
* @brief Perform SMBus Process Call operation
*
* This routine provides a generic interface to perform SMBus
* Process Call operation, which means Write 2 bytes following by
* Read 2 bytes.
*
* @param dev Pointer to the device structure for the SMBus driver instance.
* @param addr Address of the SMBus peripheral device.
* @param cmd Command byte which is sent to peripheral device first.
* @param send_word Word (16-bit) to be sent to the peripheral device.
* @param recv_word Word (16-bit) received from the peripheral device.
*
* @retval 0 If successful.
* @retval -EIO General input / output error.
* @retval -ENOSYS If function smbus_pcall() is not implemented
* by the driver.
*/
__syscall int smbus_pcall(const struct device *dev, uint16_t addr,
uint8_t cmd, uint16_t send_word, uint16_t *recv_word);
static inline int z_impl_smbus_pcall(const struct device *dev,
uint16_t addr, uint8_t cmd,
uint16_t send_word, uint16_t *recv_word)
{
const struct smbus_driver_api *api =
(const struct smbus_driver_api *)dev->api;
if (api->smbus_pcall == NULL) {
return -ENOSYS;
}
return api->smbus_pcall(dev, addr, cmd, send_word, recv_word);
}
/**
* @brief Perform SMBus Block Write operation
*
* This routine provides a generic interface to perform SMBus
* Block Write operation.
*
* @param dev Pointer to the device structure for the SMBus driver instance.
* @param addr Address of the SMBus peripheral device.
* @param cmd Command byte which is sent to peripheral device first.
* @param count Size of the data block buffer. Maximum 32 bytes.
* @param buf Data block buffer to be sent to the peripheral device.
*
* @retval 0 If successful.
* @retval -EIO General input / output error.
* @retval -ENOSYS If function smbus_block_write() is not implemented
* by the driver.
*/
__syscall int smbus_block_write(const struct device *dev, uint16_t addr,
uint8_t cmd, uint8_t count, uint8_t *buf);
static inline int z_impl_smbus_block_write(const struct device *dev,
uint16_t addr, uint8_t cmd,
uint8_t count, uint8_t *buf)
{
const struct smbus_driver_api *api =
(const struct smbus_driver_api *)dev->api;
if (api->smbus_block_write == NULL) {
return -ENOSYS;
}
if (count < 1 || count > SMBUS_BLOCK_BYTES_MAX) {
return -EINVAL;
}
return api->smbus_block_write(dev, addr, cmd, count, buf);
}
/**
* @brief Perform SMBus Block Read operation
*
* This routine provides a generic interface to perform SMBus
* Block Read operation.
*
* @param dev Pointer to the device structure for the SMBus driver instance.
* @param addr Address of the SMBus peripheral device.
* @param cmd Command byte which is sent to peripheral device first.
* @param count Size of the data peripheral sent. Maximum 32 bytes.
* @param buf Data block buffer received from the peripheral device.
*
* @retval 0 If successful.
* @retval -EIO General input / output error.
* @retval -ENOSYS If function smbus_block_read() is not implemented
* by the driver.
*/
__syscall int smbus_block_read(const struct device *dev, uint16_t addr,
uint8_t cmd, uint8_t *count, uint8_t *buf);
static inline int z_impl_smbus_block_read(const struct device *dev,
uint16_t addr, uint8_t cmd,
uint8_t *count, uint8_t *buf)
{
const struct smbus_driver_api *api =
(const struct smbus_driver_api *)dev->api;
if (api->smbus_block_read == NULL) {
return -ENOSYS;
}
return api->smbus_block_read(dev, addr, cmd, count, buf);
}
/**
* @brief Perform SMBus Block Process Call operation
*
* This routine provides a generic interface to perform SMBus
* Block Process Call operation. This operation is basically
* Block Write followed by Block Read.
*
* @param dev Pointer to the device structure for the SMBus driver instance.
* @param addr Address of the SMBus peripheral device.
* @param cmd Command byte which is sent to peripheral device first.
* @param snd_count Size of the data block buffer to send.
* @param snd_buf Data block buffer send to the peripheral device.
* @param rcv_count Size of the data peripheral sent.
* @param rcv_buf Data block buffer received from the peripheral device.
*
* @retval 0 If successful.
* @retval -EIO General input / output error.
* @retval -ENOSYS If function smbus_block_pcall() is not implemented
* by the driver.
*/
__syscall int smbus_block_pcall(const struct device *dev,
uint16_t addr, uint8_t cmd,
uint8_t snd_count, uint8_t *snd_buf,
uint8_t *rcv_count, uint8_t *rcv_buf);
static inline int z_impl_smbus_block_pcall(const struct device *dev,
uint16_t addr, uint8_t cmd,
uint8_t snd_count, uint8_t *snd_buf,
uint8_t *rcv_count, uint8_t *rcv_buf)
{
const struct smbus_driver_api *api =
(const struct smbus_driver_api *)dev->api;
if (api->smbus_block_pcall == NULL) {
return -ENOSYS;
}
return api->smbus_block_pcall(dev, addr, cmd, snd_count, snd_buf,
rcv_count, rcv_buf);
}
#ifdef __cplusplus
}
#endif
/**
* @}
*/
#include <zephyr/syscalls/smbus.h>
#endif /* ZEPHYR_INCLUDE_DRIVERS_SMBUS_H_ */