162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * This file is part of wl18xx
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (C) 2011 Texas Instruments
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#include "../wlcore/wlcore.h"
962306a36Sopenharmony_ci#include "../wlcore/io.h"
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#include "io.h"
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ciint wl18xx_top_reg_write(struct wl1271 *wl, int addr, u16 val)
1462306a36Sopenharmony_ci{
1562306a36Sopenharmony_ci	u32 tmp;
1662306a36Sopenharmony_ci	int ret;
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci	if (WARN_ON(addr % 2))
1962306a36Sopenharmony_ci		return -EINVAL;
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ci	if ((addr % 4) == 0) {
2262306a36Sopenharmony_ci		ret = wlcore_read32(wl, addr, &tmp);
2362306a36Sopenharmony_ci		if (ret < 0)
2462306a36Sopenharmony_ci			goto out;
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci		tmp = (tmp & 0xffff0000) | val;
2762306a36Sopenharmony_ci		ret = wlcore_write32(wl, addr, tmp);
2862306a36Sopenharmony_ci	} else {
2962306a36Sopenharmony_ci		ret = wlcore_read32(wl, addr - 2, &tmp);
3062306a36Sopenharmony_ci		if (ret < 0)
3162306a36Sopenharmony_ci			goto out;
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_ci		tmp = (tmp & 0xffff) | (val << 16);
3462306a36Sopenharmony_ci		ret = wlcore_write32(wl, addr - 2, tmp);
3562306a36Sopenharmony_ci	}
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ciout:
3862306a36Sopenharmony_ci	return ret;
3962306a36Sopenharmony_ci}
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ciint wl18xx_top_reg_read(struct wl1271 *wl, int addr, u16 *out)
4262306a36Sopenharmony_ci{
4362306a36Sopenharmony_ci	u32 val = 0;
4462306a36Sopenharmony_ci	int ret;
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ci	if (WARN_ON(addr % 2))
4762306a36Sopenharmony_ci		return -EINVAL;
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ci	if ((addr % 4) == 0) {
5062306a36Sopenharmony_ci		/* address is 4-bytes aligned */
5162306a36Sopenharmony_ci		ret = wlcore_read32(wl, addr, &val);
5262306a36Sopenharmony_ci		if (ret >= 0 && out)
5362306a36Sopenharmony_ci			*out = val & 0xffff;
5462306a36Sopenharmony_ci	} else {
5562306a36Sopenharmony_ci		ret = wlcore_read32(wl, addr - 2, &val);
5662306a36Sopenharmony_ci		if (ret >= 0 && out)
5762306a36Sopenharmony_ci			*out = (val & 0xffff0000) >> 16;
5862306a36Sopenharmony_ci	}
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_ci	return ret;
6162306a36Sopenharmony_ci}
62