• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  /*
2   * C-Media CMI8788 driver for Asus Xonar cards
3   *
4   * Copyright (c) Clemens Ladisch <clemens@ladisch.de>
5   *
6   *
7   *  This driver is free software; you can redistribute it and/or modify
8   *  it under the terms of the GNU General Public License, version 2.
9   *
10   *  This driver 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   *  You should have received a copy of the GNU General Public License
16   *  along with this driver; if not, write to the Free Software
17   *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
18   */
19  
20  #include <linux/pci.h>
21  #include <linux/delay.h>
22  #include <linux/module.h>
23  #include <sound/core.h>
24  #include <sound/initval.h>
25  #include <sound/pcm.h>
26  #include "xonar.h"
27  
28  MODULE_AUTHOR("Clemens Ladisch <clemens@ladisch.de>");
29  MODULE_DESCRIPTION("Asus Virtuoso driver");
30  MODULE_LICENSE("GPL v2");
31  MODULE_SUPPORTED_DEVICE("{{Asus,AV66},{Asus,AV100},{Asus,AV200}}");
32  
33  static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;
34  static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;
35  static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;
36  
37  module_param_array(index, int, NULL, 0444);
38  MODULE_PARM_DESC(index, "card index");
39  module_param_array(id, charp, NULL, 0444);
40  MODULE_PARM_DESC(id, "ID string");
41  module_param_array(enable, bool, NULL, 0444);
42  MODULE_PARM_DESC(enable, "enable card");
43  
44  static const struct pci_device_id xonar_ids[] = {
45  	{ OXYGEN_PCI_SUBID(0x1043, 0x8269) },
46  	{ OXYGEN_PCI_SUBID(0x1043, 0x8275) },
47  	{ OXYGEN_PCI_SUBID(0x1043, 0x82b7) },
48  	{ OXYGEN_PCI_SUBID(0x1043, 0x8314) },
49  	{ OXYGEN_PCI_SUBID(0x1043, 0x8327) },
50  	{ OXYGEN_PCI_SUBID(0x1043, 0x834f) },
51  	{ OXYGEN_PCI_SUBID(0x1043, 0x835c) },
52  	{ OXYGEN_PCI_SUBID(0x1043, 0x835d) },
53  	{ OXYGEN_PCI_SUBID(0x1043, 0x835e) },
54  	{ OXYGEN_PCI_SUBID(0x1043, 0x838e) },
55  	{ OXYGEN_PCI_SUBID(0x1043, 0x8428) },
56  	{ OXYGEN_PCI_SUBID(0x1043, 0x8522) },
57  	{ OXYGEN_PCI_SUBID(0x1043, 0x85f4) },
58  	{ OXYGEN_PCI_SUBID_BROKEN_EEPROM },
59  	{ }
60  };
61  MODULE_DEVICE_TABLE(pci, xonar_ids);
62  
get_xonar_model(struct oxygen * chip,const struct pci_device_id * id)63  static int get_xonar_model(struct oxygen *chip,
64  			   const struct pci_device_id *id)
65  {
66  	if (get_xonar_pcm179x_model(chip, id) >= 0)
67  		return 0;
68  	if (get_xonar_cs43xx_model(chip, id) >= 0)
69  		return 0;
70  	if (get_xonar_wm87x6_model(chip, id) >= 0)
71  		return 0;
72  	return -EINVAL;
73  }
74  
xonar_probe(struct pci_dev * pci,const struct pci_device_id * pci_id)75  static int xonar_probe(struct pci_dev *pci,
76  		       const struct pci_device_id *pci_id)
77  {
78  	static int dev;
79  	int err;
80  
81  	if (dev >= SNDRV_CARDS)
82  		return -ENODEV;
83  	if (!enable[dev]) {
84  		++dev;
85  		return -ENOENT;
86  	}
87  	err = oxygen_pci_probe(pci, index[dev], id[dev], THIS_MODULE,
88  			       xonar_ids, get_xonar_model);
89  	if (err >= 0)
90  		++dev;
91  	return err;
92  }
93  
94  static struct pci_driver xonar_driver = {
95  	.name = KBUILD_MODNAME,
96  	.id_table = xonar_ids,
97  	.probe = xonar_probe,
98  	.remove = oxygen_pci_remove,
99  #ifdef CONFIG_PM_SLEEP
100  	.driver = {
101  		.pm = &oxygen_pci_pm,
102  	},
103  #endif
104  	.shutdown = oxygen_pci_shutdown,
105  };
106  
107  module_pci_driver(xonar_driver);
108