/*
 *  Copyright (c) 2013 Qualcomm Atheros, Inc.
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

#include <linux/module.h>
#include <linux/kernel.h>
#include <asm/byteorder.h>
#include <linux/init.h>
#include <linux/errno.h>
#include <linux/delay.h>
#include <linux/timer.h>
#include <linux/interrupt.h>
#include <linux/dma-mapping.h>
#include <linux/bitops.h>
#include <asm/irq.h>
#include <asm/io.h>

#include <atheros.h>

/*
 * GPIO Misc IRQ Functions
 */
void ath_misc_enable_irq(unsigned int mask)
{
	ath_reg_rmw_set(ATH_MISC_INT_MASK, mask);
}
void ath_misc_disable_irq(unsigned int mask)
{
	ath_reg_rmw_clear(ATH_MISC_INT_MASK, mask);
}

unsigned int ath_misc_get_irq_mask(void)
{
	return ath_reg_rd(ATH_MISC_INT_MASK);
}
unsigned int ath_misc_get_irq_status(void)
{
	return ath_reg_rd(ATH_MISC_INT_STATUS);
}

EXPORT_SYMBOL(ath_misc_enable_irq);
EXPORT_SYMBOL(ath_misc_disable_irq);
EXPORT_SYMBOL(ath_misc_get_irq_mask);
EXPORT_SYMBOL(ath_misc_get_irq_status);

/*
 * Reset function
 */
void ath_reset(unsigned int mask)
{
	ath_reg_rmw_set(ATH_RESET, mask);
	udelay(100);
	ath_reg_rmw_clear(ATH_RESET, mask);
}

EXPORT_SYMBOL(ath_reset);

/*
 * DMA Functions for SLIC/STEREO Blocks
 */
void ath_dma_addr_wr(int chan, unsigned int val)
{
	ath_reg_wr(ATH_DMA_BASE + 0 + chan * 12, val);
}
void ath_dma_config_wr(int chan, unsigned int val)
{
	ath_reg_wr(ATH_DMA_BASE + 4 + chan * 12, val);
}
void ath_dma_update_wr(int chan, unsigned int val)
{
	ath_reg_wr(ATH_DMA_BASE + 8 + chan * 12, val);
}

unsigned int ath_dma_addr_rd(int chan)
{
	return ath_reg_rd(ATH_DMA_BASE + 0 + chan * 12);
}
unsigned int ath_dma_config_rd(int chan)
{
	return ath_reg_rd(ATH_DMA_BASE + 4 + chan * 12);
}

void ath_dma_config_buffer(int chan, void *buffer, int sizeCfg)
{
	unsigned int addr = KSEG1ADDR(buffer);
	ath_dma_addr_wr(chan, (unsigned int)addr);
	ath_dma_config_wr(chan, ((sizeCfg & 0x7) << 4) | 0x100);
}

EXPORT_SYMBOL(ath_dma_addr_wr);
EXPORT_SYMBOL(ath_dma_config_wr);
EXPORT_SYMBOL(ath_dma_update_wr);
EXPORT_SYMBOL(ath_dma_addr_rd);
EXPORT_SYMBOL(ath_dma_config_rd);
EXPORT_SYMBOL(ath_dma_config_buffer);

/*
 * SLIC
 */
#ifdef ATH_SLIC_CNTRL
unsigned int ath_slic_cntrl_rd(void)
{
	return ath_reg_rd(ATH_SLIC_CNTRL);
}
void ath_slic_cntrl_wr(unsigned int val)
{
	ath_reg_wr(ATH_SLIC_CNTRL, val);
}
unsigned int ath_slic_status_rd(void)
{
	return ath_reg_rd(ATH_SLIC_STATUS);
}
void ath_slic_0_slot_pos_wr(unsigned int val)
{
	ath_reg_wr(ATH_SLIC_SLOT0_NUM, val);
}
void ath_slic_1_slot_pos_wr(unsigned int val)
{
	ath_reg_wr(ATH_SLIC_SLOT1_NUM, val);
}
void ath_slic_freq_div_wr(unsigned int val)
{
	ath_reg_wr(ATH_SLIC_FREQ_DIV, val);
}
void ath_slic_sample_pos_wr(unsigned int val)
{
	ath_reg_wr(ATH_SLIC_SAM_POS, val);
}

