From fc80e4f28a06a3fe2cc5ab217ae083a3b0544ea4 Mon Sep 17 00:00:00 2001 From: Meng Wang Date: Mon, 25 Oct 2021 09:17:19 +0800 Subject: [PATCH] asoc: wsa883x: update irq_drv_data per wsa device regmap_irq_chip->irq_drv_data is shared by all attached wsa devices and pointed to last probbed wsa device. This will cause interrupt handle issue. Update irq_drv_data per wsa deviece to resolve this issue. Change-Id: Ib22629340d895c3c56d4987949c253589165b579 Signed-off-by: Meng Wang --- asoc/codecs/wsa883x/wsa883x.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/asoc/codecs/wsa883x/wsa883x.c b/asoc/codecs/wsa883x/wsa883x.c index f68eee190533..2c1a5cf30fc6 100644 --- a/asoc/codecs/wsa883x/wsa883x.c +++ b/asoc/codecs/wsa883x/wsa883x.c @@ -1622,12 +1622,20 @@ static int wsa883x_swr_probe(struct swr_device *pdev) const char *wsa883x_name_prefix_of = NULL; char buffer[MAX_NAME_LEN]; int dev_index = 0; + struct regmap_irq_chip *wsa883x_sub_regmap_irq_chip = NULL; wsa883x = devm_kzalloc(&pdev->dev, sizeof(struct wsa883x_priv), GFP_KERNEL); if (!wsa883x) return -ENOMEM; + wsa883x_sub_regmap_irq_chip = devm_kzalloc(&pdev->dev, sizeof(struct regmap_irq_chip), + GFP_KERNEL); + if (!wsa883x_sub_regmap_irq_chip) + return -ENOMEM; + memcpy(wsa883x_sub_regmap_irq_chip, &wsa883x_regmap_irq_chip, + sizeof(struct regmap_irq_chip)); + ret = wsa883x_enable_supplies(&pdev->dev, wsa883x); if (ret) { ret = -EPROBE_DEFER; @@ -1670,11 +1678,11 @@ static int wsa883x_swr_probe(struct swr_device *pdev) } /* Set all interrupts as edge triggered */ - for (i = 0; i < wsa883x_regmap_irq_chip.num_regs; i++) + for (i = 0; i < wsa883x_sub_regmap_irq_chip->num_regs; i++) regmap_write(wsa883x->regmap, (WSA883X_INTR_LEVEL0 + i), 0); - wsa883x_regmap_irq_chip.irq_drv_data = wsa883x; - wsa883x->irq_info.wcd_regmap_irq_chip = &wsa883x_regmap_irq_chip; + wsa883x_sub_regmap_irq_chip->irq_drv_data = wsa883x; + wsa883x->irq_info.wcd_regmap_irq_chip = wsa883x_sub_regmap_irq_chip; wsa883x->irq_info.codec_name = "WSA883X"; wsa883x->irq_info.regmap = wsa883x->regmap; wsa883x->irq_info.dev = &pdev->dev;