staging: comedi: s626: bitfield manipulation macros for CRA, CRB and setup
authorIan Abbott <abbotti@mev.co.uk>
Fri, 18 Oct 2013 13:40:55 +0000 (14:40 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 19 Oct 2013 20:47:23 +0000 (13:47 -0700)
Some bits of the 'CRB' register have different functions when read or
written, so add macros to define the read-only parts.

Add macros to define the widths of the bitfields in the 'CRA' and 'CRB'
registers and the standard encoder setup value.

Add macros to construct and extract parts of the 'CRA' and 'CRB'
register values and the standard encoder setup value, along with a
couple of general helper macros for the above.

Redefine the bitfield mask macros for 'CRA', 'CRB' and standard encoder
setup using the above.

Signed-off-by: Ian Abbott <abbotti@mev.co.uk>
Reviewed-by: H Hartley Sweeten <hsweeten@visionengravers.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/comedi/drivers/s626.h

index 7f38de5f07f5cb9b3e1914434e758961ff53c043..f6b68bf1df3e03ee89cebb978bc8efe81ba461f7 100644 (file)
 #define S626_NUM_INDEXSOURCES  2
 #define S626_NUM_LOADTRIGS     4
 
-/* Bit field positions in CRA and CRB counter control registers. */
+/* General macros for manipulating bitfields: */
+#define S626_MAKE(x, w, p)     (((x) & ((1 << (w)) - 1)) << (p))
+#define S626_UNMAKE(v, w, p)   (((v) >> (p)) & ((1 << (w)) - 1))
 
 /* Bit field positions in CRA: */
 #define S626_CRABIT_INDXSRC_B  14      /* B index source. */
 #define S626_CRABIT_INDXSRC_A   2      /* A index source. */
 #define S626_CRABIT_CNTSRC_A    0      /* A counter source. */
 
+/* Bit field widths in CRA: */
+#define S626_CRAWID_INDXSRC_B  2
+#define S626_CRAWID_CNTSRC_B   2
+#define S626_CRAWID_INDXPOL_A  1
+#define S626_CRAWID_LOADSRC_A  2
+#define S626_CRAWID_CLKMULT_A  2
+#define S626_CRAWID_INTSRC_A   2
+#define S626_CRAWID_CLKPOL_A   1
+#define S626_CRAWID_INDXSRC_A  2
+#define S626_CRAWID_CNTSRC_A   2
+
+/* Bit field masks for CRA: */
+#define S626_CRAMSK_INDXSRC_B  S626_SET_CRA_INDXSRC_B(~0)
+#define S626_CRAMSK_CNTSRC_B   S626_SET_CRA_CNTSRC_B(~0)
+#define S626_CRAMSK_INDXPOL_A  S626_SET_CRA_INDXPOL_A(~0)
+#define S626_CRAMSK_LOADSRC_A  S626_SET_CRA_LOADSRC_A(~0)
+#define S626_CRAMSK_CLKMULT_A  S626_SET_CRA_CLKMULT_A(~0)
+#define S626_CRAMSK_INTSRC_A   S626_SET_CRA_INTSRC_A(~0)
+#define S626_CRAMSK_CLKPOL_A   S626_SET_CRA_CLKPOL_A(~0)
+#define S626_CRAMSK_INDXSRC_A  S626_SET_CRA_INDXSRC_A(~0)
+#define S626_CRAMSK_CNTSRC_A   S626_SET_CRA_CNTSRC_A(~0)
+
+/* Construct parts of the CRA value: */
+#define S626_SET_CRA_INDXSRC_B(x)      \
+       S626_MAKE((x), S626_CRAWID_INDXSRC_B, S626_CRABIT_INDXSRC_B)
+#define S626_SET_CRA_CNTSRC_B(x)       \
+       S626_MAKE((x), S626_CRAWID_CNTSRC_B, S626_CRABIT_CNTSRC_B)
+#define S626_SET_CRA_INDXPOL_A(x)      \
+       S626_MAKE((x), S626_CRAWID_INDXPOL_A, S626_CRABIT_INDXPOL_A)
+#define S626_SET_CRA_LOADSRC_A(x)      \
+       S626_MAKE((x), S626_CRAWID_LOADSRC_A, S626_CRABIT_LOADSRC_A)
+#define S626_SET_CRA_CLKMULT_A(x)      \
+       S626_MAKE((x), S626_CRAWID_CLKMULT_A, S626_CRABIT_CLKMULT_A)
+#define S626_SET_CRA_INTSRC_A(x)       \
+       S626_MAKE((x), S626_CRAWID_INTSRC_A, S626_CRABIT_INTSRC_A)
+#define S626_SET_CRA_CLKPOL_A(x)       \
+       S626_MAKE((x), S626_CRAWID_CLKPOL_A, S626_CRABIT_CLKPOL_A)
+#define S626_SET_CRA_INDXSRC_A(x)      \
+       S626_MAKE((x), S626_CRAWID_INDXSRC_A, S626_CRABIT_INDXSRC_A)
+#define S626_SET_CRA_CNTSRC_A(x)       \
+       S626_MAKE((x), S626_CRAWID_CNTSRC_A, S626_CRABIT_CNTSRC_A)
+
+/* Extract parts of the CRA value: */
+#define S626_GET_CRA_INDXSRC_B(v)      \
+       S626_UNMAKE((v), S626_CRAWID_INDXSRC_B, S626_CRABIT_INDXSRC_B)
+#define S626_GET_CRA_CNTSRC_B(v)       \
+       S626_UNMAKE((v), S626_CRAWID_CNTSRC_B, S626_CRABIT_CNTSRC_B)
+#define S626_GET_CRA_INDXPOL_A(v)      \
+       S626_UNMAKE((v), S626_CRAWID_INDXPOL_A, S626_CRABIT_INDXPOL_A)
+#define S626_GET_CRA_LOADSRC_A(v)      \
+       S626_UNMAKE((v), S626_CRAWID_LOADSRC_A, S626_CRABIT_LOADSRC_A)
+#define S626_GET_CRA_CLKMULT_A(v)      \
+       S626_UNMAKE((v), S626_CRAWID_CLKMULT_A, S626_CRABIT_CLKMULT_A)
+#define S626_GET_CRA_INTSRC_A(v)       \
+       S626_UNMAKE((v), S626_CRAWID_INTSRC_A, S626_CRABIT_INTSRC_A)
+#define S626_GET_CRA_CLKPOL_A(v)       \
+       S626_UNMAKE((v), S626_CRAWID_CLKPOL_A, S626_CRABIT_CLKPOL_A)
+#define S626_GET_CRA_INDXSRC_A(v)      \
+       S626_UNMAKE((v), S626_CRAWID_INDXSRC_A, S626_CRABIT_INDXSRC_A)
+#define S626_GET_CRA_CNTSRC_A(v)       \
+       S626_UNMAKE((v), S626_CRAWID_CNTSRC_A, S626_CRABIT_CNTSRC_A)
+
 /* Bit field positions in CRB: */
 #define S626_CRBBIT_INTRESETCMD        15      /* (w) Interrupt reset command. */
 #define S626_CRBBIT_CNTDIR_B   15      /* (r) B counter direction. */
 #define S626_CRBBIT_INDXPOL_B   1      /* B index polarity. */
 #define S626_CRBBIT_CLKPOL_B    0      /* B clock polarity. */
 
-/* Bit field masks for CRA and CRB. */
-
-#define S626_CRAMSK_INDXSRC_B  (3 << S626_CRABIT_INDXSRC_B)
-#define S626_CRAMSK_CNTSRC_B   (3 << S626_CRABIT_CNTSRC_B)
-#define S626_CRAMSK_INDXPOL_A  (1 << S626_CRABIT_INDXPOL_A)
-#define S626_CRAMSK_LOADSRC_A  (3 << S626_CRABIT_LOADSRC_A)
-#define S626_CRAMSK_CLKMULT_A  (3 << S626_CRABIT_CLKMULT_A)
-#define S626_CRAMSK_INTSRC_A   (3 << S626_CRABIT_INTSRC_A)
-#define S626_CRAMSK_CLKPOL_A   (1 << S626_CRABIT_CLKPOL_A)
-#define S626_CRAMSK_INDXSRC_A  (3 << S626_CRABIT_INDXSRC_A)
-#define S626_CRAMSK_CNTSRC_A   (3 << S626_CRABIT_CNTSRC_A)
-
-#define S626_CRBMSK_INTRESETCMD        (1 << S626_CRBBIT_INTRESETCMD)
-#define S626_CRBMSK_CNTDIR_B   (1 << S626_CRBBIT_CNTDIR_B)
-#define S626_CRBMSK_INTRESET_B (1 << S626_CRBBIT_INTRESET_B)
-#define S626_CRBMSK_OVERDO_A   (1 << S626_CRBBIT_OVERDO_A)
-#define S626_CRBMSK_INTRESET_A (1 << S626_CRBBIT_INTRESET_A)
-#define S626_CRBMSK_OVERDO_B   (1 << S626_CRBBIT_OVERDO_B)
-#define S626_CRBMSK_CLKENAB_A  (1 << S626_CRBBIT_CLKENAB_A)
-#define S626_CRBMSK_INTSRC_B   (3 << S626_CRBBIT_INTSRC_B)
-#define S626_CRBMSK_LATCHSRC   (3 << S626_CRBBIT_LATCHSRC)
-#define S626_CRBMSK_LOADSRC_B  (3 << S626_CRBBIT_LOADSRC_B)
-#define S626_CRBMSK_CLEAR_B    (1 << S626_CRBBIT_CLEAR_B)
-#define S626_CRBMSK_CLKMULT_B  (3 << S626_CRBBIT_CLKMULT_B)
-#define S626_CRBMSK_CLKENAB_B  (1 << S626_CRBBIT_CLKENAB_B)
-#define S626_CRBMSK_INDXPOL_B  (1 << S626_CRBBIT_INDXPOL_B)
-#define S626_CRBMSK_CLKPOL_B   (1 << S626_CRBBIT_CLKPOL_B)
+/* Bit field widths in CRB: */
+#define S626_CRBWID_INTRESETCMD        1
+#define S626_CRBWID_CNTDIR_B   1
+#define S626_CRBWID_INTRESET_B 1
+#define S626_CRBWID_OVERDO_A   1
+#define S626_CRBWID_INTRESET_A 1
+#define S626_CRBWID_OVERDO_B   1
+#define S626_CRBWID_CLKENAB_A  1
+#define S626_CRBWID_INTSRC_B   2
+#define S626_CRBWID_LATCHSRC   2
+#define S626_CRBWID_LOADSRC_B  2
+#define S626_CRBWID_CLEAR_B    1
+#define S626_CRBWID_CLKMULT_B  2
+#define S626_CRBWID_CLKENAB_B  1
+#define S626_CRBWID_INDXPOL_B  1
+#define S626_CRBWID_CLKPOL_B   1
+
+/* Bit field masks for CRB: */
+#define S626_CRBMSK_INTRESETCMD        S626_SET_CRB_INTRESETCMD(~0)    /* (w) */
+#define S626_CRBMSK_CNTDIR_B   S626_CRBMSK_INTRESETCMD         /* (r) */
+#define S626_CRBMSK_INTRESET_B S626_SET_CRB_INTRESET_B(~0)     /* (w) */
+#define S626_CRBMSK_OVERDO_A   S626_CRBMSK_INTRESET_B          /* (r) */
+#define S626_CRBMSK_INTRESET_A S626_SET_CRB_INTRESET_A(~0)     /* (w) */
+#define S626_CRBMSK_OVERDO_B   S626_CRBMSK_INTRESET_A          /* (r) */
+#define S626_CRBMSK_CLKENAB_A  S626_SET_CRB_CLKENAB_A(~0)
+#define S626_CRBMSK_INTSRC_B   S626_SET_CRB_INTSRC_B(~0)
+#define S626_CRBMSK_LATCHSRC   S626_SET_CRB_LATCHSRC(~0)
+#define S626_CRBMSK_LOADSRC_B  S626_SET_CRB_LOADSRC_B(~0)
+#define S626_CRBMSK_CLEAR_B    S626_SET_CRB_CLEAR_B(~0)
+#define S626_CRBMSK_CLKMULT_B  S626_SET_CRB_CLKMULT_B(~0)
+#define S626_CRBMSK_CLKENAB_B  S626_SET_CRB_CLKENAB_B(~0)
+#define S626_CRBMSK_INDXPOL_B  S626_SET_CRB_INDXPOL_B(~0)
+#define S626_CRBMSK_CLKPOL_B   S626_SET_CRB_CLKPOL_B(~0)
 
 /* Interrupt reset control bits. */
 #define S626_CRBMSK_INTCTRL    (S626_CRBMSK_INTRESETCMD | \
                                 S626_CRBMSK_INTRESET_A | \
                                 S626_CRBMSK_INTRESET_B)
 