void ath_slic_setup(int _sam, int _s0n, int _s1n)
{
	unsigned int cntrl = 0;
	ath_reset(ATH_RESET_SLIC);
	ath_gpio_enable_slic();
	ath_slic_freq_div_wr(0x60);
	ath_slic_sample_pos_wr(_sam);
	if (_s0n) {
		cntrl |= ATH_SLIC_CNTRL_ENABLE;
		cntrl |= ATH_SLIC_CNTRL_SLOT0_ENABLE;
		ath_slic_0_slot_pos_wr(_s0n);
	}
	if (_s1n) {
		cntrl |= ATH_SLIC_CNTRL_ENABLE;
		cntrl |= ATH_SLIC_CNTRL_SLOT1_ENABLE;
		ath_slic_1_slot_pos_wr(_s1n);
	}
	if (cntrl)
		ath_slic_cntrl_wr(cntrl);
}

EXPORT_SYMBOL(ath_slic_0_slot_pos_wr);
EXPORT_SYMBOL(ath_slic_1_slot_pos_wr);
EXPORT_SYMBOL(ath_slic_freq_div_wr);
EXPORT_SYMBOL(ath_slic_sample_pos_wr);
EXPORT_SYMBOL(ath_slic_status_rd);
EXPORT_SYMBOL(ath_slic_setup);
#endif /* ATH_SLIC_CNTRL */

EXPORT_SYMBOL(ath_slic_cntrl_rd);
EXPORT_SYMBOL(ath_slic_cntrl_wr);

/*
 * STEREO Block Helper Functions
 */

/* Low-level registers */
void ath_stereo_config_wr(unsigned int val)
{
	ath_reg_wr(ATH_STEREO_CONFIG, val);
}
void ath_stereo_volume_wr(unsigned int val)
{
	ath_reg_wr(ATH_STEREO_VOLUME, val);
}

unsigned int ath_stereo_config_rd(void)
{
	return ath_reg_rd(ATH_STEREO_CONFIG);
}
unsigned int ath_stereo_volume_rd(void)
{
	return ath_reg_rd(ATH_STEREO_VOLUME);
}

/* Routine sets up STEREO block for use. Use one of the predefined
 * configurations. Example:
 *
 * ath_stereo_config_setup(
 *   ATH_STEREO_CFG_MASTER_STEREO_FS32_48KHZ(ATH_STEREO_WS_16B))
 *
 */
void ath_stereo_config_setup(unsigned int cfg)
{
	unsigned int reset;
	ath_gpio_enable_stereo();
	ath_stereo_config_wr(cfg & ~ATH_STEREO_CONFIG_ENABLE);
	do {
		reset = ath_stereo_config_rd();
	} while (reset & ATH_STEREO_CONFIG_RESET);

	do {
		reset = ath_reg_rd(ATH_GPIO_IN);
	} while (0 == (reset & 1 << 7));

	do {
		reset = ath_reg_rd(ATH_GPIO_IN);
	} while (reset & 1 << 7);

	ath_stereo_config_wr(cfg | ATH_STEREO_CONFIG_ENABLE);
}

/*
 * GPIO Access
 */
DECLARE_MUTEX(ath_gpio_sem);

void ath_gpio_init(void)
{
	init_MUTEX(&ath_gpio_sem);
}

void ath_gpio_down(void)
{
	down(&ath_gpio_sem);
}

void ath_gpio_up(void)
{
	up(&ath_gpio_sem);
}

EXPORT_SYMBOL(ath_gpio_init);
EXPORT_SYMBOL(ath_gpio_down);
EXPORT_SYMBOL(ath_gpio_up);

/*
 * GPIO Function Enables
 */

/* enable SLIC block, takes away GPIO 5, 4, 3, and 2 */
void ath_gpio_enable_slic(void)
{
	ath_reg_rmw_set(ATH_GPIO_FUNCTIONS, ATH_GPIO_FUNCTION_SLIC_EN);
}

/* enable UART block, takes away GPIO 10 and 9 */
void ath_gpio_enable_uart(void)
{
	ath_reg_rmw_set(ATH_GPIO_FUNCTIONS, ATH_GPIO_FUNCTION_UART_EN);
	ath_reg_rmw_clear(ATH_GPIO_OE, 1 << 9);
	ath_reg_rmw_set(ATH_GPIO_OE, 1 << 10);
}

