layerscape: add ls1088ardb device support
[openwrt/staging/lynxis/omap.git] / target / linux / layerscape / patches-4.4 / 7216-dpaa2-evb-Fix-interrupt-handling.patch
1 From 4efb592d8a931669df5df04bedcae8cbc85c3700 Mon Sep 17 00:00:00 2001
2 From: Razvan Stefanescu <razvan.stefanescu@freescale.com>
3 Date: Wed, 17 Feb 2016 16:31:01 +0200
4 Subject: [PATCH 216/226] dpaa2-evb: Fix interrupt handling
5
6 Mask only the events handled by the driver - DPDMUX_IRQ_EVENT_LINK_CHANGED.
7
8 Use clear-on-read mechanism for the interrupt status and avoid calling
9 dpdmux_clear_irq_status(). Status contains the events handled (only link
10 state change for the moment) and masks the first 16-bits, as they are used
11 to store the interface ID that generated the event.
12
13 Signed-off-by: Razvan Stefanescu <razvan.stefanescu@freescale.com>
14 ---
15 drivers/staging/fsl-dpaa2/evb/evb.c | 20 ++++++++++----------
16 1 file changed, 10 insertions(+), 10 deletions(-)
17
18 --- a/drivers/staging/fsl-dpaa2/evb/evb.c
19 +++ b/drivers/staging/fsl-dpaa2/evb/evb.c
20 @@ -151,7 +151,9 @@ static irqreturn_t _evb_irq0_handler_thr
21 struct fsl_mc_io *io = priv->mc_io;
22 uint16_t token = priv->mux_handle;
23 int irq_index = DPDMUX_IRQ_INDEX_IF;
24 - uint32_t status = 0, clear = 0;
25 +
26 + /* Mask the events and the if_id reserved bits to be cleared on read */
27 + uint32_t status = DPDMUX_IRQ_EVENT_LINK_CHANGED | 0xFFFF0000;
28 int err;
29
30 /* Sanity check */
31 @@ -163,23 +165,21 @@ static irqreturn_t _evb_irq0_handler_thr
32 err = dpdmux_get_irq_status(io, 0, token, irq_index, &status);
33 if (unlikely(err)) {
34 netdev_err(netdev, "Can't get irq status (err %d)", err);
35 - clear = 0xffffffff;
36 + err = dpdmux_clear_irq_status(io, 0, token, irq_index,
37 + 0xFFFFFFFF);
38 + if (unlikely(err))
39 + netdev_err(netdev, "Can't clear irq status (err %d)",
40 + err);
41 goto out;
42 }
43
44 - /* FIXME clear irq status */
45 -
46 if (status & DPDMUX_IRQ_EVENT_LINK_CHANGED) {
47 - clear |= DPDMUX_IRQ_EVENT_LINK_CHANGED;
48 -
49 err = evb_links_state_update(priv);
50 if (unlikely(err))
51 goto out;
52 }
53 +
54 out:
55 - err = dpdmux_clear_irq_status(io, 0, token, irq_index, clear);
56 - if (unlikely(err))
57 - netdev_err(netdev, "Can't clear irq status (err %d)", err);
58 return IRQ_HANDLED;
59 }
60
61 @@ -191,7 +191,7 @@ static int evb_setup_irqs(struct fsl_mc_
62 int err = 0;
63 struct fsl_mc_device_irq *irq;
64 const int irq_index = DPDMUX_IRQ_INDEX_IF;
65 - uint32_t mask = ~0x0u; /* FIXME: unmask handled irqs */
66 + uint32_t mask = DPDMUX_IRQ_EVENT_LINK_CHANGED;
67
68 err = fsl_mc_allocate_irqs(evb_dev);
69 if (unlikely(err)) {