18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * This file is part of wl18xx 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright (C) 2011 Texas Instruments 68c2ecf20Sopenharmony_ci */ 78c2ecf20Sopenharmony_ci 88c2ecf20Sopenharmony_ci#include "../wlcore/wlcore.h" 98c2ecf20Sopenharmony_ci#include "../wlcore/io.h" 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_ci#include "io.h" 128c2ecf20Sopenharmony_ci 138c2ecf20Sopenharmony_ciint wl18xx_top_reg_write(struct wl1271 *wl, int addr, u16 val) 148c2ecf20Sopenharmony_ci{ 158c2ecf20Sopenharmony_ci u32 tmp; 168c2ecf20Sopenharmony_ci int ret; 178c2ecf20Sopenharmony_ci 188c2ecf20Sopenharmony_ci if (WARN_ON(addr % 2)) 198c2ecf20Sopenharmony_ci return -EINVAL; 208c2ecf20Sopenharmony_ci 218c2ecf20Sopenharmony_ci if ((addr % 4) == 0) { 228c2ecf20Sopenharmony_ci ret = wlcore_read32(wl, addr, &tmp); 238c2ecf20Sopenharmony_ci if (ret < 0) 248c2ecf20Sopenharmony_ci goto out; 258c2ecf20Sopenharmony_ci 268c2ecf20Sopenharmony_ci tmp = (tmp & 0xffff0000) | val; 278c2ecf20Sopenharmony_ci ret = wlcore_write32(wl, addr, tmp); 288c2ecf20Sopenharmony_ci } else { 298c2ecf20Sopenharmony_ci ret = wlcore_read32(wl, addr - 2, &tmp); 308c2ecf20Sopenharmony_ci if (ret < 0) 318c2ecf20Sopenharmony_ci goto out; 328c2ecf20Sopenharmony_ci 338c2ecf20Sopenharmony_ci tmp = (tmp & 0xffff) | (val << 16); 348c2ecf20Sopenharmony_ci ret = wlcore_write32(wl, addr - 2, tmp); 358c2ecf20Sopenharmony_ci } 368c2ecf20Sopenharmony_ci 378c2ecf20Sopenharmony_ciout: 388c2ecf20Sopenharmony_ci return ret; 398c2ecf20Sopenharmony_ci} 408c2ecf20Sopenharmony_ci 418c2ecf20Sopenharmony_ciint wl18xx_top_reg_read(struct wl1271 *wl, int addr, u16 *out) 428c2ecf20Sopenharmony_ci{ 438c2ecf20Sopenharmony_ci u32 val = 0; 448c2ecf20Sopenharmony_ci int ret; 458c2ecf20Sopenharmony_ci 468c2ecf20Sopenharmony_ci if (WARN_ON(addr % 2)) 478c2ecf20Sopenharmony_ci return -EINVAL; 488c2ecf20Sopenharmony_ci 498c2ecf20Sopenharmony_ci if ((addr % 4) == 0) { 508c2ecf20Sopenharmony_ci /* address is 4-bytes aligned */ 518c2ecf20Sopenharmony_ci ret = wlcore_read32(wl, addr, &val); 528c2ecf20Sopenharmony_ci if (ret >= 0 && out) 538c2ecf20Sopenharmony_ci *out = val & 0xffff; 548c2ecf20Sopenharmony_ci } else { 558c2ecf20Sopenharmony_ci ret = wlcore_read32(wl, addr - 2, &val); 568c2ecf20Sopenharmony_ci if (ret >= 0 && out) 578c2ecf20Sopenharmony_ci *out = (val & 0xffff0000) >> 16; 588c2ecf20Sopenharmony_ci } 598c2ecf20Sopenharmony_ci 608c2ecf20Sopenharmony_ci return ret; 618c2ecf20Sopenharmony_ci} 62