/* enable STEREO block, takes away GPIO 11,8,7, and 6 */
void ath_gpio_enable_stereo(void)
{
	ath_reg_rmw_clear(ATH_GPIO_INT_ENABLE, 1 << 11);
	ath_reg_rmw_clear(ATH_GPIO_OE, 1 << 11);
	ath_reg_rmw_set(ATH_GPIO_FUNCTIONS,
			   ATH_GPIO_FUNCTION_STEREO_EN);
}

/* allow CS0/CS1 to be controlled via SPI register, takes away GPIO0/GPIO1 */
void ath_gpio_enable_spi_cs1_cs0(void)
{
	ath_reg_rmw_set(ATH_GPIO_FUNCTIONS,
			   ATH_GPIO_FUNCTION_SPI_CS_0_EN |
			   ATH_GPIO_FUNCTION_SPI_CS_1_EN);
	ath_reg_rmw_clear(ATH_GPIO_INT_ENABLE, 3);
	ath_reg_rmw_set(ATH_GPIO_OE, 3);
}

/* allow GPIO0/GPIO1 to be used as SCL/SDA for software based i2c */
void ath_gpio_enable_i2c_on_gpio_0_1(void)
{
	ath_reg_rmw_clear(ATH_GPIO_FUNCTIONS,
			     ATH_GPIO_FUNCTION_SPI_CS_0_EN |
			     ATH_GPIO_FUNCTION_SPI_CS_1_EN);
	ath_reg_rmw_clear(ATH_GPIO_INT_ENABLE, 3);
	ath_reg_rmw_clear(ATH_GPIO_OE, 3);
}

EXPORT_SYMBOL(ath_gpio_enable_slic);
EXPORT_SYMBOL(ath_gpio_enable_uart);
EXPORT_SYMBOL(ath_gpio_enable_stereo);
EXPORT_SYMBOL(ath_gpio_enable_spi_cs1_cs0);
EXPORT_SYMBOL(ath_gpio_enable_i2c_on_gpio_0_1);

/*
 * GPIO General Functions
 */

/* drive bits in mask low */
void ath_gpio_drive_low(unsigned int mask)
{
	ath_reg_wr_nf(ATH_GPIO_CLEAR, mask);
	ath_reg_rmw_clear(ATH_GPIO_OE, mask);
}

/* drive bits in mask high */
void ath_gpio_drive_high(unsigned int mask)
{
	ath_reg_wr_nf(ATH_GPIO_SET, mask);
	ath_reg_rmw_clear(ATH_GPIO_OE, mask);
}

/* Allow bits in mask to float to their quiescent state and test results */
unsigned int ath_gpio_float_high_test(unsigned int mask)
{
	volatile unsigned int d;
	ath_reg_rmw_clear(ATH_GPIO_OE, mask);
	d = ath_reg_rd(ATH_GPIO_IN);
	d = ath_reg_rd(ATH_GPIO_IN) & mask;
	return d != mask;
}

EXPORT_SYMBOL(ath_gpio_drive_low);
EXPORT_SYMBOL(ath_gpio_drive_high);
EXPORT_SYMBOL(ath_gpio_float_high_test);

#ifdef USE_TEST_CODE

void ath_gpio_test_toggle(unsigned int mask)
{
	do {
		ath_gpio_drive_low(mask);
		udelay(10);
		ath_gpio_drive_high(mask);
		udelay(10);
	} while (0 == test_ui_char_present());
}

void ath_gpio_test_toggle_pull_high(unsigned int mask)
{
	do {
		ath_gpio_drive_low(mask);
		udelay(10);
		ath_gpio_float_high_test(mask);
		udelay(10);
	} while (0 == test_ui_char_present());
}

EXPORT_SYMBOL(ath_gpio_test_toggle)
    EXPORT_SYMBOL(ath_gpio_test_toggle_pull_high)
#endif
/*
 * Software support of i2c on gpio 0/1
 */
#define ATH_I2C_SCL  (1<<0)
#define ATH_I2C_SDA  (1<<1)
#define ATH_I2C_PAUSE 2
static int ath_i2c_errcnt = 0;

