brintos

brintos / linux-shallow public Read only

0
0
Text · 1.5 KiB · 1d50644 Raw
90 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2/*3 * Copyright (C) 2008, Creative Technology Ltd. All Rights Reserved.4 *5 * @File	cthardware.c6 *7 * @Brief8 * This file contains the implementation of hardware access methord.9 *10 * @Author	Liu Chun11 * @Date 	Jun 26 200812 */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