/* * sound\soc\sunxi\sunxi_rw_func.c * (C) Copyright 2010-2017 * Reuuimlla Technology Co., Ltd. * huangxin * * 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");