/*
 * Copyright (c) 2023 Jeroen van Dooren, Nobleo Technology
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#ifndef BDMA_STM32_H_
#define BDMA_STM32_H_

#include <soc.h>
#include <stm32_ll_bdma.h>
#include <zephyr/drivers/dma.h>
#include <zephyr/drivers/clock_control/stm32_clock_control.h>
#include <zephyr/drivers/dma/dma_stm32.h>

/* Maximum data sent in single transfer (Bytes) */
#define BDMA_STM32_MAX_DATA_ITEMS	0xffff

struct bdma_stm32_channel {
	uint32_t direction;
#ifdef CONFIG_DMAMUX_STM32
	int mux_channel; /* stores the dmamux channel */
#endif /* CONFIG_DMAMUX_STM32 */
	bool source_periph;
	bool hal_override;
	volatile bool busy;
	uint32_t src_size;
	uint32_t dst_size;
	void *user_data; /* holds the client data */
	dma_callback_t bdma_callback;
};

struct bdma_stm32_data {
	struct dma_context dma_ctx;
};

struct bdma_stm32_config {
	struct stm32_pclken pclken;
	void (*config_irq)(const struct device *dev);
	bool support_m2m;
	uint32_t base;
	uint32_t max_channels;
#ifdef CONFIG_DMAMUX_STM32
	uint8_t offset; /* position in the list of bdmamux channel list */
#endif
	struct bdma_stm32_channel *channels;
};

uint32_t bdma_stm32_id_to_channel(uint32_t id);
#if !defined(CONFIG_DMAMUX_STM32)
uint32_t bdma_stm32_slot_to_channel(uint32_t id);
#endif

typedef void (*bdma_stm32_clear_flag_func)(BDMA_TypeDef *DMAx);
typedef uint32_t (*bdma_stm32_check_flag_func)(BDMA_TypeDef *DMAx);

bool bdma_stm32_is_gi_active(BDMA_TypeDef *DMAx, uint32_t id);
void bdma_stm32_clear_gi(BDMA_TypeDef *DMAx, uint32_t id);

void bdma_stm32_clear_tc(BDMA_TypeDef *DMAx, uint32_t id);
void bdma_stm32_clear_ht(BDMA_TypeDef *DMAx, uint32_t id);
bool bdma_stm32_is_te_active(BDMA_TypeDef *DMAx, uint32_t id);
void bdma_stm32_clear_te(BDMA_TypeDef *DMAx, uint32_t id);

bool stm32_bdma_is_irq_active(BDMA_TypeDef *dma, uint32_t id);
bool stm32_bdma_is_ht_irq_active(BDMA_TypeDef *ma, uint32_t id);
bool stm32_bdma_is_tc_irq_active(BDMA_TypeDef *ma, uint32_t id);

void stm32_bdma_dump_channel_irq(BDMA_TypeDef *dma, uint32_t id);
void stm32_bdma_clear_channel_irq(BDMA_TypeDef *dma, uint32_t id);
bool stm32_bdma_is_irq_happened(BDMA_TypeDef *dma, uint32_t id);
void stm32_bdma_enable_channel(BDMA_TypeDef *dma, uint32_t id);
int stm32_bdma_disable_channel(BDMA_TypeDef *dma, uint32_t id);

#if !defined(CONFIG_DMAMUX_STM32)
void stm32_dma_config_channel_function(BDMA_TypeDef *dma, uint32_t id,
						uint32_t slot);
#endif

#ifdef CONFIG_DMAMUX_STM32
/* bdma_stm32_ api functions are exported to the bdmamux_stm32 */
#define BDMA_STM32_EXPORT_API
int bdma_stm32_configure(const struct device *dev, uint32_t id,
				struct dma_config *config);
int bdma_stm32_reload(const struct device *dev, uint32_t id,
			uint32_t src, uint32_t dst, size_t size);
int bdma_stm32_start(const struct device *dev, uint32_t id);
int bdma_stm32_stop(const struct device *dev, uint32_t id);
int bdma_stm32_get_status(const struct device *dev, uint32_t id,
				struct dma_status *stat);
#else
#define BDMA_STM32_EXPORT_API static
#endif /* CONFIG_DMAMUX_STM32 */

#endif /* BDMA_STM32_H_*/
