Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
5e8338db
Commit
5e8338db
authored
May 26, 2017
by
Mark Brown
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'asoc/fix/intel' into asoc-linus
parents
08332893
0a716776
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
97 additions
and
76 deletions
+97
-76
sound/soc/intel/skylake/skl-sst-ipc.c
sound/soc/intel/skylake/skl-sst-ipc.c
+5
-0
sound/soc/intel/skylake/skl-topology.c
sound/soc/intel/skylake/skl-topology.c
+1
-1
sound/soc/intel/skylake/skl.c
sound/soc/intel/skylake/skl.c
+88
-74
sound/soc/intel/skylake/skl.h
sound/soc/intel/skylake/skl.h
+3
-1
No files found.
sound/soc/intel/skylake/skl-sst-ipc.c
View file @
5e8338db
...
...
@@ -413,8 +413,11 @@ static void skl_ipc_process_reply(struct sst_generic_ipc *ipc,
u32
reply
=
header
.
primary
&
IPC_GLB_REPLY_STATUS_MASK
;
u64
*
ipc_header
=
(
u64
*
)(
&
header
);
struct
skl_sst
*
skl
=
container_of
(
ipc
,
struct
skl_sst
,
ipc
);
unsigned
long
flags
;
spin_lock_irqsave
(
&
ipc
->
dsp
->
spinlock
,
flags
);
msg
=
skl_ipc_reply_get_msg
(
ipc
,
*
ipc_header
);
spin_unlock_irqrestore
(
&
ipc
->
dsp
->
spinlock
,
flags
);
if
(
msg
==
NULL
)
{
dev_dbg
(
ipc
->
dev
,
"ipc: rx list is empty
\n
"
);
return
;
...
...
@@ -456,8 +459,10 @@ static void skl_ipc_process_reply(struct sst_generic_ipc *ipc,
}
}
spin_lock_irqsave
(
&
ipc
->
dsp
->
spinlock
,
flags
);
list_del
(
&
msg
->
list
);
sst_ipc_tx_msg_reply_complete
(
ipc
,
msg
);
spin_unlock_irqrestore
(
&
ipc
->
dsp
->
spinlock
,
flags
);
}
irqreturn_t
skl_dsp_irq_thread_handler
(
int
irq
,
void
*
context
)
...
...
sound/soc/intel/skylake/skl-topology.c
View file @
5e8338db
...
...
@@ -2502,7 +2502,7 @@ static int skl_tplg_get_manifest_tkn(struct device *dev,
if
(
ret
<
0
)
return
ret
;
tkn_count
+
=
ret
;
tkn_count
=
ret
;
tuple_size
+=
tkn_count
*
sizeof
(
struct
snd_soc_tplg_vendor_string_elem
);
...
...
sound/soc/intel/skylake/skl.c
View file @
5e8338db
...
...
@@ -410,7 +410,7 @@ static int skl_free(struct hdac_ext_bus *ebus)
struct
skl
*
skl
=
ebus_to_skl
(
ebus
);
struct
hdac_bus
*
bus
=
ebus_to_hbus
(
ebus
);
skl
->
init_
failed
=
1
;
/* to be sure */
skl
->
init_
done
=
0
;
/* to be sure */
snd_hdac_ext_stop_streams
(
ebus
);
...
...
@@ -428,8 +428,10 @@ static int skl_free(struct hdac_ext_bus *ebus)
snd_hdac_ext_bus_exit
(
ebus
);
cancel_work_sync
(
&
skl
->
probe_work
);
if
(
IS_ENABLED
(
CONFIG_SND_SOC_HDAC_HDMI
))
snd_hdac_i915_exit
(
&
ebus
->
bus
);
return
0
;
}
...
...
@@ -566,6 +568,84 @@ static const struct hdac_bus_ops bus_core_ops = {
.
get_response
=
snd_hdac_bus_get_response
,
};
static
int
skl_i915_init
(
struct
hdac_bus
*
bus
)
{
int
err
;
/*
* The HDMI codec is in GPU so we need to ensure that it is powered
* up and ready for probe
*/
err
=
snd_hdac_i915_init
(
bus
);
if
(
err
<
0
)
return
err
;
err
=
snd_hdac_display_power
(
bus
,
true
);
if
(
err
<
0
)
dev_err
(
bus
->
dev
,
"Cannot turn on display power on i915
\n
"
);
return
err
;
}
static
void
skl_probe_work
(
struct
work_struct
*
work
)
{
struct
skl
*
skl
=
container_of
(
work
,
struct
skl
,
probe_work
);
struct
hdac_ext_bus
*
ebus
=
&
skl
->
ebus
;
struct
hdac_bus
*
bus
=
ebus_to_hbus
(
ebus
);
struct
hdac_ext_link
*
hlink
=
NULL
;
int
err
;
if
(
IS_ENABLED
(
CONFIG_SND_SOC_HDAC_HDMI
))
{
err
=
skl_i915_init
(
bus
);
if
(
err
<
0
)
return
;
}
err
=
skl_init_chip
(
bus
,
true
);
if
(
err
<
0
)
{
dev_err
(
bus
->
dev
,
"Init chip failed with err: %d
\n
"
,
err
);
goto
out_err
;
}
/* codec detection */
if
(
!
bus
->
codec_mask
)
dev_info
(
bus
->
dev
,
"no hda codecs found!
\n
"
);
/* create codec instances */
err
=
skl_codec_create
(
ebus
);
if
(
err
<
0
)
goto
out_err
;
if
(
IS_ENABLED
(
CONFIG_SND_SOC_HDAC_HDMI
))
{
err
=
snd_hdac_display_power
(
bus
,
false
);
if
(
err
<
0
)
{
dev_err
(
bus
->
dev
,
"Cannot turn off display power on i915
\n
"
);
return
;
}
}
/* register platform dai and controls */
err
=
skl_platform_register
(
bus
->
dev
);
if
(
err
<
0
)
return
;
/*
* we are done probing so decrement link counts
*/
list_for_each_entry
(
hlink
,
&
ebus
->
hlink_list
,
list
)
snd_hdac_ext_bus_link_put
(
ebus
,
hlink
);
/* configure PM */
pm_runtime_put_noidle
(
bus
->
dev
);
pm_runtime_allow
(
bus
->
dev
);
skl
->
init_done
=
1
;
return
;
out_err:
if
(
IS_ENABLED
(
CONFIG_SND_SOC_HDAC_HDMI
))
err
=
snd_hdac_display_power
(
bus
,
false
);
}
/*
* constructor
*/
...
...
@@ -593,6 +673,7 @@ static int skl_create(struct pci_dev *pci,
snd_hdac_ext_bus_init
(
ebus
,
&
pci
->
dev
,
&
bus_core_ops
,
io_ops
);
ebus
->
bus
.
use_posbuf
=
1
;
skl
->
pci
=
pci
;
INIT_WORK
(
&
skl
->
probe_work
,
skl_probe_work
);
ebus
->
bus
.
bdl_pos_adj
=
0
;
...
...
@@ -601,27 +682,6 @@ static int skl_create(struct pci_dev *pci,
return
0
;
}
static
int
skl_i915_init
(
struct
hdac_bus
*
bus
)
{
int
err
;
/*
* The HDMI codec is in GPU so we need to ensure that it is powered
* up and ready for probe
*/
err
=
snd_hdac_i915_init
(
bus
);
if
(
err
<
0
)
return
err
;
err
=
snd_hdac_display_power
(
bus
,
true
);
if
(
err
<
0
)
{
dev_err
(
bus
->
dev
,
"Cannot turn on display power on i915
\n
"
);
return
err
;
}
return
err
;
}
static
int
skl_first_init
(
struct
hdac_ext_bus
*
ebus
)
{
struct
skl
*
skl
=
ebus_to_skl
(
ebus
);
...
...
@@ -684,20 +744,7 @@ static int skl_first_init(struct hdac_ext_bus *ebus)
/* initialize chip */
skl_init_pci
(
skl
);
if
(
IS_ENABLED
(
CONFIG_SND_SOC_HDAC_HDMI
))
{
err
=
skl_i915_init
(
bus
);
if
(
err
<
0
)
return
err
;
}
skl_init_chip
(
bus
,
true
);
/* codec detection */
if
(
!
bus
->
codec_mask
)
{
dev_info
(
bus
->
dev
,
"no hda codecs found!
\n
"
);
}
return
0
;
return
skl_init_chip
(
bus
,
true
);
}
static
int
skl_probe
(
struct
pci_dev
*
pci
,
...
...
@@ -706,7 +753,6 @@ static int skl_probe(struct pci_dev *pci,
struct
skl
*
skl
;
struct
hdac_ext_bus
*
ebus
=
NULL
;
struct
hdac_bus
*
bus
=
NULL
;
struct
hdac_ext_link
*
hlink
=
NULL
;
int
err
;
/* we use ext core ops, so provide NULL for ops here */
...
...
@@ -729,7 +775,7 @@ static int skl_probe(struct pci_dev *pci,
if
(
skl
->
nhlt
==
NULL
)
{
err
=
-
ENODEV
;
goto
out_
display_power_off
;
goto
out_
free
;
}
err
=
skl_nhlt_create_sysfs
(
skl
);
...
...
@@ -760,56 +806,24 @@ static int skl_probe(struct pci_dev *pci,
if
(
bus
->
mlcap
)
snd_hdac_ext_bus_get_ml_capabilities
(
ebus
);
snd_hdac_bus_stop_chip
(
bus
);
/* create device for soc dmic */
err
=
skl_dmic_device_register
(
skl
);
if
(
err
<
0
)
goto
out_dsp_free
;
/* register platform dai and controls */
err
=
skl_platform_register
(
bus
->
dev
);
if
(
err
<
0
)
goto
out_dmic_free
;
/* create codec instances */
err
=
skl_codec_create
(
ebus
);
if
(
err
<
0
)
goto
out_unregister
;
if
(
IS_ENABLED
(
CONFIG_SND_SOC_HDAC_HDMI
))
{
err
=
snd_hdac_display_power
(
bus
,
false
);
if
(
err
<
0
)
{
dev_err
(
bus
->
dev
,
"Cannot turn off display power on i915
\n
"
);
return
err
;
}
}
/*
* we are done probling so decrement link counts
*/
list_for_each_entry
(
hlink
,
&
ebus
->
hlink_list
,
list
)
snd_hdac_ext_bus_link_put
(
ebus
,
hlink
);
/* configure PM */
pm_runtime_put_noidle
(
bus
->
dev
);
pm_runtime_allow
(
bus
->
dev
);
schedule_work
(
&
skl
->
probe_work
);
return
0
;
out_unregister:
skl_platform_unregister
(
bus
->
dev
);
out_dmic_free:
skl_dmic_device_unregister
(
skl
);
out_dsp_free:
skl_free_dsp
(
skl
);
out_mach_free:
skl_machine_device_unregister
(
skl
);
out_nhlt_free:
skl_nhlt_free
(
skl
->
nhlt
);
out_display_power_off:
if
(
IS_ENABLED
(
CONFIG_SND_SOC_HDAC_HDMI
))
snd_hdac_display_power
(
bus
,
false
);
out_free:
skl
->
init_failed
=
1
;
skl_free
(
ebus
);
return
err
;
...
...
@@ -828,7 +842,7 @@ static void skl_shutdown(struct pci_dev *pci)
skl
=
ebus_to_skl
(
ebus
);
if
(
skl
->
init_failed
)
if
(
!
skl
->
init_done
)
return
;
snd_hdac_ext_stop_streams
(
ebus
);
...
...
sound/soc/intel/skylake/skl.h
View file @
5e8338db
...
...
@@ -46,7 +46,7 @@ struct skl {
struct
hdac_ext_bus
ebus
;
struct
pci_dev
*
pci
;
unsigned
int
init_
failed
:
1
;
/* delayed init failed
*/
unsigned
int
init_
done
:
1
;
/* delayed init status
*/
struct
platform_device
*
dmic_dev
;
struct
platform_device
*
i2s_dev
;
struct
snd_soc_platform
*
platform
;
...
...
@@ -64,6 +64,8 @@ struct skl {
const
struct
firmware
*
tplg
;
int
supend_active
;
struct
work_struct
probe_work
;
};
#define skl_to_ebus(s) (&(s)->ebus)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment