linux/sound/pci/ctxfi/cthardware.c
<<
>>
Prefs
   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
  19int 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
  45int 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
  64unsigned 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
  77void 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