* [PATCH v3 0/2] mmc: sdhci-pci: Use ACPI to set max frequency of sdio host controller @ 2016-11-28 19:16 Zach Brown 2016-11-28 19:16 ` [PATCH v3 1/2] mmc: sdhci-pci: Add PCI ID for Intel byt sdio host controller sub-vended by NI Zach Brown 2016-11-28 19:16 ` [PATCH v3 2/2] mmc: sdhci-pci: Use ACPI to get max frequency for Intel byt sdio " Zach Brown 0 siblings, 2 replies; 7+ messages in thread From: Zach Brown @ 2016-11-28 19:16 UTC (permalink / raw) To: ulf.hansson; +Cc: adrian.hunter, linux-mmc, linux-kernel, zach.brown On some boards, max SDIO frequency is limited by trace lengths and other layout choices. We would like a way to specify this limitation so the driver can behave accordingly. This patch set assumes that the limitation has been reported in an ACPI table which the driver can check to get the max frequency. The first patch creates a PCI ID and support for the Intel byt sdio where NI is the subvendor. If CONFIG_ACPI is set, the second patch uses the ACPI table to set f_max during the new ni_byt_sdio_probe_slot. rv2: * Use acpi_evaluate_integer() instead of acpi_get_handle()/acpi_evaluate_object() pv1: * Removed redundant comment * Print info message if MXFQ not found in acpi table pv2: * Changed info message to error message if MXFQ not found * Replaced ni_byt_sdio_probe_slot with one of two versions depending on whether CONFIG_ACPI is set. pv3: * Replaced the two versions of ni_byt_sdio_probe_slot with new version that calls ni_set_max_freq. * Created ni_set_max_freq which sets the slot's max_freq if CONFIG_ACPI is set. Zach Brown (2): mmc: sdhci-pci: Add PCI ID for Intel byt sdio host controller sub-vended by NI mmc: sdhci-pci: Use ACPI to get max frequency for Intel byt sdio controller sub-vended by NI drivers/mmc/host/sdhci-pci-core.c | 56 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) -- 2.7.4 ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v3 1/2] mmc: sdhci-pci: Add PCI ID for Intel byt sdio host controller sub-vended by NI 2016-11-28 19:16 [PATCH v3 0/2] mmc: sdhci-pci: Use ACPI to set max frequency of sdio host controller Zach Brown @ 2016-11-28 19:16 ` Zach Brown 2016-12-01 7:52 ` Adrian Hunter 2016-12-01 8:14 ` Ulf Hansson 2016-11-28 19:16 ` [PATCH v3 2/2] mmc: sdhci-pci: Use ACPI to get max frequency for Intel byt sdio " Zach Brown 1 sibling, 2 replies; 7+ messages in thread From: Zach Brown @ 2016-11-28 19:16 UTC (permalink / raw) To: ulf.hansson; +Cc: adrian.hunter, linux-mmc, linux-kernel, zach.brown Add PCI ID for Intel byt sdio host controller sub-vended by NI. The controller has different behavior because of the board layout NI puts it on. Signed-off-by: Zach Brown <zach.brown@ni.com> --- drivers/mmc/host/sdhci-pci-core.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/drivers/mmc/host/sdhci-pci-core.c b/drivers/mmc/host/sdhci-pci-core.c index 1d9e00a..9741505 100644 --- a/drivers/mmc/host/sdhci-pci-core.c +++ b/drivers/mmc/host/sdhci-pci-core.c @@ -375,6 +375,13 @@ static int byt_emmc_probe_slot(struct sdhci_pci_slot *slot) return 0; } +static int ni_byt_sdio_probe_slot(struct sdhci_pci_slot *slot) +{ + slot->host->mmc->caps |= MMC_CAP_POWER_OFF_CARD | MMC_CAP_NONREMOVABLE | + MMC_CAP_WAIT_WHILE_BUSY; + return 0; +} + static int byt_sdio_probe_slot(struct sdhci_pci_slot *slot) { slot->host->mmc->caps |= MMC_CAP_POWER_OFF_CARD | MMC_CAP_NONREMOVABLE | @@ -447,6 +454,15 @@ static const struct sdhci_pci_fixes sdhci_intel_byt_emmc = { .ops = &sdhci_intel_byt_ops, }; +static const struct sdhci_pci_fixes sdhci_ni_byt_sdio = { + .quirks = SDHCI_QUIRK_NO_ENDATTR_IN_NOPDESC, + .quirks2 = SDHCI_QUIRK2_HOST_OFF_CARD_ON | + SDHCI_QUIRK2_PRESET_VALUE_BROKEN, + .allow_runtime_pm = true, + .probe_slot = ni_byt_sdio_probe_slot, + .ops = &sdhci_intel_byt_ops, +}; + static const struct sdhci_pci_fixes sdhci_intel_byt_sdio = { .quirks = SDHCI_QUIRK_NO_ENDATTR_IN_NOPDESC, .quirks2 = SDHCI_QUIRK2_HOST_OFF_CARD_ON | @@ -1079,6 +1095,14 @@ static const struct pci_device_id pci_ids[] = { { .vendor = PCI_VENDOR_ID_INTEL, .device = PCI_DEVICE_ID_INTEL_BYT_SDIO, + .subvendor = PCI_VENDOR_ID_NI, + .subdevice = 0x7884, + .driver_data = (kernel_ulong_t)&sdhci_ni_byt_sdio, + }, + + { + .vendor = PCI_VENDOR_ID_INTEL, + .device = PCI_DEVICE_ID_INTEL_BYT_SDIO, .subvendor = PCI_ANY_ID, .subdevice = PCI_ANY_ID, .driver_data = (kernel_ulong_t)&sdhci_intel_byt_sdio, -- 2.7.4 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH v3 1/2] mmc: sdhci-pci: Add PCI ID for Intel byt sdio host controller sub-vended by NI 2016-11-28 19:16 ` [PATCH v3 1/2] mmc: sdhci-pci: Add PCI ID for Intel byt sdio host controller sub-vended by NI Zach Brown @ 2016-12-01 7:52 ` Adrian Hunter 2016-12-01 8:14 ` Ulf Hansson 1 sibling, 0 replies; 7+ messages in thread From: Adrian Hunter @ 2016-12-01 7:52 UTC (permalink / raw) To: Zach Brown, ulf.hansson; +Cc: linux-mmc, linux-kernel On 28/11/16 21:16, Zach Brown wrote: > Add PCI ID for Intel byt sdio host controller sub-vended by NI. > > The controller has different behavior because of the board layout NI > puts it on. > > Signed-off-by: Zach Brown <zach.brown@ni.com> Acked-by: Adrian Hunter <adrian.hunter@intel.com> > --- > drivers/mmc/host/sdhci-pci-core.c | 24 ++++++++++++++++++++++++ > 1 file changed, 24 insertions(+) > > diff --git a/drivers/mmc/host/sdhci-pci-core.c b/drivers/mmc/host/sdhci-pci-core.c > index 1d9e00a..9741505 100644 > --- a/drivers/mmc/host/sdhci-pci-core.c > +++ b/drivers/mmc/host/sdhci-pci-core.c > @@ -375,6 +375,13 @@ static int byt_emmc_probe_slot(struct sdhci_pci_slot *slot) > return 0; > } > > +static int ni_byt_sdio_probe_slot(struct sdhci_pci_slot *slot) > +{ > + slot->host->mmc->caps |= MMC_CAP_POWER_OFF_CARD | MMC_CAP_NONREMOVABLE | > + MMC_CAP_WAIT_WHILE_BUSY; > + return 0; > +} > + > static int byt_sdio_probe_slot(struct sdhci_pci_slot *slot) > { > slot->host->mmc->caps |= MMC_CAP_POWER_OFF_CARD | MMC_CAP_NONREMOVABLE | > @@ -447,6 +454,15 @@ static const struct sdhci_pci_fixes sdhci_intel_byt_emmc = { > .ops = &sdhci_intel_byt_ops, > }; > > +static const struct sdhci_pci_fixes sdhci_ni_byt_sdio = { > + .quirks = SDHCI_QUIRK_NO_ENDATTR_IN_NOPDESC, > + .quirks2 = SDHCI_QUIRK2_HOST_OFF_CARD_ON | > + SDHCI_QUIRK2_PRESET_VALUE_BROKEN, > + .allow_runtime_pm = true, > + .probe_slot = ni_byt_sdio_probe_slot, > + .ops = &sdhci_intel_byt_ops, > +}; > + > static const struct sdhci_pci_fixes sdhci_intel_byt_sdio = { > .quirks = SDHCI_QUIRK_NO_ENDATTR_IN_NOPDESC, > .quirks2 = SDHCI_QUIRK2_HOST_OFF_CARD_ON | > @@ -1079,6 +1095,14 @@ static const struct pci_device_id pci_ids[] = { > { > .vendor = PCI_VENDOR_ID_INTEL, > .device = PCI_DEVICE_ID_INTEL_BYT_SDIO, > + .subvendor = PCI_VENDOR_ID_NI, > + .subdevice = 0x7884, > + .driver_data = (kernel_ulong_t)&sdhci_ni_byt_sdio, > + }, > + > + { > + .vendor = PCI_VENDOR_ID_INTEL, > + .device = PCI_DEVICE_ID_INTEL_BYT_SDIO, > .subvendor = PCI_ANY_ID, > .subdevice = PCI_ANY_ID, > .driver_data = (kernel_ulong_t)&sdhci_intel_byt_sdio, > ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v3 1/2] mmc: sdhci-pci: Add PCI ID for Intel byt sdio host controller sub-vended by NI 2016-11-28 19:16 ` [PATCH v3 1/2] mmc: sdhci-pci: Add PCI ID for Intel byt sdio host controller sub-vended by NI Zach Brown 2016-12-01 7:52 ` Adrian Hunter @ 2016-12-01 8:14 ` Ulf Hansson 1 sibling, 0 replies; 7+ messages in thread From: Ulf Hansson @ 2016-12-01 8:14 UTC (permalink / raw) To: Zach Brown; +Cc: Adrian Hunter, linux-mmc, linux-kernel On 28 November 2016 at 20:16, Zach Brown <zach.brown@ni.com> wrote: > Add PCI ID for Intel byt sdio host controller sub-vended by NI. > > The controller has different behavior because of the board layout NI > puts it on. > > Signed-off-by: Zach Brown <zach.brown@ni.com> Thanks, applied for next! Kind regards Uffe > --- > drivers/mmc/host/sdhci-pci-core.c | 24 ++++++++++++++++++++++++ > 1 file changed, 24 insertions(+) > > diff --git a/drivers/mmc/host/sdhci-pci-core.c b/drivers/mmc/host/sdhci-pci-core.c > index 1d9e00a..9741505 100644 > --- a/drivers/mmc/host/sdhci-pci-core.c > +++ b/drivers/mmc/host/sdhci-pci-core.c > @@ -375,6 +375,13 @@ static int byt_emmc_probe_slot(struct sdhci_pci_slot *slot) > return 0; > } > > +static int ni_byt_sdio_probe_slot(struct sdhci_pci_slot *slot) > +{ > + slot->host->mmc->caps |= MMC_CAP_POWER_OFF_CARD | MMC_CAP_NONREMOVABLE | > + MMC_CAP_WAIT_WHILE_BUSY; > + return 0; > +} > + > static int byt_sdio_probe_slot(struct sdhci_pci_slot *slot) > { > slot->host->mmc->caps |= MMC_CAP_POWER_OFF_CARD | MMC_CAP_NONREMOVABLE | > @@ -447,6 +454,15 @@ static const struct sdhci_pci_fixes sdhci_intel_byt_emmc = { > .ops = &sdhci_intel_byt_ops, > }; > > +static const struct sdhci_pci_fixes sdhci_ni_byt_sdio = { > + .quirks = SDHCI_QUIRK_NO_ENDATTR_IN_NOPDESC, > + .quirks2 = SDHCI_QUIRK2_HOST_OFF_CARD_ON | > + SDHCI_QUIRK2_PRESET_VALUE_BROKEN, > + .allow_runtime_pm = true, > + .probe_slot = ni_byt_sdio_probe_slot, > + .ops = &sdhci_intel_byt_ops, > +}; > + > static const struct sdhci_pci_fixes sdhci_intel_byt_sdio = { > .quirks = SDHCI_QUIRK_NO_ENDATTR_IN_NOPDESC, > .quirks2 = SDHCI_QUIRK2_HOST_OFF_CARD_ON | > @@ -1079,6 +1095,14 @@ static const struct pci_device_id pci_ids[] = { > { > .vendor = PCI_VENDOR_ID_INTEL, > .device = PCI_DEVICE_ID_INTEL_BYT_SDIO, > + .subvendor = PCI_VENDOR_ID_NI, > + .subdevice = 0x7884, > + .driver_data = (kernel_ulong_t)&sdhci_ni_byt_sdio, > + }, > + > + { > + .vendor = PCI_VENDOR_ID_INTEL, > + .device = PCI_DEVICE_ID_INTEL_BYT_SDIO, > .subvendor = PCI_ANY_ID, > .subdevice = PCI_ANY_ID, > .driver_data = (kernel_ulong_t)&sdhci_intel_byt_sdio, > -- > 2.7.4 > ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v3 2/2] mmc: sdhci-pci: Use ACPI to get max frequency for Intel byt sdio controller sub-vended by NI 2016-11-28 19:16 [PATCH v3 0/2] mmc: sdhci-pci: Use ACPI to set max frequency of sdio host controller Zach Brown 2016-11-28 19:16 ` [PATCH v3 1/2] mmc: sdhci-pci: Add PCI ID for Intel byt sdio host controller sub-vended by NI Zach Brown @ 2016-11-28 19:16 ` Zach Brown 2016-12-01 7:52 ` Adrian Hunter 2016-12-01 8:14 ` Ulf Hansson 1 sibling, 2 replies; 7+ messages in thread From: Zach Brown @ 2016-11-28 19:16 UTC (permalink / raw) To: ulf.hansson; +Cc: adrian.hunter, linux-mmc, linux-kernel, zach.brown On NI 9037 boards the max SDIO frequency is limited by trace lengths and other layout choices. The max SDIO frequency is stored in an ACPI table. The driver reads the ACPI entry MXFQ during sdio_probe_slot and sets the f_max field of the host. Signed-off-by: Nathan Sullivan <nathan.sullivan@ni.com> Reviewed-by: Jaeden Amero <jaeden.amero@ni.com> Reviewed-by: Josh Cartwright <joshc@ni.com> Signed-off-by: Zach Brown <zach.brown@ni.com> --- drivers/mmc/host/sdhci-pci-core.c | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/drivers/mmc/host/sdhci-pci-core.c b/drivers/mmc/host/sdhci-pci-core.c index 9741505..c9e51b1 100644 --- a/drivers/mmc/host/sdhci-pci-core.c +++ b/drivers/mmc/host/sdhci-pci-core.c @@ -27,6 +27,7 @@ #include <linux/pm_runtime.h> #include <linux/mmc/slot-gpio.h> #include <linux/mmc/sdhci-pci-data.h> +#include <linux/acpi.h> #include "sdhci.h" #include "sdhci-pci.h" @@ -375,8 +376,39 @@ static int byt_emmc_probe_slot(struct sdhci_pci_slot *slot) return 0; } +#ifdef CONFIG_ACPI +static int ni_set_max_freq(struct sdhci_pci_slot *slot) +{ + acpi_status status; + unsigned long long max_freq; + + status = acpi_evaluate_integer(ACPI_HANDLE(&slot->chip->pdev->dev), + "MXFQ", NULL, &max_freq); + if (ACPI_FAILURE(status)) { + dev_err(&slot->chip->pdev->dev, + "MXFQ not found in acpi table\n"); + return -EINVAL; + } + + slot->host->mmc->f_max = max_freq * 1000000; + + return 0; +} +#else +static inline int ni_set_max_freq(struct sdhci_pci_slot *slot) +{ + return 0; +} +#endif + static int ni_byt_sdio_probe_slot(struct sdhci_pci_slot *slot) { + int err; + + err = ni_set_max_freq(slot); + if (err) + return err; + slot->host->mmc->caps |= MMC_CAP_POWER_OFF_CARD | MMC_CAP_NONREMOVABLE | MMC_CAP_WAIT_WHILE_BUSY; return 0; -- 2.7.4 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH v3 2/2] mmc: sdhci-pci: Use ACPI to get max frequency for Intel byt sdio controller sub-vended by NI 2016-11-28 19:16 ` [PATCH v3 2/2] mmc: sdhci-pci: Use ACPI to get max frequency for Intel byt sdio " Zach Brown @ 2016-12-01 7:52 ` Adrian Hunter 2016-12-01 8:14 ` Ulf Hansson 1 sibling, 0 replies; 7+ messages in thread From: Adrian Hunter @ 2016-12-01 7:52 UTC (permalink / raw) To: Zach Brown, ulf.hansson; +Cc: linux-mmc, linux-kernel On 28/11/16 21:16, Zach Brown wrote: > On NI 9037 boards the max SDIO frequency is limited by trace lengths > and other layout choices. The max SDIO frequency is stored in an ACPI > table. > > The driver reads the ACPI entry MXFQ during sdio_probe_slot and sets the > f_max field of the host. > > Signed-off-by: Nathan Sullivan <nathan.sullivan@ni.com> > Reviewed-by: Jaeden Amero <jaeden.amero@ni.com> > Reviewed-by: Josh Cartwright <joshc@ni.com> > Signed-off-by: Zach Brown <zach.brown@ni.com> Acked-by: Adrian Hunter <adrian.hunter@intel.com> > --- > drivers/mmc/host/sdhci-pci-core.c | 32 ++++++++++++++++++++++++++++++++ > 1 file changed, 32 insertions(+) > > diff --git a/drivers/mmc/host/sdhci-pci-core.c b/drivers/mmc/host/sdhci-pci-core.c > index 9741505..c9e51b1 100644 > --- a/drivers/mmc/host/sdhci-pci-core.c > +++ b/drivers/mmc/host/sdhci-pci-core.c > @@ -27,6 +27,7 @@ > #include <linux/pm_runtime.h> > #include <linux/mmc/slot-gpio.h> > #include <linux/mmc/sdhci-pci-data.h> > +#include <linux/acpi.h> > > #include "sdhci.h" > #include "sdhci-pci.h" > @@ -375,8 +376,39 @@ static int byt_emmc_probe_slot(struct sdhci_pci_slot *slot) > return 0; > } > > +#ifdef CONFIG_ACPI > +static int ni_set_max_freq(struct sdhci_pci_slot *slot) > +{ > + acpi_status status; > + unsigned long long max_freq; > + > + status = acpi_evaluate_integer(ACPI_HANDLE(&slot->chip->pdev->dev), > + "MXFQ", NULL, &max_freq); > + if (ACPI_FAILURE(status)) { > + dev_err(&slot->chip->pdev->dev, > + "MXFQ not found in acpi table\n"); > + return -EINVAL; > + } > + > + slot->host->mmc->f_max = max_freq * 1000000; > + > + return 0; > +} > +#else > +static inline int ni_set_max_freq(struct sdhci_pci_slot *slot) > +{ > + return 0; > +} > +#endif > + > static int ni_byt_sdio_probe_slot(struct sdhci_pci_slot *slot) > { > + int err; > + > + err = ni_set_max_freq(slot); > + if (err) > + return err; > + > slot->host->mmc->caps |= MMC_CAP_POWER_OFF_CARD | MMC_CAP_NONREMOVABLE | > MMC_CAP_WAIT_WHILE_BUSY; > return 0; > ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v3 2/2] mmc: sdhci-pci: Use ACPI to get max frequency for Intel byt sdio controller sub-vended by NI 2016-11-28 19:16 ` [PATCH v3 2/2] mmc: sdhci-pci: Use ACPI to get max frequency for Intel byt sdio " Zach Brown 2016-12-01 7:52 ` Adrian Hunter @ 2016-12-01 8:14 ` Ulf Hansson 1 sibling, 0 replies; 7+ messages in thread From: Ulf Hansson @ 2016-12-01 8:14 UTC (permalink / raw) To: Zach Brown; +Cc: Adrian Hunter, linux-mmc, linux-kernel On 28 November 2016 at 20:16, Zach Brown <zach.brown@ni.com> wrote: > On NI 9037 boards the max SDIO frequency is limited by trace lengths > and other layout choices. The max SDIO frequency is stored in an ACPI > table. > > The driver reads the ACPI entry MXFQ during sdio_probe_slot and sets the > f_max field of the host. > > Signed-off-by: Nathan Sullivan <nathan.sullivan@ni.com> > Reviewed-by: Jaeden Amero <jaeden.amero@ni.com> > Reviewed-by: Josh Cartwright <joshc@ni.com> > Signed-off-by: Zach Brown <zach.brown@ni.com> Thanks, applied for next! Kind regards Uffe > --- > drivers/mmc/host/sdhci-pci-core.c | 32 ++++++++++++++++++++++++++++++++ > 1 file changed, 32 insertions(+) > > diff --git a/drivers/mmc/host/sdhci-pci-core.c b/drivers/mmc/host/sdhci-pci-core.c > index 9741505..c9e51b1 100644 > --- a/drivers/mmc/host/sdhci-pci-core.c > +++ b/drivers/mmc/host/sdhci-pci-core.c > @@ -27,6 +27,7 @@ > #include <linux/pm_runtime.h> > #include <linux/mmc/slot-gpio.h> > #include <linux/mmc/sdhci-pci-data.h> > +#include <linux/acpi.h> > > #include "sdhci.h" > #include "sdhci-pci.h" > @@ -375,8 +376,39 @@ static int byt_emmc_probe_slot(struct sdhci_pci_slot *slot) > return 0; > } > > +#ifdef CONFIG_ACPI > +static int ni_set_max_freq(struct sdhci_pci_slot *slot) > +{ > + acpi_status status; > + unsigned long long max_freq; > + > + status = acpi_evaluate_integer(ACPI_HANDLE(&slot->chip->pdev->dev), > + "MXFQ", NULL, &max_freq); > + if (ACPI_FAILURE(status)) { > + dev_err(&slot->chip->pdev->dev, > + "MXFQ not found in acpi table\n"); > + return -EINVAL; > + } > + > + slot->host->mmc->f_max = max_freq * 1000000; > + > + return 0; > +} > +#else > +static inline int ni_set_max_freq(struct sdhci_pci_slot *slot) > +{ > + return 0; > +} > +#endif > + > static int ni_byt_sdio_probe_slot(struct sdhci_pci_slot *slot) > { > + int err; > + > + err = ni_set_max_freq(slot); > + if (err) > + return err; > + > slot->host->mmc->caps |= MMC_CAP_POWER_OFF_CARD | MMC_CAP_NONREMOVABLE | > MMC_CAP_WAIT_WHILE_BUSY; > return 0; > -- > 2.7.4 > ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2016-12-01 8:14 UTC | newest] Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2016-11-28 19:16 [PATCH v3 0/2] mmc: sdhci-pci: Use ACPI to set max frequency of sdio host controller Zach Brown 2016-11-28 19:16 ` [PATCH v3 1/2] mmc: sdhci-pci: Add PCI ID for Intel byt sdio host controller sub-vended by NI Zach Brown 2016-12-01 7:52 ` Adrian Hunter 2016-12-01 8:14 ` Ulf Hansson 2016-11-28 19:16 ` [PATCH v3 2/2] mmc: sdhci-pci: Use ACPI to get max frequency for Intel byt sdio " Zach Brown 2016-12-01 7:52 ` Adrian Hunter 2016-12-01 8:14 ` Ulf Hansson
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).