diff options
-rw-r--r-- | drivers/char/ipmi/kcs_bmc_npcm7xx.c | 17 |
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 | */ |
52 | struct npcm7xx_kcs_reg { | 59 | struct 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 | ||
59 | struct npcm7xx_kcs_bmc { | 67 | struct npcm7xx_kcs_bmc { |
@@ -63,9 +71,9 @@ struct npcm7xx_kcs_bmc { | |||
63 | }; | 71 | }; |
64 | 72 | ||
65 | static const struct npcm7xx_kcs_reg npcm7xx_kcs_reg_tbl[KCS_CHANNEL_MAX] = { | 73 | static 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 | ||
71 | static u8 npcm7xx_kcs_inb(struct kcs_bmc *kcs_bmc, u32 reg) | 79 | static 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 | ||
100 | static irqreturn_t npcm7xx_kcs_irq(int irq, void *arg) | 111 | static irqreturn_t npcm7xx_kcs_irq(int irq, void *arg) |