Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

initial SOF hdac serials. #47

Merged
merged 7 commits into from
Jul 30, 2018
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
ASoC: SOF: hda: refine makefile for with/without HDA support
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
commit 3ea24e92ee558e6a07263e7ec143a0a258e2b86b
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)"
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does this have a help section (check patch complains without one).

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

let me add it.

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)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Isn't this implied by Kconfig option

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

are you meaning that IS_ENABLED(CONFIG_SND_SOC_SOF_HDA) is true always?
the answer is no for that, it is tristate, we can choose them or not in menuconfig.


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;
}