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
478b7746
Commit
478b7746
authored
Jul 03, 2017
by
Mark Brown
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'asoc/topic/zx-aud96p22' into asoc-next
parents
f116d2ff
0e15bdfd
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
434 additions
and
0 deletions
+434
-0
Documentation/devicetree/bindings/sound/zte,zx-aud96p22.txt
Documentation/devicetree/bindings/sound/zte,zx-aud96p22.txt
+24
-0
sound/soc/codecs/Kconfig
sound/soc/codecs/Kconfig
+5
-0
sound/soc/codecs/Makefile
sound/soc/codecs/Makefile
+2
-0
sound/soc/codecs/zx_aud96p22.c
sound/soc/codecs/zx_aud96p22.c
+403
-0
No files found.
Documentation/devicetree/bindings/sound/zte,zx-aud96p22.txt
0 → 100644
View file @
478b7746
ZTE ZX AUD96P22 Audio Codec
Required properties:
- compatible: Must be "zte,zx-aud96p22"
- #sound-dai-cells: Should be 0
- reg: I2C bus slave address of AUD96P22
Example:
i2c0: i2c@1486000 {
compatible = "zte,zx296718-i2c";
reg = <0x01486000 0x1000>;
interrupts = <GIC_SPI 35 IRQ_TYPE_LEVEL_HIGH>;
#address-cells = <1>;
#size-cells = <0>;
clocks = <&audiocrm AUDIO_I2C0_WCLK>;
clock-frequency = <1600000>;
aud96p22: codec@22 {
compatible = "zte,zx-aud96p22";
#sound-dai-cells = <0>;
reg = <0x22>;
};
};
sound/soc/codecs/Kconfig
View file @
478b7746
...
@@ -1119,6 +1119,11 @@ config SND_SOC_WM9713
...
@@ -1119,6 +1119,11 @@ config SND_SOC_WM9713
tristate
tristate
select REGMAP_AC97
select REGMAP_AC97
config SND_SOC_ZX_AUD96P22
tristate "ZTE ZX AUD96P22 CODEC"
depends on I2C
select REGMAP_I2C
# Amp
# Amp
config SND_SOC_LM4857
config SND_SOC_LM4857
tristate
tristate
...
...
sound/soc/codecs/Makefile
View file @
478b7746
...
@@ -225,6 +225,7 @@ snd-soc-wm9705-objs := wm9705.o
...
@@ -225,6 +225,7 @@ snd-soc-wm9705-objs := wm9705.o
snd-soc-wm9712-objs
:=
wm9712.o
snd-soc-wm9712-objs
:=
wm9712.o
snd-soc-wm9713-objs
:=
wm9713.o
snd-soc-wm9713-objs
:=
wm9713.o
snd-soc-wm-hubs-objs
:=
wm_hubs.o
snd-soc-wm-hubs-objs
:=
wm_hubs.o
snd-soc-zx-aud96p22-objs
:=
zx_aud96p22.o
# Amp
# Amp
snd-soc-dio2125-objs
:=
dio2125.o
snd-soc-dio2125-objs
:=
dio2125.o
snd-soc-max9877-objs
:=
max9877.o
snd-soc-max9877-objs
:=
max9877.o
...
@@ -457,6 +458,7 @@ obj-$(CONFIG_SND_SOC_WM9712) += snd-soc-wm9712.o
...
@@ -457,6 +458,7 @@ obj-$(CONFIG_SND_SOC_WM9712) += snd-soc-wm9712.o
obj-$(CONFIG_SND_SOC_WM9713)
+=
snd-soc-wm9713.o
obj-$(CONFIG_SND_SOC_WM9713)
+=
snd-soc-wm9713.o
obj-$(CONFIG_SND_SOC_WM_ADSP)
+=
snd-soc-wm-adsp.o
obj-$(CONFIG_SND_SOC_WM_ADSP)
+=
snd-soc-wm-adsp.o
obj-$(CONFIG_SND_SOC_WM_HUBS)
+=
snd-soc-wm-hubs.o
obj-$(CONFIG_SND_SOC_WM_HUBS)
+=
snd-soc-wm-hubs.o
obj-$(CONFIG_SND_SOC_ZX_AUD96P22)
+=
snd-soc-zx-aud96p22.o
# Amp
# Amp
obj-$(CONFIG_SND_SOC_DIO2125)
+=
snd-soc-dio2125.o
obj-$(CONFIG_SND_SOC_DIO2125)
+=
snd-soc-dio2125.o
...
...
sound/soc/codecs/zx_aud96p22.c
0 → 100644
View file @
478b7746
/*
* Copyright (C) 2017 Sanechips Technology Co., Ltd.
* Copyright 2017 Linaro Ltd.
*
* Author: Baoyou Xie <baoyou.xie@linaro.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
#include <linux/gpio/consumer.h>
#include <linux/i2c.h>
#include <linux/module.h>
#include <linux/regmap.h>
#include <sound/pcm.h>
#include <sound/pcm_params.h>
#include <sound/soc.h>
#include <sound/soc-dai.h>
#include <sound/tlv.h>
#define AUD96P22_RESET 0x00
#define RST_DAC_DPZ BIT(0)
#define RST_ADC_DPZ BIT(1)
#define AUD96P22_I2S1_CONFIG_0 0x03
#define I2S1_MS_MODE BIT(3)
#define I2S1_MODE_MASK 0x7
#define I2S1_MODE_RIGHT_J 0x0
#define I2S1_MODE_I2S 0x1
#define I2S1_MODE_LEFT_J 0x2
#define AUD96P22_PD_0 0x15
#define AUD96P22_PD_1 0x16
#define AUD96P22_PD_3 0x18
#define AUD96P22_PD_4 0x19
#define AUD96P22_MUTE_0 0x1d
#define AUD96P22_MUTE_2 0x1f
#define AUD96P22_MUTE_4 0x21
#define AUD96P22_RECVOL_0 0x24
#define AUD96P22_RECVOL_1 0x25
#define AUD96P22_PGA1VOL_0 0x26
#define AUD96P22_PGA1VOL_1 0x27
#define AUD96P22_LMVOL_0 0x34
#define AUD96P22_LMVOL_1 0x35
#define AUD96P22_HS1VOL_0 0x38
#define AUD96P22_HS1VOL_1 0x39
#define AUD96P22_PGA1SEL_0 0x47
#define AUD96P22_PGA1SEL_1 0x48
#define AUD96P22_LDR1SEL_0 0x59
#define AUD96P22_LDR1SEL_1 0x60
#define AUD96P22_LDR2SEL_0 0x5d
#define AUD96P22_REG_MAX 0xfb
struct
aud96p22_priv
{
struct
regmap
*
regmap
;
};
static
int
aud96p22_adc_event
(
struct
snd_soc_dapm_widget
*
w
,
struct
snd_kcontrol
*
kcontrol
,
int
event
)
{
struct
snd_soc_codec
*
codec
=
snd_soc_dapm_to_codec
(
w
->
dapm
);
struct
aud96p22_priv
*
priv
=
snd_soc_codec_get_drvdata
(
codec
);
struct
regmap
*
regmap
=
priv
->
regmap
;
if
(
event
!=
SND_SOC_DAPM_POST_PMU
)
return
-
EINVAL
;
/* Assert/de-assert the bit to reset ADC data path */
regmap_update_bits
(
regmap
,
AUD96P22_RESET
,
RST_ADC_DPZ
,
0
);
regmap_update_bits
(
regmap
,
AUD96P22_RESET
,
RST_ADC_DPZ
,
RST_ADC_DPZ
);
return
0
;
}
static
int
aud96p22_dac_event
(
struct
snd_soc_dapm_widget
*
w
,
struct
snd_kcontrol
*
kcontrol
,
int
event
)
{
struct
snd_soc_codec
*
codec
=
snd_soc_dapm_to_codec
(
w
->
dapm
);
struct
aud96p22_priv
*
priv
=
snd_soc_codec_get_drvdata
(
codec
);
struct
regmap
*
regmap
=
priv
->
regmap
;
if
(
event
!=
SND_SOC_DAPM_POST_PMU
)
return
-
EINVAL
;
/* Assert/de-assert the bit to reset DAC data path */
regmap_update_bits
(
regmap
,
AUD96P22_RESET
,
RST_DAC_DPZ
,
0
);
regmap_update_bits
(
regmap
,
AUD96P22_RESET
,
RST_DAC_DPZ
,
RST_DAC_DPZ
);
return
0
;
}
static
const
DECLARE_TLV_DB_SCALE
(
lm_tlv
,
-
11550
,
50
,
0
);
static
const
DECLARE_TLV_DB_SCALE
(
hs_tlv
,
-
3900
,
300
,
0
);
static
const
DECLARE_TLV_DB_SCALE
(
rec_tlv
,
-
9550
,
50
,
0
);
static
const
DECLARE_TLV_DB_SCALE
(
pga_tlv
,
-
1800
,
100
,
0
);
static
const
struct
snd_kcontrol_new
aud96p22_snd_controls
[]
=
{
/* Volume control */
SOC_DOUBLE_R_TLV
(
"Master Playback Volume"
,
AUD96P22_LMVOL_0
,
AUD96P22_LMVOL_1
,
0
,
0xff
,
0
,
lm_tlv
),
SOC_DOUBLE_R_TLV
(
"Headphone Volume"
,
AUD96P22_HS1VOL_0
,
AUD96P22_HS1VOL_1
,
0
,
0xf
,
0
,
hs_tlv
),
SOC_DOUBLE_R_TLV
(
"Master Capture Volume"
,
AUD96P22_RECVOL_0
,
AUD96P22_RECVOL_1
,
0
,
0xff
,
0
,
rec_tlv
),
SOC_DOUBLE_R_TLV
(
"Analogue Capture Volume"
,
AUD96P22_PGA1VOL_0
,
AUD96P22_PGA1VOL_1
,
0
,
0x37
,
0
,
pga_tlv
),
/* Mute control */
SOC_DOUBLE
(
"Master Playback Switch"
,
AUD96P22_MUTE_2
,
0
,
1
,
1
,
1
),
SOC_DOUBLE
(
"Headphone Switch"
,
AUD96P22_MUTE_2
,
4
,
5
,
1
,
1
),
SOC_DOUBLE
(
"Line Out Switch"
,
AUD96P22_MUTE_4
,
0
,
1
,
1
,
1
),
SOC_DOUBLE
(
"Speaker Switch"
,
AUD96P22_MUTE_4
,
2
,
3
,
1
,
1
),
SOC_DOUBLE
(
"Master Capture Switch"
,
AUD96P22_MUTE_0
,
0
,
1
,
1
,
1
),
SOC_DOUBLE
(
"Analogue Capture Switch"
,
AUD96P22_MUTE_0
,
2
,
3
,
1
,
1
),
};
/* Input mux kcontrols */
static
const
unsigned
int
ain_mux_values
[]
=
{
0
,
1
,
3
,
4
,
5
,
};
static
const
char
*
const
ainl_mux_texts
[]
=
{
"AINL1 differential"
,
"AINL1 single-ended"
,
"AINL3 single-ended"
,
"AINL2 differential"
,
"AINL2 single-ended"
,
};
static
const
char
*
const
ainr_mux_texts
[]
=
{
"AINR1 differential"
,
"AINR1 single-ended"
,
"AINR3 single-ended"
,
"AINR2 differential"
,
"AINR2 single-ended"
,
};
static
SOC_VALUE_ENUM_SINGLE_DECL
(
ainl_mux_enum
,
AUD96P22_PGA1SEL_0
,
0
,
0x7
,
ainl_mux_texts
,
ain_mux_values
);
static
SOC_VALUE_ENUM_SINGLE_DECL
(
ainr_mux_enum
,
AUD96P22_PGA1SEL_1
,
0
,
0x7
,
ainr_mux_texts
,
ain_mux_values
);
static
const
struct
snd_kcontrol_new
ainl_mux_kcontrol
=
SOC_DAPM_ENUM
(
"AINL Mux"
,
ainl_mux_enum
);
static
const
struct
snd_kcontrol_new
ainr_mux_kcontrol
=
SOC_DAPM_ENUM
(
"AINR Mux"
,
ainr_mux_enum
);
/* Output mixer kcontrols */
static
const
struct
snd_kcontrol_new
ld1_left_kcontrols
[]
=
{
SOC_DAPM_SINGLE
(
"DACL LD1L Switch"
,
AUD96P22_LDR1SEL_0
,
0
,
1
,
0
),
SOC_DAPM_SINGLE
(
"AINL LD1L Switch"
,
AUD96P22_LDR1SEL_0
,
1
,
1
,
0
),
SOC_DAPM_SINGLE
(
"AINR LD1L Switch"
,
AUD96P22_LDR1SEL_0
,
2
,
1
,
0
),
};
static
const
struct
snd_kcontrol_new
ld1_right_kcontrols
[]
=
{
SOC_DAPM_SINGLE
(
"DACR LD1R Switch"
,
AUD96P22_LDR1SEL_1
,
8
,
1
,
0
),
SOC_DAPM_SINGLE
(
"AINR LD1R Switch"
,
AUD96P22_LDR1SEL_1
,
9
,
1
,
0
),
SOC_DAPM_SINGLE
(
"AINL LD1R Switch"
,
AUD96P22_LDR1SEL_1
,
10
,
1
,
0
),
};
static
const
struct
snd_kcontrol_new
ld2_kcontrols
[]
=
{
SOC_DAPM_SINGLE
(
"DACL LD2 Switch"
,
AUD96P22_LDR2SEL_0
,
0
,
1
,
0
),
SOC_DAPM_SINGLE
(
"AINL LD2 Switch"
,
AUD96P22_LDR2SEL_0
,
1
,
1
,
0
),
SOC_DAPM_SINGLE
(
"DACR LD2 Switch"
,
AUD96P22_LDR2SEL_0
,
2
,
1
,
0
),
};
static
const
struct
snd_soc_dapm_widget
aud96p22_dapm_widgets
[]
=
{
/* Overall power bit */
SND_SOC_DAPM_SUPPLY
(
"POWER"
,
AUD96P22_PD_0
,
0
,
0
,
NULL
,
0
),
/* Input pins */
SND_SOC_DAPM_INPUT
(
"AINL1P"
),
SND_SOC_DAPM_INPUT
(
"AINL2P"
),
SND_SOC_DAPM_INPUT
(
"AINL3"
),
SND_SOC_DAPM_INPUT
(
"AINL1N"
),
SND_SOC_DAPM_INPUT
(
"AINL2N"
),
SND_SOC_DAPM_INPUT
(
"AINR2N"
),
SND_SOC_DAPM_INPUT
(
"AINR1N"
),
SND_SOC_DAPM_INPUT
(
"AINR3"
),
SND_SOC_DAPM_INPUT
(
"AINR2P"
),
SND_SOC_DAPM_INPUT
(
"AINR1P"
),
/* Input muxes */
SND_SOC_DAPM_MUX
(
"AINLMUX"
,
AUD96P22_PD_1
,
2
,
0
,
&
ainl_mux_kcontrol
),
SND_SOC_DAPM_MUX
(
"AINRMUX"
,
AUD96P22_PD_1
,
3
,
0
,
&
ainr_mux_kcontrol
),
/* ADCs */
SND_SOC_DAPM_ADC_E
(
"ADCL"
,
"Capture Left"
,
AUD96P22_PD_1
,
0
,
0
,
aud96p22_adc_event
,
SND_SOC_DAPM_POST_PMU
),
SND_SOC_DAPM_ADC_E
(
"ADCR"
,
"Capture Right"
,
AUD96P22_PD_1
,
1
,
0
,
aud96p22_adc_event
,
SND_SOC_DAPM_POST_PMU
),
/* DACs */
SND_SOC_DAPM_DAC_E
(
"DACL"
,
"Playback Left"
,
AUD96P22_PD_3
,
0
,
0
,
aud96p22_dac_event
,
SND_SOC_DAPM_POST_PMU
),
SND_SOC_DAPM_DAC_E
(
"DACR"
,
"Playback Right"
,
AUD96P22_PD_3
,
1
,
0
,
aud96p22_dac_event
,
SND_SOC_DAPM_POST_PMU
),
/* Output mixers */
SND_SOC_DAPM_MIXER
(
"LD1L"
,
AUD96P22_PD_3
,
6
,
0
,
ld1_left_kcontrols
,
ARRAY_SIZE
(
ld1_left_kcontrols
)),
SND_SOC_DAPM_MIXER
(
"LD1R"
,
AUD96P22_PD_3
,
7
,
0
,
ld1_right_kcontrols
,
ARRAY_SIZE
(
ld1_right_kcontrols
)),
SND_SOC_DAPM_MIXER
(
"LD2"
,
AUD96P22_PD_4
,
2
,
0
,
ld2_kcontrols
,
ARRAY_SIZE
(
ld2_kcontrols
)),
/* Headset power switch */
SND_SOC_DAPM_SUPPLY
(
"HS1L"
,
AUD96P22_PD_3
,
4
,
0
,
NULL
,
0
),
SND_SOC_DAPM_SUPPLY
(
"HS1R"
,
AUD96P22_PD_3
,
5
,
0
,
NULL
,
0
),
/* Output pins */
SND_SOC_DAPM_OUTPUT
(
"HSOUTL"
),
SND_SOC_DAPM_OUTPUT
(
"LINEOUTL"
),
SND_SOC_DAPM_OUTPUT
(
"LINEOUTMP"
),
SND_SOC_DAPM_OUTPUT
(
"LINEOUTMN"
),
SND_SOC_DAPM_OUTPUT
(
"LINEOUTR"
),
SND_SOC_DAPM_OUTPUT
(
"HSOUTR"
),
};
static
const
struct
snd_soc_dapm_route
aud96p22_dapm_routes
[]
=
{
{
"AINLMUX"
,
"AINL1 differential"
,
"AINL1N"
},
{
"AINLMUX"
,
"AINL1 single-ended"
,
"AINL1P"
},
{
"AINLMUX"
,
"AINL3 single-ended"
,
"AINL3"
},
{
"AINLMUX"
,
"AINL2 differential"
,
"AINL2N"
},
{
"AINLMUX"
,
"AINL2 single-ended"
,
"AINL2P"
},
{
"AINRMUX"
,
"AINR1 differential"
,
"AINR1N"
},
{
"AINRMUX"
,
"AINR1 single-ended"
,
"AINR1P"
},
{
"AINRMUX"
,
"AINR3 single-ended"
,
"AINR3"
},
{
"AINRMUX"
,
"AINR2 differential"
,
"AINR2N"
},
{
"AINRMUX"
,
"AINR2 single-ended"
,
"AINR2P"
},
{
"ADCL"
,
NULL
,
"AINLMUX"
},
{
"ADCR"
,
NULL
,
"AINRMUX"
},
{
"ADCL"
,
NULL
,
"POWER"
},
{
"ADCR"
,
NULL
,
"POWER"
},
{
"DACL"
,
NULL
,
"POWER"
},
{
"DACR"
,
NULL
,
"POWER"
},
{
"LD1L"
,
"DACL LD1L Switch"
,
"DACL"
},
{
"LD1L"
,
"AINL LD1L Switch"
,
"AINLMUX"
},
{
"LD1L"
,
"AINR LD1L Switch"
,
"AINRMUX"
},
{
"LD1R"
,
"DACR LD1R Switch"
,
"DACR"
},
{
"LD1R"
,
"AINR LD1R Switch"
,
"AINRMUX"
},
{
"LD1R"
,
"AINL LD1R Switch"
,
"AINLMUX"
},
{
"LD2"
,
"DACL LD2 Switch"
,
"DACL"
},
{
"LD2"
,
"AINL LD2 Switch"
,
"AINLMUX"
},
{
"LD2"
,
"DACR LD2 Switch"
,
"DACR"
},
{
"HSOUTL"
,
NULL
,
"LD1L"
},
{
"HSOUTR"
,
NULL
,
"LD1R"
},
{
"HSOUTL"
,
NULL
,
"HS1L"
},
{
"HSOUTR"
,
NULL
,
"HS1R"
},
{
"LINEOUTL"
,
NULL
,
"LD1L"
},
{
"LINEOUTR"
,
NULL
,
"LD1R"
},
{
"LINEOUTMP"
,
NULL
,
"LD2"
},
{
"LINEOUTMN"
,
NULL
,
"LD2"
},
};
static
struct
snd_soc_codec_driver
aud96p22_driver
=
{
.
component_driver
=
{
.
controls
=
aud96p22_snd_controls
,
.
num_controls
=
ARRAY_SIZE
(
aud96p22_snd_controls
),
.
dapm_widgets
=
aud96p22_dapm_widgets
,
.
num_dapm_widgets
=
ARRAY_SIZE
(
aud96p22_dapm_widgets
),
.
dapm_routes
=
aud96p22_dapm_routes
,
.
num_dapm_routes
=
ARRAY_SIZE
(
aud96p22_dapm_routes
),
},
};
static
int
aud96p22_set_fmt
(
struct
snd_soc_dai
*
dai
,
unsigned
int
fmt
)
{
struct
aud96p22_priv
*
priv
=
snd_soc_codec_get_drvdata
(
dai
->
codec
);
struct
regmap
*
regmap
=
priv
->
regmap
;
unsigned
int
val
;
/* Master/slave mode */
switch
(
fmt
&
SND_SOC_DAIFMT_MASTER_MASK
)
{
case
SND_SOC_DAIFMT_CBS_CFS
:
val
=
0
;
break
;
case
SND_SOC_DAIFMT_CBM_CFM
:
val
=
I2S1_MS_MODE
;
break
;
default:
return
-
EINVAL
;
}
regmap_update_bits
(
regmap
,
AUD96P22_I2S1_CONFIG_0
,
I2S1_MS_MODE
,
val
);
/* Audio format */
switch
(
fmt
&
SND_SOC_DAIFMT_FORMAT_MASK
)
{
case
SND_SOC_DAIFMT_RIGHT_J
:
val
=
I2S1_MODE_RIGHT_J
;
break
;
case
SND_SOC_DAIFMT_I2S
:
val
=
I2S1_MODE_I2S
;
break
;
case
SND_SOC_DAIFMT_LEFT_J
:
val
=
I2S1_MODE_LEFT_J
;
break
;
default:
return
-
EINVAL
;
}
regmap_update_bits
(
regmap
,
AUD96P22_I2S1_CONFIG_0
,
I2S1_MODE_MASK
,
val
);
return
0
;
}
static
struct
snd_soc_dai_ops
aud96p22_dai_ops
=
{
.
set_fmt
=
aud96p22_set_fmt
,
};
#define AUD96P22_RATES SNDRV_PCM_RATE_8000_192000
#define AUD96P22_FORMATS (\
SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S18_3LE | \
SNDRV_PCM_FMTBIT_S20_3LE | SNDRV_PCM_FMTBIT_S24_LE)
static
struct
snd_soc_dai_driver
aud96p22_dai
=
{
.
name
=
"aud96p22-dai"
,
.
playback
=
{
.
stream_name
=
"Playback"
,
.
channels_min
=
1
,
.
channels_max
=
2
,
.
rates
=
AUD96P22_RATES
,
.
formats
=
AUD96P22_FORMATS
,
},
.
capture
=
{
.
stream_name
=
"Capture"
,
.
channels_min
=
1
,
.
channels_max
=
2
,
.
rates
=
AUD96P22_RATES
,
.
formats
=
AUD96P22_FORMATS
,
},
.
ops
=
&
aud96p22_dai_ops
,
};
static
const
struct
regmap_config
aud96p22_regmap
=
{
.
reg_bits
=
8
,
.
val_bits
=
8
,
.
max_register
=
AUD96P22_REG_MAX
,
.
cache_type
=
REGCACHE_RBTREE
,
};
static
int
aud96p22_i2c_probe
(
struct
i2c_client
*
i2c
,
const
struct
i2c_device_id
*
id
)
{
struct
device
*
dev
=
&
i2c
->
dev
;
struct
aud96p22_priv
*
priv
;
int
ret
;
priv
=
devm_kzalloc
(
dev
,
sizeof
(
*
priv
),
GFP_KERNEL
);
if
(
priv
==
NULL
)
return
-
ENOMEM
;
priv
->
regmap
=
devm_regmap_init_i2c
(
i2c
,
&
aud96p22_regmap
);
if
(
IS_ERR
(
priv
->
regmap
))
{
ret
=
PTR_ERR
(
priv
->
regmap
);
dev_err
(
dev
,
"failed to init i2c regmap: %d
\n
"
,
ret
);
return
ret
;
}
i2c_set_clientdata
(
i2c
,
priv
);
ret
=
snd_soc_register_codec
(
dev
,
&
aud96p22_driver
,
&
aud96p22_dai
,
1
);
if
(
ret
)
{
dev_err
(
dev
,
"failed to register codec: %d
\n
"
,
ret
);
return
ret
;
}
return
0
;
}
static
int
aud96p22_i2c_remove
(
struct
i2c_client
*
i2c
)
{
snd_soc_unregister_codec
(
&
i2c
->
dev
);
return
0
;
}
const
struct
of_device_id
aud96p22_dt_ids
[]
=
{
{
.
compatible
=
"zte,zx-aud96p22"
,
},
{
}
};
MODULE_DEVICE_TABLE
(
of
,
aud96p22_dt_ids
);
static
struct
i2c_driver
aud96p22_i2c_driver
=
{
.
driver
=
{
.
name
=
"zx_aud96p22"
,
.
of_match_table
=
aud96p22_dt_ids
,
},
.
probe
=
aud96p22_i2c_probe
,
.
remove
=
aud96p22_i2c_remove
,
};
module_i2c_driver
(
aud96p22_i2c_driver
);
MODULE_DESCRIPTION
(
"ZTE ASoC AUD96P22 CODEC driver"
);
MODULE_AUTHOR
(
"Baoyou Xie <baoyou.xie@linaro.org>"
);
MODULE_LICENSE
(
"GPL v2"
);
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