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
a18d5151
Commit
a18d5151
authored
Apr 12, 2013
by
Mark Brown
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'asoc/topic/arizona' into asoc-next
parents
0680fa6c
b6ed61cf
Changes
13
Hide whitespace changes
Inline
Side-by-side
Showing
13 changed files
with
738 additions
and
228 deletions
+738
-228
drivers/extcon/extcon-arizona.c
drivers/extcon/extcon-arizona.c
+52
-55
drivers/mfd/wm5102-tables.c
drivers/mfd/wm5102-tables.c
+10
-0
include/linux/mfd/arizona/core.h
include/linux/mfd/arizona/core.h
+3
-0
include/linux/mfd/arizona/registers.h
include/linux/mfd/arizona/registers.h
+42
-0
sound/soc/codecs/arizona.c
sound/soc/codecs/arizona.c
+461
-69
sound/soc/codecs/arizona.h
sound/soc/codecs/arizona.h
+33
-1
sound/soc/codecs/wm2200.c
sound/soc/codecs/wm2200.c
+1
-1
sound/soc/codecs/wm5102.c
sound/soc/codecs/wm5102.c
+61
-68
sound/soc/codecs/wm5102.h
sound/soc/codecs/wm5102.h
+4
-2
sound/soc/codecs/wm5110.c
sound/soc/codecs/wm5110.c
+27
-27
sound/soc/codecs/wm5110.h
sound/soc/codecs/wm5110.h
+4
-2
sound/soc/codecs/wm_adsp.c
sound/soc/codecs/wm_adsp.c
+38
-2
sound/soc/codecs/wm_adsp.h
sound/soc/codecs/wm_adsp.h
+2
-1
No files found.
drivers/extcon/extcon-arizona.c
View file @
a18d5151
...
...
@@ -100,6 +100,55 @@ static const char *arizona_cable[] = {
NULL
,
};
static
void
arizona_extcon_do_magic
(
struct
arizona_extcon_info
*
info
,
unsigned
int
magic
)
{
struct
arizona
*
arizona
=
info
->
arizona
;
int
ret
;
mutex_lock
(
&
arizona
->
dapm
->
card
->
dapm_mutex
);
arizona
->
hpdet_magic
=
magic
;
/* Keep the HP output stages disabled while doing the magic */
if
(
magic
)
{
ret
=
regmap_update_bits
(
arizona
->
regmap
,
ARIZONA_OUTPUT_ENABLES_1
,
ARIZONA_OUT1L_ENA
|
ARIZONA_OUT1R_ENA
,
0
);
if
(
ret
!=
0
)
dev_warn
(
arizona
->
dev
,
"Failed to disable headphone outputs: %d
\n
"
,
ret
);
}
ret
=
regmap_update_bits
(
arizona
->
regmap
,
0x225
,
0x4000
,
magic
);
if
(
ret
!=
0
)
dev_warn
(
arizona
->
dev
,
"Failed to do magic: %d
\n
"
,
ret
);
ret
=
regmap_update_bits
(
arizona
->
regmap
,
0x226
,
0x4000
,
magic
);
if
(
ret
!=
0
)
dev_warn
(
arizona
->
dev
,
"Failed to do magic: %d
\n
"
,
ret
);
/* Restore the desired state while not doing the magic */
if
(
!
magic
)
{
ret
=
regmap_update_bits
(
arizona
->
regmap
,
ARIZONA_OUTPUT_ENABLES_1
,
ARIZONA_OUT1L_ENA
|
ARIZONA_OUT1R_ENA
,
arizona
->
hp_ena
);
if
(
ret
!=
0
)
dev_warn
(
arizona
->
dev
,
"Failed to restore headphone outputs: %d
\n
"
,
ret
);
}
mutex_unlock
(
&
arizona
->
dapm
->
card
->
dapm_mutex
);
}
static
void
arizona_extcon_set_mode
(
struct
arizona_extcon_info
*
info
,
int
mode
)
{
struct
arizona
*
arizona
=
info
->
arizona
;
...
...
@@ -484,7 +533,6 @@ static irqreturn_t arizona_hpdet_irq(int irq, void *data)
struct
arizona
*
arizona
=
info
->
arizona
;
int
id_gpio
=
arizona
->
pdata
.
hpdet_id_gpio
;
int
report
=
ARIZONA_CABLE_HEADPHONE
;
unsigned
int
val
;
int
ret
,
reading
;
mutex_lock
(
&
info
->
lock
);
...
...
@@ -539,28 +587,7 @@ static irqreturn_t arizona_hpdet_irq(int irq, void *data)
dev_err
(
arizona
->
dev
,
"Failed to report HP/line: %d
\n
"
,
ret
);
mutex_lock
(
&
arizona
->
dapm
->
card
->
dapm_mutex
);
ret
=
regmap_read
(
arizona
->
regmap
,
ARIZONA_OUTPUT_ENABLES_1
,
&
val
);
if
(
ret
!=
0
)
{
dev_err
(
arizona
->
dev
,
"Failed to read output enables: %d
\n
"
,
ret
);
val
=
0
;
}
if
(
!
(
val
&
(
ARIZONA_OUT1L_ENA
|
ARIZONA_OUT1R_ENA
)))
{
ret
=
regmap_update_bits
(
arizona
->
regmap
,
0x225
,
0x4000
,
0
);
if
(
ret
!=
0
)
dev_warn
(
arizona
->
dev
,
"Failed to undo magic: %d
\n
"
,
ret
);
ret
=
regmap_update_bits
(
arizona
->
regmap
,
0x226
,
0x4000
,
0
);
if
(
ret
!=
0
)
dev_warn
(
arizona
->
dev
,
"Failed to undo magic: %d
\n
"
,
ret
);
}
mutex_unlock
(
&
arizona
->
dapm
->
card
->
dapm_mutex
);
arizona_extcon_do_magic
(
info
,
0
);
done:
if
(
id_gpio
)
...
...
@@ -606,13 +633,7 @@ static void arizona_identify_headphone(struct arizona_extcon_info *info)
if
(
info
->
mic
)
arizona_stop_mic
(
info
);
ret
=
regmap_update_bits
(
arizona
->
regmap
,
0x225
,
0x4000
,
0x4000
);
if
(
ret
!=
0
)
dev_warn
(
arizona
->
dev
,
"Failed to do magic: %d
\n
"
,
ret
);
ret
=
regmap_update_bits
(
arizona
->
regmap
,
0x226
,
0x4000
,
0x4000
);
if
(
ret
!=
0
)
dev_warn
(
arizona
->
dev
,
"Failed to do magic: %d
\n
"
,
ret
);
arizona_extcon_do_magic
(
info
,
0x4000
);
ret
=
regmap_update_bits
(
arizona
->
regmap
,
ARIZONA_ACCESSORY_DETECT_MODE_1
,
...
...
@@ -653,7 +674,6 @@ static void arizona_identify_headphone(struct arizona_extcon_info *info)
static
void
arizona_start_hpdet_acc_id
(
struct
arizona_extcon_info
*
info
)
{
struct
arizona
*
arizona
=
info
->
arizona
;
unsigned
int
val
;
int
ret
;
dev_dbg
(
arizona
->
dev
,
"Starting identification via HPDET
\n
"
);
...
...
@@ -665,30 +685,7 @@ static void arizona_start_hpdet_acc_id(struct arizona_extcon_info *info)
arizona_extcon_pulse_micbias
(
info
);
mutex_lock
(
&
arizona
->
dapm
->
card
->
dapm_mutex
);
ret
=
regmap_read
(
arizona
->
regmap
,
ARIZONA_OUTPUT_ENABLES_1
,
&
val
);
if
(
ret
!=
0
)
{
dev_err
(
arizona
->
dev
,
"Failed to read output enables: %d
\n
"
,
ret
);
val
=
0
;
}
if
(
!
(
val
&
(
ARIZONA_OUT1L_ENA
|
ARIZONA_OUT1R_ENA
)))
{
ret
=
regmap_update_bits
(
arizona
->
regmap
,
0x225
,
0x4000
,
0x4000
);
if
(
ret
!=
0
)
dev_warn
(
arizona
->
dev
,
"Failed to do magic: %d
\n
"
,
ret
);
ret
=
regmap_update_bits
(
arizona
->
regmap
,
0x226
,
0x4000
,
0x4000
);
if
(
ret
!=
0
)
dev_warn
(
arizona
->
dev
,
"Failed to do magic: %d
\n
"
,
ret
);
}
mutex_unlock
(
&
arizona
->
dapm
->
card
->
dapm_mutex
);
arizona_extcon_do_magic
(
info
,
0x4000
);
ret
=
regmap_update_bits
(
arizona
->
regmap
,
ARIZONA_ACCESSORY_DETECT_MODE_1
,
...
...
drivers/mfd/wm5102-tables.c
View file @
a18d5151
...
...
@@ -290,12 +290,14 @@ static const struct reg_default wm5102_reg_default[] = {
{
0x00000176
,
0x0000
},
/* R374 - FLL1 Control 6 */
{
0x00000177
,
0x0181
},
/* R375 - FLL1 Loop Filter Test 1 */
{
0x00000178
,
0x0000
},
/* R376 - FLL1 NCO Test 0 */
{
0x00000179
,
0x0000
},
/* R377 - FLL1 Control 7 */
{
0x00000181
,
0x0000
},
/* R385 - FLL1 Synchroniser 1 */
{
0x00000182
,
0x0000
},
/* R386 - FLL1 Synchroniser 2 */
{
0x00000183
,
0x0000
},
/* R387 - FLL1 Synchroniser 3 */
{
0x00000184
,
0x0000
},
/* R388 - FLL1 Synchroniser 4 */
{
0x00000185
,
0x0000
},
/* R389 - FLL1 Synchroniser 5 */
{
0x00000186
,
0x0000
},
/* R390 - FLL1 Synchroniser 6 */
{
0x00000187
,
0x0001
},
/* R391 - FLL1 Synchroniser 7 */
{
0x00000189
,
0x0000
},
/* R393 - FLL1 Spread Spectrum */
{
0x0000018A
,
0x0004
},
/* R394 - FLL1 GPIO Clock */
{
0x00000191
,
0x0000
},
/* R401 - FLL2 Control 1 */
...
...
@@ -306,12 +308,14 @@ static const struct reg_default wm5102_reg_default[] = {
{
0x00000196
,
0x0000
},
/* R406 - FLL2 Control 6 */
{
0x00000197
,
0x0000
},
/* R407 - FLL2 Loop Filter Test 1 */
{
0x00000198
,
0x0000
},
/* R408 - FLL2 NCO Test 0 */
{
0x00000199
,
0x0000
},
/* R409 - FLL2 Control 7 */
{
0x000001A1
,
0x0000
},
/* R417 - FLL2 Synchroniser 1 */
{
0x000001A2
,
0x0000
},
/* R418 - FLL2 Synchroniser 2 */
{
0x000001A3
,
0x0000
},
/* R419 - FLL2 Synchroniser 3 */
{
0x000001A4
,
0x0000
},
/* R420 - FLL2 Synchroniser 4 */
{
0x000001A5
,
0x0000
},
/* R421 - FLL2 Synchroniser 5 */
{
0x000001A6
,
0x0000
},
/* R422 - FLL2 Synchroniser 6 */
{
0x000001A7
,
0x0001
},
/* R423 - FLL2 Synchroniser 7 */
{
0x000001A9
,
0x0000
},
/* R425 - FLL2 Spread Spectrum */
{
0x000001AA
,
0x0004
},
/* R426 - FLL2 GPIO Clock */
{
0x00000200
,
0x0006
},
/* R512 - Mic Charge Pump 1 */
...
...
@@ -1051,12 +1055,14 @@ static bool wm5102_readable_register(struct device *dev, unsigned int reg)
case
ARIZONA_FLL1_CONTROL_6
:
case
ARIZONA_FLL1_LOOP_FILTER_TEST_1
:
case
ARIZONA_FLL1_NCO_TEST_0
:
case
ARIZONA_FLL1_CONTROL_7
:
case
ARIZONA_FLL1_SYNCHRONISER_1
:
case
ARIZONA_FLL1_SYNCHRONISER_2
:
case
ARIZONA_FLL1_SYNCHRONISER_3
:
case
ARIZONA_FLL1_SYNCHRONISER_4
:
case
ARIZONA_FLL1_SYNCHRONISER_5
:
case
ARIZONA_FLL1_SYNCHRONISER_6
:
case
ARIZONA_FLL1_SYNCHRONISER_7
:
case
ARIZONA_FLL1_SPREAD_SPECTRUM
:
case
ARIZONA_FLL1_GPIO_CLOCK
:
case
ARIZONA_FLL2_CONTROL_1
:
...
...
@@ -1067,12 +1073,14 @@ static bool wm5102_readable_register(struct device *dev, unsigned int reg)
case
ARIZONA_FLL2_CONTROL_6
:
case
ARIZONA_FLL2_LOOP_FILTER_TEST_1
:
case
ARIZONA_FLL2_NCO_TEST_0
:
case
ARIZONA_FLL2_CONTROL_7
:
case
ARIZONA_FLL2_SYNCHRONISER_1
:
case
ARIZONA_FLL2_SYNCHRONISER_2
:
case
ARIZONA_FLL2_SYNCHRONISER_3
:
case
ARIZONA_FLL2_SYNCHRONISER_4
:
case
ARIZONA_FLL2_SYNCHRONISER_5
:
case
ARIZONA_FLL2_SYNCHRONISER_6
:
case
ARIZONA_FLL2_SYNCHRONISER_7
:
case
ARIZONA_FLL2_SPREAD_SPECTRUM
:
case
ARIZONA_FLL2_GPIO_CLOCK
:
case
ARIZONA_MIC_CHARGE_PUMP_1
:
...
...
@@ -1161,6 +1169,8 @@ static bool wm5102_readable_register(struct device *dev, unsigned int reg)
case
ARIZONA_NOISE_GATE_CONTROL
:
case
ARIZONA_PDM_SPK1_CTRL_1
:
case
ARIZONA_PDM_SPK1_CTRL_2
:
case
ARIZONA_SPK_CTRL_2
:
case
ARIZONA_SPK_CTRL_3
:
case
ARIZONA_DAC_COMP_1
:
case
ARIZONA_DAC_COMP_2
:
case
ARIZONA_DAC_COMP_3
:
...
...
include/linux/mfd/arizona/core.h
View file @
a18d5151
...
...
@@ -100,6 +100,9 @@ struct arizona {
struct
regmap_irq_chip_data
*
aod_irq_chip
;
struct
regmap_irq_chip_data
*
irq_chip
;
bool
hpdet_magic
;
unsigned
int
hp_ena
;
struct
mutex
clk_lock
;
int
clk32k_ref
;
...
...
include/linux/mfd/arizona/registers.h
View file @
a18d5151
...
...
@@ -85,12 +85,14 @@
#define ARIZONA_FLL1_CONTROL_6 0x176
#define ARIZONA_FLL1_LOOP_FILTER_TEST_1 0x177
#define ARIZONA_FLL1_NCO_TEST_0 0x178
#define ARIZONA_FLL1_CONTROL_7 0x179
#define ARIZONA_FLL1_SYNCHRONISER_1 0x181
#define ARIZONA_FLL1_SYNCHRONISER_2 0x182
#define ARIZONA_FLL1_SYNCHRONISER_3 0x183
#define ARIZONA_FLL1_SYNCHRONISER_4 0x184
#define ARIZONA_FLL1_SYNCHRONISER_5 0x185
#define ARIZONA_FLL1_SYNCHRONISER_6 0x186
#define ARIZONA_FLL1_SYNCHRONISER_7 0x187
#define ARIZONA_FLL1_SPREAD_SPECTRUM 0x189
#define ARIZONA_FLL1_GPIO_CLOCK 0x18A
#define ARIZONA_FLL2_CONTROL_1 0x191
...
...
@@ -101,12 +103,14 @@
#define ARIZONA_FLL2_CONTROL_6 0x196
#define ARIZONA_FLL2_LOOP_FILTER_TEST_1 0x197
#define ARIZONA_FLL2_NCO_TEST_0 0x198
#define ARIZONA_FLL2_CONTROL_7 0x199
#define ARIZONA_FLL2_SYNCHRONISER_1 0x1A1
#define ARIZONA_FLL2_SYNCHRONISER_2 0x1A2
#define ARIZONA_FLL2_SYNCHRONISER_3 0x1A3
#define ARIZONA_FLL2_SYNCHRONISER_4 0x1A4
#define ARIZONA_FLL2_SYNCHRONISER_5 0x1A5
#define ARIZONA_FLL2_SYNCHRONISER_6 0x1A6
#define ARIZONA_FLL2_SYNCHRONISER_7 0x1A7
#define ARIZONA_FLL2_SPREAD_SPECTRUM 0x1A9
#define ARIZONA_FLL2_GPIO_CLOCK 0x1AA
#define ARIZONA_MIC_CHARGE_PUMP_1 0x200
...
...
@@ -213,6 +217,8 @@
#define ARIZONA_PDM_SPK1_CTRL_2 0x491
#define ARIZONA_PDM_SPK2_CTRL_1 0x492
#define ARIZONA_PDM_SPK2_CTRL_2 0x493
#define ARIZONA_SPK_CTRL_2 0x4B5
#define ARIZONA_SPK_CTRL_3 0x4B6
#define ARIZONA_DAC_COMP_1 0x4DC
#define ARIZONA_DAC_COMP_2 0x4DD
#define ARIZONA_DAC_COMP_3 0x4DE
...
...
@@ -1677,6 +1683,13 @@
#define ARIZONA_FLL1_FRC_INTEG_VAL_SHIFT 0
/* FLL1_FRC_INTEG_VAL - [11:0] */
#define ARIZONA_FLL1_FRC_INTEG_VAL_WIDTH 12
/* FLL1_FRC_INTEG_VAL - [11:0] */
/*
* R377 (0x179) - FLL1 Control 7
*/
#define ARIZONA_FLL1_GAIN_MASK 0x003c
/* FLL1_GAIN */
#define ARIZONA_FLL1_GAIN_SHIFT 2
/* FLL1_GAIN */
#define ARIZONA_FLL1_GAIN_WIDTH 4
/* FLL1_GAIN */
/*
* R385 (0x181) - FLL1 Synchroniser 1
*/
...
...
@@ -1723,6 +1736,17 @@
#define ARIZONA_FLL1_CLK_SYNC_SRC_SHIFT 0
/* FLL1_CLK_SYNC_SRC - [3:0] */
#define ARIZONA_FLL1_CLK_SYNC_SRC_WIDTH 4
/* FLL1_CLK_SYNC_SRC - [3:0] */
/*
* R391 (0x187) - FLL1 Synchroniser 7
*/
#define ARIZONA_FLL1_SYNC_GAIN_MASK 0x003c
/* FLL1_SYNC_GAIN */
#define ARIZONA_FLL1_SYNC_GAIN_SHIFT 2
/* FLL1_SYNC_GAIN */
#define ARIZONA_FLL1_SYNC_GAIN_WIDTH 4
/* FLL1_SYNC_GAIN */
#define ARIZONA_FLL1_SYNC_BW 0x0001
/* FLL1_SYNC_BW */
#define ARIZONA_FLL1_SYNC_BW_MASK 0x0001
/* FLL1_SYNC_BW */
#define ARIZONA_FLL1_SYNC_BW_SHIFT 0
/* FLL1_SYNC_BW */
#define ARIZONA_FLL1_SYNC_BW_WIDTH 1
/* FLL1_SYNC_BW */
/*
* R393 (0x189) - FLL1 Spread Spectrum
*/
...
...
@@ -1815,6 +1839,13 @@
#define ARIZONA_FLL2_FRC_INTEG_VAL_SHIFT 0
/* FLL2_FRC_INTEG_VAL - [11:0] */
#define ARIZONA_FLL2_FRC_INTEG_VAL_WIDTH 12
/* FLL2_FRC_INTEG_VAL - [11:0] */
/*
* R409 (0x199) - FLL2 Control 7
*/
#define ARIZONA_FLL2_GAIN_MASK 0x003c
/* FLL2_GAIN */
#define ARIZONA_FLL2_GAIN_SHIFT 2
/* FLL2_GAIN */
#define ARIZONA_FLL2_GAIN_WIDTH 4
/* FLL2_GAIN */
/*
* R417 (0x1A1) - FLL2 Synchroniser 1
*/
...
...
@@ -1861,6 +1892,17 @@
#define ARIZONA_FLL2_CLK_SYNC_SRC_SHIFT 0
/* FLL2_CLK_SYNC_SRC - [3:0] */
#define ARIZONA_FLL2_CLK_SYNC_SRC_WIDTH 4
/* FLL2_CLK_SYNC_SRC - [3:0] */
/*
* R423 (0x1A7) - FLL2 Synchroniser 7
*/
#define ARIZONA_FLL2_SYNC_GAIN_MASK 0x003c
/* FLL2_SYNC_GAIN */
#define ARIZONA_FLL2_SYNC_GAIN_SHIFT 2
/* FLL2_SYNC_GAIN */
#define ARIZONA_FLL2_SYNC_GAIN_WIDTH 4
/* FLL2_SYNC_GAIN */
#define ARIZONA_FLL2_SYNC_BW_MASK 0x0001
/* FLL2_SYNC_BW */
#define ARIZONA_FLL2_SYNC_BW_MASK 0x0001
/* FLL2_SYNC_BW */
#define ARIZONA_FLL2_SYNC_BW_SHIFT 0
/* FLL2_SYNC_BW */
#define ARIZONA_FLL2_SYNC_BW_WIDTH 1
/* FLL2_SYNC_BW */
/*
* R425 (0x1A9) - FLL2 Spread Spectrum
*/
...
...
sound/soc/codecs/arizona.c
View file @
a18d5151
...
...
@@ -10,6 +10,7 @@
* published by the Free Software Foundation.
*/
#include <linux/delay.h>
#include <linux/gcd.h>
#include <linux/module.h>
#include <linux/pm_runtime.h>
...
...
@@ -65,6 +66,163 @@
#define arizona_aif_dbg(_dai, fmt, ...) \
dev_dbg(_dai->dev, "AIF%d: " fmt, _dai->id, ##__VA_ARGS__)
static
int
arizona_spk_ev
(
struct
snd_soc_dapm_widget
*
w
,
struct
snd_kcontrol
*
kcontrol
,
int
event
)
{
struct
snd_soc_codec
*
codec
=
w
->
codec
;
struct
arizona
*
arizona
=
dev_get_drvdata
(
codec
->
dev
->
parent
);
struct
arizona_priv
*
priv
=
snd_soc_codec_get_drvdata
(
codec
);
bool
manual_ena
=
false
;
int
val
;
switch
(
arizona
->
type
)
{
case
WM5102
:
switch
(
arizona
->
rev
)
{
case
0
:
break
;
default:
manual_ena
=
true
;
break
;
}
default:
break
;
}
switch
(
event
)
{
case
SND_SOC_DAPM_PRE_PMU
:
if
(
!
priv
->
spk_ena
&&
manual_ena
)
{
snd_soc_write
(
codec
,
0x4f5
,
0x25a
);
priv
->
spk_ena_pending
=
true
;
}
break
;
case
SND_SOC_DAPM_POST_PMU
:
val
=
snd_soc_read
(
codec
,
ARIZONA_INTERRUPT_RAW_STATUS_3
);
if
(
val
&
ARIZONA_SPK_SHUTDOWN_STS
)
{
dev_crit
(
arizona
->
dev
,
"Speaker not enabled due to temperature
\n
"
);
return
-
EBUSY
;
}
snd_soc_update_bits
(
codec
,
ARIZONA_OUTPUT_ENABLES_1
,
1
<<
w
->
shift
,
1
<<
w
->
shift
);
if
(
priv
->
spk_ena_pending
)
{
msleep
(
75
);
snd_soc_write
(
codec
,
0x4f5
,
0xda
);
priv
->
spk_ena_pending
=
false
;
priv
->
spk_ena
++
;
}
break
;
case
SND_SOC_DAPM_PRE_PMD
:
if
(
manual_ena
)
{
priv
->
spk_ena
--
;
if
(
!
priv
->
spk_ena
)
snd_soc_write
(
codec
,
0x4f5
,
0x25a
);
}
snd_soc_update_bits
(
codec
,
ARIZONA_OUTPUT_ENABLES_1
,
1
<<
w
->
shift
,
0
);
break
;
case
SND_SOC_DAPM_POST_PMD
:
if
(
manual_ena
)
{
if
(
!
priv
->
spk_ena
)
snd_soc_write
(
codec
,
0x4f5
,
0x0da
);
}
break
;
}
return
0
;
}
static
irqreturn_t
arizona_thermal_warn
(
int
irq
,
void
*
data
)
{
struct
arizona
*
arizona
=
data
;
unsigned
int
val
;
int
ret
;
ret
=
regmap_read
(
arizona
->
regmap
,
ARIZONA_INTERRUPT_RAW_STATUS_3
,
&
val
);
if
(
ret
!=
0
)
{
dev_err
(
arizona
->
dev
,
"Failed to read thermal status: %d
\n
"
,
ret
);
}
else
if
(
val
&
ARIZONA_SPK_SHUTDOWN_WARN_STS
)
{
dev_crit
(
arizona
->
dev
,
"Thermal warning
\n
"
);
}
return
IRQ_HANDLED
;
}
static
irqreturn_t
arizona_thermal_shutdown
(
int
irq
,
void
*
data
)
{
struct
arizona
*
arizona
=
data
;
unsigned
int
val
;
int
ret
;
ret
=
regmap_read
(
arizona
->
regmap
,
ARIZONA_INTERRUPT_RAW_STATUS_3
,
&
val
);
if
(
ret
!=
0
)
{
dev_err
(
arizona
->
dev
,
"Failed to read thermal status: %d
\n
"
,
ret
);
}
else
if
(
val
&
ARIZONA_SPK_SHUTDOWN_STS
)
{
dev_crit
(
arizona
->
dev
,
"Thermal shutdown
\n
"
);
ret
=
regmap_update_bits
(
arizona
->
regmap
,
ARIZONA_OUTPUT_ENABLES_1
,
ARIZONA_OUT4L_ENA
|
ARIZONA_OUT4R_ENA
,
0
);
if
(
ret
!=
0
)
dev_crit
(
arizona
->
dev
,
"Failed to disable speaker outputs: %d
\n
"
,
ret
);
}
return
IRQ_HANDLED
;
}
static
const
struct
snd_soc_dapm_widget
arizona_spkl
=
SND_SOC_DAPM_PGA_E
(
"OUT4L"
,
SND_SOC_NOPM
,
ARIZONA_OUT4L_ENA_SHIFT
,
0
,
NULL
,
0
,
arizona_spk_ev
,
SND_SOC_DAPM_PRE_PMD
|
SND_SOC_DAPM_POST_PMU
);
static
const
struct
snd_soc_dapm_widget
arizona_spkr
=
SND_SOC_DAPM_PGA_E
(
"OUT4R"
,
SND_SOC_NOPM
,
ARIZONA_OUT4R_ENA_SHIFT
,
0
,
NULL
,
0
,
arizona_spk_ev
,
SND_SOC_DAPM_PRE_PMD
|
SND_SOC_DAPM_POST_PMU
);
int
arizona_init_spk
(
struct
snd_soc_codec
*
codec
)
{
struct
arizona_priv
*
priv
=
snd_soc_codec_get_drvdata
(
codec
);
struct
arizona
*
arizona
=
priv
->
arizona
;
int
ret
;
ret
=
snd_soc_dapm_new_controls
(
&
codec
->
dapm
,
&
arizona_spkl
,
1
);
if
(
ret
!=
0
)
return
ret
;
ret
=
snd_soc_dapm_new_controls
(
&
codec
->
dapm
,
&
arizona_spkr
,
1
);
if
(
ret
!=
0
)
return
ret
;
ret
=
arizona_request_irq
(
arizona
,
ARIZONA_IRQ_SPK_SHUTDOWN_WARN
,
"Thermal warning"
,
arizona_thermal_warn
,
arizona
);
if
(
ret
!=
0
)
dev_err
(
arizona
->
dev
,
"Failed to get thermal warning IRQ: %d
\n
"
,
ret
);
ret
=
arizona_request_irq
(
arizona
,
ARIZONA_IRQ_SPK_SHUTDOWN
,
"Thermal shutdown"
,
arizona_thermal_shutdown
,
arizona
);
if
(
ret
!=
0
)
dev_err
(
arizona
->
dev
,
"Failed to get thermal shutdown IRQ: %d
\n
"
,
ret
);
return
0
;
}
EXPORT_SYMBOL_GPL
(
arizona_init_spk
);
const
char
*
arizona_mixer_texts
[
ARIZONA_NUM_MIXER_INPUTS
]
=
{
"None"
,
"Tone Generator 1"
,
...
...
@@ -274,6 +432,33 @@ EXPORT_SYMBOL_GPL(arizona_mixer_values);
const
DECLARE_TLV_DB_SCALE
(
arizona_mixer_tlv
,
-
3200
,
100
,
0
);
EXPORT_SYMBOL_GPL
(
arizona_mixer_tlv
);
const
char
*
arizona_rate_text
[
ARIZONA_RATE_ENUM_SIZE
]
=
{
"SYNCCLK rate"
,
"8kHz"
,
"16kHz"
,
"ASYNCCLK rate"
,
};
EXPORT_SYMBOL_GPL
(
arizona_rate_text
);
const
int
arizona_rate_val
[
ARIZONA_RATE_ENUM_SIZE
]
=
{
0
,
1
,
2
,
8
,
};
EXPORT_SYMBOL_GPL
(
arizona_rate_val
);
const
struct
soc_enum
arizona_isrc_fsl
[]
=
{
SOC_VALUE_ENUM_SINGLE
(
ARIZONA_ISRC_1_CTRL_2
,
ARIZONA_ISRC1_FSL_SHIFT
,
0xf
,
ARIZONA_RATE_ENUM_SIZE
,
arizona_rate_text
,
arizona_rate_val
),
SOC_VALUE_ENUM_SINGLE
(
ARIZONA_ISRC_2_CTRL_2
,
ARIZONA_ISRC2_FSL_SHIFT
,
0xf
,
ARIZONA_RATE_ENUM_SIZE
,
arizona_rate_text
,
arizona_rate_val
),
SOC_VALUE_ENUM_SINGLE
(
ARIZONA_ISRC_3_CTRL_2
,
ARIZONA_ISRC3_FSL_SHIFT
,
0xf
,
ARIZONA_RATE_ENUM_SIZE
,
arizona_rate_text
,
arizona_rate_val
),
};
EXPORT_SYMBOL_GPL
(
arizona_isrc_fsl
);
static
const
char
*
arizona_vol_ramp_text
[]
=
{
"0ms/6dB"
,
"0.5ms/6dB"
,
"1ms/6dB"
,
"2ms/6dB"
,
"4ms/6dB"
,
"8ms/6dB"
,
"15ms/6dB"
,
"30ms/6dB"
,
...
...
@@ -332,9 +517,27 @@ const struct soc_enum arizona_ng_hold =
4
,
arizona_ng_hold_text
);
EXPORT_SYMBOL_GPL
(
arizona_ng_hold
);
static
void
arizona_in_set_vu
(
struct
snd_soc_codec
*
codec
,
int
ena
)
{
struct
arizona_priv
*
priv
=
snd_soc_codec_get_drvdata
(
codec
);
unsigned
int
val
;
int
i
;
if
(
ena
)
val
=
ARIZONA_IN_VU
;
else
val
=
0
;
for
(
i
=
0
;
i
<
priv
->
num_inputs
;
i
++
)
snd_soc_update_bits
(
codec
,
ARIZONA_ADC_DIGITAL_VOLUME_1L
+
(
i
*
4
),
ARIZONA_IN_VU
,
val
);
}
int
arizona_in_ev
(
struct
snd_soc_dapm_widget
*
w
,
struct
snd_kcontrol
*
kcontrol
,
int
event
)
{
struct
arizona_priv
*
priv
=
snd_soc_codec_get_drvdata
(
w
->
codec
);
unsigned
int
reg
;
if
(
w
->
shift
%
2
)
...
...
@@ -343,13 +546,29 @@ int arizona_in_ev(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol,
reg
=
ARIZONA_ADC_DIGITAL_VOLUME_1R
+
((
w
->
shift
/
2
)
*
8
);
switch
(
event
)
{
case
SND_SOC_DAPM_PRE_PMU
:
priv
->
in_pending
++
;
break
;
case
SND_SOC_DAPM_POST_PMU
:
snd_soc_update_bits
(
w
->
codec
,
reg
,
ARIZONA_IN1L_MUTE
,
0
);
/* If this is the last input pending then allow VU */
priv
->
in_pending
--
;
if
(
priv
->
in_pending
==
0
)
{
msleep
(
1
);
arizona_in_set_vu
(
w
->
codec
,
1
);
}
break
;
case
SND_SOC_DAPM_PRE_PMD
:
snd_soc_update_bits
(
w
->
codec
,
reg
,
ARIZONA_IN1L_MUTE
,
ARIZONA_IN1L_MUTE
);
snd_soc_update_bits
(
w
->
codec
,
reg
,
ARIZONA_IN1L_MUTE
|
ARIZONA_IN_VU
,
ARIZONA_IN1L_MUTE
|
ARIZONA_IN_VU
);
break
;
case
SND_SOC_DAPM_POST_PMD
:
/* Disable volume updates if no inputs are enabled */
reg
=
snd_soc_read
(
w
->
codec
,
ARIZONA_INPUT_ENABLES
);
if
(
reg
==
0
)
arizona_in_set_vu
(
w
->
codec
,
0
);
}
return
0
;
...
...
@@ -360,10 +579,61 @@ int arizona_out_ev(struct snd_soc_dapm_widget *w,
struct
snd_kcontrol
*
kcontrol
,
int
event
)
{
switch
(
event
)
{
case
SND_SOC_DAPM_POST_PMU
:
switch
(
w
->
shift
)
{
case
ARIZONA_OUT1L_ENA_SHIFT
:
case
ARIZONA_OUT1R_ENA_SHIFT
:
case
ARIZONA_OUT2L_ENA_SHIFT
:
case
ARIZONA_OUT2R_ENA_SHIFT
:
case
ARIZONA_OUT3L_ENA_SHIFT
:
case
ARIZONA_OUT3R_ENA_SHIFT
:
msleep
(
17
);
break
;
default:
break
;
}
break
;
}
return
0
;
}
EXPORT_SYMBOL_GPL
(
arizona_out_ev
);
int
arizona_hp_ev
(
struct
snd_soc_dapm_widget
*
w
,
struct
snd_kcontrol
*
kcontrol
,
int
event
)
{
struct
arizona_priv
*
priv
=
snd_soc_codec_get_drvdata
(
w
->
codec
);
unsigned
int
mask
=
1
<<
w
->
shift
;
unsigned
int
val
;
switch
(
event
)
{
case
SND_SOC_DAPM_POST_PMU
:
val
=
mask
;
break
;
case
SND_SOC_DAPM_PRE_PMD
:
val
=
0
;
break
;
default:
return
-
EINVAL
;
}
/* Store the desired state for the HP outputs */
priv
->
arizona
->
hp_ena
&=
~
mask
;
priv
->
arizona
->
hp_ena
|=
val
;
/* Force off if HPDET magic is active */
if
(
priv
->
arizona
->
hpdet_magic
)
val
=
0
;
snd_soc_update_bits
(
w
->
codec
,
ARIZONA_OUTPUT_ENABLES_1
,
mask
,
val
);
return
arizona_out_ev
(
w
,
kcontrol
,
event
);
}
EXPORT_SYMBOL_GPL
(
arizona_hp_ev
);
static
unsigned
int
arizona_sysclk_48k_rates
[]
=
{
6144000
,
12288000
,
...
...
@@ -469,27 +739,27 @@ int arizona_set_sysclk(struct snd_soc_codec *codec, int clk_id,
break
;
case
11289600
:
case
12288000
:
val
|=
1
<<
ARIZONA_SYSCLK_FREQ_SHIFT
;
val
|=
ARIZONA_CLK_12MHZ
<<
ARIZONA_SYSCLK_FREQ_SHIFT
;
break
;
case
22579200
:
case
24576000
:
val
|=
2
<<
ARIZONA_SYSCLK_FREQ_SHIFT
;
val
|=
ARIZONA_CLK_24MHZ
<<
ARIZONA_SYSCLK_FREQ_SHIFT
;
break
;
case
45158400
:
case
49152000
:
val
|=
3
<<
ARIZONA_SYSCLK_FREQ_SHIFT
;
val
|=
ARIZONA_CLK_49MHZ
<<
ARIZONA_SYSCLK_FREQ_SHIFT
;
break
;
case
67737600
:
case
73728000
:
val
|=
4
<<
ARIZONA_SYSCLK_FREQ_SHIFT
;
val
|=
ARIZONA_CLK_73MHZ
<<
ARIZONA_SYSCLK_FREQ_SHIFT
;
break
;
case
90316800
:
case
98304000
:
val
|=
5
<<
ARIZONA_SYSCLK_FREQ_SHIFT
;
val
|=
ARIZONA_CLK_98MHZ
<<
ARIZONA_SYSCLK_FREQ_SHIFT
;
break
;
case
135475200
:
case
147456000
:
val
|=
6
<<
ARIZONA_SYSCLK_FREQ_SHIFT
;
val
|=
ARIZONA_CLK_147MHZ
<<
ARIZONA_SYSCLK_FREQ_SHIFT
;
break
;
case
0
:
dev_dbg
(
arizona
->
dev
,
"%s cleared
\n
"
,
name
);
...
...
@@ -783,7 +1053,7 @@ static int arizona_hw_params(struct snd_pcm_substream *substream,
struct
arizona
*
arizona
=
priv
->
arizona
;
int
base
=
dai
->
driver
->
base
;
const
int
*
rates
;
int
i
,
ret
;
int
i
,
ret
,
val
;
int
chan_limit
=
arizona
->
pdata
.
max_channels_clocked
[
dai
->
id
-
1
];
int
bclk
,
lrclk
,
wl
,
frame
,
bclk_target
;
...
...
@@ -799,6 +1069,13 @@ static int arizona_hw_params(struct snd_pcm_substream *substream,
bclk_target
*=
chan_limit
;
}
/* Force stereo for I2S mode */
val
=
snd_soc_read
(
codec
,
base
+
ARIZONA_AIF_FORMAT
);
if
(
params_channels
(
params
)
==
1
&&
(
val
&
ARIZONA_AIF1_FMT_MASK
))
{
arizona_aif_dbg
(
dai
,
"Forcing stereo mode
\n
"
);
bclk_target
*=
2
;
}
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
arizona_44k1_bclk_rates
);
i
++
)
{
if
(
rates
[
i
]
>=
bclk_target
&&
rates
[
i
]
%
params_rate
(
params
)
==
0
)
{
...
...
@@ -955,6 +1232,16 @@ static struct {
{
1000000
,
13500000
,
0
,
1
},
};
static
struct
{
unsigned
int
min
;
unsigned
int
max
;
u16
gain
;
}
fll_gains
[]
=
{
{
0
,
256000
,
0
},
{
256000
,
1000000
,
2
},
{
1000000
,
13500000
,
4
},
};
struct
arizona_fll_cfg
{
int
n
;
int
theta
;
...
...
@@ -962,6 +1249,7 @@ struct arizona_fll_cfg {
int
refdiv
;
int
outdiv
;
int
fratio
;
int
gain
;
};
static
int
arizona_calc_fll
(
struct
arizona_fll
*
fll
,
...
...
@@ -1021,6 +1309,18 @@ static int arizona_calc_fll(struct arizona_fll *fll,
return
-
EINVAL
;
}
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
fll_gains
);
i
++
)
{
if
(
fll_gains
[
i
].
min
<=
Fref
&&
Fref
<=
fll_gains
[
i
].
max
)
{
cfg
->
gain
=
fll_gains
[
i
].
gain
;
break
;
}
}
if
(
i
==
ARRAY_SIZE
(
fll_gains
))
{
arizona_fll_err
(
fll
,
"Unable to find gain for Fref=%uHz
\n
"
,
Fref
);
return
-
EINVAL
;
}
cfg
->
n
=
target
/
(
ratio
*
Fref
);
if
(
target
%
(
ratio
*
Fref
))
{
...
...
@@ -1048,13 +1348,15 @@ static int arizona_calc_fll(struct arizona_fll *fll,
cfg
->
n
,
cfg
->
theta
,
cfg
->
lambda
);
arizona_fll_dbg
(
fll
,
"FRATIO=%x(%d) OUTDIV=%x REFCLK_DIV=%x
\n
"
,
cfg
->
fratio
,
cfg
->
fratio
,
cfg
->
outdiv
,
cfg
->
refdiv
);
arizona_fll_dbg
(
fll
,
"GAIN=%d
\n
"
,
cfg
->
gain
);
return
0
;
}
static
void
arizona_apply_fll
(
struct
arizona
*
arizona
,
unsigned
int
base
,
struct
arizona_fll_cfg
*
cfg
,
int
source
)
struct
arizona_fll_cfg
*
cfg
,
int
source
,
bool
sync
)
{
regmap_update_bits
(
arizona
->
regmap
,
base
+
3
,
ARIZONA_FLL1_THETA_MASK
,
cfg
->
theta
);
...
...
@@ -1069,87 +1371,84 @@ static void arizona_apply_fll(struct arizona *arizona, unsigned int base,
cfg
->
refdiv
<<
ARIZONA_FLL1_CLK_REF_DIV_SHIFT
|
source
<<
ARIZONA_FLL1_CLK_REF_SRC_SHIFT
);
if
(
sync
)
regmap_update_bits
(
arizona
->
regmap
,
base
+
0x7
,
ARIZONA_FLL1_GAIN_MASK
,
cfg
->
gain
<<
ARIZONA_FLL1_GAIN_SHIFT
);
else
regmap_update_bits
(
arizona
->
regmap
,
base
+
0x9
,
ARIZONA_FLL1_GAIN_MASK
,
cfg
->
gain
<<
ARIZONA_FLL1_GAIN_SHIFT
);
regmap_update_bits
(
arizona
->
regmap
,
base
+
2
,
ARIZONA_FLL1_CTRL_UPD
|
ARIZONA_FLL1_N_MASK
,
ARIZONA_FLL1_CTRL_UPD
|
cfg
->
n
);
}
int
arizona_set_fll
(
struct
arizona_fll
*
fll
,
int
source
,
unsigned
int
Fref
,
unsigned
int
Fout
)
static
bool
arizona_is_enabled_fll
(
struct
arizona_fll
*
fll
)
{
struct
arizona
*
arizona
=
fll
->
arizona
;
struct
arizona_fll_cfg
cfg
,
sync
;
unsigned
int
reg
,
val
;
int
syncsrc
;
bool
ena
;
unsigned
int
reg
;
int
ret
;
if
(
fll
->
fref
==
Fref
&&
fll
->
fout
==
Fout
)
return
0
;
ret
=
regmap_read
(
arizona
->
regmap
,
fll
->
base
+
1
,
&
reg
);
if
(
ret
!=
0
)
{
arizona_fll_err
(
fll
,
"Failed to read current state: %d
\n
"
,
ret
);
return
ret
;
}
ena
=
reg
&
ARIZONA_FLL1_ENA
;
if
(
Fout
)
{
/* Do we have a 32kHz reference? */
regmap_read
(
arizona
->
regmap
,
ARIZONA_CLOCK_32K_1
,
&
val
);
switch
(
val
&
ARIZONA_CLK_32K_SRC_MASK
)
{
case
ARIZONA_CLK_SRC_MCLK1
:
case
ARIZONA_CLK_SRC_MCLK2
:
syncsrc
=
val
&
ARIZONA_CLK_32K_SRC_MASK
;
break
;
default:
syncsrc
=
-
1
;
}
return
reg
&
ARIZONA_FLL1_ENA
;
}
if
(
source
==
syncsrc
)
syncsrc
=
-
1
;
static
void
arizona_enable_fll
(
struct
arizona_fll
*
fll
,
struct
arizona_fll_cfg
*
ref
,
struct
arizona_fll_cfg
*
sync
)
{
struct
arizona
*
arizona
=
fll
->
arizona
;
int
ret
;
if
(
syncsrc
>=
0
)
{
ret
=
arizona_calc_fll
(
fll
,
&
sync
,
Fref
,
Fout
);
if
(
ret
!=
0
)
return
ret
;
/*
* If we have both REFCLK and SYNCCLK then enable both,
* otherwise apply the SYNCCLK settings to REFCLK.
*/
if
(
fll
->
ref_src
>=
0
&&
fll
->
ref_src
!=
fll
->
sync_src
)
{
regmap_update_bits
(
arizona
->
regmap
,
fll
->
base
+
5
,
ARIZONA_FLL1_OUTDIV_MASK
,
ref
->
outdiv
<<
ARIZONA_FLL1_OUTDIV_SHIFT
);
arizona_apply_fll
(
arizona
,
fll
->
base
,
ref
,
fll
->
ref_src
,
false
);
if
(
fll
->
sync_src
>=
0
)
arizona_apply_fll
(
arizona
,
fll
->
base
+
0x10
,
sync
,
fll
->
sync_src
,
true
);
}
else
if
(
fll
->
sync_src
>=
0
)
{
regmap_update_bits
(
arizona
->
regmap
,
fll
->
base
+
5
,
ARIZONA_FLL1_OUTDIV_MASK
,
sync
->
outdiv
<<
ARIZONA_FLL1_OUTDIV_SHIFT
);
arizona_apply_fll
(
arizona
,
fll
->
base
,
sync
,
fll
->
sync_src
,
false
);
ret
=
arizona_calc_fll
(
fll
,
&
cfg
,
32768
,
Fout
);
if
(
ret
!=
0
)
return
ret
;
}
else
{
ret
=
arizona_calc_fll
(
fll
,
&
cfg
,
Fref
,
Fout
);
if
(
ret
!=
0
)
return
ret
;
}
}
else
{
regmap_update_bits
(
arizona
->
regmap
,
fll
->
base
+
1
,
ARIZONA_FLL1_ENA
,
0
);
regmap_update_bits
(
arizona
->
regmap
,
fll
->
base
+
0x11
,
ARIZONA_FLL1_SYNC_ENA
,
0
);
if
(
ena
)
pm_runtime_put_autosuspend
(
arizona
->
dev
);
fll
->
fref
=
Fref
;
fll
->
fout
=
Fout
;
return
0
;
}
regmap_update_bits
(
arizona
->
regmap
,
fll
->
base
+
5
,
ARIZONA_FLL1_OUTDIV_MASK
,
cfg
.
outdiv
<<
ARIZONA_FLL1_OUTDIV_SHIFT
);
if
(
syncsrc
>=
0
)
{
arizona_apply_fll
(
arizona
,
fll
->
base
,
&
cfg
,
syncsrc
);
arizona_apply_fll
(
arizona
,
fll
->
base
+
0x10
,
&
sync
,
source
);
}
else
{
arizona_apply_fll
(
arizona
,
fll
->
base
,
&
cfg
,
source
);
arizona_fll_err
(
fll
,
"No clocks provided
\n
"
);
return
;
}
if
(
!
ena
)
/*
* Increase the bandwidth if we're not using a low frequency
* sync source.
*/
if
(
fll
->
sync_src
>=
0
&&
fll
->
sync_freq
>
100000
)
regmap_update_bits
(
arizona
->
regmap
,
fll
->
base
+
0x17
,
ARIZONA_FLL1_SYNC_BW
,
0
);
else
regmap_update_bits
(
arizona
->
regmap
,
fll
->
base
+
0x17
,
ARIZONA_FLL1_SYNC_BW
,
ARIZONA_FLL1_SYNC_BW
);
if
(
!
arizona_is_enabled_fll
(
fll
))
pm_runtime_get
(
arizona
->
dev
);
/* Clear any pending completions */
...
...
@@ -1157,7 +1456,8 @@ int arizona_set_fll(struct arizona_fll *fll, int source,
regmap_update_bits
(
arizona
->
regmap
,
fll
->
base
+
1
,
ARIZONA_FLL1_ENA
,
ARIZONA_FLL1_ENA
);
if
(
syncsrc
>=
0
)
if
(
fll
->
ref_src
>=
0
&&
fll
->
sync_src
>=
0
&&
fll
->
ref_src
!=
fll
->
sync_src
)
regmap_update_bits
(
arizona
->
regmap
,
fll
->
base
+
0x11
,
ARIZONA_FLL1_SYNC_ENA
,
ARIZONA_FLL1_SYNC_ENA
);
...
...
@@ -1166,10 +1466,88 @@ int arizona_set_fll(struct arizona_fll *fll, int source,
msecs_to_jiffies
(
250
));
if
(
ret
==
0
)
arizona_fll_warn
(
fll
,
"Timed out waiting for lock
\n
"
);
}
static
void
arizona_disable_fll
(
struct
arizona_fll
*
fll
)
{
struct
arizona
*
arizona
=
fll
->
arizona
;
bool
change
;
regmap_update_bits_check
(
arizona
->
regmap
,
fll
->
base
+
1
,
ARIZONA_FLL1_ENA
,
0
,
&
change
);
regmap_update_bits
(
arizona
->
regmap
,
fll
->
base
+
0x11
,
ARIZONA_FLL1_SYNC_ENA
,
0
);
if
(
change
)
pm_runtime_put_autosuspend
(
arizona
->
dev
);
}
int
arizona_set_fll_refclk
(
struct
arizona_fll
*
fll
,
int
source
,
unsigned
int
Fref
,
unsigned
int
Fout
)
{
struct
arizona_fll_cfg
ref
,
sync
;
int
ret
;
if
(
fll
->
ref_src
==
source
&&
fll
->
ref_freq
==
Fref
)
return
0
;
if
(
fll
->
fout
&&
Fref
>
0
)
{
ret
=
arizona_calc_fll
(
fll
,
&
ref
,
Fref
,
fll
->
fout
);
if
(
ret
!=
0
)
return
ret
;
if
(
fll
->
sync_src
>=
0
)
{
ret
=
arizona_calc_fll
(
fll
,
&
sync
,
fll
->
sync_freq
,
fll
->
fout
);
if
(
ret
!=
0
)
return
ret
;
}
}
fll
->
ref_src
=
source
;
fll
->
ref_freq
=
Fref
;
fll
->
fref
=
Fref
;
if
(
fll
->
fout
&&
Fref
>
0
)
{
arizona_enable_fll
(
fll
,
&
ref
,
&
sync
);
}
return
0
;
}
EXPORT_SYMBOL_GPL
(
arizona_set_fll_refclk
);
int
arizona_set_fll
(
struct
arizona_fll
*
fll
,
int
source
,
unsigned
int
Fref
,
unsigned
int
Fout
)
{
struct
arizona_fll_cfg
ref
,
sync
;
int
ret
;
if
(
fll
->
sync_src
==
source
&&
fll
->
sync_freq
==
Fref
&&
fll
->
fout
==
Fout
)
return
0
;
if
(
Fout
)
{
if
(
fll
->
ref_src
>=
0
)
{
ret
=
arizona_calc_fll
(
fll
,
&
ref
,
fll
->
ref_freq
,
Fout
);
if
(
ret
!=
0
)
return
ret
;
}
ret
=
arizona_calc_fll
(
fll
,
&
sync
,
Fref
,
Fout
);
if
(
ret
!=
0
)
return
ret
;
}
fll
->
sync_src
=
source
;
fll
->
sync_freq
=
Fref
;
fll
->
fout
=
Fout
;
if
(
Fout
)
{
arizona_enable_fll
(
fll
,
&
ref
,
&
sync
);
}
else
{
arizona_disable_fll
(
fll
);
}
return
0
;
}
EXPORT_SYMBOL_GPL
(
arizona_set_fll
);
...
...
@@ -1178,12 +1556,26 @@ int arizona_init_fll(struct arizona *arizona, int id, int base, int lock_irq,
int
ok_irq
,
struct
arizona_fll
*
fll
)
{
int
ret
;
unsigned
int
val
;
init_completion
(
&
fll
->
ok
);
fll
->
id
=
id
;
fll
->
base
=
base
;
fll
->
arizona
=
arizona
;
fll
->
sync_src
=
ARIZONA_FLL_SRC_NONE
;
/* Configure default refclk to 32kHz if we have one */
regmap_read
(
arizona
->
regmap
,
ARIZONA_CLOCK_32K_1
,
&
val
);
switch
(
val
&
ARIZONA_CLK_32K_SRC_MASK
)
{
case
ARIZONA_CLK_SRC_MCLK1
:
case
ARIZONA_CLK_SRC_MCLK2
:
fll
->
ref_src
=
val
&
ARIZONA_CLK_32K_SRC_MASK
;
break
;
default:
fll
->
ref_src
=
ARIZONA_FLL_SRC_NONE
;
}
fll
->
ref_freq
=
32768
;
snprintf
(
fll
->
lock_name
,
sizeof
(
fll
->
lock_name
),
"FLL%d lock"
,
id
);
snprintf
(
fll
->
clock_ok_name
,
sizeof
(
fll
->
clock_ok_name
),
...
...
sound/soc/codecs/arizona.h
View file @
a18d5151
...
...
@@ -32,6 +32,7 @@
#define ARIZONA_CLK_SRC_AIF2BCLK 0x9
#define ARIZONA_CLK_SRC_AIF3BCLK 0xa
#define ARIZONA_FLL_SRC_NONE -1
#define ARIZONA_FLL_SRC_MCLK1 0
#define ARIZONA_FLL_SRC_MCLK2 1
#define ARIZONA_FLL_SRC_SLIMCLK 3
...
...
@@ -48,6 +49,14 @@
#define ARIZONA_MIXER_VOL_SHIFT 1
#define ARIZONA_MIXER_VOL_WIDTH 7
#define ARIZONA_CLK_6MHZ 0
#define ARIZONA_CLK_12MHZ 1
#define ARIZONA_CLK_24MHZ 2
#define ARIZONA_CLK_49MHZ 3
#define ARIZONA_CLK_73MHZ 4
#define ARIZONA_CLK_98MHZ 5
#define ARIZONA_CLK_147MHZ 6
#define ARIZONA_MAX_DAI 4
#define ARIZONA_MAX_ADSP 4
...
...
@@ -64,6 +73,12 @@ struct arizona_priv {
int
sysclk
;
int
asyncclk
;
struct
arizona_dai_priv
dai
[
ARIZONA_MAX_DAI
];
int
num_inputs
;
unsigned
int
in_pending
;
unsigned
int
spk_ena
:
2
;
unsigned
int
spk_ena_pending
:
1
;
};
#define ARIZONA_NUM_MIXER_INPUTS 99
...
...
@@ -165,6 +180,12 @@ extern int arizona_mixer_values[ARIZONA_NUM_MIXER_INPUTS];
ARIZONA_MIXER_ROUTES(name, name "L"), \
ARIZONA_MIXER_ROUTES(name, name "R")
#define ARIZONA_RATE_ENUM_SIZE 4
extern
const
char
*
arizona_rate_text
[
ARIZONA_RATE_ENUM_SIZE
];
extern
const
int
arizona_rate_val
[
ARIZONA_RATE_ENUM_SIZE
];
extern
const
struct
soc_enum
arizona_isrc_fsl
[];
extern
const
struct
soc_enum
arizona_in_vi_ramp
;
extern
const
struct
soc_enum
arizona_in_vd_ramp
;
...
...
@@ -184,6 +205,9 @@ extern int arizona_in_ev(struct snd_soc_dapm_widget *w,
extern
int
arizona_out_ev
(
struct
snd_soc_dapm_widget
*
w
,
struct
snd_kcontrol
*
kcontrol
,
int
event
);
extern
int
arizona_hp_ev
(
struct
snd_soc_dapm_widget
*
w
,
struct
snd_kcontrol
*
kcontrol
,
int
event
);
extern
int
arizona_set_sysclk
(
struct
snd_soc_codec
*
codec
,
int
clk_id
,
int
source
,
unsigned
int
freq
,
int
dir
);
...
...
@@ -198,8 +222,12 @@ struct arizona_fll {
unsigned
int
base
;
unsigned
int
vco_mult
;
struct
completion
ok
;
unsigned
int
fref
;
unsigned
int
fout
;
int
sync_src
;
unsigned
int
sync_freq
;
int
ref_src
;
unsigned
int
ref_freq
;
char
lock_name
[
ARIZONA_FLL_NAME_LEN
];
char
clock_ok_name
[
ARIZONA_FLL_NAME_LEN
];
...
...
@@ -207,9 +235,13 @@ struct arizona_fll {
extern
int
arizona_init_fll
(
struct
arizona
*
arizona
,
int
id
,
int
base
,
int
lock_irq
,
int
ok_irq
,
struct
arizona_fll
*
fll
);
extern
int
arizona_set_fll_refclk
(
struct
arizona_fll
*
fll
,
int
source
,
unsigned
int
Fref
,
unsigned
int
Fout
);
extern
int
arizona_set_fll
(
struct
arizona_fll
*
fll
,
int
source
,
unsigned
int
Fref
,
unsigned
int
Fout
);
extern
int
arizona_init_spk
(
struct
snd_soc_codec
*
codec
);
extern
int
arizona_init_dai
(
struct
arizona_priv
*
priv
,
int
dai
);
int
arizona_set_output_mode
(
struct
snd_soc_codec
*
codec
,
int
output
,
...
...
sound/soc/codecs/wm2200.c
View file @
a18d5151
...
...
@@ -1565,7 +1565,7 @@ static int wm2200_probe(struct snd_soc_codec *codec)
return
ret
;
}
ret
=
snd_soc_add_codec_controls
(
codec
,
wm_adsp_fw_controls
,
2
);
ret
=
snd_soc_add_codec_controls
(
codec
,
wm_adsp
1
_fw_controls
,
2
);
if
(
ret
!=
0
)
return
ret
;
...
...
sound/soc/codecs/wm5102.c
View file @
a18d5151
...
...
@@ -36,9 +36,6 @@
struct
wm5102_priv
{
struct
arizona_priv
core
;
struct
arizona_fll
fll
[
2
];
unsigned
int
spk_ena
:
2
;
unsigned
int
spk_ena_pending
:
1
;
};
static
DECLARE_TLV_DB_SCALE
(
ana_tlv
,
0
,
100
,
0
);
...
...
@@ -615,6 +612,26 @@ static int wm5102_sysclk_ev(struct snd_soc_dapm_widget *w,
return
0
;
}
static
const
char
*
wm5102_osr_text
[]
=
{
"Low power"
,
"Normal"
,
"High performance"
,
};
static
const
unsigned
int
wm5102_osr_val
[]
=
{
0x0
,
0x3
,
0x5
,
};
static
const
struct
soc_enum
wm5102_hpout_osr
[]
=
{
SOC_VALUE_ENUM_SINGLE
(
ARIZONA_OUTPUT_PATH_CONFIG_1L
,
ARIZONA_OUT1_OSR_SHIFT
,
0x7
,
3
,
wm5102_osr_text
,
wm5102_osr_val
),
SOC_VALUE_ENUM_SINGLE
(
ARIZONA_OUTPUT_PATH_CONFIG_2L
,
ARIZONA_OUT2_OSR_SHIFT
,
0x7
,
3
,
wm5102_osr_text
,
wm5102_osr_val
),
SOC_VALUE_ENUM_SINGLE
(
ARIZONA_OUTPUT_PATH_CONFIG_3L
,
ARIZONA_OUT3_OSR_SHIFT
,
0x7
,
3
,
wm5102_osr_text
,
wm5102_osr_val
),
};
#define WM5102_NG_SRC(name, base) \
SOC_SINGLE(name " NG HPOUT1L Switch", base, 0, 1, 0), \
SOC_SINGLE(name " NG HPOUT1R Switch", base, 1, 1, 0), \
...
...
@@ -745,6 +762,9 @@ SOC_ENUM("LHPF2 Mode", arizona_lhpf2_mode),
SOC_ENUM
(
"LHPF3 Mode"
,
arizona_lhpf3_mode
),
SOC_ENUM
(
"LHPF4 Mode"
,
arizona_lhpf4_mode
),
SOC_VALUE_ENUM
(
"ISRC1 FSL"
,
arizona_isrc_fsl
[
0
]),
SOC_VALUE_ENUM
(
"ISRC2 FSL"
,
arizona_isrc_fsl
[
1
]),
ARIZONA_MIXER_CONTROLS
(
"Mic"
,
ARIZONA_MICMIX_INPUT_1_SOURCE
),
ARIZONA_MIXER_CONTROLS
(
"Noise"
,
ARIZONA_NOISEMIX_INPUT_1_SOURCE
),
...
...
@@ -761,6 +781,8 @@ ARIZONA_MIXER_CONTROLS("SPKOUTR", ARIZONA_OUT4RMIX_INPUT_1_SOURCE),
ARIZONA_MIXER_CONTROLS
(
"SPKDAT1L"
,
ARIZONA_OUT5LMIX_INPUT_1_SOURCE
),
ARIZONA_MIXER_CONTROLS
(
"SPKDAT1R"
,
ARIZONA_OUT5RMIX_INPUT_1_SOURCE
),
SOC_SINGLE
(
"Speaker High Performance Switch"
,
ARIZONA_OUTPUT_PATH_CONFIG_4L
,
ARIZONA_OUT4_OSR_SHIFT
,
1
,
0
),
SOC_SINGLE
(
"SPKDAT1 High Performance Switch"
,
ARIZONA_OUTPUT_PATH_CONFIG_5L
,
ARIZONA_OUT5_OSR_SHIFT
,
1
,
0
),
...
...
@@ -790,6 +812,10 @@ SOC_DOUBLE_R_TLV("SPKDAT1 Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_5L,
ARIZONA_DAC_DIGITAL_VOLUME_5R
,
ARIZONA_OUT5L_VOL_SHIFT
,
0xbf
,
0
,
digital_tlv
),
SOC_VALUE_ENUM
(
"HPOUT1 OSR"
,
wm5102_hpout_osr
[
0
]),
SOC_VALUE_ENUM
(
"HPOUT2 OSR"
,
wm5102_hpout_osr
[
1
]),
SOC_VALUE_ENUM
(
"HPOUT3 OSR"
,
wm5102_hpout_osr
[
2
]),
SOC_ENUM
(
"Output Ramp Up"
,
arizona_out_vi_ramp
),
SOC_ENUM
(
"Output Ramp Down"
,
arizona_out_vd_ramp
),
...
...
@@ -828,47 +854,6 @@ ARIZONA_MIXER_CONTROLS("AIF3TX1", ARIZONA_AIF3TX1MIX_INPUT_1_SOURCE),
ARIZONA_MIXER_CONTROLS
(
"AIF3TX2"
,
ARIZONA_AIF3TX2MIX_INPUT_1_SOURCE
),
};
static
int
wm5102_spk_ev
(
struct
snd_soc_dapm_widget
*
w
,
struct
snd_kcontrol
*
kcontrol
,
int
event
)
{
struct
snd_soc_codec
*
codec
=
w
->
codec
;
struct
arizona
*
arizona
=
dev_get_drvdata
(
codec
->
dev
->
parent
);
struct
wm5102_priv
*
wm5102
=
snd_soc_codec_get_drvdata
(
codec
);
if
(
arizona
->
rev
<
1
)
return
0
;
switch
(
event
)
{
case
SND_SOC_DAPM_PRE_PMU
:
if
(
!
wm5102
->
spk_ena
)
{
snd_soc_write
(
codec
,
0x4f5
,
0x25a
);
wm5102
->
spk_ena_pending
=
true
;
}
break
;
case
SND_SOC_DAPM_POST_PMU
:
if
(
wm5102
->
spk_ena_pending
)
{
msleep
(
75
);
snd_soc_write
(
codec
,
0x4f5
,
0xda
);
wm5102
->
spk_ena_pending
=
false
;
wm5102
->
spk_ena
++
;
}
break
;
case
SND_SOC_DAPM_PRE_PMD
:
wm5102
->
spk_ena
--
;
if
(
!
wm5102
->
spk_ena
)
snd_soc_write
(
codec
,
0x4f5
,
0x25a
);
break
;
case
SND_SOC_DAPM_POST_PMD
:
if
(
!
wm5102
->
spk_ena
)
snd_soc_write
(
codec
,
0x4f5
,
0x0da
);
break
;
}
return
0
;
}
ARIZONA_MIXER_ENUMS
(
EQ1
,
ARIZONA_EQ1MIX_INPUT_1_SOURCE
);
ARIZONA_MIXER_ENUMS
(
EQ2
,
ARIZONA_EQ2MIX_INPUT_1_SOURCE
);
ARIZONA_MIXER_ENUMS
(
EQ3
,
ARIZONA_EQ3MIX_INPUT_1_SOURCE
);
...
...
@@ -984,22 +969,28 @@ SND_SOC_DAPM_INPUT("IN3R"),
SND_SOC_DAPM_PGA_E
(
"IN1L PGA"
,
ARIZONA_INPUT_ENABLES
,
ARIZONA_IN1L_ENA_SHIFT
,
0
,
NULL
,
0
,
arizona_in_ev
,
SND_SOC_DAPM_PRE_PMD
|
SND_SOC_DAPM_POST_PMU
),
SND_SOC_DAPM_PRE_PMD
|
SND_SOC_DAPM_POST_PMD
|
SND_SOC_DAPM_PRE_PMU
|
SND_SOC_DAPM_POST_PMU
),
SND_SOC_DAPM_PGA_E
(
"IN1R PGA"
,
ARIZONA_INPUT_ENABLES
,
ARIZONA_IN1R_ENA_SHIFT
,
0
,
NULL
,
0
,
arizona_in_ev
,
SND_SOC_DAPM_PRE_PMD
|
SND_SOC_DAPM_POST_PMU
),
SND_SOC_DAPM_PRE_PMD
|
SND_SOC_DAPM_POST_PMD
|
SND_SOC_DAPM_PRE_PMU
|
SND_SOC_DAPM_POST_PMU
),
SND_SOC_DAPM_PGA_E
(
"IN2L PGA"
,
ARIZONA_INPUT_ENABLES
,
ARIZONA_IN2L_ENA_SHIFT
,
0
,
NULL
,
0
,
arizona_in_ev
,
SND_SOC_DAPM_PRE_PMD
|
SND_SOC_DAPM_POST_PMU
),
SND_SOC_DAPM_PRE_PMD
|
SND_SOC_DAPM_POST_PMD
|
SND_SOC_DAPM_PRE_PMU
|
SND_SOC_DAPM_POST_PMU
),
SND_SOC_DAPM_PGA_E
(
"IN2R PGA"
,
ARIZONA_INPUT_ENABLES
,
ARIZONA_IN2R_ENA_SHIFT
,
0
,
NULL
,
0
,
arizona_in_ev
,
SND_SOC_DAPM_PRE_PMD
|
SND_SOC_DAPM_POST_PMU
),
SND_SOC_DAPM_PRE_PMD
|
SND_SOC_DAPM_POST_PMD
|
SND_SOC_DAPM_PRE_PMU
|
SND_SOC_DAPM_POST_PMU
),
SND_SOC_DAPM_PGA_E
(
"IN3L PGA"
,
ARIZONA_INPUT_ENABLES
,
ARIZONA_IN3L_ENA_SHIFT
,
0
,
NULL
,
0
,
arizona_in_ev
,
SND_SOC_DAPM_PRE_PMD
|
SND_SOC_DAPM_POST_PMU
),
SND_SOC_DAPM_PRE_PMD
|
SND_SOC_DAPM_POST_PMD
|
SND_SOC_DAPM_PRE_PMU
|
SND_SOC_DAPM_POST_PMU
),
SND_SOC_DAPM_PGA_E
(
"IN3R PGA"
,
ARIZONA_INPUT_ENABLES
,
ARIZONA_IN3R_ENA_SHIFT
,
0
,
NULL
,
0
,
arizona_in_ev
,
SND_SOC_DAPM_PRE_PMD
|
SND_SOC_DAPM_POST_PMU
),
SND_SOC_DAPM_PRE_PMD
|
SND_SOC_DAPM_POST_PMD
|
SND_SOC_DAPM_PRE_PMU
|
SND_SOC_DAPM_POST_PMU
),
SND_SOC_DAPM_SUPPLY
(
"MICBIAS1"
,
ARIZONA_MIC_BIAS_CTRL_1
,
ARIZONA_MICB1_ENA_SHIFT
,
0
,
NULL
,
0
),
...
...
@@ -1131,11 +1122,11 @@ ARIZONA_DSP_WIDGETS(DSP1, "DSP1"),
SND_SOC_DAPM_VALUE_MUX
(
"AEC Loopback"
,
ARIZONA_DAC_AEC_CONTROL_1
,
ARIZONA_AEC_LOOPBACK_ENA
,
0
,
&
wm5102_aec_loopback_mux
),
SND_SOC_DAPM_PGA_E
(
"OUT1L"
,
ARIZONA_OUTPUT_ENABLES_1
,
ARIZONA_OUT1L_ENA_SHIFT
,
0
,
NULL
,
0
,
arizona_
out
_ev
,
SND_SOC_DAPM_PGA_E
(
"OUT1L"
,
SND_SOC_NOPM
,
ARIZONA_OUT1L_ENA_SHIFT
,
0
,
NULL
,
0
,
arizona_
hp
_ev
,
SND_SOC_DAPM_PRE_PMD
|
SND_SOC_DAPM_POST_PMU
),
SND_SOC_DAPM_PGA_E
(
"OUT1R"
,
ARIZONA_OUTPUT_ENABLES_1
,
ARIZONA_OUT1R_ENA_SHIFT
,
0
,
NULL
,
0
,
arizona_
out
_ev
,
SND_SOC_DAPM_PGA_E
(
"OUT1R"
,
SND_SOC_NOPM
,
ARIZONA_OUT1R_ENA_SHIFT
,
0
,
NULL
,
0
,
arizona_
hp
_ev
,
SND_SOC_DAPM_PRE_PMD
|
SND_SOC_DAPM_POST_PMU
),
SND_SOC_DAPM_PGA_E
(
"OUT2L"
,
ARIZONA_OUTPUT_ENABLES_1
,
ARIZONA_OUT2L_ENA_SHIFT
,
0
,
NULL
,
0
,
arizona_out_ev
,
...
...
@@ -1146,12 +1137,6 @@ SND_SOC_DAPM_PGA_E("OUT2R", ARIZONA_OUTPUT_ENABLES_1,
SND_SOC_DAPM_PGA_E
(
"OUT3L"
,
ARIZONA_OUTPUT_ENABLES_1
,
ARIZONA_OUT3L_ENA_SHIFT
,
0
,
NULL
,
0
,
arizona_out_ev
,
SND_SOC_DAPM_PRE_PMD
|
SND_SOC_DAPM_POST_PMU
),
SND_SOC_DAPM_PGA_E
(
"OUT4L"
,
ARIZONA_OUTPUT_ENABLES_1
,
ARIZONA_OUT4L_ENA_SHIFT
,
0
,
NULL
,
0
,
wm5102_spk_ev
,
SND_SOC_DAPM_PRE_PMD
|
SND_SOC_DAPM_POST_PMU
),
SND_SOC_DAPM_PGA_E
(
"OUT4R"
,
ARIZONA_OUTPUT_ENABLES_1
,
ARIZONA_OUT4R_ENA_SHIFT
,
0
,
NULL
,
0
,
wm5102_spk_ev
,
SND_SOC_DAPM_PRE_PMD
|
SND_SOC_DAPM_POST_PMU
),
SND_SOC_DAPM_PGA_E
(
"OUT5L"
,
ARIZONA_OUTPUT_ENABLES_1
,
ARIZONA_OUT5L_ENA_SHIFT
,
0
,
NULL
,
0
,
arizona_out_ev
,
SND_SOC_DAPM_PRE_PMD
|
SND_SOC_DAPM_POST_PMU
),
...
...
@@ -1494,6 +1479,12 @@ static int wm5102_set_fll(struct snd_soc_codec *codec, int fll_id, int source,
return
arizona_set_fll
(
&
wm5102
->
fll
[
0
],
source
,
Fref
,
Fout
);
case
WM5102_FLL2
:
return
arizona_set_fll
(
&
wm5102
->
fll
[
1
],
source
,
Fref
,
Fout
);
case
WM5102_FLL1_REFCLK
:
return
arizona_set_fll_refclk
(
&
wm5102
->
fll
[
0
],
source
,
Fref
,
Fout
);
case
WM5102_FLL2_REFCLK
:
return
arizona_set_fll_refclk
(
&
wm5102
->
fll
[
1
],
source
,
Fref
,
Fout
);
default:
return
-
EINVAL
;
}
...
...
@@ -1581,10 +1572,12 @@ static int wm5102_codec_probe(struct snd_soc_codec *codec)
if
(
ret
!=
0
)
return
ret
;
ret
=
snd_soc_add_codec_controls
(
codec
,
wm_adsp
_fw_controls
,
1
);
ret
=
snd_soc_add_codec_controls
(
codec
,
wm_adsp
2_fw_controls
,
2
);
if
(
ret
!=
0
)
return
ret
;
arizona_init_spk
(
codec
);
snd_soc_dapm_disable_pin
(
&
codec
->
dapm
,
"HAPTICS"
);
priv
->
core
.
arizona
->
dapm
=
&
codec
->
dapm
;
...
...
@@ -1604,13 +1597,6 @@ static int wm5102_codec_remove(struct snd_soc_codec *codec)
#define WM5102_DIG_VU 0x0200
static
unsigned
int
wm5102_digital_vu
[]
=
{
ARIZONA_ADC_DIGITAL_VOLUME_1L
,
ARIZONA_ADC_DIGITAL_VOLUME_1R
,
ARIZONA_ADC_DIGITAL_VOLUME_2L
,
ARIZONA_ADC_DIGITAL_VOLUME_2R
,
ARIZONA_ADC_DIGITAL_VOLUME_3L
,
ARIZONA_ADC_DIGITAL_VOLUME_3R
,
ARIZONA_DAC_DIGITAL_VOLUME_1L
,
ARIZONA_DAC_DIGITAL_VOLUME_1R
,
ARIZONA_DAC_DIGITAL_VOLUME_2L
,
...
...
@@ -1653,6 +1639,7 @@ static int wm5102_probe(struct platform_device *pdev)
platform_set_drvdata
(
pdev
,
wm5102
);
wm5102
->
core
.
arizona
=
arizona
;
wm5102
->
core
.
num_inputs
=
6
;
wm5102
->
core
.
adsp
[
0
].
part
=
"wm5102"
;
wm5102
->
core
.
adsp
[
0
].
num
=
1
;
...
...
@@ -1677,6 +1664,12 @@ static int wm5102_probe(struct platform_device *pdev)
ARIZONA_IRQ_FLL2_LOCK
,
ARIZONA_IRQ_FLL2_CLOCK_OK
,
&
wm5102
->
fll
[
1
]);
/* SR2 fixed at 8kHz, SR3 fixed at 16kHz */
regmap_update_bits
(
arizona
->
regmap
,
ARIZONA_SAMPLE_RATE_2
,
ARIZONA_SAMPLE_RATE_2_MASK
,
0x11
);
regmap_update_bits
(
arizona
->
regmap
,
ARIZONA_SAMPLE_RATE_3
,
ARIZONA_SAMPLE_RATE_3_MASK
,
0x12
);
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
wm5102_dai
);
i
++
)
arizona_init_dai
(
&
wm5102
->
core
,
i
);
...
...
sound/soc/codecs/wm5102.h
View file @
a18d5151
...
...
@@ -15,7 +15,9 @@
#include "arizona.h"
#define WM5102_FLL1 1
#define WM5102_FLL2 2
#define WM5102_FLL1 1
#define WM5102_FLL2 2
#define WM5102_FLL1_REFCLK 3
#define WM5102_FLL2_REFCLK 4
#endif
sound/soc/codecs/wm5110.c
View file @
a18d5151
...
...
@@ -416,28 +416,36 @@ SND_SOC_DAPM_INPUT("IN4R"),
SND_SOC_DAPM_PGA_E
(
"IN1L PGA"
,
ARIZONA_INPUT_ENABLES
,
ARIZONA_IN1L_ENA_SHIFT
,
0
,
NULL
,
0
,
arizona_in_ev
,
SND_SOC_DAPM_PRE_PMD
|
SND_SOC_DAPM_POST_PMU
),
SND_SOC_DAPM_PRE_PMD
|
SND_SOC_DAPM_POST_PMD
|
SND_SOC_DAPM_PRE_PMU
|
SND_SOC_DAPM_POST_PMU
),
SND_SOC_DAPM_PGA_E
(
"IN1R PGA"
,
ARIZONA_INPUT_ENABLES
,
ARIZONA_IN1R_ENA_SHIFT
,
0
,
NULL
,
0
,
arizona_in_ev
,
SND_SOC_DAPM_PRE_PMD
|
SND_SOC_DAPM_POST_PMU
),
SND_SOC_DAPM_PRE_PMD
|
SND_SOC_DAPM_POST_PMD
|
SND_SOC_DAPM_PRE_PMU
|
SND_SOC_DAPM_POST_PMU
),
SND_SOC_DAPM_PGA_E
(
"IN2L PGA"
,
ARIZONA_INPUT_ENABLES
,
ARIZONA_IN2L_ENA_SHIFT
,
0
,
NULL
,
0
,
arizona_in_ev
,
SND_SOC_DAPM_PRE_PMD
|
SND_SOC_DAPM_POST_PMU
),
SND_SOC_DAPM_PRE_PMD
|
SND_SOC_DAPM_POST_PMD
|
SND_SOC_DAPM_PRE_PMU
|
SND_SOC_DAPM_POST_PMU
),
SND_SOC_DAPM_PGA_E
(
"IN2R PGA"
,
ARIZONA_INPUT_ENABLES
,
ARIZONA_IN2R_ENA_SHIFT
,
0
,
NULL
,
0
,
arizona_in_ev
,
SND_SOC_DAPM_PRE_PMD
|
SND_SOC_DAPM_POST_PMU
),
SND_SOC_DAPM_PRE_PMD
|
SND_SOC_DAPM_POST_PMD
|
SND_SOC_DAPM_PRE_PMU
|
SND_SOC_DAPM_POST_PMU
),
SND_SOC_DAPM_PGA_E
(
"IN3L PGA"
,
ARIZONA_INPUT_ENABLES
,
ARIZONA_IN3L_ENA_SHIFT
,
0
,
NULL
,
0
,
arizona_in_ev
,
SND_SOC_DAPM_PRE_PMD
|
SND_SOC_DAPM_POST_PMU
),
SND_SOC_DAPM_PRE_PMD
|
SND_SOC_DAPM_POST_PMD
|
SND_SOC_DAPM_PRE_PMU
|
SND_SOC_DAPM_POST_PMU
),
SND_SOC_DAPM_PGA_E
(
"IN3R PGA"
,
ARIZONA_INPUT_ENABLES
,
ARIZONA_IN3R_ENA_SHIFT
,
0
,
NULL
,
0
,
arizona_in_ev
,
SND_SOC_DAPM_PRE_PMD
|
SND_SOC_DAPM_POST_PMU
),
SND_SOC_DAPM_PRE_PMD
|
SND_SOC_DAPM_POST_PMD
|
SND_SOC_DAPM_PRE_PMU
|
SND_SOC_DAPM_POST_PMU
),
SND_SOC_DAPM_PGA_E
(
"IN4L PGA"
,
ARIZONA_INPUT_ENABLES
,
ARIZONA_IN4L_ENA_SHIFT
,
0
,
NULL
,
0
,
arizona_in_ev
,
SND_SOC_DAPM_PRE_PMD
|
SND_SOC_DAPM_POST_PMU
),
SND_SOC_DAPM_PRE_PMD
|
SND_SOC_DAPM_POST_PMD
|
SND_SOC_DAPM_PRE_PMU
|
SND_SOC_DAPM_POST_PMU
),
SND_SOC_DAPM_PGA_E
(
"IN4R PGA"
,
ARIZONA_INPUT_ENABLES
,
ARIZONA_IN4R_ENA_SHIFT
,
0
,
NULL
,
0
,
arizona_in_ev
,
SND_SOC_DAPM_PRE_PMD
|
SND_SOC_DAPM_POST_PMU
),
SND_SOC_DAPM_PRE_PMD
|
SND_SOC_DAPM_POST_PMD
|
SND_SOC_DAPM_PRE_PMU
|
SND_SOC_DAPM_POST_PMU
),
SND_SOC_DAPM_SUPPLY
(
"MICBIAS1"
,
ARIZONA_MIC_BIAS_CTRL_1
,
ARIZONA_MICB1_ENA_SHIFT
,
0
,
NULL
,
0
),
...
...
@@ -551,11 +559,11 @@ SND_SOC_DAPM_AIF_IN("AIF3RX1", NULL, 0,
SND_SOC_DAPM_AIF_IN
(
"AIF3RX2"
,
NULL
,
0
,
ARIZONA_AIF3_RX_ENABLES
,
ARIZONA_AIF3RX2_ENA_SHIFT
,
0
),
SND_SOC_DAPM_PGA_E
(
"OUT1L"
,
ARIZONA_OUTPUT_ENABLES_1
,
ARIZONA_OUT1L_ENA_SHIFT
,
0
,
NULL
,
0
,
arizona_
out
_ev
,
SND_SOC_DAPM_PGA_E
(
"OUT1L"
,
SND_SOC_NOPM
,
ARIZONA_OUT1L_ENA_SHIFT
,
0
,
NULL
,
0
,
arizona_
hp
_ev
,
SND_SOC_DAPM_PRE_PMD
|
SND_SOC_DAPM_POST_PMU
),
SND_SOC_DAPM_PGA_E
(
"OUT1R"
,
ARIZONA_OUTPUT_ENABLES_1
,
ARIZONA_OUT1R_ENA_SHIFT
,
0
,
NULL
,
0
,
arizona_
out
_ev
,
SND_SOC_DAPM_PGA_E
(
"OUT1R"
,
SND_SOC_NOPM
,
ARIZONA_OUT1R_ENA_SHIFT
,
0
,
NULL
,
0
,
arizona_
hp
_ev
,
SND_SOC_DAPM_PRE_PMD
|
SND_SOC_DAPM_POST_PMU
),
SND_SOC_DAPM_PGA_E
(
"OUT2L"
,
ARIZONA_OUTPUT_ENABLES_1
,
ARIZONA_OUT2L_ENA_SHIFT
,
0
,
NULL
,
0
,
arizona_out_ev
,
...
...
@@ -569,12 +577,6 @@ SND_SOC_DAPM_PGA_E("OUT3L", ARIZONA_OUTPUT_ENABLES_1,
SND_SOC_DAPM_PGA_E
(
"OUT3R"
,
ARIZONA_OUTPUT_ENABLES_1
,
ARIZONA_OUT3R_ENA_SHIFT
,
0
,
NULL
,
0
,
arizona_out_ev
,
SND_SOC_DAPM_PRE_PMD
|
SND_SOC_DAPM_POST_PMU
),
SND_SOC_DAPM_PGA_E
(
"OUT4L"
,
ARIZONA_OUTPUT_ENABLES_1
,
ARIZONA_OUT4L_ENA_SHIFT
,
0
,
NULL
,
0
,
arizona_out_ev
,
SND_SOC_DAPM_PRE_PMD
|
SND_SOC_DAPM_POST_PMU
),
SND_SOC_DAPM_PGA_E
(
"OUT4R"
,
ARIZONA_OUTPUT_ENABLES_1
,
ARIZONA_OUT4R_ENA_SHIFT
,
0
,
NULL
,
0
,
arizona_out_ev
,
SND_SOC_DAPM_PRE_PMD
|
SND_SOC_DAPM_POST_PMU
),
SND_SOC_DAPM_PGA_E
(
"OUT5L"
,
ARIZONA_OUTPUT_ENABLES_1
,
ARIZONA_OUT5L_ENA_SHIFT
,
0
,
NULL
,
0
,
arizona_out_ev
,
SND_SOC_DAPM_PRE_PMD
|
SND_SOC_DAPM_POST_PMU
),
...
...
@@ -880,6 +882,12 @@ static int wm5110_set_fll(struct snd_soc_codec *codec, int fll_id, int source,
return
arizona_set_fll
(
&
wm5110
->
fll
[
0
],
source
,
Fref
,
Fout
);
case
WM5110_FLL2
:
return
arizona_set_fll
(
&
wm5110
->
fll
[
1
],
source
,
Fref
,
Fout
);
case
WM5110_FLL1_REFCLK
:
return
arizona_set_fll_refclk
(
&
wm5110
->
fll
[
0
],
source
,
Fref
,
Fout
);
case
WM5110_FLL2_REFCLK
:
return
arizona_set_fll_refclk
(
&
wm5110
->
fll
[
1
],
source
,
Fref
,
Fout
);
default:
return
-
EINVAL
;
}
...
...
@@ -987,15 +995,6 @@ static int wm5110_codec_remove(struct snd_soc_codec *codec)
#define WM5110_DIG_VU 0x0200
static
unsigned
int
wm5110_digital_vu
[]
=
{
ARIZONA_ADC_DIGITAL_VOLUME_1L
,
ARIZONA_ADC_DIGITAL_VOLUME_1R
,
ARIZONA_ADC_DIGITAL_VOLUME_2L
,
ARIZONA_ADC_DIGITAL_VOLUME_2R
,
ARIZONA_ADC_DIGITAL_VOLUME_3L
,
ARIZONA_ADC_DIGITAL_VOLUME_3R
,
ARIZONA_ADC_DIGITAL_VOLUME_4L
,
ARIZONA_ADC_DIGITAL_VOLUME_4R
,
ARIZONA_DAC_DIGITAL_VOLUME_1L
,
ARIZONA_DAC_DIGITAL_VOLUME_1R
,
ARIZONA_DAC_DIGITAL_VOLUME_2L
,
...
...
@@ -1040,6 +1039,7 @@ static int wm5110_probe(struct platform_device *pdev)
platform_set_drvdata
(
pdev
,
wm5110
);
wm5110
->
core
.
arizona
=
arizona
;
wm5110
->
core
.
num_inputs
=
8
;
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
wm5110
->
fll
);
i
++
)
wm5110
->
fll
[
i
].
vco_mult
=
3
;
...
...
sound/soc/codecs/wm5110.h
View file @
a18d5151
...
...
@@ -15,7 +15,9 @@
#include "arizona.h"
#define WM5110_FLL1 1
#define WM5110_FLL2 2
#define WM5110_FLL1 1
#define WM5110_FLL2 2
#define WM5110_FLL1_REFCLK 3
#define WM5110_FLL2_REFCLK 4
#endif
sound/soc/codecs/wm_adsp.c
View file @
a18d5151
...
...
@@ -31,6 +31,7 @@
#include <linux/mfd/arizona/registers.h>
#include "arizona.h"
#include "wm_adsp.h"
#define adsp_crit(_dsp, fmt, ...) \
...
...
@@ -254,17 +255,52 @@ static const struct soc_enum wm_adsp_fw_enum[] = {
SOC_ENUM_SINGLE
(
0
,
3
,
ARRAY_SIZE
(
wm_adsp_fw_text
),
wm_adsp_fw_text
),
};
const
struct
snd_kcontrol_new
wm_adsp_fw_controls
[]
=
{
const
struct
snd_kcontrol_new
wm_adsp
1
_fw_controls
[]
=
{
SOC_ENUM_EXT
(
"DSP1 Firmware"
,
wm_adsp_fw_enum
[
0
],
wm_adsp_fw_get
,
wm_adsp_fw_put
),
SOC_ENUM_EXT
(
"DSP2 Firmware"
,
wm_adsp_fw_enum
[
1
],
wm_adsp_fw_get
,
wm_adsp_fw_put
),
SOC_ENUM_EXT
(
"DSP3 Firmware"
,
wm_adsp_fw_enum
[
2
],
wm_adsp_fw_get
,
wm_adsp_fw_put
),
};
EXPORT_SYMBOL_GPL
(
wm_adsp1_fw_controls
);
#if IS_ENABLED(CONFIG_SND_SOC_ARIZONA)
static
const
struct
soc_enum
wm_adsp2_rate_enum
[]
=
{
SOC_VALUE_ENUM_SINGLE
(
ARIZONA_DSP1_CONTROL_1
,
ARIZONA_DSP1_RATE_SHIFT
,
0xf
,
ARIZONA_RATE_ENUM_SIZE
,
arizona_rate_text
,
arizona_rate_val
),
SOC_VALUE_ENUM_SINGLE
(
ARIZONA_DSP2_CONTROL_1
,
ARIZONA_DSP1_RATE_SHIFT
,
0xf
,
ARIZONA_RATE_ENUM_SIZE
,
arizona_rate_text
,
arizona_rate_val
),
SOC_VALUE_ENUM_SINGLE
(
ARIZONA_DSP3_CONTROL_1
,
ARIZONA_DSP1_RATE_SHIFT
,
0xf
,
ARIZONA_RATE_ENUM_SIZE
,
arizona_rate_text
,
arizona_rate_val
),
SOC_VALUE_ENUM_SINGLE
(
ARIZONA_DSP3_CONTROL_1
,
ARIZONA_DSP1_RATE_SHIFT
,
0xf
,
ARIZONA_RATE_ENUM_SIZE
,
arizona_rate_text
,
arizona_rate_val
),
};
const
struct
snd_kcontrol_new
wm_adsp2_fw_controls
[]
=
{
SOC_ENUM_EXT
(
"DSP1 Firmware"
,
wm_adsp_fw_enum
[
0
],
wm_adsp_fw_get
,
wm_adsp_fw_put
),
SOC_ENUM
(
"DSP1 Rate"
,
wm_adsp2_rate_enum
[
0
]),
SOC_ENUM_EXT
(
"DSP2 Firmware"
,
wm_adsp_fw_enum
[
1
],
wm_adsp_fw_get
,
wm_adsp_fw_put
),
SOC_ENUM
(
"DSP2 Rate"
,
wm_adsp2_rate_enum
[
1
]),
SOC_ENUM_EXT
(
"DSP3 Firmware"
,
wm_adsp_fw_enum
[
2
],
wm_adsp_fw_get
,
wm_adsp_fw_put
),
SOC_ENUM
(
"DSP3 Rate"
,
wm_adsp2_rate_enum
[
2
]),
SOC_ENUM_EXT
(
"DSP4 Firmware"
,
wm_adsp_fw_enum
[
3
],
wm_adsp_fw_get
,
wm_adsp_fw_put
),
SOC_ENUM
(
"DSP4 Rate"
,
wm_adsp2_rate_enum
[
3
]),
};
EXPORT_SYMBOL_GPL
(
wm_adsp_fw_controls
);
EXPORT_SYMBOL_GPL
(
wm_adsp2_fw_controls
);
#endif
static
struct
wm_adsp_region
const
*
wm_adsp_find_region
(
struct
wm_adsp
*
dsp
,
int
type
)
...
...
sound/soc/codecs/wm_adsp.h
View file @
a18d5151
...
...
@@ -67,7 +67,8 @@ struct wm_adsp {
.shift = num, .event = wm_adsp2_event, \
.event_flags = SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD }
extern
const
struct
snd_kcontrol_new
wm_adsp_fw_controls
[];
extern
const
struct
snd_kcontrol_new
wm_adsp1_fw_controls
[];
extern
const
struct
snd_kcontrol_new
wm_adsp2_fw_controls
[];
int
wm_adsp1_init
(
struct
wm_adsp
*
adsp
);
int
wm_adsp2_init
(
struct
wm_adsp
*
adsp
,
bool
dvfs
);
...
...
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