⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tp3780i.c

📁 linux-2.6.15.6
💻 C
📖 第 1 页 / 共 2 页
字号:
	if (pBDData->bDSPEnabled) {		PRINTK_ERROR(KERN_ERR_MWAVE "tp3780i::tp3780I_EnableDSP: Error: DSP already enabled!\n");		goto exit_cleanup;	}	if (!pSettings->bDSPEnabled) {		PRINTK_ERROR(KERN_ERR_MWAVE "tp3780::tp3780I_EnableDSP: Error: pSettings->bDSPEnabled not set\n");		goto exit_cleanup;	}	if (		(pSettings->usDspIrq >= s_numIrqs)		|| (pSettings->usDspDma >= s_numDmas)		|| (s_ausThinkpadIrqToField[pSettings->usDspIrq] == 0xFFFF)		|| (s_ausThinkpadDmaToField[pSettings->usDspDma] == 0xFFFF)	) {		PRINTK_ERROR(KERN_ERR_MWAVE "tp3780i::tp3780I_EnableDSP: Error: invalid irq %x\n", pSettings->usDspIrq);		goto exit_cleanup;	}	if (		((pSettings->usDspBaseIO & 0xF00F) != 0)		|| (pSettings->usDspBaseIO & 0x0FF0) == 0	) {		PRINTK_ERROR(KERN_ERR_MWAVE "tp3780i::tp3780I_EnableDSP: Error: Invalid DSP base I/O address %x\n", pSettings->usDspBaseIO);		goto exit_cleanup;	}	if (pSettings->bModemEnabled) {		if (			pSettings->usUartIrq >= s_numIrqs			|| s_ausThinkpadIrqToField[pSettings->usUartIrq] == 0xFFFF		) {			PRINTK_ERROR(KERN_ERR_MWAVE "tp3780i::tp3780I_EnableDSP: Error: Invalid UART IRQ %x\n", pSettings->usUartIrq);			goto exit_cleanup;		}		switch (pSettings->usUartBaseIO) {			case 0x03F8:			case 0x02F8:			case 0x03E8:			case 0x02E8:				break;			default:				PRINTK_ERROR("tp3780i::tp3780I_EnableDSP: Error: Invalid UART base I/O address %x\n", pSettings->usUartBaseIO);				goto exit_cleanup;		}	}	pSettings->bDspIrqActiveLow = pSettings->bDspIrqPulse = TRUE;	pSettings->bUartIrqActiveLow = pSettings->bUartIrqPulse = TRUE;	if (pBDData->bShareDspIrq) {		pSettings->bDspIrqActiveLow = FALSE;	}	if (pBDData->bShareUartIrq) {		pSettings->bUartIrqActiveLow = FALSE;	}	pSettings->usNumTransfers = TP_CFG_NumTransfers;	pSettings->usReRequest = TP_CFG_RerequestTimer;	pSettings->bEnableMEMCS16 = TP_CFG_MEMCS16;	pSettings->usIsaMemCmdWidth = TP_CFG_IsaMemCmdWidth;	pSettings->bGateIOCHRDY = TP_CFG_GateIOCHRDY;	pSettings->bEnablePwrMgmt = TP_CFG_EnablePwrMgmt;	pSettings->usHBusTimerLoadValue = TP_CFG_HBusTimerValue;	pSettings->bDisableLBusTimeout = TP_CFG_DisableLBusTimeout;	pSettings->usN_Divisor = TP_CFG_N_Divisor;	pSettings->usM_Multiplier = TP_CFG_M_Multiplier;	pSettings->bPllBypass = TP_CFG_PllBypass;	pSettings->usChipletEnable = TP_CFG_ChipletEnable;	if (request_irq(pSettings->usUartIrq, &UartInterrupt, 0, "mwave_uart", NULL)) {		PRINTK_ERROR(KERN_ERR_MWAVE "tp3780i::tp3780I_EnableDSP: Error: Could not get UART IRQ %x\n", pSettings->usUartIrq);		goto exit_cleanup;	} else {		/* no conflict just release */		free_irq(pSettings->usUartIrq, NULL);	}	if (request_irq(pSettings->usDspIrq, &DspInterrupt, 0, "mwave_3780i", NULL)) {		PRINTK_ERROR("tp3780i::tp3780I_EnableDSP: Error: Could not get 3780i IRQ %x\n", pSettings->usDspIrq);		goto exit_cleanup;	} else {		PRINTK_3(TRACE_TP3780I,			"tp3780i::tp3780I_EnableDSP, got interrupt %x bShareDspIrq %x\n",			pSettings->usDspIrq, pBDData->bShareDspIrq);		bInterruptAllocated = TRUE;		pSettings->bInterruptClaimed = TRUE;	}	smapi_set_DSP_power_state(FALSE);	if (smapi_set_DSP_power_state(TRUE)) {		PRINTK_ERROR(KERN_ERR_MWAVE "tp3780i::tp3780I_EnableDSP: Error: smapi_set_DSP_power_state(TRUE) failed\n");		goto exit_cleanup;	} else {		bDSPPoweredUp = TRUE;	}	if (dsp3780I_EnableDSP(pSettings, s_ausThinkpadIrqToField, s_ausThinkpadDmaToField)) {		PRINTK_ERROR("tp3780i::tp3780I_EnableDSP: Error: dsp7880I_EnableDSP() failed\n");		goto exit_cleanup;	}	EnableSRAM(pBDData);	pBDData->bDSPEnabled = TRUE;	PRINTK_1(TRACE_TP3780I, "tp3780i::tp3780I_EnableDSP exit\n");	return 0;exit_cleanup:	PRINTK_ERROR("tp3780i::tp3780I_EnableDSP: Cleaning up\n");	if (bDSPPoweredUp)		smapi_set_DSP_power_state(FALSE);	if (bInterruptAllocated) {		free_irq(pSettings->usDspIrq, NULL);		pSettings->bInterruptClaimed = FALSE;	}	return -EIO;}int tp3780I_DisableDSP(THINKPAD_BD_DATA * pBDData){	int retval = 0;	DSP_3780I_CONFIG_SETTINGS *pSettings = &pBDData->rDspSettings;	PRINTK_2(TRACE_TP3780I, "tp3780i::tp3780I_DisableDSP entry pBDData %p\n", pBDData);	if (pBDData->bDSPEnabled) {		dsp3780I_DisableDSP(&pBDData->rDspSettings);		if (pSettings->bInterruptClaimed) {			free_irq(pSettings->usDspIrq, NULL);			pSettings->bInterruptClaimed = FALSE;		}		smapi_set_DSP_power_state(FALSE);		pBDData->bDSPEnabled = FALSE;	}	PRINTK_2(TRACE_TP3780I, "tp3780i::tp3780I_DisableDSP exit retval %x\n", retval);	return retval;}int tp3780I_ResetDSP(THINKPAD_BD_DATA * pBDData){	int retval = 0;	DSP_3780I_CONFIG_SETTINGS *pSettings = &pBDData->rDspSettings;	PRINTK_2(TRACE_TP3780I, "tp3780i::tp3780I_ResetDSP entry pBDData %p\n",		pBDData);	if (dsp3780I_Reset(pSettings) == 0) {		EnableSRAM(pBDData);	} else {		retval = -EIO;	}	PRINTK_2(TRACE_TP3780I, "tp3780i::tp3780I_ResetDSP exit retval %x\n", retval);	return retval;}int tp3780I_StartDSP(THINKPAD_BD_DATA * pBDData){	int retval = 0;	DSP_3780I_CONFIG_SETTINGS *pSettings = &pBDData->rDspSettings;	PRINTK_2(TRACE_TP3780I, "tp3780i::tp3780I_StartDSP entry pBDData %p\n", pBDData);	if (dsp3780I_Run(pSettings) == 0) {		// @BUG @TBD EnableSRAM(pBDData);	} else {		retval = -EIO;	}	PRINTK_2(TRACE_TP3780I, "tp3780i::tp3780I_StartDSP exit retval %x\n", retval);	return retval;}int tp3780I_QueryAbilities(THINKPAD_BD_DATA * pBDData, MW_ABILITIES * pAbilities){	int retval = 0;	PRINTK_2(TRACE_TP3780I,		"tp3780i::tp3780I_QueryAbilities entry pBDData %p\n", pBDData);	/* fill out standard constant fields */	pAbilities->instr_per_sec = pBDData->rDspSettings.uIps;	pAbilities->data_size = pBDData->rDspSettings.uDStoreSize;	pAbilities->inst_size = pBDData->rDspSettings.uIStoreSize;	pAbilities->bus_dma_bw = pBDData->rDspSettings.uDmaBandwidth;	/* fill out dynamically determined fields */	pAbilities->component_list[0] = 0x00010000 | MW_ADC_MASK;	pAbilities->component_list[1] = 0x00010000 | MW_ACI_MASK;	pAbilities->component_list[2] = 0x00010000 | MW_AIC1_MASK;	pAbilities->component_list[3] = 0x00010000 | MW_AIC2_MASK;	pAbilities->component_list[4] = 0x00010000 | MW_CDDAC_MASK;	pAbilities->component_list[5] = 0x00010000 | MW_MIDI_MASK;	pAbilities->component_list[6] = 0x00010000 | MW_UART_MASK;	pAbilities->component_count = 7;	/* Fill out Mwave OS and BIOS task names */	memcpy(pAbilities->mwave_os_name, TP_ABILITIES_MWAVEOS_NAME,		sizeof(TP_ABILITIES_MWAVEOS_NAME));	memcpy(pAbilities->bios_task_name, TP_ABILITIES_BIOSTASK_NAME,		sizeof(TP_ABILITIES_BIOSTASK_NAME));	PRINTK_1(TRACE_TP3780I,		"tp3780i::tp3780I_QueryAbilities exit retval=SUCCESSFUL\n");	return retval;}int tp3780I_ReadWriteDspDStore(THINKPAD_BD_DATA * pBDData, unsigned int uOpcode,                               void __user *pvBuffer, unsigned int uCount,                               unsigned long ulDSPAddr){	int retval = 0;	DSP_3780I_CONFIG_SETTINGS *pSettings = &pBDData->rDspSettings;	unsigned short usDspBaseIO = pSettings->usDspBaseIO;	BOOLEAN bRC = 0;	PRINTK_6(TRACE_TP3780I,		"tp3780i::tp3780I_ReadWriteDspDStore entry pBDData %p, uOpcode %x, pvBuffer %p, uCount %x, ulDSPAddr %lx\n",		pBDData, uOpcode, pvBuffer, uCount, ulDSPAddr);	if (pBDData->bDSPEnabled) {		switch (uOpcode) {		case IOCTL_MW_READ_DATA:			bRC = dsp3780I_ReadDStore(usDspBaseIO, pvBuffer, uCount, ulDSPAddr);			break;		case IOCTL_MW_READCLEAR_DATA:			bRC = dsp3780I_ReadAndClearDStore(usDspBaseIO, pvBuffer, uCount, ulDSPAddr);			break;		case IOCTL_MW_WRITE_DATA:			bRC = dsp3780I_WriteDStore(usDspBaseIO, pvBuffer, uCount, ulDSPAddr);			break;		}	}	retval = (bRC) ? -EIO : 0;	PRINTK_2(TRACE_TP3780I, "tp3780i::tp3780I_ReadWriteDspDStore exit retval %x\n", retval);	return retval;}int tp3780I_ReadWriteDspIStore(THINKPAD_BD_DATA * pBDData, unsigned int uOpcode,                               void __user *pvBuffer, unsigned int uCount,                               unsigned long ulDSPAddr){	int retval = 0;	DSP_3780I_CONFIG_SETTINGS *pSettings = &pBDData->rDspSettings;	unsigned short usDspBaseIO = pSettings->usDspBaseIO;	BOOLEAN bRC = 0;	PRINTK_6(TRACE_TP3780I,		"tp3780i::tp3780I_ReadWriteDspIStore entry pBDData %p, uOpcode %x, pvBuffer %p, uCount %x, ulDSPAddr %lx\n",		pBDData, uOpcode, pvBuffer, uCount, ulDSPAddr);	if (pBDData->bDSPEnabled) {		switch (uOpcode) {		case IOCTL_MW_READ_INST:			bRC = dsp3780I_ReadIStore(usDspBaseIO, pvBuffer, uCount, ulDSPAddr);			break;		case IOCTL_MW_WRITE_INST:			bRC = dsp3780I_WriteIStore(usDspBaseIO, pvBuffer, uCount, ulDSPAddr);			break;		}	}	retval = (bRC) ? -EIO : 0;	PRINTK_2(TRACE_TP3780I,		"tp3780i::tp3780I_ReadWriteDspIStore exit retval %x\n", retval);	return retval;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -