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 /* 3281dee67eSSudip Mukherjee * sii164GetVendorID 3381dee67eSSudip Mukherjee * This function gets the vendor ID of the DVI controller chip. 3481dee67eSSudip Mukherjee * 3581dee67eSSudip Mukherjee * Output: 3681dee67eSSudip Mukherjee * Vendor ID 3781dee67eSSudip Mukherjee */ 386fa7db83SSupriya Karanth unsigned short sii164GetVendorID(void) 3981dee67eSSudip Mukherjee { 4081dee67eSSudip Mukherjee unsigned short vendorID; 4181dee67eSSudip Mukherjee 4281dee67eSSudip Mukherjee vendorID = ((unsigned short) i2cReadReg(SII164_I2C_ADDRESS, SII164_VENDOR_ID_HIGH) << 8) | 4381dee67eSSudip Mukherjee (unsigned short) i2cReadReg(SII164_I2C_ADDRESS, SII164_VENDOR_ID_LOW); 4481dee67eSSudip Mukherjee 4581dee67eSSudip Mukherjee return vendorID; 4681dee67eSSudip Mukherjee } 4781dee67eSSudip Mukherjee 4881dee67eSSudip Mukherjee /* 4981dee67eSSudip Mukherjee * sii164GetDeviceID 5081dee67eSSudip Mukherjee * This function gets the device ID of the DVI controller chip. 5181dee67eSSudip Mukherjee * 5281dee67eSSudip Mukherjee * Output: 5381dee67eSSudip Mukherjee * Device ID 5481dee67eSSudip Mukherjee */ 556fa7db83SSupriya Karanth unsigned short sii164GetDeviceID(void) 5681dee67eSSudip Mukherjee { 5781dee67eSSudip Mukherjee unsigned short deviceID; 5881dee67eSSudip Mukherjee 5981dee67eSSudip Mukherjee deviceID = ((unsigned short) i2cReadReg(SII164_I2C_ADDRESS, SII164_DEVICE_ID_HIGH) << 8) | 6081dee67eSSudip Mukherjee (unsigned short) i2cReadReg(SII164_I2C_ADDRESS, SII164_DEVICE_ID_LOW); 6181dee67eSSudip Mukherjee 6281dee67eSSudip Mukherjee return deviceID; 6381dee67eSSudip Mukherjee } 6481dee67eSSudip Mukherjee 6581dee67eSSudip Mukherjee 6681dee67eSSudip Mukherjee 6781dee67eSSudip Mukherjee /* DVI.C will handle all SiI164 chip stuffs and try it best to make code minimal and useful */ 6881dee67eSSudip Mukherjee 6981dee67eSSudip Mukherjee /* 7081dee67eSSudip Mukherjee * sii164InitChip 7181dee67eSSudip Mukherjee * This function initialize and detect the DVI controller chip. 7281dee67eSSudip Mukherjee * 7381dee67eSSudip Mukherjee * Input: 7481dee67eSSudip Mukherjee * edgeSelect - Edge Select: 7581dee67eSSudip Mukherjee * 0 = Input data is falling edge latched (falling edge 7681dee67eSSudip Mukherjee * latched first in dual edge mode) 7781dee67eSSudip Mukherjee * 1 = Input data is rising edge latched (rising edge 7881dee67eSSudip Mukherjee * latched first in dual edge mode) 7981dee67eSSudip Mukherjee * busSelect - Input Bus Select: 8081dee67eSSudip Mukherjee * 0 = Input data bus is 12-bits wide 8181dee67eSSudip Mukherjee * 1 = Input data bus is 24-bits wide 8281dee67eSSudip Mukherjee * dualEdgeClkSelect - Dual Edge Clock Select 8381dee67eSSudip Mukherjee * 0 = Input data is single edge latched 8481dee67eSSudip Mukherjee * 1 = Input data is dual edge latched 8581dee67eSSudip Mukherjee * hsyncEnable - Horizontal Sync Enable: 8681dee67eSSudip Mukherjee * 0 = HSYNC input is transmitted as fixed LOW 8781dee67eSSudip Mukherjee * 1 = HSYNC input is transmitted as is 8881dee67eSSudip Mukherjee * vsyncEnable - Vertical Sync Enable: 8981dee67eSSudip Mukherjee * 0 = VSYNC input is transmitted as fixed LOW 9081dee67eSSudip Mukherjee * 1 = VSYNC input is transmitted as is 9181dee67eSSudip Mukherjee * deskewEnable - De-skewing Enable: 9281dee67eSSudip Mukherjee * 0 = De-skew disabled 9381dee67eSSudip Mukherjee * 1 = De-skew enabled 9481dee67eSSudip Mukherjee * deskewSetting - De-skewing Setting (increment of 260psec) 9581dee67eSSudip Mukherjee * 0 = 1 step --> minimum setup / maximum hold 9681dee67eSSudip Mukherjee * 1 = 2 step 9781dee67eSSudip Mukherjee * 2 = 3 step 9881dee67eSSudip Mukherjee * 3 = 4 step 9981dee67eSSudip Mukherjee * 4 = 5 step 10081dee67eSSudip Mukherjee * 5 = 6 step 10181dee67eSSudip Mukherjee * 6 = 7 step 10281dee67eSSudip Mukherjee * 7 = 8 step --> maximum setup / minimum hold 10381dee67eSSudip Mukherjee * continuousSyncEnable- SYNC Continuous: 10481dee67eSSudip Mukherjee * 0 = Disable 10581dee67eSSudip Mukherjee * 1 = Enable 10681dee67eSSudip Mukherjee * pllFilterEnable - PLL Filter Enable 10781dee67eSSudip Mukherjee * 0 = Disable PLL Filter 10881dee67eSSudip Mukherjee * 1 = Enable PLL Filter 10981dee67eSSudip Mukherjee * pllFilterValue - PLL Filter characteristics: 11081dee67eSSudip Mukherjee * 0~7 (recommended value is 4) 11181dee67eSSudip Mukherjee * 11281dee67eSSudip Mukherjee * Output: 11381dee67eSSudip Mukherjee * 0 - Success 11481dee67eSSudip Mukherjee * -1 - Fail. 11581dee67eSSudip Mukherjee */ 116c9750456SMatej Dujava long sii164InitChip(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, 125c9750456SMatej Dujava unsigned char pllFilterValue) 12681dee67eSSudip Mukherjee { 12781dee67eSSudip Mukherjee unsigned char config; 12881dee67eSSudip Mukherjee 12981dee67eSSudip Mukherjee /* Initialize the i2c bus */ 13081dee67eSSudip Mukherjee #ifdef USE_HW_I2C 13181dee67eSSudip Mukherjee /* Use fast mode. */ 13219f70eaeSMike Rapoport sm750_hw_i2c_init(1); 13381dee67eSSudip Mukherjee #else 134f2ea7733SMike Rapoport sm750_sw_i2c_init(DEFAULT_I2C_SCL, DEFAULT_I2C_SDA); 13581dee67eSSudip Mukherjee #endif 13681dee67eSSudip Mukherjee 13781dee67eSSudip Mukherjee /* Check if SII164 Chip exists */ 138259fef35SJuston Li if ((sii164GetVendorID() == SII164_VENDOR_ID) && (sii164GetDeviceID() == SII164_DEVICE_ID)) { 13981dee67eSSudip Mukherjee /* 14081dee67eSSudip Mukherjee * Initialize SII164 controller chip. 14181dee67eSSudip Mukherjee */ 14281dee67eSSudip Mukherjee 14381dee67eSSudip Mukherjee /* Select the edge */ 14481dee67eSSudip Mukherjee if (edgeSelect == 0) 14581dee67eSSudip Mukherjee config = SII164_CONFIGURATION_LATCH_FALLING; 14681dee67eSSudip Mukherjee else 14781dee67eSSudip Mukherjee config = SII164_CONFIGURATION_LATCH_RISING; 14881dee67eSSudip Mukherjee 14981dee67eSSudip Mukherjee /* Select bus wide */ 15081dee67eSSudip Mukherjee if (busSelect == 0) 15181dee67eSSudip Mukherjee config |= SII164_CONFIGURATION_BUS_12BITS; 15281dee67eSSudip Mukherjee else 15381dee67eSSudip Mukherjee config |= SII164_CONFIGURATION_BUS_24BITS; 15481dee67eSSudip Mukherjee 15581dee67eSSudip Mukherjee /* Select Dual/Single Edge Clock */ 15681dee67eSSudip Mukherjee if (dualEdgeClkSelect == 0) 15781dee67eSSudip Mukherjee config |= SII164_CONFIGURATION_CLOCK_SINGLE; 15881dee67eSSudip Mukherjee else 15981dee67eSSudip Mukherjee config |= SII164_CONFIGURATION_CLOCK_DUAL; 16081dee67eSSudip Mukherjee 16181dee67eSSudip Mukherjee /* Select HSync Enable */ 16281dee67eSSudip Mukherjee if (hsyncEnable == 0) 16381dee67eSSudip Mukherjee config |= SII164_CONFIGURATION_HSYNC_FORCE_LOW; 16481dee67eSSudip Mukherjee else 16581dee67eSSudip Mukherjee config |= SII164_CONFIGURATION_HSYNC_AS_IS; 16681dee67eSSudip Mukherjee 16781dee67eSSudip Mukherjee /* Select VSync Enable */ 16881dee67eSSudip Mukherjee if (vsyncEnable == 0) 16981dee67eSSudip Mukherjee config |= SII164_CONFIGURATION_VSYNC_FORCE_LOW; 17081dee67eSSudip Mukherjee else 17181dee67eSSudip Mukherjee config |= SII164_CONFIGURATION_VSYNC_AS_IS; 17281dee67eSSudip Mukherjee 17381dee67eSSudip Mukherjee i2cWriteReg(SII164_I2C_ADDRESS, SII164_CONFIGURATION, config); 17481dee67eSSudip Mukherjee 175f5016082SEric S. Stone /* 176f5016082SEric S. Stone * De-skew enabled with default 111b value. 17735e4d8caSElizabeth Ferdman * This fixes some artifacts problem in some mode on board 2.2. 17835e4d8caSElizabeth Ferdman * 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 * sii164GetChipString 26381dee67eSSudip Mukherjee * This function returns a char string name of the current DVI Controller chip. 26481dee67eSSudip Mukherjee * It's convenient for application need to display the chip name. 26581dee67eSSudip Mukherjee */ 2666fa7db83SSupriya Karanth char *sii164GetChipString(void) 26781dee67eSSudip Mukherjee { 26881dee67eSSudip Mukherjee return gDviCtrlChipName; 26981dee67eSSudip Mukherjee } 27081dee67eSSudip Mukherjee 27181dee67eSSudip Mukherjee /* 27281dee67eSSudip Mukherjee * sii164SetPower 27381dee67eSSudip Mukherjee * This function sets the power configuration of the DVI Controller Chip. 27481dee67eSSudip Mukherjee * 27581dee67eSSudip Mukherjee * Input: 27681dee67eSSudip Mukherjee * powerUp - Flag to set the power down or up 27781dee67eSSudip Mukherjee */ 278c9750456SMatej Dujava void sii164SetPower(unsigned char powerUp) 27981dee67eSSudip Mukherjee { 28081dee67eSSudip Mukherjee unsigned char config; 28181dee67eSSudip Mukherjee 28281dee67eSSudip Mukherjee config = i2cReadReg(SII164_I2C_ADDRESS, SII164_CONFIGURATION); 283259fef35SJuston Li if (powerUp == 1) { 28481dee67eSSudip Mukherjee /* Power up the chip */ 28581dee67eSSudip Mukherjee config &= ~SII164_CONFIGURATION_POWER_MASK; 28681dee67eSSudip Mukherjee config |= SII164_CONFIGURATION_POWER_NORMAL; 28781dee67eSSudip Mukherjee i2cWriteReg(SII164_I2C_ADDRESS, SII164_CONFIGURATION, config); 288259fef35SJuston Li } else { 28981dee67eSSudip Mukherjee /* Power down the chip */ 29081dee67eSSudip Mukherjee config &= ~SII164_CONFIGURATION_POWER_MASK; 29181dee67eSSudip Mukherjee config |= SII164_CONFIGURATION_POWER_DOWN; 29281dee67eSSudip Mukherjee i2cWriteReg(SII164_I2C_ADDRESS, SII164_CONFIGURATION, config); 29381dee67eSSudip Mukherjee } 29481dee67eSSudip Mukherjee } 29581dee67eSSudip Mukherjee 29681dee67eSSudip Mukherjee /* 29781dee67eSSudip Mukherjee * sii164SelectHotPlugDetectionMode 29881dee67eSSudip Mukherjee * This function selects the mode of the hot plug detection. 29981dee67eSSudip Mukherjee */ 300c9750456SMatej Dujava static void sii164SelectHotPlugDetectionMode(sii164_hot_plug_mode_t hotPlugMode) 30181dee67eSSudip Mukherjee { 30281dee67eSSudip Mukherjee unsigned char detectReg; 30381dee67eSSudip Mukherjee 304c9750456SMatej Dujava detectReg = i2cReadReg(SII164_I2C_ADDRESS, SII164_DETECT) & 305c9750456SMatej Dujava ~SII164_DETECT_MONITOR_SENSE_OUTPUT_FLAG; 306259fef35SJuston Li switch (hotPlugMode) { 30781dee67eSSudip Mukherjee case SII164_HOTPLUG_DISABLE: 30881dee67eSSudip Mukherjee detectReg |= SII164_DETECT_MONITOR_SENSE_OUTPUT_HIGH; 30981dee67eSSudip Mukherjee break; 31081dee67eSSudip Mukherjee case SII164_HOTPLUG_USE_MDI: 31181dee67eSSudip Mukherjee detectReg &= ~SII164_DETECT_INTERRUPT_MASK; 31281dee67eSSudip Mukherjee detectReg |= SII164_DETECT_INTERRUPT_BY_HTPLG_PIN; 31381dee67eSSudip Mukherjee detectReg |= SII164_DETECT_MONITOR_SENSE_OUTPUT_MDI; 31481dee67eSSudip Mukherjee break; 31581dee67eSSudip Mukherjee case SII164_HOTPLUG_USE_RSEN: 31681dee67eSSudip Mukherjee detectReg |= SII164_DETECT_MONITOR_SENSE_OUTPUT_RSEN; 31781dee67eSSudip Mukherjee break; 31881dee67eSSudip Mukherjee case SII164_HOTPLUG_USE_HTPLG: 31981dee67eSSudip Mukherjee detectReg |= SII164_DETECT_MONITOR_SENSE_OUTPUT_HTPLG; 32081dee67eSSudip Mukherjee break; 32181dee67eSSudip Mukherjee } 32281dee67eSSudip Mukherjee 32381dee67eSSudip Mukherjee i2cWriteReg(SII164_I2C_ADDRESS, SII164_DETECT, detectReg); 32481dee67eSSudip Mukherjee } 32581dee67eSSudip Mukherjee 32681dee67eSSudip Mukherjee /* 32781dee67eSSudip Mukherjee * sii164EnableHotPlugDetection 32881dee67eSSudip Mukherjee * This function enables the Hot Plug detection. 32981dee67eSSudip Mukherjee * 33081dee67eSSudip Mukherjee * enableHotPlug - Enable (=1) / disable (=0) Hot Plug detection 33181dee67eSSudip Mukherjee */ 332c9750456SMatej Dujava void sii164EnableHotPlugDetection(unsigned char enableHotPlug) 33381dee67eSSudip Mukherjee { 33481dee67eSSudip Mukherjee unsigned char detectReg; 33540403c1bSJuston Li 33681dee67eSSudip Mukherjee detectReg = i2cReadReg(SII164_I2C_ADDRESS, SII164_DETECT); 33781dee67eSSudip Mukherjee 33881dee67eSSudip Mukherjee /* Depending on each DVI controller, need to enable the hot plug based on each 33935e4d8caSElizabeth Ferdman * individual chip design. 34035e4d8caSElizabeth Ferdman */ 34181dee67eSSudip Mukherjee if (enableHotPlug != 0) 34281dee67eSSudip Mukherjee sii164SelectHotPlugDetectionMode(SII164_HOTPLUG_USE_MDI); 34381dee67eSSudip Mukherjee else 34481dee67eSSudip Mukherjee sii164SelectHotPlugDetectionMode(SII164_HOTPLUG_DISABLE); 34581dee67eSSudip Mukherjee } 34681dee67eSSudip Mukherjee 34781dee67eSSudip Mukherjee /* 34881dee67eSSudip Mukherjee * sii164IsConnected 34981dee67eSSudip Mukherjee * Check if the DVI Monitor is connected. 35081dee67eSSudip Mukherjee * 35181dee67eSSudip Mukherjee * Output: 35281dee67eSSudip Mukherjee * 0 - Not Connected 35381dee67eSSudip Mukherjee * 1 - Connected 35481dee67eSSudip Mukherjee */ 3556fa7db83SSupriya Karanth unsigned char sii164IsConnected(void) 35681dee67eSSudip Mukherjee { 35781dee67eSSudip Mukherjee unsigned char hotPlugValue; 35881dee67eSSudip Mukherjee 359c9750456SMatej Dujava hotPlugValue = i2cReadReg(SII164_I2C_ADDRESS, SII164_DETECT) & 360c9750456SMatej Dujava SII164_DETECT_HOT_PLUG_STATUS_MASK; 36181dee67eSSudip Mukherjee if (hotPlugValue == SII164_DETECT_HOT_PLUG_STATUS_ON) 36281dee67eSSudip Mukherjee return 1; 36381dee67eSSudip Mukherjee else 36481dee67eSSudip Mukherjee return 0; 36581dee67eSSudip Mukherjee } 36681dee67eSSudip Mukherjee 36781dee67eSSudip Mukherjee /* 36881dee67eSSudip Mukherjee * sii164CheckInterrupt 36969e98df7SCarlos E. Garcia * Checks if interrupt has occurred. 37081dee67eSSudip Mukherjee * 37181dee67eSSudip Mukherjee * Output: 37281dee67eSSudip Mukherjee * 0 - No interrupt 37381dee67eSSudip Mukherjee * 1 - Interrupt occurs 37481dee67eSSudip Mukherjee */ 3756fa7db83SSupriya Karanth unsigned char sii164CheckInterrupt(void) 37681dee67eSSudip Mukherjee { 37781dee67eSSudip Mukherjee unsigned char detectReg; 37881dee67eSSudip Mukherjee 379c9750456SMatej Dujava detectReg = i2cReadReg(SII164_I2C_ADDRESS, SII164_DETECT) & 380c9750456SMatej Dujava SII164_DETECT_MONITOR_STATE_MASK; 38181dee67eSSudip Mukherjee if (detectReg == SII164_DETECT_MONITOR_STATE_CHANGE) 38281dee67eSSudip Mukherjee return 1; 38381dee67eSSudip Mukherjee else 38481dee67eSSudip Mukherjee return 0; 38581dee67eSSudip Mukherjee } 38681dee67eSSudip Mukherjee 38781dee67eSSudip Mukherjee /* 38881dee67eSSudip Mukherjee * sii164ClearInterrupt 38981dee67eSSudip Mukherjee * Clear the hot plug interrupt. 39081dee67eSSudip Mukherjee */ 3916fa7db83SSupriya Karanth void sii164ClearInterrupt(void) 39281dee67eSSudip Mukherjee { 39381dee67eSSudip Mukherjee unsigned char detectReg; 39481dee67eSSudip Mukherjee 39581dee67eSSudip Mukherjee /* Clear the MDI interrupt */ 39681dee67eSSudip Mukherjee detectReg = i2cReadReg(SII164_I2C_ADDRESS, SII164_DETECT); 397c9750456SMatej Dujava i2cWriteReg(SII164_I2C_ADDRESS, SII164_DETECT, 398c9750456SMatej Dujava detectReg | SII164_DETECT_MONITOR_STATE_CLEAR); 39981dee67eSSudip Mukherjee } 40081dee67eSSudip Mukherjee 40181dee67eSSudip Mukherjee #endif 40281dee67eSSudip Mukherjee 40381dee67eSSudip Mukherjee #endif 40481dee67eSSudip Mukherjee 40581dee67eSSudip Mukherjee 406