-
Notifications
You must be signed in to change notification settings - Fork 132
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
Changes from all commits
f0e1f9b
642a02a
2189fa7
d1c671e
7cc5deb
3ea24e9
bd37bda
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
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) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Isn't this implied by Kconfig option There was a problem hiding this comment. Choose a reason for hiding this commentThe 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? |
||
|
||
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; | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -3,7 +3,7 @@ | |
* 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) 2017 Intel Corporation. All rights reserved. | ||
* Copyright(c) 2018 Intel Corporation. All rights reserved. | ||
* | ||
* Authors: Jeeja KP <[email protected]> | ||
* Keyon Jie <[email protected]> | ||
|
@@ -22,7 +22,6 @@ | |
#include <sound/hda_i915.h> | ||
#include <sound/hda_register.h> | ||
#include <sound/hdaudio.h> | ||
#include <sound/hda_i915.h> | ||
|
||
#include "../../../pci/hda/hda_codec.h" | ||
#include "../../codecs/hdac_hda.h" | ||
|
@@ -51,7 +50,7 @@ static void hda_codec_load_module(struct hda_codec *codec) {} | |
/* probe individual codec */ | ||
static int hda_codec_probe(struct snd_sof_dev *sdev, int addr) | ||
{ | ||
struct hda_bus *hbus = sdev->hbus; | ||
struct hda_bus *hbus = sof_to_hbus(sdev); | ||
unsigned int cmd = (addr << 28) | (AC_NODE_ROOT << 20) | | ||
(AC_VERB_PARAMETERS << 8) | AC_PAR_VENDOR_ID; | ||
unsigned int res = -1; | ||
|
@@ -92,8 +91,7 @@ static int hda_codec_probe(struct snd_sof_dev *sdev, int addr) | |
/* Codec initialization */ | ||
int hda_codec_probe_bus(struct snd_sof_dev *sdev) | ||
{ | ||
struct hda_bus *hbus = sdev->hbus; | ||
struct hdac_bus *bus = &hbus->core; | ||
struct hdac_bus *bus = sof_to_bus(sdev); | ||
int c, max_slots, ret = 0; | ||
|
||
max_slots = HDA_MAX_CODECS; | ||
|
@@ -113,11 +111,11 @@ int hda_codec_probe_bus(struct snd_sof_dev *sdev) | |
|
||
return 0; | ||
} | ||
EXPORT_SYMBOL(hda_codec_probe_bus); | ||
|
||
int hda_codec_i915_init(struct snd_sof_dev *sdev) | ||
{ | ||
struct hda_bus *hbus = sdev->hbus; | ||
struct hdac_bus *bus = &hbus->core; | ||
struct hdac_bus *bus = sof_to_bus(sdev); | ||
int ret; | ||
|
||
/* i915 exposes a HDA codec for HDMI audio */ | ||
|
@@ -131,4 +129,7 @@ int hda_codec_i915_init(struct snd_sof_dev *sdev) | |
|
||
return ret; | ||
} | ||
EXPORT_SYMBOL(hda_codec_i915_init); | ||
|
||
MODULE_LICENSE("Dual BSD/GPL"); | ||
|
There was a problem hiding this comment.
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).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
let me add it.