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