mirror of
https://github.com/torvalds/linux.git
synced 2024-11-27 22:51:35 +00:00
8cc7236148
The Sound Blaster X-Fi driver supports Creative solutions based on 20K1 and 20K2 chipsets. Supported hardware : Creative Sound Blaster X-Fi Titanium Fatal1ty® Champion Series Creative Sound Blaster X-Fi Titanium Fatal1ty Professional Series Creative Sound Blaster X-Fi Titanium Professional Audio Creative Sound Blaster X-Fi Titanium Creative Sound Blaster X-Fi Elite Pro Creative Sound Blaster X-Fi Platinum Creative Sound Blaster X-Fi Fatal1ty Creative Sound Blaster X-Fi XtremeGamer Creative Sound Blaster X-Fi XtremeMusic Current release features: * ALSA PCM Playback * ALSA Record * ALSA Mixer Note: * External I/O modules detection not included. Signed-off-by: Wai Yew CHAY <wychay@ctl.creative.com> Singed-off-by: Ryan RICHARDS <ryan_richards@creativelabs.com> Signed-off-by: Takashi Iwai <tiwai@suse.de>
109 lines
1.9 KiB
C
109 lines
1.9 KiB
C
/**
|
|
* Copyright (C) 2008, Creative Technology Ltd. All Rights Reserved.
|
|
*
|
|
* This source file is released under GPL v2 license (no other versions).
|
|
* See the COPYING file included in the main directory of this source
|
|
* distribution for the license terms and conditions.
|
|
*
|
|
* @File cthardware.c
|
|
*
|
|
* @Brief
|
|
* This file contains the implementation of hardware access methord.
|
|
*
|
|
* @Author Liu Chun
|
|
* @Date Jun 26 2008
|
|
*
|
|
*/
|
|
|
|
#include "cthardware.h"
|
|
#include "cthw20k1.h"
|
|
#include "cthw20k2.h"
|
|
#include <linux/bug.h>
|
|
|
|
static enum CHIPTYP get_chip_type(struct hw *hw)
|
|
{
|
|
enum CHIPTYP type = ATCNONE;
|
|
|
|
switch (hw->pci->device) {
|
|
case 0x0005: /* 20k1 device */
|
|
type = ATC20K1;
|
|
break;
|
|
case 0x000B: /* 20k2 device */
|
|
type = ATC20K2;
|
|
break;
|
|
default:
|
|
type = ATCNONE;
|
|
break;
|
|
}
|
|
|
|
return type;
|
|
}
|
|
|
|
int create_hw_obj(struct pci_dev *pci, struct hw **rhw)
|
|
{
|
|
int err = 0;
|
|
|
|
switch (pci->device) {
|
|
case 0x0005: /* 20k1 device */
|
|
err = create_20k1_hw_obj(rhw);
|
|
break;
|
|
case 0x000B: /* 20k2 device */
|
|
err = create_20k2_hw_obj(rhw);
|
|
break;
|
|
default:
|
|
err = -ENODEV;
|
|
break;
|
|
}
|
|
if (err)
|
|
return err;
|
|
|
|
(*rhw)->pci = pci;
|
|
(*rhw)->get_chip_type = get_chip_type;
|
|
|
|
return 0;
|
|
}
|
|
|
|
int destroy_hw_obj(struct hw *hw)
|
|
{
|
|
int err = 0;
|
|
|
|
switch (hw->pci->device) {
|
|
case 0x0005: /* 20k1 device */
|
|
err = destroy_20k1_hw_obj(hw);
|
|
break;
|
|
case 0x000B: /* 20k2 device */
|
|
err = destroy_20k2_hw_obj(hw);
|
|
break;
|
|
default:
|
|
err = -ENODEV;
|
|
break;
|
|
}
|
|
|
|
return err;
|
|
}
|
|
|
|
unsigned int get_field(unsigned int data, unsigned int field)
|
|
{
|
|
int i;
|
|
|
|
BUG_ON(!field);
|
|
/* @field should always be greater than 0 */
|
|
for (i = 0; !(field & (1 << i)); )
|
|
i++;
|
|
|
|
return (data & field) >> i;
|
|
}
|
|
|
|
void set_field(unsigned int *data, unsigned int field, unsigned int value)
|
|
{
|
|
int i;
|
|
|
|
BUG_ON(!field);
|
|
/* @field should always be greater than 0 */
|
|
for (i = 0; !(field & (1 << i)); )
|
|
i++;
|
|
|
|
*data = (*data & (~field)) | ((value << i) & field);
|
|
}
|
|
|