On Thu, Dec 06, 2018 at 02:47:03PM +0100, Hans de Goede wrote: > DSI LCD panels describe an initialization sequence in the Video BIOS > Tables using so called MIPI sequences. One possible element in these > sequences is a PMIC specific element of 15 bytes. > > Although this is not really an ACPI opregion, the ACPI opregion code is the > closest thing we have. We need to have support for these PMIC specific MIPI > sequence elements somwhere. Since we already instantiate a special platform > device for Intel PMICs for the ACPI PMIC OpRegion handler to bind to, > with PMIC specific implementations of the OpRegion, the handling of MIPI > sequence PMIC elements fits very well in the ACPI PMIC OpRegion code. > > This commit adds a new intel_soc_pmic_exec_mipi_pmic_seq_element() > function, which is to be backed by a PMIC specific > exec_mipi_pmic_seq_element callback. This function will be called by the > i915 code to execture MIPI sequence PMIC elements. > > Signed-off-by: Hans de Goede <hdegoede@xxxxxxxxxx> > --- > drivers/acpi/pmic/intel_pmic.c | 25 +++++++++++++++++++++++++ > drivers/acpi/pmic/intel_pmic.h | 1 + > include/linux/mfd/intel_soc_pmic.h | 2 ++ > 3 files changed, 28 insertions(+) > > diff --git a/drivers/acpi/pmic/intel_pmic.c b/drivers/acpi/pmic/intel_pmic.c > index ca18e0d23df9..0d96ca08bb79 100644 > --- a/drivers/acpi/pmic/intel_pmic.c > +++ b/drivers/acpi/pmic/intel_pmic.c > @@ -15,6 +15,7 @@ > > #include <linux/export.h> > #include <linux/acpi.h> > +#include <linux/mfd/intel_soc_pmic.h> > #include <linux/regmap.h> > #include <acpi/acpi_lpat.h> > #include "intel_pmic.h" > @@ -36,6 +37,8 @@ struct intel_pmic_opregion { > struct intel_pmic_regs_handler_ctx ctx; > }; > > +static struct intel_pmic_opregion *intel_pmic_opregion; > + > static int pmic_get_reg_bit(int address, struct pmic_table *table, > int count, int *reg, int *bit) > { > @@ -304,6 +307,7 @@ int intel_pmic_install_opregion_handler(struct device *dev, acpi_handle handle, > } > > opregion->data = d; > + intel_pmic_opregion = opregion; > return 0; > > out_remove_thermal_handler: > @@ -319,3 +323,24 @@ int intel_pmic_install_opregion_handler(struct device *dev, acpi_handle handle, > return ret; > } > EXPORT_SYMBOL_GPL(intel_pmic_install_opregion_handler); > + Since this is exported, please add kernel-doc here. > +void intel_soc_pmic_exec_mipi_pmic_seq_element(const u8 *data) > +{ > + struct intel_pmic_opregion_data *d; > + > + if (!intel_pmic_opregion) { > + pr_warn("%s: No PMIC registered\n", __func__); > + return; Why not return error codes instead? Other ops in struct intel_pmic_opregion_data seem to do so. > + } > + > + d = intel_pmic_opregion->data; > + if (!d->exec_mipi_pmic_seq_element) { > + pr_warn("%s: Not implemented\n", __func__); > + return; Ditto. > + } > + > + mutex_lock(&intel_pmic_opregion->lock); > + d->exec_mipi_pmic_seq_element(intel_pmic_opregion->regmap, data); > + mutex_unlock(&intel_pmic_opregion->lock); > +} > +EXPORT_SYMBOL_GPL(intel_soc_pmic_exec_mipi_pmic_seq_element); > diff --git a/drivers/acpi/pmic/intel_pmic.h b/drivers/acpi/pmic/intel_pmic.h > index 095afc96952e..5a7bb33d046a 100644 > --- a/drivers/acpi/pmic/intel_pmic.h > +++ b/drivers/acpi/pmic/intel_pmic.h > @@ -15,6 +15,7 @@ struct intel_pmic_opregion_data { > int (*update_aux)(struct regmap *r, int reg, int raw_temp); > int (*get_policy)(struct regmap *r, int reg, int bit, u64 *value); > int (*update_policy)(struct regmap *r, int reg, int bit, int enable); > + void (*exec_mipi_pmic_seq_element)(struct regmap *r, const u8 *data); > struct pmic_table *power_table; > int power_table_count; > struct pmic_table *thermal_table; > diff --git a/include/linux/mfd/intel_soc_pmic.h b/include/linux/mfd/intel_soc_pmic.h > index ed1dfba5e5f9..ce04ad7d4b6c 100644 > --- a/include/linux/mfd/intel_soc_pmic.h > +++ b/include/linux/mfd/intel_soc_pmic.h > @@ -26,4 +26,6 @@ struct intel_soc_pmic { > struct device *dev; > }; > > +void intel_soc_pmic_exec_mipi_pmic_seq_element(const u8 *data); > + > #endif /* __INTEL_SOC_PMIC_H__ */ > -- > 2.19.2