Skip to content

Commit

Permalink
Merge branch 'fixes' into for-next
Browse files Browse the repository at this point in the history
Merge fixes into for-next to avoid int3472 and thinkpad_acpi conflicts
with upcoming changes.
  • Loading branch information
Ilpo Järvinen committed Feb 13, 2025
2 parents bd82090 + b3e127d commit 432c2ad
Show file tree
Hide file tree
Showing 5 changed files with 117 additions and 44 deletions.
2 changes: 1 addition & 1 deletion drivers/platform/x86/ideapad-laptop.c
Original file line number Diff line number Diff line change
Expand Up @@ -1121,7 +1121,7 @@ static int ideapad_dytc_profile_init(struct ideapad_private *priv)

/* Create platform_profile structure and register */
priv->dytc->ppdev = devm_platform_profile_register(&priv->platform_device->dev,
"ideapad-laptop", &priv->dytc,
"ideapad-laptop", priv->dytc,
&dytc_profile_ops);
if (IS_ERR(priv->dytc->ppdev)) {
err = PTR_ERR(priv->dytc->ppdev);
Expand Down
9 changes: 4 additions & 5 deletions drivers/platform/x86/intel/ifs/ifs.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,12 +23,14 @@
* IFS Image
* ---------
*
* Intel provides a firmware file containing the scan tests via
* github [#f1]_. Similar to microcode there is a separate file for each
* Intel provides firmware files containing the scan tests via the webpage [#f1]_.
* Look under "In-Field Scan Test Images Download" section towards the
* end of the page. Similar to microcode, there are separate files for each
* family-model-stepping. IFS Images are not applicable for some test types.
* Wherever applicable the sysfs directory would provide a "current_batch" file
* (see below) for loading the image.
*
* .. [#f1] https://intel.com/InFieldScan
*
* IFS Image Loading
* -----------------
Expand Down Expand Up @@ -125,9 +127,6 @@
* 2) Hardware allows for some number of cores to be tested in parallel.
* The driver does not make use of this, it only tests one core at a time.
*
* .. [#f1] https://github.com/intel/TBD
*
*
* Structural Based Functional Test at Field (SBAF):
* -------------------------------------------------
*
Expand Down
85 changes: 65 additions & 20 deletions drivers/platform/x86/intel/int3472/discrete.c
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
/* Author: Dan Scally <djrscally@gmail.com> */

#include <linux/acpi.h>
#include <linux/array_size.h>
#include <linux/bitfield.h>
#include <linux/device.h>
#include <linux/gpio/consumer.h>
Expand Down Expand Up @@ -55,7 +56,7 @@ static void skl_int3472_log_sensor_module_name(struct int3472_discrete_device *i

static int skl_int3472_fill_gpiod_lookup(struct gpiod_lookup *table_entry,
struct acpi_resource_gpio *agpio,
const char *func, u32 polarity)
const char *func, unsigned long gpio_flags)
{
char *path = agpio->resource_source.string_ptr;
struct acpi_device *adev;
Expand All @@ -70,14 +71,14 @@ static int skl_int3472_fill_gpiod_lookup(struct gpiod_lookup *table_entry,
if (!adev)
return -ENODEV;

*table_entry = GPIO_LOOKUP(acpi_dev_name(adev), agpio->pin_table[0], func, polarity);
*table_entry = GPIO_LOOKUP(acpi_dev_name(adev), agpio->pin_table[0], func, gpio_flags);

return 0;
}

static int skl_int3472_map_gpio_to_sensor(struct int3472_discrete_device *int3472,
struct acpi_resource_gpio *agpio,
const char *func, u32 polarity)
const char *func, unsigned long gpio_flags)
{
int ret;

Expand All @@ -87,7 +88,7 @@ static int skl_int3472_map_gpio_to_sensor(struct int3472_discrete_device *int347
}

ret = skl_int3472_fill_gpiod_lookup(&int3472->gpios.table[int3472->n_sensor_gpios],
agpio, func, polarity);
agpio, func, gpio_flags);
if (ret)
return ret;

Expand All @@ -100,7 +101,7 @@ static int skl_int3472_map_gpio_to_sensor(struct int3472_discrete_device *int347
static struct gpio_desc *
skl_int3472_gpiod_get_from_temp_lookup(struct int3472_discrete_device *int3472,
struct acpi_resource_gpio *agpio,
const char *func, u32 polarity)
const char *func, unsigned long gpio_flags)
{
struct gpio_desc *desc;
int ret;
Expand All @@ -111,7 +112,7 @@ skl_int3472_gpiod_get_from_temp_lookup(struct int3472_discrete_device *int3472,
return ERR_PTR(-ENOMEM);

lookup->dev_id = dev_name(int3472->dev);
ret = skl_int3472_fill_gpiod_lookup(&lookup->table[0], agpio, func, polarity);
ret = skl_int3472_fill_gpiod_lookup(&lookup->table[0], agpio, func, gpio_flags);
if (ret)
return ERR_PTR(ret);

Expand All @@ -122,32 +123,76 @@ skl_int3472_gpiod_get_from_temp_lookup(struct int3472_discrete_device *int3472,
return desc;
}

static void int3472_get_func_and_polarity(u8 type, const char **func, u32 *polarity)
/**
* struct int3472_gpio_map - Map GPIOs to whatever is expected by the
* sensor driver (as in DT bindings)
* @hid: The ACPI HID of the device without the instance number e.g. INT347E
* @type_from: The GPIO type from ACPI ?SDT
* @type_to: The assigned GPIO type, typically same as @type_from
* @func: The function, e.g. "enable"
* @polarity_low: GPIO_ACTIVE_LOW true if the @polarity_low is true,
* GPIO_ACTIVE_HIGH otherwise
*/
struct int3472_gpio_map {
const char *hid;
u8 type_from;
u8 type_to;
bool polarity_low;
const char *func;
};

static const struct int3472_gpio_map int3472_gpio_map[] = {
{ "INT347E", INT3472_GPIO_TYPE_RESET, INT3472_GPIO_TYPE_RESET, false, "enable" },
};

static void int3472_get_func_and_polarity(struct acpi_device *adev, u8 *type,
const char **func, unsigned long *gpio_flags)
{
switch (type) {
unsigned int i;

for (i = 0; i < ARRAY_SIZE(int3472_gpio_map); i++) {
/*
* Map the firmware-provided GPIO to whatever a driver expects
* (as in DT bindings). First check if the type matches with the
* GPIO map, then further check that the device _HID matches.
*/
if (*type != int3472_gpio_map[i].type_from)
continue;

if (!acpi_dev_hid_uid_match(adev, int3472_gpio_map[i].hid, NULL))
continue;

*type = int3472_gpio_map[i].type_to;
*gpio_flags = int3472_gpio_map[i].polarity_low ?
GPIO_ACTIVE_LOW : GPIO_ACTIVE_HIGH;
*func = int3472_gpio_map[i].func;
return;
}

switch (*type) {
case INT3472_GPIO_TYPE_RESET:
*func = "reset";
*polarity = GPIO_ACTIVE_LOW;
*gpio_flags = GPIO_ACTIVE_LOW;
break;
case INT3472_GPIO_TYPE_POWERDOWN:
*func = "powerdown";
*polarity = GPIO_ACTIVE_LOW;
*gpio_flags = GPIO_ACTIVE_LOW;
break;
case INT3472_GPIO_TYPE_CLK_ENABLE:
*func = "clk-enable";
*polarity = GPIO_ACTIVE_HIGH;
*gpio_flags = GPIO_ACTIVE_HIGH;
break;
case INT3472_GPIO_TYPE_PRIVACY_LED:
*func = "privacy-led";
*polarity = GPIO_ACTIVE_HIGH;
*gpio_flags = GPIO_ACTIVE_HIGH;
break;
case INT3472_GPIO_TYPE_POWER_ENABLE:
*func = "power-enable";
*polarity = GPIO_ACTIVE_HIGH;
*gpio_flags = GPIO_ACTIVE_HIGH;
break;
default:
*func = "unknown";
*polarity = GPIO_ACTIVE_HIGH;
*gpio_flags = GPIO_ACTIVE_HIGH;
break;
}
}
Expand Down Expand Up @@ -194,7 +239,7 @@ static int skl_int3472_handle_gpio_resources(struct acpi_resource *ares,
struct gpio_desc *gpio;
const char *err_msg;
const char *func;
u32 polarity;
unsigned long gpio_flags;
int ret;

if (!acpi_gpio_get_io_resource(ares, &agpio))
Expand All @@ -217,7 +262,7 @@ static int skl_int3472_handle_gpio_resources(struct acpi_resource *ares,

type = FIELD_GET(INT3472_GPIO_DSM_TYPE, obj->integer.value);

int3472_get_func_and_polarity(type, &func, &polarity);
int3472_get_func_and_polarity(int3472->sensor, &type, &func, &gpio_flags);

pin = FIELD_GET(INT3472_GPIO_DSM_PIN, obj->integer.value);
/* Pin field is not really used under Windows and wraps around at 8 bits */
Expand All @@ -227,24 +272,24 @@ static int skl_int3472_handle_gpio_resources(struct acpi_resource *ares,

active_value = FIELD_GET(INT3472_GPIO_DSM_SENSOR_ON_VAL, obj->integer.value);
if (!active_value)
polarity ^= GPIO_ACTIVE_LOW;
gpio_flags ^= GPIO_ACTIVE_LOW;

dev_dbg(int3472->dev, "%s %s pin %d active-%s\n", func,
agpio->resource_source.string_ptr, agpio->pin_table[0],
str_high_low(polarity == GPIO_ACTIVE_HIGH));
str_high_low(gpio_flags == GPIO_ACTIVE_HIGH));

switch (type) {
case INT3472_GPIO_TYPE_RESET:
case INT3472_GPIO_TYPE_POWERDOWN:
ret = skl_int3472_map_gpio_to_sensor(int3472, agpio, func, polarity);
ret = skl_int3472_map_gpio_to_sensor(int3472, agpio, func, gpio_flags);
if (ret)
err_msg = "Failed to map GPIO pin to sensor\n";

break;
case INT3472_GPIO_TYPE_CLK_ENABLE:
case INT3472_GPIO_TYPE_PRIVACY_LED:
case INT3472_GPIO_TYPE_POWER_ENABLE:
gpio = skl_int3472_gpiod_get_from_temp_lookup(int3472, agpio, func, polarity);
gpio = skl_int3472_gpiod_get_from_temp_lookup(int3472, agpio, func, gpio_flags);
if (IS_ERR(gpio)) {
ret = PTR_ERR(gpio);
err_msg = "Failed to get GPIO\n";
Expand Down
4 changes: 2 additions & 2 deletions drivers/platform/x86/intel/pmc/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -626,8 +626,8 @@ static u32 convert_ltr_scale(u32 val)
static int pmc_core_ltr_show(struct seq_file *s, void *unused)
{
struct pmc_dev *pmcdev = s->private;
u64 decoded_snoop_ltr, decoded_non_snoop_ltr;
u32 ltr_raw_data, scale, val;
u64 decoded_snoop_ltr, decoded_non_snoop_ltr, val;
u32 ltr_raw_data, scale;
u16 snoop_ltr, nonsnoop_ltr;
unsigned int i, index, ltr_index = 0;

Expand Down
Loading

0 comments on commit 432c2ad

Please sign in to comment.