static void ath_i2c_errclr(void)
{
	ath_i2c_errcnt = 0;
}

static void ath_i2c_check_rc(unsigned int rc)
{
	if (rc)
		ath_i2c_errcnt++;
}

static int ath_i2c_errget(void)
{
	return ath_i2c_errcnt;
}

static void ath_i2c_chigh_dhigh(void)
{
	ath_i2c_check_rc(ath_gpio_float_high_test
			    (ATH_I2C_SCL | ATH_I2C_SDA));
	udelay(ATH_I2C_PAUSE);
}

static void ath_i2c_chigh_dlow(void)
{
	ath_i2c_check_rc(ath_gpio_float_high_test(ATH_I2C_SCL));
	ath_gpio_drive_low(ATH_I2C_SDA);
	udelay(ATH_I2C_PAUSE);
}

static void ath_i2c_clow_dlow(void)
{
	ath_gpio_drive_low(ATH_I2C_SCL | ATH_I2C_SDA);
	udelay(ATH_I2C_PAUSE);
}

static void ath_i2c_clow_dhigh(void)
{
	ath_gpio_drive_low(ATH_I2C_SCL);
	ath_i2c_check_rc(ath_gpio_float_high_test(ATH_I2C_SDA));
	udelay(ATH_I2C_PAUSE);
}

static void ath_i2c_clow_dfloat(void)
{
	ath_gpio_drive_low(ATH_I2C_SCL);
	ath_reg_rmw_clear(ATH_GPIO_OE, ATH_I2C_SDA);
	udelay(ATH_I2C_PAUSE);
}

static void ath_i2c_chigh_dfloat(void)
{
	ath_gpio_drive_high(ATH_I2C_SCL);
	ath_reg_rmw_clear(ATH_GPIO_OE, ATH_I2C_SDA);
	udelay(ATH_I2C_PAUSE);
}

static int ath_i2c_chigh_dread(void)
{
	int d;

	ath_gpio_float_high_test(ATH_I2C_SCL);
	ath_reg_rmw_clear(ATH_GPIO_OE, ATH_I2C_SDA);
	udelay(ATH_I2C_PAUSE / 2);

	d = (ath_reg_rd(ATH_GPIO_IN) & ATH_I2C_SDA) ? 1 : 0;
	udelay(ATH_I2C_PAUSE / 2);

	return d;
}

static void ath_i2c_start(void)
{
	ath_i2c_chigh_dhigh();
	ath_i2c_chigh_dlow();
	ath_i2c_clow_dlow();
}

static void ath_i2c_stop(void)
{
	ath_i2c_clow_dlow();
	ath_i2c_chigh_dlow();
	ath_i2c_chigh_dhigh();
}

static int ath_i2c_raw_write_8(unsigned char v)
{
	int ack;
	int ii = 7;
	do {
		if ((1 << ii) & v) {
			ath_i2c_clow_dhigh();
			ath_i2c_chigh_dhigh();
		} else {
			ath_i2c_clow_dlow();
			ath_i2c_chigh_dlow();
		}
	} while (ii--);

	ath_i2c_clow_dfloat();
	ack = ath_i2c_chigh_dread();
	ath_i2c_clow_dfloat();

	return ack;
}

static void ath_i2c_raw_read_8(char lastByte, unsigned char *v)
{
	int d;
	int ii = 7;
	int jj = 0;
	do {
		ath_i2c_clow_dfloat();
		d = ath_i2c_chigh_dread();
		if (d)
			jj |= 1 << ii;
	} while (ii--);

	if (lastByte) {
		ath_i2c_clow_dfloat();
		ath_i2c_chigh_dfloat();
	} else {
		ath_i2c_clow_dlow();
		ath_i2c_chigh_dlow();
	}
	*v = jj & 0xff;
}

int
ath_i2c_raw_write_bytes_to_addr(int addr, unsigned char *buffer, int count)
{
	volatile int ack;
	int ii;
	ath_i2c_errclr();
	ath_i2c_start();
	ack = ath_i2c_raw_write_8(addr & 0xfe);
	if (ack)
		return 1;

	for (ii = 0; ii < count; ii++) {
		ack = ath_i2c_raw_write_8(buffer[ii]);
	}
	ath_i2c_stop();
	return ath_i2c_errget();
}

