linux-acpi.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/2] acpi: intel-pmic: add support for REGS OpRegion
@ 2016-06-22 14:55 Heikki Krogerus
  2016-06-22 14:55 ` [PATCH 1/2] acpi: pmic: intel: add REGS operation region support Heikki Krogerus
  2016-06-22 14:55 ` [PATCH 2/2] acpi: pmic: intel: initialize result to 0 Heikki Krogerus
  0 siblings, 2 replies; 4+ messages in thread
From: Heikki Krogerus @ 2016-06-22 14:55 UTC (permalink / raw)
  To: Rafael J. Wysocki; +Cc: Felipe Balbi, Bin Gao, linux-acpi, linux-kernel

Hi Rafael,

There is a custom operation region for the WhiskeyCove PMIC device named REGS
used at least on some of the Broxton based platform which is missing support at
the moment. At least the USB Type-C PHY depends on this operation region.

Bin Gao had send patches [1] that add support for the Whiskey Cove
PMIC operation region, but that patch does not cover this particular
operation region.


[1] https://lkml.org/lkml/2016/6/13/674


Felipe Balbi (2):
  acpi: pmic: intel: add REGS operation region support
  acpi: pmic: intel: initialize result to 0

 drivers/acpi/pmic/intel_pmic.c | 67 +++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 66 insertions(+), 1 deletion(-)

-- 
2.8.1


^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH 1/2] acpi: pmic: intel: add REGS operation region support
  2016-06-22 14:55 [PATCH 0/2] acpi: intel-pmic: add support for REGS OpRegion Heikki Krogerus
@ 2016-06-22 14:55 ` Heikki Krogerus
  2016-06-22 14:55 ` [PATCH 2/2] acpi: pmic: intel: initialize result to 0 Heikki Krogerus
  1 sibling, 0 replies; 4+ messages in thread
From: Heikki Krogerus @ 2016-06-22 14:55 UTC (permalink / raw)
  To: Rafael J. Wysocki; +Cc: Felipe Balbi, Bin Gao, linux-acpi, linux-kernel

From: Felipe Balbi <felipe.balbi@linux.intel.com>

At least some of the Broxtons have a third custom OpRegion
named REGS. This adds handling for it.

Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com>
Signed-off-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
---
 drivers/acpi/pmic/intel_pmic.c | 67 +++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 66 insertions(+), 1 deletion(-)

diff --git a/drivers/acpi/pmic/intel_pmic.c b/drivers/acpi/pmic/intel_pmic.c
index bd772cd..3a3d416 100644
--- a/drivers/acpi/pmic/intel_pmic.c
+++ b/drivers/acpi/pmic/intel_pmic.c
@@ -21,12 +21,19 @@
 
 #define PMIC_POWER_OPREGION_ID		0x8d
 #define PMIC_THERMAL_OPREGION_ID	0x8c
