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
e4473604
Commit
e4473604
authored
Oct 24, 2013
by
Mark Brown
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'asoc/topic/adav80x' into asoc-next
parents
9c5ff908
2560b3d1
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
102 additions
and
45 deletions
+102
-45
sound/soc/codecs/adav80x.c
sound/soc/codecs/adav80x.c
+102
-45
No files found.
sound/soc/codecs/adav80x.c
View file @
e4473604
...
...
@@ -115,22 +115,34 @@
#define ADAV80X_PLL_OUTE_SYSCLKPD(x) BIT(2 - (x))
static
u8
adav80x_default_regs
[]
=
{
0x00
,
0x00
,
0x00
,
0x00
,
0x01
,
0x01
,
0x02
,
0x01
,
0x80
,
0x26
,
0x00
,
0x00
,
0x02
,
0x40
,
0x20
,
0x00
,
0x09
,
0x08
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x04
,
0x00
,
0x01
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0xd1
,
0x92
,
0xb1
,
0x37
,
0x48
,
0xd2
,
0xfb
,
0xca
,
0xd2
,
0x15
,
0xe8
,
0x29
,
0xb9
,
0x6a
,
0xda
,
0x2b
,
0xb7
,
0xc0
,
0x11
,
0x65
,
0x5c
,
0xf6
,
0xff
,
0x8d
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0xa5
,
0x00
,
0x00
,
0x00
,
0xe8
,
0x46
,
0xe1
,
0x5b
,
0xd3
,
0x43
,
0x77
,
0x93
,
0xa7
,
0x44
,
0xee
,
0x32
,
0x12
,
0xc0
,
0x11
,
0x00
,
0x00
,
0x00
,
0x00
,
0xff
,
0xff
,
0x3f
,
0x3f
,
0x00
,
0x00
,
0x00
,
0x00
,
0xff
,
0xff
,
0x00
,
0x1d
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x52
,
0x00
,
static
struct
reg_default
adav80x_reg_defaults
[]
=
{
{
ADAV80X_PLAYBACK_CTRL
,
0x01
},
{
ADAV80X_AUX_IN_CTRL
,
0x01
},
{
ADAV80X_REC_CTRL
,
0x02
},
{
ADAV80X_AUX_OUT_CTRL
,
0x01
},
{
ADAV80X_DPATH_CTRL1
,
0xc0
},
{
ADAV80X_DPATH_CTRL2
,
0x11
},
{
ADAV80X_DAC_CTRL1
,
0x00
},
{
ADAV80X_DAC_CTRL2
,
0x00
},
{
ADAV80X_DAC_CTRL3
,
0x00
},
{
ADAV80X_DAC_L_VOL
,
0xff
},
{
ADAV80X_DAC_R_VOL
,
0xff
},
{
ADAV80X_PGA_L_VOL
,
0x00
},
{
ADAV80X_PGA_R_VOL
,
0x00
},
{
ADAV80X_ADC_CTRL1
,
0x00
},
{
ADAV80X_ADC_CTRL2
,
0x00
},
{
ADAV80X_ADC_L_VOL
,
0xff
},
{
ADAV80X_ADC_R_VOL
,
0xff
},
{
ADAV80X_PLL_CTRL1
,
0x00
},
{
ADAV80X_PLL_CTRL2
,
0x00
},
{
ADAV80X_ICLK_CTRL1
,
0x00
},
{
ADAV80X_ICLK_CTRL2
,
0x00
},
{
ADAV80X_PLL_CLK_SRC
,
0x00
},
{
ADAV80X_PLL_OUTE
,
0x00
},
};
struct
adav80x
{
enum
snd_soc_control_type
control_type
;
struct
regmap
*
regmap
;
enum
adav80x_clk_src
clk_src
;
unsigned
int
sysclk
;
...
...
@@ -298,7 +310,7 @@ static int adav80x_set_deemph(struct snd_soc_codec *codec)
val
=
ADAV80X_DAC_CTRL2_DEEMPH_NONE
;
}
return
snd_soc_update_bits
(
codec
,
ADAV80X_DAC_CTRL2
,
return
regmap_update_bits
(
adav80x
->
regmap
,
ADAV80X_DAC_CTRL2
,
ADAV80X_DAC_CTRL2_DEEMPH_MASK
,
val
);
}
...
...
@@ -394,10 +406,11 @@ static int adav80x_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt)
return
-
EINVAL
;
}
snd_soc_update_bits
(
codec
,
adav80x_port_ctrl_regs
[
dai
->
id
][
0
],
regmap_update_bits
(
adav80x
->
regmap
,
adav80x_port_ctrl_regs
[
dai
->
id
][
0
],
ADAV80X_CAPTURE_MODE_MASK
|
ADAV80X_CAPTURE_MODE_MASTER
,
capture
);
snd_soc_write
(
codec
,
adav80x_port_ctrl_regs
[
dai
->
id
][
1
],
playback
);
regmap_write
(
adav80x
->
regmap
,
adav80x_port_ctrl_regs
[
dai
->
id
][
1
],
playback
);
adav80x
->
dai_fmt
[
dai
->
id
]
=
fmt
&
SND_SOC_DAIFMT_FORMAT_MASK
;
...
...
@@ -407,6 +420,7 @@ static int adav80x_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt)
static
int
adav80x_set_adc_clock
(
struct
snd_soc_codec
*
codec
,
unsigned
int
sample_rate
)
{
struct
adav80x
*
adav80x
=
snd_soc_codec_get_drvdata
(
codec
);
unsigned
int
val
;
if
(
sample_rate
<=
48000
)
...
...
@@ -414,7 +428,7 @@ static int adav80x_set_adc_clock(struct snd_soc_codec *codec,
else
val
=
ADAV80X_ADC_CTRL1_MODULATOR_64FS
;
snd_soc_update_bits
(
codec
,
ADAV80X_ADC_CTRL1
,
regmap_update_bits
(
adav80x
->
regmap
,
ADAV80X_ADC_CTRL1
,
ADAV80X_ADC_CTRL1_MODULATOR_MASK
,
val
);
return
0
;
...
...
@@ -423,6 +437,7 @@ static int adav80x_set_adc_clock(struct snd_soc_codec *codec,
static
int
adav80x_set_dac_clock
(
struct
snd_soc_codec
*
codec
,
unsigned
int
sample_rate
)
{
struct
adav80x
*
adav80x
=
snd_soc_codec_get_drvdata
(
codec
);
unsigned
int
val
;
if
(
sample_rate
<=
48000
)
...
...
@@ -430,7 +445,7 @@ static int adav80x_set_dac_clock(struct snd_soc_codec *codec,
else
val
=
ADAV80X_DAC_CTRL2_DIV2
|
ADAV80X_DAC_CTRL2_INTERPOL_128FS
;
snd_soc_update_bits
(
codec
,
ADAV80X_DAC_CTRL2
,
regmap_update_bits
(
adav80x
->
regmap
,
ADAV80X_DAC_CTRL2
,
ADAV80X_DAC_CTRL2_DIV_MASK
|
ADAV80X_DAC_CTRL2_INTERPOL_MASK
,
val
);
...
...
@@ -440,6 +455,7 @@ static int adav80x_set_dac_clock(struct snd_soc_codec *codec,
static
int
adav80x_set_capture_pcm_format
(
struct
snd_soc_codec
*
codec
,
struct
snd_soc_dai
*
dai
,
snd_pcm_format_t
format
)
{
struct
adav80x
*
adav80x
=
snd_soc_codec_get_drvdata
(
codec
);
unsigned
int
val
;
switch
(
format
)
{
...
...
@@ -459,7 +475,7 @@ static int adav80x_set_capture_pcm_format(struct snd_soc_codec *codec,
return
-
EINVAL
;
}
snd_soc_update_bits
(
codec
,
adav80x_port_ctrl_regs
[
dai
->
id
][
0
],
regmap_update_bits
(
adav80x
->
regmap
,
adav80x_port_ctrl_regs
[
dai
->
id
][
0
],
ADAV80X_CAPTURE_WORD_LEN_MASK
,
val
);
return
0
;
...
...
@@ -491,7 +507,7 @@ static int adav80x_set_playback_pcm_format(struct snd_soc_codec *codec,
return
-
EINVAL
;
}
snd_soc_update_bits
(
codec
,
adav80x_port_ctrl_regs
[
dai
->
id
][
1
],
regmap_update_bits
(
adav80x
->
regmap
,
adav80x_port_ctrl_regs
[
dai
->
id
][
1
],
ADAV80X_PLAYBACK_MODE_MASK
,
val
);
return
0
;
...
...
@@ -554,8 +570,10 @@ static int adav80x_set_sysclk(struct snd_soc_codec *codec,
ADAV80X_ICLK_CTRL1_ICLK2_SRC
(
clk_id
);
iclk_ctrl2
=
ADAV80X_ICLK_CTRL2_ICLK1_SRC
(
clk_id
);
snd_soc_write
(
codec
,
ADAV80X_ICLK_CTRL1
,
iclk_ctrl1
);
snd_soc_write
(
codec
,
ADAV80X_ICLK_CTRL2
,
iclk_ctrl2
);
regmap_write
(
adav80x
->
regmap
,
ADAV80X_ICLK_CTRL1
,
iclk_ctrl1
);
regmap_write
(
adav80x
->
regmap
,
ADAV80X_ICLK_CTRL2
,
iclk_ctrl2
);
snd_soc_dapm_sync
(
&
codec
->
dapm
);
}
...
...
@@ -575,10 +593,12 @@ static int adav80x_set_sysclk(struct snd_soc_codec *codec,
mask
=
ADAV80X_PLL_OUTE_SYSCLKPD
(
clk_id
);
if
(
freq
==
0
)
{
snd_soc_update_bits
(
codec
,
ADAV80X_PLL_OUTE
,
mask
,
mask
);
regmap_update_bits
(
adav80x
->
regmap
,
ADAV80X_PLL_OUTE
,
mask
,
mask
);
adav80x
->
sysclk_pd
[
clk_id
]
=
true
;
}
else
{
snd_soc_update_bits
(
codec
,
ADAV80X_PLL_OUTE
,
mask
,
0
);
regmap_update_bits
(
adav80x
->
regmap
,
ADAV80X_PLL_OUTE
,
mask
,
0
);
adav80x
->
sysclk_pd
[
clk_id
]
=
false
;
}
...
...
@@ -650,9 +670,9 @@ static int adav80x_set_pll(struct snd_soc_codec *codec, int pll_id,
return
-
EINVAL
;
}
snd_soc_update_bits
(
codec
,
ADAV80X_PLL_CTRL1
,
ADAV80X_PLL_CTRL1_PLLDIV
,
pll_ctrl1
);
snd_soc_update_bits
(
codec
,
ADAV80X_PLL_CTRL2
,
regmap_update_bits
(
adav80x
->
regmap
,
ADAV80X_PLL_CTRL1
,
ADAV80X_PLL_CTRL1_PLLDIV
,
pll_ctrl1
);
regmap_update_bits
(
adav80x
->
regmap
,
ADAV80X_PLL_CTRL2
,
ADAV80X_PLL_CTRL2_PLL_MASK
(
pll_id
),
pll_ctrl2
);
if
(
source
!=
adav80x
->
pll_src
)
{
...
...
@@ -661,7 +681,7 @@ static int adav80x_set_pll(struct snd_soc_codec *codec, int pll_id,
else
pll_src
=
ADAV80X_PLL_CLK_SRC_PLL_XIN
(
pll_id
);
snd_soc_update_bits
(
codec
,
ADAV80X_PLL_CLK_SRC
,
regmap_update_bits
(
adav80x
->
regmap
,
ADAV80X_PLL_CLK_SRC
,
ADAV80X_PLL_CLK_SRC_PLL_MASK
(
pll_id
),
pll_src
);
adav80x
->
pll_src
=
source
;
...
...
@@ -675,6 +695,7 @@ static int adav80x_set_pll(struct snd_soc_codec *codec, int pll_id,
static
int
adav80x_set_bias_level
(
struct
snd_soc_codec
*
codec
,
enum
snd_soc_bias_level
level
)
{
struct
adav80x
*
adav80x
=
snd_soc_codec_get_drvdata
(
codec
);
unsigned
int
mask
=
ADAV80X_DAC_CTRL1_PD
;
switch
(
level
)
{
...
...
@@ -683,10 +704,12 @@ static int adav80x_set_bias_level(struct snd_soc_codec *codec,
case
SND_SOC_BIAS_PREPARE
:
break
;
case
SND_SOC_BIAS_STANDBY
:
snd_soc_update_bits
(
codec
,
ADAV80X_DAC_CTRL1
,
mask
,
0x00
);
regmap_update_bits
(
adav80x
->
regmap
,
ADAV80X_DAC_CTRL1
,
mask
,
0x00
);
break
;
case
SND_SOC_BIAS_OFF
:
snd_soc_update_bits
(
codec
,
ADAV80X_DAC_CTRL1
,
mask
,
mask
);
regmap_update_bits
(
adav80x
->
regmap
,
ADAV80X_DAC_CTRL1
,
mask
,
mask
);
break
;
}
...
...
@@ -780,7 +803,7 @@ static int adav80x_probe(struct snd_soc_codec *codec)
int
ret
;
struct
adav80x
*
adav80x
=
snd_soc_codec_get_drvdata
(
codec
);
ret
=
snd_soc_codec_set_cache_io
(
codec
,
7
,
9
,
adav80x
->
control_type
);
ret
=
snd_soc_codec_set_cache_io
(
codec
,
0
,
0
,
SND_SOC_REGMAP
);
if
(
ret
)
{
dev_err
(
codec
->
dev
,
"failed to set cache I/O: %d
\n
"
,
ret
);
return
ret
;
...
...
@@ -791,23 +814,31 @@ static int adav80x_probe(struct snd_soc_codec *codec)
snd_soc_dapm_force_enable_pin
(
&
codec
->
dapm
,
"PLL2"
);
/* Power down S/PDIF receiver, since it is currently not supported */
snd_soc_write
(
codec
,
ADAV80X_PLL_OUTE
,
0x20
);
regmap_write
(
adav80x
->
regmap
,
ADAV80X_PLL_OUTE
,
0x20
);
/* Disable DAC zero flag */
snd_soc_write
(
codec
,
ADAV80X_DAC_CTRL3
,
0x6
);
regmap_write
(
adav80x
->
regmap
,
ADAV80X_DAC_CTRL3
,
0x6
);
return
adav80x_set_bias_level
(
codec
,
SND_SOC_BIAS_STANDBY
);
}
static
int
adav80x_suspend
(
struct
snd_soc_codec
*
codec
)
{
return
adav80x_set_bias_level
(
codec
,
SND_SOC_BIAS_OFF
);
struct
adav80x
*
adav80x
=
snd_soc_codec_get_drvdata
(
codec
);
int
ret
;
ret
=
adav80x_set_bias_level
(
codec
,
SND_SOC_BIAS_OFF
);
regcache_cache_only
(
adav80x
->
regmap
,
true
);
return
ret
;
}
static
int
adav80x_resume
(
struct
snd_soc_codec
*
codec
)
{
struct
adav80x
*
adav80x
=
snd_soc_codec_get_drvdata
(
codec
);
regcache_cache_only
(
adav80x
->
regmap
,
false
);
adav80x_set_bias_level
(
codec
,
SND_SOC_BIAS_STANDBY
);
codec
->
cache_sync
=
1
;
snd_soc_cache_sync
(
codec
);
regcache_sync
(
adav80x
->
regmap
);
return
0
;
}
...
...
@@ -827,10 +858,6 @@ static struct snd_soc_codec_driver adav80x_codec_driver = {
.
set_pll
=
adav80x_set_pll
,
.
set_sysclk
=
adav80x_set_sysclk
,
.
reg_word_size
=
sizeof
(
u8
),
.
reg_cache_size
=
ARRAY_SIZE
(
adav80x_default_regs
),
.
reg_cache_default
=
adav80x_default_regs
,
.
controls
=
adav80x_controls
,
.
num_controls
=
ARRAY_SIZE
(
adav80x_controls
),
.
dapm_widgets
=
adav80x_dapm_widgets
,
...
...
@@ -839,18 +866,21 @@ static struct snd_soc_codec_driver adav80x_codec_driver = {
.
num_dapm_routes
=
ARRAY_SIZE
(
adav80x_dapm_routes
),
};
static
int
adav80x_bus_probe
(
struct
device
*
dev
,
enum
snd_soc_control_type
control_type
)
static
int
adav80x_bus_probe
(
struct
device
*
dev
,
struct
regmap
*
regmap
)
{
struct
adav80x
*
adav80x
;
int
ret
;
if
(
IS_ERR
(
regmap
))
return
PTR_ERR
(
regmap
);
adav80x
=
kzalloc
(
sizeof
(
*
adav80x
),
GFP_KERNEL
);
if
(
!
adav80x
)
return
-
ENOMEM
;
dev_set_drvdata
(
dev
,
adav80x
);
adav80x
->
control_type
=
control_type
;
adav80x
->
regmap
=
regmap
;
ret
=
snd_soc_register_codec
(
dev
,
&
adav80x_codec_driver
,
adav80x_dais
,
ARRAY_SIZE
(
adav80x_dais
));
...
...
@@ -868,6 +898,19 @@ static int adav80x_bus_remove(struct device *dev)
}
#if defined(CONFIG_SPI_MASTER)
static
const
struct
regmap_config
adav80x_spi_regmap_config
=
{
.
val_bits
=
8
,
.
pad_bits
=
1
,
.
reg_bits
=
7
,
.
read_flag_mask
=
0x01
,
.
max_register
=
ADAV80X_PLL_OUTE
,
.
cache_type
=
REGCACHE_RBTREE
,
.
reg_defaults
=
adav80x_reg_defaults
,
.
num_reg_defaults
=
ARRAY_SIZE
(
adav80x_reg_defaults
),
};
static
const
struct
spi_device_id
adav80x_spi_id
[]
=
{
{
"adav801"
,
0
},
{
}
...
...
@@ -876,7 +919,8 @@ MODULE_DEVICE_TABLE(spi, adav80x_spi_id);
static
int
adav80x_spi_probe
(
struct
spi_device
*
spi
)
{
return
adav80x_bus_probe
(
&
spi
->
dev
,
SND_SOC_SPI
);
return
adav80x_bus_probe
(
&
spi
->
dev
,
devm_regmap_init_spi
(
spi
,
&
adav80x_spi_regmap_config
));
}
static
int
adav80x_spi_remove
(
struct
spi_device
*
spi
)
...
...
@@ -896,6 +940,18 @@ static struct spi_driver adav80x_spi_driver = {
#endif
#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
static
const
struct
regmap_config
adav80x_i2c_regmap_config
=
{
.
val_bits
=
8
,
.
pad_bits
=
1
,
.
reg_bits
=
7
,
.
max_register
=
ADAV80X_PLL_OUTE
,
.
cache_type
=
REGCACHE_RBTREE
,
.
reg_defaults
=
adav80x_reg_defaults
,
.
num_reg_defaults
=
ARRAY_SIZE
(
adav80x_reg_defaults
),
};
static
const
struct
i2c_device_id
adav80x_i2c_id
[]
=
{
{
"adav803"
,
0
},
{
}
...
...
@@ -905,7 +961,8 @@ MODULE_DEVICE_TABLE(i2c, adav80x_i2c_id);
static
int
adav80x_i2c_probe
(
struct
i2c_client
*
client
,
const
struct
i2c_device_id
*
id
)
{
return
adav80x_bus_probe
(
&
client
->
dev
,
SND_SOC_I2C
);
return
adav80x_bus_probe
(
&
client
->
dev
,
devm_regmap_init_i2c
(
client
,
&
adav80x_i2c_regmap_config
));
}
static
int
adav80x_i2c_remove
(
struct
i2c_client
*
client
)
...
...
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