xref: /openbmc/linux/sound/pci/ctxfi/cthardware.c (revision 4b4193256c8d3bc3a5397b5cd9494c2ad386317d)
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