wm5110 Interrupt Updates
Subsystems (4)
cover wm5110 Interrupt Updates
The newer versions of the wm5110 have made fairly substancial changes to the interrupts, adding in many new interrupts and moving some existing ones. These patches update the register redefinitions and regmap hookup for these. Full support is provided for both the old IP and the new.
Thanks,
Charles
Charles Keepax (5):
mfd: wm5110: Remove non-existant interrupts
mfd: wm5110: Add in the output done interrupts
mfd: arizona: Rename thermal shutdown interrupt
mfd: wm5110: Add new interrupt register definitions
mfd: arizona: Add missing handling for ISRC3 under/overclocked
drivers/mfd/arizona-core.c | 4 + drivers/mfd/arizona-irq.c | 10 +- drivers/mfd/arizona.h | 1 + drivers/mfd/wm5102-tables.c | 8 +- drivers/mfd/wm5110-tables.c | 245 ++++++++++- drivers/mfd/wm8997-tables.c | 8 +- include/linux/mfd/arizona/core.h | 29 ++- include/linux/mfd/arizona/registers.h | 785 +++++++++++++++++++++++++++++++-- sound/soc/codecs/arizona.c | 10 +- 9 files changed, 1033 insertions(+), 67 deletions(-)
Signature · 1 line
1.7.2.5
PATCH 1/5 mfd: wm5110: Remove non-existant interrupts
The DCS_DAC_DONE and DCS_HP_DONE interrupts do not exist on the wm5110 version of the IP. This patch removes them from the regmap IRQ structure.
--- drivers/mfd/wm5110-tables.c | 6 ------ 1 files changed, 0 insertions(+), 6 deletions(-)
drivers/mfd/wm5110-tables.c +0 -6
@@ -420,12 +420,6 @@ static const struct regmap_irq wm5110_irqs[ARIZONA_NUM_IRQ] = { [ARIZONA_IRQ_BOOT_DONE] = { .reg_offset = 4, .mask = ARIZONA_BOOT_DONE_EINT1 }, - [ARIZONA_IRQ_DCS_DAC_DONE] = { - .reg_offset = 4, .mask = ARIZONA_DCS_DAC_DONE_EINT1 - }, - [ARIZONA_IRQ_DCS_HP_DONE] = { - .reg_offset = 4, .mask = ARIZONA_DCS_HP_DONE_EINT1 - }, [ARIZONA_IRQ_FLL2_CLOCK_OK] = { .reg_offset = 4, .mask = ARIZONA_FLL2_CLOCK_OK_EINT1 },
Signature · 1 line
1.7.2.5
PATCH 2/5 mfd: wm5110: Add in the output done interrupts
In reply to Charles Keepaxwm5110 has interrupts to signal that an output has fully enabled. This patch adds in these interrupts although use is not made of them yet.
--- drivers/mfd/wm5110-tables.c | 18 +++++ include/linux/mfd/arizona/core.h | 8 ++- include/linux/mfd/arizona/registers.h | 120 +++++++++++++++++++++++++++++++++ 3 files changed, 145 insertions(+), 1 deletions(-)
drivers/mfd/wm5110-tables.c +18 -0
@@ -416,6 +416,24 @@ static const struct regmap_irq wm5110_irqs[ARIZONA_NUM_IRQ] = { [ARIZONA_IRQ_ISRC2_CFG_ERR] = { .reg_offset = 3, .mask = ARIZONA_ISRC2_CFG_ERR_EINT1 }, + [ARIZONA_IRQ_HP3R_DONE] = { + .reg_offset = 3, .mask = ARIZONA_HP3R_DONE_EINT1 + }, + [ARIZONA_IRQ_HP3L_DONE] = { + .reg_offset = 3, .mask = ARIZONA_HP3L_DONE_EINT1 + }, + [ARIZONA_IRQ_HP2R_DONE] = { + .reg_offset = 3, .mask = ARIZONA_HP2R_DONE_EINT1 + }, + [ARIZONA_IRQ_HP2L_DONE] = { + .reg_offset = 3, .mask = ARIZONA_HP2L_DONE_EINT1 + }, + [ARIZONA_IRQ_HP1R_DONE] = { + .reg_offset = 3, .mask = ARIZONA_HP1R_DONE_EINT1 + }, + [ARIZONA_IRQ_HP1L_DONE] = { + .reg_offset = 3, .mask = ARIZONA_HP1L_DONE_EINT1 + }, [ARIZONA_IRQ_BOOT_DONE] = { .reg_offset = 4, .mask = ARIZONA_BOOT_DONE_EINT1
include/linux/mfd/arizona/core.h +8 -2
@@ -78,8 +78,14 @@ enum arizona_type {#define ARIZONA_IRQ_FLL1_CLOCK_OK 49#define ARIZONA_IRQ_MICD_CLAMP_RISE 50#define ARIZONA_IRQ_MICD_CLAMP_FALL 51 - -#define ARIZONA_NUM_IRQ 52 +#define ARIZONA_IRQ_HP3R_DONE 52 +#define ARIZONA_IRQ_HP3L_DONE 53 +#define ARIZONA_IRQ_HP2R_DONE 54 +#define ARIZONA_IRQ_HP2L_DONE 55 +#define ARIZONA_IRQ_HP1R_DONE 56 +#define ARIZONA_IRQ_HP1L_DONE 57 + +#define ARIZONA_NUM_IRQ 58struct snd_soc_dapm_context ;
include/linux/mfd/arizona/registers.h +120 -0
150 lines not on this page · raw message
Signature · 1 line
1.7.2.5
PATCH 3/5 mfd: arizona: Rename thermal shutdown interrupt
In reply to Charles KeepaxNewer versions of the IP introduce short circuit protection which will also shutdown the speaker. Rename the interrupt and associated register bits associated with thermal events to better fit the function and avoid conflict with future interrupt additions.
--- drivers/mfd/wm5102-tables.c | 8 ++-- drivers/mfd/wm5110-tables.c | 8 ++-- drivers/mfd/wm8997-tables.c | 8 ++-- include/linux/mfd/arizona/core.h | 4 +- include/linux/mfd/arizona/registers.h | 80 ++++++++++++++++---------------- sound/soc/codecs/arizona.c | 10 ++-- 6 files changed, 59 insertions(+), 59 deletions(-)
drivers/mfd/wm5102-tables.c +4 -4
@@ -151,11 +151,11 @@ static const struct regmap_irq wm5102_irqs[ARIZONA_NUM_IRQ] = { .reg_offset = 1, .mask = ARIZONA_DSP_IRQ1_EINT1 }, - [ARIZONA_IRQ_SPK_SHUTDOWN_WARN] = { - .reg_offset = 2, .mask = ARIZONA_SPK_SHUTDOWN_WARN_EINT1 + [ARIZONA_IRQ_SPK_OVERHEAT_WARN] = { + .reg_offset = 2, .mask = ARIZONA_SPK_OVERHEAT_WARN_EINT1 }, - [ARIZONA_IRQ_SPK_SHUTDOWN] = { - .reg_offset = 2, .mask = ARIZONA_SPK_SHUTDOWN_EINT1 + [ARIZONA_IRQ_SPK_OVERHEAT] = { + .reg_offset = 2, .mask = ARIZONA_SPK_OVERHEAT_EINT1 }, [ARIZONA_IRQ_HPDET] = { .reg_offset = 2, .mask = ARIZONA_HPDET_EINT1
drivers/mfd/wm5110-tables.c +4 -4
@@ -340,11 +340,11 @@ static const struct regmap_irq wm5110_irqs[ARIZONA_NUM_IRQ] = { .reg_offset = 1, .mask = ARIZONA_DSP_IRQ1_EINT1 }, - [ARIZONA_IRQ_SPK_SHUTDOWN_WARN] = { - .reg_offset = 2, .mask = ARIZONA_SPK_SHUTDOWN_WARN_EINT1 + [ARIZONA_IRQ_SPK_OVERHEAT_WARN] = { + .reg_offset = 2, .mask = ARIZONA_SPK_OVERHEAT_WARN_EINT1 }, - [ARIZONA_IRQ_SPK_SHUTDOWN] = { - .reg_offset = 2, .mask = ARIZONA_SPK_SHUTDOWN_EINT1 + [ARIZONA_IRQ_SPK_OVERHEAT] = { + .reg_offset = 2, .mask = ARIZONA_SPK_OVERHEAT_EINT1 }, [ARIZONA_IRQ_HPDET] = { .reg_offset = 2, .mask = ARIZONA_HPDET_EINT1
drivers/mfd/wm8997-tables.c +4 -4
@@ -65,11 +65,11 @@ static const struct regmap_irq wm8997_irqs[ARIZONA_NUM_IRQ] = { [ARIZONA_IRQ_GP2] = { .reg_offset = 0, .mask = ARIZONA_GP2_EINT1 }, [ARIZONA_IRQ_GP1] = { .reg_offset = 0, .mask = ARIZONA_GP1_EINT1 }, - [ARIZONA_IRQ_SPK_SHUTDOWN_WARN] = { - .reg_offset = 2, .mask = ARIZONA_SPK_SHUTDOWN_WARN_EINT1 + [ARIZONA_IRQ_SPK_OVERHEAT_WARN] = { + .reg_offset = 2, .mask = ARIZONA_SPK_OVERHEAT_WARN_EINT1 }, - [ARIZONA_IRQ_SPK_SHUTDOWN] = { - .reg_offset = 2, .mask = ARIZONA_SPK_SHUTDOWN_EINT1 + [ARIZONA_IRQ_SPK_OVERHEAT] = { + .reg_offset = 2, .mask = ARIZONA_SPK_OVERHEAT_EINT1 }, [ARIZONA_IRQ_HPDET] = { .reg_offset = 2, .mask = ARIZONA_HPDET_EINT1
include/linux/mfd/arizona/core.h +2 -2
@@ -46,8 +46,8 @@ enum arizona_type {#define ARIZONA_IRQ_DSP_IRQ6 17#define ARIZONA_IRQ_DSP_IRQ7 18#define ARIZONA_IRQ_DSP_IRQ8 19 -#define ARIZONA_IRQ_SPK_SHUTDOWN_WARN 20 -#define ARIZONA_IRQ_SPK_SHUTDOWN 21 +#define ARIZONA_IRQ_SPK_OVERHEAT_WARN 20 +#define ARIZONA_IRQ_SPK_OVERHEAT 21#define ARIZONA_IRQ_MICDET 22#define ARIZONA_IRQ_HPDET 23#define ARIZONA_IRQ_WSEQ_DONE 24
include/linux/mfd/arizona/registers.h +40 -40
110 lines not on this page · raw message
sound/soc/codecs/arizona.c +5 -5
@@ -99,7 +99,7 @@ static int arizona_spk_ev(struct snd_soc_dapm_widget *w,break ;case SND_SOC_DAPM_POST_PMU : val =snd_soc_read (codec,ARIZONA_INTERRUPT_RAW_STATUS_3 ); -if (val &ARIZONA_SPK_SHUTDOWN_STS ) { +if (val &ARIZONA_SPK_OVERHEAT_STS ) {dev_crit (arizona->dev,"Speaker not enabled due to temperature\n" );return -EBUSY ;
@@ -151,7 +151,7 @@ static irqreturn_t arizona_thermal_warn(int irq, void *data)if (ret !=0 ) {dev_err (arizona->dev,"Failed to read thermal status: %d\n" , ret); - }else if (val &ARIZONA_SPK_SHUTDOWN_WARN_STS ) { + }else if (val &ARIZONA_SPK_OVERHEAT_WARN_STS ) {dev_crit (arizona->dev,"Thermal warning\n" ); }
@@ -169,7 +169,7 @@ static irqreturn_t arizona_thermal_shutdown(int irq, void *data)if (ret !=0 ) {dev_err (arizona->dev,"Failed to read thermal status: %d\n" , ret); - }else if (val &ARIZONA_SPK_SHUTDOWN_STS ) { + }else if (val &ARIZONA_SPK_OVERHEAT_STS ) {dev_crit (arizona->dev,"Thermal shutdown\n" ); ret = regmap_update_bits(arizona->regmap, ARIZONA_OUTPUT_ENABLES_1,
@@ -215,7 +215,7 @@ int arizona_init_spk(struct snd_soc_codec *codec)break ; } - ret =arizona_request_irq (arizona,ARIZONA_IRQ_SPK_SHUTDOWN_WARN , + ret =arizona_request_irq (arizona,ARIZONA_IRQ_SPK_OVERHEAT_WARN ,"Thermal warning" , arizona_thermal_warn, arizona);if (ret !=0 )
@@ -223,7 +223,7 @@ int arizona_init_spk(struct snd_soc_codec *codec)"Failed to get thermal warning IRQ: %d\n" , ret); - ret =arizona_request_irq (arizona,ARIZONA_IRQ_SPK_SHUTDOWN , + ret =arizona_request_irq (arizona,ARIZONA_IRQ_SPK_OVERHEAT ,"Thermal shutdown" , arizona_thermal_shutdown, arizona);if (ret !=0 )
Signature · 1 line
1.7.2.5
PATCH 4/5 mfd: wm5110: Add new interrupt register definitions
In reply to Charles KeepaxNewer versions of the IP have a lot of new interrupts and move several existing interrupts. This patch adds the register definitions and regmap hookup for these interrupts.
--- drivers/mfd/arizona-irq.c | 10 +- drivers/mfd/arizona.h | 1 + drivers/mfd/wm5110-tables.c | 213 ++++++++++++ include/linux/mfd/arizona/core.h | 19 +- include/linux/mfd/arizona/registers.h | 585 +++++++++++++++++++++++++++++++++ 5 files changed, 826 insertions(+), 2 deletions(-)
drivers/mfd/arizona-irq.c +9 -1
@@ -203,7 +203,15 @@ int arizona_irq_init(struct arizona *arizona)#ifdef CONFIG_MFD_WM5110 case WM5110 : aod = &wm5110_aod; - irq = &wm5110_irq; + +switch (arizona->rev) { + case 0 ... 2: + irq = &wm5110_irq; +break ; +default : + irq = &wm5110_revd_irq; +break ; + } ctrlif_error = false;break ;
drivers/mfd/arizona.h +1 -0
@@ -36,6 +36,7 @@ extern const struct regmap_irq_chip wm5102_irq;extern const struct regmap_irq_chip wm5110_aod;extern const struct regmap_irq_chip wm5110_irq; +extern const struct regmap_irq_chip wm5110_revd_irq;extern const struct regmap_irq_chip wm8997_aod;extern const struct regmap_irq_chip wm8997_irq;
drivers/mfd/wm5110-tables.c +213 -0
276 lines not on this page · raw message
include/linux/mfd/arizona/core.h +19 -2
@@ -84,8 +84,25 @@ enum arizona_type {#define ARIZONA_IRQ_HP2L_DONE 55#define ARIZONA_IRQ_HP1R_DONE 56#define ARIZONA_IRQ_HP1L_DONE 57 - -#define ARIZONA_NUM_IRQ 58 +#define ARIZONA_IRQ_ISRC3_CFG_ERR 58 +#define ARIZONA_IRQ_DSP_SHARED_WR_COLL 59 +#define ARIZONA_IRQ_SPK_SHUTDOWN 60 +#define ARIZONA_IRQ_SPK1R_SHORT 61 +#define ARIZONA_IRQ_SPK1L_SHORT 62 +#define ARIZONA_IRQ_HP3R_SC_NEG 63 +#define ARIZONA_IRQ_HP3R_SC_POS 64 +#define ARIZONA_IRQ_HP3L_SC_NEG 65 +#define ARIZONA_IRQ_HP3L_SC_POS 66 +#define ARIZONA_IRQ_HP2R_SC_NEG 67 +#define ARIZONA_IRQ_HP2R_SC_POS 68 +#define ARIZONA_IRQ_HP2L_SC_NEG 69 +#define ARIZONA_IRQ_HP2L_SC_POS 70 +#define ARIZONA_IRQ_HP1R_SC_NEG 71 +#define ARIZONA_IRQ_HP1R_SC_POS 72 +#define ARIZONA_IRQ_HP1L_SC_NEG 73 +#define ARIZONA_IRQ_HP1L_SC_POS 74 + +#define ARIZONA_NUM_IRQ 75struct snd_soc_dapm_context ;
include/linux/mfd/arizona/registers.h +585 -0
679 lines not on this page · raw message
Signature · 1 line
1.7.2.5
PATCH 5/5 mfd: arizona: Add missing handling for ISRC3 under/overclocked
In reply to Charles KeepaxSome parts have a third ISRC, this patch adds handling for the under and overclocked interrupts from this ISRC.
--- drivers/mfd/arizona-core.c | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-)
drivers/mfd/arizona-core.c +4 -0
@@ -123,6 +123,8 @@ static irqreturn_t arizona_underclocked(int irq, void *data)dev_err (arizona->dev,"AIF2 underclocked\n" );if (val &ARIZONA_AIF1_UNDERCLOCKED_STS )dev_err (arizona->dev,"AIF1 underclocked\n" ); +if (val &ARIZONA_ISRC3_UNDERCLOCKED_STS ) +dev_err (arizona->dev,"ISRC3 underclocked\n" );if (val &ARIZONA_ISRC2_UNDERCLOCKED_STS )dev_err (arizona->dev,"ISRC2 underclocked\n" );if (val &ARIZONA_ISRC1_UNDERCLOCKED_STS )
@@ -192,6 +194,8 @@ static irqreturn_t arizona_overclocked(int irq, void *data)dev_err (arizona->dev,"ASRC sync WARP overclocked\n" );if (val[1 ] &ARIZONA_ADSP2_1_OVERCLOCKED_STS )dev_err (arizona->dev,"DSP1 overclocked\n" ); +if (val[1 ] &ARIZONA_ISRC3_OVERCLOCKED_STS ) +dev_err (arizona->dev,"ISRC3 overclocked\n" );if (val[1 ] &ARIZONA_ISRC2_OVERCLOCKED_STS )dev_err (arizona->dev,"ISRC2 overclocked\n" );if (val[1 ] &ARIZONA_ISRC1_OVERCLOCKED_STS )
Signature · 1 line
1.7.2.5