On 20/10/17 12:16, Ulf Hansson wrote: > On 19 October 2017 at 12:41, Adrian Hunter <adrian.hunter@xxxxxxxxx> wrote: >> Some Intel host controllers use an ACPI device-specific method to ensure >> correct voltage switching. Fix voltage switch for those, by adding a call >> to the DSM. >> >> Signed-off-by: Adrian Hunter <adrian.hunter@xxxxxxxxx> >> --- >> drivers/mmc/host/sdhci-acpi.c | 108 ++++++++++++++++++++++++++++++++++++++++++ >> 1 file changed, 108 insertions(+) >> >> diff --git a/drivers/mmc/host/sdhci-acpi.c b/drivers/mmc/host/sdhci-acpi.c >> index 5bb5880403b2..b988997a1e80 100644 >> --- a/drivers/mmc/host/sdhci-acpi.c >> +++ b/drivers/mmc/host/sdhci-acpi.c >> @@ -96,6 +96,105 @@ static inline bool sdhci_acpi_flag(struct sdhci_acpi_host *c, unsigned int flag) >> return c->slot && (c->slot->flags & flag); >> } >> >> +enum { >> + INTEL_DSM_FNS = 0, >> + INTEL_DSM_V18_SWITCH = 3, >> + INTEL_DSM_V33_SWITCH = 4, >> +}; >> + >> +struct intel_host { >> + u32 dsm_fns; >> +}; >> + >> +static const guid_t intel_dsm_guid = >> + GUID_INIT(0xF6C13EA5, 0x65CD, 0x461F, >> + 0xAB, 0x7A, 0x29, 0xF7, 0xE8, 0xD5, 0xBD, 0x61); >> + >> +static int __intel_dsm(struct intel_host *intel_host, struct device *dev, >> + unsigned int fn, u32 *result) >> +{ >> + union acpi_object *obj; >> + int err = 0; >> + >> + obj = acpi_evaluate_dsm(ACPI_HANDLE(dev), &intel_dsm_guid, 0, fn, NULL); >> + if (!obj) >> + return -EOPNOTSUPP; >> + >> + if (obj->type == ACPI_TYPE_INTEGER) { >> + *result = obj->integer.value; >> + } else if (obj->type == ACPI_TYPE_BUFFER && obj->buffer.length > 0) { >> + size_t len = min_t(size_t, obj->buffer.length, 4); >> + >> + *result = 0; >> + memcpy(result, obj->buffer.pointer, len); >> + } else { >> + dev_err(dev, "%s DSM fn %u obj->type %d obj->buffer.length %d\n", >> + __func__, fn, obj->type, obj->buffer.length); >> + err = -EINVAL; >> + } >> + > > This hole ACPI thing looks weird. DSMs are normal. > Could perhaps the ACPI core, model > this a vqmmc regulator instead? The regulator framework does not support that. > > That would keep the ACPI specific part closer to ACPI and we can treat > this similar to other mmc host drivers. Device-specific methods (DSM) are device specific so they belong in the driver not ACPI core. So the code would all end up here anyway but be more complicated and more obfuscated. -- To unsubscribe from this list: send the line "unsubscribe linux-mmc" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html