1b2441318SGreg Kroah-Hartman // SPDX-License-Identifier: GPL-2.0
281dee67eSSudip Mukherjee #define USE_DVICHIP
381dee67eSSudip Mukherjee #ifdef USE_DVICHIP
481dee67eSSudip Mukherjee 
581dee67eSSudip Mukherjee #include "ddk750_sii164.h"
681dee67eSSudip Mukherjee #include "ddk750_hwi2c.h"
781dee67eSSudip Mukherjee 
881dee67eSSudip Mukherjee /* I2C Address of each SII164 chip */
981dee67eSSudip Mukherjee #define SII164_I2C_ADDRESS                  0x70
1081dee67eSSudip Mukherjee 
1181dee67eSSudip Mukherjee /* Define this definition to use hardware i2c. */
1281dee67eSSudip Mukherjee #define USE_HW_I2C
1381dee67eSSudip Mukherjee 
1481dee67eSSudip Mukherjee #ifdef USE_HW_I2C
156bdbe62bSMike Rapoport     #define i2cWriteReg sm750_hw_i2c_write_reg
165ccf7340SMike Rapoport     #define i2cReadReg  sm750_hw_i2c_read_reg
1781dee67eSSudip Mukherjee #else
189a357143SMike Rapoport     #define i2cWriteReg sm750_sw_i2c_write_reg
199a357143SMike Rapoport     #define i2cReadReg  sm750_sw_i2c_read_reg
2081dee67eSSudip Mukherjee #endif
2181dee67eSSudip Mukherjee 
2281dee67eSSudip Mukherjee /* SII164 Vendor and Device ID */
2381dee67eSSudip Mukherjee #define SII164_VENDOR_ID                    0x0001
2481dee67eSSudip Mukherjee #define SII164_DEVICE_ID                    0x0006
2581dee67eSSudip Mukherjee 
2681dee67eSSudip Mukherjee #ifdef SII164_FULL_FUNCTIONS
2781dee67eSSudip Mukherjee /* Name of the DVI Controller chip */
2881dee67eSSudip Mukherjee static char *gDviCtrlChipName = "Silicon Image SiI 164";
2981dee67eSSudip Mukherjee #endif
3081dee67eSSudip Mukherjee 
3181dee67eSSudip Mukherjee /*
32864a821cSNam Cao  *  sii164_get_vendor_id
3381dee67eSSudip Mukherjee  *      This function gets the vendor ID of the DVI controller chip.
3481dee67eSSudip Mukherjee  *
3581dee67eSSudip Mukherjee  *  Output:
3681dee67eSSudip Mukherjee  *      Vendor ID
3781dee67eSSudip Mukherjee  */
sii164_get_vendor_id(void)38864a821cSNam Cao unsigned short sii164_get_vendor_id(void)
3981dee67eSSudip Mukherjee {
4081dee67eSSudip Mukherjee 	unsigned short vendorID;
4181dee67eSSudip Mukherjee 
428193e6adSJamal Shareef 	vendorID = ((unsigned short)i2cReadReg(SII164_I2C_ADDRESS,
438193e6adSJamal Shareef 					       SII164_VENDOR_ID_HIGH) << 8) |
448193e6adSJamal Shareef 		   (unsigned short)i2cReadReg(SII164_I2C_ADDRESS,
458193e6adSJamal Shareef 					      SII164_VENDOR_ID_LOW);
4681dee67eSSudip Mukherjee 
4781dee67eSSudip Mukherjee 	return vendorID;
4881dee67eSSudip Mukherjee }
4981dee67eSSudip Mukherjee 
5081dee67eSSudip Mukherjee /*
5181dee67eSSudip Mukherjee  *  sii164GetDeviceID
5281dee67eSSudip Mukherjee  *      This function gets the device ID of the DVI controller chip.
5381dee67eSSudip Mukherjee  *
5481dee67eSSudip Mukherjee  *  Output:
5581dee67eSSudip Mukherjee  *      Device ID
5681dee67eSSudip Mukherjee  */
sii164GetDeviceID(void)576fa7db83SSupriya Karanth unsigned short sii164GetDeviceID(void)
5881dee67eSSudip Mukherjee {
5981dee67eSSudip Mukherjee 	unsigned short deviceID;
6081dee67eSSudip Mukherjee 
618193e6adSJamal Shareef 	deviceID = ((unsigned short)i2cReadReg(SII164_I2C_ADDRESS,
628193e6adSJamal Shareef 					       SII164_DEVICE_ID_HIGH) << 8) |
638193e6adSJamal Shareef 		   (unsigned short)i2cReadReg(SII164_I2C_ADDRESS,
648193e6adSJamal Shareef 					      SII164_DEVICE_ID_LOW);
6581dee67eSSudip Mukherjee 
6681dee67eSSudip Mukherjee 	return deviceID;
6781dee67eSSudip Mukherjee }
6881dee67eSSudip Mukherjee 
698193e6adSJamal Shareef /*
708193e6adSJamal Shareef  *  DVI.C will handle all SiI164 chip stuffs and try its best to make code
718193e6adSJamal Shareef  *  minimal and useful
728193e6adSJamal Shareef  */
7381dee67eSSudip Mukherjee 
7481dee67eSSudip Mukherjee /*
75*72eb8304SAbdel Alkuor  *  sii164_init_chip
7681dee67eSSudip Mukherjee  *      This function initialize and detect the DVI controller chip.
7781dee67eSSudip Mukherjee  *
7881dee67eSSudip Mukherjee  *  Input:
79de5e4aeaSNishka Dasgupta  *      edge_select           - Edge Select:
80de5e4aeaSNishka Dasgupta  *                               0 = Input data is falling edge latched (falling
81de5e4aeaSNishka Dasgupta  *                                   edge latched first in dual edge mode)
82de5e4aeaSNishka Dasgupta  *                               1 = Input data is rising edge latched (rising
83de5e4aeaSNishka Dasgupta  *                                   edge latched first in dual edge mode)
84de5e4aeaSNishka Dasgupta  *      bus_select            - Input Bus Select:
8581dee67eSSudip Mukherjee  *                               0 = Input data bus is 12-bits wide
8681dee67eSSudip Mukherjee  *                               1 = Input data bus is 24-bits wide
87de5e4aeaSNishka Dasgupta  *      dual_edge_clk_select  - Dual Edge Clock Select
8881dee67eSSudip Mukherjee  *                               0 = Input data is single edge latched
8981dee67eSSudip Mukherjee  *                               1 = Input data is dual edge latched
90de5e4aeaSNishka Dasgupta  *      hsync_enable          - Horizontal Sync Enable:
9181dee67eSSudip Mukherjee  *                               0 = HSYNC input is transmitted as fixed LOW
9281dee67eSSudip Mukherjee  *                               1 = HSYNC input is transmitted as is
93de5e4aeaSNishka Dasgupta  *      vsync_enable          - Vertical Sync Enable:
9481dee67eSSudip Mukherjee  *                               0 = VSYNC input is transmitted as fixed LOW
9581dee67eSSudip Mukherjee  *                               1 = VSYNC input is transmitted as is
96de5e4aeaSNishka Dasgupta  *      deskew_enable         - De-skewing Enable:
9781dee67eSSudip Mukherjee  *                               0 = De-skew disabled
9881dee67eSSudip Mukherjee  *                               1 = De-skew enabled
99de5e4aeaSNishka Dasgupta  *      deskew_setting        - De-skewing Setting (increment of 260psec)
10081dee67eSSudip Mukherjee  *                               0 = 1 step --> minimum setup / maximum hold
10181dee67eSSudip Mukherjee  *                               1 = 2 step
10281dee67eSSudip Mukherjee  *                               2 = 3 step
10381dee67eSSudip Mukherjee  *                               3 = 4 step
10481dee67eSSudip Mukherjee  *                               4 = 5 step
10581dee67eSSudip Mukherjee  *                               5 = 6 step
10681dee67eSSudip Mukherjee  *                               6 = 7 step
10781dee67eSSudip Mukherjee  *                               7 = 8 step --> maximum setup / minimum hold
108de5e4aeaSNishka Dasgupta  *      continuous_sync_enable- SYNC Continuous:
10981dee67eSSudip Mukherjee  *                               0 = Disable
11081dee67eSSudip Mukherjee  *                               1 = Enable
111de5e4aeaSNishka Dasgupta  *      pll_filter_enable     - PLL Filter Enable
11281dee67eSSudip Mukherjee  *                               0 = Disable PLL Filter
11381dee67eSSudip Mukherjee  *                               1 = Enable PLL Filter
114de5e4aeaSNishka Dasgupta  *      pll_filter_value      - PLL Filter characteristics:
11581dee67eSSudip Mukherjee  *                               0~7 (recommended value is 4)
11681dee67eSSudip Mukherjee  *
11781dee67eSSudip Mukherjee  *  Output:
11881dee67eSSudip Mukherjee  *      0   - Success
11981dee67eSSudip Mukherjee  *     -1   - Fail.
12081dee67eSSudip Mukherjee  */
sii164_init_chip(unsigned char edge_select,unsigned char bus_select,unsigned char dual_edge_clk_select,unsigned char hsync_enable,unsigned char vsync_enable,unsigned char deskew_enable,unsigned char deskew_setting,unsigned char continuous_sync_enable,unsigned char pll_filter_enable,unsigned char pll_filter_value)121*72eb8304SAbdel Alkuor long sii164_init_chip(unsigned char edge_select,
122de5e4aeaSNishka Dasgupta 		      unsigned char bus_select,
123de5e4aeaSNishka Dasgupta 		      unsigned char dual_edge_clk_select,
124de5e4aeaSNishka Dasgupta 		      unsigned char hsync_enable,
125de5e4aeaSNishka Dasgupta 		      unsigned char vsync_enable,
126de5e4aeaSNishka Dasgupta 		      unsigned char deskew_enable,
127de5e4aeaSNishka Dasgupta 		      unsigned char deskew_setting,
128de5e4aeaSNishka Dasgupta 		      unsigned char continuous_sync_enable,
129de5e4aeaSNishka Dasgupta 		      unsigned char pll_filter_enable,
130de5e4aeaSNishka Dasgupta 		      unsigned char pll_filter_value)
13181dee67eSSudip Mukherjee {
13281dee67eSSudip Mukherjee 	unsigned char config;
13381dee67eSSudip Mukherjee 
13481dee67eSSudip Mukherjee 	/* Initialize the i2c bus */
13581dee67eSSudip Mukherjee #ifdef USE_HW_I2C
13681dee67eSSudip Mukherjee 	/* Use fast mode. */
13719f70eaeSMike Rapoport 	sm750_hw_i2c_init(1);
13881dee67eSSudip Mukherjee #else
139f2ea7733SMike Rapoport 	sm750_sw_i2c_init(DEFAULT_I2C_SCL, DEFAULT_I2C_SDA);
14081dee67eSSudip Mukherjee #endif
14181dee67eSSudip Mukherjee 
14281dee67eSSudip Mukherjee 	/* Check if SII164 Chip exists */
143864a821cSNam Cao 	if ((sii164_get_vendor_id() == SII164_VENDOR_ID) &&
1448193e6adSJamal Shareef 	    (sii164GetDeviceID() == SII164_DEVICE_ID)) {
14581dee67eSSudip Mukherjee 		/*
14681dee67eSSudip Mukherjee 		 *  Initialize SII164 controller chip.
14781dee67eSSudip Mukherjee 		 */
14881dee67eSSudip Mukherjee 
14981dee67eSSudip Mukherjee 		/* Select the edge */
150de5e4aeaSNishka Dasgupta 		if (edge_select == 0)
15181dee67eSSudip Mukherjee 			config = SII164_CONFIGURATION_LATCH_FALLING;
15281dee67eSSudip Mukherjee 		else
15381dee67eSSudip Mukherjee 			config = SII164_CONFIGURATION_LATCH_RISING;
15481dee67eSSudip Mukherjee 
15581dee67eSSudip Mukherjee 		/* Select bus wide */
156de5e4aeaSNishka Dasgupta 		if (bus_select == 0)
15781dee67eSSudip Mukherjee 			config |= SII164_CONFIGURATION_BUS_12BITS;
15881dee67eSSudip Mukherjee 		else
15981dee67eSSudip Mukherjee 			config |= SII164_CONFIGURATION_BUS_24BITS;
16081dee67eSSudip Mukherjee 
16181dee67eSSudip Mukherjee 		/* Select Dual/Single Edge Clock */
162de5e4aeaSNishka Dasgupta 		if (dual_edge_clk_select == 0)
16381dee67eSSudip Mukherjee 			config |= SII164_CONFIGURATION_CLOCK_SINGLE;
16481dee67eSSudip Mukherjee 		else
16581dee67eSSudip Mukherjee 			config |= SII164_CONFIGURATION_CLOCK_DUAL;
16681dee67eSSudip Mukherjee 
16781dee67eSSudip Mukherjee 		/* Select HSync Enable */
168de5e4aeaSNishka Dasgupta 		if (hsync_enable == 0)
16981dee67eSSudip Mukherjee 			config |= SII164_CONFIGURATION_HSYNC_FORCE_LOW;
17081dee67eSSudip Mukherjee 		else
17181dee67eSSudip Mukherjee 			config |= SII164_CONFIGURATION_HSYNC_AS_IS;
17281dee67eSSudip Mukherjee 
17381dee67eSSudip Mukherjee 		/* Select VSync Enable */
174de5e4aeaSNishka Dasgupta 		if (vsync_enable == 0)
17581dee67eSSudip Mukherjee 			config |= SII164_CONFIGURATION_VSYNC_FORCE_LOW;
17681dee67eSSudip Mukherjee 		else
17781dee67eSSudip Mukherjee 			config |= SII164_CONFIGURATION_VSYNC_AS_IS;
17881dee67eSSudip Mukherjee 
17981dee67eSSudip Mukherjee 		i2cWriteReg(SII164_I2C_ADDRESS, SII164_CONFIGURATION, config);
18081dee67eSSudip Mukherjee 
181f5016082SEric S. Stone 		/*
182f5016082SEric S. Stone 		 * De-skew enabled with default 111b value.
18335e4d8caSElizabeth Ferdman 		 * This fixes some artifacts problem in some mode on board 2.2.
18435e4d8caSElizabeth Ferdman 		 * Somehow this fix does not affect board 2.1.
18581dee67eSSudip Mukherjee 		 */
186de5e4aeaSNishka Dasgupta 		if (deskew_enable == 0)
18781dee67eSSudip Mukherjee 			config = SII164_DESKEW_DISABLE;
18881dee67eSSudip Mukherjee 		else
18981dee67eSSudip Mukherjee 			config = SII164_DESKEW_ENABLE;
19081dee67eSSudip Mukherjee 
191de5e4aeaSNishka Dasgupta 		switch (deskew_setting) {
19281dee67eSSudip Mukherjee 		case 0:
19381dee67eSSudip Mukherjee 			config |= SII164_DESKEW_1_STEP;
19481dee67eSSudip Mukherjee 			break;
19581dee67eSSudip Mukherjee 		case 1:
19681dee67eSSudip Mukherjee 			config |= SII164_DESKEW_2_STEP;
19781dee67eSSudip Mukherjee 			break;
19881dee67eSSudip Mukherjee 		case 2:
19981dee67eSSudip Mukherjee 			config |= SII164_DESKEW_3_STEP;
20081dee67eSSudip Mukherjee 			break;
20181dee67eSSudip Mukherjee 		case 3:
20281dee67eSSudip Mukherjee 			config |= SII164_DESKEW_4_STEP;
20381dee67eSSudip Mukherjee 			break;
20481dee67eSSudip Mukherjee 		case 4:
20581dee67eSSudip Mukherjee 			config |= SII164_DESKEW_5_STEP;
20681dee67eSSudip Mukherjee 			break;
20781dee67eSSudip Mukherjee 		case 5:
20881dee67eSSudip Mukherjee 			config |= SII164_DESKEW_6_STEP;
20981dee67eSSudip Mukherjee 			break;
21081dee67eSSudip Mukherjee 		case 6:
21181dee67eSSudip Mukherjee 			config |= SII164_DESKEW_7_STEP;
21281dee67eSSudip Mukherjee 			break;
21381dee67eSSudip Mukherjee 		case 7:
21481dee67eSSudip Mukherjee 			config |= SII164_DESKEW_8_STEP;
21581dee67eSSudip Mukherjee 			break;
21681dee67eSSudip Mukherjee 		}
21781dee67eSSudip Mukherjee 		i2cWriteReg(SII164_I2C_ADDRESS, SII164_DESKEW, config);
21881dee67eSSudip Mukherjee 
21981dee67eSSudip Mukherjee 		/* Enable/Disable Continuous Sync. */
220de5e4aeaSNishka Dasgupta 		if (continuous_sync_enable == 0)
22181dee67eSSudip Mukherjee 			config = SII164_PLL_FILTER_SYNC_CONTINUOUS_DISABLE;
22281dee67eSSudip Mukherjee 		else
22381dee67eSSudip Mukherjee 			config = SII164_PLL_FILTER_SYNC_CONTINUOUS_ENABLE;
22481dee67eSSudip Mukherjee 
22581dee67eSSudip Mukherjee 		/* Enable/Disable PLL Filter */
226de5e4aeaSNishka Dasgupta 		if (pll_filter_enable == 0)
22781dee67eSSudip Mukherjee 			config |= SII164_PLL_FILTER_DISABLE;
22881dee67eSSudip Mukherjee 		else
22981dee67eSSudip Mukherjee 			config |= SII164_PLL_FILTER_ENABLE;
23081dee67eSSudip Mukherjee 
23181dee67eSSudip Mukherjee 		/* Set the PLL Filter value */
232de5e4aeaSNishka Dasgupta 		config |= ((pll_filter_value & 0x07) << 1);
23381dee67eSSudip Mukherjee 
23481dee67eSSudip Mukherjee 		i2cWriteReg(SII164_I2C_ADDRESS, SII164_PLL, config);
23581dee67eSSudip Mukherjee 
23681dee67eSSudip Mukherjee 		/* Recover from Power Down and enable output. */
23781dee67eSSudip Mukherjee 		config = i2cReadReg(SII164_I2C_ADDRESS, SII164_CONFIGURATION);
23881dee67eSSudip Mukherjee 		config |= SII164_CONFIGURATION_POWER_NORMAL;
23981dee67eSSudip Mukherjee 		i2cWriteReg(SII164_I2C_ADDRESS, SII164_CONFIGURATION, config);
24081dee67eSSudip Mukherjee 
24181dee67eSSudip Mukherjee 		return 0;
24281dee67eSSudip Mukherjee 	}
24381dee67eSSudip Mukherjee 
24481dee67eSSudip Mukherjee 	/* Return -1 if initialization fails. */
245732053a0SAmitoj Kaur Chawla 	return -1;
24681dee67eSSudip Mukherjee }
24781dee67eSSudip Mukherjee 
24869e98df7SCarlos E. Garcia /* below sii164 function is not necessary */
24981dee67eSSudip Mukherjee 
25081dee67eSSudip Mukherjee #ifdef SII164_FULL_FUNCTIONS
25181dee67eSSudip Mukherjee 
25281dee67eSSudip Mukherjee /*
25381dee67eSSudip Mukherjee  *  sii164ResetChip
25481dee67eSSudip Mukherjee  *      This function resets the DVI Controller Chip.
25581dee67eSSudip Mukherjee  */
sii164ResetChip(void)2566fa7db83SSupriya Karanth void sii164ResetChip(void)
25781dee67eSSudip Mukherjee {
25881dee67eSSudip Mukherjee 	/* Power down */
25981dee67eSSudip Mukherjee 	sii164SetPower(0);
26081dee67eSSudip Mukherjee 	sii164SetPower(1);
26181dee67eSSudip Mukherjee }
26281dee67eSSudip Mukherjee 
26381dee67eSSudip Mukherjee /*
26481dee67eSSudip Mukherjee  * sii164GetChipString
2658193e6adSJamal Shareef  *      This function returns a char string name of the current DVI Controller
2668193e6adSJamal Shareef  *      chip.
2678193e6adSJamal Shareef  *
26881dee67eSSudip Mukherjee  *      It's convenient for application need to display the chip name.
26981dee67eSSudip Mukherjee  */
sii164GetChipString(void)2706fa7db83SSupriya Karanth char *sii164GetChipString(void)
27181dee67eSSudip Mukherjee {
27281dee67eSSudip Mukherjee 	return gDviCtrlChipName;
27381dee67eSSudip Mukherjee }
27481dee67eSSudip Mukherjee 
27581dee67eSSudip Mukherjee /*
27681dee67eSSudip Mukherjee  *  sii164SetPower
27781dee67eSSudip Mukherjee  *      This function sets the power configuration of the DVI Controller Chip.
27881dee67eSSudip Mukherjee  *
27981dee67eSSudip Mukherjee  *  Input:
28081dee67eSSudip Mukherjee  *      powerUp - Flag to set the power down or up
28181dee67eSSudip Mukherjee  */
sii164SetPower(unsigned char powerUp)282c9750456SMatej Dujava void sii164SetPower(unsigned char powerUp)
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  *  sii164SelectHotPlugDetectionMode
30281dee67eSSudip Mukherjee  *      This function selects the mode of the hot plug detection.
30381dee67eSSudip Mukherjee  */
30460d379e1SKeerthi Reddy static
sii164SelectHotPlugDetectionMode(enum sii164_hot_plug_mode hotPlugMode)30560d379e1SKeerthi Reddy void sii164SelectHotPlugDetectionMode(enum sii164_hot_plug_mode hotPlugMode)
30681dee67eSSudip Mukherjee {
30781dee67eSSudip Mukherjee 	unsigned char detectReg;
30881dee67eSSudip Mukherjee 
309c9750456SMatej Dujava 	detectReg = i2cReadReg(SII164_I2C_ADDRESS, SII164_DETECT) &
310c9750456SMatej Dujava 		    ~SII164_DETECT_MONITOR_SENSE_OUTPUT_FLAG;
311259fef35SJuston Li 	switch (hotPlugMode) {
31281dee67eSSudip Mukherjee 	case SII164_HOTPLUG_DISABLE:
31381dee67eSSudip Mukherjee 		detectReg |= SII164_DETECT_MONITOR_SENSE_OUTPUT_HIGH;
31481dee67eSSudip Mukherjee 		break;
31581dee67eSSudip Mukherjee 	case SII164_HOTPLUG_USE_MDI:
31681dee67eSSudip Mukherjee 		detectReg &= ~SII164_DETECT_INTERRUPT_MASK;
31781dee67eSSudip Mukherjee 		detectReg |= SII164_DETECT_INTERRUPT_BY_HTPLG_PIN;
31881dee67eSSudip Mukherjee 		detectReg |= SII164_DETECT_MONITOR_SENSE_OUTPUT_MDI;
31981dee67eSSudip Mukherjee 		break;
32081dee67eSSudip Mukherjee 	case SII164_HOTPLUG_USE_RSEN:
32181dee67eSSudip Mukherjee 		detectReg |= SII164_DETECT_MONITOR_SENSE_OUTPUT_RSEN;
32281dee67eSSudip Mukherjee 		break;
32381dee67eSSudip Mukherjee 	case SII164_HOTPLUG_USE_HTPLG:
32481dee67eSSudip Mukherjee 		detectReg |= SII164_DETECT_MONITOR_SENSE_OUTPUT_HTPLG;
32581dee67eSSudip Mukherjee 		break;
32681dee67eSSudip Mukherjee 	}
32781dee67eSSudip Mukherjee 
32881dee67eSSudip Mukherjee 	i2cWriteReg(SII164_I2C_ADDRESS, SII164_DETECT, detectReg);
32981dee67eSSudip Mukherjee }
33081dee67eSSudip Mukherjee 
33181dee67eSSudip Mukherjee /*
33281dee67eSSudip Mukherjee  *  sii164EnableHotPlugDetection
33381dee67eSSudip Mukherjee  *      This function enables the Hot Plug detection.
33481dee67eSSudip Mukherjee  *
33581dee67eSSudip Mukherjee  *  enableHotPlug   - Enable (=1) / disable (=0) Hot Plug detection
33681dee67eSSudip Mukherjee  */
sii164EnableHotPlugDetection(unsigned char enableHotPlug)337c9750456SMatej Dujava void sii164EnableHotPlugDetection(unsigned char enableHotPlug)
33881dee67eSSudip Mukherjee {
33981dee67eSSudip Mukherjee 	unsigned char detectReg;
34040403c1bSJuston Li 
34181dee67eSSudip Mukherjee 	detectReg = i2cReadReg(SII164_I2C_ADDRESS, SII164_DETECT);
34281dee67eSSudip Mukherjee 
3438193e6adSJamal Shareef 	/* Depending on each DVI controller, need to enable the hot plug based
3448193e6adSJamal Shareef 	 * on each individual chip design.
34535e4d8caSElizabeth Ferdman 	 */
34681dee67eSSudip Mukherjee 	if (enableHotPlug != 0)
34781dee67eSSudip Mukherjee 		sii164SelectHotPlugDetectionMode(SII164_HOTPLUG_USE_MDI);
34881dee67eSSudip Mukherjee 	else
34981dee67eSSudip Mukherjee 		sii164SelectHotPlugDetectionMode(SII164_HOTPLUG_DISABLE);
35081dee67eSSudip Mukherjee }
35181dee67eSSudip Mukherjee 
35281dee67eSSudip Mukherjee /*
35381dee67eSSudip Mukherjee  *  sii164IsConnected
35481dee67eSSudip Mukherjee  *      Check if the DVI Monitor is connected.
35581dee67eSSudip Mukherjee  *
35681dee67eSSudip Mukherjee  *  Output:
35781dee67eSSudip Mukherjee  *      0   - Not Connected
35881dee67eSSudip Mukherjee  *      1   - Connected
35981dee67eSSudip Mukherjee  */
sii164IsConnected(void)3606fa7db83SSupriya Karanth unsigned char sii164IsConnected(void)
36181dee67eSSudip Mukherjee {
36281dee67eSSudip Mukherjee 	unsigned char hotPlugValue;
36381dee67eSSudip Mukherjee 
364c9750456SMatej Dujava 	hotPlugValue = i2cReadReg(SII164_I2C_ADDRESS, SII164_DETECT) &
365c9750456SMatej Dujava 		       SII164_DETECT_HOT_PLUG_STATUS_MASK;
36681dee67eSSudip Mukherjee 	if (hotPlugValue == SII164_DETECT_HOT_PLUG_STATUS_ON)
36781dee67eSSudip Mukherjee 		return 1;
36881dee67eSSudip Mukherjee 	else
36981dee67eSSudip Mukherjee 		return 0;
37081dee67eSSudip Mukherjee }
37181dee67eSSudip Mukherjee 
37281dee67eSSudip Mukherjee /*
37381dee67eSSudip Mukherjee  *  sii164CheckInterrupt
37469e98df7SCarlos E. Garcia  *      Checks if interrupt has occurred.
37581dee67eSSudip Mukherjee  *
37681dee67eSSudip Mukherjee  *  Output:
37781dee67eSSudip Mukherjee  *      0   - No interrupt
37881dee67eSSudip Mukherjee  *      1   - Interrupt occurs
37981dee67eSSudip Mukherjee  */
sii164CheckInterrupt(void)3806fa7db83SSupriya Karanth unsigned char sii164CheckInterrupt(void)
38181dee67eSSudip Mukherjee {
38281dee67eSSudip Mukherjee 	unsigned char detectReg;
38381dee67eSSudip Mukherjee 
384c9750456SMatej Dujava 	detectReg = i2cReadReg(SII164_I2C_ADDRESS, SII164_DETECT) &
385c9750456SMatej Dujava 		    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  */
sii164ClearInterrupt(void)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);
402c9750456SMatej Dujava 	i2cWriteReg(SII164_I2C_ADDRESS, SII164_DETECT,
403c9750456SMatej Dujava 		    detectReg | SII164_DETECT_MONITOR_STATE_CLEAR);
40481dee67eSSudip Mukherjee }
40581dee67eSSudip Mukherjee 
40681dee67eSSudip Mukherjee #endif
40781dee67eSSudip Mukherjee 
40881dee67eSSudip Mukherjee #endif
409