xref: /openbmc/linux/drivers/char/mwave/3780i.c (revision 7c0f6ba6)
11da177e4SLinus Torvalds /*
21da177e4SLinus Torvalds *
31da177e4SLinus Torvalds * 3780i.c -- helper routines for the 3780i DSP
41da177e4SLinus Torvalds *
51da177e4SLinus Torvalds *
61da177e4SLinus Torvalds * Written By: Mike Sullivan IBM Corporation
71da177e4SLinus Torvalds *
81da177e4SLinus Torvalds * Copyright (C) 1999 IBM Corporation
91da177e4SLinus Torvalds *
101da177e4SLinus Torvalds * This program is free software; you can redistribute it and/or modify
111da177e4SLinus Torvalds * it under the terms of the GNU General Public License as published by
121da177e4SLinus Torvalds * the Free Software Foundation; either version 2 of the License, or
131da177e4SLinus Torvalds * (at your option) any later version.
141da177e4SLinus Torvalds *
151da177e4SLinus Torvalds * This program is distributed in the hope that it will be useful,
161da177e4SLinus Torvalds * but WITHOUT ANY WARRANTY; without even the implied warranty of
171da177e4SLinus Torvalds * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
181da177e4SLinus Torvalds * GNU General Public License for more details.
191da177e4SLinus Torvalds *
201da177e4SLinus Torvalds * NO WARRANTY
211da177e4SLinus Torvalds * THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR
221da177e4SLinus Torvalds * CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT
231da177e4SLinus Torvalds * LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
241da177e4SLinus Torvalds * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is
251da177e4SLinus Torvalds * solely responsible for determining the appropriateness of using and
261da177e4SLinus Torvalds * distributing the Program and assumes all risks associated with its
271da177e4SLinus Torvalds * exercise of rights under this Agreement, including but not limited to
281da177e4SLinus Torvalds * the risks and costs of program errors, damage to or loss of data,
291da177e4SLinus Torvalds * programs or equipment, and unavailability or interruption of operations.
301da177e4SLinus Torvalds *
311da177e4SLinus Torvalds * DISCLAIMER OF LIABILITY
321da177e4SLinus Torvalds * NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY
331da177e4SLinus Torvalds * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
341da177e4SLinus Torvalds * DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND
351da177e4SLinus Torvalds * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
361da177e4SLinus Torvalds * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
371da177e4SLinus Torvalds * USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
381da177e4SLinus Torvalds * HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES
391da177e4SLinus Torvalds *
401da177e4SLinus Torvalds * You should have received a copy of the GNU General Public License
411da177e4SLinus Torvalds * along with this program; if not, write to the Free Software
421da177e4SLinus Torvalds * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
431da177e4SLinus Torvalds *
441da177e4SLinus Torvalds *
451da177e4SLinus Torvalds * 10/23/2000 - Alpha Release
461da177e4SLinus Torvalds *	First release to the public
471da177e4SLinus Torvalds */
481da177e4SLinus Torvalds 
491da177e4SLinus Torvalds #include <linux/kernel.h>
501da177e4SLinus Torvalds #include <linux/unistd.h>
511da177e4SLinus Torvalds #include <linux/delay.h>
521da177e4SLinus Torvalds #include <linux/ioport.h>
531da177e4SLinus Torvalds #include <linux/bitops.h>
544e57b681STim Schmielau #include <linux/sched.h>	/* cond_resched() */
554e57b681STim Schmielau 
561da177e4SLinus Torvalds #include <asm/io.h>
577c0f6ba6SLinus Torvalds #include <linux/uaccess.h>
581da177e4SLinus Torvalds #include <asm/irq.h>
591da177e4SLinus Torvalds #include "smapi.h"
601da177e4SLinus Torvalds #include "mwavedd.h"
611da177e4SLinus Torvalds #include "3780i.h"
621da177e4SLinus Torvalds 
631da177e4SLinus Torvalds static DEFINE_SPINLOCK(dsp_lock);
641da177e4SLinus Torvalds 
PaceMsaAccess(unsigned short usDspBaseIO)651da177e4SLinus Torvalds static void PaceMsaAccess(unsigned short usDspBaseIO)
661da177e4SLinus Torvalds {
671da177e4SLinus Torvalds 	cond_resched();
681da177e4SLinus Torvalds 	udelay(100);
691da177e4SLinus Torvalds 	cond_resched();
701da177e4SLinus Torvalds }
711da177e4SLinus Torvalds 
dsp3780I_ReadMsaCfg(unsigned short usDspBaseIO,unsigned long ulMsaAddr)721da177e4SLinus Torvalds unsigned short dsp3780I_ReadMsaCfg(unsigned short usDspBaseIO,
731da177e4SLinus Torvalds                                    unsigned long ulMsaAddr)
741da177e4SLinus Torvalds {
75ae6b95d4SAlexey Dobriyan 	unsigned long flags;
761da177e4SLinus Torvalds 	unsigned short val;
771da177e4SLinus Torvalds 
781da177e4SLinus Torvalds 	PRINTK_3(TRACE_3780I,
791da177e4SLinus Torvalds 		"3780i::dsp3780I_ReadMsaCfg entry usDspBaseIO %x ulMsaAddr %lx\n",
801da177e4SLinus Torvalds 		usDspBaseIO, ulMsaAddr);
811da177e4SLinus Torvalds 
821da177e4SLinus Torvalds 	spin_lock_irqsave(&dsp_lock, flags);
831da177e4SLinus Torvalds 	OutWordDsp(DSP_MsaAddrLow, (unsigned short) ulMsaAddr);
841da177e4SLinus Torvalds 	OutWordDsp(DSP_MsaAddrHigh, (unsigned short) (ulMsaAddr >> 16));
851da177e4SLinus Torvalds 	val = InWordDsp(DSP_MsaDataDSISHigh);
861da177e4SLinus Torvalds 	spin_unlock_irqrestore(&dsp_lock, flags);
871da177e4SLinus Torvalds 
881da177e4SLinus Torvalds 	PRINTK_2(TRACE_3780I, "3780i::dsp3780I_ReadMsaCfg exit val %x\n", val);
891da177e4SLinus Torvalds 
901da177e4SLinus Torvalds 	return val;
911da177e4SLinus Torvalds }
921da177e4SLinus Torvalds 
dsp3780I_WriteMsaCfg(unsigned short usDspBaseIO,unsigned long ulMsaAddr,unsigned short usValue)931da177e4SLinus Torvalds void dsp3780I_WriteMsaCfg(unsigned short usDspBaseIO,
941da177e4SLinus Torvalds                           unsigned long ulMsaAddr, unsigned short usValue)
951da177e4SLinus Torvalds {
96ae6b95d4SAlexey Dobriyan 	unsigned long flags;
971da177e4SLinus Torvalds 
981da177e4SLinus Torvalds 	PRINTK_4(TRACE_3780I,
991da177e4SLinus Torvalds 		"3780i::dsp3780i_WriteMsaCfg entry usDspBaseIO %x ulMsaAddr %lx usValue %x\n",
1001da177e4SLinus Torvalds 		usDspBaseIO, ulMsaAddr, usValue);
1011da177e4SLinus Torvalds 
1021da177e4SLinus Torvalds 	spin_lock_irqsave(&dsp_lock, flags);
1031da177e4SLinus Torvalds 	OutWordDsp(DSP_MsaAddrLow, (unsigned short) ulMsaAddr);
1041da177e4SLinus Torvalds 	OutWordDsp(DSP_MsaAddrHigh, (unsigned short) (ulMsaAddr >> 16));
1051da177e4SLinus Torvalds 	OutWordDsp(DSP_MsaDataDSISHigh, usValue);
1061da177e4SLinus Torvalds 	spin_unlock_irqrestore(&dsp_lock, flags);
1071da177e4SLinus Torvalds }
1081da177e4SLinus Torvalds 
dsp3780I_WriteGenCfg(unsigned short usDspBaseIO,unsigned uIndex,unsigned char ucValue)1093b01b47cSAdrian Bunk static void dsp3780I_WriteGenCfg(unsigned short usDspBaseIO, unsigned uIndex,
1101da177e4SLinus Torvalds 				 unsigned char ucValue)
1111da177e4SLinus Torvalds {
1121da177e4SLinus Torvalds 	DSP_ISA_SLAVE_CONTROL rSlaveControl;
1131da177e4SLinus Torvalds 	DSP_ISA_SLAVE_CONTROL rSlaveControl_Save;
1141da177e4SLinus Torvalds 
1151da177e4SLinus Torvalds 
1161da177e4SLinus Torvalds 	PRINTK_4(TRACE_3780I,
1171da177e4SLinus Torvalds 		"3780i::dsp3780i_WriteGenCfg entry usDspBaseIO %x uIndex %x ucValue %x\n",
1181da177e4SLinus Torvalds 		usDspBaseIO, uIndex, ucValue);
1191da177e4SLinus Torvalds 
1201da177e4SLinus Torvalds 	MKBYTE(rSlaveControl) = InByteDsp(DSP_IsaSlaveControl);
1211da177e4SLinus Torvalds 
1221da177e4SLinus Torvalds 	PRINTK_2(TRACE_3780I,
1231da177e4SLinus Torvalds 		"3780i::dsp3780i_WriteGenCfg rSlaveControl %x\n",
1241da177e4SLinus Torvalds 		MKBYTE(rSlaveControl));
1251da177e4SLinus Torvalds 
1261da177e4SLinus Torvalds 	rSlaveControl_Save = rSlaveControl;
12726ec99b1SArnd Bergmann 	rSlaveControl.ConfigMode = true;
1281da177e4SLinus Torvalds 
1291da177e4SLinus Torvalds 	PRINTK_2(TRACE_3780I,
1301da177e4SLinus Torvalds 		"3780i::dsp3780i_WriteGenCfg entry rSlaveControl+ConfigMode %x\n",
1311da177e4SLinus Torvalds 		MKBYTE(rSlaveControl));
1321da177e4SLinus Torvalds 
1331da177e4SLinus Torvalds 	OutByteDsp(DSP_IsaSlaveControl, MKBYTE(rSlaveControl));
1341da177e4SLinus Torvalds 	OutByteDsp(DSP_ConfigAddress, (unsigned char) uIndex);
1351da177e4SLinus Torvalds 	OutByteDsp(DSP_ConfigData, ucValue);
1361da177e4SLinus Torvalds 	OutByteDsp(DSP_IsaSlaveControl, MKBYTE(rSlaveControl_Save));
1371da177e4SLinus Torvalds 
1381da177e4SLinus Torvalds 	PRINTK_1(TRACE_3780I, "3780i::dsp3780i_WriteGenCfg exit\n");
1391da177e4SLinus Torvalds 
1401da177e4SLinus Torvalds 
1411da177e4SLinus Torvalds }
1421da177e4SLinus Torvalds 
1433b01b47cSAdrian Bunk #if 0
1441da177e4SLinus Torvalds unsigned char dsp3780I_ReadGenCfg(unsigned short usDspBaseIO,
1451da177e4SLinus Torvalds                                   unsigned uIndex)
1461da177e4SLinus Torvalds {
1471da177e4SLinus Torvalds 	DSP_ISA_SLAVE_CONTROL rSlaveControl;
1481da177e4SLinus Torvalds 	DSP_ISA_SLAVE_CONTROL rSlaveControl_Save;
1491da177e4SLinus Torvalds 	unsigned char ucValue;
1501da177e4SLinus Torvalds 
1511da177e4SLinus Torvalds 
1521da177e4SLinus Torvalds 	PRINTK_3(TRACE_3780I,
1531da177e4SLinus Torvalds 		"3780i::dsp3780i_ReadGenCfg entry usDspBaseIO %x uIndex %x\n",
1541da177e4SLinus Torvalds 		usDspBaseIO, uIndex);
1551da177e4SLinus Torvalds 
1561da177e4SLinus Torvalds 	MKBYTE(rSlaveControl) = InByteDsp(DSP_IsaSlaveControl);
1571da177e4SLinus Torvalds 	rSlaveControl_Save = rSlaveControl;
15826ec99b1SArnd Bergmann 	rSlaveControl.ConfigMode = true;
1591da177e4SLinus Torvalds 	OutByteDsp(DSP_IsaSlaveControl, MKBYTE(rSlaveControl));
1601da177e4SLinus Torvalds 	OutByteDsp(DSP_ConfigAddress, (unsigned char) uIndex);
1611da177e4SLinus Torvalds 	ucValue = InByteDsp(DSP_ConfigData);
1621da177e4SLinus Torvalds 	OutByteDsp(DSP_IsaSlaveControl, MKBYTE(rSlaveControl_Save));
1631da177e4SLinus Torvalds 
1641da177e4SLinus Torvalds 	PRINTK_2(TRACE_3780I,
1651da177e4SLinus Torvalds 		"3780i::dsp3780i_ReadGenCfg exit ucValue %x\n", ucValue);
1661da177e4SLinus Torvalds 
1671da177e4SLinus Torvalds 
1681da177e4SLinus Torvalds 	return ucValue;
1691da177e4SLinus Torvalds }
1703b01b47cSAdrian Bunk #endif  /*  0  */
1711da177e4SLinus Torvalds 
dsp3780I_EnableDSP(DSP_3780I_CONFIG_SETTINGS * pSettings,unsigned short * pIrqMap,unsigned short * pDmaMap)1721da177e4SLinus Torvalds int dsp3780I_EnableDSP(DSP_3780I_CONFIG_SETTINGS * pSettings,
1731da177e4SLinus Torvalds                        unsigned short *pIrqMap,
1741da177e4SLinus Torvalds                        unsigned short *pDmaMap)
1751da177e4SLinus Torvalds {
176ae6b95d4SAlexey Dobriyan 	unsigned long flags;
1771da177e4SLinus Torvalds 	unsigned short usDspBaseIO = pSettings->usDspBaseIO;
1781da177e4SLinus Torvalds 	int i;
1791da177e4SLinus Torvalds 	DSP_UART_CFG_1 rUartCfg1;
1801da177e4SLinus Torvalds 	DSP_UART_CFG_2 rUartCfg2;
1811da177e4SLinus Torvalds 	DSP_HBRIDGE_CFG_1 rHBridgeCfg1;
1821da177e4SLinus Torvalds 	DSP_HBRIDGE_CFG_2 rHBridgeCfg2;
1831da177e4SLinus Torvalds 	DSP_BUSMASTER_CFG_1 rBusmasterCfg1;
1841da177e4SLinus Torvalds 	DSP_BUSMASTER_CFG_2 rBusmasterCfg2;
1851da177e4SLinus Torvalds 	DSP_ISA_PROT_CFG rIsaProtCfg;
1861da177e4SLinus Torvalds 	DSP_POWER_MGMT_CFG rPowerMgmtCfg;
1871da177e4SLinus Torvalds 	DSP_HBUS_TIMER_CFG rHBusTimerCfg;
1881da177e4SLinus Torvalds 	DSP_LBUS_TIMEOUT_DISABLE rLBusTimeoutDisable;
1891da177e4SLinus Torvalds 	DSP_CHIP_RESET rChipReset;
1901da177e4SLinus Torvalds 	DSP_CLOCK_CONTROL_1 rClockControl1;
1911da177e4SLinus Torvalds 	DSP_CLOCK_CONTROL_2 rClockControl2;
1921da177e4SLinus Torvalds 	DSP_ISA_SLAVE_CONTROL rSlaveControl;
1931da177e4SLinus Torvalds 	DSP_HBRIDGE_CONTROL rHBridgeControl;
1941da177e4SLinus Torvalds 	unsigned short ChipID = 0;
1951da177e4SLinus Torvalds 	unsigned short tval;
1961da177e4SLinus Torvalds 
1971da177e4SLinus Torvalds 
1981da177e4SLinus Torvalds 	PRINTK_2(TRACE_3780I,
1991da177e4SLinus Torvalds 		"3780i::dsp3780I_EnableDSP entry pSettings->bDSPEnabled %x\n",
2001da177e4SLinus Torvalds 		pSettings->bDSPEnabled);
2011da177e4SLinus Torvalds 
2021da177e4SLinus Torvalds 
2031da177e4SLinus Torvalds 	if (!pSettings->bDSPEnabled) {
2041da177e4SLinus Torvalds 		PRINTK_ERROR( KERN_ERR "3780i::dsp3780I_EnableDSP: Error: DSP not enabled. Aborting.\n" );
2051da177e4SLinus Torvalds 		return -EIO;
2061da177e4SLinus Torvalds 	}
2071da177e4SLinus Torvalds 
2081da177e4SLinus Torvalds 
2091da177e4SLinus Torvalds 	PRINTK_2(TRACE_3780I,
2101da177e4SLinus Torvalds 		"3780i::dsp3780i_EnableDSP entry pSettings->bModemEnabled %x\n",
2111da177e4SLinus Torvalds 		pSettings->bModemEnabled);
2121da177e4SLinus Torvalds 
2131da177e4SLinus Torvalds 	if (pSettings->bModemEnabled) {
2141da177e4SLinus Torvalds 		rUartCfg1.Reserved = rUartCfg2.Reserved = 0;
2151da177e4SLinus Torvalds 		rUartCfg1.IrqActiveLow = pSettings->bUartIrqActiveLow;
2161da177e4SLinus Torvalds 		rUartCfg1.IrqPulse = pSettings->bUartIrqPulse;
2171da177e4SLinus Torvalds 		rUartCfg1.Irq =
2181da177e4SLinus Torvalds 			(unsigned char) pIrqMap[pSettings->usUartIrq];
2191da177e4SLinus Torvalds 		switch (pSettings->usUartBaseIO) {
2201da177e4SLinus Torvalds 		case 0x03F8:
2211da177e4SLinus Torvalds 			rUartCfg1.BaseIO = 0;
2221da177e4SLinus Torvalds 			break;
2231da177e4SLinus Torvalds 		case 0x02F8:
2241da177e4SLinus Torvalds 			rUartCfg1.BaseIO = 1;
2251da177e4SLinus Torvalds 			break;
2261da177e4SLinus Torvalds 		case 0x03E8:
2271da177e4SLinus Torvalds 			rUartCfg1.BaseIO = 2;
2281da177e4SLinus Torvalds 			break;
2291da177e4SLinus Torvalds 		case 0x02E8:
2301da177e4SLinus Torvalds 			rUartCfg1.BaseIO = 3;
2311da177e4SLinus Torvalds 			break;
2321da177e4SLinus Torvalds 		}
23326ec99b1SArnd Bergmann 		rUartCfg2.Enable = true;
2341da177e4SLinus Torvalds 	}
2351da177e4SLinus Torvalds 
2361da177e4SLinus Torvalds 	rHBridgeCfg1.Reserved = rHBridgeCfg2.Reserved = 0;
2371da177e4SLinus Torvalds 	rHBridgeCfg1.IrqActiveLow = pSettings->bDspIrqActiveLow;
2381da177e4SLinus Torvalds 	rHBridgeCfg1.IrqPulse = pSettings->bDspIrqPulse;
2391da177e4SLinus Torvalds 	rHBridgeCfg1.Irq = (unsigned char) pIrqMap[pSettings->usDspIrq];
2401da177e4SLinus Torvalds 	rHBridgeCfg1.AccessMode = 1;
24126ec99b1SArnd Bergmann 	rHBridgeCfg2.Enable = true;
2421da177e4SLinus Torvalds 
2431da177e4SLinus Torvalds 
2441da177e4SLinus Torvalds 	rBusmasterCfg2.Reserved = 0;
2451da177e4SLinus Torvalds 	rBusmasterCfg1.Dma = (unsigned char) pDmaMap[pSettings->usDspDma];
2461da177e4SLinus Torvalds 	rBusmasterCfg1.NumTransfers =
2471da177e4SLinus Torvalds 		(unsigned char) pSettings->usNumTransfers;
2481da177e4SLinus Torvalds 	rBusmasterCfg1.ReRequest = (unsigned char) pSettings->usReRequest;
2491da177e4SLinus Torvalds 	rBusmasterCfg1.MEMCS16 = pSettings->bEnableMEMCS16;
2501da177e4SLinus Torvalds 	rBusmasterCfg2.IsaMemCmdWidth =
2511da177e4SLinus Torvalds 		(unsigned char) pSettings->usIsaMemCmdWidth;
2521da177e4SLinus Torvalds 
2531da177e4SLinus Torvalds 
2541da177e4SLinus Torvalds 	rIsaProtCfg.Reserved = 0;
2551da177e4SLinus Torvalds 	rIsaProtCfg.GateIOCHRDY = pSettings->bGateIOCHRDY;
2561da177e4SLinus Torvalds 
2571da177e4SLinus Torvalds 	rPowerMgmtCfg.Reserved = 0;
2581da177e4SLinus Torvalds 	rPowerMgmtCfg.Enable = pSettings->bEnablePwrMgmt;
2591da177e4SLinus Torvalds 
2601da177e4SLinus Torvalds 	rHBusTimerCfg.LoadValue =
2611da177e4SLinus Torvalds 		(unsigned char) pSettings->usHBusTimerLoadValue;
2621da177e4SLinus Torvalds 
2631da177e4SLinus Torvalds 	rLBusTimeoutDisable.Reserved = 0;
2641da177e4SLinus Torvalds 	rLBusTimeoutDisable.DisableTimeout =
2651da177e4SLinus Torvalds 		pSettings->bDisableLBusTimeout;
2661da177e4SLinus Torvalds 
2671da177e4SLinus Torvalds 	MKWORD(rChipReset) = ~pSettings->usChipletEnable;
2681da177e4SLinus Torvalds 
2691da177e4SLinus Torvalds 	rClockControl1.Reserved1 = rClockControl1.Reserved2 = 0;
2701da177e4SLinus Torvalds 	rClockControl1.N_Divisor = pSettings->usN_Divisor;
2711da177e4SLinus Torvalds 	rClockControl1.M_Multiplier = pSettings->usM_Multiplier;
2721da177e4SLinus Torvalds 
2731da177e4SLinus Torvalds 	rClockControl2.Reserved = 0;
2741da177e4SLinus Torvalds 	rClockControl2.PllBypass = pSettings->bPllBypass;
2751da177e4SLinus Torvalds 
2761da177e4SLinus Torvalds 	/* Issue a soft reset to the chip */
2771da177e4SLinus Torvalds 	/* Note: Since we may be coming in with 3780i clocks suspended, we must keep
2781da177e4SLinus Torvalds 	* soft-reset active for 10ms.
2791da177e4SLinus Torvalds 	*/
2801da177e4SLinus Torvalds 	rSlaveControl.ClockControl = 0;
28126ec99b1SArnd Bergmann 	rSlaveControl.SoftReset = true;
28226ec99b1SArnd Bergmann 	rSlaveControl.ConfigMode = false;
2831da177e4SLinus Torvalds 	rSlaveControl.Reserved = 0;
2841da177e4SLinus Torvalds 
2851da177e4SLinus Torvalds 	PRINTK_4(TRACE_3780I,
2861da177e4SLinus Torvalds 		"3780i::dsp3780i_EnableDSP usDspBaseIO %x index %x taddr %x\n",
2871da177e4SLinus Torvalds 		usDspBaseIO, DSP_IsaSlaveControl,
2881da177e4SLinus Torvalds 		usDspBaseIO + DSP_IsaSlaveControl);
2891da177e4SLinus Torvalds 
2901da177e4SLinus Torvalds 	PRINTK_2(TRACE_3780I,
2911da177e4SLinus Torvalds 		"3780i::dsp3780i_EnableDSP rSlaveContrl %x\n",
2921da177e4SLinus Torvalds 		MKWORD(rSlaveControl));
2931da177e4SLinus Torvalds 
2941da177e4SLinus Torvalds 	spin_lock_irqsave(&dsp_lock, flags);
2951da177e4SLinus Torvalds 	OutWordDsp(DSP_IsaSlaveControl, MKWORD(rSlaveControl));
2961da177e4SLinus Torvalds 	MKWORD(tval) = InWordDsp(DSP_IsaSlaveControl);
2971da177e4SLinus Torvalds 
2981da177e4SLinus Torvalds 	PRINTK_2(TRACE_3780I,
2991da177e4SLinus Torvalds 		"3780i::dsp3780i_EnableDSP rSlaveControl 2 %x\n", tval);
3001da177e4SLinus Torvalds 
3011da177e4SLinus Torvalds 
3021da177e4SLinus Torvalds 	for (i = 0; i < 11; i++)
3031da177e4SLinus Torvalds 		udelay(2000);
3041da177e4SLinus Torvalds 
30526ec99b1SArnd Bergmann 	rSlaveControl.SoftReset = false;
3061da177e4SLinus Torvalds 	OutWordDsp(DSP_IsaSlaveControl, MKWORD(rSlaveControl));
3071da177e4SLinus Torvalds 
3081da177e4SLinus Torvalds 	MKWORD(tval) = InWordDsp(DSP_IsaSlaveControl);
3091da177e4SLinus Torvalds 
3101da177e4SLinus Torvalds 	PRINTK_2(TRACE_3780I,
3111da177e4SLinus Torvalds 		"3780i::dsp3780i_EnableDSP rSlaveControl 3 %x\n", tval);
3121da177e4SLinus Torvalds 
3131da177e4SLinus Torvalds 
3141da177e4SLinus Torvalds 	/* Program our general configuration registers */
3151da177e4SLinus Torvalds 	WriteGenCfg(DSP_HBridgeCfg1Index, MKBYTE(rHBridgeCfg1));
3161da177e4SLinus Torvalds 	WriteGenCfg(DSP_HBridgeCfg2Index, MKBYTE(rHBridgeCfg2));
3171da177e4SLinus Torvalds 	WriteGenCfg(DSP_BusMasterCfg1Index, MKBYTE(rBusmasterCfg1));
3181da177e4SLinus Torvalds 	WriteGenCfg(DSP_BusMasterCfg2Index, MKBYTE(rBusmasterCfg2));
3191da177e4SLinus Torvalds 	WriteGenCfg(DSP_IsaProtCfgIndex, MKBYTE(rIsaProtCfg));
3201da177e4SLinus Torvalds 	WriteGenCfg(DSP_PowerMgCfgIndex, MKBYTE(rPowerMgmtCfg));
3211da177e4SLinus Torvalds 	WriteGenCfg(DSP_HBusTimerCfgIndex, MKBYTE(rHBusTimerCfg));
3221da177e4SLinus Torvalds 
3231da177e4SLinus Torvalds 	if (pSettings->bModemEnabled) {
3241da177e4SLinus Torvalds 		WriteGenCfg(DSP_UartCfg1Index, MKBYTE(rUartCfg1));
3251da177e4SLinus Torvalds 		WriteGenCfg(DSP_UartCfg2Index, MKBYTE(rUartCfg2));
3261da177e4SLinus Torvalds 	}
3271da177e4SLinus Torvalds 
3281da177e4SLinus Torvalds 
32926ec99b1SArnd Bergmann 	rHBridgeControl.EnableDspInt = false;
33026ec99b1SArnd Bergmann 	rHBridgeControl.MemAutoInc = true;
33126ec99b1SArnd Bergmann 	rHBridgeControl.IoAutoInc = false;
33226ec99b1SArnd Bergmann 	rHBridgeControl.DiagnosticMode = false;
3331da177e4SLinus Torvalds 
3341da177e4SLinus Torvalds 	PRINTK_3(TRACE_3780I,
3351da177e4SLinus Torvalds 		"3780i::dsp3780i_EnableDSP DSP_HBridgeControl %x rHBridgeControl %x\n",
3361da177e4SLinus Torvalds 		DSP_HBridgeControl, MKWORD(rHBridgeControl));
3371da177e4SLinus Torvalds 
3381da177e4SLinus Torvalds 	OutWordDsp(DSP_HBridgeControl, MKWORD(rHBridgeControl));
3391da177e4SLinus Torvalds 	spin_unlock_irqrestore(&dsp_lock, flags);
3401da177e4SLinus Torvalds 	WriteMsaCfg(DSP_LBusTimeoutDisable, MKWORD(rLBusTimeoutDisable));
3411da177e4SLinus Torvalds 	WriteMsaCfg(DSP_ClockControl_1, MKWORD(rClockControl1));
3421da177e4SLinus Torvalds 	WriteMsaCfg(DSP_ClockControl_2, MKWORD(rClockControl2));
3431da177e4SLinus Torvalds 	WriteMsaCfg(DSP_ChipReset, MKWORD(rChipReset));
3441da177e4SLinus Torvalds 
3451da177e4SLinus Torvalds 	ChipID = ReadMsaCfg(DSP_ChipID);
3461da177e4SLinus Torvalds 
3471da177e4SLinus Torvalds 	PRINTK_2(TRACE_3780I,
34826ec99b1SArnd Bergmann 		"3780i::dsp3780I_EnableDSP exiting bRC=true, ChipID %x\n",
3491da177e4SLinus Torvalds 		ChipID);
3501da177e4SLinus Torvalds 
3511da177e4SLinus Torvalds 	return 0;
3521da177e4SLinus Torvalds }
3531da177e4SLinus Torvalds 
dsp3780I_DisableDSP(DSP_3780I_CONFIG_SETTINGS * pSettings)3541da177e4SLinus Torvalds int dsp3780I_DisableDSP(DSP_3780I_CONFIG_SETTINGS * pSettings)
3551da177e4SLinus Torvalds {
356ae6b95d4SAlexey Dobriyan 	unsigned long flags;
3571da177e4SLinus Torvalds 	unsigned short usDspBaseIO = pSettings->usDspBaseIO;
3581da177e4SLinus Torvalds 	DSP_ISA_SLAVE_CONTROL rSlaveControl;
3591da177e4SLinus Torvalds 
3601da177e4SLinus Torvalds 
3611da177e4SLinus Torvalds 	PRINTK_1(TRACE_3780I, "3780i::dsp3780i_DisableDSP entry\n");
3621da177e4SLinus Torvalds 
3631da177e4SLinus Torvalds 	rSlaveControl.ClockControl = 0;
36426ec99b1SArnd Bergmann 	rSlaveControl.SoftReset = true;
36526ec99b1SArnd Bergmann 	rSlaveControl.ConfigMode = false;
3661da177e4SLinus Torvalds 	rSlaveControl.Reserved = 0;
3671da177e4SLinus Torvalds 	spin_lock_irqsave(&dsp_lock, flags);
3681da177e4SLinus Torvalds 	OutWordDsp(DSP_IsaSlaveControl, MKWORD(rSlaveControl));
3691da177e4SLinus Torvalds 
3701da177e4SLinus Torvalds 	udelay(5);
3711da177e4SLinus Torvalds 
3721da177e4SLinus Torvalds 	rSlaveControl.ClockControl = 1;
3731da177e4SLinus Torvalds 	OutWordDsp(DSP_IsaSlaveControl, MKWORD(rSlaveControl));
3741da177e4SLinus Torvalds 	spin_unlock_irqrestore(&dsp_lock, flags);
3751da177e4SLinus Torvalds 
3761da177e4SLinus Torvalds 	udelay(5);
3771da177e4SLinus Torvalds 
3781da177e4SLinus Torvalds 
3791da177e4SLinus Torvalds 	PRINTK_1(TRACE_3780I, "3780i::dsp3780i_DisableDSP exit\n");
3801da177e4SLinus Torvalds 
3811da177e4SLinus Torvalds 	return 0;
3821da177e4SLinus Torvalds }
3831da177e4SLinus Torvalds 
dsp3780I_Reset(DSP_3780I_CONFIG_SETTINGS * pSettings)3841da177e4SLinus Torvalds int dsp3780I_Reset(DSP_3780I_CONFIG_SETTINGS * pSettings)
3851da177e4SLinus Torvalds {
386ae6b95d4SAlexey Dobriyan 	unsigned long flags;
3871da177e4SLinus Torvalds 	unsigned short usDspBaseIO = pSettings->usDspBaseIO;
3881da177e4SLinus Torvalds 	DSP_BOOT_DOMAIN rBootDomain;
3891da177e4SLinus Torvalds 	DSP_HBRIDGE_CONTROL rHBridgeControl;
3901da177e4SLinus Torvalds 
3911da177e4SLinus Torvalds 
3921da177e4SLinus Torvalds 	PRINTK_1(TRACE_3780I, "3780i::dsp3780i_Reset entry\n");
3931da177e4SLinus Torvalds 
3941da177e4SLinus Torvalds 	spin_lock_irqsave(&dsp_lock, flags);
3951da177e4SLinus Torvalds 	/* Mask DSP to PC interrupt */
3961da177e4SLinus Torvalds 	MKWORD(rHBridgeControl) = InWordDsp(DSP_HBridgeControl);
3971da177e4SLinus Torvalds 
3981da177e4SLinus Torvalds 	PRINTK_2(TRACE_3780I, "3780i::dsp3780i_Reset rHBridgeControl %x\n",
3991da177e4SLinus Torvalds 		MKWORD(rHBridgeControl));
4001da177e4SLinus Torvalds 
40126ec99b1SArnd Bergmann 	rHBridgeControl.EnableDspInt = false;
4021da177e4SLinus Torvalds 	OutWordDsp(DSP_HBridgeControl, MKWORD(rHBridgeControl));
4031da177e4SLinus Torvalds 	spin_unlock_irqrestore(&dsp_lock, flags);
4041da177e4SLinus Torvalds 
4051da177e4SLinus Torvalds 	/* Reset the core via the boot domain register */
40626ec99b1SArnd Bergmann 	rBootDomain.ResetCore = true;
40726ec99b1SArnd Bergmann 	rBootDomain.Halt = true;
40826ec99b1SArnd Bergmann 	rBootDomain.NMI = true;
4091da177e4SLinus Torvalds 	rBootDomain.Reserved = 0;
4101da177e4SLinus Torvalds 
4111da177e4SLinus Torvalds 	PRINTK_2(TRACE_3780I, "3780i::dsp3780i_Reset rBootDomain %x\n",
4121da177e4SLinus Torvalds 		MKWORD(rBootDomain));
4131da177e4SLinus Torvalds 
4141da177e4SLinus Torvalds 	WriteMsaCfg(DSP_MspBootDomain, MKWORD(rBootDomain));
4151da177e4SLinus Torvalds 
4161da177e4SLinus Torvalds 	/* Reset all the chiplets and then reactivate them */
4171da177e4SLinus Torvalds 	WriteMsaCfg(DSP_ChipReset, 0xFFFF);
4181da177e4SLinus Torvalds 	udelay(5);
4191da177e4SLinus Torvalds 	WriteMsaCfg(DSP_ChipReset,
4201da177e4SLinus Torvalds 			(unsigned short) (~pSettings->usChipletEnable));
4211da177e4SLinus Torvalds 
4221da177e4SLinus Torvalds 
4231da177e4SLinus Torvalds 	PRINTK_1(TRACE_3780I, "3780i::dsp3780i_Reset exit bRC=0\n");
4241da177e4SLinus Torvalds 
4251da177e4SLinus Torvalds 	return 0;
4261da177e4SLinus Torvalds }
4271da177e4SLinus Torvalds 
4281da177e4SLinus Torvalds 
dsp3780I_Run(DSP_3780I_CONFIG_SETTINGS * pSettings)4291da177e4SLinus Torvalds int dsp3780I_Run(DSP_3780I_CONFIG_SETTINGS * pSettings)
4301da177e4SLinus Torvalds {
431ae6b95d4SAlexey Dobriyan 	unsigned long flags;
4321da177e4SLinus Torvalds 	unsigned short usDspBaseIO = pSettings->usDspBaseIO;
4331da177e4SLinus Torvalds 	DSP_BOOT_DOMAIN rBootDomain;
4341da177e4SLinus Torvalds 	DSP_HBRIDGE_CONTROL rHBridgeControl;
4351da177e4SLinus Torvalds 
4361da177e4SLinus Torvalds 
4371da177e4SLinus Torvalds 	PRINTK_1(TRACE_3780I, "3780i::dsp3780i_Run entry\n");
4381da177e4SLinus Torvalds 
4391da177e4SLinus Torvalds 
4401da177e4SLinus Torvalds 	/* Transition the core to a running state */
44126ec99b1SArnd Bergmann 	rBootDomain.ResetCore = true;
44226ec99b1SArnd Bergmann 	rBootDomain.Halt = false;
44326ec99b1SArnd Bergmann 	rBootDomain.NMI = true;
4441da177e4SLinus Torvalds 	rBootDomain.Reserved = 0;
4451da177e4SLinus Torvalds 	WriteMsaCfg(DSP_MspBootDomain, MKWORD(rBootDomain));
4461da177e4SLinus Torvalds 
4471da177e4SLinus Torvalds 	udelay(5);
4481da177e4SLinus Torvalds 
44926ec99b1SArnd Bergmann 	rBootDomain.ResetCore = false;
4501da177e4SLinus Torvalds 	WriteMsaCfg(DSP_MspBootDomain, MKWORD(rBootDomain));
4511da177e4SLinus Torvalds 	udelay(5);
4521da177e4SLinus Torvalds 
45326ec99b1SArnd Bergmann 	rBootDomain.NMI = false;
4541da177e4SLinus Torvalds 	WriteMsaCfg(DSP_MspBootDomain, MKWORD(rBootDomain));
4551da177e4SLinus Torvalds 	udelay(5);
4561da177e4SLinus Torvalds 
4571da177e4SLinus Torvalds 	/* Enable DSP to PC interrupt */
4581da177e4SLinus Torvalds 	spin_lock_irqsave(&dsp_lock, flags);
4591da177e4SLinus Torvalds 	MKWORD(rHBridgeControl) = InWordDsp(DSP_HBridgeControl);
46026ec99b1SArnd Bergmann 	rHBridgeControl.EnableDspInt = true;
4611da177e4SLinus Torvalds 
4621da177e4SLinus Torvalds 	PRINTK_2(TRACE_3780I, "3780i::dsp3780i_Run rHBridgeControl %x\n",
4631da177e4SLinus Torvalds 		MKWORD(rHBridgeControl));
4641da177e4SLinus Torvalds 
4651da177e4SLinus Torvalds 	OutWordDsp(DSP_HBridgeControl, MKWORD(rHBridgeControl));
4661da177e4SLinus Torvalds 	spin_unlock_irqrestore(&dsp_lock, flags);
4671da177e4SLinus Torvalds 
4681da177e4SLinus Torvalds 
46926ec99b1SArnd Bergmann 	PRINTK_1(TRACE_3780I, "3780i::dsp3780i_Run exit bRC=true\n");
4701da177e4SLinus Torvalds 
4711da177e4SLinus Torvalds 	return 0;
4721da177e4SLinus Torvalds }
4731da177e4SLinus Torvalds 
4741da177e4SLinus Torvalds 
dsp3780I_ReadDStore(unsigned short usDspBaseIO,void __user * pvBuffer,unsigned uCount,unsigned long ulDSPAddr)4751da177e4SLinus Torvalds int dsp3780I_ReadDStore(unsigned short usDspBaseIO, void __user *pvBuffer,
4761da177e4SLinus Torvalds                         unsigned uCount, unsigned long ulDSPAddr)
4771da177e4SLinus Torvalds {
478ae6b95d4SAlexey Dobriyan 	unsigned long flags;
4791da177e4SLinus Torvalds 	unsigned short __user *pusBuffer = pvBuffer;
4801da177e4SLinus Torvalds 	unsigned short val;
4811da177e4SLinus Torvalds 
4821da177e4SLinus Torvalds 
4831da177e4SLinus Torvalds 	PRINTK_5(TRACE_3780I,
4841da177e4SLinus Torvalds 		"3780i::dsp3780I_ReadDStore entry usDspBaseIO %x, pusBuffer %p, uCount %x, ulDSPAddr %lx\n",
4851da177e4SLinus Torvalds 		usDspBaseIO, pusBuffer, uCount, ulDSPAddr);
4861da177e4SLinus Torvalds 
4871da177e4SLinus Torvalds 
4881da177e4SLinus Torvalds 	/* Set the initial MSA address. No adjustments need to be made to data store addresses */
4891da177e4SLinus Torvalds 	spin_lock_irqsave(&dsp_lock, flags);
4901da177e4SLinus Torvalds 	OutWordDsp(DSP_MsaAddrLow, (unsigned short) ulDSPAddr);
4911da177e4SLinus Torvalds 	OutWordDsp(DSP_MsaAddrHigh, (unsigned short) (ulDSPAddr >> 16));
4921da177e4SLinus Torvalds 	spin_unlock_irqrestore(&dsp_lock, flags);
4931da177e4SLinus Torvalds 
4941da177e4SLinus Torvalds 	/* Transfer the memory block */
4951da177e4SLinus Torvalds 	while (uCount-- != 0) {
4961da177e4SLinus Torvalds 		spin_lock_irqsave(&dsp_lock, flags);
4971da177e4SLinus Torvalds 		val = InWordDsp(DSP_MsaDataDSISHigh);
4981da177e4SLinus Torvalds 		spin_unlock_irqrestore(&dsp_lock, flags);
4991da177e4SLinus Torvalds 		if(put_user(val, pusBuffer++))
5001da177e4SLinus Torvalds 			return -EFAULT;
5011da177e4SLinus Torvalds 
5021da177e4SLinus Torvalds 		PRINTK_3(TRACE_3780I,
5031da177e4SLinus Torvalds 			"3780I::dsp3780I_ReadDStore uCount %x val %x\n",
5041da177e4SLinus Torvalds 			uCount, val);
5051da177e4SLinus Torvalds 
5061da177e4SLinus Torvalds 		PaceMsaAccess(usDspBaseIO);
5071da177e4SLinus Torvalds 	}
5081da177e4SLinus Torvalds 
5091da177e4SLinus Torvalds 
5101da177e4SLinus Torvalds 	PRINTK_1(TRACE_3780I,
51126ec99b1SArnd Bergmann 		"3780I::dsp3780I_ReadDStore exit bRC=true\n");
5121da177e4SLinus Torvalds 
5131da177e4SLinus Torvalds 	return 0;
5141da177e4SLinus Torvalds }
5151da177e4SLinus Torvalds 
dsp3780I_ReadAndClearDStore(unsigned short usDspBaseIO,void __user * pvBuffer,unsigned uCount,unsigned long ulDSPAddr)5161da177e4SLinus Torvalds int dsp3780I_ReadAndClearDStore(unsigned short usDspBaseIO,
5171da177e4SLinus Torvalds                                 void __user *pvBuffer, unsigned uCount,
5181da177e4SLinus Torvalds                                 unsigned long ulDSPAddr)
5191da177e4SLinus Torvalds {
520ae6b95d4SAlexey Dobriyan 	unsigned long flags;
5211da177e4SLinus Torvalds 	unsigned short __user *pusBuffer = pvBuffer;
5221da177e4SLinus Torvalds 	unsigned short val;
5231da177e4SLinus Torvalds 
5241da177e4SLinus Torvalds 
5251da177e4SLinus Torvalds 	PRINTK_5(TRACE_3780I,
5261da177e4SLinus Torvalds 		"3780i::dsp3780I_ReadAndDStore entry usDspBaseIO %x, pusBuffer %p, uCount %x, ulDSPAddr %lx\n",
5271da177e4SLinus Torvalds 		usDspBaseIO, pusBuffer, uCount, ulDSPAddr);
5281da177e4SLinus Torvalds 
5291da177e4SLinus Torvalds 
5301da177e4SLinus Torvalds 	/* Set the initial MSA address. No adjustments need to be made to data store addresses */
5311da177e4SLinus Torvalds 	spin_lock_irqsave(&dsp_lock, flags);
5321da177e4SLinus Torvalds 	OutWordDsp(DSP_MsaAddrLow, (unsigned short) ulDSPAddr);
5331da177e4SLinus Torvalds 	OutWordDsp(DSP_MsaAddrHigh, (unsigned short) (ulDSPAddr >> 16));
5341da177e4SLinus Torvalds 	spin_unlock_irqrestore(&dsp_lock, flags);
5351da177e4SLinus Torvalds 
5361da177e4SLinus Torvalds 	/* Transfer the memory block */
5371da177e4SLinus Torvalds 	while (uCount-- != 0) {
5381da177e4SLinus Torvalds 		spin_lock_irqsave(&dsp_lock, flags);
5391da177e4SLinus Torvalds 		val = InWordDsp(DSP_ReadAndClear);
5401da177e4SLinus Torvalds 		spin_unlock_irqrestore(&dsp_lock, flags);
5411da177e4SLinus Torvalds 		if(put_user(val, pusBuffer++))
5421da177e4SLinus Torvalds 			return -EFAULT;
5431da177e4SLinus Torvalds 
5441da177e4SLinus Torvalds 		PRINTK_3(TRACE_3780I,
5451da177e4SLinus Torvalds 			"3780I::dsp3780I_ReadAndCleanDStore uCount %x val %x\n",
5461da177e4SLinus Torvalds 			uCount, val);
5471da177e4SLinus Torvalds 
5481da177e4SLinus Torvalds 		PaceMsaAccess(usDspBaseIO);
5491da177e4SLinus Torvalds 	}
5501da177e4SLinus Torvalds 
5511da177e4SLinus Torvalds 
5521da177e4SLinus Torvalds 	PRINTK_1(TRACE_3780I,
55326ec99b1SArnd Bergmann 		"3780I::dsp3780I_ReadAndClearDStore exit bRC=true\n");
5541da177e4SLinus Torvalds 
5551da177e4SLinus Torvalds 	return 0;
5561da177e4SLinus Torvalds }
5571da177e4SLinus Torvalds 
5581da177e4SLinus Torvalds 
dsp3780I_WriteDStore(unsigned short usDspBaseIO,void __user * pvBuffer,unsigned uCount,unsigned long ulDSPAddr)5591da177e4SLinus Torvalds int dsp3780I_WriteDStore(unsigned short usDspBaseIO, void __user *pvBuffer,
5601da177e4SLinus Torvalds                          unsigned uCount, unsigned long ulDSPAddr)
5611da177e4SLinus Torvalds {
562ae6b95d4SAlexey Dobriyan 	unsigned long flags;
5631da177e4SLinus Torvalds 	unsigned short __user *pusBuffer = pvBuffer;
5641da177e4SLinus Torvalds 
5651da177e4SLinus Torvalds 
5661da177e4SLinus Torvalds 	PRINTK_5(TRACE_3780I,
5671da177e4SLinus Torvalds 		"3780i::dsp3780D_WriteDStore entry usDspBaseIO %x, pusBuffer %p, uCount %x, ulDSPAddr %lx\n",
5681da177e4SLinus Torvalds 		usDspBaseIO, pusBuffer, uCount, ulDSPAddr);
5691da177e4SLinus Torvalds 
5701da177e4SLinus Torvalds 
5711da177e4SLinus Torvalds 	/* Set the initial MSA address. No adjustments need to be made to data store addresses */
5721da177e4SLinus Torvalds 	spin_lock_irqsave(&dsp_lock, flags);
5731da177e4SLinus Torvalds 	OutWordDsp(DSP_MsaAddrLow, (unsigned short) ulDSPAddr);
5741da177e4SLinus Torvalds 	OutWordDsp(DSP_MsaAddrHigh, (unsigned short) (ulDSPAddr >> 16));
5751da177e4SLinus Torvalds 	spin_unlock_irqrestore(&dsp_lock, flags);
5761da177e4SLinus Torvalds 
5771da177e4SLinus Torvalds 	/* Transfer the memory block */
5781da177e4SLinus Torvalds 	while (uCount-- != 0) {
5791da177e4SLinus Torvalds 		unsigned short val;
5801da177e4SLinus Torvalds 		if(get_user(val, pusBuffer++))
5811da177e4SLinus Torvalds 			return -EFAULT;
5821da177e4SLinus Torvalds 		spin_lock_irqsave(&dsp_lock, flags);
5831da177e4SLinus Torvalds 		OutWordDsp(DSP_MsaDataDSISHigh, val);
5841da177e4SLinus Torvalds 		spin_unlock_irqrestore(&dsp_lock, flags);
5851da177e4SLinus Torvalds 
5861da177e4SLinus Torvalds 		PRINTK_3(TRACE_3780I,
5871da177e4SLinus Torvalds 			"3780I::dsp3780I_WriteDStore uCount %x val %x\n",
5881da177e4SLinus Torvalds 			uCount, val);
5891da177e4SLinus Torvalds 
5901da177e4SLinus Torvalds 		PaceMsaAccess(usDspBaseIO);
5911da177e4SLinus Torvalds 	}
5921da177e4SLinus Torvalds 
5931da177e4SLinus Torvalds 
5941da177e4SLinus Torvalds 	PRINTK_1(TRACE_3780I,
59526ec99b1SArnd Bergmann 		"3780I::dsp3780D_WriteDStore exit bRC=true\n");
5961da177e4SLinus Torvalds 
5971da177e4SLinus Torvalds 	return 0;
5981da177e4SLinus Torvalds }
5991da177e4SLinus Torvalds 
6001da177e4SLinus Torvalds 
dsp3780I_ReadIStore(unsigned short usDspBaseIO,void __user * pvBuffer,unsigned uCount,unsigned long ulDSPAddr)6011da177e4SLinus Torvalds int dsp3780I_ReadIStore(unsigned short usDspBaseIO, void __user *pvBuffer,
6021da177e4SLinus Torvalds                         unsigned uCount, unsigned long ulDSPAddr)
6031da177e4SLinus Torvalds {
604ae6b95d4SAlexey Dobriyan 	unsigned long flags;
6051da177e4SLinus Torvalds 	unsigned short __user *pusBuffer = pvBuffer;
6061da177e4SLinus Torvalds 
6071da177e4SLinus Torvalds 	PRINTK_5(TRACE_3780I,
6081da177e4SLinus Torvalds 		"3780i::dsp3780I_ReadIStore entry usDspBaseIO %x, pusBuffer %p, uCount %x, ulDSPAddr %lx\n",
6091da177e4SLinus Torvalds 		usDspBaseIO, pusBuffer, uCount, ulDSPAddr);
6101da177e4SLinus Torvalds 
6111da177e4SLinus Torvalds 	/*
6121da177e4SLinus Torvalds 	* Set the initial MSA address. To convert from an instruction store
6131da177e4SLinus Torvalds 	* address to an MSA address
6141da177e4SLinus Torvalds 	* shift the address two bits to the left and set bit 22
6151da177e4SLinus Torvalds 	*/
6161da177e4SLinus Torvalds 	ulDSPAddr = (ulDSPAddr << 2) | (1 << 22);
6171da177e4SLinus Torvalds 	spin_lock_irqsave(&dsp_lock, flags);
6181da177e4SLinus Torvalds 	OutWordDsp(DSP_MsaAddrLow, (unsigned short) ulDSPAddr);
6191da177e4SLinus Torvalds 	OutWordDsp(DSP_MsaAddrHigh, (unsigned short) (ulDSPAddr >> 16));
6201da177e4SLinus Torvalds 	spin_unlock_irqrestore(&dsp_lock, flags);
6211da177e4SLinus Torvalds 
6221da177e4SLinus Torvalds 	/* Transfer the memory block */
6231da177e4SLinus Torvalds 	while (uCount-- != 0) {
6241da177e4SLinus Torvalds 		unsigned short val_lo, val_hi;
6251da177e4SLinus Torvalds 		spin_lock_irqsave(&dsp_lock, flags);
6261da177e4SLinus Torvalds 		val_lo = InWordDsp(DSP_MsaDataISLow);
6271da177e4SLinus Torvalds 		val_hi = InWordDsp(DSP_MsaDataDSISHigh);
6281da177e4SLinus Torvalds 		spin_unlock_irqrestore(&dsp_lock, flags);
6291da177e4SLinus Torvalds 		if(put_user(val_lo, pusBuffer++))
6301da177e4SLinus Torvalds 			return -EFAULT;
6311da177e4SLinus Torvalds 		if(put_user(val_hi, pusBuffer++))
6321da177e4SLinus Torvalds 			return -EFAULT;
6331da177e4SLinus Torvalds 
6341da177e4SLinus Torvalds 		PRINTK_4(TRACE_3780I,
6351da177e4SLinus Torvalds 			"3780I::dsp3780I_ReadIStore uCount %x val_lo %x val_hi %x\n",
6361da177e4SLinus Torvalds 			uCount, val_lo, val_hi);
6371da177e4SLinus Torvalds 
6381da177e4SLinus Torvalds 		PaceMsaAccess(usDspBaseIO);
6391da177e4SLinus Torvalds 
6401da177e4SLinus Torvalds 	}
6411da177e4SLinus Torvalds 
6421da177e4SLinus Torvalds 	PRINTK_1(TRACE_3780I,
64326ec99b1SArnd Bergmann 		"3780I::dsp3780I_ReadIStore exit bRC=true\n");
6441da177e4SLinus Torvalds 
6451da177e4SLinus Torvalds 	return 0;
6461da177e4SLinus Torvalds }
6471da177e4SLinus Torvalds 
6481da177e4SLinus Torvalds 
dsp3780I_WriteIStore(unsigned short usDspBaseIO,void __user * pvBuffer,unsigned uCount,unsigned long ulDSPAddr)6491da177e4SLinus Torvalds int dsp3780I_WriteIStore(unsigned short usDspBaseIO, void __user *pvBuffer,
6501da177e4SLinus Torvalds                          unsigned uCount, unsigned long ulDSPAddr)
6511da177e4SLinus Torvalds {
652ae6b95d4SAlexey Dobriyan 	unsigned long flags;
6531da177e4SLinus Torvalds 	unsigned short __user *pusBuffer = pvBuffer;
6541da177e4SLinus Torvalds 
6551da177e4SLinus Torvalds 	PRINTK_5(TRACE_3780I,
6561da177e4SLinus Torvalds 		"3780i::dsp3780I_WriteIStore entry usDspBaseIO %x, pusBuffer %p, uCount %x, ulDSPAddr %lx\n",
6571da177e4SLinus Torvalds 		usDspBaseIO, pusBuffer, uCount, ulDSPAddr);
6581da177e4SLinus Torvalds 
6591da177e4SLinus Torvalds 
6601da177e4SLinus Torvalds 	/*
6611da177e4SLinus Torvalds 	* Set the initial MSA address. To convert from an instruction store
6621da177e4SLinus Torvalds 	* address to an MSA address
6631da177e4SLinus Torvalds 	* shift the address two bits to the left and set bit 22
6641da177e4SLinus Torvalds 	*/
6651da177e4SLinus Torvalds 	ulDSPAddr = (ulDSPAddr << 2) | (1 << 22);
6661da177e4SLinus Torvalds 	spin_lock_irqsave(&dsp_lock, flags);
6671da177e4SLinus Torvalds 	OutWordDsp(DSP_MsaAddrLow, (unsigned short) ulDSPAddr);
6681da177e4SLinus Torvalds 	OutWordDsp(DSP_MsaAddrHigh, (unsigned short) (ulDSPAddr >> 16));
6691da177e4SLinus Torvalds 	spin_unlock_irqrestore(&dsp_lock, flags);
6701da177e4SLinus Torvalds 
6711da177e4SLinus Torvalds 	/* Transfer the memory block */
6721da177e4SLinus Torvalds 	while (uCount-- != 0) {
6731da177e4SLinus Torvalds 		unsigned short val_lo, val_hi;
6741da177e4SLinus Torvalds 		if(get_user(val_lo, pusBuffer++))
6751da177e4SLinus Torvalds 			return -EFAULT;
6761da177e4SLinus Torvalds 		if(get_user(val_hi, pusBuffer++))
6771da177e4SLinus Torvalds 			return -EFAULT;
6781da177e4SLinus Torvalds 		spin_lock_irqsave(&dsp_lock, flags);
6791da177e4SLinus Torvalds 		OutWordDsp(DSP_MsaDataISLow, val_lo);
6801da177e4SLinus Torvalds 		OutWordDsp(DSP_MsaDataDSISHigh, val_hi);
6811da177e4SLinus Torvalds 		spin_unlock_irqrestore(&dsp_lock, flags);
6821da177e4SLinus Torvalds 
6831da177e4SLinus Torvalds 		PRINTK_4(TRACE_3780I,
6841da177e4SLinus Torvalds 			"3780I::dsp3780I_WriteIStore uCount %x val_lo %x val_hi %x\n",
6851da177e4SLinus Torvalds 			uCount, val_lo, val_hi);
6861da177e4SLinus Torvalds 
6871da177e4SLinus Torvalds 		PaceMsaAccess(usDspBaseIO);
6881da177e4SLinus Torvalds 
6891da177e4SLinus Torvalds 	}
6901da177e4SLinus Torvalds 
6911da177e4SLinus Torvalds 	PRINTK_1(TRACE_3780I,
69226ec99b1SArnd Bergmann 		"3780I::dsp3780I_WriteIStore exit bRC=true\n");
6931da177e4SLinus Torvalds 
6941da177e4SLinus Torvalds 	return 0;
6951da177e4SLinus Torvalds }
6961da177e4SLinus Torvalds 
6971da177e4SLinus Torvalds 
dsp3780I_GetIPCSource(unsigned short usDspBaseIO,unsigned short * pusIPCSource)6981da177e4SLinus Torvalds int dsp3780I_GetIPCSource(unsigned short usDspBaseIO,
6991da177e4SLinus Torvalds                           unsigned short *pusIPCSource)
7001da177e4SLinus Torvalds {
701ae6b95d4SAlexey Dobriyan 	unsigned long flags;
7021da177e4SLinus Torvalds 	DSP_HBRIDGE_CONTROL rHBridgeControl;
7031da177e4SLinus Torvalds 	unsigned short temp;
7041da177e4SLinus Torvalds 
7051da177e4SLinus Torvalds 
7061da177e4SLinus Torvalds 	PRINTK_3(TRACE_3780I,
7071da177e4SLinus Torvalds 		"3780i::dsp3780I_GetIPCSource entry usDspBaseIO %x pusIPCSource %p\n",
7081da177e4SLinus Torvalds 		usDspBaseIO, pusIPCSource);
7091da177e4SLinus Torvalds 
7101da177e4SLinus Torvalds 	/*
7111da177e4SLinus Torvalds 	* Disable DSP to PC interrupts, read the interrupt register,
7121da177e4SLinus Torvalds 	* clear the pending IPC bits, and reenable DSP to PC interrupts
7131da177e4SLinus Torvalds 	*/
7141da177e4SLinus Torvalds 	spin_lock_irqsave(&dsp_lock, flags);
7151da177e4SLinus Torvalds 	MKWORD(rHBridgeControl) = InWordDsp(DSP_HBridgeControl);
71626ec99b1SArnd Bergmann 	rHBridgeControl.EnableDspInt = false;
7171da177e4SLinus Torvalds 	OutWordDsp(DSP_HBridgeControl, MKWORD(rHBridgeControl));
7181da177e4SLinus Torvalds 
7191da177e4SLinus Torvalds 	*pusIPCSource = InWordDsp(DSP_Interrupt);
7201da177e4SLinus Torvalds 	temp = (unsigned short) ~(*pusIPCSource);
7211da177e4SLinus Torvalds 
7221da177e4SLinus Torvalds 	PRINTK_3(TRACE_3780I,
7231da177e4SLinus Torvalds 		"3780i::dsp3780I_GetIPCSource, usIPCSource %x ~ %x\n",
7241da177e4SLinus Torvalds 		*pusIPCSource, temp);
7251da177e4SLinus Torvalds 
7261da177e4SLinus Torvalds 	OutWordDsp(DSP_Interrupt, (unsigned short) ~(*pusIPCSource));
7271da177e4SLinus Torvalds 
72826ec99b1SArnd Bergmann 	rHBridgeControl.EnableDspInt = true;
7291da177e4SLinus Torvalds 	OutWordDsp(DSP_HBridgeControl, MKWORD(rHBridgeControl));
7301da177e4SLinus Torvalds 	spin_unlock_irqrestore(&dsp_lock, flags);
7311da177e4SLinus Torvalds 
7321da177e4SLinus Torvalds 
7331da177e4SLinus Torvalds 	PRINTK_2(TRACE_3780I,
7341da177e4SLinus Torvalds 		"3780i::dsp3780I_GetIPCSource exit usIPCSource %x\n",
7351da177e4SLinus Torvalds 		*pusIPCSource);
7361da177e4SLinus Torvalds 
7371da177e4SLinus Torvalds 	return 0;
7381da177e4SLinus Torvalds }
739