From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-12.7 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 13900C433E0 for ; Fri, 22 Jan 2021 20:50:59 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id BB4B423B06 for ; Fri, 22 Jan 2021 20:50:58 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729335AbhAVUt1 (ORCPT ); Fri, 22 Jan 2021 15:49:27 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48956 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728590AbhAVUri (ORCPT ); Fri, 22 Jan 2021 15:47:38 -0500 Received: from mail-pl1-x62a.google.com (mail-pl1-x62a.google.com [IPv6:2607:f8b0:4864:20::62a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id EE067C0613D6 for ; Fri, 22 Jan 2021 12:46:57 -0800 (PST) Received: by mail-pl1-x62a.google.com with SMTP id u11so3944283plg.13 for ; Fri, 22 Jan 2021 12:46:57 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=L8h5Iu+gZkxNGhNgn/qYvBSc7dFR+4ytSwJQwUWJ4jU=; b=k8jP/H3ouAaOUUYeRmqk4z4abKjDpdx/IlWlqcdjJkNZft8iZYj/nZyzGPz69pbBrD 78RkJ3u6kItEsX35tmeo9pBU/9O8XTKGBEs3d5I5vKNc+LG05pU3ts9RLlGATSkRiezt egZfp0dtB3vov+4K26MIwJBkSZRVIt4iEi70iKQ+pb3MwZNwK05A/8FItQfWMCgaLLu0 76yoy0zICwgm9C4BOzeSaOMc1Z0YYHlFcZ/AS42GDht47/nEz/LI7zC6OvGfEzizWNiy SDM7rOAFC00AFnBlU6OBur7+UNFcvXs6Xacr8ffPiAhZq2mNt1Ux+BQ9fxLsyTVOxv6Y sGJg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=L8h5Iu+gZkxNGhNgn/qYvBSc7dFR+4ytSwJQwUWJ4jU=; b=o+zY1JQwXgWgTWE5lJSea7iP4QKmGOAn5kX5KY8Telk6BvFga5ELRzxwV4Kss1a8i3 zCuHzaWvo8VLooGHtVgGia75O8XXX70tzxXUmrALO11aAwg0wmaftFq+N8JhZAivT4Yk ov1lLHnYJPEHVDpvO3jAlppgRO2XbR3dpY1r5TLA4q9Uf82TJsfugnutC67seH9+6n/E 5FlDQDta9JsBEWLn7He/i01NJgfAPtsI8mZm6RpmBzQlohWKxIPwGwDbWJ0C2gWJDHZe 9yZb57q8elSIzCyMuI2E7+j7HX2gVSASVxxBFuuku2ZZelQyQh8IkG2jz2ePNGpA4R4q Whow== X-Gm-Message-State: AOAM531e04NLsxObIu9z7wqpnn18R8j0d1chegPOmCoNbxVcAZgiJwJA drZxPveai2GP9PdwfALiXv3RBNPWGbgQKRNRLZo= X-Google-Smtp-Source: ABdhPJyXsaYUWO5H2dYDOlbzftU0DnFFmDgsSxr7oNZoM0EcN0lMt8ZxVPXOhhC8p5XFzxJlDZqseYDZwvi5kD9wTQ4= X-Received: by 2002:a17:902:7088:b029:df:cbdb:a0a6 with SMTP id z8-20020a1709027088b02900dfcbdba0a6mr1613682plk.17.1611348417233; Fri, 22 Jan 2021 12:46:57 -0800 (PST) MIME-Version: 1.0 References: <20210122164107.361939-1-hdegoede@redhat.com> <20210122164107.361939-10-hdegoede@redhat.com> In-Reply-To: <20210122164107.361939-10-hdegoede@redhat.com> From: Andy Shevchenko Date: Fri, 22 Jan 2021 22:47:46 +0200 Message-ID: Subject: Re: [PATCH v3 09/13] ASoC: arizona-jack: convert into a helper library for codec drivers To: Hans de Goede Cc: Lee Jones , Cezary Rojewski , Pierre-Louis Bossart , Liam Girdwood , Jie Yang , Mark Brown , patches@opensource.cirrus.com, Linux Kernel Mailing List , Charles Keepax , ALSA Development Mailing List Content-Type: text/plain; charset="UTF-8" Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Fri, Jan 22, 2021 at 6:41 PM Hans de Goede wrote: > > Convert the arizona extcon driver into a helper library for direct use > from the arizona codec-drivers, rather then being bound to a separate > MFD cell. > > Note the probe (and remove) sequence is split into 2 parts: > > 1. The arizona_jack_codec_dev_probe() function inits a bunch of > jack-detect specific variables in struct arizona_priv and tries to get > a number of resources where getting them may fail with -EPROBE_DEFER. > > 2. Then once the machine driver has create a snd_sock_jack through > snd_soc_card_jack_new() it calls snd_soc_component_set_jack() on > the codec component, which will call the new arizona_jack_set_jack(), > which sets up jack-detection and requests the IRQs. > > This split is necessary, because the IRQ handlers need access to the > arizona->dapm pointer and the snd_sock_jack which are not available > when the codec-driver's probe function runs. > > Note this requires that machine-drivers for codecs which are converted > to use the new helper functions from arizona-jack.c are modified to > create a snd_soc_jack through snd_soc_card_jack_new() and register > this jack with the codec through snd_soc_component_set_jack(). Okay, it seems that messages are on behalf of the parent while managed resources are being attached to the actual device. Reviewed-by: Andy Shevchenko > Signed-off-by: Hans de Goede > --- > Changes in v3: > - Pass dev (the codec-device) to devm_regulator_get instead of > passing arizona->dev. This is necessary so that the regulator gets > properly released when the coded driver unbinds. > --- > sound/soc/codecs/Makefile | 2 +- > sound/soc/codecs/arizona-jack.c | 125 +++++++++++++++----------------- > sound/soc/codecs/arizona.h | 6 ++ > 3 files changed, 65 insertions(+), 68 deletions(-) > > diff --git a/sound/soc/codecs/Makefile b/sound/soc/codecs/Makefile > index d277f0366e09..2e976cfaa862 100644 > --- a/sound/soc/codecs/Makefile > +++ b/sound/soc/codecs/Makefile > @@ -43,7 +43,7 @@ snd-soc-ak4642-objs := ak4642.o > snd-soc-ak4671-objs := ak4671.o > snd-soc-ak5386-objs := ak5386.o > snd-soc-ak5558-objs := ak5558.o > -snd-soc-arizona-objs := arizona.o > +snd-soc-arizona-objs := arizona.o arizona-jack.o > snd-soc-bd28623-objs := bd28623.o > snd-soc-bt-sco-objs := bt-sco.o > snd-soc-cpcap-objs := cpcap.o > diff --git a/sound/soc/codecs/arizona-jack.c b/sound/soc/codecs/arizona-jack.c > index a6e8071f84ab..e121490eb379 100644 > --- a/sound/soc/codecs/arizona-jack.c > +++ b/sound/soc/codecs/arizona-jack.c > @@ -7,14 +7,12 @@ > > #include > #include > -#include > #include > #include > #include > #include > #include > #include > -#include > #include > #include > #include > @@ -1337,27 +1335,16 @@ static int arizona_extcon_device_get_pdata(struct device *dev, > return 0; > } > > -static int arizona_extcon_probe(struct platform_device *pdev) > +int arizona_jack_codec_dev_probe(struct arizona_priv *info, struct device *dev) > { > - struct arizona *arizona = dev_get_drvdata(pdev->dev.parent); > + struct arizona *arizona = info->arizona; > struct arizona_pdata *pdata = &arizona->pdata; > - struct arizona_priv *info; > - unsigned int val; > - unsigned int clamp_mode; > - int jack_irq_fall, jack_irq_rise; > - int ret, mode, i, j; > - > - if (!arizona->dapm || !arizona->dapm->card) > - return -EPROBE_DEFER; > - > - info = devm_kzalloc(&pdev->dev, sizeof(*info), GFP_KERNEL); > - if (!info) > - return -ENOMEM; > + int ret, mode; > > if (!dev_get_platdata(arizona->dev)) > - arizona_extcon_device_get_pdata(&pdev->dev, arizona); > + arizona_extcon_device_get_pdata(dev, arizona); > > - info->micvdd = devm_regulator_get(&pdev->dev, "MICVDD"); > + info->micvdd = devm_regulator_get(dev, "MICVDD"); > if (IS_ERR(info->micvdd)) { > ret = PTR_ERR(info->micvdd); > dev_err(arizona->dev, "Failed to get MICVDD: %d\n", ret); > @@ -1365,12 +1352,10 @@ static int arizona_extcon_probe(struct platform_device *pdev) > } > > mutex_init(&info->lock); > - info->arizona = arizona; > info->last_jackdet = ~(ARIZONA_MICD_CLAMP_STS | ARIZONA_JD1_STS); > INIT_DELAYED_WORK(&info->hpdet_work, arizona_hpdet_work); > INIT_DELAYED_WORK(&info->micd_detect_work, arizona_micd_detect); > INIT_DELAYED_WORK(&info->micd_timeout_work, arizona_micd_timeout_work); > - platform_set_drvdata(pdev, info); > > switch (arizona->type) { > case WM5102: > @@ -1404,20 +1389,20 @@ static int arizona_extcon_probe(struct platform_device *pdev) > break; > } > > - info->edev = devm_extcon_dev_allocate(&pdev->dev, arizona_cable); > + info->edev = devm_extcon_dev_allocate(dev, arizona_cable); > if (IS_ERR(info->edev)) { > - dev_err(&pdev->dev, "failed to allocate extcon device\n"); > + dev_err(arizona->dev, "failed to allocate extcon device\n"); > return -ENOMEM; > } > > - ret = devm_extcon_dev_register(&pdev->dev, info->edev); > + ret = devm_extcon_dev_register(dev, info->edev); > if (ret < 0) { > dev_err(arizona->dev, "extcon_dev_register() failed: %d\n", > ret); > return ret; > } > > - info->input = devm_input_allocate_device(&pdev->dev); > + info->input = devm_input_allocate_device(dev); > if (!info->input) { > dev_err(arizona->dev, "Can't allocate input dev\n"); > ret = -ENOMEM; > @@ -1448,7 +1433,7 @@ static int arizona_extcon_probe(struct platform_device *pdev) > else > mode = GPIOF_OUT_INIT_LOW; > > - ret = devm_gpio_request_one(&pdev->dev, pdata->micd_pol_gpio, > + ret = devm_gpio_request_one(dev, pdata->micd_pol_gpio, > mode, "MICD polarity"); > if (ret != 0) { > dev_err(arizona->dev, "Failed to request GPIO%d: %d\n", > @@ -1481,17 +1466,38 @@ static int arizona_extcon_probe(struct platform_device *pdev) > } > > if (arizona->pdata.hpdet_id_gpio > 0) { > - ret = devm_gpio_request_one(&pdev->dev, > - arizona->pdata.hpdet_id_gpio, > + ret = devm_gpio_request_one(dev, arizona->pdata.hpdet_id_gpio, > GPIOF_OUT_INIT_LOW, > "HPDET"); > if (ret != 0) { > dev_err(arizona->dev, "Failed to request GPIO%d: %d\n", > arizona->pdata.hpdet_id_gpio, ret); > - goto err_gpio; > + gpiod_put(info->micd_pol_gpio); > + return ret; > } > } > > + return 0; > +} > +EXPORT_SYMBOL_GPL(arizona_jack_codec_dev_probe); > + > +int arizona_jack_codec_dev_remove(struct arizona_priv *info) > +{ > + gpiod_put(info->micd_pol_gpio); > + return 0; > +} > +EXPORT_SYMBOL_GPL(arizona_jack_codec_dev_remove); > + > +static int arizona_jack_enable_jack_detect(struct arizona_priv *info, > + struct snd_soc_jack *jack) > +{ > + struct arizona *arizona = info->arizona; > + struct arizona_pdata *pdata = &arizona->pdata; > + unsigned int val; > + unsigned int clamp_mode; > + int jack_irq_fall, jack_irq_rise; > + int ret, i, j; > + > if (arizona->pdata.micd_bias_start_time) > regmap_update_bits(arizona->regmap, ARIZONA_MIC_DETECT_1, > ARIZONA_MICD_BIAS_STARTTIME_MASK, > @@ -1532,16 +1538,15 @@ static int arizona_extcon_probe(struct platform_device *pdev) > if (arizona->pdata.num_micd_ranges > ARIZONA_MAX_MICD_RANGE) { > dev_err(arizona->dev, "Too many MICD ranges: %d\n", > arizona->pdata.num_micd_ranges); > + return -EINVAL; > } > > if (info->num_micd_ranges > 1) { > for (i = 1; i < info->num_micd_ranges; i++) { > if (info->micd_ranges[i - 1].max > > info->micd_ranges[i].max) { > - dev_err(arizona->dev, > - "MICD ranges must be sorted\n"); > - ret = -EINVAL; > - goto err_gpio; > + dev_err(arizona->dev, "MICD ranges must be sorted\n"); > + return -EINVAL; > } > } > } > @@ -1559,8 +1564,7 @@ static int arizona_extcon_probe(struct platform_device *pdev) > if (j == ARIZONA_NUM_MICD_BUTTON_LEVELS) { > dev_err(arizona->dev, "Unsupported MICD level %d\n", > info->micd_ranges[i].max); > - ret = -EINVAL; > - goto err_gpio; > + return -EINVAL; > } > > dev_dbg(arizona->dev, "%d ohms for MICD threshold %d\n", > @@ -1629,43 +1633,40 @@ static int arizona_extcon_probe(struct platform_device *pdev) > ret = arizona_request_irq(arizona, jack_irq_rise, > "JACKDET rise", arizona_jackdet, info); > if (ret != 0) { > - dev_err(&pdev->dev, "Failed to get JACKDET rise IRQ: %d\n", > - ret); > + dev_err(arizona->dev, "Failed to get JACKDET rise IRQ: %d\n", ret); > goto err_pm; > } > > ret = arizona_set_irq_wake(arizona, jack_irq_rise, 1); > if (ret != 0) { > - dev_err(&pdev->dev, "Failed to set JD rise IRQ wake: %d\n", > - ret); > + dev_err(arizona->dev, "Failed to set JD rise IRQ wake: %d\n", ret); > goto err_rise; > } > > ret = arizona_request_irq(arizona, jack_irq_fall, > "JACKDET fall", arizona_jackdet, info); > if (ret != 0) { > - dev_err(&pdev->dev, "Failed to get JD fall IRQ: %d\n", ret); > + dev_err(arizona->dev, "Failed to get JD fall IRQ: %d\n", ret); > goto err_rise_wake; > } > > ret = arizona_set_irq_wake(arizona, jack_irq_fall, 1); > if (ret != 0) { > - dev_err(&pdev->dev, "Failed to set JD fall IRQ wake: %d\n", > - ret); > + dev_err(arizona->dev, "Failed to set JD fall IRQ wake: %d\n", ret); > goto err_fall; > } > > ret = arizona_request_irq(arizona, ARIZONA_IRQ_MICDET, > "MICDET", arizona_micdet, info); > if (ret != 0) { > - dev_err(&pdev->dev, "Failed to get MICDET IRQ: %d\n", ret); > + dev_err(arizona->dev, "Failed to get MICDET IRQ: %d\n", ret); > goto err_fall_wake; > } > > ret = arizona_request_irq(arizona, ARIZONA_IRQ_HPDET, > "HPDET", arizona_hpdet_irq, info); > if (ret != 0) { > - dev_err(&pdev->dev, "Failed to get HPDET IRQ: %d\n", ret); > + dev_err(arizona->dev, "Failed to get HPDET IRQ: %d\n", ret); > goto err_micdet; > } > > @@ -1677,12 +1678,11 @@ static int arizona_extcon_probe(struct platform_device *pdev) > > ret = regulator_allow_bypass(info->micvdd, true); > if (ret != 0) > - dev_warn(arizona->dev, "Failed to set MICVDD to bypass: %d\n", > - ret); > + dev_warn(arizona->dev, "Failed to set MICVDD to bypass: %d\n", ret); > > ret = input_register_device(info->input); > if (ret) { > - dev_err(&pdev->dev, "Can't register input device: %d\n", ret); > + dev_err(arizona->dev, "Can't register input device: %d\n", ret); > goto err_hpdet; > } > > @@ -1704,14 +1704,11 @@ static int arizona_extcon_probe(struct platform_device *pdev) > arizona_free_irq(arizona, jack_irq_rise, info); > err_pm: > pm_runtime_put(arizona->dev); > -err_gpio: > - gpiod_put(info->micd_pol_gpio); > return ret; > } > > -static int arizona_extcon_remove(struct platform_device *pdev) > +static int arizona_jack_disable_jack_detect(struct arizona_priv *info) > { > - struct arizona_priv *info = platform_get_drvdata(pdev); > struct arizona *arizona = info->arizona; > int jack_irq_rise, jack_irq_fall; > bool change; > @@ -1739,8 +1736,7 @@ static int arizona_extcon_remove(struct platform_device *pdev) > ARIZONA_MICD_ENA, 0, > &change); > if (ret < 0) { > - dev_err(&pdev->dev, "Failed to disable micd on remove: %d\n", > - ret); > + dev_err(arizona->dev, "Failed to disable micd on remove: %d\n", ret); > } else if (change) { > regulator_disable(info->micvdd); > pm_runtime_put(arizona->dev); > @@ -1753,22 +1749,17 @@ static int arizona_extcon_remove(struct platform_device *pdev) > ARIZONA_JD1_ENA, 0); > arizona_clk32k_disable(arizona); > > - gpiod_put(info->micd_pol_gpio); > - > return 0; > } > > -static struct platform_driver arizona_extcon_driver = { > - .driver = { > - .name = "arizona-extcon", > - }, > - .probe = arizona_extcon_probe, > - .remove = arizona_extcon_remove, > -}; > - > -module_platform_driver(arizona_extcon_driver); > +int arizona_jack_set_jack(struct snd_soc_component *component, > + struct snd_soc_jack *jack, void *data) > +{ > + struct arizona_priv *info = snd_soc_component_get_drvdata(component); > > -MODULE_DESCRIPTION("Arizona Extcon driver"); > -MODULE_AUTHOR("Mark Brown "); > -MODULE_LICENSE("GPL"); > -MODULE_ALIAS("platform:extcon-arizona"); > + if (jack) > + return arizona_jack_enable_jack_detect(info, jack); > + else > + return arizona_jack_disable_jack_detect(info); > +} > +EXPORT_SYMBOL_GPL(arizona_jack_set_jack); > diff --git a/sound/soc/codecs/arizona.h b/sound/soc/codecs/arizona.h > index 7132dbc3c840..fc515845a3e6 100644 > --- a/sound/soc/codecs/arizona.h > +++ b/sound/soc/codecs/arizona.h > @@ -386,4 +386,10 @@ static inline int arizona_unregister_notifier(struct snd_soc_component *componen > > int arizona_of_get_audio_pdata(struct arizona *arizona); > > +int arizona_jack_codec_dev_probe(struct arizona_priv *info, struct device *dev); > +int arizona_jack_codec_dev_remove(struct arizona_priv *info); > + > +int arizona_jack_set_jack(struct snd_soc_component *component, > + struct snd_soc_jack *jack, void *data); > + > #endif > -- > 2.28.0 > -- With Best Regards, Andy Shevchenko