Patch "ASoC: soc-card: Add storage for PCI SSID" has been added to the 6.5-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    ASoC: soc-card: Add storage for PCI SSID

to the 6.5-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     asoc-soc-card-add-storage-for-pci-ssid.patch
and it can be found in the queue-6.5 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 8450094d5484d7ea4ad7362bc216636b6202708b
Author: Richard Fitzgerald <rf@xxxxxxxxxxxxxxxxxxxxx>
Date:   Tue Sep 12 17:32:04 2023 +0100

    ASoC: soc-card: Add storage for PCI SSID
    
    [ Upstream commit 47f56e38a199bd45514b8e0142399cba4feeaf1a ]
    
    Add members to struct snd_soc_card to store the PCI subsystem ID (SSID)
    of the soundcard.
    
    The PCI specification provides two registers to store a vendor-specific
    SSID that can be read by drivers to uniquely identify a particular
    "soundcard". This is defined in the PCI specification to distinguish
    products that use the same silicon (and therefore have the same silicon
    ID) so that product-specific differences can be applied.
    
    PCI only defines 0xFFFF as an invalid value. 0x0000 is not defined as
    invalid. So the usual pattern of zero-filling the struct and then
    assuming a zero value unset will not work. A flag is included to
    indicate when the SSID information has been filled in.
    
    Unlike DMI information, which has a free-format entirely up to the vendor,
    the PCI SSID has a strictly defined format and a registry of vendor IDs.
    
    It is usual in Windows drivers that the SSID is used as the sole identifier
    of the specific end-product and the Windows driver contains tables mapping
    that to information about the hardware setup, rather than using ACPI
    properties.
    
    This SSID is important information for ASoC components that need to apply
    hardware-specific configuration on PCI-based systems.
    
    As the SSID is a generic part of the PCI specification and is treated as
    identifying the "soundcard", it is reasonable to include this information
    in struct snd_soc_card, instead of components inventing their own custom
    ways to pass this information around.
    
    Signed-off-by: Richard Fitzgerald <rf@xxxxxxxxxxxxxxxxxxxxx>
    Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@xxxxxxxxxxxxxxx>
    Link: https://lore.kernel.org/r/20230912163207.3498161-2-rf@xxxxxxxxxxxxxxxxxxxxx
    Signed-off-by: Mark Brown <broonie@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/include/sound/soc-card.h b/include/sound/soc-card.h
index fc94dfb0021fd..e8ff2e089cd00 100644
--- a/include/sound/soc-card.h
+++ b/include/sound/soc-card.h
@@ -59,6 +59,43 @@ int snd_soc_card_add_dai_link(struct snd_soc_card *card,
 void snd_soc_card_remove_dai_link(struct snd_soc_card *card,
 				  struct snd_soc_dai_link *dai_link);
 
+#ifdef CONFIG_PCI
+static inline void snd_soc_card_set_pci_ssid(struct snd_soc_card *card,
+					     unsigned short vendor,
+					     unsigned short device)
+{
+	card->pci_subsystem_vendor = vendor;
+	card->pci_subsystem_device = device;
+	card->pci_subsystem_set = true;
+}
+
+static inline int snd_soc_card_get_pci_ssid(struct snd_soc_card *card,
+					    unsigned short *vendor,
+					    unsigned short *device)
+{
+	if (!card->pci_subsystem_set)
+		return -ENOENT;
+
+	*vendor = card->pci_subsystem_vendor;
+	*device = card->pci_subsystem_device;
+
+	return 0;
+}
+#else /* !CONFIG_PCI */
+static inline void snd_soc_card_set_pci_ssid(struct snd_soc_card *card,
+					     unsigned short vendor,
+					     unsigned short device)
+{
+}
+
+static inline int snd_soc_card_get_pci_ssid(struct snd_soc_card *card,
+					    unsigned short *vendor,
+					    unsigned short *device)
+{
+	return -ENOENT;
+}
+#endif /* CONFIG_PCI */
+
 /* device driver data */
 static inline void snd_soc_card_set_drvdata(struct snd_soc_card *card,
 					    void *data)
diff --git a/include/sound/soc.h b/include/sound/soc.h
index cf34810882347..0c54b343d3e5d 100644
--- a/include/sound/soc.h
+++ b/include/sound/soc.h
@@ -931,6 +931,17 @@ struct snd_soc_card {
 #ifdef CONFIG_DMI
 	char dmi_longname[80];
 #endif /* CONFIG_DMI */
+
+#ifdef CONFIG_PCI
+	/*
+	 * PCI does not define 0 as invalid, so pci_subsystem_set indicates
+	 * whether a value has been written to these fields.
+	 */
+	unsigned short pci_subsystem_vendor;
+	unsigned short pci_subsystem_device;
+	bool pci_subsystem_set;
+#endif /* CONFIG_PCI */
+
 	char topology_shortname[32];
 
 	struct device *dev;



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux