diff options
Diffstat (limited to 'sound/soc/soc-core.c')
| -rw-r--r-- | sound/soc/soc-core.c | 39 |
1 files changed, 35 insertions, 4 deletions
diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c index 754e3ef8d7ae..180bfbfe833d 100644 --- a/sound/soc/soc-core.c +++ b/sound/soc/soc-core.c | |||
| @@ -68,6 +68,20 @@ static int pmdown_time = 5000; | |||
| 68 | module_param(pmdown_time, int, 0); | 68 | module_param(pmdown_time, int, 0); |
| 69 | MODULE_PARM_DESC(pmdown_time, "DAPM stream powerdown time (msecs)"); | 69 | MODULE_PARM_DESC(pmdown_time, "DAPM stream powerdown time (msecs)"); |
| 70 | 70 | ||
| 71 | /* If a DMI filed contain strings in this blacklist (e.g. | ||
| 72 | * "Type2 - Board Manufacturer" or "Type1 - TBD by OEM"), it will be taken | ||
| 73 | * as invalid and dropped when setting the card long name from DMI info. | ||
| 74 | */ | ||
| 75 | static const char * const dmi_blacklist[] = { | ||
| 76 | "To be filled by OEM", | ||
| 77 | "TBD by OEM", | ||
| 78 | "Default String", | ||
| 79 | "Board Manufacturer", | ||
| 80 | "Board Vendor Name", | ||
| 81 | "Board Product Name", | ||
| 82 | NULL, /* terminator */ | ||
| 83 | }; | ||
| 84 | |||
| 71 | /* returns the minimum number of bytes needed to represent | 85 | /* returns the minimum number of bytes needed to represent |
| 72 | * a particular given value */ | 86 | * a particular given value */ |
| 73 | static int min_bytes_needed(unsigned long val) | 87 | static int min_bytes_needed(unsigned long val) |
| @@ -1933,6 +1947,22 @@ static void cleanup_dmi_name(char *name) | |||
| 1933 | name[j] = '\0'; | 1947 | name[j] = '\0'; |
| 1934 | } | 1948 | } |
| 1935 | 1949 | ||
| 1950 | /* Check if a DMI field is valid, i.e. not containing any string | ||
| 1951 | * in the black list. | ||
| 1952 | */ | ||
| 1953 | static int is_dmi_valid(const char *field) | ||
| 1954 | { | ||
| 1955 | int i = 0; | ||
| 1956 | |||
| 1957 | while (dmi_blacklist[i]) { | ||
| 1958 | if (strstr(field, dmi_blacklist[i])) | ||
| 1959 | return 0; | ||
| 1960 | i++; | ||
| 1961 | } | ||
| 1962 | |||
| 1963 | return 1; | ||
| 1964 | } | ||
| 1965 | |||
| 1936 | /** | 1966 | /** |
| 1937 | * snd_soc_set_dmi_name() - Register DMI names to card | 1967 | * snd_soc_set_dmi_name() - Register DMI names to card |
| 1938 | * @card: The card to register DMI names | 1968 | * @card: The card to register DMI names |
| @@ -1975,17 +2005,18 @@ int snd_soc_set_dmi_name(struct snd_soc_card *card, const char *flavour) | |||
| 1975 | 2005 | ||
| 1976 | /* make up dmi long name as: vendor.product.version.board */ | 2006 | /* make up dmi long name as: vendor.product.version.board */ |
| 1977 | vendor = dmi_get_system_info(DMI_BOARD_VENDOR); | 2007 | vendor = dmi_get_system_info(DMI_BOARD_VENDOR); |
| 1978 | if (!vendor) { | 2008 | if (!vendor || !is_dmi_valid(vendor)) { |
| 1979 | dev_warn(card->dev, "ASoC: no DMI vendor name!\n"); | 2009 | dev_warn(card->dev, "ASoC: no DMI vendor name!\n"); |
| 1980 | return 0; | 2010 | return 0; |
| 1981 | } | 2011 | } |
| 1982 | 2012 | ||
| 2013 | |||
| 1983 | snprintf(card->dmi_longname, sizeof(card->snd_card->longname), | 2014 | snprintf(card->dmi_longname, sizeof(card->snd_card->longname), |
| 1984 | "%s", vendor); | 2015 | "%s", vendor); |
| 1985 | cleanup_dmi_name(card->dmi_longname); | 2016 | cleanup_dmi_name(card->dmi_longname); |
| 1986 | 2017 | ||
| 1987 | product = dmi_get_system_info(DMI_PRODUCT_NAME); | 2018 | product = dmi_get_system_info(DMI_PRODUCT_NAME); |
| 1988 | if (product) { | 2019 | if (product && is_dmi_valid(product)) { |
| 1989 | len = strlen(card->dmi_longname); | 2020 | len = strlen(card->dmi_longname); |
| 1990 | snprintf(card->dmi_longname + len, | 2021 | snprintf(card->dmi_longname + len, |
| 1991 | longname_buf_size - len, | 2022 | longname_buf_size - len, |
| @@ -1999,7 +2030,7 @@ int snd_soc_set_dmi_name(struct snd_soc_card *card, const char *flavour) | |||
| 1999 | * name in the product version field | 2030 | * name in the product version field |
| 2000 | */ | 2031 | */ |
| 2001 | product_version = dmi_get_system_info(DMI_PRODUCT_VERSION); | 2032 | product_version = dmi_get_system_info(DMI_PRODUCT_VERSION); |
| 2002 | if (product_version) { | 2033 | if (product_version && is_dmi_valid(product_version)) { |
| 2003 | len = strlen(card->dmi_longname); | 2034 | len = strlen(card->dmi_longname); |
| 2004 | snprintf(card->dmi_longname + len, | 2035 | snprintf(card->dmi_longname + len, |
| 2005 | longname_buf_size - len, | 2036 | longname_buf_size - len, |
| @@ -2012,7 +2043,7 @@ int snd_soc_set_dmi_name(struct snd_soc_card *card, const char *flavour) | |||
| 2012 | } | 2043 | } |
| 2013 | 2044 | ||
| 2014 | board = dmi_get_system_info(DMI_BOARD_NAME); | 2045 | board = dmi_get_system_info(DMI_BOARD_NAME); |
| 2015 | if (board) { | 2046 | if (board && is_dmi_valid(board)) { |
| 2016 | len = strlen(card->dmi_longname); | 2047 | len = strlen(card->dmi_longname); |
| 2017 | snprintf(card->dmi_longname + len, | 2048 | snprintf(card->dmi_longname + len, |
| 2018 | longname_buf_size - len, | 2049 | longname_buf_size - len, |
