saif
clks[saif] = mxs_clk_gate("saif", "saif_div", SAIF, 31);
struct mxs_saif *saif = snd_soc_dai_get_drvdata(cpu_dai);
saif->mclk = freq;
if (!saif->mclk_in_use && freq) {
ret = __mxs_saif_get_mclk(saif);
saif->base + SAIF_CTRL + MXS_SET_ADDR);
} else if (saif->mclk_in_use && freq == 0) {
ret = __mxs_saif_put_mclk(saif);
static int mxs_saif_set_clk(struct mxs_saif *saif,
dev_dbg(saif->dev, "mclk %d rate %d\n", mclk, rate);
master_saif = mxs_saif_get_master(saif);
dev_dbg(saif->dev, "master saif%d\n", master_saif->id);
dev_err(saif->dev,
struct mxs_saif *saif = mxs_saif[saif_id];
if (!saif)
stat = __raw_readl(saif->base + SAIF_STAT);
dev_err(saif->dev, "error: busy\n");
clk_disable_unprepare(saif->clk);
saif->base + SAIF_CTRL + MXS_SET_ADDR);
saif->base + SAIF_CTRL + MXS_CLR_ADDR);
saif->mclk_in_use = 0;
struct mxs_saif *saif = mxs_saif[saif_id];
if (!saif)
ret = __mxs_saif_get_mclk(saif);
ret = mxs_saif_set_clk(saif, mclk, rate);
ret = clk_prepare_enable(saif->clk);
saif->base + SAIF_CTRL + MXS_SET_ADDR);
struct mxs_saif *saif = snd_soc_dai_get_drvdata(cpu_dai);
stat = __raw_readl(saif->base + SAIF_STAT);
if (saif->id != saif->master_id) {
saif->base + SAIF_CTRL + MXS_CLR_ADDR);
saif->base + SAIF_CTRL + MXS_CLR_ADDR);
scr0 = __raw_readl(saif->base + SAIF_CTRL);
static inline struct mxs_saif *mxs_saif_get_master(struct mxs_saif *saif)
return mxs_saif[saif->master_id];
if (saif->id == saif->master_id)
static int __mxs_saif_put_mclk(struct mxs_saif *saif)
__raw_writel(scr | scr0, saif->base + SAIF_CTRL);
struct mxs_saif *saif = snd_soc_dai_get_drvdata(cpu_dai);
saif->fifo_underrun = 0;
saif->fifo_overrun = 0;
saif->base + SAIF_CTRL + MXS_CLR_ADDR);
saif->base + SAIF_CTRL + MXS_CLR_ADDR);
ret = clk_prepare(saif->clk);
struct mxs_saif *saif = snd_soc_dai_get_drvdata(cpu_dai);
clk_unprepare(saif->clk);
ret = readx_poll_timeout(__raw_readl, saif->base + SAIF_STAT, stat,
struct mxs_saif *saif = snd_soc_dai_get_drvdata(cpu_dai);
master_saif = mxs_saif_get_master(saif);
if (!saif->mclk && saif->mclk_in_use) {
stat = __raw_readl(saif->base + SAIF_STAT);
if (!saif->mclk_in_use && (stat & BM_SAIF_STAT_BUSY)) {
ret = mxs_saif_set_clk(saif, saif->mclk, params_rate(params));
if (saif != master_saif) {
ret = clk_enable(saif->clk);
ret = clk_set_rate(saif->clk, 24000000);
clk_disable(saif->clk);
dev_err(saif->dev, "error: busy\n");
scr = __raw_readl(saif->base + SAIF_CTRL);
__raw_writel(scr, saif->base + SAIF_CTRL);
struct mxs_saif *saif = snd_soc_dai_get_drvdata(cpu_dai);
saif->base + SAIF_CTRL + MXS_SET_ADDR);
struct mxs_saif *saif = snd_soc_dai_get_drvdata(cpu_dai);
saif->base + SAIF_CTRL + MXS_SET_ADDR);
master_saif = mxs_saif_get_master(saif);
if (saif->state == MXS_SAIF_STATE_RUNNING)
dev_err(saif->dev, "Failed to enable master clock\n");
saif->base + SAIF_CTRL + MXS_CLR_ADDR);
if (saif != master_saif) {
ret = clk_enable(saif->clk);
dev_err(saif->dev, "Failed to enable master clock\n");
saif->base + SAIF_CTRL + MXS_SET_ADDR);
saif->mclk_in_use = 0;
__raw_writel(0, saif->base + SAIF_DATA);
__raw_writel(0, saif->base + SAIF_DATA);
__raw_readl(saif->base + SAIF_DATA);
__raw_readl(saif->base + SAIF_DATA);
saif->state = MXS_SAIF_STATE_RUNNING;
dev_dbg(saif->dev, "CTRL 0x%x STAT 0x%x\n",
__raw_readl(saif->base + SAIF_CTRL),
__raw_readl(saif->base + SAIF_STAT));
if (saif->state == MXS_SAIF_STATE_STOPPED)
static int __mxs_saif_get_mclk(struct mxs_saif *saif)
if (saif != master_saif) {
saif->base + SAIF_CTRL + MXS_CLR_ADDR);
clk_disable(saif->clk);
saif->state = MXS_SAIF_STATE_STOPPED;
if (!saif)
struct mxs_saif *saif = dev_id;
stat = __raw_readl(saif->base + SAIF_STAT);
dev_dbg(saif->dev, "underrun!!! %d\n", ++saif->fifo_underrun);
saif->base + SAIF_STAT + MXS_CLR_ADDR);
dev_dbg(saif->dev, "overrun!!! %d\n", ++saif->fifo_overrun);
saif->base + SAIF_STAT + MXS_CLR_ADDR);
dev_dbg(saif->dev, "SAIF_CTRL %x SAIF_STAT %x\n",
__raw_readl(saif->base + SAIF_CTRL),
__raw_readl(saif->base + SAIF_STAT));
struct mxs_saif *saif = platform_get_drvdata(pdev);
__clk_get_name(saif->clk), 0,
saif->base + SAIF_CTRL,
saif->base + SAIF_CTRL + MXS_CLR_ADDR);
struct mxs_saif *saif;
saif = devm_kzalloc(&pdev->dev, sizeof(*saif), GFP_KERNEL);
if (!saif)
saif->id = ret;
if (saif->id >= ARRAY_SIZE(mxs_saif)) {
saif->base + SAIF_CTRL + MXS_CLR_ADDR);
saif->master_id = saif->id;
saif->master_id = ret;
if (saif->master_id >= ARRAY_SIZE(mxs_saif)) {
mxs_saif[saif->id] = saif;
saif->clk = devm_clk_get(&pdev->dev, NULL);
if (IS_ERR(saif->clk)) {
master_saif = mxs_saif_get_master(saif);
ret = PTR_ERR(saif->clk);
saif->base = devm_platform_ioremap_resource(pdev, 0);
if (IS_ERR(saif->base))
return PTR_ERR(saif->base);
if (saif != master_saif) {
saif->dev = &pdev->dev;
dev_name(&pdev->dev), saif);
dev_err(saif->dev, "can not get mclk from a non-master saif\n");
platform_set_drvdata(pdev, saif);
if (saif->id == 0) {
stat = __raw_readl(saif->base + SAIF_STAT);
dev_err(saif->dev, "error: busy\n");
saif->mclk_in_use = 1;