io.h 5.4 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
/*
 * This file is part of wl1271
 *
 * Copyright (C) 1998-2009 Texas Instruments. All rights reserved.
 * Copyright (C) 2008-2010 Nokia Corporation
 *
 * Contact: Luciano Coelho <luciano.coelho@nokia.com>
 *
 * 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.
 *
 * 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., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA
 *
 */

S
Shahar Levi 已提交
25 26
#ifndef __IO_H__
#define __IO_H__
27

S
Shahar Levi 已提交
28
#include "reg.h"
29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44

#define HW_ACCESS_MEMORY_MAX_RANGE	0x1FFC0

#define HW_PARTITION_REGISTERS_ADDR     0x1FFC0
#define HW_PART0_SIZE_ADDR              (HW_PARTITION_REGISTERS_ADDR)
#define HW_PART0_START_ADDR             (HW_PARTITION_REGISTERS_ADDR + 4)
#define HW_PART1_SIZE_ADDR              (HW_PARTITION_REGISTERS_ADDR + 8)
#define HW_PART1_START_ADDR             (HW_PARTITION_REGISTERS_ADDR + 12)
#define HW_PART2_SIZE_ADDR              (HW_PARTITION_REGISTERS_ADDR + 16)
#define HW_PART2_START_ADDR             (HW_PARTITION_REGISTERS_ADDR + 20)
#define HW_PART3_START_ADDR             (HW_PARTITION_REGISTERS_ADDR + 24)

#define HW_ACCESS_REGISTER_SIZE         4

#define HW_ACCESS_PRAM_MAX_RANGE	0x3c000

45 46
struct wl1271;

47 48 49
void wl1271_disable_interrupts(struct wl1271 *wl);
void wl1271_enable_interrupts(struct wl1271 *wl);

50 51
void wl1271_io_reset(struct wl1271 *wl);
void wl1271_io_init(struct wl1271 *wl);
52

T
Teemu Paasikivi 已提交
53 54 55 56
static inline struct device *wl1271_wl_to_dev(struct wl1271 *wl)
{
	return wl->if_ops->dev(wl);
}
57

T
Teemu Paasikivi 已提交
58

T
Teemu Paasikivi 已提交
59 60 61 62 63 64
/* Raw target IO, address is not translated */
static inline void wl1271_raw_write(struct wl1271 *wl, int addr, void *buf,
				    size_t len, bool fixed)
{
	wl->if_ops->write(wl, addr, buf, len, fixed);
}
T
Teemu Paasikivi 已提交
65

T
Teemu Paasikivi 已提交
66 67 68 69 70
static inline void wl1271_raw_read(struct wl1271 *wl, int addr, void *buf,
				   size_t len, bool fixed)
{
	wl->if_ops->read(wl, addr, buf, len, fixed);
}
T
Teemu Paasikivi 已提交
71 72 73 74 75 76

static inline u32 wl1271_raw_read32(struct wl1271 *wl, int addr)
{
	wl1271_raw_read(wl, addr, &wl->buffer_32,
			    sizeof(wl->buffer_32), false);

77
	return le32_to_cpu(wl->buffer_32);
T
Teemu Paasikivi 已提交
78 79 80 81
}

static inline void wl1271_raw_write32(struct wl1271 *wl, int addr, u32 val)
{
82
	wl->buffer_32 = cpu_to_le32(val);
T
Teemu Paasikivi 已提交
83 84 85
	wl1271_raw_write(wl, addr, &wl->buffer_32,
			     sizeof(wl->buffer_32), false);
}
86

T
Teemu Paasikivi 已提交
87 88 89 90 91 92 93 94 95 96
/* Translated target IO */
static inline int wl1271_translate_addr(struct wl1271 *wl, int addr)
{
	/*
	 * To translate, first check to which window of addresses the
	 * particular address belongs. Then subtract the starting address
	 * of that window from the address. Then, add offset of the
	 * translated region.
	 *
	 * The translated regions occur next to each other in physical device
L
Lucas De Marchi 已提交
97
	 * memory, so just add the sizes of the preceding address regions to
T
Teemu Paasikivi 已提交
98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
	 * get the offset to the new region.
	 *
	 * Currently, only the two first regions are addressed, and the
	 * assumption is that all addresses will fall into either of those
	 * two.
	 */
	if ((addr >= wl->part.reg.start) &&
	    (addr < wl->part.reg.start + wl->part.reg.size))
		return addr - wl->part.reg.start + wl->part.mem.size;
	else
		return addr - wl->part.mem.start;
}

static inline void wl1271_read(struct wl1271 *wl, int addr, void *buf,
			       size_t len, bool fixed)
{
	int physical;

	physical = wl1271_translate_addr(wl, addr);

	wl1271_raw_read(wl, physical, buf, len, fixed);
}

static inline void wl1271_write(struct wl1271 *wl, int addr, void *buf,
				size_t len, bool fixed)
{
	int physical;

	physical = wl1271_translate_addr(wl, addr);

	wl1271_raw_write(wl, physical, buf, len, fixed);
}

131 132 133 134 135 136 137 138 139 140 141 142 143 144
static inline void wl1271_read_hwaddr(struct wl1271 *wl, int hwaddr,
				      void *buf, size_t len, bool fixed)
{
	int physical;
	int addr;

	/* Addresses are stored internally as addresses to 32 bytes blocks */
	addr = hwaddr << 5;

	physical = wl1271_translate_addr(wl, addr);

	wl1271_raw_read(wl, physical, buf, len, fixed);
}

T
Teemu Paasikivi 已提交
145 146 147 148 149 150 151 152 153 154
static inline u32 wl1271_read32(struct wl1271 *wl, int addr)
{
	return wl1271_raw_read32(wl, wl1271_translate_addr(wl, addr));
}

static inline void wl1271_write32(struct wl1271 *wl, int addr, u32 val)
{
	wl1271_raw_write32(wl, wl1271_translate_addr(wl, addr), val);
}

155 156 157 158 159 160
static inline void wl1271_power_off(struct wl1271 *wl)
{
	wl->if_ops->power(wl, false);
	clear_bit(WL1271_FLAG_GPIO_POWER, &wl->flags);
}

161
static inline int wl1271_power_on(struct wl1271 *wl)
162
{
163 164 165 166 167
	int ret = wl->if_ops->power(wl, true);
	if (ret == 0)
		set_bit(WL1271_FLAG_GPIO_POWER, &wl->flags);

	return ret;
168 169
}

T
Teemu Paasikivi 已提交
170 171 172 173 174 175 176 177

/* Top Register IO */
void wl1271_top_reg_write(struct wl1271 *wl, int addr, u16 val);
u16 wl1271_top_reg_read(struct wl1271 *wl, int addr);

int wl1271_set_partition(struct wl1271 *wl,
			 struct wl1271_partition_set *p);

178 179 180
/* Functions from wl1271_main.c */

int wl1271_register_hw(struct wl1271 *wl);
181
void wl1271_unregister_hw(struct wl1271 *wl);
182 183 184
int wl1271_init_ieee80211(struct wl1271 *wl);
struct ieee80211_hw *wl1271_alloc_hw(void);
int wl1271_free_hw(struct wl1271 *wl);
185
irqreturn_t wl1271_irq(int irq, void *data);
186
bool wl1271_set_block_size(struct wl1271 *wl);
187
int wl1271_tx_dummy_packet(struct wl1271 *wl);
O
Ohad Ben-Cohen 已提交
188
void wl1271_configure_filters(struct wl1271 *wl, unsigned int filters);
189

190
#endif