Add support for the InvenSense ICS-43432 I2S MEMS microphone. This is a non-software-configurable MEMS microphone with I2S output. Tested on a setup with a single ICS-43432 (the device itself supports stereo operation using a hardware pin controlling left vs. right channel output). Signed-off-by: Ricard Wanderlof <ricardw@axis.com> Signed-off-by: Mark Brown <broonie@kernel.org>tirimbino
parent
bc0195aad0
commit
3b7ce99748
@ -0,0 +1,17 @@ |
||||
Invensense ICS-43432 MEMS microphone with I2S output. |
||||
|
||||
There are no software configuration options for this device, indeed, the only |
||||
host connection is the I2S interface. Apart from requirements on clock |
||||
frequency (460 kHz to 3.379 MHz according to the data sheet) there must be |
||||
64 clock cycles in each stereo output frame; 24 of the 32 available bits |
||||
contain audio data. A hardware pin determines if the device outputs data |
||||
on the left or right channel of the I2S frame. |
||||
|
||||
Required properties: |
||||
- compatible : Must be "invensense,ics43432" |
||||
|
||||
Example: |
||||
|
||||
ics43432: ics43432 { |
||||
compatible = "invensense,ics43432"; |
||||
}; |
@ -0,0 +1,77 @@ |
||||
/*
|
||||
* I2S MEMS microphone driver for InvenSense ICS-43432 |
||||
* |
||||
* - Non configurable. |
||||
* - I2S interface, 64 BCLs per frame, 32 bits per channel, 24 bit data |
||||
* |
||||
* Copyright (c) 2015 Axis Communications AB |
||||
* |
||||
* Licensed under GPL2. |
||||
*/ |
||||
|
||||
#include <linux/module.h> |
||||
#include <linux/init.h> |
||||
#include <linux/slab.h> |
||||
#include <sound/core.h> |
||||
#include <sound/pcm.h> |
||||
#include <sound/pcm_params.h> |
||||
#include <sound/soc.h> |
||||
#include <sound/initval.h> |
||||
#include <sound/tlv.h> |
||||
|
||||
#define ICS43432_RATE_MIN 7190 /* Hz, from data sheet */ |
||||
#define ICS43432_RATE_MAX 52800 /* Hz, from data sheet */ |
||||
|
||||
#define ICS43432_FORMATS (SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32) |
||||
|
||||
static struct snd_soc_dai_driver ics43432_dai = { |
||||
.name = "ics43432-hifi", |
||||
.capture = { |
||||
.stream_name = "Capture", |
||||
.channels_min = 1, |
||||
.channels_max = 2, |
||||
.rate_min = ICS43432_RATE_MIN, |
||||
.rate_max = ICS43432_RATE_MAX, |
||||
.rates = SNDRV_PCM_RATE_CONTINUOUS, |
||||
.formats = ICS43432_FORMATS, |
||||
}, |
||||
}; |
||||
|
||||
static struct snd_soc_codec_driver ics43432_codec_driver = { |
||||
}; |
||||
|
||||
static int ics43432_probe(struct platform_device *pdev) |
||||
{ |
||||
return snd_soc_register_codec(&pdev->dev, &ics43432_codec_driver, |
||||
&ics43432_dai, 1); |
||||
} |
||||
|
||||
static int ics43432_remove(struct platform_device *pdev) |
||||
{ |
||||
snd_soc_unregister_codec(&pdev->dev); |
||||
return 0; |
||||
} |
||||
|
||||
#ifdef CONFIG_OF |
||||
static const struct of_device_id ics43432_ids[] = { |
||||
{ .compatible = "invensense,ics43432", }, |
||||
{ } |
||||
}; |
||||
MODULE_DEVICE_TABLE(of, ics43432_dt_ids); |
||||
#endif |
||||
|
||||
static struct platform_driver ics43432_driver = { |
||||
.driver = { |
||||
.name = "ics43432", |
||||
.owner = THIS_MODULE, |
||||
.of_match_table = of_match_ptr(ics43432_ids), |
||||
}, |
||||
.probe = ics43432_probe, |
||||
.remove = ics43432_remove, |
||||
}; |
||||
|
||||
module_platform_driver(ics43432_driver); |
||||
|
||||
MODULE_DESCRIPTION("ASoC ICS43432 driver"); |
||||
MODULE_AUTHOR("Ricard Wanderlof <ricardw@axis.com>"); |
||||
MODULE_LICENSE("GPLv2"); |
Loading…
Reference in new issue