Commit 3ceeda1c authored by Mark Brown's avatar Mark Brown

Merge remote-tracking branches 'asoc/topic/cs53l30', 'asoc/topic/cygnus',...

Merge remote-tracking branches 'asoc/topic/cs53l30', 'asoc/topic/cygnus', 'asoc/topic/da7219' and 'asoc/topic/davinci' into asoc-next
BROADCOM Cygnus Audio I2S/TDM/SPDIF controller
Required properties:
- compatible : "brcm,cygnus-audio"
- #address-cells: 32bit valued, 1 cell.
- #size-cells: 32bit valued, 0 cell.
- reg : Should contain audio registers location and length
- reg-names: names of the registers listed in "reg" property
Valid names are "aud" and "i2s_in". "aud" contains a
set of DMA, I2S_OUT and SPDIF registers. "i2s_in" contains
a set of I2S_IN registers.
- clocks: PLL and leaf clocks used by audio ports
- assigned-clocks: PLL and leaf clocks
- assigned-clock-parents: parent clocks of the assigned clocks
(usually the PLL)
- assigned-clock-rates: List of clock frequencies of the
assigned clocks
- clock-names: names of 3 leaf clocks used by audio ports
Valid names are "ch0_audio", "ch1_audio", "ch2_audio"
- interrupts: audio DMA interrupt number
SSP Subnode properties:
- reg: The index of ssp port interface to use
Valid value are 0, 1, 2, or 3 (for spdif)
Example:
cygnus_audio: audio@180ae000 {
compatible = "brcm,cygnus-audio";
#address-cells = <1>;
#size-cells = <0>;
reg = <0x180ae000 0xafd>, <0x180aec00 0x1f8>;
reg-names = "aud", "i2s_in";
clocks = <&audiopll BCM_CYGNUS_AUDIOPLL_CH0>,
<&audiopll BCM_CYGNUS_AUDIOPLL_CH1>,
<&audiopll BCM_CYGNUS_AUDIOPLL_CH2>;
assigned-clocks = <&audiopll BCM_CYGNUS_AUDIOPLL>,
<&audiopll BCM_CYGNUS_AUDIOPLL_CH0>,
<&audiopll BCM_CYGNUS_AUDIOPLL_CH1>,
<&audiopll BCM_CYGNUS_AUDIOPLL_CH2>;
assigned-clock-parents = <&audiopll BCM_CYGNUS_AUDIOPLL>;
assigned-clock-rates = <1769470191>,
<0>,
<0>,
<0>;
clock-names = "ch0_audio", "ch1_audio", "ch2_audio";
interrupts = <GIC_SPI 143 IRQ_TYPE_LEVEL_HIGH>;
ssp0: ssp_port@0 {
reg = <0>;
status = "okay";
};
ssp1: ssp_port@1 {
reg = <1>;
status = "disabled";
};
ssp2: ssp_port@2 {
reg = <2>;
status = "disabled";
};
spdif: spdif_port@3 {
reg = <3>;
status = "disabled";
};
};
CS53L30 audio CODEC
Required properties:
- compatible : "cirrus,cs53l30"
- reg : the I2C address of the device
- VA-supply, VP-supply : power supplies for the device,
as covered in Documentation/devicetree/bindings/regulator/regulator.txt.
Optional properties:
- reset-gpios : a GPIO spec for the reset pin.
- mute-gpios : a GPIO spec for the MUTE pin. The active state can be either
GPIO_ACTIVE_HIGH or GPIO_ACTIVE_LOW, which would be handled
by the driver automatically.
- cirrus,micbias-lvl : Set the output voltage level on the MICBIAS Pin.
0 = Hi-Z
1 = 1.80 V
2 = 2.75 V
- cirrus,use-sdout2 : This is a boolean property. If present, it indicates
the hardware design connects both SDOUT1 and SDOUT2
pins to output data. Otherwise, it indicates that
only SDOUT1 is connected for data output.
* CS53l30 supports 4-channel data output in the same
* frame using two different ways:
* 1) Normal I2S mode on two data pins -- each SDOUT
* carries 2-channel data in the same time.
* 2) TDM mode on one signle data pin -- SDOUT1 carries
* 4-channel data per frame.
Example:
codec: cs53l30@48 {
compatible = "cirrus,cs53l30";
reg = <0x48>;
reset-gpios = <&gpio 54 0>;
VA-supply = <&cs53l30_va>;
VP-supply = <&cs53l30_vp>;
};
...@@ -887,6 +887,34 @@ struct fwnode_handle *device_get_next_child_node(struct device *dev, ...@@ -887,6 +887,34 @@ struct fwnode_handle *device_get_next_child_node(struct device *dev,
} }
EXPORT_SYMBOL_GPL(device_get_next_child_node); EXPORT_SYMBOL_GPL(device_get_next_child_node);
/**
* device_get_named_child_node - Return first matching named child node handle
* @dev: Device to find the named child node for.
* @childname: String to match child node name against.
*/
struct fwnode_handle *device_get_named_child_node(struct device *dev,
const char *childname)
{
struct fwnode_handle *child;
/*
* Find first matching named child node of this device.
* For ACPI this will be a data only sub-node.
*/
device_for_each_child_node(dev, child) {
if (is_of_node(child)) {
if (!of_node_cmp(to_of_node(child)->name, childname))
return child;
} else if (is_acpi_data_node(child)) {
if (acpi_data_node_match(child, childname))
return child;
}
}
return NULL;
}
EXPORT_SYMBOL_GPL(device_get_named_child_node);
/** /**
* fwnode_handle_put - Drop reference to a device node * fwnode_handle_put - Drop reference to a device node
* @fwnode: Pointer to the device node to drop the reference to. * @fwnode: Pointer to the device node to drop the reference to.
......
...@@ -420,6 +420,13 @@ static inline struct acpi_data_node *to_acpi_data_node(struct fwnode_handle *fwn ...@@ -420,6 +420,13 @@ static inline struct acpi_data_node *to_acpi_data_node(struct fwnode_handle *fwn
container_of(fwnode, struct acpi_data_node, fwnode) : NULL; container_of(fwnode, struct acpi_data_node, fwnode) : NULL;
} }
static inline bool acpi_data_node_match(struct fwnode_handle *fwnode,
const char *name)
{
return is_acpi_data_node(fwnode) ?
(!strcmp(to_acpi_data_node(fwnode)->name, name)) : false;
}
static inline struct fwnode_handle *acpi_fwnode_handle(struct acpi_device *adev) static inline struct fwnode_handle *acpi_fwnode_handle(struct acpi_device *adev)
{ {
return &adev->fwnode; return &adev->fwnode;
......
...@@ -568,6 +568,12 @@ static inline struct acpi_data_node *to_acpi_data_node(struct fwnode_handle *fwn ...@@ -568,6 +568,12 @@ static inline struct acpi_data_node *to_acpi_data_node(struct fwnode_handle *fwn
return NULL; return NULL;
} }
static inline bool acpi_data_node_match(struct fwnode_handle *fwnode,
const char *name)
{
return false;
}
static inline struct fwnode_handle *acpi_fwnode_handle(struct acpi_device *adev) static inline struct fwnode_handle *acpi_fwnode_handle(struct acpi_device *adev)
{ {
return NULL; return NULL;
......
...@@ -238,13 +238,6 @@ static inline unsigned long of_read_ulong(const __be32 *cell, int size) ...@@ -238,13 +238,6 @@ static inline unsigned long of_read_ulong(const __be32 *cell, int size)
#define OF_ROOT_NODE_SIZE_CELLS_DEFAULT 1 #define OF_ROOT_NODE_SIZE_CELLS_DEFAULT 1
#endif #endif
/* Default string compare functions, Allow arch asm/prom.h to override */
#if !defined(of_compat_cmp)
#define of_compat_cmp(s1, s2, l) strcasecmp((s1), (s2))
#define of_prop_cmp(s1, s2) strcmp((s1), (s2))
#define of_node_cmp(s1, s2) strcasecmp((s1), (s2))
#endif
#define OF_IS_DYNAMIC(x) test_bit(OF_DYNAMIC, &x->_flags) #define OF_IS_DYNAMIC(x) test_bit(OF_DYNAMIC, &x->_flags)
#define OF_MARK_DYNAMIC(x) set_bit(OF_DYNAMIC, &x->_flags) #define OF_MARK_DYNAMIC(x) set_bit(OF_DYNAMIC, &x->_flags)
...@@ -726,6 +719,13 @@ static inline void of_property_clear_flag(struct property *p, unsigned long flag ...@@ -726,6 +719,13 @@ static inline void of_property_clear_flag(struct property *p, unsigned long flag
#define of_match_node(_matches, _node) NULL #define of_match_node(_matches, _node) NULL
#endif /* CONFIG_OF */ #endif /* CONFIG_OF */
/* Default string compare functions, Allow arch asm/prom.h to override */
#if !defined(of_compat_cmp)
#define of_compat_cmp(s1, s2, l) strcasecmp((s1), (s2))
#define of_prop_cmp(s1, s2) strcmp((s1), (s2))
#define of_node_cmp(s1, s2) strcasecmp((s1), (s2))
#endif
#if defined(CONFIG_OF) && defined(CONFIG_NUMA) #if defined(CONFIG_OF) && defined(CONFIG_NUMA)
extern int of_node_to_nid(struct device_node *np); extern int of_node_to_nid(struct device_node *np);
#else #else
......
...@@ -77,6 +77,9 @@ struct fwnode_handle *device_get_next_child_node(struct device *dev, ...@@ -77,6 +77,9 @@ struct fwnode_handle *device_get_next_child_node(struct device *dev,
for (child = device_get_next_child_node(dev, NULL); child; \ for (child = device_get_next_child_node(dev, NULL); child; \
child = device_get_next_child_node(dev, child)) child = device_get_next_child_node(dev, child))
struct fwnode_handle *device_get_named_child_node(struct device *dev,
const char *childname);
void fwnode_handle_put(struct fwnode_handle *fwnode); void fwnode_handle_put(struct fwnode_handle *fwnode);
unsigned int device_get_child_node_count(struct device *dev); unsigned int device_get_child_node_count(struct device *dev);
......
...@@ -7,3 +7,12 @@ config SND_BCM2835_SOC_I2S ...@@ -7,3 +7,12 @@ config SND_BCM2835_SOC_I2S
Say Y or M if you want to add support for codecs attached to Say Y or M if you want to add support for codecs attached to
the BCM2835 I2S interface. You will also need the BCM2835 I2S interface. You will also need
to select the audio interfaces to support below. to select the audio interfaces to support below.
config SND_SOC_CYGNUS
tristate "SoC platform audio for Broadcom Cygnus chips"
depends on ARCH_BCM_CYGNUS || COMPILE_TEST
help
Say Y if you want to add support for ASoC audio on Broadcom
Cygnus chips (bcm958300, bcm958305, bcm911360)
If you don't know what to do here, say N.
\ No newline at end of file
...@@ -3,3 +3,8 @@ snd-soc-bcm2835-i2s-objs := bcm2835-i2s.o ...@@ -3,3 +3,8 @@ snd-soc-bcm2835-i2s-objs := bcm2835-i2s.o
obj-$(CONFIG_SND_BCM2835_SOC_I2S) += snd-soc-bcm2835-i2s.o obj-$(CONFIG_SND_BCM2835_SOC_I2S) += snd-soc-bcm2835-i2s.o
# CYGNUS Platform Support
snd-soc-cygnus-objs := cygnus-pcm.o cygnus-ssp.o
obj-$(CONFIG_SND_SOC_CYGNUS) += snd-soc-cygnus.o
This diff is collapsed.
This diff is collapsed.
/*
* Copyright (C) 2014-2015 Broadcom Corporation
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation version 2.
*
* This program is distributed "as is" WITHOUT ANY WARRANTY of any
* kind, whether express or implied; without even the implied warranty
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#ifndef __CYGNUS_SSP_H__
#define __CYGNUS_SSP_H__
#define CYGNUS_TDM_DAI_MAX_SLOTS 16
#define CYGNUS_MAX_PLAYBACK_PORTS 4
#define CYGNUS_MAX_CAPTURE_PORTS 3
#define CYGNUS_MAX_I2S_PORTS 3
#define CYGNUS_MAX_PORTS CYGNUS_MAX_PLAYBACK_PORTS
#define CYGNUS_AUIDO_MAX_NUM_CLKS 3
#define CYGNUS_SSP_FRAMEBITS_DIV 1
#define CYGNUS_SSPMODE_I2S 0
#define CYGNUS_SSPMODE_TDM 1
#define CYGNUS_SSPMODE_UNKNOWN -1
#define CYGNUS_SSP_CLKSRC_PLL 0
/* Max string length of our dt property names */
#define PROP_LEN_MAX 40
struct ringbuf_regs {
unsigned rdaddr;
unsigned wraddr;
unsigned baseaddr;
unsigned endaddr;
unsigned fmark; /* freemark for play, fullmark for caputure */
unsigned period_bytes;
unsigned buf_size;
};
#define RINGBUF_REG_PLAYBACK(num) ((struct ringbuf_regs) { \
.rdaddr = SRC_RBUF_ ##num## _RDADDR_OFFSET, \
.wraddr = SRC_RBUF_ ##num## _WRADDR_OFFSET, \
.baseaddr = SRC_RBUF_ ##num## _BASEADDR_OFFSET, \
.endaddr = SRC_RBUF_ ##num## _ENDADDR_OFFSET, \
.fmark = SRC_RBUF_ ##num## _FREE_MARK_OFFSET, \
.period_bytes = 0, \
.buf_size = 0, \
})
#define RINGBUF_REG_CAPTURE(num) ((struct ringbuf_regs) { \
.rdaddr = DST_RBUF_ ##num## _RDADDR_OFFSET, \
.wraddr = DST_RBUF_ ##num## _WRADDR_OFFSET, \
.baseaddr = DST_RBUF_ ##num## _BASEADDR_OFFSET, \
.endaddr = DST_RBUF_ ##num## _ENDADDR_OFFSET, \
.fmark = DST_RBUF_ ##num## _FULL_MARK_OFFSET, \
.period_bytes = 0, \
.buf_size = 0, \
})
enum cygnus_audio_port_type {
PORT_TDM,
PORT_SPDIF,
};
struct cygnus_ssp_regs {
u32 i2s_stream_cfg;
u32 i2s_cfg;
u32 i2s_cap_stream_cfg;
u32 i2s_cap_cfg;
u32 i2s_mclk_cfg;
u32 bf_destch_ctrl;
u32 bf_destch_cfg;
u32 bf_sourcech_ctrl;
u32 bf_sourcech_cfg;
u32 bf_sourcech_grp;
};
struct cygnus_track_clk {
bool cap_en;
bool play_en;
bool cap_clk_en;
bool play_clk_en;
};
struct cygnus_aio_port {
int portnum;
int mode;
bool is_slave;
int streams_on; /* will be 0 if both capture and play are off */
int fsync_width;
int port_type;
u32 mclk;
u32 lrclk;
u32 bit_per_frame;
u32 pll_clk_num;
struct cygnus_audio *cygaud;
struct cygnus_ssp_regs regs;
struct ringbuf_regs play_rb_regs;
struct ringbuf_regs capture_rb_regs;
struct snd_pcm_substream *play_stream;
struct snd_pcm_substream *capture_stream;
struct cygnus_track_clk clk_trace;
};
struct cygnus_audio {
struct cygnus_aio_port portinfo[CYGNUS_MAX_PORTS];
int irq_num;
void __iomem *audio;
struct device *dev;
void __iomem *i2s_in;
struct clk *audio_clk[CYGNUS_AUIDO_MAX_NUM_CLKS];
int active_ports;
unsigned long vco_rate;
};
extern int cygnus_ssp_get_mode(struct snd_soc_dai *cpu_dai);
extern int cygnus_ssp_add_pll_tweak_controls(struct snd_soc_pcm_runtime *rtd);
extern int cygnus_ssp_set_custom_fsync_width(struct snd_soc_dai *cpu_dai,
int len);
extern int cygnus_soc_platform_register(struct device *dev,
struct cygnus_audio *cygaud);
extern int cygnus_soc_platform_unregister(struct device *dev);
extern int cygnus_ssp_set_custom_fsync_width(struct snd_soc_dai *cpu_dai,
int len);
#endif
...@@ -59,6 +59,7 @@ config SND_SOC_ALL_CODECS ...@@ -59,6 +59,7 @@ config SND_SOC_ALL_CODECS
select SND_SOC_CS42XX8_I2C if I2C select SND_SOC_CS42XX8_I2C if I2C
select SND_SOC_CS4349 if I2C select SND_SOC_CS4349 if I2C
select SND_SOC_CS47L24 if MFD_CS47L24 select SND_SOC_CS47L24 if MFD_CS47L24
select SND_SOC_CS53L30 if I2C
select SND_SOC_CX20442 if TTY select SND_SOC_CX20442 if TTY
select SND_SOC_DA7210 if SND_SOC_I2C_AND_SPI select SND_SOC_DA7210 if SND_SOC_I2C_AND_SPI
select SND_SOC_DA7213 if I2C select SND_SOC_DA7213 if I2C
...@@ -464,6 +465,11 @@ config SND_SOC_CS4349 ...@@ -464,6 +465,11 @@ config SND_SOC_CS4349
config SND_SOC_CS47L24 config SND_SOC_CS47L24
tristate tristate
# Cirrus Logic Quad-Channel ADC
config SND_SOC_CS53L30
tristate "Cirrus Logic CS53L30 CODEC"
depends on I2C
config SND_SOC_CX20442 config SND_SOC_CX20442
tristate tristate
depends on TTY depends on TTY
......
...@@ -52,6 +52,7 @@ snd-soc-cs42xx8-objs := cs42xx8.o ...@@ -52,6 +52,7 @@ snd-soc-cs42xx8-objs := cs42xx8.o
snd-soc-cs42xx8-i2c-objs := cs42xx8-i2c.o snd-soc-cs42xx8-i2c-objs := cs42xx8-i2c.o
snd-soc-cs4349-objs := cs4349.o snd-soc-cs4349-objs := cs4349.o
snd-soc-cs47l24-objs := cs47l24.o snd-soc-cs47l24-objs := cs47l24.o
snd-soc-cs53l30-objs := cs53l30.o
snd-soc-cx20442-objs := cx20442.o snd-soc-cx20442-objs := cx20442.o
snd-soc-da7210-objs := da7210.o snd-soc-da7210-objs := da7210.o
snd-soc-da7213-objs := da7213.o snd-soc-da7213-objs := da7213.o
...@@ -270,6 +271,7 @@ obj-$(CONFIG_SND_SOC_CS42XX8) += snd-soc-cs42xx8.o ...@@ -270,6 +271,7 @@ obj-$(CONFIG_SND_SOC_CS42XX8) += snd-soc-cs42xx8.o
obj-$(CONFIG_SND_SOC_CS42XX8_I2C) += snd-soc-cs42xx8-i2c.o obj-$(CONFIG_SND_SOC_CS42XX8_I2C) += snd-soc-cs42xx8-i2c.o
obj-$(CONFIG_SND_SOC_CS4349) += snd-soc-cs4349.o obj-$(CONFIG_SND_SOC_CS4349) += snd-soc-cs4349.o
obj-$(CONFIG_SND_SOC_CS47L24) += snd-soc-cs47l24.o obj-$(CONFIG_SND_SOC_CS47L24) += snd-soc-cs47l24.o
obj-$(CONFIG_SND_SOC_CS53L30) += snd-soc-cs53l30.o
obj-$(CONFIG_SND_SOC_CX20442) += snd-soc-cx20442.o obj-$(CONFIG_SND_SOC_CX20442) += snd-soc-cx20442.o
obj-$(CONFIG_SND_SOC_DA7210) += snd-soc-da7210.o obj-$(CONFIG_SND_SOC_DA7210) += snd-soc-da7210.o
obj-$(CONFIG_SND_SOC_DA7213) += snd-soc-da7213.o obj-$(CONFIG_SND_SOC_DA7213) += snd-soc-da7213.o
......
This diff is collapsed.
This diff is collapsed.
...@@ -13,8 +13,8 @@ ...@@ -13,8 +13,8 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/of_device.h> #include <linux/i2c.h>
#include <linux/of_irq.h> #include <linux/property.h>
#include <linux/pm_wakeirq.h> #include <linux/pm_wakeirq.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/delay.h> #include <linux/delay.h>
...@@ -382,11 +382,11 @@ static irqreturn_t da7219_aad_irq_thread(int irq, void *data) ...@@ -382,11 +382,11 @@ static irqreturn_t da7219_aad_irq_thread(int irq, void *data)
} }
/* /*
* DT to pdata conversion * DT/ACPI to pdata conversion
*/ */
static enum da7219_aad_micbias_pulse_lvl static enum da7219_aad_micbias_pulse_lvl
da7219_aad_of_micbias_pulse_lvl(struct snd_soc_codec *codec, u32 val) da7219_aad_fw_micbias_pulse_lvl(struct snd_soc_codec *codec, u32 val)
{ {
switch (val) { switch (val) {
case 2800: case 2800:
...@@ -400,7 +400,7 @@ static enum da7219_aad_micbias_pulse_lvl ...@@ -400,7 +400,7 @@ static enum da7219_aad_micbias_pulse_lvl
} }
static enum da7219_aad_btn_cfg static enum da7219_aad_btn_cfg
da7219_aad_of_btn_cfg(struct snd_soc_codec *codec, u32 val) da7219_aad_fw_btn_cfg(struct snd_soc_codec *codec, u32 val)
{ {
switch (val) { switch (val) {
case 2: case 2:
...@@ -424,7 +424,7 @@ static enum da7219_aad_btn_cfg ...@@ -424,7 +424,7 @@ static enum da7219_aad_btn_cfg
} }
static enum da7219_aad_mic_det_thr static enum da7219_aad_mic_det_thr
da7219_aad_of_mic_det_thr(struct snd_soc_codec *codec, u32 val) da7219_aad_fw_mic_det_thr(struct snd_soc_codec *codec, u32 val)
{ {
switch (val) { switch (val) {
case 200: case 200:
...@@ -442,7 +442,7 @@ static enum da7219_aad_mic_det_thr ...@@ -442,7 +442,7 @@ static enum da7219_aad_mic_det_thr
} }
static enum da7219_aad_jack_ins_deb static enum da7219_aad_jack_ins_deb
da7219_aad_of_jack_ins_deb(struct snd_soc_codec *codec, u32 val) da7219_aad_fw_jack_ins_deb(struct snd_soc_codec *codec, u32 val)
{ {
switch (val) { switch (val) {
case 5: case 5:
...@@ -468,7 +468,7 @@ static enum da7219_aad_jack_ins_deb ...@@ -468,7 +468,7 @@ static enum da7219_aad_jack_ins_deb
} }
static enum da7219_aad_jack_det_rate static enum da7219_aad_jack_det_rate
da7219_aad_of_jack_det_rate(struct snd_soc_codec *codec, const char *str) da7219_aad_fw_jack_det_rate(struct snd_soc_codec *codec, const char *str)
{ {
if (!strcmp(str, "32ms_64ms")) { if (!strcmp(str, "32ms_64ms")) {
return DA7219_AAD_JACK_DET_RATE_32_64MS; return DA7219_AAD_JACK_DET_RATE_32_64MS;
...@@ -485,7 +485,7 @@ static enum da7219_aad_jack_det_rate ...@@ -485,7 +485,7 @@ static enum da7219_aad_jack_det_rate
} }
static enum da7219_aad_jack_rem_deb static enum da7219_aad_jack_rem_deb
da7219_aad_of_jack_rem_deb(struct snd_soc_codec *codec, u32 val) da7219_aad_fw_jack_rem_deb(struct snd_soc_codec *codec, u32 val)
{ {
switch (val) { switch (val) {
case 1: case 1:
...@@ -503,7 +503,7 @@ static enum da7219_aad_jack_rem_deb ...@@ -503,7 +503,7 @@ static enum da7219_aad_jack_rem_deb
} }
static enum da7219_aad_btn_avg static enum da7219_aad_btn_avg
da7219_aad_of_btn_avg(struct snd_soc_codec *codec, u32 val) da7219_aad_fw_btn_avg(struct snd_soc_codec *codec, u32 val)
{ {
switch (val) { switch (val) {
case 1: case 1:
...@@ -521,7 +521,7 @@ static enum da7219_aad_btn_avg ...@@ -521,7 +521,7 @@ static enum da7219_aad_btn_avg
} }
static enum da7219_aad_adc_1bit_rpt static enum da7219_aad_adc_1bit_rpt
da7219_aad_of_adc_1bit_rpt(struct snd_soc_codec *codec, u32 val) da7219_aad_fw_adc_1bit_rpt(struct snd_soc_codec *codec, u32 val)
{ {
switch (val) { switch (val) {
case 1: case 1:
...@@ -538,97 +538,96 @@ static enum da7219_aad_adc_1bit_rpt ...@@ -538,97 +538,96 @@ static enum da7219_aad_adc_1bit_rpt
} }
} }
static struct da7219_aad_pdata *da7219_aad_of_to_pdata(struct snd_soc_codec *codec) static struct da7219_aad_pdata *da7219_aad_fw_to_pdata(struct snd_soc_codec *codec)
{ {
struct device_node *np = codec->dev->of_node; struct device *dev = codec->dev;
struct device_node *aad_np = of_find_node_by_name(np, "da7219_aad"); struct i2c_client *i2c = to_i2c_client(dev);
struct fwnode_handle *aad_np;
struct da7219_aad_pdata *aad_pdata; struct da7219_aad_pdata *aad_pdata;
const char *of_str; const char *fw_str;
u32 of_val32; u32 fw_val32;
aad_np = device_get_named_child_node(dev, "da7219_aad");
if (!aad_np) if (!aad_np)
return NULL; return NULL;
aad_pdata = devm_kzalloc(codec->dev, sizeof(*aad_pdata), GFP_KERNEL); aad_pdata = devm_kzalloc(codec->dev, sizeof(*aad_pdata), GFP_KERNEL);
if (!aad_pdata) if (!aad_pdata)
goto out; return NULL;
aad_pdata->irq = irq_of_parse_and_map(np, 0); aad_pdata->irq = i2c->irq;
if (of_property_read_u32(aad_np, "dlg,micbias-pulse-lvl", if (fwnode_property_read_u32(aad_np, "dlg,micbias-pulse-lvl",
&of_val32) >= 0) &fw_val32) >= 0)
aad_pdata->micbias_pulse_lvl = aad_pdata->micbias_pulse_lvl =
da7219_aad_of_micbias_pulse_lvl(codec, of_val32); da7219_aad_fw_micbias_pulse_lvl(codec, fw_val32);
else else
aad_pdata->micbias_pulse_lvl = DA7219_AAD_MICBIAS_PULSE_LVL_OFF; aad_pdata->micbias_pulse_lvl = DA7219_AAD_MICBIAS_PULSE_LVL_OFF;
if (of_property_read_u32(aad_np, "dlg,micbias-pulse-time", if (fwnode_property_read_u32(aad_np, "dlg,micbias-pulse-time",
&of_val32) >= 0) &fw_val32) >= 0)
aad_pdata->micbias_pulse_time = of_val32; aad_pdata->micbias_pulse_time = fw_val32;
if (of_property_read_u32(aad_np, "dlg,btn-cfg", &of_val32) >= 0) if (fwnode_property_read_u32(aad_np, "dlg,btn-cfg", &fw_val32) >= 0)
aad_pdata->btn_cfg = da7219_aad_of_btn_cfg(codec, of_val32); aad_pdata->btn_cfg = da7219_aad_fw_btn_cfg(codec, fw_val32);
else else
aad_pdata->btn_cfg = DA7219_AAD_BTN_CFG_10MS; aad_pdata->btn_cfg = DA7219_AAD_BTN_CFG_10MS;
if (of_property_read_u32(aad_np, "dlg,mic-det-thr", &of_val32) >= 0) if (fwnode_property_read_u32(aad_np, "dlg,mic-det-thr", &fw_val32) >= 0)
aad_pdata->mic_det_thr = aad_pdata->mic_det_thr =
da7219_aad_of_mic_det_thr(codec, of_val32); da7219_aad_fw_mic_det_thr(codec, fw_val32);
else else
aad_pdata->mic_det_thr = DA7219_AAD_MIC_DET_THR_500_OHMS; aad_pdata->mic_det_thr = DA7219_AAD_MIC_DET_THR_500_OHMS;
if (of_property_read_u32(aad_np, "dlg,jack-ins-deb", &of_val32) >= 0) if (fwnode_property_read_u32(aad_np, "dlg,jack-ins-deb", &fw_val32) >= 0)
aad_pdata->jack_ins_deb = aad_pdata->jack_ins_deb =
da7219_aad_of_jack_ins_deb(codec, of_val32); da7219_aad_fw_jack_ins_deb(codec, fw_val32);
else else
aad_pdata->jack_ins_deb = DA7219_AAD_JACK_INS_DEB_20MS; aad_pdata->jack_ins_deb = DA7219_AAD_JACK_INS_DEB_20MS;
if (!of_property_read_string(aad_np, "dlg,jack-det-rate", &of_str)) if (!fwnode_property_read_string(aad_np, "dlg,jack-det-rate", &fw_str))
aad_pdata->jack_det_rate = aad_pdata->jack_det_rate =
da7219_aad_of_jack_det_rate(codec, of_str); da7219_aad_fw_jack_det_rate(codec, fw_str);
else else
aad_pdata->jack_det_rate = DA7219_AAD_JACK_DET_RATE_256_512MS; aad_pdata->jack_det_rate = DA7219_AAD_JACK_DET_RATE_256_512MS;
if (of_property_read_u32(aad_np, "dlg,jack-rem-deb", &of_val32) >= 0) if (fwnode_property_read_u32(aad_np, "dlg,jack-rem-deb", &fw_val32) >= 0)
aad_pdata->jack_rem_deb = aad_pdata->jack_rem_deb =
da7219_aad_of_jack_rem_deb(codec, of_val32); da7219_aad_fw_jack_rem_deb(codec, fw_val32);
else else
aad_pdata->jack_rem_deb = DA7219_AAD_JACK_REM_DEB_1MS; aad_pdata->jack_rem_deb = DA7219_AAD_JACK_REM_DEB_1MS;
if (of_property_read_u32(aad_np, "dlg,a-d-btn-thr", &of_val32) >= 0) if (fwnode_property_read_u32(aad_np, "dlg,a-d-btn-thr", &fw_val32) >= 0)
aad_pdata->a_d_btn_thr = (u8) of_val32; aad_pdata->a_d_btn_thr = (u8) fw_val32;
else else
aad_pdata->a_d_btn_thr = 0xA; aad_pdata->a_d_btn_thr = 0xA;
if (of_property_read_u32(aad_np, "dlg,d-b-btn-thr", &of_val32) >= 0) if (fwnode_property_read_u32(aad_np, "dlg,d-b-btn-thr", &fw_val32) >= 0)
aad_pdata->d_b_btn_thr = (u8) of_val32; aad_pdata->d_b_btn_thr = (u8) fw_val32;
else else
aad_pdata->d_b_btn_thr = 0x16; aad_pdata->d_b_btn_thr = 0x16;
if (of_property_read_u32(aad_np, "dlg,b-c-btn-thr", &of_val32) >= 0) if (fwnode_property_read_u32(aad_np, "dlg,b-c-btn-thr", &fw_val32) >= 0)
aad_pdata->b_c_btn_thr = (u8) of_val32; aad_pdata->b_c_btn_thr = (u8) fw_val32;
else else
aad_pdata->b_c_btn_thr = 0x21; aad_pdata->b_c_btn_thr = 0x21;
if (of_property_read_u32(aad_np, "dlg,c-mic-btn-thr", &of_val32) >= 0) if (fwnode_property_read_u32(aad_np, "dlg,c-mic-btn-thr", &fw_val32) >= 0)
aad_pdata->c_mic_btn_thr = (u8) of_val32; aad_pdata->c_mic_btn_thr = (u8) fw_val32;
else else
aad_pdata->c_mic_btn_thr = 0x3E; aad_pdata->c_mic_btn_thr = 0x3E;
if (of_property_read_u32(aad_np, "dlg,btn-avg", &of_val32) >= 0) if (fwnode_property_read_u32(aad_np, "dlg,btn-avg", &fw_val32) >= 0)
aad_pdata->btn_avg = da7219_aad_of_btn_avg(codec, of_val32); aad_pdata->btn_avg = da7219_aad_fw_btn_avg(codec, fw_val32);
else else
aad_pdata->btn_avg = DA7219_AAD_BTN_AVG_2; aad_pdata->btn_avg = DA7219_AAD_BTN_AVG_2;
if (of_property_read_u32(aad_np, "dlg,adc-1bit-rpt", &of_val32) >= 0) if (fwnode_property_read_u32(aad_np, "dlg,adc-1bit-rpt", &fw_val32) >= 0)
aad_pdata->adc_1bit_rpt = aad_pdata->adc_1bit_rpt =
da7219_aad_of_adc_1bit_rpt(codec, of_val32); da7219_aad_fw_adc_1bit_rpt(codec, fw_val32);
else else
aad_pdata->adc_1bit_rpt = DA7219_AAD_ADC_1BIT_RPT_1; aad_pdata->adc_1bit_rpt = DA7219_AAD_ADC_1BIT_RPT_1;
out:
of_node_put(aad_np);
return aad_pdata; return aad_pdata;
} }
...@@ -769,9 +768,9 @@ int da7219_aad_init(struct snd_soc_codec *codec) ...@@ -769,9 +768,9 @@ int da7219_aad_init(struct snd_soc_codec *codec)
da7219->aad = da7219_aad; da7219->aad = da7219_aad;
da7219_aad->codec = codec; da7219_aad->codec = codec;
/* Handle any DT/platform data */ /* Handle any DT/ACPI/platform data */
if ((codec->dev->of_node) && (da7219->pdata)) if (da7219->pdata && !da7219->pdata->aad_pdata)
da7219->pdata->aad_pdata = da7219_aad_of_to_pdata(codec); da7219->pdata->aad_pdata = da7219_aad_fw_to_pdata(codec);
da7219_aad_handle_pdata(codec); da7219_aad_handle_pdata(codec);
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#include <linux/clk.h> #include <linux/clk.h>
#include <linux/i2c.h> #include <linux/i2c.h>
#include <linux/of_device.h> #include <linux/of_device.h>
#include <linux/property.h>
#include <linux/regmap.h> #include <linux/regmap.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/pm.h> #include <linux/pm.h>
...@@ -1418,7 +1419,7 @@ static struct snd_soc_dai_driver da7219_dai = { ...@@ -1418,7 +1419,7 @@ static struct snd_soc_dai_driver da7219_dai = {
/* /*
* DT * DT/ACPI
*/ */
static const struct of_device_id da7219_of_match[] = { static const struct of_device_id da7219_of_match[] = {
...@@ -1434,7 +1435,7 @@ static const struct acpi_device_id da7219_acpi_match[] = { ...@@ -1434,7 +1435,7 @@ static const struct acpi_device_id da7219_acpi_match[] = {
MODULE_DEVICE_TABLE(acpi, da7219_acpi_match); MODULE_DEVICE_TABLE(acpi, da7219_acpi_match);
static enum da7219_micbias_voltage static enum da7219_micbias_voltage
da7219_of_micbias_lvl(struct snd_soc_codec *codec, u32 val) da7219_fw_micbias_lvl(struct device *dev, u32 val)
{ {
switch (val) { switch (val) {
case 1600: case 1600:
...@@ -1450,13 +1451,13 @@ static enum da7219_micbias_voltage ...@@ -1450,13 +1451,13 @@ static enum da7219_micbias_voltage
case 2600: case 2600:
return DA7219_MICBIAS_2_6V; return DA7219_MICBIAS_2_6V;
default: default:
dev_warn(codec->dev, "Invalid micbias level"); dev_warn(dev, "Invalid micbias level");
return DA7219_MICBIAS_2_2V; return DA7219_MICBIAS_2_2V;
} }
} }
static enum da7219_mic_amp_in_sel static enum da7219_mic_amp_in_sel
da7219_of_mic_amp_in_sel(struct snd_soc_codec *codec, const char *str) da7219_fw_mic_amp_in_sel(struct device *dev, const char *str)
{ {
if (!strcmp(str, "diff")) { if (!strcmp(str, "diff")) {
return DA7219_MIC_AMP_IN_SEL_DIFF; return DA7219_MIC_AMP_IN_SEL_DIFF;
...@@ -1465,29 +1466,29 @@ static enum da7219_mic_amp_in_sel ...@@ -1465,29 +1466,29 @@ static enum da7219_mic_amp_in_sel
} else if (!strcmp(str, "se_n")) { } else if (!strcmp(str, "se_n")) {
return DA7219_MIC_AMP_IN_SEL_SE_N; return DA7219_MIC_AMP_IN_SEL_SE_N;
} else { } else {
dev_warn(codec->dev, "Invalid mic input type selection"); dev_warn(dev, "Invalid mic input type selection");
return DA7219_MIC_AMP_IN_SEL_DIFF; return DA7219_MIC_AMP_IN_SEL_DIFF;
} }
} }
static struct da7219_pdata *da7219_of_to_pdata(struct snd_soc_codec *codec) static struct da7219_pdata *da7219_fw_to_pdata(struct snd_soc_codec *codec)
{ {
struct device_node *np = codec->dev->of_node; struct device *dev = codec->dev;
struct da7219_pdata *pdata; struct da7219_pdata *pdata;
const char *of_str; const char *of_str;
u32 of_val32; u32 of_val32;
pdata = devm_kzalloc(codec->dev, sizeof(*pdata), GFP_KERNEL); pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL);
if (!pdata) if (!pdata)
return NULL; return NULL;
if (of_property_read_u32(np, "dlg,micbias-lvl", &of_val32) >= 0) if (device_property_read_u32(dev, "dlg,micbias-lvl", &of_val32) >= 0)
pdata->micbias_lvl = da7219_of_micbias_lvl(codec, of_val32); pdata->micbias_lvl = da7219_fw_micbias_lvl(dev, of_val32);
else else
pdata->micbias_lvl = DA7219_MICBIAS_2_2V; pdata->micbias_lvl = DA7219_MICBIAS_2_2V;
if (!of_property_read_string(np, "dlg,mic-amp-in-sel", &of_str)) if (!device_property_read_string(dev, "dlg,mic-amp-in-sel", &of_str))
pdata->mic_amp_in_sel = da7219_of_mic_amp_in_sel(codec, of_str); pdata->mic_amp_in_sel = da7219_fw_mic_amp_in_sel(dev, of_str);
else else
pdata->mic_amp_in_sel = DA7219_MIC_AMP_IN_SEL_DIFF; pdata->mic_amp_in_sel = DA7219_MIC_AMP_IN_SEL_DIFF;
...@@ -1662,11 +1663,10 @@ static int da7219_probe(struct snd_soc_codec *codec) ...@@ -1662,11 +1663,10 @@ static int da7219_probe(struct snd_soc_codec *codec)
break; break;
} }
/* Handle DT/Platform data */ /* Handle DT/ACPI/Platform data */
if (codec->dev->of_node) da7219->pdata = dev_get_platdata(codec->dev);
da7219->pdata = da7219_of_to_pdata(codec); if (!da7219->pdata)
else da7219->pdata = da7219_fw_to_pdata(codec);
da7219->pdata = dev_get_platdata(codec->dev);
da7219_handle_pdata(codec); da7219_handle_pdata(codec);
......
...@@ -1599,7 +1599,14 @@ static struct davinci_mcasp_pdata *davinci_mcasp_set_pdata_from_of( ...@@ -1599,7 +1599,14 @@ static struct davinci_mcasp_pdata *davinci_mcasp_set_pdata_from_of(
pdata = pdev->dev.platform_data; pdata = pdev->dev.platform_data;
return pdata; return pdata;
} else if (match) { } else if (match) {
pdata = (struct davinci_mcasp_pdata*) match->data; pdata = devm_kmemdup(&pdev->dev, match->data, sizeof(*pdata),
GFP_KERNEL);
if (!pdata) {
dev_err(&pdev->dev,
"Failed to allocate memory for pdata\n");
ret = -ENOMEM;
return pdata;
}
} else { } else {
/* control shouldn't reach here. something is wrong */ /* control shouldn't reach here. something is wrong */
ret = -EINVAL; ret = -EINVAL;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment