Message ID | 20210302163309.25528-5-henning.schild@siemens.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | add device drivers for Siemens Industrial PCs | expand |
On Thu, Mar 4, 2021 at 9:27 AM Henning Schild <henning.schild@siemens.com> wrote: > Siemens industrial PCs unfortunately can not always be properly > identified the way we used to. An earlier commit introduced code that > allows proper identification without looking at DMI strings that could > differ based on product branding. > Switch over to that proper way and revert commits that used to collect > the machines based on unstable strings. > +#include <linux/platform_data/x86/simatic-ipc.h> > +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; Much easier to rewrite it as if (strcmp(...)) // BTW, do we have a dmi_* helper for that? return true; if (dmi_walk) return false; return station_id == || ...; > +} Maybe instead you can rewrite it as a callback in DMI table which changes a (global, yeah) variable that you simply reassign... > 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); > } ...somewhere here? Like clk_data->critical = global_var; if (...) pr_info(); It seems it will reduce burden on a callback by dropping strcmp() call.
diff --git a/drivers/platform/x86/pmc_atom.c b/drivers/platform/x86/pmc_atom.c index ca684ed760d1..03344f5502ad 100644 --- a/drivers/platform/x86/pmc_atom.c +++ b/drivers/platform/x86/pmc_atom.c @@ -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",