pinctrl: intel: Make offset to interrupt status register configurable
Some GPIO blocks have the interrupt status (GPI_IS) offset different than it normally is, so make it configurable. If no offset is specified we use the default. While there remove two unused constants from the core driver. Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
This commit is contained in:
Родитель
1396007286
Коммит
cf769bd86b
|
@ -30,8 +30,6 @@
|
||||||
|
|
||||||
#define PADBAR 0x00c
|
#define PADBAR 0x00c
|
||||||
#define GPI_IS 0x100
|
#define GPI_IS 0x100
|
||||||
#define GPI_GPE_STS 0x140
|
|
||||||
#define GPI_GPE_EN 0x160
|
|
||||||
|
|
||||||
#define PADOWN_BITS 4
|
#define PADOWN_BITS 4
|
||||||
#define PADOWN_SHIFT(p) ((p) % 8 * PADOWN_BITS)
|
#define PADOWN_SHIFT(p) ((p) % 8 * PADOWN_BITS)
|
||||||
|
@ -818,7 +816,7 @@ static void intel_gpio_irq_ack(struct irq_data *d)
|
||||||
community = intel_get_community(pctrl, pin);
|
community = intel_get_community(pctrl, pin);
|
||||||
if (community) {
|
if (community) {
|
||||||
const struct intel_padgroup *padgrp;
|
const struct intel_padgroup *padgrp;
|
||||||
unsigned gpp, gpp_offset;
|
unsigned gpp, gpp_offset, is_offset;
|
||||||
|
|
||||||
padgrp = intel_community_get_padgroup(community, pin);
|
padgrp = intel_community_get_padgroup(community, pin);
|
||||||
if (!padgrp)
|
if (!padgrp)
|
||||||
|
@ -826,9 +824,10 @@ static void intel_gpio_irq_ack(struct irq_data *d)
|
||||||
|
|
||||||
gpp = padgrp->reg_num;
|
gpp = padgrp->reg_num;
|
||||||
gpp_offset = padgroup_offset(padgrp, pin);
|
gpp_offset = padgroup_offset(padgrp, pin);
|
||||||
|
is_offset = community->is_offset + gpp * 4;
|
||||||
|
|
||||||
raw_spin_lock(&pctrl->lock);
|
raw_spin_lock(&pctrl->lock);
|
||||||
writel(BIT(gpp_offset), community->regs + GPI_IS + gpp * 4);
|
writel(BIT(gpp_offset), community->regs + is_offset);
|
||||||
raw_spin_unlock(&pctrl->lock);
|
raw_spin_unlock(&pctrl->lock);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -843,7 +842,7 @@ static void intel_gpio_irq_enable(struct irq_data *d)
|
||||||
community = intel_get_community(pctrl, pin);
|
community = intel_get_community(pctrl, pin);
|
||||||
if (community) {
|
if (community) {
|
||||||
const struct intel_padgroup *padgrp;
|
const struct intel_padgroup *padgrp;
|
||||||
unsigned gpp, gpp_offset;
|
unsigned gpp, gpp_offset, is_offset;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
u32 value;
|
u32 value;
|
||||||
|
|
||||||
|
@ -853,10 +852,11 @@ static void intel_gpio_irq_enable(struct irq_data *d)
|
||||||
|
|
||||||
gpp = padgrp->reg_num;
|
gpp = padgrp->reg_num;
|
||||||
gpp_offset = padgroup_offset(padgrp, pin);
|
gpp_offset = padgroup_offset(padgrp, pin);
|
||||||
|
is_offset = community->is_offset + gpp * 4;
|
||||||
|
|
||||||
raw_spin_lock_irqsave(&pctrl->lock, flags);
|
raw_spin_lock_irqsave(&pctrl->lock, flags);
|
||||||
/* Clear interrupt status first to avoid unexpected interrupt */
|
/* Clear interrupt status first to avoid unexpected interrupt */
|
||||||
writel(BIT(gpp_offset), community->regs + GPI_IS + gpp * 4);
|
writel(BIT(gpp_offset), community->regs + is_offset);
|
||||||
|
|
||||||
value = readl(community->regs + community->ie_offset + gpp * 4);
|
value = readl(community->regs + community->ie_offset + gpp * 4);
|
||||||
value |= BIT(gpp_offset);
|
value |= BIT(gpp_offset);
|
||||||
|
@ -991,7 +991,8 @@ static irqreturn_t intel_gpio_community_irq_handler(struct intel_pinctrl *pctrl,
|
||||||
const struct intel_padgroup *padgrp = &community->gpps[gpp];
|
const struct intel_padgroup *padgrp = &community->gpps[gpp];
|
||||||
unsigned long pending, enabled, gpp_offset;
|
unsigned long pending, enabled, gpp_offset;
|
||||||
|
|
||||||
pending = readl(community->regs + GPI_IS + padgrp->reg_num * 4);
|
pending = readl(community->regs + community->is_offset +
|
||||||
|
padgrp->reg_num * 4);
|
||||||
enabled = readl(community->regs + community->ie_offset +
|
enabled = readl(community->regs + community->ie_offset +
|
||||||
padgrp->reg_num * 4);
|
padgrp->reg_num * 4);
|
||||||
|
|
||||||
|
@ -1241,6 +1242,9 @@ int intel_pinctrl_probe(struct platform_device *pdev,
|
||||||
community->regs = regs;
|
community->regs = regs;
|
||||||
community->pad_regs = regs + padbar;
|
community->pad_regs = regs + padbar;
|
||||||
|
|
||||||
|
if (!community->is_offset)
|
||||||
|
community->is_offset = GPI_IS;
|
||||||
|
|
||||||
ret = intel_pinctrl_add_padgroups(pctrl, community);
|
ret = intel_pinctrl_add_padgroups(pctrl, community);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -1356,7 +1360,7 @@ static void intel_gpio_irq_init(struct intel_pinctrl *pctrl)
|
||||||
for (gpp = 0; gpp < community->ngpps; gpp++) {
|
for (gpp = 0; gpp < community->ngpps; gpp++) {
|
||||||
/* Mask and clear all interrupts */
|
/* Mask and clear all interrupts */
|
||||||
writel(0, base + community->ie_offset + gpp * 4);
|
writel(0, base + community->ie_offset + gpp * 4);
|
||||||
writel(0xffff, base + GPI_IS + gpp * 4);
|
writel(0xffff, base + community->is_offset + gpp * 4);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -73,6 +73,8 @@ struct intel_padgroup {
|
||||||
* @hostown_offset: Register offset of HOSTSW_OWN from @regs. If %0 then it
|
* @hostown_offset: Register offset of HOSTSW_OWN from @regs. If %0 then it
|
||||||
* is assumed that the host owns the pin (rather than
|
* is assumed that the host owns the pin (rather than
|
||||||
* ACPI).
|
* ACPI).
|
||||||
|
* @is_offset: Register offset of GPI_IS from @regs. If %0 then uses the
|
||||||
|
* default (%0x100).
|
||||||
* @ie_offset: Register offset of GPI_IE from @regs.
|
* @ie_offset: Register offset of GPI_IE from @regs.
|
||||||
* @pin_base: Starting pin of pins in this community
|
* @pin_base: Starting pin of pins in this community
|
||||||
* @gpp_size: Maximum number of pads in each group, such as PADCFGLOCK,
|
* @gpp_size: Maximum number of pads in each group, such as PADCFGLOCK,
|
||||||
|
@ -98,6 +100,7 @@ struct intel_community {
|
||||||
unsigned padown_offset;
|
unsigned padown_offset;
|
||||||
unsigned padcfglock_offset;
|
unsigned padcfglock_offset;
|
||||||
unsigned hostown_offset;
|
unsigned hostown_offset;
|
||||||
|
unsigned is_offset;
|
||||||
unsigned ie_offset;
|
unsigned ie_offset;
|
||||||
unsigned pin_base;
|
unsigned pin_base;
|
||||||
unsigned gpp_size;
|
unsigned gpp_size;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче