static void EnableSRAM(THINKPAD_BD_DATA * pBDData)
{
	DSP_3780I_CONFIG_SETTINGS *pSettings = &pBDData->rDspSettings;
	unsigned short usDspBaseIO = pSettings->usDspBaseIO;
	DSP_GPIO_OUTPUT_DATA_15_8 rGpioOutputData;
	DSP_GPIO_DRIVER_ENABLE_15_8 rGpioDriverEnable;
	DSP_GPIO_MODE_15_8 rGpioMode;

	PRINTK_1(TRACE_TP3780I, "tp3780i::EnableSRAM, entry\n");

	MKWORD(rGpioMode) = ReadMsaCfg(DSP_GpioModeControl_15_8);
	rGpioMode.GpioMode10 = 0;
	WriteMsaCfg(DSP_GpioModeControl_15_8, MKWORD(rGpioMode));

	MKWORD(rGpioDriverEnable) = 0;
	rGpioDriverEnable.Enable10 = TRUE;
	rGpioDriverEnable.Mask10 = TRUE;
	WriteMsaCfg(DSP_GpioDriverEnable_15_8, MKWORD(rGpioDriverEnable));

	MKWORD(rGpioOutputData) = 0;
	rGpioOutputData.Latch10 = 0;
	rGpioOutputData.Mask10 = TRUE;
	WriteMsaCfg(DSP_GpioOutputData_15_8, MKWORD(rGpioOutputData));

	PRINTK_1(TRACE_TP3780I, "tp3780i::EnableSRAM exit\n");
}
Example #2
0
int dsp3780I_EnableDSP(DSP_3780I_CONFIG_SETTINGS * pSettings,
                       unsigned short *pIrqMap,
                       unsigned short *pDmaMap)
{
    unsigned long flags;
    unsigned short usDspBaseIO = pSettings->usDspBaseIO;
    int i;
    DSP_UART_CFG_1 rUartCfg1;
    DSP_UART_CFG_2 rUartCfg2;
    DSP_HBRIDGE_CFG_1 rHBridgeCfg1;
    DSP_HBRIDGE_CFG_2 rHBridgeCfg2;
    DSP_BUSMASTER_CFG_1 rBusmasterCfg1;
    DSP_BUSMASTER_CFG_2 rBusmasterCfg2;
    DSP_ISA_PROT_CFG rIsaProtCfg;
    DSP_POWER_MGMT_CFG rPowerMgmtCfg;
    DSP_HBUS_TIMER_CFG rHBusTimerCfg;
    DSP_LBUS_TIMEOUT_DISABLE rLBusTimeoutDisable;
    DSP_CHIP_RESET rChipReset;
    DSP_CLOCK_CONTROL_1 rClockControl1;
    DSP_CLOCK_CONTROL_2 rClockControl2;
    DSP_ISA_SLAVE_CONTROL rSlaveControl;
    DSP_HBRIDGE_CONTROL rHBridgeControl;
    unsigned short ChipID = 0;
    unsigned short tval;


    PRINTK_2(TRACE_3780I,
             "3780i::dsp3780I_EnableDSP entry pSettings->bDSPEnabled %x\n",
             pSettings->bDSPEnabled);


    if (!pSettings->bDSPEnabled) {
        PRINTK_ERROR( KERN_ERR "3780i::dsp3780I_EnableDSP: Error: DSP not enabled. Aborting.\n" );
        return -EIO;
    }


    PRINTK_2(TRACE_3780I,
             "3780i::dsp3780i_EnableDSP entry pSettings->bModemEnabled %x\n",
             pSettings->bModemEnabled);

    if (pSettings->bModemEnabled) {
        rUartCfg1.Reserved = rUartCfg2.Reserved = 0;
        rUartCfg1.IrqActiveLow = pSettings->bUartIrqActiveLow;
        rUartCfg1.IrqPulse = pSettings->bUartIrqPulse;
        rUartCfg1.Irq =
            (unsigned char) pIrqMap[pSettings->usUartIrq];
        switch (pSettings->usUartBaseIO) {
        case 0x03F8:
            rUartCfg1.BaseIO = 0;
            break;
        case 0x02F8:
            rUartCfg1.BaseIO = 1;
            break;
        case 0x03E8:
            rUartCfg1.BaseIO = 2;
            break;
        case 0x02E8:
            rUartCfg1.BaseIO = 3;
            break;
        }
        rUartCfg2.Enable = TRUE;
    }

    rHBridgeCfg1.Reserved = rHBridgeCfg2.Reserved = 0;
    rHBridgeCfg1.IrqActiveLow = pSettings->bDspIrqActiveLow;
    rHBridgeCfg1.IrqPulse = pSettings->bDspIrqPulse;
    rHBridgeCfg1.Irq = (unsigned char) pIrqMap[pSettings->usDspIrq];
    rHBridgeCfg1.AccessMode = 1;
    rHBridgeCfg2.Enable = TRUE;


    rBusmasterCfg2.Reserved = 0;
    rBusmasterCfg1.Dma = (unsigned char) pDmaMap[pSettings->usDspDma];
    rBusmasterCfg1.NumTransfers =
        (unsigned char) pSettings->usNumTransfers;
    rBusmasterCfg1.ReRequest = (unsigned char) pSettings->usReRequest;
    rBusmasterCfg1.MEMCS16 = pSettings->bEnableMEMCS16;
    rBusmasterCfg2.IsaMemCmdWidth =
        (unsigned char) pSettings->usIsaMemCmdWidth;


    rIsaProtCfg.Reserved = 0;
    rIsaProtCfg.GateIOCHRDY = pSettings->bGateIOCHRDY;

    rPowerMgmtCfg.Reserved = 0;
    rPowerMgmtCfg.Enable = pSettings->bEnablePwrMgmt;

    rHBusTimerCfg.LoadValue =
        (unsigned char) pSettings->usHBusTimerLoadValue;

    rLBusTimeoutDisable.Reserved = 0;
    rLBusTimeoutDisable.DisableTimeout =
        pSettings->bDisableLBusTimeout;

    MKWORD(rChipReset) = ~pSettings->usChipletEnable;

    rClockControl1.Reserved1 = rClockControl1.Reserved2 = 0;
    rClockControl1.N_Divisor = pSettings->usN_Divisor;
    rClockControl1.M_Multiplier = pSettings->usM_Multiplier;

    rClockControl2.Reserved = 0;
    rClockControl2.PllBypass = pSettings->bPllBypass;

    /* Issue a soft reset to the chip */
    /* Note: Since we may be coming in with 3780i clocks suspended, we must keep
    * soft-reset active for 10ms.
    */
    rSlaveControl.ClockControl = 0;
    rSlaveControl.SoftReset = TRUE;
    rSlaveControl.ConfigMode = FALSE;
    rSlaveControl.Reserved = 0;

    PRINTK_4(TRACE_3780I,
             "3780i::dsp3780i_EnableDSP usDspBaseIO %x index %x taddr %x\n",
             usDspBaseIO, DSP_IsaSlaveControl,
             usDspBaseIO + DSP_IsaSlaveControl);

    PRINTK_2(TRACE_3780I,
             "3780i::dsp3780i_EnableDSP rSlaveContrl %x\n",
             MKWORD(rSlaveControl));

    spin_lock_irqsave(&dsp_lock, flags);
    OutWordDsp(DSP_IsaSlaveControl, MKWORD(rSlaveControl));
    MKWORD(tval) = InWordDsp(DSP_IsaSlaveControl);

    PRINTK_2(TRACE_3780I,
             "3780i::dsp3780i_EnableDSP rSlaveControl 2 %x\n", tval);


    for (i = 0; i < 11; i++)
        udelay(2000);

    rSlaveControl.SoftReset = FALSE;
    OutWordDsp(DSP_IsaSlaveControl, MKWORD(rSlaveControl));

    MKWORD(tval) = InWordDsp(DSP_IsaSlaveControl);

    PRINTK_2(TRACE_3780I,
             "3780i::dsp3780i_EnableDSP rSlaveControl 3 %x\n", tval);


    /* Program our general configuration registers */
    WriteGenCfg(DSP_HBridgeCfg1Index, MKBYTE(rHBridgeCfg1));
    WriteGenCfg(DSP_HBridgeCfg2Index, MKBYTE(rHBridgeCfg2));
    WriteGenCfg(DSP_BusMasterCfg1Index, MKBYTE(rBusmasterCfg1));
    WriteGenCfg(DSP_BusMasterCfg2Index, MKBYTE(rBusmasterCfg2));
    WriteGenCfg(DSP_IsaProtCfgIndex, MKBYTE(rIsaProtCfg));
    WriteGenCfg(DSP_PowerMgCfgIndex, MKBYTE(rPowerMgmtCfg));
    WriteGenCfg(DSP_HBusTimerCfgIndex, MKBYTE(rHBusTimerCfg));

    if (pSettings->bModemEnabled) {
        WriteGenCfg(DSP_UartCfg1Index, MKBYTE(rUartCfg1));
        WriteGenCfg(DSP_UartCfg2Index, MKBYTE(rUartCfg2));
    }


    rHBridgeControl.EnableDspInt = FALSE;
    rHBridgeControl.MemAutoInc = TRUE;
    rHBridgeControl.IoAutoInc = FALSE;
    rHBridgeControl.DiagnosticMode = FALSE;

    PRINTK_3(TRACE_3780I,
             "3780i::dsp3780i_EnableDSP DSP_HBridgeControl %x rHBridgeControl %x\n",
             DSP_HBridgeControl, MKWORD(rHBridgeControl));

    OutWordDsp(DSP_HBridgeControl, MKWORD(rHBridgeControl));
    spin_unlock_irqrestore(&dsp_lock, flags);
    WriteMsaCfg(DSP_LBusTimeoutDisable, MKWORD(rLBusTimeoutDisable));
    WriteMsaCfg(DSP_ClockControl_1, MKWORD(rClockControl1));
    WriteMsaCfg(DSP_ClockControl_2, MKWORD(rClockControl2));
    WriteMsaCfg(DSP_ChipReset, MKWORD(rChipReset));

    ChipID = ReadMsaCfg(DSP_ChipID);

    PRINTK_2(TRACE_3780I,
             "3780i::dsp3780I_EnableDSP exiting bRC=TRUE, ChipID %x\n",
             ChipID);

    return 0;
}