1233294Sstas// SPDX-License-Identifier: GPL-2.0-only 272445Sassar/* 3178825Sdfr * This file is part of wl18xx 472445Sassar * 555682Smarkm * Copyright (C) 2011 Texas Instruments 655682Smarkm */ 7178825Sdfr 8178825Sdfr#include "../wlcore/wlcore.h" 9178825Sdfr#include "../wlcore/io.h" 10178825Sdfr 11178825Sdfr#include "io.h" 12178825Sdfr 13178825Sdfrint wl18xx_top_reg_write(struct wl1271 *wl, int addr, u16 val) 1472445Sassar{ 15178825Sdfr u32 tmp; 16178825Sdfr int ret; 17178825Sdfr 18178825Sdfr if (WARN_ON(addr % 2)) 19178825Sdfr return -EINVAL; 20178825Sdfr 21178825Sdfr if ((addr % 4) == 0) { 22178825Sdfr ret = wlcore_read32(wl, addr, &tmp); 23178825Sdfr if (ret < 0) 24178825Sdfr goto out; 25178825Sdfr 26233294Sstas tmp = (tmp & 0xffff0000) | val; 27127808Snectar ret = wlcore_write32(wl, addr, tmp); 28127808Snectar } else { 29127808Snectar ret = wlcore_read32(wl, addr - 2, &tmp); 30178825Sdfr if (ret < 0) 31178825Sdfr goto out; 32178825Sdfr 33233294Sstas tmp = (tmp & 0xffff) | (val << 16); 3472445Sassar ret = wlcore_write32(wl, addr - 2, tmp); 3572445Sassar } 3672445Sassar 3755682Smarkmout: 3855682Smarkm return ret; 3955682Smarkm} 4055682Smarkm 4155682Smarkmint wl18xx_top_reg_read(struct wl1271 *wl, int addr, u16 *out) 4255682Smarkm{ 4355682Smarkm u32 val = 0; 4455682Smarkm int ret; 4555682Smarkm 4655682Smarkm if (WARN_ON(addr % 2)) 4755682Smarkm return -EINVAL; 48178825Sdfr 4955682Smarkm if ((addr % 4) == 0) { 50178825Sdfr /* address is 4-bytes aligned */ 51178825Sdfr ret = wlcore_read32(wl, addr, &val); 5255682Smarkm if (ret >= 0 && out) 5355682Smarkm *out = val & 0xffff; 5455682Smarkm } else { 5555682Smarkm ret = wlcore_read32(wl, addr - 2, &val); 5655682Smarkm if (ret >= 0 && out) 5755682Smarkm *out = (val & 0xffff0000) >> 16; 5855682Smarkm } 5955682Smarkm 60178825Sdfr return ret; 6155682Smarkm} 6255682Smarkm