[PATCH v2 2/3] ACPI / PMIC: Implement exec_mipi_pmic_seq_element for CHT Whiskey Cove PMIC
Hans de Goede
hdegoede at redhat.com
Wed Dec 12 14:02:34 UTC 2018
Hi,
On 07-12-18 12:40, Mika Westerberg wrote:
> 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 <hdegoede at 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.
Done for v3.
Regards,
Hans
>
>> + }
>> +
>> + 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
More information about the dri-devel
mailing list