@@ -13,6 +13,7 @@
#include <linux/io.h>
#include <linux/platform_data/x86/clk-pmc-atom.h>
#include <linux/platform_data/x86/pmc_atom.h>
+#include <linux/platform_data/x86/simatic-ipc.h>
#include <linux/platform_device.h>
#include <linux/pci.h>
#include <linux/seq_file.h>
@@ -424,30 +425,31 @@ static const struct dmi_system_id critclk_systems[] = {
},
},
{
- .ident = "SIMATIC IPC227E",
+ .ident = "SIEMENS AG",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "SIEMENS AG"),
- DMI_MATCH(DMI_PRODUCT_VERSION, "6ES7647-8B"),
- },
- },
- {
- .ident = "SIMATIC IPC277E",
- .matches = {
- DMI_MATCH(DMI_SYS_VENDOR, "SIEMENS AG"),
- DMI_MATCH(DMI_PRODUCT_VERSION, "6AV7882-0"),
- },
- },
- {
- .ident = "CONNECT X300",
- .matches = {
- DMI_MATCH(DMI_SYS_VENDOR, "SIEMENS AG"),
- DMI_MATCH(DMI_PRODUCT_VERSION, "A5E45074588"),
},
},
{ /*sentinel*/ }
};
+static int pmc_clk_is_critical(const struct dmi_system_id *d)
+{
+ int ret = true;
+ u32 station_id;
+
+ if (!strcmp(d->ident, "SIEMENS AG")) {
+ if (dmi_walk(simatic_ipc_find_dmi_entry_helper, &station_id))
+ ret = false;
+ else
+ ret = (station_id == SIMATIC_IPC_IPC227E ||
+ station_id == SIMATIC_IPC_IPC277E);
+ }
+
+ return ret;
+}
+
static int pmc_setup_clks(struct pci_dev *pdev, void __iomem *pmc_regmap,
const struct pmc_data *pmc_data)
{
@@ -462,8 +464,9 @@ static int pmc_setup_clks(struct pci_dev *pdev, void __iomem *pmc_regmap,
clk_data->base = pmc_regmap; /* offset is added by client */
clk_data->clks = pmc_data->clks;
if (d) {
- clk_data->critical = true;
- pr_info("%s critclks quirk enabled\n", d->ident);
+ clk_data->critical = pmc_clk_is_critical(d);
+ if (clk_data->critical)
+ pr_info("%s critclks quirk enabled\n", d->ident);
}
clkdev = platform_device_register_data(&pdev->dev, "clk-pmc-atom",