<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
{font-family:Consolas;
panose-1:2 11 6 9 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0cm;
margin-bottom:.0001pt;
font-size:11.0pt;
font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
{mso-style-priority:99;
color:blue;
text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
{mso-style-priority:99;
color:purple;
text-decoration:underline;}
pre
{mso-style-priority:99;
mso-style-link:"HTML Vorformatiert Zchn";
margin:0cm;
margin-bottom:.0001pt;
font-size:10.0pt;
font-family:"Courier New";}
p.msonormal0, li.msonormal0, div.msonormal0
{mso-style-name:msonormal;
mso-margin-top-alt:auto;
margin-right:0cm;
mso-margin-bottom-alt:auto;
margin-left:0cm;
font-size:11.0pt;
font-family:"Calibri",sans-serif;}
span.HTMLVorformatiertZchn
{mso-style-name:"HTML Vorformatiert Zchn";
mso-style-priority:99;
mso-style-link:"HTML Vorformatiert";
font-family:Consolas;}
span.E-MailFormatvorlage21
{mso-style-type:personal-reply;
font-family:"Calibri",sans-serif;
color:windowtext;}
.MsoChpDefault
{mso-style-type:export-only;
font-size:10.0pt;}
@page WordSection1
{size:612.0pt 792.0pt;
margin:70.85pt 70.85pt 2.0cm 70.85pt;}
div.WordSection1
{page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="DE" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">Hi Daniel,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="mso-fareast-language:EN-US">As far as I understand the code the bus sets the “info.irq” to the pirq value from the PnP information of the devices.<o:p></o:p></span></p>
<pre><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif;mso-fareast-language:EN-US">Then the</span><span lang="EN-US" style="font-family:"Calibri",sans-serif;mso-fareast-language:EN-US"> “</span><span lang="EN-US">drvmgr_interrupt_register(priv->dev, irq, "grgpio", isr, arg) </span><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif;mso-fareast-language:EN-US">)“ will register the isr with “irq” as an offset of pirq.<o:p></o:p></span></pre>
<pre><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif;mso-fareast-language:EN-US">So, for devices with GENIRQ == 0, this should yield the behavior you describe with one irq per GPIO line (with pirq as the first interrupt line).<o:p></o:p></span></pre>
<pre><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif;mso-fareast-language:EN-US">For devices with GENIRQ == 1 a shared ISR for pirq is registered.<o:p></o:p></span></pre>
<pre><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif;mso-fareast-language:EN-US"><o:p> </o:p></span></pre>
<pre><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif;mso-fareast-language:EN-US">In our test setup (with grpio with GENIRQ == 1) the grgpio devices with interrupts have info.irq set to pirq (e.g. 0x15 in our setup) and for the grgpio without interrupt support it is set to 0.<o:p></o:p></span></pre>
<pre><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif;mso-fareast-language:EN-US">I don’t have a GR712RC for testing, so I don’t know if it behaves differently.<o:p></o:p></span></pre>
<pre><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif;mso-fareast-language:EN-US"><o:p> </o:p></span></pre>
<pre><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif;mso-fareast-language:EN-US">Best regards,<o:p></o:p></span></pre>
<pre><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif;mso-fareast-language:EN-US"><o:p> </o:p></span></pre>
<pre><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif;mso-fareast-language:EN-US"> Jan<o:p></o:p></span></pre>
<p class="MsoNormal"><span lang="EN-US" style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<div style="border:none;border-left:solid blue 1.5pt;padding:0cm 0cm 0cm 4.0pt">
<div>
<div style="border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0cm 0cm 0cm">
<p class="MsoNormal"><b>From:</b> Daniel Hellstrom <daniel@gaisler.com> <br>
<b>Sent:</b> Thursday, August 26, 2021 3:11 PM<br>
<b>To:</b> Sommer, Jan <Jan.Sommer@dlr.de>; devel@rtems.org<br>
<b>Cc:</b> software@gaisler.com<br>
<b>Subject:</b> Re: [PATCH v1 1/1] gpiolib/grgpio: Add support for newer grgpio features<o:p></o:p></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<p>Hi Jan,<o:p></o:p></p>
<p>I haven't tested the code, but it seems to be that the ordinary case when GPIO[N] is connected to Interrupt[N] will not work? The fixup makes GPIO[N] pin be associated with interrupt[0] (which is not available) and GPIO[1] with Interrupt[1] and so one which
is the case with U699/UT700/GR712RC. I believe it is the bus-driver's role to initialize the device structure to indicate the device's all interrupts (the first interrupt in the ambapp_bus case), and the driver's role to select which interrupt of the available.
I'm worrying that leaving "info.irq = -1" will disable all interrupts from that GPIO core?<o:p></o:p></p>
<p>Kind Regards,<br>
Daniel<o:p></o:p></p>
<div>
<pre><o:p> </o:p></pre>
<pre> <o:p></o:p></pre>
</div>
<div>
<p class="MsoNormal">On 2021-08-25 10:13, <a href="mailto:Jan.Sommer@dlr.de">Jan.Sommer@dlr.de</a> wrote:<o:p></o:p></p>
</div>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<pre>Does anyone have any objections to this?<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>See also <a href="https://lists.rtems.org/pipermail/devel/2021-July/068086.html">https://lists.rtems.org/pipermail/devel/2021-July/068086.html</a> for the cover letter.<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>Best regards,<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre> Jan<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<pre>-----Original Message-----<o:p></o:p></pre>
<pre>From: Sommer, Jan<o:p></o:p></pre>
<pre>Sent: Thursday, July 1, 2021 5:44 PM<o:p></o:p></pre>
<pre>To: <a href="mailto:devel@rtems.org">devel@rtems.org</a><o:p></o:p></pre>
<pre>Cc: <a href="mailto:software@gaisler.com">software@gaisler.com</a>; Sommer, Jan <a href="mailto:Jan.Sommer@dlr.de"><Jan.Sommer@dlr.de></a><o:p></o:p></pre>
<pre>Subject: [PATCH v1 1/1] gpiolib/grgpio: Add support for newer grgpio<o:p></o:p></pre>
<pre>features<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>- Use proper typedef for isr (avoid warning in user application)<o:p></o:p></pre>
<pre>- Use set input enable register together with pin direction<o:p></o:p></pre>
<pre>- Support irqgen == 1 mode if present in capabilities register<o:p></o:p></pre>
<pre>---<o:p></o:p></pre>
<pre> bsps/include/grlib/gpiolib.h | 7 +++++--<o:p></o:p></pre>
<pre> bsps/include/grlib/grlib.h | 4 +++-<o:p></o:p></pre>
<pre> bsps/shared/grlib/drvmgr/ambapp_bus.c | 5 +----<o:p></o:p></pre>
<pre> bsps/shared/grlib/gpio/gpiolib.c | 2 +-<o:p></o:p></pre>
<pre> bsps/shared/grlib/gpio/grgpio.c | 22 ++++++++++++++++------<o:p></o:p></pre>
<pre> 5 files changed, 26 insertions(+), 14 deletions(-)<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>diff --git a/bsps/include/grlib/gpiolib.h b/bsps/include/grlib/gpiolib.h index<o:p></o:p></pre>
<pre>f82d4fa2c2..37ac140862 100644<o:p></o:p></pre>
<pre>--- a/bsps/include/grlib/gpiolib.h<o:p></o:p></pre>
<pre>+++ b/bsps/include/grlib/gpiolib.h<o:p></o:p></pre>
<pre>@@ -28,6 +28,9 @@ struct gpiolib_config { #define GPIOLIB_IRQ_POL_LOW<o:p></o:p></pre>
<pre>0 #define GPIOLIB_IRQ_POL_HIGH 1<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>+/* Interrupt Service Routine (ISR) */<o:p></o:p></pre>
<pre>+typedef void (*gpiolib_isr)(void *arg);<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre> /* Libarary initialize function must be called befor any other */ extern int<o:p></o:p></pre>
<pre>gpiolib_initialize(void);<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>@@ -54,7 +57,7 @@ extern int gpiolib_irq_disable(void *handle); extern int<o:p></o:p></pre>
<pre>gpiolib_irq_mask(void *handle); extern int gpiolib_irq_unmask(void<o:p></o:p></pre>
<pre>*handle); extern int gpiolib_irq_force(void *handle); -extern int<o:p></o:p></pre>
<pre>gpiolib_irq_register(void *handle, void *func, void *arg);<o:p></o:p></pre>
<pre>+extern int gpiolib_irq_register(void *handle, gpiolib_isr func, void<o:p></o:p></pre>
<pre>+*arg);<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre> /*** Driver Interface ***/<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>@@ -66,7 +69,7 @@ struct gpiolib_drv_ops {<o:p></o:p></pre>
<pre> int (*config)(void *handle, struct gpiolib_config *cfg);<o:p></o:p></pre>
<pre> int (*get)(void *handle, int *val);<o:p></o:p></pre>
<pre> int (*irq_opts)(void *handle, unsigned int options);<o:p></o:p></pre>
<pre>- int (*irq_register)(void *handle, void *func, void *arg);<o:p></o:p></pre>
<pre>+ int (*irq_register)(void *handle, gpiolib_isr func, void<o:p></o:p></pre>
<pre>*arg);<o:p></o:p></pre>
<pre> int (*open)(void *handle);<o:p></o:p></pre>
<pre> int (*set)(void *handle, int dir, int outval);<o:p></o:p></pre>
<pre> int (*show)(void *handle);<o:p></o:p></pre>
<pre>diff --git a/bsps/include/grlib/grlib.h b/bsps/include/grlib/grlib.h index<o:p></o:p></pre>
<pre>49d9999807..4aa3e9df4a 100644<o:p></o:p></pre>
<pre>--- a/bsps/include/grlib/grlib.h<o:p></o:p></pre>
<pre>+++ b/bsps/include/grlib/grlib.h<o:p></o:p></pre>
<pre>@@ -17,6 +17,7 @@<o:p></o:p></pre>
<pre> #define __GRLIB_H__<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre> #include <stdbool.h><o:p></o:p></pre>
<pre>+#include <bsp/utility.h><o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre> #ifdef __cplusplus<o:p></o:p></pre>
<pre> extern "C" {<o:p></o:p></pre>
<pre>@@ -125,6 +126,7 @@ struct grgpio_regs {<o:p></o:p></pre>
<pre> volatile unsigned int iedge; /* 0x14 Interrupt edge register */<o:p></o:p></pre>
<pre> volatile unsigned int bypass; /* 0x18 Bypass register */<o:p></o:p></pre>
<pre> volatile unsigned int cap; /* 0x1C Capability register */<o:p></o:p></pre>
<pre>+#define GRGPIO_CAP_IRQGEN(reg) BSP_FLD32GET(reg, 8, 12)<o:p></o:p></pre>
<pre> volatile unsigned int irqmap[4]; /* 0x20 - 0x2C Interrupt map registers */<o:p></o:p></pre>
<pre> volatile unsigned int res_30; /* 0x30 Reserved */<o:p></o:p></pre>
<pre> volatile unsigned int res_34; /* 0x34 Reserved */<o:p></o:p></pre>
<pre>@@ -132,7 +134,7 @@ struct grgpio_regs {<o:p></o:p></pre>
<pre> volatile unsigned int res_3C; /* 0x3C Reserved */<o:p></o:p></pre>
<pre> volatile unsigned int iavail; /* 0x40 Interrupt available register */<o:p></o:p></pre>
<pre> volatile unsigned int iflag; /* 0x44 Interrupt flag register */<o:p></o:p></pre>
<pre>- volatile unsigned int res_48; /* 0x48 Reserved */<o:p></o:p></pre>
<pre>+ volatile unsigned int input_en; /* 0x48 Input enable (if present) */<o:p></o:p></pre>
<pre> volatile unsigned int pulse; /* 0x4C Pulse register */<o:p></o:p></pre>
<pre> volatile unsigned int res_50; /* 0x50 Reserved */<o:p></o:p></pre>
<pre> volatile unsigned int output_or; /* 0x54 I/O port output register, logical-OR<o:p></o:p></pre>
<pre>*/<o:p></o:p></pre>
<pre>diff --git a/bsps/shared/grlib/drvmgr/ambapp_bus.c<o:p></o:p></pre>
<pre>b/bsps/shared/grlib/drvmgr/ambapp_bus.c<o:p></o:p></pre>
<pre>index 3c38fc16e0..0aed29224c 100644<o:p></o:p></pre>
<pre>--- a/bsps/shared/grlib/drvmgr/ambapp_bus.c<o:p></o:p></pre>
<pre>+++ b/bsps/shared/grlib/drvmgr/ambapp_bus.c<o:p></o:p></pre>
<pre>@@ -521,11 +521,8 @@ static int ambapp_dev_fixup(struct drvmgr_dev<o:p></o:p></pre>
<pre>*dev, struct amba_dev_info *pnp)<o:p></o:p></pre>
<pre> for(core = 0; core < subcores; core++)<o:p></o:p></pre>
<pre> drvmgr_dev_register(devs_to_register[core]);<o:p></o:p></pre>
<pre> return 1;<o:p></o:p></pre>
<pre>- } else if ( (pnp->info.device == GAISLER_GPIO) &&<o:p></o:p></pre>
<pre>- (pnp->info.vendor == VENDOR_GAISLER) ) {<o:p></o:p></pre>
<pre>- /* PIO[N] is connected to IRQ[N]. */<o:p></o:p></pre>
<pre>- pnp->info.irq = 0;<o:p></o:p></pre>
<pre> }<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre> return 0;<o:p></o:p></pre>
<pre> }<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>diff --git a/bsps/shared/grlib/gpio/gpiolib.c<o:p></o:p></pre>
<pre>b/bsps/shared/grlib/gpio/gpiolib.c<o:p></o:p></pre>
<pre>index cf0038c5bb..0cb76402cc 100644<o:p></o:p></pre>
<pre>--- a/bsps/shared/grlib/gpio/gpiolib.c<o:p></o:p></pre>
<pre>+++ b/bsps/shared/grlib/gpio/gpiolib.c<o:p></o:p></pre>
<pre>@@ -201,7 +201,7 @@ int gpiolib_get(void *handle, int *inval) }<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre> /*** IRQ Functions ***/<o:p></o:p></pre>
<pre>-int gpiolib_irq_register(void *handle, void *func, void *arg)<o:p></o:p></pre>
<pre>+int gpiolib_irq_register(void *handle, gpiolib_isr func, void *arg)<o:p></o:p></pre>
<pre> {<o:p></o:p></pre>
<pre> struct gpiolib_port *port = handle;<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>diff --git a/bsps/shared/grlib/gpio/grgpio.c b/bsps/shared/grlib/gpio/grgpio.c<o:p></o:p></pre>
<pre>index 05504ef020..5bce5f530a 100644<o:p></o:p></pre>
<pre>--- a/bsps/shared/grlib/gpio/grgpio.c<o:p></o:p></pre>
<pre>+++ b/bsps/shared/grlib/gpio/grgpio.c<o:p></o:p></pre>
<pre>@@ -229,6 +229,7 @@ static int grgpio_grpiolib_irq_opts(void *handle,<o:p></o:p></pre>
<pre>unsigned int options) {<o:p></o:p></pre>
<pre> struct grgpio_priv *priv;<o:p></o:p></pre>
<pre> int portnr;<o:p></o:p></pre>
<pre>+ int irq;<o:p></o:p></pre>
<pre> drvmgr_isr isr;<o:p></o:p></pre>
<pre> void *arg;<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>@@ -244,33 +245,41 @@ static int grgpio_grpiolib_irq_opts(void *handle,<o:p></o:p></pre>
<pre>unsigned int options)<o:p></o:p></pre>
<pre> isr = priv->isrs[portnr].isr;<o:p></o:p></pre>
<pre> arg = priv->isrs[portnr].arg;<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>+ /* For irqgen == 1, irq == pirq, i.e. no offset */<o:p></o:p></pre>
<pre>+ irq = 0;<o:p></o:p></pre>
<pre>+ if (GRGPIO_CAP_IRQGEN(priv->regs->cap) == 0) {<o:p></o:p></pre>
<pre>+ /* For irqgen == 0, irq == pirq + portnr */<o:p></o:p></pre>
<pre>+ irq += portnr;<o:p></o:p></pre>
<pre>+ }<o:p></o:p></pre>
<pre>+ /* FIXME: irqgen > 1 currently not supported */<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre> if ( options & GPIOLIB_IRQ_DISABLE ) {<o:p></o:p></pre>
<pre> /* Disable interrupt at interrupt controller */<o:p></o:p></pre>
<pre>- if ( drvmgr_interrupt_unregister(priv->dev, portnr, isr, arg) ) {<o:p></o:p></pre>
<pre>+ if ( drvmgr_interrupt_unregister(priv->dev, irq, isr, arg) ) {<o:p></o:p></pre>
<pre> return -1;<o:p></o:p></pre>
<pre> }<o:p></o:p></pre>
<pre> }<o:p></o:p></pre>
<pre> if ( options & GPIOLIB_IRQ_CLEAR ) {<o:p></o:p></pre>
<pre> /* Clear interrupt at interrupt controller */<o:p></o:p></pre>
<pre>- if ( drvmgr_interrupt_clear(priv->dev, portnr) ) {<o:p></o:p></pre>
<pre>+ if ( drvmgr_interrupt_clear(priv->dev, irq) ) {<o:p></o:p></pre>
<pre> return -1;<o:p></o:p></pre>
<pre> }<o:p></o:p></pre>
<pre> }<o:p></o:p></pre>
<pre> if ( options & GPIOLIB_IRQ_ENABLE ) {<o:p></o:p></pre>
<pre> /* Enable interrupt at interrupt controller */<o:p></o:p></pre>
<pre>- if ( drvmgr_interrupt_register(priv->dev, portnr, "grgpio", isr,<o:p></o:p></pre>
<pre>arg) ) {<o:p></o:p></pre>
<pre>+ if ( drvmgr_interrupt_register(priv->dev, irq, "grgpio", isr,<o:p></o:p></pre>
<pre>arg) )<o:p></o:p></pre>
<pre>+{<o:p></o:p></pre>
<pre> return -1;<o:p></o:p></pre>
<pre> }<o:p></o:p></pre>
<pre> }<o:p></o:p></pre>
<pre> if ( options & GPIOLIB_IRQ_MASK ) {<o:p></o:p></pre>
<pre> /* Mask (disable) interrupt at interrupt controller */<o:p></o:p></pre>
<pre>- if ( drvmgr_interrupt_mask(priv->dev, portnr) ) {<o:p></o:p></pre>
<pre>+ if ( drvmgr_interrupt_mask(priv->dev, irq) ) {<o:p></o:p></pre>
<pre> return -1;<o:p></o:p></pre>
<pre> }<o:p></o:p></pre>
<pre> }<o:p></o:p></pre>
<pre> if ( options & GPIOLIB_IRQ_UNMASK ) {<o:p></o:p></pre>
<pre> /* Unmask (enable) interrupt at interrupt controller */<o:p></o:p></pre>
<pre>- if ( drvmgr_interrupt_unmask(priv->dev, portnr) ) {<o:p></o:p></pre>
<pre>+ if ( drvmgr_interrupt_unmask(priv->dev, irq) ) {<o:p></o:p></pre>
<pre> return -1;<o:p></o:p></pre>
<pre> }<o:p></o:p></pre>
<pre> }<o:p></o:p></pre>
<pre>@@ -278,7 +287,7 @@ static int grgpio_grpiolib_irq_opts(void *handle,<o:p></o:p></pre>
<pre>unsigned int options)<o:p></o:p></pre>
<pre> return 0;<o:p></o:p></pre>
<pre> }<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>-static int grgpio_grpiolib_irq_register(void *handle, void *func, void *arg)<o:p></o:p></pre>
<pre>+static int grgpio_grpiolib_irq_register(void *handle, gpiolib_isr func,<o:p></o:p></pre>
<pre>+void *arg)<o:p></o:p></pre>
<pre> {<o:p></o:p></pre>
<pre> struct grgpio_priv *priv;<o:p></o:p></pre>
<pre> int portnr;<o:p></o:p></pre>
<pre>@@ -313,6 +322,7 @@ static int grgpio_grpiolib_set(void *handle, int dir, int<o:p></o:p></pre>
<pre>outval)<o:p></o:p></pre>
<pre> /* Set Direction and Output */<o:p></o:p></pre>
<pre> mask = 1<<portnr;<o:p></o:p></pre>
<pre> priv->regs->dir = (priv->regs->dir & ~mask) | (dir ? mask : 0);<o:p></o:p></pre>
<pre>+ priv->regs->input_en = (priv->regs->input_en & ~mask) | (dir ? 0 :<o:p></o:p></pre>
<pre>+mask);<o:p></o:p></pre>
<pre> priv->regs->output = (priv->regs->output & ~mask) | (outval ? mask :<o:p></o:p></pre>
<pre>0);<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre> return 0;<o:p></o:p></pre>
<pre>--<o:p></o:p></pre>
<pre>2.17.1<o:p></o:p></pre>
</blockquote>
<pre><o:p> </o:p></pre>
</blockquote>
</div>
</div>
</body>
</html>