15765e78eSThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only
2*fe372850SPierre-Louis Bossart /*
38cc72361SWai Yew CHAY * Copyright (C) 2008, Creative Technology Ltd. All Rights Reserved.
48cc72361SWai Yew CHAY *
58cc72361SWai Yew CHAY * @File cthardware.c
68cc72361SWai Yew CHAY *
78cc72361SWai Yew CHAY * @Brief
88cc72361SWai Yew CHAY * This file contains the implementation of hardware access methord.
98cc72361SWai Yew CHAY *
108cc72361SWai Yew CHAY * @Author Liu Chun
118cc72361SWai Yew CHAY * @Date Jun 26 2008
128cc72361SWai Yew CHAY */
138cc72361SWai Yew CHAY
148cc72361SWai Yew CHAY #include "cthardware.h"
158cc72361SWai Yew CHAY #include "cthw20k1.h"
168cc72361SWai Yew CHAY #include "cthw20k2.h"
178cc72361SWai Yew CHAY #include <linux/bug.h>
188cc72361SWai Yew CHAY
create_hw_obj(struct pci_dev * pci,enum CHIPTYP chip_type,enum CTCARDS model,struct hw ** rhw)19e23e7a14SBill Pemberton int create_hw_obj(struct pci_dev *pci, enum CHIPTYP chip_type,
209470195aSTakashi Iwai enum CTCARDS model, struct hw **rhw)
218cc72361SWai Yew CHAY {
22514eef9cSTakashi Iwai int err;
238cc72361SWai Yew CHAY
249470195aSTakashi Iwai switch (chip_type) {
259470195aSTakashi Iwai case ATC20K1:
268cc72361SWai Yew CHAY err = create_20k1_hw_obj(rhw);
278cc72361SWai Yew CHAY break;
289470195aSTakashi Iwai case ATC20K2:
298cc72361SWai Yew CHAY err = create_20k2_hw_obj(rhw);
308cc72361SWai Yew CHAY break;
318cc72361SWai Yew CHAY default:
328cc72361SWai Yew CHAY err = -ENODEV;
338cc72361SWai Yew CHAY break;
348cc72361SWai Yew CHAY }
358cc72361SWai Yew CHAY if (err)
368cc72361SWai Yew CHAY return err;
378cc72361SWai Yew CHAY
388cc72361SWai Yew CHAY (*rhw)->pci = pci;
399470195aSTakashi Iwai (*rhw)->chip_type = chip_type;
409470195aSTakashi Iwai (*rhw)->model = model;
418cc72361SWai Yew CHAY
428cc72361SWai Yew CHAY return 0;
438cc72361SWai Yew CHAY }
448cc72361SWai Yew CHAY
destroy_hw_obj(struct hw * hw)458cc72361SWai Yew CHAY int destroy_hw_obj(struct hw *hw)
468cc72361SWai Yew CHAY {
47514eef9cSTakashi Iwai int err;
488cc72361SWai Yew CHAY
498cc72361SWai Yew CHAY switch (hw->pci->device) {
508cc72361SWai Yew CHAY case 0x0005: /* 20k1 device */
518cc72361SWai Yew CHAY err = destroy_20k1_hw_obj(hw);
528cc72361SWai Yew CHAY break;
538cc72361SWai Yew CHAY case 0x000B: /* 20k2 device */
548cc72361SWai Yew CHAY err = destroy_20k2_hw_obj(hw);
558cc72361SWai Yew CHAY break;
568cc72361SWai Yew CHAY default:
578cc72361SWai Yew CHAY err = -ENODEV;
588cc72361SWai Yew CHAY break;
598cc72361SWai Yew CHAY }
608cc72361SWai Yew CHAY
618cc72361SWai Yew CHAY return err;
628cc72361SWai Yew CHAY }
638cc72361SWai Yew CHAY
get_field(unsigned int data,unsigned int field)648cc72361SWai Yew CHAY unsigned int get_field(unsigned int data, unsigned int field)
658cc72361SWai Yew CHAY {
668cc72361SWai Yew CHAY int i;
678cc72361SWai Yew CHAY
6829fa9578STakashi Iwai if (WARN_ON(!field))
6929fa9578STakashi Iwai return 0;
708cc72361SWai Yew CHAY /* @field should always be greater than 0 */
718cc72361SWai Yew CHAY for (i = 0; !(field & (1 << i)); )
728cc72361SWai Yew CHAY i++;
738cc72361SWai Yew CHAY
748cc72361SWai Yew CHAY return (data & field) >> i;
758cc72361SWai Yew CHAY }
768cc72361SWai Yew CHAY
set_field(unsigned int * data,unsigned int field,unsigned int value)778cc72361SWai Yew CHAY void set_field(unsigned int *data, unsigned int field, unsigned int value)
788cc72361SWai Yew CHAY {
798cc72361SWai Yew CHAY int i;
808cc72361SWai Yew CHAY
8129fa9578STakashi Iwai if (WARN_ON(!field))
8229fa9578STakashi Iwai return;
838cc72361SWai Yew CHAY /* @field should always be greater than 0 */
848cc72361SWai Yew CHAY for (i = 0; !(field & (1 << i)); )
858cc72361SWai Yew CHAY i++;
868cc72361SWai Yew CHAY
878cc72361SWai Yew CHAY *data = (*data & (~field)) | ((value << i) & field);
888cc72361SWai Yew CHAY }
898cc72361SWai Yew CHAY
90