summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJae Hyun Yoo <jae.hyun.yoo@intel.com>2021-08-13 01:40:54 +0300
committerJae Hyun Yoo <jae.hyun.yoo@linux.intel.com>2021-10-20 01:10:39 +0300
commitc2b347a07158a30215720ad0ab9f109e4b449189 (patch)
treec2f63aaf616458fff8100d2d10c481ee093cda08
parent66848473087df256b90a8ad9069e85b64b4dd14f (diff)
downloadlinux-c2b347a07158a30215720ad0ab9f109e4b449189.tar.xz
soc: aspeed: lpc-sio: add SMI event triggering support
Add SMI event triggering support. Signed-off-by: Jae Hyun Yoo <jae.hyun.yoo@intel.com> Change-Id: I711b5642a654e671a2d97d3079e3a1a055d400a0
-rw-r--r--drivers/soc/aspeed/aspeed-lpc-sio.c30
-rw-r--r--include/uapi/linux/aspeed-lpc-sio.h1
2 files changed, 31 insertions, 0 deletions
diff --git a/drivers/soc/aspeed/aspeed-lpc-sio.c b/drivers/soc/aspeed/aspeed-lpc-sio.c
index d4a4da112ff4..007f1c4ab7f3 100644
--- a/drivers/soc/aspeed/aspeed-lpc-sio.c
+++ b/drivers/soc/aspeed/aspeed-lpc-sio.c
@@ -47,6 +47,7 @@
#define LPC_ONCTL_EN_GPIO_OUTPUT BIT(13)
#define LPC_ONCTL_EN_GPIO_MODE BIT(12)
#define LPC_BMC_TRIG_WAKEUP_EVT BIT(6)
+#define LPC_BMC_TRIG_SMI_EVT_EN BIT(0)
#define AST_LPC_SWCR0F0C 0x0C
#define AST_LPC_SWCR1310 0x10
@@ -255,6 +256,34 @@ static void sio_set_bmc_sci_event(struct aspeed_lpc_sio *lpc_sio,
sio_data->data = sio_data->param;
}
+static void sio_set_bmc_smi_event(struct aspeed_lpc_sio *lpc_sio,
+ struct sio_ioctl_data *sio_data)
+{
+ u32 reg;
+
+ if (sio_data->param) {
+ reg = lpc_sio->reg_base + AST_LPC_SWCR0704;
+ regmap_write_bits(lpc_sio->regmap, reg,
+ LPC_BMC_TRIG_WAKEUP_EVT_EN,
+ LPC_BMC_TRIG_WAKEUP_EVT_EN);
+
+ reg = lpc_sio->reg_base + AST_LPC_SWCR0B08;
+ regmap_write_bits(lpc_sio->regmap, reg,
+ LPC_BMC_TRIG_SMI_EVT_EN,
+ LPC_BMC_TRIG_SMI_EVT_EN);
+ regmap_write_bits(lpc_sio->regmap, reg,
+ LPC_BMC_TRIG_WAKEUP_EVT,
+ LPC_BMC_TRIG_WAKEUP_EVT);
+ } else {
+ reg = lpc_sio->reg_base + AST_LPC_SWCR0300;
+ regmap_write_bits(lpc_sio->regmap, reg,
+ LPC_BMC_TRIG_WAKEUP_EVT_STS,
+ LPC_BMC_TRIG_WAKEUP_EVT_STS);
+ }
+
+ sio_data->data = sio_data->param;
+}
+
typedef void (*sio_cmd_fn) (struct aspeed_lpc_sio *sio_dev,
struct sio_ioctl_data *sio_data);
@@ -266,6 +295,7 @@ static sio_cmd_fn sio_cmd_handle[SIO_MAX_CMD] = {
[SIO_GET_PWRBTN_OVERRIDE] = sio_get_pwrbtn_override,
[SIO_GET_PFAIL_STATUS] = sio_get_pfail_status,
[SIO_SET_BMC_SCI_EVENT] = sio_set_bmc_sci_event,
+ [SIO_SET_BMC_SMI_EVENT] = sio_set_bmc_smi_event,
};
static long aspeed_lpc_sio_ioctl(struct file *file, unsigned int cmd,
diff --git a/include/uapi/linux/aspeed-lpc-sio.h b/include/uapi/linux/aspeed-lpc-sio.h
index acf89a7d2b4a..0a4ae34a8ed1 100644
--- a/include/uapi/linux/aspeed-lpc-sio.h
+++ b/include/uapi/linux/aspeed-lpc-sio.h
@@ -29,6 +29,7 @@ enum SIO_CMD {
SIO_GET_PWRBTN_OVERRIDE,
SIO_GET_PFAIL_STATUS, /* Start from AC Loss */
SIO_SET_BMC_SCI_EVENT,
+ SIO_SET_BMC_SMI_EVENT,
SIO_MAX_CMD
};