https://github.com/torvalds/linux
Revision 98a226ed21949601b270f7ea20abc9f72f7b0be9 authored by Takashi Iwai on 10 June 2015, 08:27:00 UTC, committed by Takashi Iwai on 10 June 2015, 08:31:10 UTC
Along with the transition to regmap for managing the cached parameter
reads, the caps overwrite was also moved to regmap cache.  The cache
change itself works, but it still tries to write the non-existing verb
(the HDA parameter is read-only) wrongly.  It's harmless in most
cases, but some chips are picky and may result in the codec
communication stall.

This patch avoids it just by adding the missing flag check in
reg_write ops.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
1 parent 132bd96
Raw File
Tip revision: 98a226ed21949601b270f7ea20abc9f72f7b0be9 authored by Takashi Iwai on 10 June 2015, 08:27:00 UTC
ALSA: hda - Don't actually write registers for caps overwrites
Tip revision: 98a226e
dtlk.h
#define DTLK_MINOR	0
#define DTLK_IO_EXTENT	0x02

	/* ioctl's use magic number of 0xa3 */
#define DTLK_INTERROGATE 0xa390	/* get settings from the DoubleTalk */
#define DTLK_STATUS 0xa391	/* get status from the DoubleTalk */


#define DTLK_CLEAR 0x18		/* stops speech */

#define DTLK_MAX_RETRIES (loops_per_jiffy/(10000/HZ))

	/* TTS Port Status Flags */
#define TTS_READABLE     0x80	/* mask for bit which is nonzero if a
				   byte can be read from the TTS port */
#define TTS_SPEAKING     0x40	/* mask for SYNC bit, which is nonzero
				   while DoubleTalk is producing
				   output with TTS, PCM or CVSD
				   synthesizers or tone generators
				   (that is, all but LPC) */
#define TTS_SPEAKING2    0x20	/* mask for SYNC2 bit,
				   which falls to zero up to 0.4 sec
				   before speech stops */
#define TTS_WRITABLE     0x10	/* mask for RDY bit, which when set to
             			   1, indicates the TTS port is ready
             			   to accept a byte of data.  The RDY
             			   bit goes zero 2-3 usec after
             			   writing, and goes 1 again 180-190
             			   usec later. */
#define TTS_ALMOST_FULL  0x08	/* mask for AF bit: When set to 1,
				   indicates that less than 300 free
				   bytes are available in the TTS
				   input buffer. AF is always 0 in the
				   PCM, TGN and CVSD modes. */
#define TTS_ALMOST_EMPTY 0x04	/* mask for AE bit: When set to 1,
				   indicates that less than 300 bytes
				   of data remain in DoubleTalk's
				   input (TTS or PCM) buffer. AE is
				   always 1 in the TGN and CVSD
				   modes. */

	/* LPC speak commands */
#define LPC_5220_NORMAL 0x60	/* 5220 format decoding table, normal rate */
#define LPC_5220_FAST 0x64	/* 5220 format decoding table, fast rate */
#define LPC_D6_NORMAL 0x20	/* D6 format decoding table, normal rate */
#define LPC_D6_FAST 0x24	/* D6 format decoding table, fast rate */

	/* LPC Port Status Flags (valid only after one of the LPC
           speak commands) */
#define LPC_SPEAKING     0x80	/* mask for TS bit: When set to 1,
				   indicates the LPC synthesizer is
				   producing speech.*/
#define LPC_BUFFER_LOW   0x40	/* mask for BL bit: When set to 1,
				   indicates that the hardware LPC
				   data buffer has less than 30 bytes
				   remaining. (Total internal buffer
				   size = 4096 bytes.) */
#define LPC_BUFFER_EMPTY 0x20	/* mask for BE bit: When set to 1,
				   indicates that the LPC data buffer
				   ran out of data (error condition if
				   TS is also 1).  */

				/* data returned by Interrogate command */
struct dtlk_settings
{
  unsigned short serial_number;	/* 0-7Fh:0-7Fh */
  unsigned char rom_version[24]; /* null terminated string */
  unsigned char mode;		/* 0=Character; 1=Phoneme; 2=Text */
  unsigned char punc_level;	/* nB; 0-7 */
  unsigned char formant_freq;	/* nF; 0-9 */
  unsigned char pitch;		/* nP; 0-99 */
  unsigned char speed;		/* nS; 0-9 */
  unsigned char volume;		/* nV; 0-9 */
  unsigned char tone;		/* nX; 0-2 */
  unsigned char expression;	/* nE; 0-9 */
  unsigned char ext_dict_loaded; /* 1=exception dictionary loaded */
  unsigned char ext_dict_status; /* 1=exception dictionary enabled */
  unsigned char free_ram;	/* # pages (truncated) remaining for
                                   text buffer */
  unsigned char articulation;	/* nA; 0-9 */
  unsigned char reverb;		/* nR; 0-9 */
  unsigned char eob;		/* 7Fh value indicating end of
                                   parameter block */
  unsigned char has_indexing;	/* nonzero if indexing is implemented */
};
back to top