Received: by 2002:a25:ad19:0:0:0:0:0 with SMTP id y25csp2304906ybi; Mon, 1 Jul 2019 09:41:28 -0700 (PDT) X-Google-Smtp-Source: APXvYqxaD4epxu0VAwGmNbY5JP5qe0Wepaqaw3VyCzCsN0FA20rCfDYtAbFjOhJt9DSdh8n5f72P X-Received: by 2002:a17:902:ea:: with SMTP id a97mr29858468pla.182.1561999288409; Mon, 01 Jul 2019 09:41:28 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1561999288; cv=none; d=google.com; s=arc-20160816; b=UtcQkgh4VV33YVqaANdQuMcE/04udEZrFKs0VYgwWKlRZ0+79Vl5qxA+oPa9/ey2EV qS1R1tkRJFgjF55yqM20FiV9LabRqJsHgJDegOX/ALIT0lYYycA2t9uGqU1HPZp1Ni8K GhnFX9hSb1raL2rTKbvjdsOAGzpGZ1WK1BGD9we9tseO11GJgnr27gzEVyb5QO3jApM8 ZgnQ9CjudK4LEuBPWG+/hX1kXokQq19nN5tZmPtZlMTX1S/28YnhwV7hbunAginuCdL7 ETSNFhMWFF5XwY9yZoTEF5SJ6nPKsgLyPDrZsGS8vAJ5POAmTwPE7m+H0HGCMU/utJCH YbMw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding :content-language:in-reply-to:mime-version:user-agent:date :message-id:from:references:cc:to:subject:dkim-signature; bh=ixfn7gQUtri7Y9CCAmDSFpwM7z7aSLkphJr5dTPDQxc=; b=Y4oDmE4DPKWUoyKSbAUxC08iJyPjSMg+Y6nq1GZdS7h9VI6GlZwmqHtzgs2ovK8Cmj 8gbVcGaLL3i1lTEjc96dgzBuZOUNTuJUveykFP1VpVFRSWTVC1pQhjL4P6bsQchVI+e8 2JA0sZeNDYV/YrCDMPZ99fY3ZsEyODfk86WuokLNLrOr7uFNLO1FIr33REZ7y1VFdjPc b3HMxrW0BwMHwvh1ebeYZoe+tSL2tFybtriCeaCyS36JDk5+6whDQy8VmR8G8ns8MevT DFPejCuhMXM/0GAt1Jritc72y8RhcCK46i4fwAKFrgTnzlWbmrQvyQL+H7vUV8E4Bnnt AXwQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@ti.com header.s=ti-com-17Q1 header.b=tGUDkh36; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=NONE dis=NONE) header.from=ti.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id d7si11384061pfr.145.2019.07.01.09.41.11; Mon, 01 Jul 2019 09:41:28 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@ti.com header.s=ti-com-17Q1 header.b=tGUDkh36; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=NONE dis=NONE) header.from=ti.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727174AbfGAQKP (ORCPT + 99 others); Mon, 1 Jul 2019 12:10:15 -0400 Received: from fllv0015.ext.ti.com ([198.47.19.141]:36208 "EHLO fllv0015.ext.ti.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726646AbfGAQKO (ORCPT ); Mon, 1 Jul 2019 12:10:14 -0400 Received: from lelv0265.itg.ti.com ([10.180.67.224]) by fllv0015.ext.ti.com (8.15.2/8.15.2) with ESMTP id x61G9SnO015847; Mon, 1 Jul 2019 11:09:28 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ti.com; s=ti-com-17Q1; t=1561997368; bh=ixfn7gQUtri7Y9CCAmDSFpwM7z7aSLkphJr5dTPDQxc=; h=Subject:To:CC:References:From:Date:In-Reply-To; b=tGUDkh36ZBl89CZvXFFudsm4Grp7FslFPggpycdwvSZoNToDvSTA7X4w4vAAThrAG kPCWoVKuYxRuTxai3KxdSPK20J7yS4lnAeUFiEGcdTmJ5mcls+4SH9EzF74z/mEDen VhkGNqb6JrZ4qg+GDyrudeRCZNmchinnBtAs3npc= Received: from DFLE101.ent.ti.com (dfle101.ent.ti.com [10.64.6.22]) by lelv0265.itg.ti.com (8.15.2/8.15.2) with ESMTPS id x61G9SuO045363 (version=TLSv1.2 cipher=AES256-GCM-SHA384 bits=256 verify=FAIL); Mon, 1 Jul 2019 11:09:28 -0500 Received: from DFLE108.ent.ti.com (10.64.6.29) by DFLE101.ent.ti.com (10.64.6.22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1713.5; Mon, 1 Jul 2019 11:09:27 -0500 Received: from fllv0040.itg.ti.com (10.64.41.20) by DFLE108.ent.ti.com (10.64.6.29) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1713.5 via Frontend Transport; Mon, 1 Jul 2019 11:09:27 -0500 Received: from [10.250.68.219] (ileax41-snat.itg.ti.com [10.172.224.153]) by fllv0040.itg.ti.com (8.15.2/8.15.2) with ESMTP id x61G9RrT021815; Mon, 1 Jul 2019 11:09:27 -0500 Subject: Re: [PATCH v2 1/2] ASoC: tas5720.c: cleanup variant management To: Nikolaus Voss CC: Liam Girdwood , Mark Brown , Jaroslav Kysela , Takashi Iwai , Andreas Dannenberg , Kate Stewart , , , References: <20190628143037.GH5379@sirena.org.uk> <80af3fca-f71b-c118-e5d8-fde8b7d21705@ti.com> From: "Andrew F. Davis" Message-ID: <074d4df3-51d8-6e20-869d-5f88b46cc172@ti.com> Date: Mon, 1 Jul 2019 12:09:26 -0400 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.7.1 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset="utf-8" Content-Language: en-US Content-Transfer-Encoding: 8bit X-EXCLAIMER-MD-CONFIG: e1e8a2fd-e40a-4ac6-ac9b-f7e9cc9ee180 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 7/1/19 11:35 AM, Nikolaus Voss wrote: > On Mon, 1 Jul 2019, Andrew F. Davis wrote: >> On 7/1/19 9:42 AM, Nikolaus Voss wrote: >>> Replace enum tas572x_type with struct tas5720_variant which aggregates >>> variant specific stuff and can be directly referenced from an id table. >>> >>> Signed-off-by: Nikolaus Voss >>> --- >>>  sound/soc/codecs/tas5720.c | 98 +++++++++++++------------------------- >>>  1 file changed, 33 insertions(+), 65 deletions(-) >>> >>> diff --git a/sound/soc/codecs/tas5720.c b/sound/soc/codecs/tas5720.c >>> index 37fab8f22800..b2e897f094b4 100644 >>> --- a/sound/soc/codecs/tas5720.c >>> +++ b/sound/soc/codecs/tas5720.c >>> @@ -28,9 +28,10 @@ >>>  /* Define how often to check (and clear) the fault status register >>> (in ms) */ >>>  #define TAS5720_FAULT_CHECK_INTERVAL        200 >>> >>> -enum tas572x_type { >>> -    TAS5720, >>> -    TAS5722, >>> +struct tas5720_variant { >>> +    const int device_id; >>> +    const struct regmap_config *reg_config; >>> +    const struct snd_soc_component_driver *comp_drv; >>>  }; >>> >>>  static const char * const tas5720_supply_names[] = { >>> @@ -44,7 +45,7 @@ struct tas5720_data { >>>      struct snd_soc_component *component; >>>      struct regmap *regmap; >>>      struct i2c_client *tas5720_client; >>> -    enum tas572x_type devtype; >>> +    const struct tas5720_variant *variant; >> >> Why add a new struct? Actually I don't see the need for this patch at >> all, the commit message only explains the 'what' not the 'why'. We can >> and do already build this info from the tas572x_type. > > As the commit message says, the purpose is to aggregate the variant > specifics and make it accessible via one pointer. This is a standard > approach for of/acpi_device_id tables and thus makes the code simpler > and improves readability. This is a maintenance patch to prepare using > the device match API in a proper way. > "make it accessible via one pointer" is again a "what", the "why" is: "This is a standard approach" "makes the code simpler and improves readability" Those are valid reasons and should be what you put in the commit message. >> >> Also below are several functional changes, the cover letter says this is >> not a functional change, yet the driver behaves differently now. > > Can you be a little bit more specific? The code should behave exactly as > before. > Sure, for instance the line "unexpected private driver data" is removed, this can now never happen, that is a functional change. The phrase "no functional change", should be reserved for only changes to spelling, formatting, code organizing, etc.. > Niko > >> >> Andrew >> >>>      struct regulator_bulk_data supplies[TAS5720_NUM_SUPPLIES]; >>>      struct delayed_work fault_check_work; >>>      unsigned int last_fault; >>> @@ -179,17 +180,13 @@ static int tas5720_set_dai_tdm_slot(struct >>> snd_soc_dai *dai, >>>          goto error_snd_soc_component_update_bits; >>> >>>      /* Configure TDM slot width. This is only applicable to TAS5722. */ >>> -    switch (tas5720->devtype) { >>> -    case TAS5722: >>> +    if (tas5720->variant->device_id == TAS5722_DEVICE_ID) { I also don't like this, TAS5722_DEVICE_ID is the expected contents of a register, you are using it like the enum tas572x_type that you removed. I'd leave that enum, the device ID register itself is not guaranteed to be correct or unique, which is why we warn about mismatches below but then continue to use the user provided device type anyway. Andrew >>>          ret = snd_soc_component_update_bits(component, >>> TAS5722_DIGITAL_CTRL2_REG, >>>                              TAS5722_TDM_SLOT_16B, >>>                              slot_width == 16 ? >>>                              TAS5722_TDM_SLOT_16B : 0); >>>          if (ret < 0) >>>              goto error_snd_soc_component_update_bits; >>> -        break; >>> -    default: >>> -        break; >>>      } >>> >>>      return 0; >>> @@ -277,7 +274,7 @@ static void tas5720_fault_check_work(struct >>> work_struct *work) >>>  static int tas5720_codec_probe(struct snd_soc_component *component) >>>  { >>>      struct tas5720_data *tas5720 = >>> snd_soc_component_get_drvdata(component); >>> -    unsigned int device_id, expected_device_id; >>> +    unsigned int device_id; >>>      int ret; >>> >>>      tas5720->component = component; >>> @@ -301,21 +298,9 @@ static int tas5720_codec_probe(struct >>> snd_soc_component *component) >>>          goto probe_fail; >>>      } >>> >>> -    switch (tas5720->devtype) { >>> -    case TAS5720: >>> -        expected_device_id = TAS5720_DEVICE_ID; >>> -        break; >>> -    case TAS5722: >>> -        expected_device_id = TAS5722_DEVICE_ID; >>> -        break; >>> -    default: >>> -        dev_err(component->dev, "unexpected private driver data\n"); >>> -        return -EINVAL; >>> -    } >>> - >>> -    if (device_id != expected_device_id) >>> +    if (device_id != tas5720->variant->device_id) >>>          dev_warn(component->dev, "wrong device ID. expected: %u >>> read: %u\n", >>> -             expected_device_id, device_id); >>> +             tas5720->variant->device_id, device_id); >>> >>>      /* Set device to mute */ >>>      ret = snd_soc_component_update_bits(component, >>> TAS5720_DIGITAL_CTRL2_REG, >>> @@ -637,7 +622,6 @@ static int tas5720_probe(struct i2c_client *client, >>>  { >>>      struct device *dev = &client->dev; >>>      struct tas5720_data *data; >>> -    const struct regmap_config *regmap_config; >>>      int ret; >>>      int i; >>> >>> @@ -646,20 +630,10 @@ static int tas5720_probe(struct i2c_client >>> *client, >>>          return -ENOMEM; >>> >>>      data->tas5720_client = client; >>> -    data->devtype = id->driver_data; >>> >>> -    switch (id->driver_data) { >>> -    case TAS5720: >>> -        regmap_config = &tas5720_regmap_config; >>> -        break; >>> -    case TAS5722: >>> -        regmap_config = &tas5722_regmap_config; >>> -        break; >>> -    default: >>> -        dev_err(dev, "unexpected private driver data\n"); >>> -        return -EINVAL; >>> -    } >>> -    data->regmap = devm_regmap_init_i2c(client, regmap_config); >>> +    data->variant = (const struct tas5720_variant *)id->driver_data; >>> + >>> +    data->regmap = devm_regmap_init_i2c(client, >>> data->variant->reg_config); >>>      if (IS_ERR(data->regmap)) { >>>          ret = PTR_ERR(data->regmap); >>>          dev_err(dev, "failed to allocate register map: %d\n", ret); >>> @@ -678,42 +652,36 @@ static int tas5720_probe(struct i2c_client >>> *client, >>> >>>      dev_set_drvdata(dev, data); >>> >>> -    switch (id->driver_data) { >>> -    case TAS5720: >>> -        ret = devm_snd_soc_register_component(&client->dev, >>> -                    &soc_component_dev_tas5720, >>> -                    tas5720_dai, >>> -                    ARRAY_SIZE(tas5720_dai)); >>> -        break; >>> -    case TAS5722: >>> -        ret = devm_snd_soc_register_component(&client->dev, >>> -                    &soc_component_dev_tas5722, >>> -                    tas5720_dai, >>> -                    ARRAY_SIZE(tas5720_dai)); >>> -        break; >>> -    default: >>> -        dev_err(dev, "unexpected private driver data\n"); >>> -        return -EINVAL; >>> -    } >>> -    if (ret < 0) { >>> -        dev_err(dev, "failed to register component: %d\n", ret); >>> -        return ret; >>> -    } >>> - >>> -    return 0; >>> +    ret = devm_snd_soc_register_component(&client->dev, >>> +                          data->variant->comp_drv, >>> +                          tas5720_dai, >>> +                          ARRAY_SIZE(tas5720_dai)); >>> +    return ret; >>>  } >>> >>> +static const struct tas5720_variant tas5720 = { >>> +    .device_id = TAS5720_DEVICE_ID, >>> +    .reg_config = &tas5720_regmap_config, >>> +    .comp_drv = &soc_component_dev_tas5720, >>> +}; >>> + >>> +static const struct tas5720_variant tas5722 = { >>> +    .device_id = TAS5722_DEVICE_ID, >>> +    .reg_config = &tas5722_regmap_config, >>> +    .comp_drv = &soc_component_dev_tas5722, >>> +}; >>> + >>>  static const struct i2c_device_id tas5720_id[] = { >>> -    { "tas5720", TAS5720 }, >>> -    { "tas5722", TAS5722 }, >>> +    { "tas5720", (kernel_ulong_t)&tas5720 }, >>> +    { "tas5722", (kernel_ulong_t)&tas5722 }, >>>      { } >>>  }; >>>  MODULE_DEVICE_TABLE(i2c, tas5720_id); >>> >>>  #if IS_ENABLED(CONFIG_OF) >>>  static const struct of_device_id tas5720_of_match[] = { >>> -    { .compatible = "ti,tas5720", }, >>> -    { .compatible = "ti,tas5722", }, >>> +    { .compatible = "ti,tas5720", .data = &tas5720, }, >>> +    { .compatible = "ti,tas5722", .data = &tas5722, }, >>>      { }, >>>  }; >>>  MODULE_DEVICE_TABLE(of, tas5720_of_match); >>> >>