| From dd624102cafb6092070502d7793d30aca6cc0990 Mon Sep 17 00:00:00 2001 |
| From: Takashi Sakamoto <o-takashi@sakamocchi.jp> |
| Date: Fri, 16 Dec 2016 18:26:54 +0900 |
| Subject: [PATCH] ASoC: hdmi-codec: use unsigned type to structure members with |
| bit-field |
| |
| commit 9e4d59ada4d602e78eee9fb5f898ce61fdddb446 upstream. |
| |
| This is a fix for Linux 4.10-rc1. |
| |
| In C language specification, a bit-field is interpreted as a signed or |
| unsigned integer type consisting of the specified number of bits. |
| |
| In GCC manual, the range of a signed bit field of N bits is from |
| -(2^N) / 2 to ((2^N) / 2) - 1 |
| https://www.gnu.org/software/gnu-c-manual/gnu-c-manual.html#Bit-Fields |
| |
| Therefore, when defined as 1 bit-field with signed type, variables can |
| represents -1 and 0. |
| |
| The snd-soc-hdmi-codec module includes a structure which has signed type |
| members with bit-fields. Codes of this module assign 0 and 1 to the |
| members. This seems to result in implementation-dependent behaviours. |
| |
| As of v4.10-rc1 merge window, outside of sound subsystem, this structure |
| is referred by below GPU modules. |
| - tda998x |
| - sti-drm |
| - mediatek-drm-hdmi |
| - msm |
| |
| As long as I review their codes relevant to the structure, the structure |
| members are used just for condition statements and printk formats. |
| My proposal of change is a bit intrusive to the printk formats but this |
| may be acceptable. |
| |
| Totally, it's reasonable to use unsigned type for the structure members. |
| This bug is detected by Sparse, static code analyzer with below warnings. |
| |
| ./include/sound/hdmi-codec.h:39:26: error: dubious one-bit signed bitfield |
| ./include/sound/hdmi-codec.h:40:28: error: dubious one-bit signed bitfield |
| ./include/sound/hdmi-codec.h:41:29: error: dubious one-bit signed bitfield |
| ./include/sound/hdmi-codec.h:42:31: error: dubious one-bit signed bitfield |
| |
| Fixes: 09184118a8ab ("ASoC: hdmi-codec: Add hdmi-codec for external HDMI-encoders") |
| Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp> |
| Acked-by: Arnaud Pouliquen <arnaud.pouliquen@st.com> |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| CC: stable@vger.kernel.org |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/include/sound/hdmi-codec.h b/include/sound/hdmi-codec.h |
| index 530c57bdefa0..915c4357945c 100644 |
| --- a/include/sound/hdmi-codec.h |
| +++ b/include/sound/hdmi-codec.h |
| @@ -36,10 +36,10 @@ struct hdmi_codec_daifmt { |
| HDMI_AC97, |
| HDMI_SPDIF, |
| } fmt; |
| - int bit_clk_inv:1; |
| - int frame_clk_inv:1; |
| - int bit_clk_master:1; |
| - int frame_clk_master:1; |
| + unsigned int bit_clk_inv:1; |
| + unsigned int frame_clk_inv:1; |
| + unsigned int bit_clk_master:1; |
| + unsigned int frame_clk_master:1; |
| }; |
| |
| /* |
| -- |
| 2.10.1 |
| |