• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  /*
2   *  The driver for the ForteMedia FM801 based soundcards
3   *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
4   *
5   *   This program is free software; you can redistribute it and/or modify
6   *   it under the terms of the GNU General Public License as published by
7   *   the Free Software Foundation; either version 2 of the License, or
8   *   (at your option) any later version.
9   *
10   *   This program is distributed in the hope that it will be useful,
11   *   but WITHOUT ANY WARRANTY; without even the implied warranty of
12   *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13   *   GNU General Public License for more details.
14   *
15   */
16  
17  #include <linux/delay.h>
18  #include <linux/init.h>
19  #include <linux/interrupt.h>
20  #include <linux/io.h>
21  #include <linux/pci.h>
22  #include <linux/slab.h>
23  #include <linux/module.h>
24  #include <sound/core.h>
25  #include <sound/pcm.h>
26  #include <sound/tlv.h>
27  #include <sound/ac97_codec.h>
28  #include <sound/mpu401.h>
29  #include <sound/opl3.h>
30  #include <sound/initval.h>
31  
32  #ifdef CONFIG_SND_FM801_TEA575X_BOOL
33  #include <media/drv-intf/tea575x.h>
34  #endif
35  
36  MODULE_AUTHOR("Jaroslav Kysela <perex@perex.cz>");
37  MODULE_DESCRIPTION("ForteMedia FM801");
38  MODULE_LICENSE("GPL");
39  MODULE_SUPPORTED_DEVICE("{{ForteMedia,FM801},"
40  		"{Genius,SoundMaker Live 5.1}}");
41  
42  static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;	/* Index 0-MAX */
43  static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;	/* ID for this card */
44  static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;	/* Enable this card */
45  /*
46   *  Enable TEA575x tuner
47   *    1 = MediaForte 256-PCS
48   *    2 = MediaForte 256-PCP
49   *    3 = MediaForte 64-PCR
50   *   16 = setup tuner only (this is additional bit), i.e. SF64-PCR FM card
51   *  High 16-bits are video (radio) device number + 1
52   */
53  static int tea575x_tuner[SNDRV_CARDS];
54  static int radio_nr[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = -1};
55  
56  module_param_array(index, int, NULL, 0444);
57  MODULE_PARM_DESC(index, "Index value for the FM801 soundcard.");
58  module_param_array(id, charp, NULL, 0444);
59  MODULE_PARM_DESC(id, "ID string for the FM801 soundcard.");
60  module_param_array(enable, bool, NULL, 0444);
61  MODULE_PARM_DESC(enable, "Enable FM801 soundcard.");
62  module_param_array(tea575x_tuner, int, NULL, 0444);
63  MODULE_PARM_DESC(tea575x_tuner, "TEA575x tuner access method (0 = auto, 1 = SF256-PCS, 2=SF256-PCP, 3=SF64-PCR, 8=disable, +16=tuner-only).");
64  module_param_array(radio_nr, int, NULL, 0444);
65  MODULE_PARM_DESC(radio_nr, "Radio device numbers");
66  
67  
68  #define TUNER_DISABLED		(1<<3)
69  #define TUNER_ONLY		(1<<4)
70  #define TUNER_TYPE_MASK		(~TUNER_ONLY & 0xFFFF)
71  
72  /*
73   *  Direct registers
74   */
75  
76  #define fm801_writew(chip,reg,value)	outw((value), chip->port + FM801_##reg)
77  #define fm801_readw(chip,reg)		inw(chip->port + FM801_##reg)
78  
79  #define fm801_writel(chip,reg,value)	outl((value), chip->port + FM801_##reg)
80  
81  #define FM801_PCM_VOL		0x00	/* PCM Output Volume */
82  #define FM801_FM_VOL		0x02	/* FM Output Volume */
83  #define FM801_I2S_VOL		0x04	/* I2S Volume */
84  #define FM801_REC_SRC		0x06	/* Record Source */
85  #define FM801_PLY_CTRL		0x08	/* Playback Control */
86  #define FM801_PLY_COUNT		0x0a	/* Playback Count */
87  #define FM801_PLY_BUF1		0x0c	/* Playback Bufer I */
88  #define FM801_PLY_BUF2		0x10	/* Playback Buffer II */
89  #define FM801_CAP_CTRL		0x14	/* Capture Control */
90  #define FM801_CAP_COUNT		0x16	/* Capture Count */
91  #define FM801_CAP_BUF1		0x18	/* Capture Buffer I */
92  #define FM801_CAP_BUF2		0x1c	/* Capture Buffer II */
93  #define FM801_CODEC_CTRL	0x22	/* Codec Control */
94  #define FM801_I2S_MODE		0x24	/* I2S Mode Control */
95  #define FM801_VOLUME		0x26	/* Volume Up/Down/Mute Status */
96  #define FM801_I2C_CTRL		0x29	/* I2C Control */
97  #define FM801_AC97_CMD		0x2a	/* AC'97 Command */
98  #define FM801_AC97_DATA		0x2c	/* AC'97 Data */
99  #define FM801_MPU401_DATA	0x30	/* MPU401 Data */
100  #define FM801_MPU401_CMD	0x31	/* MPU401 Command */
101  #define FM801_GPIO_CTRL		0x52	/* General Purpose I/O Control */
102  #define FM801_GEN_CTRL		0x54	/* General Control */
103  #define FM801_IRQ_MASK		0x56	/* Interrupt Mask */
104  #define FM801_IRQ_STATUS	0x5a	/* Interrupt Status */
105  #define FM801_OPL3_BANK0	0x68	/* OPL3 Status Read / Bank 0 Write */
106  #define FM801_OPL3_DATA0	0x69	/* OPL3 Data 0 Write */
107  #define FM801_OPL3_BANK1	0x6a	/* OPL3 Bank 1 Write */
108  #define FM801_OPL3_DATA1	0x6b	/* OPL3 Bank 1 Write */
109  #define FM801_POWERDOWN		0x70	/* Blocks Power Down Control */
110  
111  /* codec access */
112  #define FM801_AC97_READ		(1<<7)	/* read=1, write=0 */
113  #define FM801_AC97_VALID	(1<<8)	/* port valid=1 */
114  #define FM801_AC97_BUSY		(1<<9)	/* busy=1 */
115  #define FM801_AC97_ADDR_SHIFT	10	/* codec id (2bit) */
116  
117  /* playback and record control register bits */
118  #define FM801_BUF1_LAST		(1<<1)
119  #define FM801_BUF2_LAST		(1<<2)
120  #define FM801_START		(1<<5)
121  #define FM801_PAUSE		(1<<6)
122  #define FM801_IMMED_STOP	(1<<7)
123  #define FM801_RATE_SHIFT	8
124  #define FM801_RATE_MASK		(15 << FM801_RATE_SHIFT)
125  #define FM801_CHANNELS_4	(1<<12)	/* playback only */
126  #define FM801_CHANNELS_6	(2<<12)	/* playback only */
127  #define FM801_CHANNELS_6MS	(3<<12)	/* playback only */
128  #define FM801_CHANNELS_MASK	(3<<12)
129  #define FM801_16BIT		(1<<14)
130  #define FM801_STEREO		(1<<15)
131  
132  /* IRQ status bits */
133  #define FM801_IRQ_PLAYBACK	(1<<8)
134  #define FM801_IRQ_CAPTURE	(1<<9)
135  #define FM801_IRQ_VOLUME	(1<<14)
136  #define FM801_IRQ_MPU		(1<<15)
137  
138  /* GPIO control register */
139  #define FM801_GPIO_GP0		(1<<0)	/* read/write */
140  #define FM801_GPIO_GP1		(1<<1)
141  #define FM801_GPIO_GP2		(1<<2)
142  #define FM801_GPIO_GP3		(1<<3)
143  #define FM801_GPIO_GP(x)	(1<<(0+(x)))
144  #define FM801_GPIO_GD0		(1<<8)	/* directions: 1 = input, 0 = output*/
145  #define FM801_GPIO_GD1		(1<<9)
146  #define FM801_GPIO_GD2		(1<<10)
147  #define FM801_GPIO_GD3		(1<<11)
148  #define FM801_GPIO_GD(x)	(1<<(8+(x)))
149  #define FM801_GPIO_GS0		(1<<12)	/* function select: */
150  #define FM801_GPIO_GS1		(1<<13)	/*    1 = GPIO */
151  #define FM801_GPIO_GS2		(1<<14)	/*    0 = other (S/PDIF, VOL) */
152  #define FM801_GPIO_GS3		(1<<15)
153  #define FM801_GPIO_GS(x)	(1<<(12+(x)))
154  
155  /**
156   * struct fm801 - describes FM801 chip
157   * @port:		I/O port number
158   * @multichannel:	multichannel support
159   * @secondary:		secondary codec
160   * @secondary_addr:	address of the secondary codec
161   * @tea575x_tuner:	tuner access method & flags
162   * @ply_ctrl:		playback control
163   * @cap_ctrl:		capture control
164   */
165  struct fm801 {
166  	struct device *dev;
167  	int irq;
168  
169  	unsigned long port;
170  	unsigned int multichannel: 1,
171  		     secondary: 1;
172  	unsigned char secondary_addr;
173  	unsigned int tea575x_tuner;
174  
175  	unsigned short ply_ctrl;
176  	unsigned short cap_ctrl;
177  
178  	unsigned long ply_buffer;
179  	unsigned int ply_buf;
180  	unsigned int ply_count;
181  	unsigned int ply_size;
182  	unsigned int ply_pos;
183  
184  	unsigned long cap_buffer;
185  	unsigned int cap_buf;
186  	unsigned int cap_count;
187  	unsigned int cap_size;
188  	unsigned int cap_pos;
189  
190  	struct snd_ac97_bus *ac97_bus;
191  	struct snd_ac97 *ac97;
192  	struct snd_ac97 *ac97_sec;
193  
194  	struct snd_card *card;
195  	struct snd_pcm *pcm;
196  	struct snd_rawmidi *rmidi;
197  	struct snd_pcm_substream *playback_substream;
198  	struct snd_pcm_substream *capture_substream;
199  	unsigned int p_dma_size;
200  	unsigned int c_dma_size;
201  
202  	spinlock_t reg_lock;
203  	struct snd_info_entry *proc_entry;
204  
205  #ifdef CONFIG_SND_FM801_TEA575X_BOOL
206  	struct v4l2_device v4l2_dev;
207  	struct snd_tea575x tea;
208  #endif
209  
210  #ifdef CONFIG_PM_SLEEP
211  	u16 saved_regs[0x20];
212  #endif
213  };
214  
215  /*
216   * IO accessors
217   */
218  
fm801_iowrite16(struct fm801 * chip,unsigned short offset,u16 value)219  static inline void fm801_iowrite16(struct fm801 *chip, unsigned short offset, u16 value)
220  {
221  	outw(value, chip->port + offset);
222  }
223  
fm801_ioread16(struct fm801 * chip,unsigned short offset)224  static inline u16 fm801_ioread16(struct fm801 *chip, unsigned short offset)
225  {
226  	return inw(chip->port + offset);
227  }
228  
229  static const struct pci_device_id snd_fm801_ids[] = {
230  	{ 0x1319, 0x0801, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_MULTIMEDIA_AUDIO << 8, 0xffff00, 0, },   /* FM801 */
231  	{ 0x5213, 0x0510, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_MULTIMEDIA_AUDIO << 8, 0xffff00, 0, },   /* Gallant Odyssey Sound 4 */
232  	{ 0, }
233  };
234  
235  MODULE_DEVICE_TABLE(pci, snd_fm801_ids);
236  
237  /*
238   *  common I/O routines
239   */
240  
fm801_ac97_is_ready(struct fm801 * chip,unsigned int iterations)241  static bool fm801_ac97_is_ready(struct fm801 *chip, unsigned int iterations)
242  {
243  	unsigned int idx;
244  
245  	for (idx = 0; idx < iterations; idx++) {
246  		if (!(fm801_readw(chip, AC97_CMD) & FM801_AC97_BUSY))
247  			return true;
248  		udelay(10);
249  	}
250  	return false;
251  }
252  
fm801_ac97_is_valid(struct fm801 * chip,unsigned int iterations)253  static bool fm801_ac97_is_valid(struct fm801 *chip, unsigned int iterations)
254  {
255  	unsigned int idx;
256  
257  	for (idx = 0; idx < iterations; idx++) {
258  		if (fm801_readw(chip, AC97_CMD) & FM801_AC97_VALID)
259  			return true;
260  		udelay(10);
261  	}
262  	return false;
263  }
264  
snd_fm801_update_bits(struct fm801 * chip,unsigned short reg,unsigned short mask,unsigned short value)265  static int snd_fm801_update_bits(struct fm801 *chip, unsigned short reg,
266  				 unsigned short mask, unsigned short value)
267  {
268  	int change;
269  	unsigned long flags;
270  	unsigned short old, new;
271  
272  	spin_lock_irqsave(&chip->reg_lock, flags);
273  	old = fm801_ioread16(chip, reg);
274  	new = (old & ~mask) | value;
275  	change = old != new;
276  	if (change)
277  		fm801_iowrite16(chip, reg, new);
278  	spin_unlock_irqrestore(&chip->reg_lock, flags);
279  	return change;
280  }
281  
snd_fm801_codec_write(struct snd_ac97 * ac97,unsigned short reg,unsigned short val)282  static void snd_fm801_codec_write(struct snd_ac97 *ac97,
283  				  unsigned short reg,
284  				  unsigned short val)
285  {
286  	struct fm801 *chip = ac97->private_data;
287  
288  	/*
289  	 *  Wait until the codec interface is not ready..
290  	 */
291  	if (!fm801_ac97_is_ready(chip, 100)) {
292  		dev_err(chip->card->dev, "AC'97 interface is busy (1)\n");
293  		return;
294  	}
295  
296  	/* write data and address */
297  	fm801_writew(chip, AC97_DATA, val);
298  	fm801_writew(chip, AC97_CMD, reg | (ac97->addr << FM801_AC97_ADDR_SHIFT));
299  	/*
300  	 *  Wait until the write command is not completed..
301  	 */
302  	if (!fm801_ac97_is_ready(chip, 1000))
303  		dev_err(chip->card->dev, "AC'97 interface #%d is busy (2)\n",
304  		ac97->num);
305  }
306  
snd_fm801_codec_read(struct snd_ac97 * ac97,unsigned short reg)307  static unsigned short snd_fm801_codec_read(struct snd_ac97 *ac97, unsigned short reg)
308  {
309  	struct fm801 *chip = ac97->private_data;
310  
311  	/*
312  	 *  Wait until the codec interface is not ready..
313  	 */
314  	if (!fm801_ac97_is_ready(chip, 100)) {
315  		dev_err(chip->card->dev, "AC'97 interface is busy (1)\n");
316  		return 0;
317  	}
318  
319  	/* read command */
320  	fm801_writew(chip, AC97_CMD,
321  		     reg | (ac97->addr << FM801_AC97_ADDR_SHIFT) | FM801_AC97_READ);
322  	if (!fm801_ac97_is_ready(chip, 100)) {
323  		dev_err(chip->card->dev, "AC'97 interface #%d is busy (2)\n",
324  			ac97->num);
325  		return 0;
326  	}
327  
328  	if (!fm801_ac97_is_valid(chip, 1000)) {
329  		dev_err(chip->card->dev,
330  			"AC'97 interface #%d is not valid (2)\n", ac97->num);
331  		return 0;
332  	}
333  
334  	return fm801_readw(chip, AC97_DATA);
335  }
336  
337  static const unsigned int rates[] = {
338    5500,  8000,  9600, 11025,
339    16000, 19200, 22050, 32000,
340    38400, 44100, 48000
341  };
342  
343  static const struct snd_pcm_hw_constraint_list hw_constraints_rates = {
344  	.count = ARRAY_SIZE(rates),
345  	.list = rates,
346  	.mask = 0,
347  };
348  
349  static const unsigned int channels[] = {
350    2, 4, 6
351  };
352  
353  static const struct snd_pcm_hw_constraint_list hw_constraints_channels = {
354  	.count = ARRAY_SIZE(channels),
355  	.list = channels,
356  	.mask = 0,
357  };
358  
359  /*
360   *  Sample rate routines
361   */
362  
snd_fm801_rate_bits(unsigned int rate)363  static unsigned short snd_fm801_rate_bits(unsigned int rate)
364  {
365  	unsigned int idx;
366  
367  	for (idx = 0; idx < ARRAY_SIZE(rates); idx++)
368  		if (rates[idx] == rate)
369  			return idx;
370  	snd_BUG();
371  	return ARRAY_SIZE(rates) - 1;
372  }
373  
374  /*
375   *  PCM part
376   */
377  
snd_fm801_playback_trigger(struct snd_pcm_substream * substream,int cmd)378  static int snd_fm801_playback_trigger(struct snd_pcm_substream *substream,
379  				      int cmd)
380  {
381  	struct fm801 *chip = snd_pcm_substream_chip(substream);
382  
383  	spin_lock(&chip->reg_lock);
384  	switch (cmd) {
385  	case SNDRV_PCM_TRIGGER_START:
386  		chip->ply_ctrl &= ~(FM801_BUF1_LAST |
387  				     FM801_BUF2_LAST |
388  				     FM801_PAUSE);
389  		chip->ply_ctrl |= FM801_START |
390  				   FM801_IMMED_STOP;
391  		break;
392  	case SNDRV_PCM_TRIGGER_STOP:
393  		chip->ply_ctrl &= ~(FM801_START | FM801_PAUSE);
394  		break;
395  	case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
396  	case SNDRV_PCM_TRIGGER_SUSPEND:
397  		chip->ply_ctrl |= FM801_PAUSE;
398  		break;
399  	case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
400  	case SNDRV_PCM_TRIGGER_RESUME:
401  		chip->ply_ctrl &= ~FM801_PAUSE;
402  		break;
403  	default:
404  		spin_unlock(&chip->reg_lock);
405  		snd_BUG();
406  		return -EINVAL;
407  	}
408  	fm801_writew(chip, PLY_CTRL, chip->ply_ctrl);
409  	spin_unlock(&chip->reg_lock);
410  	return 0;
411  }
412  
snd_fm801_capture_trigger(struct snd_pcm_substream * substream,int cmd)413  static int snd_fm801_capture_trigger(struct snd_pcm_substream *substream,
414  				     int cmd)
415  {
416  	struct fm801 *chip = snd_pcm_substream_chip(substream);
417  
418  	spin_lock(&chip->reg_lock);
419  	switch (cmd) {
420  	case SNDRV_PCM_TRIGGER_START:
421  		chip->cap_ctrl &= ~(FM801_BUF1_LAST |
422  				     FM801_BUF2_LAST |
423  				     FM801_PAUSE);
424  		chip->cap_ctrl |= FM801_START |
425  				   FM801_IMMED_STOP;
426  		break;
427  	case SNDRV_PCM_TRIGGER_STOP:
428  		chip->cap_ctrl &= ~(FM801_START | FM801_PAUSE);
429  		break;
430  	case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
431  	case SNDRV_PCM_TRIGGER_SUSPEND:
432  		chip->cap_ctrl |= FM801_PAUSE;
433  		break;
434  	case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
435  	case SNDRV_PCM_TRIGGER_RESUME:
436  		chip->cap_ctrl &= ~FM801_PAUSE;
437  		break;
438  	default:
439  		spin_unlock(&chip->reg_lock);
440  		snd_BUG();
441  		return -EINVAL;
442  	}
443  	fm801_writew(chip, CAP_CTRL, chip->cap_ctrl);
444  	spin_unlock(&chip->reg_lock);
445  	return 0;
446  }
447  
snd_fm801_hw_params(struct snd_pcm_substream * substream,struct snd_pcm_hw_params * hw_params)448  static int snd_fm801_hw_params(struct snd_pcm_substream *substream,
449  			       struct snd_pcm_hw_params *hw_params)
450  {
451  	return snd_pcm_lib_malloc_pages(substream, params_buffer_bytes(hw_params));
452  }
453  
snd_fm801_hw_free(struct snd_pcm_substream * substream)454  static int snd_fm801_hw_free(struct snd_pcm_substream *substream)
455  {
456  	return snd_pcm_lib_free_pages(substream);
457  }
458  
snd_fm801_playback_prepare(struct snd_pcm_substream * substream)459  static int snd_fm801_playback_prepare(struct snd_pcm_substream *substream)
460  {
461  	struct fm801 *chip = snd_pcm_substream_chip(substream);
462  	struct snd_pcm_runtime *runtime = substream->runtime;
463  
464  	chip->ply_size = snd_pcm_lib_buffer_bytes(substream);
465  	chip->ply_count = snd_pcm_lib_period_bytes(substream);
466  	spin_lock_irq(&chip->reg_lock);
467  	chip->ply_ctrl &= ~(FM801_START | FM801_16BIT |
468  			     FM801_STEREO | FM801_RATE_MASK |
469  			     FM801_CHANNELS_MASK);
470  	if (snd_pcm_format_width(runtime->format) == 16)
471  		chip->ply_ctrl |= FM801_16BIT;
472  	if (runtime->channels > 1) {
473  		chip->ply_ctrl |= FM801_STEREO;
474  		if (runtime->channels == 4)
475  			chip->ply_ctrl |= FM801_CHANNELS_4;
476  		else if (runtime->channels == 6)
477  			chip->ply_ctrl |= FM801_CHANNELS_6;
478  	}
479  	chip->ply_ctrl |= snd_fm801_rate_bits(runtime->rate) << FM801_RATE_SHIFT;
480  	chip->ply_buf = 0;
481  	fm801_writew(chip, PLY_CTRL, chip->ply_ctrl);
482  	fm801_writew(chip, PLY_COUNT, chip->ply_count - 1);
483  	chip->ply_buffer = runtime->dma_addr;
484  	chip->ply_pos = 0;
485  	fm801_writel(chip, PLY_BUF1, chip->ply_buffer);
486  	fm801_writel(chip, PLY_BUF2,
487  		     chip->ply_buffer + (chip->ply_count % chip->ply_size));
488  	spin_unlock_irq(&chip->reg_lock);
489  	return 0;
490  }
491  
snd_fm801_capture_prepare(struct snd_pcm_substream * substream)492  static int snd_fm801_capture_prepare(struct snd_pcm_substream *substream)
493  {
494  	struct fm801 *chip = snd_pcm_substream_chip(substream);
495  	struct snd_pcm_runtime *runtime = substream->runtime;
496  
497  	chip->cap_size = snd_pcm_lib_buffer_bytes(substream);
498  	chip->cap_count = snd_pcm_lib_period_bytes(substream);
499  	spin_lock_irq(&chip->reg_lock);
500  	chip->cap_ctrl &= ~(FM801_START | FM801_16BIT |
501  			     FM801_STEREO | FM801_RATE_MASK);
502  	if (snd_pcm_format_width(runtime->format) == 16)
503  		chip->cap_ctrl |= FM801_16BIT;
504  	if (runtime->channels > 1)
505  		chip->cap_ctrl |= FM801_STEREO;
506  	chip->cap_ctrl |= snd_fm801_rate_bits(runtime->rate) << FM801_RATE_SHIFT;
507  	chip->cap_buf = 0;
508  	fm801_writew(chip, CAP_CTRL, chip->cap_ctrl);
509  	fm801_writew(chip, CAP_COUNT, chip->cap_count - 1);
510  	chip->cap_buffer = runtime->dma_addr;
511  	chip->cap_pos = 0;
512  	fm801_writel(chip, CAP_BUF1, chip->cap_buffer);
513  	fm801_writel(chip, CAP_BUF2,
514  		     chip->cap_buffer + (chip->cap_count % chip->cap_size));
515  	spin_unlock_irq(&chip->reg_lock);
516  	return 0;
517  }
518  
snd_fm801_playback_pointer(struct snd_pcm_substream * substream)519  static snd_pcm_uframes_t snd_fm801_playback_pointer(struct snd_pcm_substream *substream)
520  {
521  	struct fm801 *chip = snd_pcm_substream_chip(substream);
522  	size_t ptr;
523  
524  	if (!(chip->ply_ctrl & FM801_START))
525  		return 0;
526  	spin_lock(&chip->reg_lock);
527  	ptr = chip->ply_pos + (chip->ply_count - 1) - fm801_readw(chip, PLY_COUNT);
528  	if (fm801_readw(chip, IRQ_STATUS) & FM801_IRQ_PLAYBACK) {
529  		ptr += chip->ply_count;
530  		ptr %= chip->ply_size;
531  	}
532  	spin_unlock(&chip->reg_lock);
533  	return bytes_to_frames(substream->runtime, ptr);
534  }
535  
snd_fm801_capture_pointer(struct snd_pcm_substream * substream)536  static snd_pcm_uframes_t snd_fm801_capture_pointer(struct snd_pcm_substream *substream)
537  {
538  	struct fm801 *chip = snd_pcm_substream_chip(substream);
539  	size_t ptr;
540  
541  	if (!(chip->cap_ctrl & FM801_START))
542  		return 0;
543  	spin_lock(&chip->reg_lock);
544  	ptr = chip->cap_pos + (chip->cap_count - 1) - fm801_readw(chip, CAP_COUNT);
545  	if (fm801_readw(chip, IRQ_STATUS) & FM801_IRQ_CAPTURE) {
546  		ptr += chip->cap_count;
547  		ptr %= chip->cap_size;
548  	}
549  	spin_unlock(&chip->reg_lock);
550  	return bytes_to_frames(substream->runtime, ptr);
551  }
552  
snd_fm801_interrupt(int irq,void * dev_id)553  static irqreturn_t snd_fm801_interrupt(int irq, void *dev_id)
554  {
555  	struct fm801 *chip = dev_id;
556  	unsigned short status;
557  	unsigned int tmp;
558  
559  	status = fm801_readw(chip, IRQ_STATUS);
560  	status &= FM801_IRQ_PLAYBACK|FM801_IRQ_CAPTURE|FM801_IRQ_MPU|FM801_IRQ_VOLUME;
561  	if (! status)
562  		return IRQ_NONE;
563  	/* ack first */
564  	fm801_writew(chip, IRQ_STATUS, status);
565  	if (chip->pcm && (status & FM801_IRQ_PLAYBACK) && chip->playback_substream) {
566  		spin_lock(&chip->reg_lock);
567  		chip->ply_buf++;
568  		chip->ply_pos += chip->ply_count;
569  		chip->ply_pos %= chip->ply_size;
570  		tmp = chip->ply_pos + chip->ply_count;
571  		tmp %= chip->ply_size;
572  		if (chip->ply_buf & 1)
573  			fm801_writel(chip, PLY_BUF1, chip->ply_buffer + tmp);
574  		else
575  			fm801_writel(chip, PLY_BUF2, chip->ply_buffer + tmp);
576  		spin_unlock(&chip->reg_lock);
577  		snd_pcm_period_elapsed(chip->playback_substream);
578  	}
579  	if (chip->pcm && (status & FM801_IRQ_CAPTURE) && chip->capture_substream) {
580  		spin_lock(&chip->reg_lock);
581  		chip->cap_buf++;
582  		chip->cap_pos += chip->cap_count;
583  		chip->cap_pos %= chip->cap_size;
584  		tmp = chip->cap_pos + chip->cap_count;
585  		tmp %= chip->cap_size;
586  		if (chip->cap_buf & 1)
587  			fm801_writel(chip, CAP_BUF1, chip->cap_buffer + tmp);
588  		else
589  			fm801_writel(chip, CAP_BUF2, chip->cap_buffer + tmp);
590  		spin_unlock(&chip->reg_lock);
591  		snd_pcm_period_elapsed(chip->capture_substream);
592  	}
593  	if (chip->rmidi && (status & FM801_IRQ_MPU))
594  		snd_mpu401_uart_interrupt(irq, chip->rmidi->private_data);
595  	if (status & FM801_IRQ_VOLUME) {
596  		/* TODO */
597  	}
598  
599  	return IRQ_HANDLED;
600  }
601  
602  static const struct snd_pcm_hardware snd_fm801_playback =
603  {
604  	.info =			(SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED |
605  				 SNDRV_PCM_INFO_BLOCK_TRANSFER |
606  				 SNDRV_PCM_INFO_PAUSE | SNDRV_PCM_INFO_RESUME |
607  				 SNDRV_PCM_INFO_MMAP_VALID),
608  	.formats =		SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S16_LE,
609  	.rates =		SNDRV_PCM_RATE_KNOT | SNDRV_PCM_RATE_8000_48000,
610  	.rate_min =		5500,
611  	.rate_max =		48000,
612  	.channels_min =		1,
613  	.channels_max =		2,
614  	.buffer_bytes_max =	(128*1024),
615  	.period_bytes_min =	64,
616  	.period_bytes_max =	(128*1024),
617  	.periods_min =		1,
618  	.periods_max =		1024,
619  	.fifo_size =		0,
620  };
621  
622  static const struct snd_pcm_hardware snd_fm801_capture =
623  {
624  	.info =			(SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED |
625  				 SNDRV_PCM_INFO_BLOCK_TRANSFER |
626  				 SNDRV_PCM_INFO_PAUSE | SNDRV_PCM_INFO_RESUME |
627  				 SNDRV_PCM_INFO_MMAP_VALID),
628  	.formats =		SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S16_LE,
629  	.rates =		SNDRV_PCM_RATE_KNOT | SNDRV_PCM_RATE_8000_48000,
630  	.rate_min =		5500,
631  	.rate_max =		48000,
632  	.channels_min =		1,
633  	.channels_max =		2,
634  	.buffer_bytes_max =	(128*1024),
635  	.period_bytes_min =	64,
636  	.period_bytes_max =	(128*1024),
637  	.periods_min =		1,
638  	.periods_max =		1024,
639  	.fifo_size =		0,
640  };
641  
snd_fm801_playback_open(struct snd_pcm_substream * substream)642  static int snd_fm801_playback_open(struct snd_pcm_substream *substream)
643  {
644  	struct fm801 *chip = snd_pcm_substream_chip(substream);
645  	struct snd_pcm_runtime *runtime = substream->runtime;
646  	int err;
647  
648  	chip->playback_substream = substream;
649  	runtime->hw = snd_fm801_playback;
650  	snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_RATE,
651  				   &hw_constraints_rates);
652  	if (chip->multichannel) {
653  		runtime->hw.channels_max = 6;
654  		snd_pcm_hw_constraint_list(runtime, 0,
655  					   SNDRV_PCM_HW_PARAM_CHANNELS,
656  					   &hw_constraints_channels);
657  	}
658  	if ((err = snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS)) < 0)
659  		return err;
660  	return 0;
661  }
662  
snd_fm801_capture_open(struct snd_pcm_substream * substream)663  static int snd_fm801_capture_open(struct snd_pcm_substream *substream)
664  {
665  	struct fm801 *chip = snd_pcm_substream_chip(substream);
666  	struct snd_pcm_runtime *runtime = substream->runtime;
667  	int err;
668  
669  	chip->capture_substream = substream;
670  	runtime->hw = snd_fm801_capture;
671  	snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_RATE,
672  				   &hw_constraints_rates);
673  	if ((err = snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS)) < 0)
674  		return err;
675  	return 0;
676  }
677  
snd_fm801_playback_close(struct snd_pcm_substream * substream)678  static int snd_fm801_playback_close(struct snd_pcm_substream *substream)
679  {
680  	struct fm801 *chip = snd_pcm_substream_chip(substream);
681  
682  	chip->playback_substream = NULL;
683  	return 0;
684  }
685  
snd_fm801_capture_close(struct snd_pcm_substream * substream)686  static int snd_fm801_capture_close(struct snd_pcm_substream *substream)
687  {
688  	struct fm801 *chip = snd_pcm_substream_chip(substream);
689  
690  	chip->capture_substream = NULL;
691  	return 0;
692  }
693  
694  static const struct snd_pcm_ops snd_fm801_playback_ops = {
695  	.open =		snd_fm801_playback_open,
696  	.close =	snd_fm801_playback_close,
697  	.ioctl =	snd_pcm_lib_ioctl,
698  	.hw_params =	snd_fm801_hw_params,
699  	.hw_free =	snd_fm801_hw_free,
700  	.prepare =	snd_fm801_playback_prepare,
701  	.trigger =	snd_fm801_playback_trigger,
702  	.pointer =	snd_fm801_playback_pointer,
703  };
704  
705  static const struct snd_pcm_ops snd_fm801_capture_ops = {
706  	.open =		snd_fm801_capture_open,
707  	.close =	snd_fm801_capture_close,
708  	.ioctl =	snd_pcm_lib_ioctl,
709  	.hw_params =	snd_fm801_hw_params,
710  	.hw_free =	snd_fm801_hw_free,
711  	.prepare =	snd_fm801_capture_prepare,
712  	.trigger =	snd_fm801_capture_trigger,
713  	.pointer =	snd_fm801_capture_pointer,
714  };
715  
snd_fm801_pcm(struct fm801 * chip,int device)716  static int snd_fm801_pcm(struct fm801 *chip, int device)
717  {
718  	struct pci_dev *pdev = to_pci_dev(chip->dev);
719  	struct snd_pcm *pcm;
720  	int err;
721  
722  	if ((err = snd_pcm_new(chip->card, "FM801", device, 1, 1, &pcm)) < 0)
723  		return err;
724  
725  	snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &snd_fm801_playback_ops);
726  	snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &snd_fm801_capture_ops);
727  
728  	pcm->private_data = chip;
729  	pcm->info_flags = 0;
730  	strcpy(pcm->name, "FM801");
731  	chip->pcm = pcm;
732  
733  	snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV,
734  					      snd_dma_pci_data(pdev),
735  					      chip->multichannel ? 128*1024 : 64*1024, 128*1024);
736  
737  	return snd_pcm_add_chmap_ctls(pcm, SNDRV_PCM_STREAM_PLAYBACK,
738  				     snd_pcm_alt_chmaps,
739  				     chip->multichannel ? 6 : 2, 0,
740  				     NULL);
741  }
742  
743  /*
744   *  TEA5757 radio
745   */
746  
747  #ifdef CONFIG_SND_FM801_TEA575X_BOOL
748  
749  /* GPIO to TEA575x maps */
750  struct snd_fm801_tea575x_gpio {
751  	u8 data, clk, wren, most;
752  	char *name;
753  };
754  
755  static struct snd_fm801_tea575x_gpio snd_fm801_tea575x_gpios[] = {
756  	{ .data = 1, .clk = 3, .wren = 2, .most = 0, .name = "SF256-PCS" },
757  	{ .data = 1, .clk = 0, .wren = 2, .most = 3, .name = "SF256-PCP" },
758  	{ .data = 2, .clk = 0, .wren = 1, .most = 3, .name = "SF64-PCR" },
759  };
760  
761  #define get_tea575x_gpio(chip) \
762  	(&snd_fm801_tea575x_gpios[((chip)->tea575x_tuner & TUNER_TYPE_MASK) - 1])
763  
snd_fm801_tea575x_set_pins(struct snd_tea575x * tea,u8 pins)764  static void snd_fm801_tea575x_set_pins(struct snd_tea575x *tea, u8 pins)
765  {
766  	struct fm801 *chip = tea->private_data;
767  	unsigned short reg = fm801_readw(chip, GPIO_CTRL);
768  	struct snd_fm801_tea575x_gpio gpio = *get_tea575x_gpio(chip);
769  
770  	reg &= ~(FM801_GPIO_GP(gpio.data) |
771  		 FM801_GPIO_GP(gpio.clk) |
772  		 FM801_GPIO_GP(gpio.wren));
773  
774  	reg |= (pins & TEA575X_DATA) ? FM801_GPIO_GP(gpio.data) : 0;
775  	reg |= (pins & TEA575X_CLK)  ? FM801_GPIO_GP(gpio.clk) : 0;
776  	/* WRITE_ENABLE is inverted */
777  	reg |= (pins & TEA575X_WREN) ? 0 : FM801_GPIO_GP(gpio.wren);
778  
779  	fm801_writew(chip, GPIO_CTRL, reg);
780  }
781  
snd_fm801_tea575x_get_pins(struct snd_tea575x * tea)782  static u8 snd_fm801_tea575x_get_pins(struct snd_tea575x *tea)
783  {
784  	struct fm801 *chip = tea->private_data;
785  	unsigned short reg = fm801_readw(chip, GPIO_CTRL);
786  	struct snd_fm801_tea575x_gpio gpio = *get_tea575x_gpio(chip);
787  	u8 ret;
788  
789  	ret = 0;
790  	if (reg & FM801_GPIO_GP(gpio.data))
791  		ret |= TEA575X_DATA;
792  	if (reg & FM801_GPIO_GP(gpio.most))
793  		ret |= TEA575X_MOST;
794  	return ret;
795  }
796  
snd_fm801_tea575x_set_direction(struct snd_tea575x * tea,bool output)797  static void snd_fm801_tea575x_set_direction(struct snd_tea575x *tea, bool output)
798  {
799  	struct fm801 *chip = tea->private_data;
800  	unsigned short reg = fm801_readw(chip, GPIO_CTRL);
801  	struct snd_fm801_tea575x_gpio gpio = *get_tea575x_gpio(chip);
802  
803  	/* use GPIO lines and set write enable bit */
804  	reg |= FM801_GPIO_GS(gpio.data) |
805  	       FM801_GPIO_GS(gpio.wren) |
806  	       FM801_GPIO_GS(gpio.clk) |
807  	       FM801_GPIO_GS(gpio.most);
808  	if (output) {
809  		/* all of lines are in the write direction */
810  		/* clear data and clock lines */
811  		reg &= ~(FM801_GPIO_GD(gpio.data) |
812  			 FM801_GPIO_GD(gpio.wren) |
813  			 FM801_GPIO_GD(gpio.clk) |
814  			 FM801_GPIO_GP(gpio.data) |
815  			 FM801_GPIO_GP(gpio.clk) |
816  			 FM801_GPIO_GP(gpio.wren));
817  	} else {
818  		/* use GPIO lines, set data direction to input */
819  		reg |= FM801_GPIO_GD(gpio.data) |
820  		       FM801_GPIO_GD(gpio.most) |
821  		       FM801_GPIO_GP(gpio.data) |
822  		       FM801_GPIO_GP(gpio.most) |
823  		       FM801_GPIO_GP(gpio.wren);
824  		/* all of lines are in the write direction, except data */
825  		/* clear data, write enable and clock lines */
826  		reg &= ~(FM801_GPIO_GD(gpio.wren) |
827  			 FM801_GPIO_GD(gpio.clk) |
828  			 FM801_GPIO_GP(gpio.clk));
829  	}
830  
831  	fm801_writew(chip, GPIO_CTRL, reg);
832  }
833  
834  static const struct snd_tea575x_ops snd_fm801_tea_ops = {
835  	.set_pins = snd_fm801_tea575x_set_pins,
836  	.get_pins = snd_fm801_tea575x_get_pins,
837  	.set_direction = snd_fm801_tea575x_set_direction,
838  };
839  #endif
840  
841  /*
842   *  Mixer routines
843   */
844  
845  #define FM801_SINGLE(xname, reg, shift, mask, invert) \
846  { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .info = snd_fm801_info_single, \
847    .get = snd_fm801_get_single, .put = snd_fm801_put_single, \
848    .private_value = reg | (shift << 8) | (mask << 16) | (invert << 24) }
849  
snd_fm801_info_single(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_info * uinfo)850  static int snd_fm801_info_single(struct snd_kcontrol *kcontrol,
851  				 struct snd_ctl_elem_info *uinfo)
852  {
853  	int mask = (kcontrol->private_value >> 16) & 0xff;
854  
855  	uinfo->type = mask == 1 ? SNDRV_CTL_ELEM_TYPE_BOOLEAN : SNDRV_CTL_ELEM_TYPE_INTEGER;
856  	uinfo->count = 1;
857  	uinfo->value.integer.min = 0;
858  	uinfo->value.integer.max = mask;
859  	return 0;
860  }
861  
snd_fm801_get_single(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)862  static int snd_fm801_get_single(struct snd_kcontrol *kcontrol,
863  				struct snd_ctl_elem_value *ucontrol)
864  {
865  	struct fm801 *chip = snd_kcontrol_chip(kcontrol);
866  	int reg = kcontrol->private_value & 0xff;
867  	int shift = (kcontrol->private_value >> 8) & 0xff;
868  	int mask = (kcontrol->private_value >> 16) & 0xff;
869  	int invert = (kcontrol->private_value >> 24) & 0xff;
870  	long *value = ucontrol->value.integer.value;
871  
872  	value[0] = (fm801_ioread16(chip, reg) >> shift) & mask;
873  	if (invert)
874  		value[0] = mask - value[0];
875  	return 0;
876  }
877  
snd_fm801_put_single(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)878  static int snd_fm801_put_single(struct snd_kcontrol *kcontrol,
879  				struct snd_ctl_elem_value *ucontrol)
880  {
881  	struct fm801 *chip = snd_kcontrol_chip(kcontrol);
882  	int reg = kcontrol->private_value & 0xff;
883  	int shift = (kcontrol->private_value >> 8) & 0xff;
884  	int mask = (kcontrol->private_value >> 16) & 0xff;
885  	int invert = (kcontrol->private_value >> 24) & 0xff;
886  	unsigned short val;
887  
888  	val = (ucontrol->value.integer.value[0] & mask);
889  	if (invert)
890  		val = mask - val;
891  	return snd_fm801_update_bits(chip, reg, mask << shift, val << shift);
892  }
893  
894  #define FM801_DOUBLE(xname, reg, shift_left, shift_right, mask, invert) \
895  { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .info = snd_fm801_info_double, \
896    .get = snd_fm801_get_double, .put = snd_fm801_put_double, \
897    .private_value = reg | (shift_left << 8) | (shift_right << 12) | (mask << 16) | (invert << 24) }
898  #define FM801_DOUBLE_TLV(xname, reg, shift_left, shift_right, mask, invert, xtlv) \
899  { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
900    .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_TLV_READ, \
901    .name = xname, .info = snd_fm801_info_double, \
902    .get = snd_fm801_get_double, .put = snd_fm801_put_double, \
903    .private_value = reg | (shift_left << 8) | (shift_right << 12) | (mask << 16) | (invert << 24), \
904    .tlv = { .p = (xtlv) } }
905  
snd_fm801_info_double(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_info * uinfo)906  static int snd_fm801_info_double(struct snd_kcontrol *kcontrol,
907  				 struct snd_ctl_elem_info *uinfo)
908  {
909  	int mask = (kcontrol->private_value >> 16) & 0xff;
910  
911  	uinfo->type = mask == 1 ? SNDRV_CTL_ELEM_TYPE_BOOLEAN : SNDRV_CTL_ELEM_TYPE_INTEGER;
912  	uinfo->count = 2;
913  	uinfo->value.integer.min = 0;
914  	uinfo->value.integer.max = mask;
915  	return 0;
916  }
917  
snd_fm801_get_double(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)918  static int snd_fm801_get_double(struct snd_kcontrol *kcontrol,
919  				struct snd_ctl_elem_value *ucontrol)
920  {
921  	struct fm801 *chip = snd_kcontrol_chip(kcontrol);
922          int reg = kcontrol->private_value & 0xff;
923  	int shift_left = (kcontrol->private_value >> 8) & 0x0f;
924  	int shift_right = (kcontrol->private_value >> 12) & 0x0f;
925  	int mask = (kcontrol->private_value >> 16) & 0xff;
926  	int invert = (kcontrol->private_value >> 24) & 0xff;
927  	long *value = ucontrol->value.integer.value;
928  
929  	spin_lock_irq(&chip->reg_lock);
930  	value[0] = (fm801_ioread16(chip, reg) >> shift_left) & mask;
931  	value[1] = (fm801_ioread16(chip, reg) >> shift_right) & mask;
932  	spin_unlock_irq(&chip->reg_lock);
933  	if (invert) {
934  		value[0] = mask - value[0];
935  		value[1] = mask - value[1];
936  	}
937  	return 0;
938  }
939  
snd_fm801_put_double(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)940  static int snd_fm801_put_double(struct snd_kcontrol *kcontrol,
941  				struct snd_ctl_elem_value *ucontrol)
942  {
943  	struct fm801 *chip = snd_kcontrol_chip(kcontrol);
944  	int reg = kcontrol->private_value & 0xff;
945  	int shift_left = (kcontrol->private_value >> 8) & 0x0f;
946  	int shift_right = (kcontrol->private_value >> 12) & 0x0f;
947  	int mask = (kcontrol->private_value >> 16) & 0xff;
948  	int invert = (kcontrol->private_value >> 24) & 0xff;
949  	unsigned short val1, val2;
950  
951  	val1 = ucontrol->value.integer.value[0] & mask;
952  	val2 = ucontrol->value.integer.value[1] & mask;
953  	if (invert) {
954  		val1 = mask - val1;
955  		val2 = mask - val2;
956  	}
957  	return snd_fm801_update_bits(chip, reg,
958  				     (mask << shift_left) | (mask << shift_right),
959  				     (val1 << shift_left ) | (val2 << shift_right));
960  }
961  
snd_fm801_info_mux(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_info * uinfo)962  static int snd_fm801_info_mux(struct snd_kcontrol *kcontrol,
963  			      struct snd_ctl_elem_info *uinfo)
964  {
965  	static const char * const texts[5] = {
966  		"AC97 Primary", "FM", "I2S", "PCM", "AC97 Secondary"
967  	};
968  
969  	return snd_ctl_enum_info(uinfo, 1, 5, texts);
970  }
971  
snd_fm801_get_mux(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)972  static int snd_fm801_get_mux(struct snd_kcontrol *kcontrol,
973  			     struct snd_ctl_elem_value *ucontrol)
974  {
975  	struct fm801 *chip = snd_kcontrol_chip(kcontrol);
976          unsigned short val;
977  
978  	val = fm801_readw(chip, REC_SRC) & 7;
979  	if (val > 4)
980  		val = 4;
981          ucontrol->value.enumerated.item[0] = val;
982          return 0;
983  }
984  
snd_fm801_put_mux(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)985  static int snd_fm801_put_mux(struct snd_kcontrol *kcontrol,
986  			     struct snd_ctl_elem_value *ucontrol)
987  {
988  	struct fm801 *chip = snd_kcontrol_chip(kcontrol);
989          unsigned short val;
990  
991          if ((val = ucontrol->value.enumerated.item[0]) > 4)
992                  return -EINVAL;
993  	return snd_fm801_update_bits(chip, FM801_REC_SRC, 7, val);
994  }
995  
996  static const DECLARE_TLV_DB_SCALE(db_scale_dsp, -3450, 150, 0);
997  
998  #define FM801_CONTROLS ARRAY_SIZE(snd_fm801_controls)
999  
1000  static struct snd_kcontrol_new snd_fm801_controls[] = {
1001  FM801_DOUBLE_TLV("Wave Playback Volume", FM801_PCM_VOL, 0, 8, 31, 1,
1002  		 db_scale_dsp),
1003  FM801_SINGLE("Wave Playback Switch", FM801_PCM_VOL, 15, 1, 1),
1004  FM801_DOUBLE_TLV("I2S Playback Volume", FM801_I2S_VOL, 0, 8, 31, 1,
1005  		 db_scale_dsp),
1006  FM801_SINGLE("I2S Playback Switch", FM801_I2S_VOL, 15, 1, 1),
1007  FM801_DOUBLE_TLV("FM Playback Volume", FM801_FM_VOL, 0, 8, 31, 1,
1008  		 db_scale_dsp),
1009  FM801_SINGLE("FM Playback Switch", FM801_FM_VOL, 15, 1, 1),
1010  {
1011  	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1012  	.name = "Digital Capture Source",
1013  	.info = snd_fm801_info_mux,
1014  	.get = snd_fm801_get_mux,
1015  	.put = snd_fm801_put_mux,
1016  }
1017  };
1018  
1019  #define FM801_CONTROLS_MULTI ARRAY_SIZE(snd_fm801_controls_multi)
1020  
1021  static struct snd_kcontrol_new snd_fm801_controls_multi[] = {
1022  FM801_SINGLE("AC97 2ch->4ch Copy Switch", FM801_CODEC_CTRL, 7, 1, 0),
1023  FM801_SINGLE("AC97 18-bit Switch", FM801_CODEC_CTRL, 10, 1, 0),
1024  FM801_SINGLE(SNDRV_CTL_NAME_IEC958("",CAPTURE,SWITCH), FM801_I2S_MODE, 8, 1, 0),
1025  FM801_SINGLE(SNDRV_CTL_NAME_IEC958("Raw Data ",PLAYBACK,SWITCH), FM801_I2S_MODE, 9, 1, 0),
1026  FM801_SINGLE(SNDRV_CTL_NAME_IEC958("Raw Data ",CAPTURE,SWITCH), FM801_I2S_MODE, 10, 1, 0),
1027  FM801_SINGLE(SNDRV_CTL_NAME_IEC958("",PLAYBACK,SWITCH), FM801_GEN_CTRL, 2, 1, 0),
1028  };
1029  
snd_fm801_mixer_free_ac97_bus(struct snd_ac97_bus * bus)1030  static void snd_fm801_mixer_free_ac97_bus(struct snd_ac97_bus *bus)
1031  {
1032  	struct fm801 *chip = bus->private_data;
1033  	chip->ac97_bus = NULL;
1034  }
1035  
snd_fm801_mixer_free_ac97(struct snd_ac97 * ac97)1036  static void snd_fm801_mixer_free_ac97(struct snd_ac97 *ac97)
1037  {
1038  	struct fm801 *chip = ac97->private_data;
1039  	if (ac97->num == 0) {
1040  		chip->ac97 = NULL;
1041  	} else {
1042  		chip->ac97_sec = NULL;
1043  	}
1044  }
1045  
snd_fm801_mixer(struct fm801 * chip)1046  static int snd_fm801_mixer(struct fm801 *chip)
1047  {
1048  	struct snd_ac97_template ac97;
1049  	unsigned int i;
1050  	int err;
1051  	static struct snd_ac97_bus_ops ops = {
1052  		.write = snd_fm801_codec_write,
1053  		.read = snd_fm801_codec_read,
1054  	};
1055  
1056  	if ((err = snd_ac97_bus(chip->card, 0, &ops, chip, &chip->ac97_bus)) < 0)
1057  		return err;
1058  	chip->ac97_bus->private_free = snd_fm801_mixer_free_ac97_bus;
1059  
1060  	memset(&ac97, 0, sizeof(ac97));
1061  	ac97.private_data = chip;
1062  	ac97.private_free = snd_fm801_mixer_free_ac97;
1063  	if ((err = snd_ac97_mixer(chip->ac97_bus, &ac97, &chip->ac97)) < 0)
1064  		return err;
1065  	if (chip->secondary) {
1066  		ac97.num = 1;
1067  		ac97.addr = chip->secondary_addr;
1068  		if ((err = snd_ac97_mixer(chip->ac97_bus, &ac97, &chip->ac97_sec)) < 0)
1069  			return err;
1070  	}
1071  	for (i = 0; i < FM801_CONTROLS; i++) {
1072  		err = snd_ctl_add(chip->card,
1073  			snd_ctl_new1(&snd_fm801_controls[i], chip));
1074  		if (err < 0)
1075  			return err;
1076  	}
1077  	if (chip->multichannel) {
1078  		for (i = 0; i < FM801_CONTROLS_MULTI; i++) {
1079  			err = snd_ctl_add(chip->card,
1080  				snd_ctl_new1(&snd_fm801_controls_multi[i], chip));
1081  			if (err < 0)
1082  				return err;
1083  		}
1084  	}
1085  	return 0;
1086  }
1087  
1088  /*
1089   *  initialization routines
1090   */
1091  
wait_for_codec(struct fm801 * chip,unsigned int codec_id,unsigned short reg,unsigned long waits)1092  static int wait_for_codec(struct fm801 *chip, unsigned int codec_id,
1093  			  unsigned short reg, unsigned long waits)
1094  {
1095  	unsigned long timeout = jiffies + waits;
1096  
1097  	fm801_writew(chip, AC97_CMD,
1098  		     reg | (codec_id << FM801_AC97_ADDR_SHIFT) | FM801_AC97_READ);
1099  	udelay(5);
1100  	do {
1101  		if ((fm801_readw(chip, AC97_CMD) &
1102  		     (FM801_AC97_VALID | FM801_AC97_BUSY)) == FM801_AC97_VALID)
1103  			return 0;
1104  		schedule_timeout_uninterruptible(1);
1105  	} while (time_after(timeout, jiffies));
1106  	return -EIO;
1107  }
1108  
reset_codec(struct fm801 * chip)1109  static int reset_codec(struct fm801 *chip)
1110  {
1111  	/* codec cold reset + AC'97 warm reset */
1112  	fm801_writew(chip, CODEC_CTRL, (1 << 5) | (1 << 6));
1113  	fm801_readw(chip, CODEC_CTRL); /* flush posting data */
1114  	udelay(100);
1115  	fm801_writew(chip, CODEC_CTRL, 0);
1116  
1117  	return wait_for_codec(chip, 0, AC97_RESET, msecs_to_jiffies(750));
1118  }
1119  
snd_fm801_chip_multichannel_init(struct fm801 * chip)1120  static void snd_fm801_chip_multichannel_init(struct fm801 *chip)
1121  {
1122  	unsigned short cmdw;
1123  
1124  	if (chip->multichannel) {
1125  		if (chip->secondary_addr) {
1126  			wait_for_codec(chip, chip->secondary_addr,
1127  				       AC97_VENDOR_ID1, msecs_to_jiffies(50));
1128  		} else {
1129  			/* my card has the secondary codec */
1130  			/* at address #3, so the loop is inverted */
1131  			int i;
1132  			for (i = 3; i > 0; i--) {
1133  				if (!wait_for_codec(chip, i, AC97_VENDOR_ID1,
1134  						     msecs_to_jiffies(50))) {
1135  					cmdw = fm801_readw(chip, AC97_DATA);
1136  					if (cmdw != 0xffff && cmdw != 0) {
1137  						chip->secondary = 1;
1138  						chip->secondary_addr = i;
1139  						break;
1140  					}
1141  				}
1142  			}
1143  		}
1144  
1145  		/* the recovery phase, it seems that probing for non-existing codec might */
1146  		/* cause timeout problems */
1147  		wait_for_codec(chip, 0, AC97_VENDOR_ID1, msecs_to_jiffies(750));
1148  	}
1149  }
1150  
snd_fm801_chip_init(struct fm801 * chip)1151  static void snd_fm801_chip_init(struct fm801 *chip)
1152  {
1153  	unsigned short cmdw;
1154  
1155  	/* init volume */
1156  	fm801_writew(chip, PCM_VOL, 0x0808);
1157  	fm801_writew(chip, FM_VOL, 0x9f1f);
1158  	fm801_writew(chip, I2S_VOL, 0x8808);
1159  
1160  	/* I2S control - I2S mode */
1161  	fm801_writew(chip, I2S_MODE, 0x0003);
1162  
1163  	/* interrupt setup */
1164  	cmdw = fm801_readw(chip, IRQ_MASK);
1165  	if (chip->irq < 0)
1166  		cmdw |= 0x00c3;		/* mask everything, no PCM nor MPU */
1167  	else
1168  		cmdw &= ~0x0083;	/* unmask MPU, PLAYBACK & CAPTURE */
1169  	fm801_writew(chip, IRQ_MASK, cmdw);
1170  
1171  	/* interrupt clear */
1172  	fm801_writew(chip, IRQ_STATUS,
1173  		     FM801_IRQ_PLAYBACK | FM801_IRQ_CAPTURE | FM801_IRQ_MPU);
1174  }
1175  
snd_fm801_free(struct fm801 * chip)1176  static int snd_fm801_free(struct fm801 *chip)
1177  {
1178  	unsigned short cmdw;
1179  
1180  	if (chip->irq < 0)
1181  		goto __end_hw;
1182  
1183  	/* interrupt setup - mask everything */
1184  	cmdw = fm801_readw(chip, IRQ_MASK);
1185  	cmdw |= 0x00c3;
1186  	fm801_writew(chip, IRQ_MASK, cmdw);
1187  
1188  	devm_free_irq(chip->dev, chip->irq, chip);
1189  
1190        __end_hw:
1191  #ifdef CONFIG_SND_FM801_TEA575X_BOOL
1192  	if (!(chip->tea575x_tuner & TUNER_DISABLED)) {
1193  		snd_tea575x_exit(&chip->tea);
1194  		v4l2_device_unregister(&chip->v4l2_dev);
1195  	}
1196  #endif
1197  	return 0;
1198  }
1199  
snd_fm801_dev_free(struct snd_device * device)1200  static int snd_fm801_dev_free(struct snd_device *device)
1201  {
1202  	struct fm801 *chip = device->device_data;
1203  	return snd_fm801_free(chip);
1204  }
1205  
snd_fm801_create(struct snd_card * card,struct pci_dev * pci,int tea575x_tuner,int radio_nr,struct fm801 ** rchip)1206  static int snd_fm801_create(struct snd_card *card,
1207  			    struct pci_dev *pci,
1208  			    int tea575x_tuner,
1209  			    int radio_nr,
1210  			    struct fm801 **rchip)
1211  {
1212  	struct fm801 *chip;
1213  	int err;
1214  	static struct snd_device_ops ops = {
1215  		.dev_free =	snd_fm801_dev_free,
1216  	};
1217  
1218  	*rchip = NULL;
1219  	if ((err = pcim_enable_device(pci)) < 0)
1220  		return err;
1221  	chip = devm_kzalloc(&pci->dev, sizeof(*chip), GFP_KERNEL);
1222  	if (chip == NULL)
1223  		return -ENOMEM;
1224  	spin_lock_init(&chip->reg_lock);
1225  	chip->card = card;
1226  	chip->dev = &pci->dev;
1227  	chip->irq = -1;
1228  	chip->tea575x_tuner = tea575x_tuner;
1229  	if ((err = pci_request_regions(pci, "FM801")) < 0)
1230  		return err;
1231  	chip->port = pci_resource_start(pci, 0);
1232  
1233  	if (pci->revision >= 0xb1)	/* FM801-AU */
1234  		chip->multichannel = 1;
1235  
1236  	if (!(chip->tea575x_tuner & TUNER_ONLY)) {
1237  		if (reset_codec(chip) < 0) {
1238  			dev_info(chip->card->dev,
1239  				 "Primary AC'97 codec not found, assume SF64-PCR (tuner-only)\n");
1240  			chip->tea575x_tuner = 3 | TUNER_ONLY;
1241  		} else {
1242  			snd_fm801_chip_multichannel_init(chip);
1243  		}
1244  	}
1245  
1246  	if ((chip->tea575x_tuner & TUNER_ONLY) == 0) {
1247  		if (devm_request_irq(&pci->dev, pci->irq, snd_fm801_interrupt,
1248  				IRQF_SHARED, KBUILD_MODNAME, chip)) {
1249  			dev_err(card->dev, "unable to grab IRQ %d\n", pci->irq);
1250  			snd_fm801_free(chip);
1251  			return -EBUSY;
1252  		}
1253  		chip->irq = pci->irq;
1254  		pci_set_master(pci);
1255  	}
1256  
1257  	snd_fm801_chip_init(chip);
1258  
1259  	if ((err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops)) < 0) {
1260  		snd_fm801_free(chip);
1261  		return err;
1262  	}
1263  
1264  #ifdef CONFIG_SND_FM801_TEA575X_BOOL
1265  	err = v4l2_device_register(&pci->dev, &chip->v4l2_dev);
1266  	if (err < 0) {
1267  		snd_fm801_free(chip);
1268  		return err;
1269  	}
1270  	chip->tea.v4l2_dev = &chip->v4l2_dev;
1271  	chip->tea.radio_nr = radio_nr;
1272  	chip->tea.private_data = chip;
1273  	chip->tea.ops = &snd_fm801_tea_ops;
1274  	sprintf(chip->tea.bus_info, "PCI:%s", pci_name(pci));
1275  	if ((chip->tea575x_tuner & TUNER_TYPE_MASK) > 0 &&
1276  	    (chip->tea575x_tuner & TUNER_TYPE_MASK) < 4) {
1277  		if (snd_tea575x_init(&chip->tea, THIS_MODULE)) {
1278  			dev_err(card->dev, "TEA575x radio not found\n");
1279  			snd_fm801_free(chip);
1280  			return -ENODEV;
1281  		}
1282  	} else if ((chip->tea575x_tuner & TUNER_TYPE_MASK) == 0) {
1283  		unsigned int tuner_only = chip->tea575x_tuner & TUNER_ONLY;
1284  
1285  		/* autodetect tuner connection */
1286  		for (tea575x_tuner = 1; tea575x_tuner <= 3; tea575x_tuner++) {
1287  			chip->tea575x_tuner = tea575x_tuner;
1288  			if (!snd_tea575x_init(&chip->tea, THIS_MODULE)) {
1289  				dev_info(card->dev,
1290  					 "detected TEA575x radio type %s\n",
1291  					   get_tea575x_gpio(chip)->name);
1292  				break;
1293  			}
1294  		}
1295  		if (tea575x_tuner == 4) {
1296  			dev_err(card->dev, "TEA575x radio not found\n");
1297  			chip->tea575x_tuner = TUNER_DISABLED;
1298  		}
1299  
1300  		chip->tea575x_tuner |= tuner_only;
1301  	}
1302  	if (!(chip->tea575x_tuner & TUNER_DISABLED)) {
1303  		strlcpy(chip->tea.card, get_tea575x_gpio(chip)->name,
1304  			sizeof(chip->tea.card));
1305  	}
1306  #endif
1307  
1308  	*rchip = chip;
1309  	return 0;
1310  }
1311  
snd_card_fm801_probe(struct pci_dev * pci,const struct pci_device_id * pci_id)1312  static int snd_card_fm801_probe(struct pci_dev *pci,
1313  				const struct pci_device_id *pci_id)
1314  {
1315  	static int dev;
1316  	struct snd_card *card;
1317  	struct fm801 *chip;
1318  	struct snd_opl3 *opl3;
1319  	int err;
1320  
1321          if (dev >= SNDRV_CARDS)
1322                  return -ENODEV;
1323  	if (!enable[dev]) {
1324  		dev++;
1325  		return -ENOENT;
1326  	}
1327  
1328  	err = snd_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE,
1329  			   0, &card);
1330  	if (err < 0)
1331  		return err;
1332  	if ((err = snd_fm801_create(card, pci, tea575x_tuner[dev], radio_nr[dev], &chip)) < 0) {
1333  		snd_card_free(card);
1334  		return err;
1335  	}
1336  	card->private_data = chip;
1337  
1338  	strcpy(card->driver, "FM801");
1339  	strcpy(card->shortname, "ForteMedia FM801-");
1340  	strcat(card->shortname, chip->multichannel ? "AU" : "AS");
1341  	sprintf(card->longname, "%s at 0x%lx, irq %i",
1342  		card->shortname, chip->port, chip->irq);
1343  
1344  	if (chip->tea575x_tuner & TUNER_ONLY)
1345  		goto __fm801_tuner_only;
1346  
1347  	if ((err = snd_fm801_pcm(chip, 0)) < 0) {
1348  		snd_card_free(card);
1349  		return err;
1350  	}
1351  	if ((err = snd_fm801_mixer(chip)) < 0) {
1352  		snd_card_free(card);
1353  		return err;
1354  	}
1355  	if ((err = snd_mpu401_uart_new(card, 0, MPU401_HW_FM801,
1356  				       chip->port + FM801_MPU401_DATA,
1357  				       MPU401_INFO_INTEGRATED |
1358  				       MPU401_INFO_IRQ_HOOK,
1359  				       -1, &chip->rmidi)) < 0) {
1360  		snd_card_free(card);
1361  		return err;
1362  	}
1363  	if ((err = snd_opl3_create(card, chip->port + FM801_OPL3_BANK0,
1364  				   chip->port + FM801_OPL3_BANK1,
1365  				   OPL3_HW_OPL3_FM801, 1, &opl3)) < 0) {
1366  		snd_card_free(card);
1367  		return err;
1368  	}
1369  	if ((err = snd_opl3_hwdep_new(opl3, 0, 1, NULL)) < 0) {
1370  		snd_card_free(card);
1371  		return err;
1372  	}
1373  
1374        __fm801_tuner_only:
1375  	if ((err = snd_card_register(card)) < 0) {
1376  		snd_card_free(card);
1377  		return err;
1378  	}
1379  	pci_set_drvdata(pci, card);
1380  	dev++;
1381  	return 0;
1382  }
1383  
snd_card_fm801_remove(struct pci_dev * pci)1384  static void snd_card_fm801_remove(struct pci_dev *pci)
1385  {
1386  	snd_card_free(pci_get_drvdata(pci));
1387  }
1388  
1389  #ifdef CONFIG_PM_SLEEP
1390  static unsigned char saved_regs[] = {
1391  	FM801_PCM_VOL, FM801_I2S_VOL, FM801_FM_VOL, FM801_REC_SRC,
1392  	FM801_PLY_CTRL, FM801_PLY_COUNT, FM801_PLY_BUF1, FM801_PLY_BUF2,
1393  	FM801_CAP_CTRL, FM801_CAP_COUNT, FM801_CAP_BUF1, FM801_CAP_BUF2,
1394  	FM801_CODEC_CTRL, FM801_I2S_MODE, FM801_VOLUME, FM801_GEN_CTRL,
1395  };
1396  
snd_fm801_suspend(struct device * dev)1397  static int snd_fm801_suspend(struct device *dev)
1398  {
1399  	struct snd_card *card = dev_get_drvdata(dev);
1400  	struct fm801 *chip = card->private_data;
1401  	int i;
1402  
1403  	snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
1404  
1405  	for (i = 0; i < ARRAY_SIZE(saved_regs); i++)
1406  		chip->saved_regs[i] = fm801_ioread16(chip, saved_regs[i]);
1407  
1408  	if (chip->tea575x_tuner & TUNER_ONLY) {
1409  		/* FIXME: tea575x suspend */
1410  	} else {
1411  		snd_pcm_suspend_all(chip->pcm);
1412  		snd_ac97_suspend(chip->ac97);
1413  		snd_ac97_suspend(chip->ac97_sec);
1414  	}
1415  
1416  	return 0;
1417  }
1418  
snd_fm801_resume(struct device * dev)1419  static int snd_fm801_resume(struct device *dev)
1420  {
1421  	struct snd_card *card = dev_get_drvdata(dev);
1422  	struct fm801 *chip = card->private_data;
1423  	int i;
1424  
1425  	if (chip->tea575x_tuner & TUNER_ONLY) {
1426  		snd_fm801_chip_init(chip);
1427  	} else {
1428  		reset_codec(chip);
1429  		snd_fm801_chip_multichannel_init(chip);
1430  		snd_fm801_chip_init(chip);
1431  		snd_ac97_resume(chip->ac97);
1432  		snd_ac97_resume(chip->ac97_sec);
1433  	}
1434  
1435  	for (i = 0; i < ARRAY_SIZE(saved_regs); i++)
1436  		fm801_iowrite16(chip, saved_regs[i], chip->saved_regs[i]);
1437  
1438  #ifdef CONFIG_SND_FM801_TEA575X_BOOL
1439  	if (!(chip->tea575x_tuner & TUNER_DISABLED))
1440  		snd_tea575x_set_freq(&chip->tea);
1441  #endif
1442  
1443  	snd_power_change_state(card, SNDRV_CTL_POWER_D0);
1444  	return 0;
1445  }
1446  
1447  static SIMPLE_DEV_PM_OPS(snd_fm801_pm, snd_fm801_suspend, snd_fm801_resume);
1448  #define SND_FM801_PM_OPS	&snd_fm801_pm
1449  #else
1450  #define SND_FM801_PM_OPS	NULL
1451  #endif /* CONFIG_PM_SLEEP */
1452  
1453  static struct pci_driver fm801_driver = {
1454  	.name = KBUILD_MODNAME,
1455  	.id_table = snd_fm801_ids,
1456  	.probe = snd_card_fm801_probe,
1457  	.remove = snd_card_fm801_remove,
1458  	.driver = {
1459  		.pm = SND_FM801_PM_OPS,
1460  	},
1461  };
1462  
1463  module_pci_driver(fm801_driver);
1464