drivers: espi: Add support for KBC status operations

In some systems, eSPI host perform operations directly over KBC HW
status.

Signed-off-by: Jose Alberto Meza <jose.a.meza.arellano@intel.com>
This commit is contained in:
Jose Alberto Meza 2020-05-20 17:29:37 -07:00 committed by Carles Cufí
commit a1b6dd51d0
2 changed files with 21 additions and 2 deletions

View file

@ -329,10 +329,13 @@ static int espi_xec_read_lpc_request(struct device *dev,
* automatically cleared after host reads * automatically cleared after host reads
* the data * the data
*/ */
*data = KBC_REGS->EC_KBC_STS & (1 << 0U) ? 1 : 0; *data = KBC_REGS->EC_KBC_STS & MCHP_KBC_STS_OBF ? 1 : 0;
break; break;
case E8042_IBF_HAS_CHAR: case E8042_IBF_HAS_CHAR:
*data = KBC_REGS->EC_KBC_STS & (1 << 1U) ? 1 : 0; *data = KBC_REGS->EC_KBC_STS & MCHP_KBC_STS_IBF ? 1 : 0;
break;
case E8042_READ_KB_STS:
*data = KBC_REGS->EC_KBC_STS;
break; break;
default: default:
return -EINVAL; return -EINVAL;
@ -376,6 +379,18 @@ static int espi_xec_write_lpc_request(struct device *dev,
case E8042_CLEAR_OBF: case E8042_CLEAR_OBF:
dummy = KBC_REGS->HOST_AUX_DATA; dummy = KBC_REGS->HOST_AUX_DATA;
break; break;
case E8042_SET_FLAG:
/* FW shouldn't modify these flags directly */
*data &= ~(MCHP_KBC_STS_OBF | MCHP_KBC_STS_IBF |
MCHP_KBC_STS_AUXOBF);
KBC_REGS->EC_KBC_STS |= *data;
break;
case E8042_CLEAR_FLAG:
/* FW shouldn't modify these flags directly */
*data |= (MCHP_KBC_STS_OBF | MCHP_KBC_STS_IBF |
MCHP_KBC_STS_AUXOBF);
KBC_REGS->EC_KBC_STS &= ~(*data);
break;
default: default:
return -EINVAL; return -EINVAL;
} }

View file

@ -219,6 +219,10 @@ enum lpc_peripheral_opcode {
E8042_RESUME_IRQ, E8042_RESUME_IRQ,
E8042_PAUSE_IRQ, E8042_PAUSE_IRQ,
E8042_CLEAR_OBF, E8042_CLEAR_OBF,
/* Status transactions */
E8042_READ_KB_STS,
E8042_SET_FLAG,
E8042_CLEAR_FLAG,
}; };
/** /**