7#ifndef ZEPHYR_INCLUDE_DRIVERS_SMBUS_H_
8#define ZEPHYR_INCLUDE_DRIVERS_SMBUS_H_
46#define SMBUS_CMD_QUICK 0b000
69#define SMBUS_CMD_BYTE 0b001
95#define SMBUS_CMD_BYTE_DATA 0b010
123#define SMBUS_CMD_WORD_DATA 0b011
142#define SMBUS_CMD_PROC_CALL 0b100
173#define SMBUS_CMD_BLOCK 0b101
193#define SMBUS_CMD_BLOCK_PROC 0b111
197#define SMBUS_BLOCK_BYTES_MAX 32
207#define SMBUS_MODE_CONTROLLER BIT(0)
210#define SMBUS_MODE_PEC BIT(1)
213#define SMBUS_MODE_HOST_NOTIFY BIT(2)
216#define SMBUS_MODE_SMBALERT BIT(3)
233#define SMBUS_ADDRESS_ARA 0x0c
253#define SMBUS_MSG_RW_MASK BIT(0)
310#define SMBUS_DT_SPEC_GET(node_id) \
312 .bus = DEVICE_DT_GET(DT_BUS(node_id)), \
313 .addr = DT_REG_ADDR(node_id) \
324#define SMBUS_DT_SPEC_INST_GET(inst) SMBUS_DT_SPEC_GET(DT_DRV_INST(inst))
333typedef int (*smbus_api_configure_t)(
const struct device *dev,
335typedef int (*smbus_api_get_config_t)(
const struct device *dev,
337typedef int (*smbus_api_quick_t)(
const struct device *dev,
339typedef int (*smbus_api_byte_write_t)(
const struct device *dev,
341typedef int (*smbus_api_byte_read_t)(
const struct device *dev,
343typedef int (*smbus_api_byte_data_write_t)(
const struct device *dev,
346typedef int (*smbus_api_byte_data_read_t)(
const struct device *dev,
349typedef int (*smbus_api_word_data_write_t)(
const struct device *dev,
352typedef int (*smbus_api_word_data_read_t)(
const struct device *dev,
355typedef int (*smbus_api_pcall_t)(
const struct device *dev,
358typedef int (*smbus_api_block_write_t)(
const struct device *dev,
361typedef int (*smbus_api_block_read_t)(
const struct device *dev,
364typedef int (*smbus_api_block_pcall_t)(
const struct device *dev,
368typedef int (*smbus_api_smbalert_cb_t)(
const struct device *dev,
370typedef int (*smbus_api_host_notify_cb_t)(
const struct device *dev,
373__subsystem
struct smbus_driver_api {
374 smbus_api_configure_t configure;
375 smbus_api_get_config_t get_config;
397#if defined(CONFIG_SMBUS_STATS) || defined(__DOXYGEN__)
415struct smbus_device_state {
417 struct stats_smbus stats;
423#define Z_SMBUS_DEVICE_STATE_DEFINE(node_id, dev_name) \
424 static struct smbus_device_state Z_DEVICE_STATE_NAME(dev_name) \
425 __attribute__((__section__(".z_devstate")));
433#define Z_SMBUS_INIT_FN(dev_name, init_fn) \
435 UTIL_CAT(dev_name, _init)(const struct device *dev) \
437 struct smbus_device_state *state = \
438 CONTAINER_OF(dev->state, \
439 struct smbus_device_state, \
441 stats_init(&state->stats.s_hdr, STATS_SIZE_32, 4, \
442 STATS_NAME_INIT_PARMS(smbus)); \
443 stats_register(dev->name, &(state->stats.s_hdr)); \
444 return init_fn(dev); \
460 struct smbus_device_state *
state =
496#define SMBUS_DEVICE_DT_DEFINE(node_id, init_fn, pm_device, \
497 data_ptr, cfg_ptr, level, prio, \
499 Z_SMBUS_DEVICE_STATE_DEFINE(node_id, \
500 Z_DEVICE_DT_DEV_NAME(node_id)); \
501 Z_SMBUS_INIT_FN(Z_DEVICE_DT_DEV_NAME(node_id), init_fn) \
502 Z_DEVICE_DEFINE(node_id, Z_DEVICE_DT_DEV_NAME(node_id), \
503 DEVICE_DT_NAME(node_id), \
504 &UTIL_CAT(Z_DEVICE_DT_DEV_NAME(node_id), _init),\
506 data_ptr, cfg_ptr, level, prio, \
508 &(Z_DEVICE_STATE_NAME(Z_DEVICE_DT_DEV_NAME \
509 (node_id)).devstate), \
522#define SMBUS_DEVICE_DT_DEFINE(node_id, init_fn, pm_device, \
523 data_ptr, cfg_ptr, level, prio, \
525 DEVICE_DT_DEFINE(node_id, &init_fn, pm_device, \
526 data_ptr, cfg_ptr, level, prio, \
527 api_ptr, __VA_ARGS__)
540#define SMBUS_DEVICE_DT_INST_DEFINE(inst, ...) \
541 SMBUS_DEVICE_DT_DEFINE(DT_DRV_INST(inst), __VA_ARGS__)
555static inline int z_impl_smbus_configure(
const struct device *dev,
558 const struct smbus_driver_api *api =
559 (
const struct smbus_driver_api *)dev->
api;
561 return api->configure(dev, dev_config);
586static inline int z_impl_smbus_get_config(
const struct device *dev,
589 const struct smbus_driver_api *api =
590 (
const struct smbus_driver_api *)dev->
api;
592 if (api->get_config == NULL) {
596 return api->get_config(dev, dev_config);
613static inline int z_impl_smbus_smbalert_set_cb(
const struct device *dev,
616 const struct smbus_driver_api *api =
617 (
const struct smbus_driver_api *)dev->
api;
619 if (api->smbus_smbalert_set_cb == NULL) {
623 return api->smbus_smbalert_set_cb(dev, cb);
640static inline int z_impl_smbus_smbalert_remove_cb(
const struct device *dev,
643 const struct smbus_driver_api *api =
644 (
const struct smbus_driver_api *)dev->
api;
646 if (api->smbus_smbalert_remove_cb == NULL) {
650 return api->smbus_smbalert_remove_cb(dev, cb);
667static inline int z_impl_smbus_host_notify_set_cb(
const struct device *dev,
670 const struct smbus_driver_api *api =
671 (
const struct smbus_driver_api *)dev->
api;
673 if (api->smbus_host_notify_set_cb == NULL) {
677 return api->smbus_host_notify_set_cb(dev, cb);
694static inline int z_impl_smbus_host_notify_remove_cb(
const struct device *dev,
697 const struct smbus_driver_api *api =
698 (
const struct smbus_driver_api *)dev->
api;
700 if (api->smbus_host_notify_remove_cb == NULL) {
704 return api->smbus_host_notify_remove_cb(dev, cb);
726static inline int z_impl_smbus_quick(
const struct device *dev,
uint16_t addr,
729 const struct smbus_driver_api *api =
730 (
const struct smbus_driver_api *)dev->
api;
732 if (api->smbus_quick == NULL) {
740 return api->smbus_quick(dev, addr, direction);
761static inline int z_impl_smbus_byte_write(
const struct device *dev,
764 const struct smbus_driver_api *api =
765 (
const struct smbus_driver_api *)dev->
api;
767 if (api->smbus_byte_write == NULL) {
771 return api->smbus_byte_write(dev, addr,
byte);
792static inline int z_impl_smbus_byte_read(
const struct device *dev,
795 const struct smbus_driver_api *api =
796 (
const struct smbus_driver_api *)dev->
api;
798 if (api->smbus_byte_read == NULL) {
802 return api->smbus_byte_read(dev, addr,
byte);
824static inline int z_impl_smbus_byte_data_write(
const struct device *dev,
828 const struct smbus_driver_api *api =
829 (
const struct smbus_driver_api *)dev->
api;
831 if (api->smbus_byte_data_write == NULL) {
835 return api->smbus_byte_data_write(dev, addr,
cmd,
byte);
857static inline int z_impl_smbus_byte_data_read(
const struct device *dev,
861 const struct smbus_driver_api *api =
862 (
const struct smbus_driver_api *)dev->
api;
864 if (api->smbus_byte_data_read == NULL) {
868 return api->smbus_byte_data_read(dev, addr,
cmd,
byte);
890static inline int z_impl_smbus_word_data_write(
const struct device *dev,
894 const struct smbus_driver_api *api =
895 (
const struct smbus_driver_api *)dev->
api;
897 if (api->smbus_word_data_write == NULL) {
901 return api->smbus_word_data_write(dev, addr,
cmd, word);
923static inline int z_impl_smbus_word_data_read(
const struct device *dev,
927 const struct smbus_driver_api *api =
928 (
const struct smbus_driver_api *)dev->
api;
930 if (api->smbus_word_data_read == NULL) {
934 return api->smbus_word_data_read(dev, addr,
cmd, word);
958static inline int z_impl_smbus_pcall(
const struct device *dev,
962 const struct smbus_driver_api *api =
963 (
const struct smbus_driver_api *)dev->
api;
965 if (api->smbus_pcall == NULL) {
969 return api->smbus_pcall(dev, addr,
cmd, send_word, recv_word);
992static inline int z_impl_smbus_block_write(
const struct device *dev,
996 const struct smbus_driver_api *api =
997 (
const struct smbus_driver_api *)dev->
api;
999 if (api->smbus_block_write == NULL) {
1007 return api->smbus_block_write(dev, addr,
cmd,
count, buf);
1030static inline int z_impl_smbus_block_read(
const struct device *dev,
1034 const struct smbus_driver_api *api =
1035 (
const struct smbus_driver_api *)dev->
api;
1037 if (api->smbus_block_read == NULL) {
1041 return api->smbus_block_read(dev, addr,
cmd,
count, buf);
1069static inline int z_impl_smbus_block_pcall(
const struct device *dev,
1074 const struct smbus_driver_api *api =
1075 (
const struct smbus_driver_api *)dev->
api;
1077 if (api->smbus_block_pcall == NULL) {
1081 return api->smbus_block_pcall(dev, addr,
cmd, snd_count, snd_buf,
1082 rcv_count, rcv_buf);
1093#include <syscalls/smbus.h>
ZTEST_BMEM int count
Definition: main.c:33
static ssize_t recv(int sock, void *buf, size_t max_len, int flags)
Definition: socket.h:744
static void cmd(uint32_t command)
Execute a display list command by co-processor engine.
Definition: ft8xx_reference_api.h:153
static void smbus_xfer_stats(const struct device *dev, uint8_t sent, uint8_t recv)
Updates the SMBus stats.
Definition: smbus.h:457
int smbus_byte_data_read(const struct device *dev, uint16_t addr, uint8_t cmd, uint8_t *byte)
Perform SMBus Byte Data Read operation.
int smbus_host_notify_set_cb(const struct device *dev, struct smbus_callback *cb)
Add Host Notify callback for a SMBus host controller.
int smbus_pcall(const struct device *dev, uint16_t addr, uint8_t cmd, uint16_t send_word, uint16_t *recv_word)
Perform SMBus Process Call operation.
int smbus_configure(const struct device *dev, uint32_t dev_config)
Configure operation of a SMBus host controller.
int smbus_block_write(const struct device *dev, uint16_t addr, uint8_t cmd, uint8_t count, uint8_t *buf)
Perform SMBus Block Write operation.
int smbus_smbalert_set_cb(const struct device *dev, struct smbus_callback *cb)
Add SMBUSALERT callback for a SMBus host controller.
#define SMBUS_BLOCK_BYTES_MAX
Definition: smbus.h:197
int smbus_block_read(const struct device *dev, uint16_t addr, uint8_t cmd, uint8_t *count, uint8_t *buf)
Perform SMBus Block Read operation.
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)
Perform SMBus Block Process Call operation.
void(* smbus_callback_handler_t)(const struct device *dev, struct smbus_callback *cb, uint8_t addr)
Define SMBus callback handler function signature.
Definition: smbus.h:265
int smbus_word_data_read(const struct device *dev, uint16_t addr, uint8_t cmd, uint16_t *word)
Perform SMBus Word Data Read operation.
int smbus_byte_write(const struct device *dev, uint16_t addr, uint8_t byte)
Perform SMBus Byte Write operation.
int smbus_get_config(const struct device *dev, uint32_t *dev_config)
Get configuration of a SMBus host controller.
int smbus_host_notify_remove_cb(const struct device *dev, struct smbus_callback *cb)
Remove Host Notify callback from a SMBus host controller.
int smbus_quick(const struct device *dev, uint16_t addr, enum smbus_direction direction)
Perform SMBus Quick operation.
int smbus_smbalert_remove_cb(const struct device *dev, struct smbus_callback *cb)
Remove SMBUSALERT callback from a SMBus host controller.
smbus_direction
SMBus read / write direction.
Definition: smbus.h:243
int smbus_byte_read(const struct device *dev, uint16_t addr, uint8_t *byte)
Perform SMBus Byte Read operation.
int smbus_byte_data_write(const struct device *dev, uint16_t addr, uint8_t cmd, uint8_t byte)
Perform SMBus Byte Data Write operation.
int smbus_word_data_write(const struct device *dev, uint16_t addr, uint8_t cmd, uint16_t word)
Perform SMBus Word Data Write operation.
@ SMBUS_MSG_WRITE
Definition: smbus.h:245
@ SMBUS_MSG_READ
Definition: smbus.h:247
#define CONTAINER_OF(ptr, type, field)
Get a pointer to a structure containing the element.
Definition: util.h:224
#define EINVAL
Definition: errno.h:61
#define ENOSYS
Definition: errno.h:83
state
Definition: parser_state.h:29
struct _snode sys_snode_t
Definition: slist.h:33
#define STATS_NAME_END(name__)
Definition: stats.h:391
#define STATS_NAME(name__, entry__)
Definition: stats.h:390
#define STATS_SECT_END
Ends a stats group struct definition.
Definition: stats.h:89
#define STATS_SECT_ENTRY32(var__)
Definition: stats.h:359
#define STATS_INC(group__, var__)
Definition: stats.h:364
#define STATS_NAME_START(name__)
Definition: stats.h:389
#define STATS_INCN(group__, var__, n__)
Definition: stats.h:363
#define STATS_SECT_START(group__)
Definition: stats.h:354
__UINT32_TYPE__ uint32_t
Definition: stdint.h:90
__UINT8_TYPE__ uint8_t
Definition: stdint.h:88
__UINT16_TYPE__ uint16_t
Definition: stdint.h:89
Runtime device dynamic structure (in RAM) per driver instance.
Definition: device.h:353
Runtime device structure (in ROM) per driver instance.
Definition: device.h:380
const void * api
Definition: device.h:386
struct device_state * state
Definition: device.h:388
SMBus callback structure.
Definition: smbus.h:278
smbus_callback_handler_t handler
Definition: smbus.h:283
uint8_t addr
Definition: smbus.h:286
sys_snode_t node
Definition: smbus.h:280
Complete SMBus DT information.
Definition: smbus.h:295
uint16_t addr
Definition: smbus.h:297
const struct device * bus
Definition: smbus.h:296
static ZTEST_DMEM uint32_t send_buf[2]
Definition: test_msgq_attrs.c:10