/*
 * Copyright 2022 Intel Corporation
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#ifndef ZEPHYR_INCLUDE_DRIVERS_I3C_ADDRESSES_H_
#define ZEPHYR_INCLUDE_DRIVERS_I3C_ADDRESSES_H_

/**
 * @brief I3C Address-related Helper Code
 * @defgroup i3c_addresses I3C Address-related Helper Code
 * @ingroup i3c_interface
 * @{
 */

#include <zephyr/types.h>
#include <zephyr/sys/sys_io.h>
#include <zephyr/sys/util.h>

#ifdef __cplusplus
extern "C" {
#endif

#define I3C_BROADCAST_ADDR			0x7E
#define I3C_MAX_ADDR				0x7F

struct i3c_dev_list;

enum i3c_addr_slot_status {
	I3C_ADDR_SLOT_STATUS_FREE = 0U,
	I3C_ADDR_SLOT_STATUS_RSVD,
	I3C_ADDR_SLOT_STATUS_I3C_DEV,
	I3C_ADDR_SLOT_STATUS_I2C_DEV,
	I3C_ADDR_SLOT_STATUS_MASK = 0x03U,
};

/**
 * @brief Structure to keep track of addresses on I3C bus.
 */
struct i3c_addr_slots {
	/* 2 bits per slot */
	unsigned long slots[((I3C_MAX_ADDR + 1) * 2) / BITS_PER_LONG];
};

/**
 * @brief Initialize the I3C address slots struct.
 *
 * This clears out the assigned address bits, and set the reserved
 * address bits according to the I3C specification.
 *
 * @param slots Pointer to address slots struct.
 * @param dev_list Pointer to device list struct.
 *
 * @retval 0 if successful.
 * @retval -EINVAL if duplicate addresses.
 */
int i3c_addr_slots_init(struct i3c_addr_slots *slots,
			const struct i3c_dev_list *dev_list);

/**
 * @brief Set the address status of a device.
 *
 * @param slots Pointer to the address slots structure.
 * @param dev_addr Device address.
 * @param status New status for the address @p dev_addr.
 */
void i3c_addr_slots_set(struct i3c_addr_slots *slots,
			uint8_t dev_addr,
			enum i3c_addr_slot_status status);

/**
 * @brief Get the address status of a device.
 *
 * @param slots Pointer to the address slots structure.
 * @param dev_addr Device address.
 *
 * @return Address status for the address @p dev_addr.
 */
enum i3c_addr_slot_status i3c_addr_slots_status(struct i3c_addr_slots *slots,
						uint8_t dev_addr);

/**
 * @brief Check if the address is free.
 *
 * @param slots Pointer to the address slots structure.
 * @param dev_addr Device address.
 *
 * @retval true if address is free.
 * @retval false if address is not free.
 */
bool i3c_addr_slots_is_free(struct i3c_addr_slots *slots,
			    uint8_t dev_addr);

/**
 * @brief Find the next free address.
 *
 * This can be used to find the next free address that can be
 * assigned to a new device.
 *
 * @param slots Pointer to the address slots structure.
 *
 * @return The next free address, or 0 if none found.
 */
uint8_t i3c_addr_slots_next_free_find(struct i3c_addr_slots *slots);

/**
 * @brief Mark the address as free (not used) in device list.
 *
 * @param addr_slots Pointer to the address slots struct.
 * @param addr Device address.
 */
static inline void i3c_addr_slots_mark_free(struct i3c_addr_slots *addr_slots,
					    uint8_t addr)
{
	i3c_addr_slots_set(addr_slots, addr,
			   I3C_ADDR_SLOT_STATUS_FREE);
}

/**
 * @brief Mark the address as reserved in device list.
 *
 * @param addr_slots Pointer to the address slots struct.
 * @param addr Device address.
 */
static inline void i3c_addr_slots_mark_rsvd(struct i3c_addr_slots *addr_slots,
					    uint8_t addr)
{
	i3c_addr_slots_set(addr_slots, addr,
			   I3C_ADDR_SLOT_STATUS_RSVD);
}

/**
 * @brief Mark the address as I3C device in device list.
 *
 * @param addr_slots Pointer to the address slots struct.
 * @param addr Device address.
 */
static inline void i3c_addr_slots_mark_i3c(struct i3c_addr_slots *addr_slots,
					   uint8_t addr)
{
	i3c_addr_slots_set(addr_slots, addr,
			   I3C_ADDR_SLOT_STATUS_I3C_DEV);
}

/**
 * @brief Mark the address as I2C device in device list.
 *
 * @param addr_slots Pointer to the address slots struct.
 * @param addr Device address.
 */
static inline void i3c_addr_slots_mark_i2c(struct i3c_addr_slots *addr_slots,
					   uint8_t addr)
{
	i3c_addr_slots_set(addr_slots, addr,
			   I3C_ADDR_SLOT_STATUS_I2C_DEV);
}

#ifdef __cplusplus
}
#endif

/**
 * @}
 */

#endif /* ZEPHYR_INCLUDE_DRIVERS_I3C_ADDRESSES_H_ */
