Merge tag 'for-linus' of git://git.armlinux.org.uk/~rmk/linux-arm
[linux-2.6-microblaze.git] / sound / pci / ctxfi / cthardware.c
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