/* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */
/*
 * Copyright (c) 2019 Amlogic, Inc. All rights reserved.
 */

#ifndef __AML_DTVDEMOD_H__
#define __AML_DTVDEMOD_H__

#include <linux/amlogic/aml_demod_common.h>
#include <media/dvb_frontend.h>

struct demod_module {
	char *name;

	u8 id;
	u8 type[AML_MAX_FE]; /* FE type supported by demod. */

	void *attach_symbol; /* The actual attach function symbolic address. */

	struct dvb_frontend *(*attach)(const struct demod_module *module,
			const struct demod_config *cfg);
	int (*detach)(const struct demod_module *module);
	int (*match)(const struct demod_module *module, int std);
	int (*detect)(const struct demod_config *cfg);
	int (*register_frontend)(struct dvb_adapter *dvb,
			struct dvb_frontend *fe);
	int (*unregister_frontend)(struct dvb_frontend *fe);
};

#ifndef MODULE
#if (defined CONFIG_AMLOGIC_DTV_DEMOD ||\
		defined CONFIG_AMLOGIC_DTV_DEMOD_MODULE)
struct dvb_frontend *aml_dtvdm_attach(const struct demod_config *cfg);
#else
static inline __maybe_unused struct dvb_frontend *aml_dtvdm_attach(
		const struct demod_config *cfg)
{
	return NULL;
}
#endif
#endif

#if (defined CONFIG_AMLOGIC_DVB_EXTERN ||\
		defined CONFIG_AMLOGIC_DVB_EXTERN_MODULE)
enum dtv_demod_type aml_get_dtvdemod_type(const char *name);
int aml_get_dts_demod_config(struct device_node *node,
		struct demod_config *cfg, int index);
void aml_show_demod_config(const char *title, const struct demod_config *cfg);
const struct demod_module *aml_get_demod_module(enum dtv_demod_type type);
void aml_set_demod_attach_cb(const enum dtv_demod_type type, dm_attach_cb funcb);

#else

static inline __maybe_unused enum dtv_demod_type aml_get_dtvdemod_type(
		const char *name)
{
	return AM_DTV_DEMOD_NONE;
}

static inline __maybe_unused int aml_get_dts_demod_config(
		struct device_node *node, struct demod_config *cfg, int index)
{
	return -ENODEV;
}

static inline __maybe_unused void aml_show_demod_config(const char *title,
		const struct demod_config *cfg)
{
}

static inline __maybe_unused const struct demod_module *aml_get_demod_module(
		enum dtv_demod_type type)
{
	return NULL;
}

static inline __maybe_unused void aml_set_demod_attach_cb(const enum dtv_demod_type type,
		dm_attach_cb funcb)
{
}

#endif

/* For attach demod driver end*/
#endif /* __AML_DTVDEMOD_H__ */
