/*
 * Common hwbus abstraction layer interface for cw1200 wireless driver
 *
 * Copyright (c) 2010, ST-Ericsson
 * Author: Dmitry Tarnyagin <dmitry.tarnyagin@lockless.no>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 */

#ifndef CW1200_HWBUS_H
#define CW1200_HWBUS_H

struct hwbus_priv;

void cw1200_irq_handler(struct cw1200_common *priv);

/* This MUST be wrapped with hwbus_ops->lock/unlock! */
int __cw1200_irq_enable(struct cw1200_common *priv, int enable);

struct hwbus_ops {
	int (*hwbus_memcpy_fromio)(struct hwbus_priv *self, unsigned int addr,
					void *dst, int count);
	int (*hwbus_memcpy_toio)(struct hwbus_priv *self, unsigned int addr,
					const void *src, int count);
	void (*lock)(struct hwbus_priv *self);
	void (*unlock)(struct hwbus_priv *self);
	size_t (*align_size)(struct hwbus_priv *self, size_t size);
	int (*power_mgmt)(struct hwbus_priv *self, bool suspend);
};

#endif /* CW1200_HWBUS_H */
