SmartAudio/lichee/linux-4.9/sound/soc/sunxi/sunxi_rw_func.c

155 lines
3.3 KiB
C
Executable File

/*
* sound\soc\sunxi\sunxi_rw_func.c
* (C) Copyright 2010-2017
* Reuuimlla Technology Co., Ltd. <www.reuuimllatech.com>
* huangxin <huangxin@Reuuimllatech.com>
*
* some simple description for this code
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
*/
#include "sunxi_rw_func.h"
/*analog register*/
u32 read_prcm_wvalue(u32 addr, void __iomem *ADDA_PR_CFG_REG)
{
u32 reg;
reg = readl(ADDA_PR_CFG_REG);
reg |= (0x1 << 28);
writel(reg, ADDA_PR_CFG_REG);
reg = readl(ADDA_PR_CFG_REG);
reg &= ~(0x1 << 24);
writel(reg, ADDA_PR_CFG_REG);
reg = readl(ADDA_PR_CFG_REG);
reg &= ~(ADDR_WIDTH << 16);
reg |= (addr << 16);
writel(reg, ADDA_PR_CFG_REG);
reg = readl(ADDA_PR_CFG_REG);
reg &= (0xff << 0);
return reg;
}
EXPORT_SYMBOL_GPL(read_prcm_wvalue);
void write_prcm_wvalue(u32 addr, u32 val, void __iomem *ADDA_PR_CFG_REG)
{
u32 reg;
reg = readl(ADDA_PR_CFG_REG);
reg |= (0x1 << 28);
writel(reg, ADDA_PR_CFG_REG);
reg = readl(ADDA_PR_CFG_REG);
reg &= ~(ADDR_WIDTH << 16);
reg |= (addr << 16);
writel(reg, ADDA_PR_CFG_REG);
reg = readl(ADDA_PR_CFG_REG);
reg &= ~(0xff << 8);
reg |= (val << 8);
writel(reg, ADDA_PR_CFG_REG);
reg = readl(ADDA_PR_CFG_REG);
reg |= (0x1 << 24);
writel(reg, ADDA_PR_CFG_REG);
reg = readl(ADDA_PR_CFG_REG);
reg &= ~(0x1 << 24);
writel(reg, ADDA_PR_CFG_REG);
}
EXPORT_SYMBOL_GPL(write_prcm_wvalue);
/*digital*/
u32 codec_rdreg(void __iomem *address)
{
return readl(address);
}
EXPORT_SYMBOL_GPL(codec_rdreg);
void codec_wrreg(void __iomem *address, u32 val)
{
writel(val, address);
}
EXPORT_SYMBOL_GPL(codec_wrreg);
/**
* codec_wrreg_bits - update codec register bits
* @reg: codec register
* @mask: register mask
* @value: new value
*
* Writes new register value.
* Return 1 for change else 0.
*/
u32 codec_wrreg_prcm_bits(void __iomem *ADDA_PR_CFG_REG, u32 reg,
u32 mask, u32 value)
{
u32 old, new;
old = read_prcm_wvalue(reg, ADDA_PR_CFG_REG);
new = (old & ~mask) | value;
write_prcm_wvalue(reg, new, ADDA_PR_CFG_REG);
return 0;
}
EXPORT_SYMBOL_GPL(codec_wrreg_prcm_bits);
/**
* codec_wrreg_bits - update codec register bits
* @reg: codec register
* @mask: register mask
* @value: new value
*
* Writes new register value.
* Return 1 for change else 0.
*/
u32 codec_wrreg_bits(void __iomem *address, u32 mask, u32 value)
{
u32 old, new;
old = codec_rdreg(address);
new = (old & ~mask) | value;
codec_wrreg(address, new);
return 0;
}
EXPORT_SYMBOL_GPL(codec_wrreg_bits);
u32 codec_wr_control(void __iomem *reg, u32 mask, u32 shift, u32 val)
{
u32 reg_val;
reg_val = val << shift;
mask = mask << shift;
codec_wrreg_bits(reg, mask, reg_val);
return 0;
}
EXPORT_SYMBOL_GPL(codec_wr_control);
u32 audiodebug_reg_read(u32 reg)
{
u32 reg_val = -1;
void __iomem *temp_address = ioremap(reg, 5);
if (temp_address == NULL) {
pr_err("could not remap register memory\n");
return -ENOMEM;
} else
reg_val = readl(temp_address);
iounmap(temp_address);
return reg_val;
}
EXPORT_SYMBOL_GPL(audiodebug_reg_read);
MODULE_AUTHOR("huangxin, liushaohua");
MODULE_DESCRIPTION("sunxi ASoC DMA Driver");
MODULE_LICENSE("GPL");