blob: ee93274214d67fa7802d7685c9df10af45b52ba7 [file] [log] [blame]
Johannes Berg02a7fa02011-04-05 09:42:12 -07001/******************************************************************************
2 *
Wey-Yi Guy4e318262011-12-27 11:21:32 -08003 * Copyright(c) 2003 - 2012 Intel Corporation. All rights reserved.
Johannes Berg02a7fa02011-04-05 09:42:12 -07004 *
5 * Portions of this file are derived from the ipw3945 project.
6 *
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of version 2 of the GNU General Public License as
9 * published by the Free Software Foundation.
10 *
11 * This program is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 * more details.
15 *
16 * You should have received a copy of the GNU General Public License along with
17 * this program; if not, write to the Free Software Foundation, Inc.,
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
19 *
20 * The full GNU General Public License is included in this distribution in the
21 * file called LICENSE.
22 *
23 * Contact Information:
24 * Intel Linux Wireless <ilw@linux.intel.com>
25 * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
26 *
27 *****************************************************************************/
Emmanuel Grumbach83ed9012011-08-25 23:11:14 -070028#include <linux/delay.h>
29#include <linux/device.h>
Don Frycc5f7e32012-05-16 22:54:27 +020030#include <linux/export.h>
Johannes Berg02a7fa02011-04-05 09:42:12 -070031
32#include "iwl-io.h"
Emmanuel Grumbach83ed9012011-08-25 23:11:14 -070033#include"iwl-csr.h"
34#include "iwl-debug.h"
Johannes Berg02a7fa02011-04-05 09:42:12 -070035
36#define IWL_POLL_INTERVAL 10 /* microseconds */
37
Emmanuel Grumbach1042db22012-01-03 16:56:15 +020038static inline void __iwl_set_bit(struct iwl_trans *trans, u32 reg, u32 mask)
Johannes Berg02a7fa02011-04-05 09:42:12 -070039{
Emmanuel Grumbach1042db22012-01-03 16:56:15 +020040 iwl_write32(trans, reg, iwl_read32(trans, reg) | mask);
Johannes Berg02a7fa02011-04-05 09:42:12 -070041}
42
Emmanuel Grumbach1042db22012-01-03 16:56:15 +020043static inline void __iwl_clear_bit(struct iwl_trans *trans, u32 reg, u32 mask)
Johannes Berg02a7fa02011-04-05 09:42:12 -070044{
Emmanuel Grumbach1042db22012-01-03 16:56:15 +020045 iwl_write32(trans, reg, iwl_read32(trans, reg) & ~mask);
Johannes Berg02a7fa02011-04-05 09:42:12 -070046}
47
Emmanuel Grumbach1042db22012-01-03 16:56:15 +020048void iwl_set_bit(struct iwl_trans *trans, u32 reg, u32 mask)
Johannes Berg02a7fa02011-04-05 09:42:12 -070049{
50 unsigned long flags;
51
Emmanuel Grumbach1042db22012-01-03 16:56:15 +020052 spin_lock_irqsave(&trans->reg_lock, flags);
53 __iwl_set_bit(trans, reg, mask);
54 spin_unlock_irqrestore(&trans->reg_lock, flags);
Johannes Berg02a7fa02011-04-05 09:42:12 -070055}
Don Frycc5f7e32012-05-16 22:54:27 +020056EXPORT_SYMBOL_GPL(iwl_set_bit);
Johannes Berg02a7fa02011-04-05 09:42:12 -070057
Emmanuel Grumbach1042db22012-01-03 16:56:15 +020058void iwl_clear_bit(struct iwl_trans *trans, u32 reg, u32 mask)
Johannes Berg02a7fa02011-04-05 09:42:12 -070059{
60 unsigned long flags;
61
Emmanuel Grumbach1042db22012-01-03 16:56:15 +020062 spin_lock_irqsave(&trans->reg_lock, flags);
63 __iwl_clear_bit(trans, reg, mask);
64 spin_unlock_irqrestore(&trans->reg_lock, flags);
Johannes Berg02a7fa02011-04-05 09:42:12 -070065}
Don Frycc5f7e32012-05-16 22:54:27 +020066EXPORT_SYMBOL_GPL(iwl_clear_bit);
Johannes Berg02a7fa02011-04-05 09:42:12 -070067
Emmanuel Grumbach1042db22012-01-03 16:56:15 +020068int iwl_poll_bit(struct iwl_trans *trans, u32 addr,
Johannes Berg02a7fa02011-04-05 09:42:12 -070069 u32 bits, u32 mask, int timeout)
70{
71 int t = 0;
72
73 do {
Emmanuel Grumbach1042db22012-01-03 16:56:15 +020074 if ((iwl_read32(trans, addr) & mask) == (bits & mask))
Johannes Berg02a7fa02011-04-05 09:42:12 -070075 return t;
76 udelay(IWL_POLL_INTERVAL);
77 t += IWL_POLL_INTERVAL;
78 } while (t < timeout);
79
80 return -ETIMEDOUT;
81}
Don Frycc5f7e32012-05-16 22:54:27 +020082EXPORT_SYMBOL_GPL(iwl_poll_bit);
Johannes Berg02a7fa02011-04-05 09:42:12 -070083
Emmanuel Grumbach1042db22012-01-03 16:56:15 +020084int iwl_grab_nic_access_silent(struct iwl_trans *trans)
Johannes Berg02a7fa02011-04-05 09:42:12 -070085{
86 int ret;
Johannes Berg02a7fa02011-04-05 09:42:12 -070087
Emmanuel Grumbach1042db22012-01-03 16:56:15 +020088 lockdep_assert_held(&trans->reg_lock);
Johannes Berg02a7fa02011-04-05 09:42:12 -070089
90 /* this bit wakes up the NIC */
Emmanuel Grumbach1042db22012-01-03 16:56:15 +020091 __iwl_set_bit(trans, CSR_GP_CNTRL,
92 CSR_GP_CNTRL_REG_FLAG_MAC_ACCESS_REQ);
Johannes Berg02a7fa02011-04-05 09:42:12 -070093
94 /*
95 * These bits say the device is running, and should keep running for
96 * at least a short while (at least as long as MAC_ACCESS_REQ stays 1),
97 * but they do not indicate that embedded SRAM is restored yet;
98 * 3945 and 4965 have volatile SRAM, and must save/restore contents
99 * to/from host DRAM when sleeping/waking for power-saving.
100 * Each direction takes approximately 1/4 millisecond; with this
101 * overhead, it's a good idea to grab and hold MAC_ACCESS_REQUEST if a
102 * series of register accesses are expected (e.g. reading Event Log),
103 * to keep device from sleeping.
104 *
105 * CSR_UCODE_DRV_GP1 register bit MAC_SLEEP == 0 indicates that
106 * SRAM is okay/restored. We don't check that here because this call
107 * is just for hardware register access; but GP1 MAC_SLEEP check is a
108 * good idea before accessing 3945/4965 SRAM (e.g. reading Event Log).
109 *
110 * 5000 series and later (including 1000 series) have non-volatile SRAM,
111 * and do not save/restore SRAM when power cycling.
112 */
Emmanuel Grumbach1042db22012-01-03 16:56:15 +0200113 ret = iwl_poll_bit(trans, CSR_GP_CNTRL,
Johannes Berg02a7fa02011-04-05 09:42:12 -0700114 CSR_GP_CNTRL_REG_VAL_MAC_ACCESS_EN,
115 (CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY |
116 CSR_GP_CNTRL_REG_FLAG_GOING_TO_SLEEP), 15000);
117 if (ret < 0) {
Emmanuel Grumbach1042db22012-01-03 16:56:15 +0200118 iwl_write32(trans, CSR_RESET, CSR_RESET_REG_FLAG_FORCE_NMI);
Johannes Berg02a7fa02011-04-05 09:42:12 -0700119 return -EIO;
120 }
121
122 return 0;
123}
Don Frycc5f7e32012-05-16 22:54:27 +0200124EXPORT_SYMBOL_GPL(iwl_grab_nic_access_silent);
Johannes Berg02a7fa02011-04-05 09:42:12 -0700125
Stanislaw Gruszkabfe4b802012-03-07 09:52:24 -0800126bool iwl_grab_nic_access(struct iwl_trans *trans)
Johannes Berg41199042011-04-19 07:42:03 -0700127{
Emmanuel Grumbach1042db22012-01-03 16:56:15 +0200128 int ret = iwl_grab_nic_access_silent(trans);
Stanislaw Gruszkaaa5affb2012-03-07 09:52:23 -0800129 if (unlikely(ret)) {
Emmanuel Grumbach1042db22012-01-03 16:56:15 +0200130 u32 val = iwl_read32(trans, CSR_GP_CNTRL);
Stanislaw Gruszkaaa5affb2012-03-07 09:52:23 -0800131 WARN_ONCE(1, "Timeout waiting for hardware access "
132 "(CSR_GP_CNTRL 0x%08x)\n", val);
Stanislaw Gruszkabfe4b802012-03-07 09:52:24 -0800133 return false;
Johannes Berg41199042011-04-19 07:42:03 -0700134 }
135
Stanislaw Gruszkabfe4b802012-03-07 09:52:24 -0800136 return true;
Johannes Berg41199042011-04-19 07:42:03 -0700137}
Don Frycc5f7e32012-05-16 22:54:27 +0200138EXPORT_SYMBOL_GPL(iwl_grab_nic_access);
Johannes Berg41199042011-04-19 07:42:03 -0700139
Emmanuel Grumbach1042db22012-01-03 16:56:15 +0200140void iwl_release_nic_access(struct iwl_trans *trans)
Johannes Berg02a7fa02011-04-05 09:42:12 -0700141{
Emmanuel Grumbach1042db22012-01-03 16:56:15 +0200142 lockdep_assert_held(&trans->reg_lock);
143 __iwl_clear_bit(trans, CSR_GP_CNTRL,
Johannes Berg02a7fa02011-04-05 09:42:12 -0700144 CSR_GP_CNTRL_REG_FLAG_MAC_ACCESS_REQ);
Stanislaw Gruszka3a73a302012-03-07 09:52:25 -0800145 /*
146 * Above we read the CSR_GP_CNTRL register, which will flush
147 * any previous writes, but we need the write that clears the
148 * MAC_ACCESS_REQ bit to be performed before any other writes
149 * scheduled on different CPUs (after we drop reg_lock).
150 */
151 mmiowb();
Johannes Berg02a7fa02011-04-05 09:42:12 -0700152}
Don Frycc5f7e32012-05-16 22:54:27 +0200153EXPORT_SYMBOL_GPL(iwl_release_nic_access);
Johannes Berg02a7fa02011-04-05 09:42:12 -0700154
Emmanuel Grumbach1042db22012-01-03 16:56:15 +0200155u32 iwl_read_direct32(struct iwl_trans *trans, u32 reg)
Johannes Berg02a7fa02011-04-05 09:42:12 -0700156{
157 u32 value;
158 unsigned long flags;
159
Emmanuel Grumbach1042db22012-01-03 16:56:15 +0200160 spin_lock_irqsave(&trans->reg_lock, flags);
161 iwl_grab_nic_access(trans);
162 value = iwl_read32(trans, reg);
163 iwl_release_nic_access(trans);
164 spin_unlock_irqrestore(&trans->reg_lock, flags);
Johannes Berg02a7fa02011-04-05 09:42:12 -0700165
166 return value;
167}
Don Frycc5f7e32012-05-16 22:54:27 +0200168EXPORT_SYMBOL_GPL(iwl_read_direct32);
Johannes Berg02a7fa02011-04-05 09:42:12 -0700169
Emmanuel Grumbach1042db22012-01-03 16:56:15 +0200170void iwl_write_direct32(struct iwl_trans *trans, u32 reg, u32 value)
Johannes Berg02a7fa02011-04-05 09:42:12 -0700171{
172 unsigned long flags;
173
Emmanuel Grumbach1042db22012-01-03 16:56:15 +0200174 spin_lock_irqsave(&trans->reg_lock, flags);
Stanislaw Gruszkabfe4b802012-03-07 09:52:24 -0800175 if (likely(iwl_grab_nic_access(trans))) {
Emmanuel Grumbach1042db22012-01-03 16:56:15 +0200176 iwl_write32(trans, reg, value);
177 iwl_release_nic_access(trans);
Johannes Berg02a7fa02011-04-05 09:42:12 -0700178 }
Emmanuel Grumbach1042db22012-01-03 16:56:15 +0200179 spin_unlock_irqrestore(&trans->reg_lock, flags);
Johannes Berg02a7fa02011-04-05 09:42:12 -0700180}
Don Frycc5f7e32012-05-16 22:54:27 +0200181EXPORT_SYMBOL_GPL(iwl_write_direct32);
Johannes Berg02a7fa02011-04-05 09:42:12 -0700182
Emmanuel Grumbach1042db22012-01-03 16:56:15 +0200183int iwl_poll_direct_bit(struct iwl_trans *trans, u32 addr, u32 mask,
Johannes Berg02a7fa02011-04-05 09:42:12 -0700184 int timeout)
185{
186 int t = 0;
187
188 do {
Emmanuel Grumbach1042db22012-01-03 16:56:15 +0200189 if ((iwl_read_direct32(trans, addr) & mask) == mask)
Johannes Berg02a7fa02011-04-05 09:42:12 -0700190 return t;
191 udelay(IWL_POLL_INTERVAL);
192 t += IWL_POLL_INTERVAL;
193 } while (t < timeout);
194
195 return -ETIMEDOUT;
196}
Don Frycc5f7e32012-05-16 22:54:27 +0200197EXPORT_SYMBOL_GPL(iwl_poll_direct_bit);
Johannes Berg02a7fa02011-04-05 09:42:12 -0700198
Emmanuel Grumbach1042db22012-01-03 16:56:15 +0200199static inline u32 __iwl_read_prph(struct iwl_trans *trans, u32 reg)
Johannes Berg02a7fa02011-04-05 09:42:12 -0700200{
Emmanuel Grumbach1042db22012-01-03 16:56:15 +0200201 iwl_write32(trans, HBUS_TARG_PRPH_RADDR, reg | (3 << 24));
Emmanuel Grumbach1042db22012-01-03 16:56:15 +0200202 return iwl_read32(trans, HBUS_TARG_PRPH_RDAT);
Johannes Berg02a7fa02011-04-05 09:42:12 -0700203}
204
Emmanuel Grumbach1042db22012-01-03 16:56:15 +0200205static inline void __iwl_write_prph(struct iwl_trans *trans, u32 addr, u32 val)
Johannes Berg02a7fa02011-04-05 09:42:12 -0700206{
Emmanuel Grumbach1042db22012-01-03 16:56:15 +0200207 iwl_write32(trans, HBUS_TARG_PRPH_WADDR,
Johannes Berg02a7fa02011-04-05 09:42:12 -0700208 ((addr & 0x0000FFFF) | (3 << 24)));
Emmanuel Grumbach1042db22012-01-03 16:56:15 +0200209 iwl_write32(trans, HBUS_TARG_PRPH_WDAT, val);
Johannes Berg02a7fa02011-04-05 09:42:12 -0700210}
211
Emmanuel Grumbach1042db22012-01-03 16:56:15 +0200212u32 iwl_read_prph(struct iwl_trans *trans, u32 reg)
Johannes Berg02a7fa02011-04-05 09:42:12 -0700213{
214 unsigned long flags;
215 u32 val;
216
Emmanuel Grumbach1042db22012-01-03 16:56:15 +0200217 spin_lock_irqsave(&trans->reg_lock, flags);
218 iwl_grab_nic_access(trans);
219 val = __iwl_read_prph(trans, reg);
220 iwl_release_nic_access(trans);
221 spin_unlock_irqrestore(&trans->reg_lock, flags);
Johannes Berg02a7fa02011-04-05 09:42:12 -0700222 return val;
223}
Don Frycc5f7e32012-05-16 22:54:27 +0200224EXPORT_SYMBOL_GPL(iwl_read_prph);
Johannes Berg02a7fa02011-04-05 09:42:12 -0700225
Emmanuel Grumbach1042db22012-01-03 16:56:15 +0200226void iwl_write_prph(struct iwl_trans *trans, u32 addr, u32 val)
Johannes Berg02a7fa02011-04-05 09:42:12 -0700227{
228 unsigned long flags;
229
Emmanuel Grumbach1042db22012-01-03 16:56:15 +0200230 spin_lock_irqsave(&trans->reg_lock, flags);
Stanislaw Gruszkabfe4b802012-03-07 09:52:24 -0800231 if (likely(iwl_grab_nic_access(trans))) {
Emmanuel Grumbach1042db22012-01-03 16:56:15 +0200232 __iwl_write_prph(trans, addr, val);
233 iwl_release_nic_access(trans);
Johannes Berg02a7fa02011-04-05 09:42:12 -0700234 }
Emmanuel Grumbach1042db22012-01-03 16:56:15 +0200235 spin_unlock_irqrestore(&trans->reg_lock, flags);
Johannes Berg02a7fa02011-04-05 09:42:12 -0700236}
Don Frycc5f7e32012-05-16 22:54:27 +0200237EXPORT_SYMBOL_GPL(iwl_write_prph);
Johannes Berg02a7fa02011-04-05 09:42:12 -0700238
Emmanuel Grumbach1042db22012-01-03 16:56:15 +0200239void iwl_set_bits_prph(struct iwl_trans *trans, u32 reg, u32 mask)
Johannes Berg02a7fa02011-04-05 09:42:12 -0700240{
241 unsigned long flags;
242
Emmanuel Grumbach1042db22012-01-03 16:56:15 +0200243 spin_lock_irqsave(&trans->reg_lock, flags);
Stanislaw Gruszkabfe4b802012-03-07 09:52:24 -0800244 if (likely(iwl_grab_nic_access(trans))) {
245 __iwl_write_prph(trans, reg,
246 __iwl_read_prph(trans, reg) | mask);
247 iwl_release_nic_access(trans);
248 }
Emmanuel Grumbach1042db22012-01-03 16:56:15 +0200249 spin_unlock_irqrestore(&trans->reg_lock, flags);
Johannes Berg02a7fa02011-04-05 09:42:12 -0700250}
Don Frycc5f7e32012-05-16 22:54:27 +0200251EXPORT_SYMBOL_GPL(iwl_set_bits_prph);
Johannes Berg02a7fa02011-04-05 09:42:12 -0700252
Emmanuel Grumbach1042db22012-01-03 16:56:15 +0200253void iwl_set_bits_mask_prph(struct iwl_trans *trans, u32 reg,
Johannes Berg02a7fa02011-04-05 09:42:12 -0700254 u32 bits, u32 mask)
255{
256 unsigned long flags;
257
Emmanuel Grumbach1042db22012-01-03 16:56:15 +0200258 spin_lock_irqsave(&trans->reg_lock, flags);
Stanislaw Gruszkabfe4b802012-03-07 09:52:24 -0800259 if (likely(iwl_grab_nic_access(trans))) {
260 __iwl_write_prph(trans, reg,
261 (__iwl_read_prph(trans, reg) & mask) | bits);
262 iwl_release_nic_access(trans);
263 }
Emmanuel Grumbach1042db22012-01-03 16:56:15 +0200264 spin_unlock_irqrestore(&trans->reg_lock, flags);
Johannes Berg02a7fa02011-04-05 09:42:12 -0700265}
Don Frycc5f7e32012-05-16 22:54:27 +0200266EXPORT_SYMBOL_GPL(iwl_set_bits_mask_prph);
Johannes Berg02a7fa02011-04-05 09:42:12 -0700267
Emmanuel Grumbach1042db22012-01-03 16:56:15 +0200268void iwl_clear_bits_prph(struct iwl_trans *trans, u32 reg, u32 mask)
Johannes Berg02a7fa02011-04-05 09:42:12 -0700269{
270 unsigned long flags;
271 u32 val;
272
Emmanuel Grumbach1042db22012-01-03 16:56:15 +0200273 spin_lock_irqsave(&trans->reg_lock, flags);
Stanislaw Gruszkabfe4b802012-03-07 09:52:24 -0800274 if (likely(iwl_grab_nic_access(trans))) {
275 val = __iwl_read_prph(trans, reg);
276 __iwl_write_prph(trans, reg, (val & ~mask));
277 iwl_release_nic_access(trans);
278 }
Emmanuel Grumbach1042db22012-01-03 16:56:15 +0200279 spin_unlock_irqrestore(&trans->reg_lock, flags);
Johannes Berg02a7fa02011-04-05 09:42:12 -0700280}
Don Frycc5f7e32012-05-16 22:54:27 +0200281EXPORT_SYMBOL_GPL(iwl_clear_bits_prph);
Johannes Berg02a7fa02011-04-05 09:42:12 -0700282
Emmanuel Grumbach1042db22012-01-03 16:56:15 +0200283void _iwl_read_targ_mem_words(struct iwl_trans *trans, u32 addr,
Johannes Berge46f6532011-04-13 03:14:43 -0700284 void *buf, int words)
Johannes Berg02a7fa02011-04-05 09:42:12 -0700285{
286 unsigned long flags;
Johannes Berge46f6532011-04-13 03:14:43 -0700287 int offs;
288 u32 *vals = buf;
Johannes Berg02a7fa02011-04-05 09:42:12 -0700289
Emmanuel Grumbach1042db22012-01-03 16:56:15 +0200290 spin_lock_irqsave(&trans->reg_lock, flags);
Stanislaw Gruszkabfe4b802012-03-07 09:52:24 -0800291 if (likely(iwl_grab_nic_access(trans))) {
292 iwl_write32(trans, HBUS_TARG_MEM_RADDR, addr);
Stanislaw Gruszkabfe4b802012-03-07 09:52:24 -0800293 for (offs = 0; offs < words; offs++)
294 vals[offs] = iwl_read32(trans, HBUS_TARG_MEM_RDAT);
295 iwl_release_nic_access(trans);
296 }
Emmanuel Grumbach1042db22012-01-03 16:56:15 +0200297 spin_unlock_irqrestore(&trans->reg_lock, flags);
Johannes Berge46f6532011-04-13 03:14:43 -0700298}
Don Frycc5f7e32012-05-16 22:54:27 +0200299EXPORT_SYMBOL_GPL(_iwl_read_targ_mem_words);
Johannes Berge46f6532011-04-13 03:14:43 -0700300
Emmanuel Grumbach1042db22012-01-03 16:56:15 +0200301u32 iwl_read_targ_mem(struct iwl_trans *trans, u32 addr)
Johannes Berge46f6532011-04-13 03:14:43 -0700302{
303 u32 value;
304
Emmanuel Grumbach1042db22012-01-03 16:56:15 +0200305 _iwl_read_targ_mem_words(trans, addr, &value, 1);
Johannes Berge46f6532011-04-13 03:14:43 -0700306
Johannes Berg02a7fa02011-04-05 09:42:12 -0700307 return value;
308}
Don Frycc5f7e32012-05-16 22:54:27 +0200309EXPORT_SYMBOL_GPL(iwl_read_targ_mem);
Johannes Berg02a7fa02011-04-05 09:42:12 -0700310
Emmanuel Grumbach1042db22012-01-03 16:56:15 +0200311int _iwl_write_targ_mem_words(struct iwl_trans *trans, u32 addr,
Hsu, Kennyee8ba882011-12-09 03:11:18 -0800312 void *buf, int words)
Johannes Berg02a7fa02011-04-05 09:42:12 -0700313{
314 unsigned long flags;
Hsu, Kennyee8ba882011-12-09 03:11:18 -0800315 int offs, result = 0;
316 u32 *vals = buf;
Johannes Berg02a7fa02011-04-05 09:42:12 -0700317
Emmanuel Grumbach1042db22012-01-03 16:56:15 +0200318 spin_lock_irqsave(&trans->reg_lock, flags);
Stanislaw Gruszkabfe4b802012-03-07 09:52:24 -0800319 if (likely(iwl_grab_nic_access(trans))) {
Emmanuel Grumbach1042db22012-01-03 16:56:15 +0200320 iwl_write32(trans, HBUS_TARG_MEM_WADDR, addr);
Hsu, Kennyee8ba882011-12-09 03:11:18 -0800321 for (offs = 0; offs < words; offs++)
Emmanuel Grumbach1042db22012-01-03 16:56:15 +0200322 iwl_write32(trans, HBUS_TARG_MEM_WDAT, vals[offs]);
323 iwl_release_nic_access(trans);
Hsu, Kennyee8ba882011-12-09 03:11:18 -0800324 } else
325 result = -EBUSY;
Emmanuel Grumbach1042db22012-01-03 16:56:15 +0200326 spin_unlock_irqrestore(&trans->reg_lock, flags);
Hsu, Kennyee8ba882011-12-09 03:11:18 -0800327
328 return result;
329}
Don Frycc5f7e32012-05-16 22:54:27 +0200330EXPORT_SYMBOL_GPL(_iwl_write_targ_mem_words);
Hsu, Kennyee8ba882011-12-09 03:11:18 -0800331
Emmanuel Grumbach1042db22012-01-03 16:56:15 +0200332int iwl_write_targ_mem(struct iwl_trans *trans, u32 addr, u32 val)
Hsu, Kennyee8ba882011-12-09 03:11:18 -0800333{
Emmanuel Grumbach1042db22012-01-03 16:56:15 +0200334 return _iwl_write_targ_mem_words(trans, addr, &val, 1);
Johannes Berg02a7fa02011-04-05 09:42:12 -0700335}
Don Frycc5f7e32012-05-16 22:54:27 +0200336EXPORT_SYMBOL_GPL(iwl_write_targ_mem);