/*
 * OS Dependent Functions for FatFs
 *
 * Copyright (c) 2023 Husqvarna AB
 *
 * SPDX-License-Identifier: Apache-2.0
 */
/* The file is based on template file by (C)ChaN, 2022, as
 * available from FAT FS module source:
 * https://github.com/zephyrproject-rtos/fatfs/blob/master/option/ffsystem.c
 */

#include <ff.h>

#if FF_USE_LFN == 3	/* Dynamic memory allocation */
/* Allocate a memory block */
void *ff_memalloc(UINT msize)
{
	return k_malloc(msize);
}

/* Free a memory block */
void ff_memfree(void *mblock)
{
	k_free(mblock);
}
#endif /* FF_USE_LFN == 3 */

#if FF_FS_REENTRANT	/* Mutual exclusion */
/* Table of Zephyr mutex. One for each volume and an extra one for the ff system.
 * See also the template file used as reference. Link is available in the header of this file.
 */
static struct k_mutex fs_reentrant_mutex[FF_VOLUMES + 1];

/* Create a Mutex
 * Mutex ID vol: Volume mutex (0 to FF_VOLUMES - 1) or system mutex (FF_VOLUMES)
 * Returns 1: Succeeded or 0: Could not create the mutex
 */
int ff_mutex_create(int vol)
{
	return (int)(k_mutex_init(&fs_reentrant_mutex[vol]) == 0);
}

/* Delete a Mutex
 * Mutex ID vol: Volume mutex (0 to FF_VOLUMES - 1) or system mutex (FF_VOLUMES)
 */
void ff_mutex_delete(int vol)
{
	/* (nothing to do) */
	(void)vol;
}

/* Request Grant to Access the Volume
 * Mutex ID vol: Volume mutex (0 to FF_VOLUMES - 1) or system mutex (FF_VOLUMES)
 * Returns 1: Succeeded or 0: Timeout
 */
int ff_mutex_take(int vol)
{
	return (int)(k_mutex_lock(&fs_reentrant_mutex[vol], FF_FS_TIMEOUT) == 0);
}

/* Release Grant to Access the Volume
 * Mutex ID vol: Volume mutex (0 to FF_VOLUMES - 1) or system mutex (FF_VOLUMES)
 */
void ff_mutex_give(int vol)
{
	k_mutex_unlock(&fs_reentrant_mutex[vol]);
}
#endif /* FF_FS_REENTRANT */