-/* Bit field positions for standardized SETUP structure. */
-
+/* Construct parts of the CRB value: */
+#define S626_SET_CRB_INTRESETCMD(x)    \
+       S626_MAKE((x), S626_CRBWID_INTRESETCMD, S626_CRBBIT_INTRESETCMD)
+#define S626_SET_CRB_INTRESET_B(x)     \
+       S626_MAKE((x), S626_CRBWID_INTRESET_B, S626_CRBBIT_INTRESET_B)
+#define S626_SET_CRB_INTRESET_A(x)     \
+       S626_MAKE((x), S626_CRBWID_INTRESET_A, S626_CRBBIT_INTRESET_A)
+#define S626_SET_CRB_CLKENAB_A(x)      \
+       S626_MAKE((x), S626_CRBWID_CLKENAB_A, S626_CRBBIT_CLKENAB_A)
+#define S626_SET_CRB_INTSRC_B(x)       \
+       S626_MAKE((x), S626_CRBWID_INTSRC_B, S626_CRBBIT_INTSRC_B)
+#define S626_SET_CRB_LATCHSRC(x)       \
+       S626_MAKE((x), S626_CRBWID_LATCHSRC, S626_CRBBIT_LATCHSRC)
+#define S626_SET_CRB_LOADSRC_B(x)      \
+       S626_MAKE((x), S626_CRBWID_LOADSRC_B, S626_CRBBIT_LOADSRC_B)
+#define S626_SET_CRB_CLEAR_B(x)        \
+       S626_MAKE((x), S626_CRBWID_CLEAR_B, S626_CRBBIT_CLEAR_B)
+#define S626_SET_CRB_CLKMULT_B(x)      \
+       S626_MAKE((x), S626_CRBWID_CLKMULT_B, S626_CRBBIT_CLKMULT_B)
+#define S626_SET_CRB_CLKENAB_B(x)      \
+       S626_MAKE((x), S626_CRBWID_CLKENAB_B, S626_CRBBIT_CLKENAB_B)
+#define S626_SET_CRB_INDXPOL_B(x)      \
+       S626_MAKE((x), S626_CRBWID_INDXPOL_B, S626_CRBBIT_INDXPOL_B)
+#define S626_SET_CRB_CLKPOL_B(x)       \
+       S626_MAKE((x), S626_CRBWID_CLKPOL_B, S626_CRBBIT_CLKPOL_B)
+
+/* Extract parts of the CRB value: */
+#define S626_GET_CRB_CNTDIR_B(v)       \
+       S626_UNMAKE((v), S626_CRBWID_CNTDIR_B, S626_CRBBIT_CNTDIR_B)
+#define S626_GET_CRB_OVERDO_A(v)       \
+       S626_UNMAKE((v), S626_CRBWID_OVERDO_A, S626_CRBBIT_OVERDO_A)
+#define S626_GET_CRB_OVERDO_B(v)       \
+       S626_UNMAKE((v), S626_CRBWID_OVERDO_B, S626_CRBBIT_OVERDO_B)
+#define S626_GET_CRB_CLKENAB_A(v)      \
+       S626_UNMAKE((v), S626_CRBWID_CLKENAB_A, S626_CRBBIT_CLKENAB_A)
+#define S626_GET_CRB_INTSRC_B(v)       \
+       S626_UNMAKE((v), S626_CRBWID_INTSRC_B, S626_CRBBIT_INTSRC_B)
+#define S626_GET_CRB_LATCHSRC(v)       \
+       S626_UNMAKE((v), S626_CRBWID_LATCHSRC, S626_CRBBIT_LATCHSRC)
+#define S626_GET_CRB_LOADSRC_B(v)      \
+       S626_UNMAKE((v), S626_CRBWID_LOADSRC_B, S626_CRBBIT_LOADSRC_B)
+#define S626_GET_CRB_CLEAR_B(v)        \
+       S626_UNMAKE((v), S626_CRBWID_CLEAR_B, S626_CRBBIT_CLEAR_B)
+#define S626_GET_CRB_CLKMULT_B(v)      \
+       S626_UNMAKE((v), S626_CRBWID_CLKMULT_B, S626_CRBBIT_CLKMULT_B)
+#define S626_GET_CRB_CLKENAB_B(v)      \
+       S626_UNMAKE((v), S626_CRBWID_CLKENAB_B, S626_CRBBIT_CLKENAB_B)
+#define S626_GET_CRB_INDXPOL_B(v)      \
+       S626_UNMAKE((v), S626_CRBWID_INDXPOL_B, S626_CRBBIT_INDXPOL_B)
+#define S626_GET_CRB_CLKPOL_B(v)       \
+       S626_UNMAKE((v), S626_CRBWID_CLKPOL_B, S626_CRBBIT_CLKPOL_B)
+
+/* Bit field positions for standardized SETUP structure: */
 #define S626_STDBIT_INTSRC     13
 #define S626_STDBIT_LATCHSRC   11
 #define S626_STDBIT_LOADSRC     9
 #define S626_STDBIT_CLKMULT     1
 #define S626_STDBIT_CLKENAB     0
 
-/* Bit field masks for standardized SETUP structure. */
-
-#define S626_STDMSK_INTSRC     (3 << S626_STDBIT_INTSRC)
-#define S626_STDMSK_LATCHSRC   (3 << S626_STDBIT_LATCHSRC)
-#define S626_STDMSK_LOADSRC    (3 << S626_STDBIT_LOADSRC)
-#define S626_STDMSK_INDXSRC    (1 << S626_STDBIT_INDXSRC)
-#define S626_STDMSK_INDXPOL    (1 << S626_STDBIT_INDXPOL)
-#define S626_STDMSK_ENCMODE    (3 << S626_STDBIT_ENCMODE)
-#define S626_STDMSK_CLKPOL     (1 << S626_STDBIT_CLKPOL)
-#define S626_STDMSK_CLKMULT    (3 << S626_STDBIT_CLKMULT)
-#define S626_STDMSK_CLKENAB    (1 << S626_STDBIT_CLKENAB)
+/* Bit field widths for standardized SETUP structure: */
+#define S626_STDWID_INTSRC     2
+#define S626_STDWID_LATCHSRC   2
+#define S626_STDWID_LOADSRC    2
+#define S626_STDWID_INDXSRC    1
+#define S626_STDWID_INDXPOL    1
+#define S626_STDWID_ENCMODE    2
+#define S626_STDWID_CLKPOL     1
+#define S626_STDWID_CLKMULT    2
+#define S626_STDWID_CLKENAB    1
+
+/* Bit field masks for standardized SETUP structure: */
+#define S626_STDMSK_INTSRC     S626_SET_STD_INTSRC(~0)
+#define S626_STDMSK_LATCHSRC   S626_SET_STD_LATCHSRC(~0)
+#define S626_STDMSK_LOADSRC    S626_SET_STD_LOADSRC(~0)
+#define S626_STDMSK_INDXSRC    S626_SET_STD_INDXSRC(~0)
+#define S626_STDMSK_INDXPOL    S626_SET_STD_INDXPOL(~0)
+#define S626_STDMSK_ENCMODE    S626_SET_STD_ENCMODE(~0)
+#define S626_STDMSK_CLKPOL     S626_SET_STD_CLKPOL(~0)
+#define S626_STDMSK_CLKMULT    S626_SET_STD_CLKMULT(~0)
+#define S626_STDMSK_CLKENAB    S626_SET_STD_CLKENAB(~0)
+
+/* Construct parts of standardized SETUP structure: */
+#define S626_SET_STD_INTSRC(x) \
+       S626_MAKE((x), S626_STDWID_INTSRC, S626_STDBIT_INTSRC)
+#define S626_SET_STD_LATCHSRC(x)       \
+       S626_MAKE((x), S626_STDWID_LATCHSRC, S626_STDBIT_LATCHSRC)
+#define S626_SET_STD_LOADSRC(x)        \
+       S626_MAKE((x), S626_STDWID_LOADSRC, S626_STDBIT_LOADSRC)
+#define S626_SET_STD_INDXSRC(x)        \
+       S626_MAKE((x), S626_STDWID_INDXSRC, S626_STDBIT_INDXSRC)
+#define S626_SET_STD_INDXPOL(x)        \
+       S626_MAKE((x), S626_STDWID_INDXPOL, S626_STDBIT_INDXPOL)
+#define S626_SET_STD_ENCMODE(x)        \
+       S626_MAKE((x), S626_STDWID_ENCMODE, S626_STDBIT_ENCMODE)
+#define S626_SET_STD_CLKPOL(x) \
+       S626_MAKE((x), S626_STDWID_CLKPOL, S626_STDBIT_CLKPOL)
+#define S626_SET_STD_CLKMULT(x)        \
+       S626_MAKE((x), S626_STDWID_CLKMULT, S626_STDBIT_CLKMULT)
+#define S626_SET_STD_CLKENAB(x)        \
+       S626_MAKE((x), S626_STDWID_CLKENAB, S626_STDBIT_CLKENAB)
+
+/* Extract parts of standardized SETUP structure: */
+#define S626_GET_STD_INTSRC(v) \
+       S626_UNMAKE((v), S626_STDWID_INTSRC, S626_STDBIT_INTSRC)
+#define S626_GET_STD_LATCHSRC(v)       \
+       S626_UNMAKE((v), S626_STDWID_LATCHSRC, S626_STDBIT_LATCHSRC)
+#define S626_GET_STD_LOADSRC(v)        \
+       S626_UNMAKE((v), S626_STDWID_LOADSRC, S626_STDBIT_LOADSRC)
+#define S626_GET_STD_INDXSRC(v)        \
+       S626_UNMAKE((v), S626_STDWID_INDXSRC, S626_STDBIT_INDXSRC)
+#define S626_GET_STD_INDXPOL(v)        \
+       S626_UNMAKE((v), S626_STDWID_INDXPOL, S626_STDBIT_INDXPOL)
+#define S626_GET_STD_ENCMODE(v)        \
+       S626_UNMAKE((v), S626_STDWID_ENCMODE, S626_STDBIT_ENCMODE)
+#define S626_GET_STD_CLKPOL(v) \
+       S626_UNMAKE((v), S626_STDWID_CLKPOL, S626_STDBIT_CLKPOL)
+#define S626_GET_STD_CLKMULT(v)        \
+       S626_UNMAKE((v), S626_STDWID_CLKMULT, S626_STDBIT_CLKMULT)
+#define S626_GET_STD_CLKENAB(v)        \
+       S626_UNMAKE((v), S626_STDWID_CLKENAB, S626_STDBIT_CLKENAB)
 
 #endif