Pin control fixes for the v4.19 kernel cycle:
- A complicated IRQ fix for the MSM driver (see commit). - Fix the group/function check in the Ingenic driver. - Deal with a possible NULL pointer dereference in the Madera driver. -----BEGIN PGP SIGNATURE----- iQIcBAABAgAGBQJbmlOCAAoJEEEQszewGV1zXTAP+gLLyF9Txaa4t65wGYnbafoi 6DgGHOCvgxvro8M1vlWViDLmGdHGvMqSA0kHdpur5H+91tHIsHFTvZwiUtOQrwiG nNJVK+ijNPLnVQNALqFbxasDCLs3FPQU+8KsQfQ/L4K3hz848+B/3Rqb/zxur/rY miGPgivvXqdKr//o+lh9ekK+xrc9Je1PMUoRbXaZWBVMNqRB38NnRpkcFmTnfYUS VGn6gXhJ33pajQCQOJLXppRP0z7hN5L1g8W2JOmZucZdRZjTVRxv99dUiFLxneEX r9mvAS4W0pQLZOSsmOFCc/R64W3Znr8sQaJjlH6La76zazNCE8wGYhOgFnfQgHoH z08WRSdd34xXGjzI0ipOHS0NdvM2V8tQQTSAzlE8qc5ItNSbyAmmHCrj9iodAQ7F B1N4/YQTfly8vlnO8jRWF1E3AJ6zcwLu8Irh4MiBqUPxSF9SsQvDJIoQsD0HpsT3 bWl6dUmr96NhVwzuatITIfX8NHhR3YPTWgSir4ri4ybRuLTrA0iOH8UBfdegL0gM xLfAAQt1VjU4ZN2s9b+IzXjsB0N/TPCbxDFlLOGgxn1/hdU4e8+2oD6R9Ba98jLx e2DQ9D8raJo76069yQ0wzu92zFj5oEY71praWA3hDBa+HOzgx9xeryb9WHEzuYkR iCjRSnCUO3Mbf6EukIy3 =g3Rc -----END PGP SIGNATURE----- Merge tag 'pinctrl-v4.19-2' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-pinctrl Pull pin control fixes from Linus Walleij: - A complicated IRQ fix for the MSM driver (see commit) - Fix the group/function check in the Ingenic driver - Deal with a possible NULL pointer dereference in the Madera driver * tag 'pinctrl-v4.19-2' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-pinctrl: pinctrl: madera: Fix possible NULL pointer with pdata config pinctrl: ingenic: Fix group & function error checking pinctrl: msm: Really mask level interrupts to prevent latching
This commit is contained in:
Коммит
bd5bca1381
|
@ -1040,7 +1040,7 @@ static int madera_pin_probe(struct platform_device *pdev)
|
|||
}
|
||||
|
||||
/* if the configuration is provided through pdata, apply it */
|
||||
if (pdata) {
|
||||
if (pdata && pdata->gpio_configs) {
|
||||
ret = pinctrl_register_mappings(pdata->gpio_configs,
|
||||
pdata->n_gpio_configs);
|
||||
if (ret) {
|
||||
|
|
|
@ -793,7 +793,7 @@ static int ingenic_pinctrl_probe(struct platform_device *pdev)
|
|||
|
||||
err = pinctrl_generic_add_group(jzpc->pctl, group->name,
|
||||
group->pins, group->num_pins, group->data);
|
||||
if (err) {
|
||||
if (err < 0) {
|
||||
dev_err(dev, "Failed to register group %s\n",
|
||||
group->name);
|
||||
return err;
|
||||
|
@ -806,7 +806,7 @@ static int ingenic_pinctrl_probe(struct platform_device *pdev)
|
|||
err = pinmux_generic_add_function(jzpc->pctl, func->name,
|
||||
func->group_names, func->num_group_names,
|
||||
func->data);
|
||||
if (err) {
|
||||
if (err < 0) {
|
||||
dev_err(dev, "Failed to register function %s\n",
|
||||
func->name);
|
||||
return err;
|
||||
|
|
|
@ -634,6 +634,29 @@ static void msm_gpio_irq_mask(struct irq_data *d)
|
|||
raw_spin_lock_irqsave(&pctrl->lock, flags);
|
||||
|
||||
val = readl(pctrl->regs + g->intr_cfg_reg);
|
||||
/*
|
||||
* There are two bits that control interrupt forwarding to the CPU. The
|
||||
* RAW_STATUS_EN bit causes the level or edge sensed on the line to be
|
||||
* latched into the interrupt status register when the hardware detects
|
||||
* an irq that it's configured for (either edge for edge type or level
|
||||
* for level type irq). The 'non-raw' status enable bit causes the
|
||||
* hardware to assert the summary interrupt to the CPU if the latched
|
||||
* status bit is set. There's a bug though, the edge detection logic
|
||||
* seems to have a problem where toggling the RAW_STATUS_EN bit may
|
||||
* cause the status bit to latch spuriously when there isn't any edge
|
||||
* so we can't touch that bit for edge type irqs and we have to keep
|
||||
* the bit set anyway so that edges are latched while the line is masked.
|
||||
*
|
||||
* To make matters more complicated, leaving the RAW_STATUS_EN bit
|
||||
* enabled all the time causes level interrupts to re-latch into the
|
||||
* status register because the level is still present on the line after
|
||||
* we ack it. We clear the raw status enable bit during mask here and
|
||||
* set the bit on unmask so the interrupt can't latch into the hardware
|
||||
* while it's masked.
|
||||
*/
|
||||
if (irqd_get_trigger_type(d) & IRQ_TYPE_LEVEL_MASK)
|
||||
val &= ~BIT(g->intr_raw_status_bit);
|
||||
|
||||
val &= ~BIT(g->intr_enable_bit);
|
||||
writel(val, pctrl->regs + g->intr_cfg_reg);
|
||||
|
||||
|
@ -655,6 +678,7 @@ static void msm_gpio_irq_unmask(struct irq_data *d)
|
|||
raw_spin_lock_irqsave(&pctrl->lock, flags);
|
||||
|
||||
val = readl(pctrl->regs + g->intr_cfg_reg);
|
||||
val |= BIT(g->intr_raw_status_bit);
|
||||
val |= BIT(g->intr_enable_bit);
|
||||
writel(val, pctrl->regs + g->intr_cfg_reg);
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче