Skip to content

Commit

Permalink
staging: comedi: s626: expand standardized IndxSrc values
Browse files Browse the repository at this point in the history
The 'IndxSrc' value for the standardized encoder setup is currently 1
bit wide and takes one of the following values:

  S626_INDXSRC_HARD = 0 // index source from hardware encoder
  S626_INDXSRC_SOFT = 1 // index source software controlled by IndxPol

However the hardware 'IndxSrcA' and 'IndxSrcB' values for the 'A' and
'B' counters are 2 bits wide.  The above standardized values 0 and 1
correspond to the hardware values 0 and 2.

In order to simplify conversions between the standardized values and
hardware values, expand the range of standardized values to cover all
four possible values.  The new values are as follows:

  S626_INDXSRC_ENCODER = 0  // index source from hardware encoder
  S626_INDXSRC_DIGIN = 1    // index source from digital inputs
  S626_INDXSRC_SOFT = 2     // index source s/w controlled by IndxPol
  S626_INDXSRC_DISABLED = 2 // index source disabled

(Note the change in value for `S626_INDXSRC_SOFT` and the replacement of
`S626_INDXSRC_HARD` with `S626_INDXSRC_ENCODER` for consistency with the
`CntSrc` values.)

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>
  • Loading branch information
Ian Abbott authored and Greg Kroah-Hartman committed Oct 29, 2013
1 parent 0830ada commit 2cea19f
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 15 deletions.
22 changes: 10 additions & 12 deletions drivers/staging/comedi/drivers/s626.c
Original file line number Diff line number Diff line change
Expand Up @@ -708,7 +708,6 @@ static uint16_t s626_get_mode_a(struct comedi_device *dev,

/*
* Populate the standardized counter setup bit fields.
* Note: IndexSrc is restricted to ENC_X or IndxPol.
*/
setup =
/* LoadSrc = LoadSrcA. */
Expand All @@ -717,8 +716,8 @@ static uint16_t s626_get_mode_a(struct comedi_device *dev,
S626_SET_STD_LATCHSRC(S626_GET_CRB_LATCHSRC(crb)) |
/* IntSrc = IntSrcA. */
S626_SET_STD_INTSRC(S626_GET_CRA_INTSRC_A(cra)) |
/* IndxSrc = IndxSrcA<1>. */
S626_SET_STD_INDXSRC(S626_GET_CRA_INDXSRC_A(cra) >> 1) |
/* IndxSrc = IndxSrcA. */
S626_SET_STD_INDXSRC(S626_GET_CRA_INDXSRC_A(cra)) |
/* IndxPol = IndxPolA. */
S626_SET_STD_INDXPOL(S626_GET_CRA_INDXPOL_A(cra)) |
/* ClkEnab = ClkEnabA. */
Expand Down Expand Up @@ -764,7 +763,6 @@ static uint16_t s626_get_mode_b(struct comedi_device *dev,

/*
* Populate the standardized counter setup bit fields.
* Note: IndexSrc is restricted to ENC_X or IndxPol.
*/
setup =
/* IntSrc = IntSrcB. */
Expand All @@ -777,8 +775,8 @@ static uint16_t s626_get_mode_b(struct comedi_device *dev,
S626_SET_STD_INDXPOL(S626_GET_CRB_INDXPOL_B(crb)) |
/* ClkEnab = ClkEnabB. */
S626_SET_STD_CLKENAB(S626_GET_CRB_CLKENAB_B(crb)) |
/* IndxSrc = IndxSrcB<1>. */
S626_SET_STD_INDXSRC(S626_GET_CRA_INDXSRC_B(cra) >> 1);
/* IndxSrc = IndxSrcB. */
S626_SET_STD_INDXSRC(S626_GET_CRA_INDXSRC_B(cra));

/* Adjust mode-dependent parameters. */
cntsrc = S626_GET_CRA_CNTSRC_B(cra);
Expand Down Expand Up @@ -829,8 +827,8 @@ static void s626_set_mode_a(struct comedi_device *dev,
/* Initialize CRA and CRB images. */
/* Preload trigger is passed through. */
cra = S626_SET_CRA_LOADSRC_A(S626_GET_STD_LOADSRC(setup));
/* IndexSrc is restricted to ENC_X or IndxPol. */
cra |= S626_SET_CRA_INDXSRC_A(S626_GET_STD_INDXSRC(setup) << 1);
/* IndexSrc is passed through. */
cra |= S626_SET_CRA_INDXSRC_A(S626_GET_STD_INDXSRC(setup));

/* Reset any pending CounterA event captures. */
crb = S626_SET_CRB_INTRESETCMD(1) | S626_SET_CRB_INTRESET_A(1);
Expand Down Expand Up @@ -874,7 +872,7 @@ static void s626_set_mode_a(struct comedi_device *dev,
* Force positive index polarity if IndxSrc is software-driven only,
* otherwise pass it through.
*/
if (S626_GET_STD_INDXSRC(setup) == S626_INDXSRC_HARD)
if (S626_GET_STD_INDXSRC(setup) != S626_INDXSRC_SOFT)
cra |= S626_SET_CRA_INDXPOL_A(S626_GET_STD_INDXPOL(setup));

/*
Expand Down Expand Up @@ -904,8 +902,8 @@ static void s626_set_mode_b(struct comedi_device *dev,
unsigned cntsrc, clkmult, clkpol;

/* Initialize CRA and CRB images. */
/* IndexSrc field is restricted to ENC_X or IndxPol. */
cra = S626_SET_CRA_INDXSRC_B(S626_GET_STD_INDXSRC(setup) << 1);
/* IndexSrc is passed through. */
cra = S626_SET_CRA_INDXSRC_B(S626_GET_STD_INDXSRC(setup));

/* Reset event captures and disable interrupts. */
crb = S626_SET_CRB_INTRESETCMD(1) | S626_SET_CRB_INTRESET_B(1);
Expand Down Expand Up @@ -958,7 +956,7 @@ static void s626_set_mode_b(struct comedi_device *dev,
* Force positive index polarity if IndxSrc is software-driven only,
* otherwise pass it through.
*/
if (S626_GET_STD_INDXSRC(setup) == S626_INDXSRC_HARD)
if (S626_GET_STD_INDXSRC(setup) != S626_INDXSRC_SOFT)
crb |= S626_SET_CRB_INDXPOL_B(S626_GET_STD_INDXPOL(setup));

/*
Expand Down
8 changes: 5 additions & 3 deletions drivers/staging/comedi/drivers/s626.h
Original file line number Diff line number Diff line change
Expand Up @@ -462,8 +462,10 @@
#define S626_LATCHSRC_B_OVERA 3 /* Latch B on A Overflow. */

/* IndxSrc values: */
#define S626_INDXSRC_HARD 0 /* Hardware or software index. */
#define S626_INDXSRC_SOFT 1 /* Software index only. */
#define S626_INDXSRC_ENCODER 0 /* Encoder. */
#define S626_INDXSRC_DIGIN 1 /* Digital inputs. */
#define S626_INDXSRC_SOFT 2 /* S/w controlled by IndxPol bit. */
#define S626_INDXSRC_DISABLED 3 /* Index disabled. */

/* IndxPol values: */
#define S626_INDXPOL_POS 0 /* Index input is active high. */
Expand Down Expand Up @@ -730,7 +732,7 @@
#define S626_STDWID_INTSRC 2
#define S626_STDWID_LATCHSRC 2
#define S626_STDWID_LOADSRC 2
#define S626_STDWID_INDXSRC 1
#define S626_STDWID_INDXSRC 2
#define S626_STDWID_INDXPOL 1
#define S626_STDWID_ENCMODE 2
#define S626_STDWID_CLKPOL 1
Expand Down

0 comments on commit 2cea19f

Please sign in to comment.