io.h revision 645865fc377c9ac73df590abf8e6af65824390a3
1/*
2 * This file is part of wl1271
3 *
4 * Copyright (C) 1998-2009 Texas Instruments. All rights reserved.
5 * Copyright (C) 2008-2010 Nokia Corporation
6 *
7 * Contact: Luciano Coelho <luciano.coelho@nokia.com>
8 *
9 * This program is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU General Public License
11 * version 2 as published by the Free Software Foundation.
12 *
13 * This program is distributed in the hope that it will be useful, but
14 * WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16 * General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
21 * 02110-1301 USA
22 *
23 */
24
25#ifndef __IO_H__
26#define __IO_H__
27
28#include <linux/irqreturn.h>
29
30#define HW_ACCESS_MEMORY_MAX_RANGE	0x1FFC0
31
32#define HW_PARTITION_REGISTERS_ADDR     0x1FFC0
33#define HW_PART0_SIZE_ADDR              (HW_PARTITION_REGISTERS_ADDR)
34#define HW_PART0_START_ADDR             (HW_PARTITION_REGISTERS_ADDR + 4)
35#define HW_PART1_SIZE_ADDR              (HW_PARTITION_REGISTERS_ADDR + 8)
36#define HW_PART1_START_ADDR             (HW_PARTITION_REGISTERS_ADDR + 12)
37#define HW_PART2_SIZE_ADDR              (HW_PARTITION_REGISTERS_ADDR + 16)
38#define HW_PART2_START_ADDR             (HW_PARTITION_REGISTERS_ADDR + 20)
39#define HW_PART3_START_ADDR             (HW_PARTITION_REGISTERS_ADDR + 24)
40
41#define HW_ACCESS_REGISTER_SIZE         4
42
43#define HW_ACCESS_PRAM_MAX_RANGE	0x3c000
44
45struct wl1271;
46
47void wlcore_disable_interrupts(struct wl1271 *wl);
48void wlcore_enable_interrupts(struct wl1271 *wl);
49
50void wl1271_io_reset(struct wl1271 *wl);
51void wl1271_io_init(struct wl1271 *wl);
52int wlcore_translate_addr(struct wl1271 *wl, int addr);
53
54/* Raw target IO, address is not translated */
55static inline void wl1271_raw_write(struct wl1271 *wl, int addr, void *buf,
56				    size_t len, bool fixed)
57{
58	wl->if_ops->write(wl->dev, addr, buf, len, fixed);
59}
60
61static inline void wl1271_raw_read(struct wl1271 *wl, int addr, void *buf,
62				   size_t len, bool fixed)
63{
64	wl->if_ops->read(wl->dev, addr, buf, len, fixed);
65}
66
67static inline void wlcore_raw_read_data(struct wl1271 *wl, int reg, void *buf,
68					size_t len, bool fixed)
69{
70	wl1271_raw_read(wl, wl->rtable[reg], buf, len, fixed);
71}
72
73static inline void wlcore_raw_write_data(struct wl1271 *wl, int reg, void *buf,
74					 size_t len, bool fixed)
75{
76	wl1271_raw_write(wl, wl->rtable[reg], buf, len, fixed);
77}
78
79static inline u32 wl1271_raw_read32(struct wl1271 *wl, int addr)
80{
81	wl1271_raw_read(wl, addr, &wl->buffer_32,
82			    sizeof(wl->buffer_32), false);
83
84	return le32_to_cpu(wl->buffer_32);
85}
86
87static inline void wl1271_raw_write32(struct wl1271 *wl, int addr, u32 val)
88{
89	wl->buffer_32 = cpu_to_le32(val);
90	wl1271_raw_write(wl, addr, &wl->buffer_32,
91			     sizeof(wl->buffer_32), false);
92}
93
94static inline void wl1271_read(struct wl1271 *wl, int addr, void *buf,
95			       size_t len, bool fixed)
96{
97	int physical;
98
99	physical = wlcore_translate_addr(wl, addr);
100
101	wl1271_raw_read(wl, physical, buf, len, fixed);
102}
103
104static inline void wl1271_write(struct wl1271 *wl, int addr, void *buf,
105				size_t len, bool fixed)
106{
107	int physical;
108
109	physical = wlcore_translate_addr(wl, addr);
110
111	wl1271_raw_write(wl, physical, buf, len, fixed);
112}
113
114static inline void wlcore_write_data(struct wl1271 *wl, int reg, void *buf,
115				     size_t len, bool fixed)
116{
117	wl1271_write(wl, wl->rtable[reg], buf, len, fixed);
118}
119
120static inline void wlcore_read_data(struct wl1271 *wl, int reg, void *buf,
121				    size_t len, bool fixed)
122{
123	wl1271_read(wl, wl->rtable[reg], buf, len, fixed);
124}
125
126static inline void wl1271_read_hwaddr(struct wl1271 *wl, int hwaddr,
127				      void *buf, size_t len, bool fixed)
128{
129	int physical;
130	int addr;
131
132	/* Addresses are stored internally as addresses to 32 bytes blocks */
133	addr = hwaddr << 5;
134
135	physical = wlcore_translate_addr(wl, addr);
136
137	wl1271_raw_read(wl, physical, buf, len, fixed);
138}
139
140static inline u32 wl1271_read32(struct wl1271 *wl, int addr)
141{
142	return wl1271_raw_read32(wl, wlcore_translate_addr(wl, addr));
143}
144
145static inline void wl1271_write32(struct wl1271 *wl, int addr, u32 val)
146{
147	wl1271_raw_write32(wl, wlcore_translate_addr(wl, addr), val);
148}
149
150static inline u32 wlcore_read_reg(struct wl1271 *wl, int reg)
151{
152	return wl1271_raw_read32(wl,
153				 wlcore_translate_addr(wl, wl->rtable[reg]));
154}
155
156static inline void wlcore_write_reg(struct wl1271 *wl, int reg, u32 val)
157{
158	wl1271_raw_write32(wl, wlcore_translate_addr(wl, wl->rtable[reg]), val);
159}
160
161static inline void wl1271_power_off(struct wl1271 *wl)
162{
163	int ret;
164
165	if (!test_bit(WL1271_FLAG_GPIO_POWER, &wl->flags))
166		return;
167
168	ret = wl->if_ops->power(wl->dev, false);
169	if (!ret)
170		clear_bit(WL1271_FLAG_GPIO_POWER, &wl->flags);
171}
172
173static inline int wl1271_power_on(struct wl1271 *wl)
174{
175	int ret = wl->if_ops->power(wl->dev, true);
176	if (ret == 0)
177		set_bit(WL1271_FLAG_GPIO_POWER, &wl->flags);
178
179	return ret;
180}
181
182void wlcore_set_partition(struct wl1271 *wl,
183			  const struct wlcore_partition_set *p);
184
185bool wl1271_set_block_size(struct wl1271 *wl);
186
187/* Functions from wl1271_main.c */
188
189int wl1271_tx_dummy_packet(struct wl1271 *wl);
190
191void wlcore_select_partition(struct wl1271 *wl, u8 part);
192
193#endif
194