int
ath_i2c_raw_read_bytes_from_addr(int addr, unsigned char *buffer, int count)
{
	int ack;
	int ii;
	ath_i2c_errclr();
	ath_i2c_start();
	ack = ath_i2c_raw_write_8((addr & 0xff) | 0x01);
	for (ii = 0; ii < count; ii++)
		ath_i2c_raw_read_8(ii == (count - 1), &buffer[ii]);
	ath_i2c_stop();
	return ath_i2c_errget();
}

EXPORT_SYMBOL(ath_i2c_raw_write_bytes_to_addr);
EXPORT_SYMBOL(ath_i2c_raw_read_bytes_from_addr);

#ifdef USE_TEST_CODE

void ath_i2c_test_write_bits(void)
{
	printk("Writing bit stream of AA00\n");
	ath_i2c_errclr();
	do {
		ath_i2c_start();
		ath_i2c_raw_write_8(0xAA);
		ath_i2c_raw_write_8(0x00);
		ath_i2c_stop();
		udelay(1000);
	} while (0 == test_ui_char_present());
}

void ath_i2c_test_addr_strapping(void)
{
	int jj;

	int end = 0x7e;
	int addr = 0x20;

	jj = 0;
	printk("Looping through addresses %02x .. %02x\n", addr, end);
	while (addr < end) {
		volatile int ack;
		ath_i2c_start();
		ack = ath_i2c_raw_write_8(addr & 0xfe);
		ath_i2c_stop();
		if (0 == ack) {
			jj++;
			printk(" Found addr:  %02x\n", addr);
		}
		addr += 2;
	};

	if (0 == jj)
		printk(" Failed test, no i2c found\n");
}

EXPORT_SYMBOL(ath_i2c_test_write_bits);
EXPORT_SYMBOL(ath_i2c_test_addr_strapping);

#endif

/*
 * SPI Access Functions
 */

DECLARE_MUTEX(ath_spi_sem);

void ath_spi_init(void)
{
	init_MUTEX(&ath_spi_sem);
#if !(defined(CONFIG_MACH_AR934x) || defined(CONFIG_MACH_QCA955x) || \
	defined(CONFIG_MACH_QCA953x) || defined(CONFIG_MACH_QCA956x))
	ath_reg_wr_nf(ATH_SPI_CLOCK, 0x43);
#endif
}

void ath_spi_down(void)
{
	down(&ath_spi_sem);
}

void ath_spi_up(void)
{
	up(&ath_spi_sem);
}

EXPORT_SYMBOL(ath_spi_init);
EXPORT_SYMBOL(ath_spi_down);
EXPORT_SYMBOL(ath_spi_up);

void ath_spi_raw_output_u8(unsigned char val) __attribute__ ((weak));

void ath_spi_raw_output_u8(unsigned char val)
{
	unsigned int reg = 0, i, j;
	unsigned int dac_data = 0;

	// Start Write transaction
	reg = val;
	for (j = 0; j < 5; j++);

	for (i = 0; i < 8; i++)	// TRANSMIT DATA
	{
		dac_data = 0x50000;
		if ((reg >> (7 - i) & 0x1) == 0x1) {
			dac_data = dac_data | 0x1;
		} else {
			dac_data = dac_data & 0xfffffffe;
		}
		ath_reg_wr(0xbf000008, dac_data);
		for (j = 0; j < 5; j++);
		dac_data = dac_data | 0x50100;	//RISING_CLK
		ath_reg_wr(0xbf000008, dac_data);
		for (j = 0; j < 15; j++);
	}
}

void ath_spi_raw_output_u32(unsigned int val)
{
	int ii;
	unsigned int cs;
	cs = ath_reg_rd(ATH_SPI_WRITE) & ~(ATH_SPI_D0_HIGH |
						 ATH_SPI_CLK_HIGH);
	for (ii = 31; ii >= 0; ii--) {
		unsigned char jj = (val >> ii) & 1;
		ath_reg_wr_nf(ATH_SPI_WRITE, cs | jj);
		ath_reg_wr_nf(ATH_SPI_WRITE,
				 cs | jj | ATH_SPI_CLK_HIGH);
	}
}

