#ifndef  __VMMC_ALM_H__
#define  __VMMC_ALM_H__

#include "vmmc-module.h"

struct vmmc;
enum vmmc_alm_state {
	VMMC_ALM_STATE_OFF = 0 << 16,
	VMMC_ALM_STATE_ONHOOK = 1 << 16,
	VMMC_ALM_STATE_RING = 3 << 16,
	VMMC_ALM_STATE_ACTIVE = 2 << 16,
};

struct vmmc_alm {
	struct vmmc *vmmc;
	unsigned int id;

	enum vmmc_alm_state state;

	struct vmmc_module module;

	uint32_t cmd_cache[3];
};

struct vmmc_alm_coef {
	struct list_head list;
	unsigned int offset;
	size_t len;
	uint32_t data[0];
};

int vmmc_alm_init(struct vmmc_alm *alm, struct vmmc *vmmc, unsigned int id);

int vmmc_alm_set_state(struct vmmc_alm *alm, enum vmmc_alm_state state);
enum vmmc_alm_state vmmc_alm_get_state(struct vmmc_alm *alm);

int vmcc_alm_set_coefficents(struct vmmc_alm *alm,
	const struct vmmc_alm_coef *coef_list);

void vmmc_alm_hook_event_handler(struct vmmc *vmmc, uint32_t event, uint32_t data);

#endif