On Thu, Dec 06, 2018 at 02:47:04PM +0100, Hans de Goede wrote:
> Implement the exec_mipi_pmic_seq_element callback for the CHT Whiskey Cove
> PMIC.
> 
> On some CHT devices this fixes the LCD panel not lighting up when it was
> not initialized by the GOP, because an external monitor was plugged in and
> the GOP initialized only the external monitor.
> 
> Signed-off-by: Hans de Goede <hdego...@redhat.com>
> ---
> Changes in v2:
> -Interpret data passed to the PMIC MIPI elements according to the docs
>  instead of my own reverse engineered interpretation
> ---
>  drivers/acpi/pmic/intel_pmic_chtwc.c | 24 ++++++++++++++++++++++++
>  1 file changed, 24 insertions(+)
> 
> diff --git a/drivers/acpi/pmic/intel_pmic_chtwc.c 
> b/drivers/acpi/pmic/intel_pmic_chtwc.c
> index 078b0448f30a..049c0cf3b9ed 100644
> --- a/drivers/acpi/pmic/intel_pmic_chtwc.c
> +++ b/drivers/acpi/pmic/intel_pmic_chtwc.c
> @@ -12,6 +12,7 @@
>  #include <linux/mfd/intel_soc_pmic.h>
>  #include <linux/platform_device.h>
>  #include <linux/regmap.h>
> +#include <asm/unaligned.h>
>  #include "intel_pmic.h"
>  
>  #define CHT_WC_V1P05A_CTRL           0x6e3b
> @@ -231,6 +232,28 @@ static int intel_cht_wc_pmic_update_power(struct regmap 
> *regmap, int reg,
>       return regmap_update_bits(regmap, reg, bitmask, on ? 1 : 0);
>  }
>  
> +static void intel_cht_wc_exec_mipi_pmic_seq_element(struct regmap *regmap,
> +                                                 const u8 *data)
> +{
> +     u32 value, mask, reg_address, address;
> +     u16 i2c_client_address;
> +
> +     /* byte 0 aka PMIC Flag is reserved */
> +     i2c_client_address      = get_unaligned_le16(data + 1);
> +     reg_address             = get_unaligned_le32(data + 3);
> +     value                   = get_unaligned_le32(data + 7);
> +     mask                    = get_unaligned_le32(data + 11);
> +
> +     if (i2c_client_address > 255 || reg_address > 255) {
> +             pr_warn("%s warning addresses too big client 0x%x reg 0x%x\n",
> +                     __func__, i2c_client_address, reg_address);
> +             return;

Here also return an error code instead.

> +     }
> +
> +     address = (i2c_client_address << 8) | reg_address;
> +     regmap_update_bits(regmap, address, mask, value);
> +}
> +
>  /*
>   * The thermal table and ops are empty, we do not support the Thermal 
> opregion
>   * (DPTF) due to lacking documentation.
> @@ -238,6 +261,7 @@ static int intel_cht_wc_pmic_update_power(struct regmap 
> *regmap, int reg,
>  static struct intel_pmic_opregion_data intel_cht_wc_pmic_opregion_data = {
>       .get_power              = intel_cht_wc_pmic_get_power,
>       .update_power           = intel_cht_wc_pmic_update_power,
> +     .exec_mipi_pmic_seq_element = intel_cht_wc_exec_mipi_pmic_seq_element,
>       .power_table            = power_table,
>       .power_table_count      = ARRAY_SIZE(power_table),
>  };
> -- 
> 2.19.2
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to