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