Skip to content

Commit

Permalink
ASoC: SOF: hda: refine makefile for with/without HDA support
Browse files Browse the repository at this point in the history
1. add hda-bus to handle hda bus initialization, for both with/without
HDA links support.
2. split hda-codec out from hda-common, and compile it when SOF_HDA is
selected.

Signed-off-by: Keyon Jie <[email protected]>
  • Loading branch information
keyonjie committed Jul 27, 2018
1 parent 7cc5deb commit 3ea24e9
Showing 3 changed files with 140 additions and 1 deletion.
1 change: 1 addition & 0 deletions sound/soc/sof/intel/Kconfig
Original file line number Diff line number Diff line change
@@ -95,6 +95,7 @@ config SND_SOC_SOF_HDA_COMMON
config SND_SOC_SOF_HDA
tristate "SOF support for HDA Links(HDA/HDMI)"
depends on SND_SOC_SOF_HDA_COMMON
select SND_HDA_EXT_CORE
select SND_SOC_HDAC_HDA
select SND_SOC_HDAC_HDMI
help
5 changes: 4 additions & 1 deletion sound/soc/sof/intel/Makefile
Original file line number Diff line number Diff line change
@@ -7,10 +7,13 @@ snd-sof-intel-hsw-objs := hsw.o
snd-sof-intel-bdw-objs := bdw.o
snd-sof-intel-hda-common-objs := hda.o hda-loader.o hda-stream.o hda-trace.o \
hda-dsp.o hda-ipc.o hda-ctrl.o hda-pcm.o \
hda-dai.o hda-codec.o \
hda-dai.o hda-bus.o \
skl.o apl.o cnl.o

snd-sof-intel-hda-objs := hda-codec.o

obj-$(CONFIG_SND_SOC_SOF_BAYTRAIL) += snd-sof-intel-byt.o
obj-$(CONFIG_SND_SOC_SOF_HASWELL) += snd-sof-intel-hsw.o
obj-$(CONFIG_SND_SOC_SOF_BROADWELL) += snd-sof-intel-bdw.o
obj-$(CONFIG_SND_SOC_SOF_HDA_COMMON) += snd-sof-intel-hda-common.o
obj-$(CONFIG_SND_SOC_SOF_HDA) += snd-sof-intel-hda.o
135 changes: 135 additions & 0 deletions sound/soc/sof/intel/hda-bus.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,135 @@
// SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause)
/*
* This file is provided under a dual BSD/GPLv2 license. When using or
* redistributing this file, you may do so under either license.
*
* Copyright(c) 2018 Intel Corporation. All rights reserved.
*
* Authors: Jeeja KP <[email protected]>
* Keyon Jie <[email protected]>
*/

#include <sound/hdaudio.h>

#if IS_ENABLED(CONFIG_SND_SOC_SOF_HDA)

static const struct hdac_bus_ops bus_ops = {
.command = snd_hdac_bus_send_cmd,
.get_response = snd_hdac_bus_get_response,
};

/*
* process queued unsolicited events
*/
static void hda_process_unsol_events(struct work_struct *work)
{
struct hdac_bus *bus = container_of(work, struct hdac_bus, unsol_work);
struct hdac_device *codec;
struct hdac_driver *drv;
unsigned int rp, caddr, res;

while (bus->unsol_rp != bus->unsol_wp) {
rp = (bus->unsol_rp + 1) % HDA_UNSOL_QUEUE_SIZE;
bus->unsol_rp = rp;
rp <<= 1;
res = bus->unsol_queue[rp];
caddr = bus->unsol_queue[rp + 1];
if (!(caddr & (1 << 4))) /* no unsolicited event? */
continue;
codec = bus->caddr_tbl[caddr & 0x0f];
if (!codec || !codec->dev.driver)
continue;
drv = drv_to_hdac_driver(codec->dev.driver);
if (drv->unsol_event)
drv->unsol_event(codec, res);
}
}

#endif

static void sof_hda_writel(u32 value, u32 __iomem *addr)
{
writel(value, addr);
}

static u32 sof_hda_readl(u32 __iomem *addr)
{
return readl(addr);
}

static void sof_hda_writew(u16 value, u16 __iomem *addr)
{
writew(value, addr);
}

static u16 sof_hda_readw(u16 __iomem *addr)
{
return readw(addr);
}

static void sof_hda_writeb(u8 value, u8 __iomem *addr)
{
writeb(value, addr);
}

static u8 sof_hda_readb(u8 __iomem *addr)
{
return readb(addr);
}

static int sof_hda_dma_alloc_pages(struct hdac_bus *bus, int type,
size_t size, struct snd_dma_buffer *buf)
{
return snd_dma_alloc_pages(type, bus->dev, size, buf);
}

static void sof_hda_dma_free_pages(struct hdac_bus *bus,
struct snd_dma_buffer *buf)
{
snd_dma_free_pages(buf);
}

static const struct hdac_io_ops io_ops = {
.reg_writel = sof_hda_writel,
.reg_readl = sof_hda_readl,
.reg_writew = sof_hda_writew,
.reg_readw = sof_hda_readw,
.reg_writeb = sof_hda_writeb,
.reg_readb = sof_hda_readb,
.dma_alloc_pages = sof_hda_dma_alloc_pages,
.dma_free_pages = sof_hda_dma_free_pages,
};

/*
* This can be used for both with/without hda link support.
* Returns 0 if successful, or a negative error code.
*/
int sof_hda_bus_init(struct hdac_bus *bus, struct device *dev,
const struct hdac_ext_bus_ops *ext_ops)
{
static int idx;

memset(bus, 0, sizeof(*bus));
bus->dev = dev;
#if IS_ENABLED(CONFIG_SND_SOC_SOF_HDA)
bus->ops = &bus_ops;
#endif
bus->io_ops = &io_ops;
INIT_LIST_HEAD(&bus->stream_list);
INIT_LIST_HEAD(&bus->codec_list);
#if IS_ENABLED(CONFIG_SND_SOC_SOF_HDA)
INIT_WORK(&bus->unsol_work, hda_process_unsol_events);
#endif
spin_lock_init(&bus->reg_lock);
mutex_init(&bus->cmd_mutex);
bus->irq = -1;

bus->ext_ops = ext_ops;
INIT_LIST_HEAD(&bus->hlink_list);
bus->idx = idx++;

mutex_init(&bus->lock);
bus->cmd_dma_state = true;

return 0;
}

0 comments on commit 3ea24e9

Please sign in to comment.