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