181dee67eSSudip Mukherjee #define USE_DVICHIP
281dee67eSSudip Mukherjee #ifdef USE_DVICHIP
381dee67eSSudip Mukherjee 
481dee67eSSudip Mukherjee #include "ddk750_sii164.h"
581dee67eSSudip Mukherjee #include "ddk750_hwi2c.h"
681dee67eSSudip Mukherjee 
781dee67eSSudip Mukherjee /* I2C Address of each SII164 chip */
881dee67eSSudip Mukherjee #define SII164_I2C_ADDRESS                  0x70
981dee67eSSudip Mukherjee 
1081dee67eSSudip Mukherjee /* Define this definition to use hardware i2c. */
1181dee67eSSudip Mukherjee #define USE_HW_I2C
1281dee67eSSudip Mukherjee 
1381dee67eSSudip Mukherjee #ifdef USE_HW_I2C
146bdbe62bSMike Rapoport     #define i2cWriteReg sm750_hw_i2c_write_reg
155ccf7340SMike Rapoport     #define i2cReadReg  sm750_hw_i2c_read_reg
1681dee67eSSudip Mukherjee #else
179a357143SMike Rapoport     #define i2cWriteReg sm750_sw_i2c_write_reg
189a357143SMike Rapoport     #define i2cReadReg  sm750_sw_i2c_read_reg
1981dee67eSSudip Mukherjee #endif
2081dee67eSSudip Mukherjee 
2181dee67eSSudip Mukherjee /* SII164 Vendor and Device ID */
2281dee67eSSudip Mukherjee #define SII164_VENDOR_ID                    0x0001
2381dee67eSSudip Mukherjee #define SII164_DEVICE_ID                    0x0006
2481dee67eSSudip Mukherjee 
2581dee67eSSudip Mukherjee #ifdef SII164_FULL_FUNCTIONS
2681dee67eSSudip Mukherjee /* Name of the DVI Controller chip */
2781dee67eSSudip Mukherjee static char *gDviCtrlChipName = "Silicon Image SiI 164";
2881dee67eSSudip Mukherjee #endif
2981dee67eSSudip Mukherjee 
3081dee67eSSudip Mukherjee /*
3181dee67eSSudip Mukherjee  *  sii164GetVendorID
3281dee67eSSudip Mukherjee  *      This function gets the vendor ID of the DVI controller chip.
3381dee67eSSudip Mukherjee  *
3481dee67eSSudip Mukherjee  *  Output:
3581dee67eSSudip Mukherjee  *      Vendor ID
3681dee67eSSudip Mukherjee  */
376fa7db83SSupriya Karanth unsigned short sii164GetVendorID(void)
3881dee67eSSudip Mukherjee {
3981dee67eSSudip Mukherjee 	unsigned short vendorID;
4081dee67eSSudip Mukherjee 
4181dee67eSSudip Mukherjee 	vendorID = ((unsigned short) i2cReadReg(SII164_I2C_ADDRESS, SII164_VENDOR_ID_HIGH) << 8) |
4281dee67eSSudip Mukherjee 		    (unsigned short) i2cReadReg(SII164_I2C_ADDRESS, SII164_VENDOR_ID_LOW);
4381dee67eSSudip Mukherjee 
4481dee67eSSudip Mukherjee 	return vendorID;
4581dee67eSSudip Mukherjee }
4681dee67eSSudip Mukherjee 
4781dee67eSSudip Mukherjee /*
4881dee67eSSudip Mukherjee  *  sii164GetDeviceID
4981dee67eSSudip Mukherjee  *      This function gets the device ID of the DVI controller chip.
5081dee67eSSudip Mukherjee  *
5181dee67eSSudip Mukherjee  *  Output:
5281dee67eSSudip Mukherjee  *      Device ID
5381dee67eSSudip Mukherjee  */
546fa7db83SSupriya Karanth unsigned short sii164GetDeviceID(void)
5581dee67eSSudip Mukherjee {
5681dee67eSSudip Mukherjee 	unsigned short deviceID;
5781dee67eSSudip Mukherjee 
5881dee67eSSudip Mukherjee 	deviceID = ((unsigned short) i2cReadReg(SII164_I2C_ADDRESS, SII164_DEVICE_ID_HIGH) << 8) |
5981dee67eSSudip Mukherjee 		    (unsigned short) i2cReadReg(SII164_I2C_ADDRESS, SII164_DEVICE_ID_LOW);
6081dee67eSSudip Mukherjee 
6181dee67eSSudip Mukherjee 	return deviceID;
6281dee67eSSudip Mukherjee }
6381dee67eSSudip Mukherjee 
6481dee67eSSudip Mukherjee 
6581dee67eSSudip Mukherjee 
6681dee67eSSudip Mukherjee /* DVI.C will handle all SiI164 chip stuffs and try it best to make code minimal and useful */
6781dee67eSSudip Mukherjee 
6881dee67eSSudip Mukherjee /*
6981dee67eSSudip Mukherjee  *  sii164InitChip
7081dee67eSSudip Mukherjee  *      This function initialize and detect the DVI controller chip.
7181dee67eSSudip Mukherjee  *
7281dee67eSSudip Mukherjee  *  Input:
7381dee67eSSudip Mukherjee  *      edgeSelect          - Edge Select:
7481dee67eSSudip Mukherjee  *                              0 = Input data is falling edge latched (falling edge
7581dee67eSSudip Mukherjee  *                                  latched first in dual edge mode)
7681dee67eSSudip Mukherjee  *                              1 = Input data is rising edge latched (rising edge
7781dee67eSSudip Mukherjee  *                                  latched first in dual edge mode)
7881dee67eSSudip Mukherjee  *      busSelect           - Input Bus Select:
7981dee67eSSudip Mukherjee  *                              0 = Input data bus is 12-bits wide
8081dee67eSSudip Mukherjee  *                              1 = Input data bus is 24-bits wide
8181dee67eSSudip Mukherjee  *      dualEdgeClkSelect   - Dual Edge Clock Select
8281dee67eSSudip Mukherjee  *                              0 = Input data is single edge latched
8381dee67eSSudip Mukherjee  *                              1 = Input data is dual edge latched
8481dee67eSSudip Mukherjee  *      hsyncEnable         - Horizontal Sync Enable:
8581dee67eSSudip Mukherjee  *                              0 = HSYNC input is transmitted as fixed LOW
8681dee67eSSudip Mukherjee  *                              1 = HSYNC input is transmitted as is
8781dee67eSSudip Mukherjee  *      vsyncEnable         - Vertical Sync Enable:
8881dee67eSSudip Mukherjee  *                              0 = VSYNC input is transmitted as fixed LOW
8981dee67eSSudip Mukherjee  *                              1 = VSYNC input is transmitted as is
9081dee67eSSudip Mukherjee  *      deskewEnable        - De-skewing Enable:
9181dee67eSSudip Mukherjee  *                              0 = De-skew disabled
9281dee67eSSudip Mukherjee  *                              1 = De-skew enabled
9381dee67eSSudip Mukherjee  *      deskewSetting       - De-skewing Setting (increment of 260psec)
9481dee67eSSudip Mukherjee  *                              0 = 1 step --> minimum setup / maximum hold
9581dee67eSSudip Mukherjee  *                              1 = 2 step
9681dee67eSSudip Mukherjee  *                              2 = 3 step
9781dee67eSSudip Mukherjee  *                              3 = 4 step
9881dee67eSSudip Mukherjee  *                              4 = 5 step
9981dee67eSSudip Mukherjee  *                              5 = 6 step
10081dee67eSSudip Mukherjee  *                              6 = 7 step
10181dee67eSSudip Mukherjee  *                              7 = 8 step --> maximum setup / minimum hold
10281dee67eSSudip Mukherjee  *      continuousSyncEnable- SYNC Continuous:
10381dee67eSSudip Mukherjee  *                              0 = Disable
10481dee67eSSudip Mukherjee  *                              1 = Enable
10581dee67eSSudip Mukherjee  *      pllFilterEnable     - PLL Filter Enable
10681dee67eSSudip Mukherjee  *                              0 = Disable PLL Filter
10781dee67eSSudip Mukherjee  *                              1 = Enable PLL Filter
10881dee67eSSudip Mukherjee  *      pllFilterValue      - PLL Filter characteristics:
10981dee67eSSudip Mukherjee  *                              0~7 (recommended value is 4)
11081dee67eSSudip Mukherjee  *
11181dee67eSSudip Mukherjee  *  Output:
11281dee67eSSudip Mukherjee  *      0   - Success
11381dee67eSSudip Mukherjee  *     -1   - Fail.
11481dee67eSSudip Mukherjee  */
11581dee67eSSudip Mukherjee long sii164InitChip(
11681dee67eSSudip Mukherjee 	unsigned char edgeSelect,
11781dee67eSSudip Mukherjee 	unsigned char busSelect,
11881dee67eSSudip Mukherjee 	unsigned char dualEdgeClkSelect,
11981dee67eSSudip Mukherjee 	unsigned char hsyncEnable,
12081dee67eSSudip Mukherjee 	unsigned char vsyncEnable,
12181dee67eSSudip Mukherjee 	unsigned char deskewEnable,
12281dee67eSSudip Mukherjee 	unsigned char deskewSetting,
12381dee67eSSudip Mukherjee 	unsigned char continuousSyncEnable,
12481dee67eSSudip Mukherjee 	unsigned char pllFilterEnable,
12581dee67eSSudip Mukherjee 	unsigned char pllFilterValue
12681dee67eSSudip Mukherjee )
12781dee67eSSudip Mukherjee {
12881dee67eSSudip Mukherjee 	unsigned char config;
12981dee67eSSudip Mukherjee 
13081dee67eSSudip Mukherjee 	/* Initialize the i2c bus */
13181dee67eSSudip Mukherjee #ifdef USE_HW_I2C
13281dee67eSSudip Mukherjee 	/* Use fast mode. */
13319f70eaeSMike Rapoport 	sm750_hw_i2c_init(1);
13481dee67eSSudip Mukherjee #else
135f2ea7733SMike Rapoport 	sm750_sw_i2c_init(DEFAULT_I2C_SCL, DEFAULT_I2C_SDA);
13681dee67eSSudip Mukherjee #endif
13781dee67eSSudip Mukherjee 
13881dee67eSSudip Mukherjee 	/* Check if SII164 Chip exists */
139259fef35SJuston Li 	if ((sii164GetVendorID() == SII164_VENDOR_ID) && (sii164GetDeviceID() == SII164_DEVICE_ID)) {
14081dee67eSSudip Mukherjee 		/*
14181dee67eSSudip Mukherjee 		 *  Initialize SII164 controller chip.
14281dee67eSSudip Mukherjee 		 */
14381dee67eSSudip Mukherjee 
14481dee67eSSudip Mukherjee 		/* Select the edge */
14581dee67eSSudip Mukherjee 		if (edgeSelect == 0)
14681dee67eSSudip Mukherjee 			config = SII164_CONFIGURATION_LATCH_FALLING;
14781dee67eSSudip Mukherjee 		else
14881dee67eSSudip Mukherjee 			config = SII164_CONFIGURATION_LATCH_RISING;
14981dee67eSSudip Mukherjee 
15081dee67eSSudip Mukherjee 		/* Select bus wide */
15181dee67eSSudip Mukherjee 		if (busSelect == 0)
15281dee67eSSudip Mukherjee 			config |= SII164_CONFIGURATION_BUS_12BITS;
15381dee67eSSudip Mukherjee 		else
15481dee67eSSudip Mukherjee 			config |= SII164_CONFIGURATION_BUS_24BITS;
15581dee67eSSudip Mukherjee 
15681dee67eSSudip Mukherjee 		/* Select Dual/Single Edge Clock */
15781dee67eSSudip Mukherjee 		if (dualEdgeClkSelect == 0)
15881dee67eSSudip Mukherjee 			config |= SII164_CONFIGURATION_CLOCK_SINGLE;
15981dee67eSSudip Mukherjee 		else
16081dee67eSSudip Mukherjee 			config |= SII164_CONFIGURATION_CLOCK_DUAL;
16181dee67eSSudip Mukherjee 
16281dee67eSSudip Mukherjee 		/* Select HSync Enable */
16381dee67eSSudip Mukherjee 		if (hsyncEnable == 0)
16481dee67eSSudip Mukherjee 			config |= SII164_CONFIGURATION_HSYNC_FORCE_LOW;
16581dee67eSSudip Mukherjee 		else
16681dee67eSSudip Mukherjee 			config |= SII164_CONFIGURATION_HSYNC_AS_IS;
16781dee67eSSudip Mukherjee 
16881dee67eSSudip Mukherjee 		/* Select VSync Enable */
16981dee67eSSudip Mukherjee 		if (vsyncEnable == 0)
17081dee67eSSudip Mukherjee 			config |= SII164_CONFIGURATION_VSYNC_FORCE_LOW;
17181dee67eSSudip Mukherjee 		else
17281dee67eSSudip Mukherjee 			config |= SII164_CONFIGURATION_VSYNC_AS_IS;
17381dee67eSSudip Mukherjee 
17481dee67eSSudip Mukherjee 		i2cWriteReg(SII164_I2C_ADDRESS, SII164_CONFIGURATION, config);
17581dee67eSSudip Mukherjee 
17681dee67eSSudip Mukherjee 		/* De-skew enabled with default 111b value.
17781dee67eSSudip Mukherjee 		   This will fix some artifacts problem in some mode on board 2.2.
17881dee67eSSudip Mukherjee 		   Somehow this fix does not affect board 2.1.
17981dee67eSSudip Mukherjee 		 */
18081dee67eSSudip Mukherjee 		if (deskewEnable == 0)
18181dee67eSSudip Mukherjee 			config = SII164_DESKEW_DISABLE;
18281dee67eSSudip Mukherjee 		else
18381dee67eSSudip Mukherjee 			config = SII164_DESKEW_ENABLE;
18481dee67eSSudip Mukherjee 
185259fef35SJuston Li 		switch (deskewSetting) {
18681dee67eSSudip Mukherjee 		case 0:
18781dee67eSSudip Mukherjee 			config |= SII164_DESKEW_1_STEP;
18881dee67eSSudip Mukherjee 			break;
18981dee67eSSudip Mukherjee 		case 1:
19081dee67eSSudip Mukherjee 			config |= SII164_DESKEW_2_STEP;
19181dee67eSSudip Mukherjee 			break;
19281dee67eSSudip Mukherjee 		case 2:
19381dee67eSSudip Mukherjee 			config |= SII164_DESKEW_3_STEP;
19481dee67eSSudip Mukherjee 			break;
19581dee67eSSudip Mukherjee 		case 3:
19681dee67eSSudip Mukherjee 			config |= SII164_DESKEW_4_STEP;
19781dee67eSSudip Mukherjee 			break;
19881dee67eSSudip Mukherjee 		case 4:
19981dee67eSSudip Mukherjee 			config |= SII164_DESKEW_5_STEP;
20081dee67eSSudip Mukherjee 			break;
20181dee67eSSudip Mukherjee 		case 5:
20281dee67eSSudip Mukherjee 			config |= SII164_DESKEW_6_STEP;
20381dee67eSSudip Mukherjee 			break;
20481dee67eSSudip Mukherjee 		case 6:
20581dee67eSSudip Mukherjee 			config |= SII164_DESKEW_7_STEP;
20681dee67eSSudip Mukherjee 			break;
20781dee67eSSudip Mukherjee 		case 7:
20881dee67eSSudip Mukherjee 			config |= SII164_DESKEW_8_STEP;
20981dee67eSSudip Mukherjee 			break;
21081dee67eSSudip Mukherjee 		}
21181dee67eSSudip Mukherjee 		i2cWriteReg(SII164_I2C_ADDRESS, SII164_DESKEW, config);
21281dee67eSSudip Mukherjee 
21381dee67eSSudip Mukherjee 		/* Enable/Disable Continuous Sync. */
21481dee67eSSudip Mukherjee 		if (continuousSyncEnable == 0)
21581dee67eSSudip Mukherjee 			config = SII164_PLL_FILTER_SYNC_CONTINUOUS_DISABLE;
21681dee67eSSudip Mukherjee 		else
21781dee67eSSudip Mukherjee 			config = SII164_PLL_FILTER_SYNC_CONTINUOUS_ENABLE;
21881dee67eSSudip Mukherjee 
21981dee67eSSudip Mukherjee 		/* Enable/Disable PLL Filter */
22081dee67eSSudip Mukherjee 		if (pllFilterEnable == 0)
22181dee67eSSudip Mukherjee 			config |= SII164_PLL_FILTER_DISABLE;
22281dee67eSSudip Mukherjee 		else
22381dee67eSSudip Mukherjee 			config |= SII164_PLL_FILTER_ENABLE;
22481dee67eSSudip Mukherjee 
22581dee67eSSudip Mukherjee 		/* Set the PLL Filter value */
22681dee67eSSudip Mukherjee 		config |= ((pllFilterValue & 0x07) << 1);
22781dee67eSSudip Mukherjee 
22881dee67eSSudip Mukherjee 		i2cWriteReg(SII164_I2C_ADDRESS, SII164_PLL, config);
22981dee67eSSudip Mukherjee 
23081dee67eSSudip Mukherjee 		/* Recover from Power Down and enable output. */
23181dee67eSSudip Mukherjee 		config = i2cReadReg(SII164_I2C_ADDRESS, SII164_CONFIGURATION);
23281dee67eSSudip Mukherjee 		config |= SII164_CONFIGURATION_POWER_NORMAL;
23381dee67eSSudip Mukherjee 		i2cWriteReg(SII164_I2C_ADDRESS, SII164_CONFIGURATION, config);
23481dee67eSSudip Mukherjee 
23581dee67eSSudip Mukherjee 		return 0;
23681dee67eSSudip Mukherjee 	}
23781dee67eSSudip Mukherjee 
23881dee67eSSudip Mukherjee 	/* Return -1 if initialization fails. */
239732053a0SAmitoj Kaur Chawla 	return -1;
24081dee67eSSudip Mukherjee }
24181dee67eSSudip Mukherjee 
24281dee67eSSudip Mukherjee 
24381dee67eSSudip Mukherjee 
24481dee67eSSudip Mukherjee 
24581dee67eSSudip Mukherjee 
24669e98df7SCarlos E. Garcia /* below sii164 function is not necessary */
24781dee67eSSudip Mukherjee 
24881dee67eSSudip Mukherjee #ifdef SII164_FULL_FUNCTIONS
24981dee67eSSudip Mukherjee 
25081dee67eSSudip Mukherjee /*
25181dee67eSSudip Mukherjee  *  sii164ResetChip
25281dee67eSSudip Mukherjee  *      This function resets the DVI Controller Chip.
25381dee67eSSudip Mukherjee  */
2546fa7db83SSupriya Karanth void sii164ResetChip(void)
25581dee67eSSudip Mukherjee {
25681dee67eSSudip Mukherjee 	/* Power down */
25781dee67eSSudip Mukherjee 	sii164SetPower(0);
25881dee67eSSudip Mukherjee 	sii164SetPower(1);
25981dee67eSSudip Mukherjee }
26081dee67eSSudip Mukherjee 
26181dee67eSSudip Mukherjee 
26281dee67eSSudip Mukherjee /*
26381dee67eSSudip Mukherjee  * sii164GetChipString
26481dee67eSSudip Mukherjee  *      This function returns a char string name of the current DVI Controller chip.
26581dee67eSSudip Mukherjee  *      It's convenient for application need to display the chip name.
26681dee67eSSudip Mukherjee  */
2676fa7db83SSupriya Karanth char *sii164GetChipString(void)
26881dee67eSSudip Mukherjee {
26981dee67eSSudip Mukherjee 	return gDviCtrlChipName;
27081dee67eSSudip Mukherjee }
27181dee67eSSudip Mukherjee 
27281dee67eSSudip Mukherjee 
27381dee67eSSudip Mukherjee /*
27481dee67eSSudip Mukherjee  *  sii164SetPower
27581dee67eSSudip Mukherjee  *      This function sets the power configuration of the DVI Controller Chip.
27681dee67eSSudip Mukherjee  *
27781dee67eSSudip Mukherjee  *  Input:
27881dee67eSSudip Mukherjee  *      powerUp - Flag to set the power down or up
27981dee67eSSudip Mukherjee  */
28081dee67eSSudip Mukherjee void sii164SetPower(
28181dee67eSSudip Mukherjee 	unsigned char powerUp
28281dee67eSSudip Mukherjee )
28381dee67eSSudip Mukherjee {
28481dee67eSSudip Mukherjee 	unsigned char config;
28581dee67eSSudip Mukherjee 
28681dee67eSSudip Mukherjee 	config = i2cReadReg(SII164_I2C_ADDRESS, SII164_CONFIGURATION);
287259fef35SJuston Li 	if (powerUp == 1) {
28881dee67eSSudip Mukherjee 		/* Power up the chip */
28981dee67eSSudip Mukherjee 		config &= ~SII164_CONFIGURATION_POWER_MASK;
29081dee67eSSudip Mukherjee 		config |= SII164_CONFIGURATION_POWER_NORMAL;
29181dee67eSSudip Mukherjee 		i2cWriteReg(SII164_I2C_ADDRESS, SII164_CONFIGURATION, config);
292259fef35SJuston Li 	} else {
29381dee67eSSudip Mukherjee 		/* Power down the chip */
29481dee67eSSudip Mukherjee 		config &= ~SII164_CONFIGURATION_POWER_MASK;
29581dee67eSSudip Mukherjee 		config |= SII164_CONFIGURATION_POWER_DOWN;
29681dee67eSSudip Mukherjee 		i2cWriteReg(SII164_I2C_ADDRESS, SII164_CONFIGURATION, config);
29781dee67eSSudip Mukherjee 	}
29881dee67eSSudip Mukherjee }
29981dee67eSSudip Mukherjee 
30081dee67eSSudip Mukherjee 
30181dee67eSSudip Mukherjee /*
30281dee67eSSudip Mukherjee  *  sii164SelectHotPlugDetectionMode
30381dee67eSSudip Mukherjee  *      This function selects the mode of the hot plug detection.
30481dee67eSSudip Mukherjee  */
30581dee67eSSudip Mukherjee static void sii164SelectHotPlugDetectionMode(
30681dee67eSSudip Mukherjee 	sii164_hot_plug_mode_t hotPlugMode
30781dee67eSSudip Mukherjee )
30881dee67eSSudip Mukherjee {
30981dee67eSSudip Mukherjee 	unsigned char detectReg;
31081dee67eSSudip Mukherjee 
31181dee67eSSudip Mukherjee 	detectReg = i2cReadReg(SII164_I2C_ADDRESS, SII164_DETECT) & ~SII164_DETECT_MONITOR_SENSE_OUTPUT_FLAG;
312259fef35SJuston Li 	switch (hotPlugMode) {
31381dee67eSSudip Mukherjee 	case SII164_HOTPLUG_DISABLE:
31481dee67eSSudip Mukherjee 		detectReg |= SII164_DETECT_MONITOR_SENSE_OUTPUT_HIGH;
31581dee67eSSudip Mukherjee 		break;
31681dee67eSSudip Mukherjee 	case SII164_HOTPLUG_USE_MDI:
31781dee67eSSudip Mukherjee 		detectReg &= ~SII164_DETECT_INTERRUPT_MASK;
31881dee67eSSudip Mukherjee 		detectReg |= SII164_DETECT_INTERRUPT_BY_HTPLG_PIN;
31981dee67eSSudip Mukherjee 		detectReg |= SII164_DETECT_MONITOR_SENSE_OUTPUT_MDI;
32081dee67eSSudip Mukherjee 		break;
32181dee67eSSudip Mukherjee 	case SII164_HOTPLUG_USE_RSEN:
32281dee67eSSudip Mukherjee 		detectReg |= SII164_DETECT_MONITOR_SENSE_OUTPUT_RSEN;
32381dee67eSSudip Mukherjee 		break;
32481dee67eSSudip Mukherjee 	case SII164_HOTPLUG_USE_HTPLG:
32581dee67eSSudip Mukherjee 		detectReg |= SII164_DETECT_MONITOR_SENSE_OUTPUT_HTPLG;
32681dee67eSSudip Mukherjee 		break;
32781dee67eSSudip Mukherjee 	}
32881dee67eSSudip Mukherjee 
32981dee67eSSudip Mukherjee 	i2cWriteReg(SII164_I2C_ADDRESS, SII164_DETECT, detectReg);
33081dee67eSSudip Mukherjee }
33181dee67eSSudip Mukherjee 
33281dee67eSSudip Mukherjee /*
33381dee67eSSudip Mukherjee  *  sii164EnableHotPlugDetection
33481dee67eSSudip Mukherjee  *      This function enables the Hot Plug detection.
33581dee67eSSudip Mukherjee  *
33681dee67eSSudip Mukherjee  *  enableHotPlug   - Enable (=1) / disable (=0) Hot Plug detection
33781dee67eSSudip Mukherjee  */
33881dee67eSSudip Mukherjee void sii164EnableHotPlugDetection(
33981dee67eSSudip Mukherjee 	unsigned char enableHotPlug
34081dee67eSSudip Mukherjee )
34181dee67eSSudip Mukherjee {
34281dee67eSSudip Mukherjee 	unsigned char detectReg;
34340403c1bSJuston Li 
34481dee67eSSudip Mukherjee 	detectReg = i2cReadReg(SII164_I2C_ADDRESS, SII164_DETECT);
34581dee67eSSudip Mukherjee 
34681dee67eSSudip Mukherjee 	/* Depending on each DVI controller, need to enable the hot plug based on each
34781dee67eSSudip Mukherjee 	   individual chip design. */
34881dee67eSSudip Mukherjee 	if (enableHotPlug != 0)
34981dee67eSSudip Mukherjee 		sii164SelectHotPlugDetectionMode(SII164_HOTPLUG_USE_MDI);
35081dee67eSSudip Mukherjee 	else
35181dee67eSSudip Mukherjee 		sii164SelectHotPlugDetectionMode(SII164_HOTPLUG_DISABLE);
35281dee67eSSudip Mukherjee }
35381dee67eSSudip Mukherjee 
35481dee67eSSudip Mukherjee /*
35581dee67eSSudip Mukherjee  *  sii164IsConnected
35681dee67eSSudip Mukherjee  *      Check if the DVI Monitor is connected.
35781dee67eSSudip Mukherjee  *
35881dee67eSSudip Mukherjee  *  Output:
35981dee67eSSudip Mukherjee  *      0   - Not Connected
36081dee67eSSudip Mukherjee  *      1   - Connected
36181dee67eSSudip Mukherjee  */
3626fa7db83SSupriya Karanth unsigned char sii164IsConnected(void)
36381dee67eSSudip Mukherjee {
36481dee67eSSudip Mukherjee 	unsigned char hotPlugValue;
36581dee67eSSudip Mukherjee 
36681dee67eSSudip Mukherjee 	hotPlugValue = i2cReadReg(SII164_I2C_ADDRESS, SII164_DETECT) & SII164_DETECT_HOT_PLUG_STATUS_MASK;
36781dee67eSSudip Mukherjee 	if (hotPlugValue == SII164_DETECT_HOT_PLUG_STATUS_ON)
36881dee67eSSudip Mukherjee 		return 1;
36981dee67eSSudip Mukherjee 	else
37081dee67eSSudip Mukherjee 		return 0;
37181dee67eSSudip Mukherjee }
37281dee67eSSudip Mukherjee 
37381dee67eSSudip Mukherjee /*
37481dee67eSSudip Mukherjee  *  sii164CheckInterrupt
37569e98df7SCarlos E. Garcia  *      Checks if interrupt has occurred.
37681dee67eSSudip Mukherjee  *
37781dee67eSSudip Mukherjee  *  Output:
37881dee67eSSudip Mukherjee  *      0   - No interrupt
37981dee67eSSudip Mukherjee  *      1   - Interrupt occurs
38081dee67eSSudip Mukherjee  */
3816fa7db83SSupriya Karanth unsigned char sii164CheckInterrupt(void)
38281dee67eSSudip Mukherjee {
38381dee67eSSudip Mukherjee 	unsigned char detectReg;
38481dee67eSSudip Mukherjee 
38581dee67eSSudip Mukherjee 	detectReg = i2cReadReg(SII164_I2C_ADDRESS, SII164_DETECT) & SII164_DETECT_MONITOR_STATE_MASK;
38681dee67eSSudip Mukherjee 	if (detectReg == SII164_DETECT_MONITOR_STATE_CHANGE)
38781dee67eSSudip Mukherjee 		return 1;
38881dee67eSSudip Mukherjee 	else
38981dee67eSSudip Mukherjee 		return 0;
39081dee67eSSudip Mukherjee }
39181dee67eSSudip Mukherjee 
39281dee67eSSudip Mukherjee /*
39381dee67eSSudip Mukherjee  *  sii164ClearInterrupt
39481dee67eSSudip Mukherjee  *      Clear the hot plug interrupt.
39581dee67eSSudip Mukherjee  */
3966fa7db83SSupriya Karanth void sii164ClearInterrupt(void)
39781dee67eSSudip Mukherjee {
39881dee67eSSudip Mukherjee 	unsigned char detectReg;
39981dee67eSSudip Mukherjee 
40081dee67eSSudip Mukherjee 	/* Clear the MDI interrupt */
40181dee67eSSudip Mukherjee 	detectReg = i2cReadReg(SII164_I2C_ADDRESS, SII164_DETECT);
40281dee67eSSudip Mukherjee 	i2cWriteReg(SII164_I2C_ADDRESS, SII164_DETECT, detectReg | SII164_DETECT_MONITOR_STATE_CLEAR);
40381dee67eSSudip Mukherjee }
40481dee67eSSudip Mukherjee 
40581dee67eSSudip Mukherjee #endif
40681dee67eSSudip Mukherjee 
40781dee67eSSudip Mukherjee #endif
40881dee67eSSudip Mukherjee 
40981dee67eSSudip Mukherjee 
410