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