mirror of
https://github.com/joel16/android_kernel_sony_msm8994.git
synced 2024-11-27 06:01:12 +00:00
mfd: Initial support for the WM5110
The WM5110 is a highly-integrated low-power audio system for smartphones, tablets and other portable audio devices. It combines an advanced DSP feature set with a flexible, high-performance audio hub CODEC. The support is based on the Arizona core driver. Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com> Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
This commit is contained in:
parent
9cd9e289dd
commit
e102befe7a
@ -550,6 +550,12 @@ config MFD_WM5102
|
|||||||
help
|
help
|
||||||
Support for Wolfson Microelectronics WM5102 low power audio SoC
|
Support for Wolfson Microelectronics WM5102 low power audio SoC
|
||||||
|
|
||||||
|
config MFD_WM5110
|
||||||
|
bool "Support Wolfson Microelectronics WM5110"
|
||||||
|
depends on MFD_ARIZONA
|
||||||
|
help
|
||||||
|
Support for Wolfson Microelectronics WM5110 low power audio SoC
|
||||||
|
|
||||||
config MFD_WM8400
|
config MFD_WM8400
|
||||||
bool "Support Wolfson Microelectronics WM8400"
|
bool "Support Wolfson Microelectronics WM8400"
|
||||||
select MFD_CORE
|
select MFD_CORE
|
||||||
|
@ -33,6 +33,9 @@ obj-$(CONFIG_MFD_ARIZONA_SPI) += arizona-spi.o
|
|||||||
ifneq ($(CONFIG_MFD_WM5102),n)
|
ifneq ($(CONFIG_MFD_WM5102),n)
|
||||||
obj-$(CONFIG_MFD_ARIZONA) += wm5102-tables.o
|
obj-$(CONFIG_MFD_ARIZONA) += wm5102-tables.o
|
||||||
endif
|
endif
|
||||||
|
ifneq ($(CONFIG_MFD_WM5110),n)
|
||||||
|
obj-$(CONFIG_MFD_ARIZONA) += wm5110-tables.o
|
||||||
|
endif
|
||||||
obj-$(CONFIG_MFD_WM8400) += wm8400-core.o
|
obj-$(CONFIG_MFD_WM8400) += wm8400-core.o
|
||||||
wm831x-objs := wm831x-core.o wm831x-irq.o wm831x-otp.o
|
wm831x-objs := wm831x-core.o wm831x-irq.o wm831x-otp.o
|
||||||
wm831x-objs += wm831x-auxadc.o
|
wm831x-objs += wm831x-auxadc.o
|
||||||
|
@ -273,6 +273,14 @@ static struct mfd_cell wm5102_devs[] = {
|
|||||||
{ .name = "wm5102-codec" },
|
{ .name = "wm5102-codec" },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct mfd_cell wm5110_devs[] = {
|
||||||
|
{ .name = "arizona-extcon" },
|
||||||
|
{ .name = "arizona-gpio" },
|
||||||
|
{ .name = "arizona-micsupp" },
|
||||||
|
{ .name = "arizona-pwm" },
|
||||||
|
{ .name = "wm5110-codec" },
|
||||||
|
};
|
||||||
|
|
||||||
int __devinit arizona_dev_init(struct arizona *arizona)
|
int __devinit arizona_dev_init(struct arizona *arizona)
|
||||||
{
|
{
|
||||||
struct device *dev = arizona->dev;
|
struct device *dev = arizona->dev;
|
||||||
@ -291,6 +299,7 @@ int __devinit arizona_dev_init(struct arizona *arizona)
|
|||||||
|
|
||||||
switch (arizona->type) {
|
switch (arizona->type) {
|
||||||
case WM5102:
|
case WM5102:
|
||||||
|
case WM5110:
|
||||||
for (i = 0; i < ARRAY_SIZE(wm5102_core_supplies); i++)
|
for (i = 0; i < ARRAY_SIZE(wm5102_core_supplies); i++)
|
||||||
arizona->core_supplies[i].supply
|
arizona->core_supplies[i].supply
|
||||||
= wm5102_core_supplies[i];
|
= wm5102_core_supplies[i];
|
||||||
@ -378,6 +387,17 @@ int __devinit arizona_dev_init(struct arizona *arizona)
|
|||||||
}
|
}
|
||||||
ret = wm5102_patch(arizona);
|
ret = wm5102_patch(arizona);
|
||||||
break;
|
break;
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_MFD_WM5110
|
||||||
|
case 0x5110:
|
||||||
|
type_name = "WM5110";
|
||||||
|
if (arizona->type != WM5110) {
|
||||||
|
dev_err(arizona->dev, "WM5110 registered as %d\n",
|
||||||
|
arizona->type);
|
||||||
|
arizona->type = WM5110;
|
||||||
|
}
|
||||||
|
ret = wm5110_patch(arizona);
|
||||||
|
break;
|
||||||
#endif
|
#endif
|
||||||
default:
|
default:
|
||||||
dev_err(arizona->dev, "Unknown device ID %x\n", reg);
|
dev_err(arizona->dev, "Unknown device ID %x\n", reg);
|
||||||
@ -494,6 +514,10 @@ int __devinit arizona_dev_init(struct arizona *arizona)
|
|||||||
ret = mfd_add_devices(arizona->dev, -1, wm5102_devs,
|
ret = mfd_add_devices(arizona->dev, -1, wm5102_devs,
|
||||||
ARRAY_SIZE(wm5102_devs), NULL, 0);
|
ARRAY_SIZE(wm5102_devs), NULL, 0);
|
||||||
break;
|
break;
|
||||||
|
case WM5110:
|
||||||
|
ret = mfd_add_devices(arizona->dev, -1, wm5110_devs,
|
||||||
|
ARRAY_SIZE(wm5102_devs), NULL, 0);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
|
@ -34,6 +34,11 @@ static __devinit int arizona_i2c_probe(struct i2c_client *i2c,
|
|||||||
case WM5102:
|
case WM5102:
|
||||||
regmap_config = &wm5102_i2c_regmap;
|
regmap_config = &wm5102_i2c_regmap;
|
||||||
break;
|
break;
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_MFD_WM5110
|
||||||
|
case WM5110:
|
||||||
|
regmap_config = &wm5110_i2c_regmap;
|
||||||
|
break;
|
||||||
#endif
|
#endif
|
||||||
default:
|
default:
|
||||||
dev_err(&i2c->dev, "Unknown device type %ld\n",
|
dev_err(&i2c->dev, "Unknown device type %ld\n",
|
||||||
@ -69,6 +74,7 @@ static int __devexit arizona_i2c_remove(struct i2c_client *i2c)
|
|||||||
|
|
||||||
static const struct i2c_device_id arizona_i2c_id[] = {
|
static const struct i2c_device_id arizona_i2c_id[] = {
|
||||||
{ "wm5102", WM5102 },
|
{ "wm5102", WM5102 },
|
||||||
|
{ "wm5110", WM5110 },
|
||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
MODULE_DEVICE_TABLE(i2c, arizona_i2c_id);
|
MODULE_DEVICE_TABLE(i2c, arizona_i2c_id);
|
||||||
|
@ -163,6 +163,12 @@ int arizona_irq_init(struct arizona *arizona)
|
|||||||
aod = &wm5102_aod;
|
aod = &wm5102_aod;
|
||||||
irq = &wm5102_irq;
|
irq = &wm5102_irq;
|
||||||
break;
|
break;
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_MFD_WM5110
|
||||||
|
case WM5110:
|
||||||
|
aod = &wm5110_aod;
|
||||||
|
irq = &wm5110_irq;
|
||||||
|
break;
|
||||||
#endif
|
#endif
|
||||||
default:
|
default:
|
||||||
BUG_ON("Unknown Arizona class device" == NULL);
|
BUG_ON("Unknown Arizona class device" == NULL);
|
||||||
|
@ -34,6 +34,11 @@ static int __devinit arizona_spi_probe(struct spi_device *spi)
|
|||||||
case WM5102:
|
case WM5102:
|
||||||
regmap_config = &wm5102_spi_regmap;
|
regmap_config = &wm5102_spi_regmap;
|
||||||
break;
|
break;
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_MFD_WM5110
|
||||||
|
case WM5110:
|
||||||
|
regmap_config = &wm5110_spi_regmap;
|
||||||
|
break;
|
||||||
#endif
|
#endif
|
||||||
default:
|
default:
|
||||||
dev_err(&spi->dev, "Unknown device type %ld\n",
|
dev_err(&spi->dev, "Unknown device type %ld\n",
|
||||||
@ -69,6 +74,7 @@ static int __devexit arizona_spi_remove(struct spi_device *spi)
|
|||||||
|
|
||||||
static const struct spi_device_id arizona_spi_ids[] = {
|
static const struct spi_device_id arizona_spi_ids[] = {
|
||||||
{ "wm5102", WM5102 },
|
{ "wm5102", WM5102 },
|
||||||
|
{ "wm5110", WM5110 },
|
||||||
{ },
|
{ },
|
||||||
};
|
};
|
||||||
MODULE_DEVICE_TABLE(spi, arizona_spi_ids);
|
MODULE_DEVICE_TABLE(spi, arizona_spi_ids);
|
||||||
|
@ -20,11 +20,18 @@ struct wm_arizona;
|
|||||||
|
|
||||||
extern const struct regmap_config wm5102_i2c_regmap;
|
extern const struct regmap_config wm5102_i2c_regmap;
|
||||||
extern const struct regmap_config wm5102_spi_regmap;
|
extern const struct regmap_config wm5102_spi_regmap;
|
||||||
|
|
||||||
|
extern const struct regmap_config wm5110_i2c_regmap;
|
||||||
|
extern const struct regmap_config wm5110_spi_regmap;
|
||||||
|
|
||||||
extern const struct dev_pm_ops arizona_pm_ops;
|
extern const struct dev_pm_ops arizona_pm_ops;
|
||||||
|
|
||||||
extern const struct regmap_irq_chip wm5102_aod;
|
extern const struct regmap_irq_chip wm5102_aod;
|
||||||
extern const struct regmap_irq_chip wm5102_irq;
|
extern const struct regmap_irq_chip wm5102_irq;
|
||||||
|
|
||||||
|
extern const struct regmap_irq_chip wm5110_aod;
|
||||||
|
extern const struct regmap_irq_chip wm5110_irq;
|
||||||
|
|
||||||
int arizona_dev_init(struct arizona *arizona);
|
int arizona_dev_init(struct arizona *arizona);
|
||||||
int arizona_dev_exit(struct arizona *arizona);
|
int arizona_dev_exit(struct arizona *arizona);
|
||||||
int arizona_irq_init(struct arizona *arizona);
|
int arizona_irq_init(struct arizona *arizona);
|
||||||
|
@ -22,6 +22,7 @@
|
|||||||
|
|
||||||
enum arizona_type {
|
enum arizona_type {
|
||||||
WM5102 = 1,
|
WM5102 = 1,
|
||||||
|
WM5110 = 2,
|
||||||
};
|
};
|
||||||
|
|
||||||
#define ARIZONA_IRQ_GP1 0
|
#define ARIZONA_IRQ_GP1 0
|
||||||
@ -33,40 +34,49 @@ enum arizona_type {
|
|||||||
#define ARIZONA_IRQ_JD_FALL 6
|
#define ARIZONA_IRQ_JD_FALL 6
|
||||||
#define ARIZONA_IRQ_JD_RISE 7
|
#define ARIZONA_IRQ_JD_RISE 7
|
||||||
#define ARIZONA_IRQ_DSP1_RAM_RDY 8
|
#define ARIZONA_IRQ_DSP1_RAM_RDY 8
|
||||||
#define ARIZONA_IRQ_DSP_IRQ1 9
|
#define ARIZONA_IRQ_DSP2_RAM_RDY 9
|
||||||
#define ARIZONA_IRQ_DSP_IRQ2 10
|
#define ARIZONA_IRQ_DSP3_RAM_RDY 10
|
||||||
#define ARIZONA_IRQ_SPK_SHUTDOWN_WARN 11
|
#define ARIZONA_IRQ_DSP4_RAM_RDY 11
|
||||||
#define ARIZONA_IRQ_SPK_SHUTDOWN 12
|
#define ARIZONA_IRQ_DSP_IRQ1 12
|
||||||
#define ARIZONA_IRQ_MICDET 13
|
#define ARIZONA_IRQ_DSP_IRQ2 13
|
||||||
#define ARIZONA_IRQ_HPDET 14
|
#define ARIZONA_IRQ_DSP_IRQ3 14
|
||||||
#define ARIZONA_IRQ_WSEQ_DONE 15
|
#define ARIZONA_IRQ_DSP_IRQ4 15
|
||||||
#define ARIZONA_IRQ_DRC2_SIG_DET 16
|
#define ARIZONA_IRQ_DSP_IRQ5 16
|
||||||
#define ARIZONA_IRQ_DRC1_SIG_DET 17
|
#define ARIZONA_IRQ_DSP_IRQ6 17
|
||||||
#define ARIZONA_IRQ_ASRC2_LOCK 18
|
#define ARIZONA_IRQ_DSP_IRQ7 18
|
||||||
#define ARIZONA_IRQ_ASRC1_LOCK 19
|
#define ARIZONA_IRQ_DSP_IRQ8 19
|
||||||
#define ARIZONA_IRQ_UNDERCLOCKED 20
|
#define ARIZONA_IRQ_SPK_SHUTDOWN_WARN 20
|
||||||
#define ARIZONA_IRQ_OVERCLOCKED 21
|
#define ARIZONA_IRQ_SPK_SHUTDOWN 21
|
||||||
#define ARIZONA_IRQ_FLL2_LOCK 22
|
#define ARIZONA_IRQ_MICDET 22
|
||||||
#define ARIZONA_IRQ_FLL1_LOCK 23
|
#define ARIZONA_IRQ_HPDET 23
|
||||||
#define ARIZONA_IRQ_CLKGEN_ERR 24
|
#define ARIZONA_IRQ_WSEQ_DONE 24
|
||||||
#define ARIZONA_IRQ_CLKGEN_ERR_ASYNC 25
|
#define ARIZONA_IRQ_DRC2_SIG_DET 25
|
||||||
#define ARIZONA_IRQ_ASRC_CFG_ERR 26
|
#define ARIZONA_IRQ_DRC1_SIG_DET 26
|
||||||
#define ARIZONA_IRQ_AIF3_ERR 27
|
#define ARIZONA_IRQ_ASRC2_LOCK 27
|
||||||
#define ARIZONA_IRQ_AIF2_ERR 28
|
#define ARIZONA_IRQ_ASRC1_LOCK 28
|
||||||
#define ARIZONA_IRQ_AIF1_ERR 29
|
#define ARIZONA_IRQ_UNDERCLOCKED 29
|
||||||
#define ARIZONA_IRQ_CTRLIF_ERR 30
|
#define ARIZONA_IRQ_OVERCLOCKED 30
|
||||||
#define ARIZONA_IRQ_MIXER_DROPPED_SAMPLES 31
|
#define ARIZONA_IRQ_FLL2_LOCK 31
|
||||||
#define ARIZONA_IRQ_ASYNC_CLK_ENA_LOW 32
|
#define ARIZONA_IRQ_FLL1_LOCK 32
|
||||||
#define ARIZONA_IRQ_SYSCLK_ENA_LOW 33
|
#define ARIZONA_IRQ_CLKGEN_ERR 33
|
||||||
#define ARIZONA_IRQ_ISRC1_CFG_ERR 34
|
#define ARIZONA_IRQ_CLKGEN_ERR_ASYNC 34
|
||||||
#define ARIZONA_IRQ_ISRC2_CFG_ERR 35
|
#define ARIZONA_IRQ_ASRC_CFG_ERR 35
|
||||||
#define ARIZONA_IRQ_BOOT_DONE 36
|
#define ARIZONA_IRQ_AIF3_ERR 36
|
||||||
#define ARIZONA_IRQ_DCS_DAC_DONE 37
|
#define ARIZONA_IRQ_AIF2_ERR 37
|
||||||
#define ARIZONA_IRQ_DCS_HP_DONE 38
|
#define ARIZONA_IRQ_AIF1_ERR 38
|
||||||
#define ARIZONA_IRQ_FLL2_CLOCK_OK 39
|
#define ARIZONA_IRQ_CTRLIF_ERR 39
|
||||||
#define ARIZONA_IRQ_FLL1_CLOCK_OK 40
|
#define ARIZONA_IRQ_MIXER_DROPPED_SAMPLES 40
|
||||||
|
#define ARIZONA_IRQ_ASYNC_CLK_ENA_LOW 41
|
||||||
|
#define ARIZONA_IRQ_SYSCLK_ENA_LOW 42
|
||||||
|
#define ARIZONA_IRQ_ISRC1_CFG_ERR 43
|
||||||
|
#define ARIZONA_IRQ_ISRC2_CFG_ERR 44
|
||||||
|
#define ARIZONA_IRQ_BOOT_DONE 45
|
||||||
|
#define ARIZONA_IRQ_DCS_DAC_DONE 46
|
||||||
|
#define ARIZONA_IRQ_DCS_HP_DONE 47
|
||||||
|
#define ARIZONA_IRQ_FLL2_CLOCK_OK 48
|
||||||
|
#define ARIZONA_IRQ_FLL1_CLOCK_OK 49
|
||||||
|
|
||||||
#define ARIZONA_NUM_IRQ 41
|
#define ARIZONA_NUM_IRQ 50
|
||||||
|
|
||||||
struct arizona {
|
struct arizona {
|
||||||
struct regmap *regmap;
|
struct regmap *regmap;
|
||||||
@ -99,5 +109,6 @@ void arizona_free_irq(struct arizona *arizona, int irq, void *data);
|
|||||||
int arizona_set_irq_wake(struct arizona *arizona, int irq, int on);
|
int arizona_set_irq_wake(struct arizona *arizona, int irq, int on);
|
||||||
|
|
||||||
int wm5102_patch(struct arizona *arizona);
|
int wm5102_patch(struct arizona *arizona);
|
||||||
|
int wm5110_patch(struct arizona *arizona);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -49,7 +49,7 @@
|
|||||||
#define ARIZONA_32KZ_MCLK2 2
|
#define ARIZONA_32KZ_MCLK2 2
|
||||||
#define ARIZONA_32KZ_NONE 3
|
#define ARIZONA_32KZ_NONE 3
|
||||||
|
|
||||||
#define ARIZONA_MAX_INPUT 3
|
#define ARIZONA_MAX_INPUT 4
|
||||||
|
|
||||||
#define ARIZONA_DMIC_MICVDD 0
|
#define ARIZONA_DMIC_MICVDD 0
|
||||||
#define ARIZONA_DMIC_MICBIAS1 1
|
#define ARIZONA_DMIC_MICBIAS1 1
|
||||||
@ -60,7 +60,7 @@
|
|||||||
#define ARIZONA_INMODE_SE 1
|
#define ARIZONA_INMODE_SE 1
|
||||||
#define ARIZONA_INMODE_DMIC 2
|
#define ARIZONA_INMODE_DMIC 2
|
||||||
|
|
||||||
#define ARIZONA_MAX_OUTPUT 5
|
#define ARIZONA_MAX_OUTPUT 6
|
||||||
|
|
||||||
#define ARIZONA_MAX_PDM_SPK 2
|
#define ARIZONA_MAX_PDM_SPK 2
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user