/* SPDX-License-Identifier: GPL-2.0-only */
/*
 * Copyright (C) 2008, Creative Technology Ltd. All Rights Reserved.
 *
 * @File	ctsrc.h
 *
 * @Brief
 * This file contains the definition of the Sample Rate Convertor
 * resource management object.
 *
 * @Author	Liu Chun
 * @Date 	May 13 2008
 */

#ifndef CTSRC_H
#define CTSRC_H

#include "ctresource.h"
#include "ctimap.h"
#include <linux/spinlock.h>
#include <linux/list.h>
#include <sound/core.h>

#define SRC_STATE_OFF	0x0
#define SRC_STATE_INIT	0x4
#define SRC_STATE_RUN	0x5

#define SRC_SF_U8	0x0
#define SRC_SF_S16	0x1
#define SRC_SF_S24	0x2
#define SRC_SF_S32	0x3
#define SRC_SF_F32	0x4

/* Define the descriptor of a src resource */
enum SRCMODE {
	MEMRD,		/* Read data from host memory */
	MEMWR,		/* Write data to host memory */
	ARCRW,		/* Read from and write to audio ring channel */
	NUM_SRCMODES
};

struct src_rsc_ops;

struct src {
	struct rsc rsc; /* Basic resource info */
	struct src *intlv; /* Pointer to next interleaved SRC in a series */
	const struct src_rsc_ops *ops; /* SRC specific operations */
	/* Number of contiguous srcs for interleaved usage */
	unsigned char multi;
	unsigned char mode; /* Working mode of this SRC resource */
};

struct src_rsc_ops {
	int (*set_state)(struct src *src, unsigned int state);
	int (*set_bm)(struct src *src, unsigned int bm);
	int (*set_sf)(struct src *src, unsigned int sf);
	int (*set_pm)(struct src *src, unsigned int pm);
	int (*set_rom)(struct src *src, unsigned int rom);
	int (*set_vo)(struct src *src, unsigned int vo);
	int (*set_st)(struct src *src, unsigned int st);
	int (*set_bp)(struct src *src, unsigned int bp);
	int (*set_cisz)(struct src *src, unsigned int cisz);
	int (*set_ca)(struct src *src, unsigned int ca);
	int (*set_sa)(struct src *src, unsigned int sa);
	int (*set_la)(struct src *src, unsigned int la);
	int (*set_pitch)(struct src *src, unsigned int pitch);
	int (*set_clr_zbufs)(struct src *src);
	int (*commit_write)(struct src *src);
	int (*get_ca)(struct src *src);
	int (*init)(struct src *src);
	struct src* (*next_interleave)(struct src *src);
};

/* Define src resource request description info */
struct src_desc {
	/* Number of contiguous master srcs for interleaved usage */
	unsigned char multi;
	unsigned char msr;
	unsigned char mode; /* Working mode of the requested srcs */
};

/* Define src manager object */
struct src_mgr {
	struct rsc_mgr mgr;	/* Basic resource manager info */
	struct snd_card *card;	/* pointer to this card */
	spinlock_t mgr_lock;

	 /* request src resource */
	int (*get_src)(struct src_mgr *mgr,
		       const struct src_desc *desc, struct src **rsrc);
	/* return src resource */
	int (*put_src)(struct src_mgr *mgr, struct src *src);
	int (*src_enable_s)(struct src_mgr *mgr, struct src *src);
	int (*src_enable)(struct src_mgr *mgr, struct src *src);
	int (*src_disable)(struct src_mgr *mgr, struct src *src);
	int (*commit_write)(struct src_mgr *mgr);
};

/* Define the descriptor of a SRC Input Mapper resource */
struct srcimp_mgr;
struct srcimp_rsc_ops;

struct srcimp {
	struct rsc rsc;
	unsigned char idx[8];
	struct imapper *imappers;
	unsigned int mapped; /* A bit-map indicating which conj rsc is mapped */
	struct srcimp_mgr *mgr;
	const struct srcimp_rsc_ops *ops;
};

struct srcimp_rsc_ops {
	int (*map)(struct srcimp *srcimp, struct src *user, struct rsc *input);
	int (*unmap)(struct srcimp *srcimp);
};

/* Define SRCIMP resource request description info */
struct srcimp_desc {
	unsigned int msr;
};

struct srcimp_mgr {
	struct rsc_mgr mgr;	/* Basic resource manager info */
	struct snd_card *card;	/* pointer to this card */
	spinlock_t mgr_lock;
	spinlock_t imap_lock;
	struct list_head imappers;
	struct imapper *init_imap;
	unsigned int init_imap_added;

	 /* request srcimp resource */
	int (*get_srcimp)(struct srcimp_mgr *mgr,
			  const struct srcimp_desc *desc,
			  struct srcimp **rsrcimp);
	/* return srcimp resource */
	int (*put_srcimp)(struct srcimp_mgr *mgr, struct srcimp *srcimp);
	int (*imap_add)(struct srcimp_mgr *mgr, struct imapper *entry);
	int (*imap_delete)(struct srcimp_mgr *mgr, struct imapper *entry);
};

/* Constructor and destructor of SRC resource manager */
int src_mgr_create(struct hw *hw, struct src_mgr **rsrc_mgr);
int src_mgr_destroy(struct src_mgr *src_mgr);
/* Constructor and destructor of SRCIMP resource manager */
int srcimp_mgr_create(struct hw *hw, struct srcimp_mgr **rsrc_mgr);
int srcimp_mgr_destroy(struct srcimp_mgr *srcimp_mgr);

#endif /* CTSRC_H */
