Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/sound/pci/ctxfi/cthardware.c
26439 views
1
// SPDX-License-Identifier: GPL-2.0-only
2
/*
3
* Copyright (C) 2008, Creative Technology Ltd. All Rights Reserved.
4
*
5
* @File cthardware.c
6
*
7
* @Brief
8
* This file contains the implementation of hardware access methord.
9
*
10
* @Author Liu Chun
11
* @Date Jun 26 2008
12
*/
13
14
#include "cthardware.h"
15
#include "cthw20k1.h"
16
#include "cthw20k2.h"
17
#include <linux/bug.h>
18
19
int create_hw_obj(struct pci_dev *pci, enum CHIPTYP chip_type,
20
enum CTCARDS model, struct hw **rhw)
21
{
22
int err;
23
24
switch (chip_type) {
25
case ATC20K1:
26
err = create_20k1_hw_obj(rhw);
27
break;
28
case ATC20K2:
29
err = create_20k2_hw_obj(rhw);
30
break;
31
default:
32
err = -ENODEV;
33
break;
34
}
35
if (err)
36
return err;
37
38
(*rhw)->pci = pci;
39
(*rhw)->chip_type = chip_type;
40
(*rhw)->model = model;
41
42
return 0;
43
}
44
45
int destroy_hw_obj(struct hw *hw)
46
{
47
int err;
48
49
switch (hw->pci->device) {
50
case 0x0005: /* 20k1 device */
51
err = destroy_20k1_hw_obj(hw);
52
break;
53
case 0x000B: /* 20k2 device */
54
err = destroy_20k2_hw_obj(hw);
55
break;
56
default:
57
err = -ENODEV;
58
break;
59
}
60
61
return err;
62
}
63
64
unsigned int get_field(unsigned int data, unsigned int field)
65
{
66
int i;
67
68
if (WARN_ON(!field))
69
return 0;
70
/* @field should always be greater than 0 */
71
for (i = 0; !(field & (1 << i)); )
72
i++;
73
74
return (data & field) >> i;
75
}
76
77
void set_field(unsigned int *data, unsigned int field, unsigned int value)
78
{
79
int i;
80
81
if (WARN_ON(!field))
82
return;
83
/* @field should always be greater than 0 */
84
for (i = 0; !(field & (1 << i)); )
85
i++;
86
87
*data = (*data & (~field)) | ((value << i) & field);
88
}
89
90
91