Merge tag 'v4.4.16' into linux-linaro-lsk-v4.4
[firefly-linux-kernel-4.4.55.git] / sound / pci / ctxfi / cthardware.c
1 /**
2  * Copyright (C) 2008, Creative Technology Ltd. All Rights Reserved.
3  *
4  * This source file is released under GPL v2 license (no other versions).
5  * See the COPYING file included in the main directory of this source
6  * distribution for the license terms and conditions.
7  *
8  * @File        cthardware.c
9  *
10  * @Brief
11  * This file contains the implementation of hardware access methord.
12  *
13  * @Author      Liu Chun
14  * @Date        Jun 26 2008
15  *
16  */
17
18 #include "cthardware.h"
19 #include "cthw20k1.h"
20 #include "cthw20k2.h"
21 #include <linux/bug.h>
22
23 int create_hw_obj(struct pci_dev *pci, enum CHIPTYP chip_type,
24                   enum CTCARDS model, struct hw **rhw)
25 {
26         int err;
27
28         switch (chip_type) {
29         case ATC20K1:
30                 err = create_20k1_hw_obj(rhw);
31                 break;
32         case ATC20K2:
33                 err = create_20k2_hw_obj(rhw);
34                 break;
35         default:
36                 err = -ENODEV;
37                 break;
38         }
39         if (err)
40                 return err;
41
42         (*rhw)->pci = pci;
43         (*rhw)->chip_type = chip_type;
44         (*rhw)->model = model;
45
46         return 0;
47 }
48
49 int destroy_hw_obj(struct hw *hw)
50 {
51         int err;
52
53         switch (hw->pci->device) {
54         case 0x0005:    /* 20k1 device */
55                 err = destroy_20k1_hw_obj(hw);
56                 break;
57         case 0x000B:    /* 20k2 device */
58                 err = destroy_20k2_hw_obj(hw);
59                 break;
60         default:
61                 err = -ENODEV;
62                 break;
63         }
64
65         return err;
66 }
67
68 unsigned int get_field(unsigned int data, unsigned int field)
69 {
70         int i;
71
72         if (WARN_ON(!field))
73                 return 0;
74         /* @field should always be greater than 0 */
75         for (i = 0; !(field & (1 << i)); )
76                 i++;
77
78         return (data & field) >> i;
79 }
80
81 void set_field(unsigned int *data, unsigned int field, unsigned int value)
82 {
83         int i;
84
85         if (WARN_ON(!field))
86                 return;
87         /* @field should always be greater than 0 */
88         for (i = 0; !(field & (1 << i)); )
89                 i++;
90
91         *data = (*data & (~field)) | ((value << i) & field);
92 }
93