+#define PMIC_REGS_OPREGION_ID		0x8f
+
+struct intel_pmic_regs_handler_ctx {
+	unsigned int val;
+	u16 addr;
+};
 
 struct intel_pmic_opregion {
 	struct mutex lock;
 	struct acpi_lpat_conversion_table *lpat_table;
 	struct regmap *regmap;
 	struct intel_pmic_opregion_data *data;
+	struct intel_pmic_regs_handler_ctx ctx;
 };
 
 static int pmic_get_reg_bit(int address, struct pmic_table *table,
@@ -203,6 +210,48 @@ static acpi_status intel_pmic_thermal_handler(u32 function,
 	return AE_OK;
 }
 
+static acpi_status intel_pmic_regs_handler(u32 function,
+		acpi_physical_address address, u32 bits, u64 *value64,
+		void *handler_context, void *region_context)
+{
+	struct intel_pmic_opregion *opregion = region_context;
+	int result;
+
+	switch (address) {
+	case 0:
+		return AE_OK;
+	case 1:
+		opregion->ctx.addr |= (*value64 & 0xff) << 8;
+		return AE_OK;
+	case 2:
+		opregion->ctx.addr |= *value64 & 0xff;
+		return AE_OK;
+	case 3:
+		opregion->ctx.val = *value64 & 0xff;
+		return AE_OK;
+	case 4:
+		if (*value64) {
+			result = regmap_write(opregion->regmap, opregion->ctx.addr,
+					      opregion->ctx.val);
+		} else {
+			result = regmap_read(opregion->regmap, opregion->ctx.addr,
+					     &opregion->ctx.val);
+			if (result == 0)
+				*value64 = opregion->ctx.val;
+		}
+		memset(&opregion->ctx, 0x00, sizeof(opregion->ctx));
+	}
+
+	if (result < 0) {
+		if (result == -EINVAL)
+			return AE_BAD_PARAMETER;
+		else
+			return AE_ERROR;
+	}
+
+	return AE_OK;
+}
+
 int intel_pmic_install_opregion_handler(struct device *dev, acpi_handle handle,
 					struct regmap *regmap,
 					struct intel_pmic_opregion_data *d)
@@ -242,12 +291,28 @@ int intel_pmic_install_opregion_handler(struct device *dev, acpi_handle handle,
 		acpi_remove_address_space_handler(handle, PMIC_POWER_OPREGION_ID,
 						  intel_pmic_power_handler);
 		ret = -ENODEV;
-		goto out_error;
+		goto out_remove_power_handler;
+	}
+
+	status = acpi_install_address_space_handler(handle,
+			PMIC_REGS_OPREGION_ID, intel_pmic_regs_handler, NULL,
+			opregion);
+	if (ACPI_FAILURE(status)) {
+		ret = -ENODEV;
+		goto out_remove_thermal_handler;
 	}
 
 	opregion->data = d;
 	return 0;
 
+out_remove_thermal_handler:
+	acpi_remove_address_space_handler(handle, PMIC_THERMAL_OPREGION_ID,
+					  intel_pmic_thermal_handler);
+
+out_remove_power_handler:
+	acpi_remove_address_space_handler(handle, PMIC_POWER_OPREGION_ID,
+					  intel_pmic_power_handler);
+
 out_error:
 	acpi_lpat_free_conversion_table(opregion->lpat_table);
 	return ret;
-- 
2.8.1

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH 2/2] acpi: pmic: intel: initialize result to 0
  2016-06-22 14:55 [PATCH 0/2] acpi: intel-pmic: add support for REGS OpRegion Heikki Krogerus
  2016-06-22 14:55 ` [PATCH 1/2] acpi: pmic: intel: add REGS operation region support Heikki Krogerus
@ 2016-06-22 14:55 ` Heikki Krogerus
  2016-06-25  0:25   ` Rafael J. Wysocki
  1 sibling, 1 reply; 4+ messages in thread
From: Heikki Krogerus @ 2016-06-22 14:55 UTC (permalink / raw)
  To: Rafael J. Wysocki; +Cc: Felipe Balbi, Bin Gao, linux-acpi, linux-kernel

From: Felipe Balbi <felipe.balbi@linux.intel.com>

Fixes compiler warning.

Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com>
Signed-off-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
---
 drivers/acpi/pmic/intel_pmic.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/acpi/pmic/intel_pmic.c b/drivers/acpi/pmic/intel_pmic.c
index 3a3d416..1742718 100644
--- a/drivers/acpi/pmic/intel_pmic.c
+++ b/drivers/acpi/pmic/intel_pmic.c
@@ -215,7 +215,7 @@ static acpi_status intel_pmic_regs_handler(u32 function,
 		void *handler_context, void *region_context)
 {
 	struct intel_pmic_opregion *opregion = region_context;
-	int result;
+	int result = 0;
 
 	switch (address) {
 	case 0:
-- 
2.8.1

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH 2/2] acpi: pmic: intel: initialize result to 0
  2016-06-22 14:55 ` [PATCH 2/2] acpi: pmic: intel: initialize result to 0 Heikki Krogerus
@ 2016-06-25  0:25   ` Rafael J. Wysocki
  0 siblings, 0 replies; 4+ messages in thread
From: Rafael J. Wysocki @ 2016-06-25  0:25 UTC (permalink / raw)
  To: Heikki Krogerus; +Cc: Felipe Balbi, Bin Gao, linux-acpi, linux-kernel

On Wednesday, June 22, 2016 05:55:40 PM Heikki Krogerus wrote:
> From: Felipe Balbi <felipe.balbi@linux.intel.com>
> 
> Fixes compiler warning.
> 
> Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com>
> Signed-off-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
> ---
>  drivers/acpi/pmic/intel_pmic.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/drivers/acpi/pmic/intel_pmic.c b/drivers/acpi/pmic/intel_pmic.c
> index 3a3d416..1742718 100644
> --- a/drivers/acpi/pmic/intel_pmic.c
> +++ b/drivers/acpi/pmic/intel_pmic.c
> @@ -215,7 +215,7 @@ static acpi_status intel_pmic_regs_handler(u32 function,
>  		void *handler_context, void *region_context)
>  {
>  	struct intel_pmic_opregion *opregion = region_context;
> -	int result;
> +	int result = 0;
>  
>  	switch (address) {
>  	case 0:

Applied, thanks!

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2016-06-25  0:25 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-06-22 14:55 [PATCH 0/2] acpi: intel-pmic: add support for REGS OpRegion Heikki Krogerus
2016-06-22 14:55 ` [PATCH 1/2] acpi: pmic: intel: add REGS operation region support Heikki Krogerus
2016-06-22 14:55 ` [PATCH 2/2] acpi: pmic: intel: initialize result to 0 Heikki Krogerus
2016-06-25  0:25   ` Rafael J. Wysocki

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).