unsigned int ath_spi_raw_input_u8(void) __attribute__ ((weak));

unsigned int ath_spi_raw_input_u8(void)
{
	int ii;
	unsigned int cs;

	cs = ath_reg_rd(ATH_SPI_WRITE) & ~(ATH_SPI_D0_HIGH |
						 ATH_SPI_CLK_HIGH);

	for (ii = 7; ii >= 0; ii--) {
		ath_reg_wr_nf(ATH_SPI_WRITE, cs);
		ath_reg_wr_nf(ATH_SPI_WRITE, cs | ATH_SPI_CLK_HIGH);
	}

	return ath_reg_rd(ATH_SPI_RD_STATUS) & 0xff;
}

unsigned int ath_spi_raw_input_u32(void)
{
	int ii;
	unsigned int cs;

	cs = ath_reg_rd(ATH_SPI_WRITE) & ~(ATH_SPI_D0_HIGH |
						 ATH_SPI_CLK_HIGH);

	for (ii = 31; ii >= 0; ii--) {
		ath_reg_wr_nf(ATH_SPI_WRITE, cs);
		ath_reg_wr_nf(ATH_SPI_WRITE, cs | ATH_SPI_CLK_HIGH);
	}

	return ath_reg_rd(ATH_SPI_RD_STATUS);
}

EXPORT_SYMBOL(ath_spi_raw_output_u8);
EXPORT_SYMBOL(ath_spi_raw_output_u32);
EXPORT_SYMBOL(ath_spi_raw_input_u8);
EXPORT_SYMBOL(ath_spi_raw_input_u32);

#define ATH_SPI_CMD_WREN         0x06
#define ATH_SPI_CMD_RD_STATUS    0x05
#define ATH_SPI_CMD_FAST_READ    0x0b
#define ATH_SPI_CMD_PAGE_PROG    0x02
#define ATH_SPI_CMD_SECTOR_ERASE 0xd8

static void ath_spi_wait_done(void)
{
	int rd;

	do {
		ath_reg_wr_nf(ATH_SPI_WRITE, ATH_SPI_CS_DIS);
		ath_spi_raw_output_u8(ATH_SPI_CMD_RD_STATUS);
		ath_spi_raw_output_u8(0);
		rd = (ath_reg_rd(ATH_SPI_RD_STATUS) & 1);
	} while (rd);
}

static void ath_spi_send_addr(unsigned int addr)
{
	ath_spi_raw_output_u8(((addr & 0xff0000) >> 16));
	ath_spi_raw_output_u8(((addr & 0x00ff00) >> 8));
	ath_spi_raw_output_u8(addr & 0x0000ff);
}

void ath_spi_flash_read_page(unsigned int addr, unsigned char *data, int len)
{
	printk("### %s not implemented \n", __FUNCTION__);
}

void
ath_spi_flash_write_page(unsigned int addr, unsigned char *data, int len)
{
	int i;
	uint8_t ch;

	ath_spi_raw_output_u8(ATH_SPI_CMD_WREN);
	ath_spi_raw_output_u8(ATH_SPI_CMD_PAGE_PROG);
	ath_spi_send_addr(addr);

	for (i = 0; i < len; i++) {
		ch = *(data + i);
		ath_spi_raw_output_u8(ch);
	}
	ath_reg_wr_nf(ATH_SPI_WRITE, ATH_SPI_CS_DIS);
	ath_spi_wait_done();
}

void ath_spi_flash_sector_erase(unsigned int addr)
{
	ath_spi_raw_output_u8(ATH_SPI_CMD_WREN);
	ath_spi_raw_output_u8(ATH_SPI_CMD_SECTOR_ERASE);
	ath_spi_send_addr(addr);
	ath_reg_wr_nf(ATH_SPI_WRITE, ATH_SPI_CS_DIS);
	ath_spi_wait_done();
}

static int __init _ath_spi_init(void)
{
  ath_spi_init();
  printk(KERN_NOTICE "ath_spi module initialized\n");
  return 0;
}

subsys_initcall(_ath_spi_init);
EXPORT_SYMBOL(ath_spi_flash_read_page);
EXPORT_SYMBOL(ath_spi_flash_write_page);
EXPORT_SYMBOL(ath_spi_flash_sector_erase);
