/*
 * An inteface for configuring a hardware via u-boot environment.
 *
 * Copyright (c) 2009  MontaVista Software, Inc.
 * Copyright 2011 Freescale Semiconductor, Inc.
 *
 * Author: Anton Vorontsov <avorontsov@ru.mvista.com>
 *
 * SPDX-License-Identifier:	GPL-2.0+
 */

#ifndef _HWCONFIG_H
#define _HWCONFIG_H

#include <linux/types.h>
#include <asm/errno.h>

#ifdef CONFIG_HWCONFIG

extern int hwconfig_f(const char *opt, char *buf);
extern const char *hwconfig_arg_f(const char *opt, size_t *arglen, char *buf);
extern int hwconfig_arg_cmp_f(const char *opt, const char *arg, char *buf);
extern int hwconfig_sub_f(const char *opt, const char *subopt, char *buf);
extern const char *hwconfig_subarg_f(const char *opt, const char *subopt,
				     size_t *subarglen, char *buf);
extern int hwconfig_subarg_cmp_f(const char *opt, const char *subopt,
				 const char *subarg, char *buf);
#else

static inline int hwconfig_f(const char *opt, char *buf)
{
	return -ENOSYS;
}

static inline const char *hwconfig_arg_f(const char *opt, size_t *arglen,
					 char *buf)
{
	*arglen = 0;
	return "";
}

static inline int hwconfig_arg_cmp_f(const char *opt, const char *arg,
				     char *buf)
{
	return -ENOSYS;
}

static inline int hwconfig_sub_f(const char *opt, const char *subopt, char *buf)
{
	return -ENOSYS;
}

static inline const char *hwconfig_subarg_f(const char *opt, const char *subopt,
					    size_t *subarglen, char *buf)
{
	*subarglen = 0;
	return "";
}

static inline int hwconfig_subarg_cmp_f(const char *opt, const char *subopt,
					const char *subarg, char *buf)
{
	return -ENOSYS;
}

#endif /* CONFIG_HWCONFIG */

static inline int hwconfig(const char *opt)
{
	return hwconfig_f(opt, NULL);
}

static inline const char *hwconfig_arg(const char *opt, size_t *arglen)
{
	return hwconfig_arg_f(opt, arglen, NULL);
}

static inline int hwconfig_arg_cmp(const char *opt, const char *arg)
{
	return hwconfig_arg_cmp_f(opt, arg, NULL);
}

static inline int hwconfig_sub(const char *opt, const char *subopt)
{
	return hwconfig_sub_f(opt, subopt, NULL);
}

static inline const char *hwconfig_subarg(const char *opt, const char *subopt,
					  size_t *subarglen)
{
	return hwconfig_subarg_f(opt, subopt, subarglen, NULL);
}

static inline int hwconfig_subarg_cmp(const char *opt, const char *subopt,
				      const char *subarg)
{
	return hwconfig_subarg_cmp_f(opt, subopt, subarg, NULL);
}

#endif /* _HWCONFIG_H */
