diff options
author | Jae Hyun Yoo <jae.hyun.yoo@intel.com> | 2021-08-13 01:40:54 +0300 |
---|---|---|
committer | Jae Hyun Yoo <jae.hyun.yoo@linux.intel.com> | 2021-10-20 01:10:39 +0300 |
commit | c2b347a07158a30215720ad0ab9f109e4b449189 (patch) | |
tree | c2f63aaf616458fff8100d2d10c481ee093cda08 | |
parent | 66848473087df256b90a8ad9069e85b64b4dd14f (diff) | |
download | linux-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.c | 30 | ||||
-rw-r--r-- | include/uapi/linux/aspeed-lpc-sio.h | 1 |
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 }; |