aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAvi Fishman <AviFishman70@gmail.com>2018-05-21 08:39:59 -0400
committerCorey Minyard <cminyard@mvista.com>2018-05-23 09:29:23 -0400
commit58aae18eb95ad95486bc98717c213ff48d94b98c (patch)
tree7180fe5792453531976d7281fbb22771ebb6f937
parentfe50a7d0393a552e4539da2d31261a59d6415950 (diff)
ipmi: NPCM7xx KCS BMC: enable interrupt to the host
Original kcs_bmc_npcm7xx.c was missing enabling to send interrupt to the host on writes to output buffer. This patch fixes it by setting the bits that enables the generation of IRQn events by hardware control based on the status of the OBF flag. Signed-off-by: Avi Fishman <AviFishman70@gmail.com> Reviewed-by: Haiyue Wang <haiyue.wang@linux.intel.com> Signed-off-by: Corey Minyard <cminyard@mvista.com>
-rw-r--r--drivers/char/ipmi/kcs_bmc_npcm7xx.c17
1 files changed, 14 insertions, 3 deletions
diff --git a/drivers/char/ipmi/kcs_bmc_npcm7xx.c b/drivers/char/ipmi/kcs_bmc_npcm7xx.c
index 7bc898c5d372..722f7391fe1f 100644
--- a/drivers/char/ipmi/kcs_bmc_npcm7xx.c
+++ b/drivers/char/ipmi/kcs_bmc_npcm7xx.c
@@ -39,6 +39,12 @@
39#define KCS3CTL 0x3C 39#define KCS3CTL 0x3C
40#define KCS_CTL_IBFIE BIT(0) 40#define KCS_CTL_IBFIE BIT(0)
41 41
42#define KCS1IE 0x1C
43#define KCS2IE 0x2E
44#define KCS3IE 0x40
45#define KCS_IE_IRQE BIT(0)
46#define KCS_IE_HIRQE BIT(3)
47
42/* 48/*
43 * 7.2.4 Core KCS Registers 49 * 7.2.4 Core KCS Registers
44 * Registers in this module are 8 bits. An 8-bit register must be accessed 50 * Registers in this module are 8 bits. An 8-bit register must be accessed
@@ -48,12 +54,14 @@
48 * dob: KCS Channel n Data Out Buffer Register (KCSnDO). 54 * dob: KCS Channel n Data Out Buffer Register (KCSnDO).
49 * dib: KCS Channel n Data In Buffer Register (KCSnDI). 55 * dib: KCS Channel n Data In Buffer Register (KCSnDI).
50 * ctl: KCS Channel n Control Register (KCSnCTL). 56 * ctl: KCS Channel n Control Register (KCSnCTL).
57 * ie : KCS Channel n Interrupt Enable Register (KCSnIE).
51 */ 58 */
52struct npcm7xx_kcs_reg { 59struct npcm7xx_kcs_reg {
53 u32 sts; 60 u32 sts;
54 u32 dob; 61 u32 dob;
55 u32 dib; 62 u32 dib;
56 u32 ctl; 63 u32 ctl;
64 u32 ie;
57}; 65};
58 66
59struct npcm7xx_kcs_bmc { 67struct npcm7xx_kcs_bmc {
@@ -63,9 +71,9 @@ struct npcm7xx_kcs_bmc {
63}; 71};
64 72
65static const struct npcm7xx_kcs_reg npcm7xx_kcs_reg_tbl[KCS_CHANNEL_MAX] = { 73static const struct npcm7xx_kcs_reg npcm7xx_kcs_reg_tbl[KCS_CHANNEL_MAX] = {
66 { .sts = KCS1ST, .dob = KCS1DO, .dib = KCS1DI, .ctl = KCS1CTL }, 74 { .sts = KCS1ST, .dob = KCS1DO, .dib = KCS1DI, .ctl = KCS1CTL, .ie = KCS1IE },
67 { .sts = KCS2ST, .dob = KCS2DO, .dib = KCS2DI, .ctl = KCS2CTL }, 75 { .sts = KCS2ST, .dob = KCS2DO, .dib = KCS2DI, .ctl = KCS2CTL, .ie = KCS2IE },
68 { .sts = KCS3ST, .dob = KCS3DO, .dib = KCS3DI, .ctl = KCS3CTL }, 76 { .sts = KCS3ST, .dob = KCS3DO, .dib = KCS3DI, .ctl = KCS3CTL, .ie = KCS3IE },
69}; 77};
70 78
71static u8 npcm7xx_kcs_inb(struct kcs_bmc *kcs_bmc, u32 reg) 79static u8 npcm7xx_kcs_inb(struct kcs_bmc *kcs_bmc, u32 reg)
@@ -95,6 +103,9 @@ static void npcm7xx_kcs_enable_channel(struct kcs_bmc *kcs_bmc, bool enable)
95 103
96 regmap_update_bits(priv->map, priv->reg->ctl, KCS_CTL_IBFIE, 104 regmap_update_bits(priv->map, priv->reg->ctl, KCS_CTL_IBFIE,
97 enable ? KCS_CTL_IBFIE : 0); 105 enable ? KCS_CTL_IBFIE : 0);
106
107 regmap_update_bits(priv->map, priv->reg->ie, KCS_IE_IRQE | KCS_IE_HIRQE,
108 enable ? KCS_IE_IRQE | KCS_IE_HIRQE : 0);
98} 109}
99 110
100static irqreturn_t npcm7xx_kcs_irq(int irq, void *arg) 111static irqreturn_t npcm7xx_kcs_irq(int irq, void *arg)