From: Cezary Rojewski <cezary.rojewski@intel.com>
To: Lucas Tanure <tanureal@opensource.cirrus.com>,
"Rafael J . Wysocki" <rafael@kernel.org>,
Len Brown <lenb@kernel.org>, Hans de Goede <hdegoede@redhat.com>,
Mark Gross <markgross@kernel.org>,
Liam Girdwood <lgirdwood@gmail.com>,
Jaroslav Kysela <perex@perex.cz>, Mark Brown <broonie@kernel.org>,
Takashi Iwai <tiwai@suse.com>
Cc: linux-acpi@vger.kernel.org, alsa-devel@alsa-project.org,
platform-driver-x86@vger.kernel.org,
linux-kernel@vger.kernel.org, patches@opensource.cirrus.com
Subject: Re: [PATCH v5 02/10] ASoC: cs35l41: Move cs35l41_otp_unpack to shared code
Date: Fri, 17 Dec 2021 13:59:16 +0100 [thread overview]
Message-ID: <0e9c5253-3126-ffca-deb9-c7fc37ba769a@intel.com> (raw)
In-Reply-To: <20211216114332.153409-3-tanureal@opensource.cirrus.com>
On 2021-12-16 12:43 PM, Lucas Tanure wrote:
> ASoC and HDA will do the same cs35l41_otp_unpack, so move it
> to shared code
...
> +static const struct cs35l41_otp_map_element_t *cs35l41_find_otp_map(u32 otp_id)
> +{
> + int i;
> +
> + for (i = 0; i < ARRAY_SIZE(cs35l41_otp_map_map); i++) {
> + if (cs35l41_otp_map_map[i].id == otp_id)
> + return &cs35l41_otp_map_map[i];
> + }
The parenthesis could be dropped.
> + return NULL;
> +}
> +int cs35l41_otp_unpack(struct device *dev, struct regmap *regmap)
> +{
> + const struct cs35l41_otp_map_element_t *otp_map_match;
> + const struct cs35l41_otp_packed_element_t *otp_map;
> + int bit_offset, word_offset, ret, i;
> + unsigned int bit_sum = 8;
> + u32 otp_val, otp_id_reg;
> + u32 *otp_mem;
> +
> + otp_mem = kmalloc_array(CS35L41_OTP_SIZE_WORDS, sizeof(*otp_mem), GFP_KERNEL);
> + if (!otp_mem)
> + return -ENOMEM;
> +
> + ret = regmap_read(regmap, CS35L41_OTPID, &otp_id_reg);
> + if (ret) {
> + dev_err(dev, "Read OTP ID failed: %d\n", ret);
> + goto err_otp_unpack;
> + }
> +
> + otp_map_match = cs35l41_find_otp_map(otp_id_reg);
> +
> + if (!otp_map_match) {
> + dev_err(dev, "OTP Map matching ID %d not found\n", otp_id_reg);
> + ret = -EINVAL;
> + goto err_otp_unpack;
> + }
This block could be understood as: assign and check. Surrounding blocks
that carry similar value do not have a newline between assignment and
check. My suggestion is to drop that newline here so the block looks
more cohesive when compared with the rest of the function.
> +
> + ret = regmap_bulk_read(regmap, CS35L41_OTP_MEM0, otp_mem, CS35L41_OTP_SIZE_WORDS);
> + if (ret) {
> + dev_err(dev, "Read OTP Mem failed: %d\n", ret);
> + goto err_otp_unpack;
> + }
> +
> + otp_map = otp_map_match->map;
> +
> + bit_offset = otp_map_match->bit_offset;
> + word_offset = otp_map_match->word_offset;
> +
> + ret = regmap_write(regmap, CS35L41_TEST_KEY_CTL, 0x00000055);
> + if (ret) {
> + dev_err(dev, "Write Unlock key failed 1/2: %d\n", ret);
> + goto err_otp_unpack;
> + }
> + ret = regmap_write(regmap, CS35L41_TEST_KEY_CTL, 0x000000AA);
> + if (ret) {
> + dev_err(dev, "Write Unlock key failed 2/2: %d\n", ret);
> + goto err_otp_unpack;
> + }
> +
> + for (i = 0; i < otp_map_match->num_elements; i++) {
> + dev_dbg(dev, "bitoffset= %d, word_offset=%d, bit_sum mod 32=%d\n",
> + bit_offset, word_offset, bit_sum % 32);
> + if (bit_offset + otp_map[i].size - 1 >= 32) {
> + otp_val = (otp_mem[word_offset] &
> + GENMASK(31, bit_offset)) >> bit_offset;
> + otp_val |= (otp_mem[++word_offset] &
> + GENMASK(bit_offset + otp_map[i].size - 33, 0)) <<
> + (32 - bit_offset);
> + bit_offset += otp_map[i].size - 32;
> + } else {
> + otp_val = (otp_mem[word_offset] &
> + GENMASK(bit_offset + otp_map[i].size - 1, bit_offset)
> + ) >> bit_offset;
The ')' looks off (the '>>' too), at least it does not match the
convention seen in if-statement above. Choosing single convention could
improve the readability.
> + bit_offset += otp_map[i].size;
> + }
> + bit_sum += otp_map[i].size;
> +
> + if (bit_offset == 32) {
> + bit_offset = 0;
> + word_offset++;
> + }
> +
> + if (otp_map[i].reg != 0) {
> + ret = regmap_update_bits(regmap, otp_map[i].reg,
> + GENMASK(otp_map[i].shift + otp_map[i].size - 1,
> + otp_map[i].shift),
> + otp_val << otp_map[i].shift);
> + if (ret < 0) {
> + dev_err(dev, "Write OTP val failed: %d\n", ret);
> + goto err_otp_unpack;
> + }
> + }
> + }
> +
> + ret = regmap_write(regmap, CS35L41_TEST_KEY_CTL, 0x000000CC);
> + if (ret) {
> + dev_err(dev, "Write Lock key failed 1/2: %d\n", ret);
> + goto err_otp_unpack;
> + }
> + ret = regmap_write(regmap, CS35L41_TEST_KEY_CTL, 0x00000033);
> + if (ret) {
> + dev_err(dev, "Write Lock key failed 2/2: %d\n", ret);
> + goto err_otp_unpack;
> + }
> + ret = 0;
Hmm.. maybe I'm missing something, but isn't the 'ret' already '0' by
the time we get here?
> +err_otp_unpack:
> + kfree(otp_mem);
> +
> + return ret;
> +}
> +EXPORT_SYMBOL_GPL(cs35l41_otp_unpack);
> +
WARNING: multiple messages have this Message-ID (diff)
From: Cezary Rojewski <cezary.rojewski@intel.com>
To: Lucas Tanure <tanureal@opensource.cirrus.com>,
"Rafael J . Wysocki" <rafael@kernel.org>,
Len Brown <lenb@kernel.org>, Hans de Goede <hdegoede@redhat.com>,
Mark Gross <markgross@kernel.org>,
Liam Girdwood <lgirdwood@gmail.com>,
Jaroslav Kysela <perex@perex.cz>, Mark Brown <broonie@kernel.org>,
Takashi Iwai <tiwai@suse.com>
Cc: <alsa-devel@alsa-project.org>, <linux-acpi@vger.kernel.org>,
<patches@opensource.cirrus.com>,
<platform-driver-x86@vger.kernel.org>,
<linux-kernel@vger.kernel.org>
Subject: Re: [PATCH v5 02/10] ASoC: cs35l41: Move cs35l41_otp_unpack to shared code
Date: Fri, 17 Dec 2021 13:59:16 +0100 [thread overview]
Message-ID: <0e9c5253-3126-ffca-deb9-c7fc37ba769a@intel.com> (raw)
In-Reply-To: <20211216114332.153409-3-tanureal@opensource.cirrus.com>
On 2021-12-16 12:43 PM, Lucas Tanure wrote:
> ASoC and HDA will do the same cs35l41_otp_unpack, so move it
> to shared code
...
> +static const struct cs35l41_otp_map_element_t *cs35l41_find_otp_map(u32 otp_id)
> +{
> + int i;
> +
> + for (i = 0; i < ARRAY_SIZE(cs35l41_otp_map_map); i++) {
> + if (cs35l41_otp_map_map[i].id == otp_id)
> + return &cs35l41_otp_map_map[i];
> + }
The parenthesis could be dropped.
> + return NULL;
> +}
> +int cs35l41_otp_unpack(struct device *dev, struct regmap *regmap)
> +{
> + const struct cs35l41_otp_map_element_t *otp_map_match;
> + const struct cs35l41_otp_packed_element_t *otp_map;
> + int bit_offset, word_offset, ret, i;
> + unsigned int bit_sum = 8;
> + u32 otp_val, otp_id_reg;
> + u32 *otp_mem;
> +
> + otp_mem = kmalloc_array(CS35L41_OTP_SIZE_WORDS, sizeof(*otp_mem), GFP_KERNEL);
> + if (!otp_mem)
> + return -ENOMEM;
> +
> + ret = regmap_read(regmap, CS35L41_OTPID, &otp_id_reg);
> + if (ret) {
> + dev_err(dev, "Read OTP ID failed: %d\n", ret);
> + goto err_otp_unpack;
> + }
> +
> + otp_map_match = cs35l41_find_otp_map(otp_id_reg);
> +
> + if (!otp_map_match) {
> + dev_err(dev, "OTP Map matching ID %d not found\n", otp_id_reg);
> + ret = -EINVAL;
> + goto err_otp_unpack;
> + }
This block could be understood as: assign and check. Surrounding blocks
that carry similar value do not have a newline between assignment and
check. My suggestion is to drop that newline here so the block looks
more cohesive when compared with the rest of the function.
> +
> + ret = regmap_bulk_read(regmap, CS35L41_OTP_MEM0, otp_mem, CS35L41_OTP_SIZE_WORDS);
> + if (ret) {
> + dev_err(dev, "Read OTP Mem failed: %d\n", ret);
> + goto err_otp_unpack;
> + }
> +
> + otp_map = otp_map_match->map;
> +
> + bit_offset = otp_map_match->bit_offset;
> + word_offset = otp_map_match->word_offset;
> +
> + ret = regmap_write(regmap, CS35L41_TEST_KEY_CTL, 0x00000055);
> + if (ret) {
> + dev_err(dev, "Write Unlock key failed 1/2: %d\n", ret);
> + goto err_otp_unpack;
> + }
> + ret = regmap_write(regmap, CS35L41_TEST_KEY_CTL, 0x000000AA);
> + if (ret) {
> + dev_err(dev, "Write Unlock key failed 2/2: %d\n", ret);
> + goto err_otp_unpack;
> + }
> +
> + for (i = 0; i < otp_map_match->num_elements; i++) {
> + dev_dbg(dev, "bitoffset= %d, word_offset=%d, bit_sum mod 32=%d\n",
> + bit_offset, word_offset, bit_sum % 32);
> + if (bit_offset + otp_map[i].size - 1 >= 32) {
> + otp_val = (otp_mem[word_offset] &
> + GENMASK(31, bit_offset)) >> bit_offset;
> + otp_val |= (otp_mem[++word_offset] &
> + GENMASK(bit_offset + otp_map[i].size - 33, 0)) <<
> + (32 - bit_offset);
> + bit_offset += otp_map[i].size - 32;
> + } else {
> + otp_val = (otp_mem[word_offset] &
> + GENMASK(bit_offset + otp_map[i].size - 1, bit_offset)
> + ) >> bit_offset;
The ')' looks off (the '>>' too), at least it does not match the
convention seen in if-statement above. Choosing single convention could
improve the readability.
> + bit_offset += otp_map[i].size;
> + }
> + bit_sum += otp_map[i].size;
> +
> + if (bit_offset == 32) {
> + bit_offset = 0;
> + word_offset++;
> + }
> +
> + if (otp_map[i].reg != 0) {
> + ret = regmap_update_bits(regmap, otp_map[i].reg,
> + GENMASK(otp_map[i].shift + otp_map[i].size - 1,
> + otp_map[i].shift),
> + otp_val << otp_map[i].shift);
> + if (ret < 0) {
> + dev_err(dev, "Write OTP val failed: %d\n", ret);
> + goto err_otp_unpack;
> + }
> + }
> + }
> +
> + ret = regmap_write(regmap, CS35L41_TEST_KEY_CTL, 0x000000CC);
> + if (ret) {
> + dev_err(dev, "Write Lock key failed 1/2: %d\n", ret);
> + goto err_otp_unpack;
> + }
> + ret = regmap_write(regmap, CS35L41_TEST_KEY_CTL, 0x00000033);
> + if (ret) {
> + dev_err(dev, "Write Lock key failed 2/2: %d\n", ret);
> + goto err_otp_unpack;
> + }
> + ret = 0;
Hmm.. maybe I'm missing something, but isn't the 'ret' already '0' by
the time we get here?
> +err_otp_unpack:
> + kfree(otp_mem);
> +
> + return ret;
> +}
> +EXPORT_SYMBOL_GPL(cs35l41_otp_unpack);
> +
next prev parent reply other threads:[~2021-12-17 13:00 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-12-16 11:43 [PATCH v5 00/10] Add support for CS35L41 in HDA systems Lucas Tanure
2021-12-16 11:43 ` Lucas Tanure
2021-12-16 11:43 ` [PATCH v5 01/10] ASoC: cs35l41: Convert tables to shared source code Lucas Tanure
2021-12-16 11:43 ` Lucas Tanure
2021-12-16 11:43 ` [PATCH v5 02/10] ASoC: cs35l41: Move cs35l41_otp_unpack to shared code Lucas Tanure
2021-12-16 11:43 ` Lucas Tanure
2021-12-17 12:59 ` Cezary Rojewski [this message]
2021-12-17 12:59 ` Cezary Rojewski
2021-12-16 11:43 ` [PATCH v5 03/10] ASoC: cs35l41: Move power initializations to reg_sequence Lucas Tanure
2021-12-16 11:43 ` Lucas Tanure
2021-12-16 11:43 ` [PATCH v5 04/10] ASoC: cs35l41: Create shared function for errata patches Lucas Tanure
2021-12-16 11:43 ` Lucas Tanure
2021-12-16 11:43 ` [PATCH v5 05/10] ASoC: cs35l41: Create shared function for setting channels Lucas Tanure
2021-12-16 11:43 ` Lucas Tanure
2021-12-16 11:43 ` [PATCH v5 06/10] ASoC: cs35l41: Create shared function for boost configuration Lucas Tanure
2021-12-16 11:43 ` Lucas Tanure
2021-12-16 11:43 ` [PATCH v5 07/10] hda: cs35l41: Add support for CS35L41 in HDA systems Lucas Tanure
2021-12-16 11:43 ` Lucas Tanure
2021-12-16 16:29 ` kernel test robot
2021-12-16 11:43 ` [PATCH v5 08/10] ACPI / scan: Create platform device for CLSA0100 and CSC3551 ACPI nodes Lucas Tanure
2021-12-16 11:43 ` Lucas Tanure
2021-12-16 11:43 ` [PATCH v5 09/10] ALSA: hda/realtek: Add support for Legion 7 16ACHg6 laptop Lucas Tanure
2021-12-16 11:43 ` Lucas Tanure
2021-12-16 11:43 ` [PATCH v5 10/10] ALSA: hda/realtek: Add CS35L41 support for Thinkpad laptops Lucas Tanure
2021-12-16 11:43 ` Lucas Tanure
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=0e9c5253-3126-ffca-deb9-c7fc37ba769a@intel.com \
--to=cezary.rojewski@intel.com \
--cc=alsa-devel@alsa-project.org \
--cc=broonie@kernel.org \
--cc=hdegoede@redhat.com \
--cc=lenb@kernel.org \
--cc=lgirdwood@gmail.com \
--cc=linux-acpi@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=markgross@kernel.org \
--cc=patches@opensource.cirrus.com \
--cc=perex@perex.cz \
--cc=platform-driver-x86@vger.kernel.org \
--cc=rafael@kernel.org \
--cc=tanureal@opensource.cirrus.com \
--cc=tiwai@suse.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.