diff --git a/device/quanta/x86_64-quanta_ix1b_rglbmc-r0/default_sku b/device/quanta/x86_64-quanta_ix1b_rglbmc-r0/default_sku
new file mode 100755
index 0000000000..68cbc0d605
--- /dev/null
+++ b/device/quanta/x86_64-quanta_ix1b_rglbmc-r0/default_sku
@@ -0,0 +1 @@
+Quanta-IX1B-32X t1
diff --git a/device/quanta/x86_64-quanta_ix1b_rglbmc-r0/minigraph.xml b/device/quanta/x86_64-quanta_ix1b_rglbmc-r0/minigraph.xml
deleted file mode 100755
index 9d348f0051..0000000000
--- a/device/quanta/x86_64-quanta_ix1b_rglbmc-r0/minigraph.xml
+++ /dev/null
@@ -1,1074 +0,0 @@
-
-
-
-
-
- ARISTA01T0
- 10.0.0.33
- sonic
- 10.0.0.32
- 1
- 180
- 60
-
-
- sonic
- 10.0.0.0
- ARISTA01T2
- 10.0.0.1
- 1
- 180
- 60
-
-
- ARISTA02T0
- 10.0.0.35
- sonic
- 10.0.0.34
- 1
- 180
- 60
-
-
- sonic
- 10.0.0.2
- ARISTA02T2
- 10.0.0.3
- 1
- 180
- 60
-
-
- ARISTA03T0
- 10.0.0.37
- sonic
- 10.0.0.36
- 1
- 180
- 60
-
-
- sonic
- 10.0.0.4
- ARISTA03T2
- 10.0.0.5
- 1
- 180
- 60
-
-
- ARISTA04T0
- 10.0.0.39
- sonic
- 10.0.0.38
- 1
- 180
- 60
-
-
- sonic
- 10.0.0.6
- ARISTA04T2
- 10.0.0.7
- 1
- 180
- 60
-
-
- ARISTA05T0
- 10.0.0.41
- sonic
- 10.0.0.40
- 1
- 180
- 60
-
-
- sonic
- 10.0.0.8
- ARISTA05T2
- 10.0.0.9
- 1
- 180
- 60
-
-
- ARISTA06T0
- 10.0.0.43
- sonic
- 10.0.0.42
- 1
- 180
- 60
-
-
- sonic
- 10.0.0.10
- ARISTA06T2
- 10.0.0.11
- 1
- 180
- 60
-
-
- ARISTA07T0
- 10.0.0.45
- sonic
- 10.0.0.44
- 1
- 180
- 60
-
-
- sonic
- 10.0.0.12
- ARISTA07T2
- 10.0.0.13
- 1
- 180
- 60
-
-
- ARISTA08T0
- 10.0.0.47
- sonic
- 10.0.0.46
- 1
- 180
- 60
-
-
- sonic
- 10.0.0.14
- ARISTA08T2
- 10.0.0.15
- 1
- 180
- 60
-
-
- ARISTA09T0
- 10.0.0.49
- sonic
- 10.0.0.48
- 1
- 180
- 60
-
-
- sonic
- 10.0.0.16
- ARISTA09T2
- 10.0.0.17
- 1
- 180
- 60
-
-
- ARISTA10T0
- 10.0.0.51
- sonic
- 10.0.0.50
- 1
- 180
- 60
-
-
- sonic
- 10.0.0.18
- ARISTA10T2
- 10.0.0.19
- 1
- 180
- 60
-
-
- ARISTA11T0
- 10.0.0.53
- sonic
- 10.0.0.52
- 1
- 180
- 60
-
-
- sonic
- 10.0.0.20
- ARISTA11T2
- 10.0.0.21
- 1
- 180
- 60
-
-
- ARISTA12T0
- 10.0.0.55
- sonic
- 10.0.0.54
- 1
- 180
- 60
-
-
- sonic
- 10.0.0.22
- ARISTA12T2
- 10.0.0.23
- 1
- 180
- 60
-
-
- ARISTA13T0
- 10.0.0.57
- sonic
- 10.0.0.56
- 1
- 180
- 60
-
-
- sonic
- 10.0.0.24
- ARISTA13T2
- 10.0.0.25
- 1
- 180
- 60
-
-
- ARISTA14T0
- 10.0.0.59
- sonic
- 10.0.0.58
- 1
- 180
- 60
-
-
- sonic
- 10.0.0.26
- ARISTA14T2
- 10.0.0.27
- 1
- 180
- 60
-
-
- ARISTA15T0
- 10.0.0.61
- sonic
- 10.0.0.60
- 1
- 180
- 60
-
-
- sonic
- 10.0.0.28
- ARISTA15T2
- 10.0.0.29
- 1
- 180
- 60
-
-
- ARISTA16T0
- 10.0.0.63
- sonic
- 10.0.0.62
- 1
- 180
- 60
-
-
- sonic
- 10.0.0.30
- ARISTA16T2
- 10.0.0.31
- 1
- 180
- 60
-
-
-
-
- 65100
- sonic
-
-
- 10.0.0.33
-
-
-
-
- 10.0.0.1
-
-
-
-
- 10.0.0.35
-
-
-
-
- 10.0.0.3
-
-
-
-
- 10.0.0.37
-
-
-
-
- 10.0.0.5
-
-
-
-
- 10.0.0.39
-
-
-
-
- 10.0.0.7
-
-
-
-
- 10.0.0.41
-
-
-
-
- 10.0.0.9
-
-
-
-
- 10.0.0.43
-
-
-
-
- 10.0.0.11
-
-
-
-
- 10.0.0.45
-
-
-
-
- 10.0.0.13
-
-
-
-
- 10.0.0.47
-
-
-
-
- 10.0.0.15
-
-
-
-
- 10.0.0.49
-
-
-
-
- 10.0.0.17
-
-
-
-
- 10.0.0.51
-
-
-
-
- 10.0.0.19
-
-
-
-
- 10.0.0.53
-
-
-
-
- 10.0.0.21
-
-
-
-
- 10.0.0.55
-
-
-
-
- 10.0.0.23
-
-
-
-
- 10.0.0.57
-
-
-
-
- 10.0.0.25
-
-
-
-
- 10.0.0.59
-
-
-
-
- 10.0.0.27
-
-
-
-
- 10.0.0.61
-
-
-
-
- 10.0.0.29
-
-
-
-
- 10.0.0.63
-
-
-
-
- 10.0.0.31
-
-
-
-
-
-
-
- 64001
- ARISTA01T0
-
-
-
- 65200
- ARISTA01T2
-
-
-
- 64002
- ARISTA02T0
-
-
-
- 65200
- ARISTA02T2
-
-
-
- 64003
- ARISTA03T0
-
-
-
- 65200
- ARISTA03T2
-
-
-
- 64004
- ARISTA04T0
-
-
-
- 65200
- ARISTA04T2
-
-
-
- 64005
- ARISTA05T0
-
-
-
- 65200
- ARISTA05T2
-
-
-
- 64006
- ARISTA06T0
-
-
-
- 65200
- ARISTA06T2
-
-
-
- 64007
- ARISTA07T0
-
-
-
- 65200
- ARISTA07T2
-
-
-
- 64008
- ARISTA08T0
-
-
-
- 65200
- ARISTA08T2
-
-
-
- 64009
- ARISTA09T0
-
-
-
- 65200
- ARISTA09T2
-
-
-
- 64010
- ARISTA10T0
-
-
-
- 65200
- ARISTA10T2
-
-
-
- 64011
- ARISTA11T0
-
-
-
- 65200
- ARISTA11T2
-
-
-
- 64012
- ARISTA12T0
-
-
-
- 65200
- ARISTA12T2
-
-
-
- 64013
- ARISTA13T0
-
-
-
- 65200
- ARISTA13T2
-
-
-
- 64014
- ARISTA14T0
-
-
-
- 65200
- ARISTA14T2
-
-
-
- 64015
- ARISTA15T0
-
-
-
- 65200
- ARISTA15T2
-
-
-
- 64016
- ARISTA16T0
-
-
-
- 65200
- ARISTA16T2
-
-
-
-
-
-
-
-
-
- HostIP
- Loopback0
-
- 10.1.0.32/32
-
- 10.1.0.32/32
-
-
-
-
-
-
-
- sonic
-
-
-
-
-
- Ethernet0
- 10.0.0.0/31
-
-
-
- Ethernet4
- 10.0.0.2/31
-
-
-
- Ethernet8
- 10.0.0.4/31
-
-
-
- Ethernet12
- 10.0.0.6/31
-
-
-
- Ethernet16
- 10.0.0.8/31
-
-
-
- Ethernet20
- 10.0.0.10/31
-
-
-
- Ethernet24
- 10.0.0.12/31
-
-
-
- Ethernet28
- 10.0.0.14/31
-
-
-
- Ethernet32
- 10.0.0.16/31
-
-
-
- Ethernet36
- 10.0.0.18/31
-
-
-
- Ethernet40
- 10.0.0.20/31
-
-
-
- Ethernet44
- 10.0.0.22/31
-
-
-
- Ethernet48
- 10.0.0.24/31
-
-
-
- Ethernet52
- 10.0.0.26/31
-
-
-
- Ethernet56
- 10.0.0.28/31
-
-
-
- Ethernet60
- 10.0.0.30/31
-
-
-
- Ethernet64
- 10.0.0.32/31
-
-
-
- Ethernet68
- 10.0.0.34/31
-
-
-
- Ethernet72
- 10.0.0.36/31
-
-
-
- Ethernet76
- 10.0.0.38/31
-
-
-
- Ethernet80
- 10.0.0.40/31
-
-
-
- Ethernet84
- 10.0.0.42/31
-
-
-
- Ethernet88
- 10.0.0.44/31
-
-
-
- Ethernet92
- 10.0.0.46/31
-
-
-
- Ethernet96
- 10.0.0.48/31
-
-
-
- Ethernet100
- 10.0.0.50/31
-
-
-
- Ethernet104
- 10.0.0.52/31
-
-
-
- Ethernet108
- 10.0.0.54/31
-
-
-
- Ethernet112
- 10.0.0.56/31
-
-
-
- Ethernet116
- 10.0.0.58/31
-
-
-
- Ethernet120
- 10.0.0.60/31
-
-
-
- Ethernet124
- 10.0.0.62/31
-
-
-
-
-
-
-
-
-
-
-
- DeviceInterfaceLink
- sonic
- Ethernet0
- ARISTA01T2
- Ethernet1
-
-
- DeviceInterfaceLink
- sonic
- Ethernet4
- ARISTA02T2
- Ethernet1
-
-
- DeviceInterfaceLink
- sonic
- Ethernet8
- ARISTA03T2
- Ethernet1
-
-
- DeviceInterfaceLink
- sonic
- Ethernet12
- ARISTA04T2
- Ethernet1
-
-
- DeviceInterfaceLink
- sonic
- Ethernet16
- ARISTA05T2
- Ethernet1
-
-
- DeviceInterfaceLink
- sonic
- Ethernet20
- ARISTA06T2
- Ethernet1
-
-
- DeviceInterfaceLink
- sonic
- Ethernet24
- ARISTA07T2
- Ethernet1
-
-
- DeviceInterfaceLink
- sonic
- Ethernet28
- ARISTA08T2
- Ethernet1
-
-
- DeviceInterfaceLink
- sonic
- Ethernet32
- ARISTA09T2
- Ethernet1
-
-
- DeviceInterfaceLink
- sonic
- Ethernet36
- ARISTA10T2
- Ethernet1
-
-
- DeviceInterfaceLink
- sonic
- Ethernet40
- ARISTA11T2
- Ethernet1
-
-
- DeviceInterfaceLink
- sonic
- Ethernet44
- ARISTA12T2
- Ethernet1
-
-
- DeviceInterfaceLink
- sonic
- Ethernet48
- ARISTA13T2
- Ethernet1
-
-
- DeviceInterfaceLink
- sonic
- Ethernet52
- ARISTA14T2
- Ethernet1
-
-
- DeviceInterfaceLink
- sonic
- Ethernet56
- ARISTA15T2
- Ethernet1
-
-
- DeviceInterfaceLink
- sonic
- Ethernet60
- ARISTA16T2
- Ethernet1
-
-
- DeviceInterfaceLink
- sonic
- Ethernet64
- ARISTA01T0
- Ethernet1
-
-
- DeviceInterfaceLink
- sonic
- Ethernet68
- ARISTA02T0
- Ethernet1
-
-
- DeviceInterfaceLink
- sonic
- Ethernet72
- ARISTA03T0
- Ethernet1
-
-
- DeviceInterfaceLink
- sonic
- Ethernet76
- ARISTA04T0
- Ethernet1
-
-
- DeviceInterfaceLink
- sonic
- Ethernet80
- ARISTA05T0
- Ethernet1
-
-
- DeviceInterfaceLink
- sonic
- Ethernet84
- ARISTA06T0
- Ethernet1
-
-
- DeviceInterfaceLink
- sonic
- Ethernet88
- ARISTA07T0
- Ethernet1
-
-
- DeviceInterfaceLink
- sonic
- Ethernet92
- ARISTA08T0
- Ethernet1
-
-
- DeviceInterfaceLink
- sonic
- Ethernet96
- ARISTA09T0
- Ethernet1
-
-
- DeviceInterfaceLink
- sonic
- Ethernet100
- ARISTA10T0
- Ethernet1
-
-
- DeviceInterfaceLink
- sonic
- Ethernet104
- ARISTA11T0
- Ethernet1
-
-
- DeviceInterfaceLink
- sonic
- Ethernet108
- ARISTA12T0
- Ethernet1
-
-
- DeviceInterfaceLink
- sonic
- Ethernet112
- ARISTA13T0
- Ethernet1
-
-
- DeviceInterfaceLink
- sonic
- Ethernet116
- ARISTA14T0
- Ethernet1
-
-
- DeviceInterfaceLink
- sonic
- Ethernet120
- ARISTA15T0
- Ethernet1
-
-
- DeviceInterfaceLink
- sonic
- Ethernet124
- ARISTA16T0
- Ethernet1
-
-
-
-
- sonic
- Quanta-IX1B-32X
-
-
-
-
-
-
- sonic
-
-
- DhcpResources
-
-
-
-
- NtpResources
-
- 0.debian.pool.ntp.org;1.debian.pool.ntp.org;2.debian.pool.ntp.org;3.debian.pool.ntp.org
-
-
- SyslogResources
-
-
-
-
-
-
-
-
- sonic
- Quanta-IX1B-32X
-
diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix1b-32x/modules/Makefile b/platform/broadcom/sonic-platform-modules-quanta/ix1b-32x/modules/Makefile
index fd73f274ef..48683c54a7 100755
--- a/platform/broadcom/sonic-platform-modules-quanta/ix1b-32x/modules/Makefile
+++ b/platform/broadcom/sonic-platform-modules-quanta/ix1b-32x/modules/Makefile
@@ -1,3 +1 @@
-obj-m:=qci_pmbus.o qci_cpld_qsfp28.o qci_platform_ix1b.o
-
-
+obj-m:=qci_pmbus.o qci_cpld_qsfp28.o qci_platform_ix1b.o qci_hwmon_ix1b.o
diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix1b-32x/modules/pmbus.h b/platform/broadcom/sonic-platform-modules-quanta/ix1b-32x/modules/pmbus.h
deleted file mode 100755
index fa9beb3eb6..0000000000
--- a/platform/broadcom/sonic-platform-modules-quanta/ix1b-32x/modules/pmbus.h
+++ /dev/null
@@ -1,387 +0,0 @@
-/*
- * pmbus.h - Common defines and structures for PMBus devices
- *
- * Copyright (c) 2010, 2011 Ericsson AB.
- * Copyright (c) 2012 Guenter Roeck
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#ifndef PMBUS_H
-#define PMBUS_H
-
-/*
- * Registers
- */
-#define PMBUS_PAGE 0x00
-#define PMBUS_OPERATION 0x01
-#define PMBUS_ON_OFF_CONFIG 0x02
-#define PMBUS_CLEAR_FAULTS 0x03
-#define PMBUS_PHASE 0x04
-
-#define PMBUS_CAPABILITY 0x19
-#define PMBUS_QUERY 0x1A
-
-#define PMBUS_VOUT_MODE 0x20
-#define PMBUS_VOUT_COMMAND 0x21
-#define PMBUS_VOUT_TRIM 0x22
-#define PMBUS_VOUT_CAL_OFFSET 0x23
-#define PMBUS_VOUT_MAX 0x24
-#define PMBUS_VOUT_MARGIN_HIGH 0x25
-#define PMBUS_VOUT_MARGIN_LOW 0x26
-#define PMBUS_VOUT_TRANSITION_RATE 0x27
-#define PMBUS_VOUT_DROOP 0x28
-#define PMBUS_VOUT_SCALE_LOOP 0x29
-#define PMBUS_VOUT_SCALE_MONITOR 0x2A
-
-#define PMBUS_COEFFICIENTS 0x30
-#define PMBUS_POUT_MAX 0x31
-
-#define PMBUS_FAN_CONFIG_12 0x3A
-#define PMBUS_FAN_COMMAND_1 0x3B
-#define PMBUS_FAN_COMMAND_2 0x3C
-#define PMBUS_FAN_CONFIG_34 0x3D
-#define PMBUS_FAN_COMMAND_3 0x3E
-#define PMBUS_FAN_COMMAND_4 0x3F
-
-#define PMBUS_VOUT_OV_FAULT_LIMIT 0x40
-#define PMBUS_VOUT_OV_FAULT_RESPONSE 0x41
-#define PMBUS_VOUT_OV_WARN_LIMIT 0x42
-#define PMBUS_VOUT_UV_WARN_LIMIT 0x43
-#define PMBUS_VOUT_UV_FAULT_LIMIT 0x44
-#define PMBUS_VOUT_UV_FAULT_RESPONSE 0x45
-#define PMBUS_IOUT_OC_FAULT_LIMIT 0x46
-#define PMBUS_IOUT_OC_FAULT_RESPONSE 0x47
-#define PMBUS_IOUT_OC_LV_FAULT_LIMIT 0x48
-#define PMBUS_IOUT_OC_LV_FAULT_RESPONSE 0x49
-#define PMBUS_IOUT_OC_WARN_LIMIT 0x4A
-#define PMBUS_IOUT_UC_FAULT_LIMIT 0x4B
-#define PMBUS_IOUT_UC_FAULT_RESPONSE 0x4C
-
-#define PMBUS_OT_FAULT_LIMIT 0x4F
-#define PMBUS_OT_FAULT_RESPONSE 0x50
-#define PMBUS_OT_WARN_LIMIT 0x51
-#define PMBUS_UT_WARN_LIMIT 0x52
-#define PMBUS_UT_FAULT_LIMIT 0x53
-#define PMBUS_UT_FAULT_RESPONSE 0x54
-#define PMBUS_VIN_OV_FAULT_LIMIT 0x55
-#define PMBUS_VIN_OV_FAULT_RESPONSE 0x56
-#define PMBUS_VIN_OV_WARN_LIMIT 0x57
-#define PMBUS_VIN_UV_WARN_LIMIT 0x58
-#define PMBUS_VIN_UV_FAULT_LIMIT 0x59
-
-#define PMBUS_IIN_OC_FAULT_LIMIT 0x5B
-#define PMBUS_IIN_OC_WARN_LIMIT 0x5D
-
-#define PMBUS_POUT_OP_FAULT_LIMIT 0x68
-#define PMBUS_POUT_OP_WARN_LIMIT 0x6A
-#define PMBUS_PIN_OP_WARN_LIMIT 0x6B
-
-#define PMBUS_STATUS_BYTE 0x78
-#define PMBUS_STATUS_WORD 0x79
-#define PMBUS_STATUS_VOUT 0x7A
-#define PMBUS_STATUS_IOUT 0x7B
-#define PMBUS_STATUS_INPUT 0x7C
-#define PMBUS_STATUS_TEMPERATURE 0x7D
-#define PMBUS_STATUS_CML 0x7E
-#define PMBUS_STATUS_OTHER 0x7F
-#define PMBUS_STATUS_MFR_SPECIFIC 0x80
-#define PMBUS_STATUS_FAN_12 0x81
-#define PMBUS_STATUS_FAN_34 0x82
-
-#define PMBUS_READ_VIN 0x88
-#define PMBUS_READ_IIN 0x89
-#define PMBUS_READ_VCAP 0x8A
-#define PMBUS_READ_VOUT 0x8B
-#define PMBUS_READ_IOUT 0x8C
-#define PMBUS_READ_TEMPERATURE_1 0x8D
-#define PMBUS_READ_TEMPERATURE_2 0x8E
-#define PMBUS_READ_TEMPERATURE_3 0x8F
-#define PMBUS_READ_FAN_SPEED_1 0x90
-#define PMBUS_READ_FAN_SPEED_2 0x91
-#define PMBUS_READ_FAN_SPEED_3 0x92
-#define PMBUS_READ_FAN_SPEED_4 0x93
-#define PMBUS_READ_DUTY_CYCLE 0x94
-#define PMBUS_READ_FREQUENCY 0x95
-#define PMBUS_READ_POUT 0x96
-#define PMBUS_READ_PIN 0x97
-
-#define PMBUS_REVISION 0x98
-#define PMBUS_MFR_ID 0x99
-#define PMBUS_MFR_MODEL 0x9A
-#define PMBUS_MFR_REVISION 0x9B
-#define PMBUS_MFR_LOCATION 0x9C
-#define PMBUS_MFR_DATE 0x9D
-#define PMBUS_MFR_SERIAL 0x9E
-
-/*
- * Virtual registers.
- * Useful to support attributes which are not supported by standard PMBus
- * registers but exist as manufacturer specific registers on individual chips.
- * Must be mapped to real registers in device specific code.
- *
- * Semantics:
- * Virtual registers are all word size.
- * READ registers are read-only; writes are either ignored or return an error.
- * RESET registers are read/write. Reading reset registers returns zero
- * (used for detection), writing any value causes the associated history to be
- * reset.
- * Virtual registers have to be handled in device specific driver code. Chip
- * driver code returns non-negative register values if a virtual register is
- * supported, or a negative error code if not. The chip driver may return
- * -ENODATA or any other error code in this case, though an error code other
- * than -ENODATA is handled more efficiently and thus preferred. Either case,
- * the calling PMBus core code will abort if the chip driver returns an error
- * code when reading or writing virtual registers.
- */
-#define PMBUS_VIRT_BASE 0x100
-#define PMBUS_VIRT_READ_TEMP_AVG (PMBUS_VIRT_BASE + 0)
-#define PMBUS_VIRT_READ_TEMP_MIN (PMBUS_VIRT_BASE + 1)
-#define PMBUS_VIRT_READ_TEMP_MAX (PMBUS_VIRT_BASE + 2)
-#define PMBUS_VIRT_RESET_TEMP_HISTORY (PMBUS_VIRT_BASE + 3)
-#define PMBUS_VIRT_READ_VIN_AVG (PMBUS_VIRT_BASE + 4)
-#define PMBUS_VIRT_READ_VIN_MIN (PMBUS_VIRT_BASE + 5)
-#define PMBUS_VIRT_READ_VIN_MAX (PMBUS_VIRT_BASE + 6)
-#define PMBUS_VIRT_RESET_VIN_HISTORY (PMBUS_VIRT_BASE + 7)
-#define PMBUS_VIRT_READ_IIN_AVG (PMBUS_VIRT_BASE + 8)
-#define PMBUS_VIRT_READ_IIN_MIN (PMBUS_VIRT_BASE + 9)
-#define PMBUS_VIRT_READ_IIN_MAX (PMBUS_VIRT_BASE + 10)
-#define PMBUS_VIRT_RESET_IIN_HISTORY (PMBUS_VIRT_BASE + 11)
-#define PMBUS_VIRT_READ_PIN_AVG (PMBUS_VIRT_BASE + 12)
-#define PMBUS_VIRT_READ_PIN_MAX (PMBUS_VIRT_BASE + 13)
-#define PMBUS_VIRT_RESET_PIN_HISTORY (PMBUS_VIRT_BASE + 14)
-#define PMBUS_VIRT_READ_POUT_AVG (PMBUS_VIRT_BASE + 15)
-#define PMBUS_VIRT_READ_POUT_MAX (PMBUS_VIRT_BASE + 16)
-#define PMBUS_VIRT_RESET_POUT_HISTORY (PMBUS_VIRT_BASE + 17)
-#define PMBUS_VIRT_READ_VOUT_AVG (PMBUS_VIRT_BASE + 18)
-#define PMBUS_VIRT_READ_VOUT_MIN (PMBUS_VIRT_BASE + 19)
-#define PMBUS_VIRT_READ_VOUT_MAX (PMBUS_VIRT_BASE + 20)
-#define PMBUS_VIRT_RESET_VOUT_HISTORY (PMBUS_VIRT_BASE + 21)
-#define PMBUS_VIRT_READ_IOUT_AVG (PMBUS_VIRT_BASE + 22)
-#define PMBUS_VIRT_READ_IOUT_MIN (PMBUS_VIRT_BASE + 23)
-#define PMBUS_VIRT_READ_IOUT_MAX (PMBUS_VIRT_BASE + 24)
-#define PMBUS_VIRT_RESET_IOUT_HISTORY (PMBUS_VIRT_BASE + 25)
-#define PMBUS_VIRT_READ_TEMP2_AVG (PMBUS_VIRT_BASE + 26)
-#define PMBUS_VIRT_READ_TEMP2_MIN (PMBUS_VIRT_BASE + 27)
-#define PMBUS_VIRT_READ_TEMP2_MAX (PMBUS_VIRT_BASE + 28)
-#define PMBUS_VIRT_RESET_TEMP2_HISTORY (PMBUS_VIRT_BASE + 29)
-
-#define PMBUS_VIRT_READ_VMON (PMBUS_VIRT_BASE + 30)
-#define PMBUS_VIRT_VMON_UV_WARN_LIMIT (PMBUS_VIRT_BASE + 31)
-#define PMBUS_VIRT_VMON_OV_WARN_LIMIT (PMBUS_VIRT_BASE + 32)
-#define PMBUS_VIRT_VMON_UV_FAULT_LIMIT (PMBUS_VIRT_BASE + 33)
-#define PMBUS_VIRT_VMON_OV_FAULT_LIMIT (PMBUS_VIRT_BASE + 34)
-#define PMBUS_VIRT_STATUS_VMON (PMBUS_VIRT_BASE + 35)
-
-/*
- * CAPABILITY
- */
-#define PB_CAPABILITY_SMBALERT (1<<4)
-#define PB_CAPABILITY_ERROR_CHECK (1<<7)
-
-/*
- * VOUT_MODE
- */
-#define PB_VOUT_MODE_MODE_MASK 0xe0
-#define PB_VOUT_MODE_PARAM_MASK 0x1f
-
-#define PB_VOUT_MODE_LINEAR 0x00
-#define PB_VOUT_MODE_VID 0x20
-#define PB_VOUT_MODE_DIRECT 0x40
-
-/*
- * Fan configuration
- */
-#define PB_FAN_2_PULSE_MASK ((1 << 0) | (1 << 1))
-#define PB_FAN_2_RPM (1 << 2)
-#define PB_FAN_2_INSTALLED (1 << 3)
-#define PB_FAN_1_PULSE_MASK ((1 << 4) | (1 << 5))
-#define PB_FAN_1_RPM (1 << 6)
-#define PB_FAN_1_INSTALLED (1 << 7)
-
-/*
- * STATUS_BYTE, STATUS_WORD (lower)
- */
-#define PB_STATUS_NONE_ABOVE (1<<0)
-#define PB_STATUS_CML (1<<1)
-#define PB_STATUS_TEMPERATURE (1<<2)
-#define PB_STATUS_VIN_UV (1<<3)
-#define PB_STATUS_IOUT_OC (1<<4)
-#define PB_STATUS_VOUT_OV (1<<5)
-#define PB_STATUS_OFF (1<<6)
-#define PB_STATUS_BUSY (1<<7)
-
-/*
- * STATUS_WORD (upper)
- */
-#define PB_STATUS_UNKNOWN (1<<8)
-#define PB_STATUS_OTHER (1<<9)
-#define PB_STATUS_FANS (1<<10)
-#define PB_STATUS_POWER_GOOD_N (1<<11)
-#define PB_STATUS_WORD_MFR (1<<12)
-#define PB_STATUS_INPUT (1<<13)
-#define PB_STATUS_IOUT_POUT (1<<14)
-#define PB_STATUS_VOUT (1<<15)
-
-/*
- * STATUS_IOUT
- */
-#define PB_POUT_OP_WARNING (1<<0)
-#define PB_POUT_OP_FAULT (1<<1)
-#define PB_POWER_LIMITING (1<<2)
-#define PB_CURRENT_SHARE_FAULT (1<<3)
-#define PB_IOUT_UC_FAULT (1<<4)
-#define PB_IOUT_OC_WARNING (1<<5)
-#define PB_IOUT_OC_LV_FAULT (1<<6)
-#define PB_IOUT_OC_FAULT (1<<7)
-
-/*
- * STATUS_VOUT, STATUS_INPUT
- */
-#define PB_VOLTAGE_UV_FAULT (1<<4)
-#define PB_VOLTAGE_UV_WARNING (1<<5)
-#define PB_VOLTAGE_OV_WARNING (1<<6)
-#define PB_VOLTAGE_OV_FAULT (1<<7)
-
-/*
- * STATUS_INPUT
- */
-#define PB_PIN_OP_WARNING (1<<0)
-#define PB_IIN_OC_WARNING (1<<1)
-#define PB_IIN_OC_FAULT (1<<2)
-
-/*
- * STATUS_TEMPERATURE
- */
-#define PB_TEMP_UT_FAULT (1<<4)
-#define PB_TEMP_UT_WARNING (1<<5)
-#define PB_TEMP_OT_WARNING (1<<6)
-#define PB_TEMP_OT_FAULT (1<<7)
-
-/*
- * STATUS_FAN
- */
-#define PB_FAN_AIRFLOW_WARNING (1<<0)
-#define PB_FAN_AIRFLOW_FAULT (1<<1)
-#define PB_FAN_FAN2_SPEED_OVERRIDE (1<<2)
-#define PB_FAN_FAN1_SPEED_OVERRIDE (1<<3)
-#define PB_FAN_FAN2_WARNING (1<<4)
-#define PB_FAN_FAN1_WARNING (1<<5)
-#define PB_FAN_FAN2_FAULT (1<<6)
-#define PB_FAN_FAN1_FAULT (1<<7)
-
-/*
- * CML_FAULT_STATUS
- */
-#define PB_CML_FAULT_OTHER_MEM_LOGIC (1<<0)
-#define PB_CML_FAULT_OTHER_COMM (1<<1)
-#define PB_CML_FAULT_PROCESSOR (1<<3)
-#define PB_CML_FAULT_MEMORY (1<<4)
-#define PB_CML_FAULT_PACKET_ERROR (1<<5)
-#define PB_CML_FAULT_INVALID_DATA (1<<6)
-#define PB_CML_FAULT_INVALID_COMMAND (1<<7)
-
-enum pmbus_sensor_classes {
- PSC_VOLTAGE_IN = 0,
- PSC_VOLTAGE_OUT,
- PSC_CURRENT_IN,
- PSC_CURRENT_OUT,
- PSC_POWER,
- PSC_TEMPERATURE,
- PSC_FAN,
- PSC_NUM_CLASSES /* Number of power sensor classes */
-};
-
-#define PMBUS_PAGES 32 /* Per PMBus specification */
-
-/* Functionality bit mask */
-#define PMBUS_HAVE_VIN (1 << 0)
-#define PMBUS_HAVE_VCAP (1 << 1)
-#define PMBUS_HAVE_VOUT (1 << 2)
-#define PMBUS_HAVE_IIN (1 << 3)
-#define PMBUS_HAVE_IOUT (1 << 4)
-#define PMBUS_HAVE_PIN (1 << 5)
-#define PMBUS_HAVE_POUT (1 << 6)
-#define PMBUS_HAVE_FAN12 (1 << 7)
-#define PMBUS_HAVE_FAN34 (1 << 8)
-#define PMBUS_HAVE_TEMP (1 << 9)
-#define PMBUS_HAVE_TEMP2 (1 << 10)
-#define PMBUS_HAVE_TEMP3 (1 << 11)
-#define PMBUS_HAVE_STATUS_VOUT (1 << 12)
-#define PMBUS_HAVE_STATUS_IOUT (1 << 13)
-#define PMBUS_HAVE_STATUS_INPUT (1 << 14)
-#define PMBUS_HAVE_STATUS_TEMP (1 << 15)
-#define PMBUS_HAVE_STATUS_FAN12 (1 << 16)
-#define PMBUS_HAVE_STATUS_FAN34 (1 << 17)
-#define PMBUS_HAVE_VMON (1 << 18)
-#define PMBUS_HAVE_STATUS_VMON (1 << 19)
-
-enum pmbus_data_format { linear = 0, direct, vid };
-
-struct pmbus_driver_info {
- int pages; /* Total number of pages */
- enum pmbus_data_format format[PSC_NUM_CLASSES];
- /*
- * Support one set of coefficients for each sensor type
- * Used for chips providing data in direct mode.
- */
- int m[PSC_NUM_CLASSES]; /* mantissa for direct data format */
- int b[PSC_NUM_CLASSES]; /* offset */
- int R[PSC_NUM_CLASSES]; /* exponent */
-
- u32 func[PMBUS_PAGES]; /* Functionality, per page */
- /*
- * The following functions map manufacturing specific register values
- * to PMBus standard register values. Specify only if mapping is
- * necessary.
- * Functions return the register value (read) or zero (write) if
- * successful. A return value of -ENODATA indicates that there is no
- * manufacturer specific register, but that a standard PMBus register
- * may exist. Any other negative return value indicates that the
- * register does not exist, and that no attempt should be made to read
- * the standard register.
- */
- int (*read_byte_data)(struct i2c_client *client, int page, int reg);
- int (*read_word_data)(struct i2c_client *client, int page, int reg);
- int (*write_word_data)(struct i2c_client *client, int page, int reg,
- u16 word);
- int (*write_byte)(struct i2c_client *client, int page, u8 value);
- /*
- * The identify function determines supported PMBus functionality.
- * This function is only necessary if a chip driver supports multiple
- * chips, and the chip functionality is not pre-determined.
- */
- int (*identify)(struct i2c_client *client,
- struct pmbus_driver_info *info);
-};
-
-/* Function declarations */
-
-void pmbus_clear_cache(struct i2c_client *client);
-int pmbus_set_page(struct i2c_client *client, u8 page);
-int pmbus_read_word_data(struct i2c_client *client, u8 page, u8 reg);
-int pmbus_write_word_data(struct i2c_client *client, u8 page, u8 reg, u16 word);
-int pmbus_read_byte_data(struct i2c_client *client, int page, u8 reg);
-int pmbus_write_byte(struct i2c_client *client, int page, u8 value);
-void pmbus_clear_faults(struct i2c_client *client);
-bool pmbus_check_byte_register(struct i2c_client *client, int page, int reg);
-bool pmbus_check_word_register(struct i2c_client *client, int page, int reg);
-int pmbus_do_probe(struct i2c_client *client, const struct i2c_device_id *id,
- struct pmbus_driver_info *info);
-int pmbus_do_remove(struct i2c_client *client);
-const struct pmbus_driver_info *pmbus_get_driver_info(struct i2c_client
- *client);
-
-#endif /* PMBUS_H */
diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix1b-32x/modules/qci_hwmon_ix1b.c b/platform/broadcom/sonic-platform-modules-quanta/ix1b-32x/modules/qci_hwmon_ix1b.c
new file mode 100644
index 0000000000..eb730cb28d
--- /dev/null
+++ b/platform/broadcom/sonic-platform-modules-quanta/ix1b-32x/modules/qci_hwmon_ix1b.c
@@ -0,0 +1,425 @@
+/*
+ * A hwmon driver for Cypress PSoC fan controller and thermal sensor
+ *
+ * This PSoC is a specific customize design only for Quanta Switch
+ * This driver is also monitoring pca9555 which is related to
+ * RPSU detection and LED controll in front panel. Instead a standalone
+ * driver, it should be combined with gpio lib to work correctly.
+ *
+ * Copyright (C) 2014 Quanta Inc.
+ *
+ * Author: Luffy Cheng
+ *
+ * Based on:
+ * adt7470.c from Darrick J. Wong
+ * Copyright (C) 2007 IBM
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#define QUANTA_IX1_PSU_GPIO_PSU1_PRSNT_N 16
+#define QUANTA_IX1_PSU_GPIO_PSU1_PWRGD 17
+#define QUANTA_IX1_PSU_GPIO_PSU2_PRSNT_N 19
+#define QUANTA_IX1_PSU_GPIO_PSU2_PWRGD 20
+
+#define QUANTA_IX1_FAN_GPIO_FAN1_PRSNT_N 36
+#define QUANTA_IX1_FAN_GPIO_FAN2_PRSNT_N 37
+#define QUANTA_IX1_FAN_GPIO_FAN3_PRSNT_N 38
+#define QUANTA_IX1_FAN_GPIO_FAN4_PRSNT_N 39
+
+#define AUTO_UPDATE_INTERVAL 10000
+
+enum psu_nr {
+ PSU1 = 0,
+ PSU2
+};
+
+enum fan_nr {
+ FAN1 = 0,
+ FAN2,
+ FAN3,
+ FAN4,
+};
+
+enum led_color {
+ LED_RED = 1,
+ LED_GREEN,
+ LED_COLOR_OFF
+};
+
+int hwmon_enable = 1;
+
+struct qci_hwmon_data {
+ struct device *hwmon_dev;
+ struct task_struct *auto_update;
+ struct completion auto_update_stop;
+ unsigned int auto_update_interval;
+ struct attribute_group attrs;
+
+};
+
+static void simple_atoi(const char *buf, int *output_val)
+{
+ int negative = 0;
+
+ if (buf[0] == '-')
+ {
+ negative = 1;
+ buf++;
+ }
+
+ while (*buf >= '0' && *buf <= '9') {
+ *output_val = *output_val * 10 + *buf - '0';
+ buf++;
+ }
+
+ if (negative)
+ *output_val = 0 - *output_val;
+}
+
+int read_gpio_file(int gpio)
+{
+ struct file *fp;
+ char buffer[512], file_path[255];
+ int offset = 0;
+ int ret;
+
+ /*open the file in read mode*/
+ sprintf(file_path, "/sys/class/gpio/gpio%d/value", gpio);
+ fp = filp_open(file_path, O_RDONLY, 0);
+ if (IS_ERR(fp)) {
+ printk("Cannot open the file %ld\n", PTR_ERR(fp));
+ return -1;
+ }
+
+ /*Read the data to the end of the file*/
+ while (1) {
+ ret = kernel_read(fp, offset, buffer, 512);
+ if (ret > 0) {
+ offset += ret;
+ }
+ else {
+ break;
+ }
+ }
+
+ filp_close(fp, NULL);
+
+ simple_atoi(buffer, &ret);
+
+ return ret;
+}
+
+static ssize_t get_hwmon_status(struct device *dev,
+ struct device_attribute *devattr, char *buf)
+{
+ return sprintf(buf, "%d\n", hwmon_enable);
+}
+
+static ssize_t set_hwmon_status(struct device *dev,
+ struct device_attribute *devattr, const char *buf, size_t count)
+{
+ long enable;
+
+ if (kstrtol(buf, 0, &enable))
+ return -EINVAL;
+
+ if ((enable != 1) && (enable != 0))
+ return -EINVAL;
+
+ hwmon_enable = enable;
+
+ return count;
+}
+
+static u8 read_fan_present(u8 fan_nr)
+{
+ u8 value = 0;
+
+ if (fan_nr == PSU1)
+ value = read_gpio_file(QUANTA_IX1_FAN_GPIO_FAN1_PRSNT_N);
+ else if (fan_nr == FAN2)
+ value = read_gpio_file(QUANTA_IX1_FAN_GPIO_FAN2_PRSNT_N);
+ else if (fan_nr == FAN3)
+ value = read_gpio_file(QUANTA_IX1_FAN_GPIO_FAN3_PRSNT_N);
+ else if (fan_nr == FAN4)
+ value = read_gpio_file(QUANTA_IX1_FAN_GPIO_FAN4_PRSNT_N);
+ else
+ return -1;
+
+ return value;
+}
+
+static u8 read_psu_present(u8 psu_nr)
+{
+ u8 value = 0;
+
+ if (psu_nr == PSU1)
+ value = read_gpio_file(QUANTA_IX1_PSU_GPIO_PSU1_PRSNT_N);
+ else if (psu_nr == PSU2)
+ value = read_gpio_file(QUANTA_IX1_PSU_GPIO_PSU2_PRSNT_N);
+ else
+ return -1;
+
+ return value;
+}
+
+static u8 read_psu_AC_good(u8 psu_nr)
+{
+ u8 value = 0;
+
+ if (psu_nr == PSU1)
+ value = read_gpio_file(QUANTA_IX1_PSU_GPIO_PSU1_PWRGD);
+ else if (psu_nr == PSU2)
+ value = read_gpio_file(QUANTA_IX1_PSU_GPIO_PSU2_PWRGD);
+ else
+ return -1;
+
+ return value;
+}
+
+static u8 front_led_set(char *name, char *value)
+{
+ struct file *fp;
+ char file_path[255];
+ int ret;
+ mm_segment_t oldfs;
+
+ sprintf(file_path, "/sys/class/leds/%s/brightness", name);
+ fp = filp_open(file_path, O_RDWR | O_CREAT, 0644);
+
+ if (IS_ERR(fp)) {
+ printk("Cannot open the file %ld\n", PTR_ERR(fp));
+ return -1;
+ }
+
+ oldfs = get_fs();
+ set_fs(get_ds());
+
+ ret = vfs_write(fp, value, sizeof(value), &fp->f_pos);
+
+ set_fs(oldfs);
+
+ filp_close(fp, NULL);
+
+ return 0;
+}
+
+static u8 update_led(u8 *fan_status, u8 *psu_status)
+{
+ u8 i = 0, fan_color = LED_GREEN;
+
+ // Update FAN front LED
+ for (i = 0; i < 4; i++)
+ {
+ if (fan_status[i] == 1)
+ {
+ fan_color = LED_RED;
+ front_led_set("front_led_fan_red", "1");
+ front_led_set("front_led_fan_green", "0");
+ break;
+ }
+ }
+
+ if (fan_color == LED_GREEN)
+ {
+ front_led_set("front_led_fan_red", "0");
+ front_led_set("front_led_fan_green", "1");
+ }
+
+ // Update PSU1 front LED
+ if ((psu_status[0] == 0) && (psu_status[2] == 1))
+ {
+ front_led_set("front_led_psu1_green", "1");
+ front_led_set("front_led_psu1_red", "0");
+ }
+ else if (psu_status[0] == 1)
+ {
+ front_led_set("front_led_psu1_green", "0");
+ front_led_set("front_led_psu1_red", "0");
+ }
+ else
+ {
+ front_led_set("front_led_psu1_green", "0");
+ front_led_set("front_led_psu1_red", "1");
+ }
+
+ // Update PSU2 front LED
+ if ((psu_status[1] == 0) && (psu_status[3] == 1))
+ {
+ front_led_set("front_led_psu2_green", "1");
+ front_led_set("front_led_psu2_red", "0");
+ }
+ else if (psu_status[1] == 1)
+ {
+ front_led_set("front_led_psu2_green", "0");
+ front_led_set("front_led_psu2_red", "0");
+ }
+ else
+ {
+ front_led_set("front_led_psu2_green", "0");
+ front_led_set("front_led_psu2_red", "1");
+ }
+
+ return 0;
+}
+
+static int led_update_thread(void *p)
+{
+ struct platform_device *pdev = p;
+ struct qci_hwmon_data *data = platform_get_drvdata(pdev);
+
+ u8 i = 0;
+ u8 psu_status[4] = {0}; // {PSU1-2 present, PSU1-2 AC good}
+ u8 fan_status[4] = {0}; // {FAN1-4 present}
+
+ while (!kthread_should_stop()) {
+
+ if (hwmon_enable)
+ {
+ for (i = 0; i < 4; i++)
+ {
+ fan_status[i] = read_fan_present(i);
+ }
+
+ for (i = 0; i < 2; i++)
+ {
+ psu_status[i] = read_psu_present(i);
+ psu_status[i+2] = read_psu_AC_good(i);
+ }
+
+ update_led(fan_status, psu_status);
+ }
+
+ if (kthread_should_stop())
+ break;
+ msleep_interruptible(data->auto_update_interval);
+ }
+
+ complete_all(&data->auto_update_stop);
+ return 0;
+}
+
+static DEVICE_ATTR(hwmon_status, S_IWUSR | S_IRUGO, get_hwmon_status, set_hwmon_status);
+
+static struct attribute *qci_hwmon_attr[] = {
+
+ &dev_attr_hwmon_status.attr,
+
+ NULL
+};
+
+static int qci_hwmon_probe(struct platform_device *pdev)
+{
+ struct qci_hwmon_data *data;
+ int err;
+
+ data = devm_kzalloc(&pdev->dev, sizeof(struct qci_hwmon_data),
+ GFP_KERNEL);
+ if (!data)
+ {
+ return -ENOMEM;
+ }
+
+ data->auto_update_interval = AUTO_UPDATE_INTERVAL;
+ data->attrs.attrs = qci_hwmon_attr;
+
+ platform_set_drvdata(pdev, data);
+
+ dev_info(&pdev->dev, "%s device found\n", pdev->name);
+
+ data->hwmon_dev = hwmon_device_register(&pdev->dev);
+ if (IS_ERR(data->hwmon_dev)) {
+ err = PTR_ERR(data->hwmon_dev);
+ }
+
+ err = sysfs_create_group(&pdev->dev.kobj, &data->attrs);
+ if (err)
+ return err;
+
+ init_completion(&data->auto_update_stop);
+ data->auto_update = kthread_run(led_update_thread, pdev,
+ dev_name(data->hwmon_dev));
+ if (IS_ERR(data->auto_update)) {
+ err = PTR_ERR(data->auto_update);
+ goto exit_unregister;
+ }
+
+ return 0;
+
+exit_unregister:
+ hwmon_device_unregister(data->hwmon_dev);
+ return err;
+}
+
+static int qci_hwmon_remove(struct platform_device *pdev)
+{
+ struct qci_hwmon_data *data = platform_get_drvdata(pdev);
+
+ kthread_stop(data->auto_update);
+ wait_for_completion(&data->auto_update_stop);
+ hwmon_device_unregister(data->hwmon_dev);
+ sysfs_remove_group(&pdev->dev.kobj, &data->attrs);
+ return 0;
+}
+
+static struct platform_driver qci_hwmon_driver = {
+ .probe = qci_hwmon_probe,
+ .remove = qci_hwmon_remove,
+ .driver = {
+ .name = "qci-hwmon",
+ .owner = THIS_MODULE,
+ },
+};
+
+static int __init qci_hwmon_init(void)
+{
+ platform_driver_register(&qci_hwmon_driver);
+
+ return 0;
+}
+
+static void __exit qci_hwmon_exit(void)
+{
+ platform_driver_unregister(&qci_hwmon_driver);
+}
+
+module_init(qci_hwmon_init);
+module_exit(qci_hwmon_exit);
+
+MODULE_AUTHOR("Quanta Computer Inc.");
+MODULE_DESCRIPTION("Quanta Switch Hardware Monitor driver");
+MODULE_LICENSE("GPL");
diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix1b-32x/modules/qci_platform_ix1b.c b/platform/broadcom/sonic-platform-modules-quanta/ix1b-32x/modules/qci_platform_ix1b.c
old mode 100755
new mode 100644
index f783c88fb9..925b46256c
--- a/platform/broadcom/sonic-platform-modules-quanta/ix1b-32x/modules/qci_platform_ix1b.c
+++ b/platform/broadcom/sonic-platform-modules-quanta/ix1b-32x/modules/qci_platform_ix1b.c
@@ -179,67 +179,67 @@ static struct pca953x_platform_data pca9555ID_data = {
static struct i2c_board_info ix1b_i2c_devices[] = {
{
- I2C_BOARD_INFO("pca9546", 0x77),
+ I2C_BOARD_INFO("pca9546", 0x77), // 0
.platform_data = &pca9546_1_data,
},
{
- I2C_BOARD_INFO("pca9546", 0x72),
+ I2C_BOARD_INFO("pca9546", 0x72), // 1
.platform_data = &pca9546_2_data,
},
{
- I2C_BOARD_INFO("pca9555", 0x26),
+ I2C_BOARD_INFO("pca9555", 0x26), // 2
.platform_data = &pca9555psu1_data,
},
{
- I2C_BOARD_INFO("24c02", 0x54),
+ I2C_BOARD_INFO("24c02", 0x54), // 3
},
{
- I2C_BOARD_INFO("pca9548", 0x73),
+ I2C_BOARD_INFO("pca9548", 0x73), // 4
.platform_data = &pca9548sfp1_data,
},
{
- I2C_BOARD_INFO("pca9548", 0x74),
+ I2C_BOARD_INFO("pca9548", 0x74), // 5
.platform_data = &pca9548sfp2_data,
},
{
- I2C_BOARD_INFO("pca9548", 0x75),
+ I2C_BOARD_INFO("pca9548", 0x75), // 6
.platform_data = &pca9548sfp3_data,
},
{
- I2C_BOARD_INFO("pca9548", 0x76),
+ I2C_BOARD_INFO("pca9548", 0x76), // 7
.platform_data = &pca9548sfp4_data,
},
{
- I2C_BOARD_INFO("CPLD-QSFP28", 0x38),
+ I2C_BOARD_INFO("CPLD-QSFP28", 0x38), // 8
},
{
- I2C_BOARD_INFO("CPLD-QSFP28", 0x39),
+ I2C_BOARD_INFO("CPLD-QSFP28", 0x39), // 9
},
{
- I2C_BOARD_INFO("pca9555", 0x23),
+ I2C_BOARD_INFO("pca9555", 0x23), // 10
.platform_data = &pca9555ID_data,
},
{
- I2C_BOARD_INFO("pca9555", 0x25),
+ I2C_BOARD_INFO("pca9555", 0x25), // 11
.platform_data = &pca9555fan_data,
},
{
- I2C_BOARD_INFO("qci_pmbus_ix1b", 0x5f),
+ I2C_BOARD_INFO("qci_pmbus_ix1b", 0x5f), // 12
},
{
- I2C_BOARD_INFO("qci_pmbus_ix1b", 0x59),
+ I2C_BOARD_INFO("qci_pmbus_ix1b", 0x59), // 13
},
#if defined(QUANTA_CPU_RGL)
{
- I2C_BOARD_INFO("pca9546", 0x71),
+ I2C_BOARD_INFO("pca9546", 0x71), // 14
.platform_data = &pca9546_cpu1_data,
},
{
- I2C_BOARD_INFO("pca9555", 0x20),
+ I2C_BOARD_INFO("pca9555", 0x20), // 15
.platform_data = &pca9555_cpuled_data,
},
{
- I2C_BOARD_INFO("24c02", 0x50),
+ I2C_BOARD_INFO("optoe1", 0x50), // 16
},
#endif
};
@@ -347,6 +347,13 @@ static struct platform_device system_led_dev = {
},
};
+static struct platform_device qci_hwmon_device = {
+ .name = "qci-hwmon",
+ .id = 0,
+ .dev = {
+ },
+};
+
static struct platform_device *ix1b_device;
struct gpio_led_data {
@@ -390,68 +397,68 @@ static int __init ix1b_platform_init(void)
goto fail_platform_device;
adapter = i2c_get_adapter(0);
- client = i2c_new_device(adapter, &ix1b_i2c_devices[0]); // pca9546_1
+ client = i2c_new_device(adapter, &ix1b_i2c_devices[0]); // pca9546_1 - Address: 0x77
printk("[CC] NEW device pca9546_1\n");
- client = i2c_new_device(adapter, &ix1b_i2c_devices[1]); // pca9546_2
+ client = i2c_new_device(adapter, &ix1b_i2c_devices[1]); // pca9546_2 - Address: 0x72
printk("[CC] NEW device pca9546_2\n");
#if defined(QUANTA_CPU_RGL)
- client = i2c_new_device(adapter, &ix1b_i2c_devices[14]); // cpu pca9546_1
+ client = i2c_new_device(adapter, &ix1b_i2c_devices[14]); // cpu pca9546_1 - Address: 0x71
printk("[CC] NEW device cpu pca9546_1\n");
#endif
i2c_put_adapter(adapter);
adapter = i2c_get_adapter(0x14);
- client = i2c_new_device(adapter, &ix1b_i2c_devices[12]); // pmbus_psu1
+ client = i2c_new_device(adapter, &ix1b_i2c_devices[12]); // pmbus_psu1 - Address: 0x5f
printk("[CC] NEW device pmbus_psu1\n");
i2c_put_adapter(adapter);
adapter = i2c_get_adapter(0x15);
- client = i2c_new_device(adapter, &ix1b_i2c_devices[13]); // pmbus_psu2
+ client = i2c_new_device(adapter, &ix1b_i2c_devices[13]); // pmbus_psu2 - Address: 0x59
printk("[CC] NEW device pmbus_psu2\n");
i2c_put_adapter(adapter);
adapter = i2c_get_adapter(0x16);
- client = i2c_new_device(adapter, &ix1b_i2c_devices[2]); // pca9555-PSU1
+ client = i2c_new_device(adapter, &ix1b_i2c_devices[2]); // pca9555-PSU1 - Address: 0x26
printk("[CC] NEW device pca9555-PSU1\n");
- client = i2c_new_device(adapter, &ix1b_i2c_devices[3]); // MB_BOARDINFO_EEPROM
+ client = i2c_new_device(adapter, &ix1b_i2c_devices[3]); // MB_BOARDINFO_EEPROM - Address: 0x54
printk("[CC] NEW device MB_BOARDINFO_EEPROM\n");
- client = i2c_new_device(adapter, &ix1b_i2c_devices[10]); // pca9555-ID
+ client = i2c_new_device(adapter, &ix1b_i2c_devices[10]); // pca9555-ID - Address: 0x23
printk("[CC] NEW device pca9555-ID\n");
i2c_put_adapter(adapter);
adapter = i2c_get_adapter(0x17);
- client = i2c_new_device(adapter, &ix1b_i2c_devices[11]); // pca9555-fan
+ client = i2c_new_device(adapter, &ix1b_i2c_devices[11]); // pca9555-fan - Address: 0x25
printk("[CC] NEW device pca9555-fan\n");
i2c_put_adapter(adapter);
adapter = i2c_get_adapter(0x10);
- client = i2c_new_device(adapter, &ix1b_i2c_devices[4]); // pca9548_2 SFP
+ client = i2c_new_device(adapter, &ix1b_i2c_devices[4]); // pca9548_1 SFP - Address: 0x73
+ printk("[CC] NEW device pca9548_1 SFP\n");
+ client = i2c_new_device(adapter, &ix1b_i2c_devices[5]); // pca9548_2 SFP - Address: 0x74
printk("[CC] NEW device pca9548_2 SFP\n");
- client = i2c_new_device(adapter, &ix1b_i2c_devices[5]); // pca9548_3 SFP
+ client = i2c_new_device(adapter, &ix1b_i2c_devices[6]); // pca9548_3 SFP - Address: 0x75
printk("[CC] NEW device pca9548_3 SFP\n");
- client = i2c_new_device(adapter, &ix1b_i2c_devices[6]); // pca9548_4 SFP
- printk("[CC] NEW device pca9548_4 SFP\n");
- client = i2c_new_device(adapter, &ix1b_i2c_devices[8]); // CPLD2
+ client = i2c_new_device(adapter, &ix1b_i2c_devices[8]); // CPLD2 - Address: 0x38
printk("[CC] NEW device CPLD2\n");
- client = i2c_new_device(adapter, &ix1b_i2c_devices[9]); // CPLD3
+ client = i2c_new_device(adapter, &ix1b_i2c_devices[9]); // CPLD3 - Address: 0x39
printk("[CC] NEW device CPLD3\n");
i2c_put_adapter(adapter);
adapter = i2c_get_adapter(0x11);
- client = i2c_new_device(adapter, &ix1b_i2c_devices[7]); // pca9548_5 SFP
- printk("[CC] NEW device pca9548_5 SFP\n");
+ client = i2c_new_device(adapter, &ix1b_i2c_devices[7]); // pca9548_4 SFP - Address: 0x76
+ printk("[CC] NEW device pca9548_4 SFP\n");
i2c_put_adapter(adapter);
#if defined(QUANTA_CPU_RGL)
adapter = i2c_get_adapter(0x18);
- client = i2c_new_device(adapter, &ix1b_i2c_devices[15]); // cpu pca9555_1
+ client = i2c_new_device(adapter, &ix1b_i2c_devices[15]); // cpu pca9555_1 - Address: 0x20
printk("[CC] NEW device cpu pca9555_1\n");
i2c_put_adapter(adapter);
for(i = 0x20; i < 0x40; i++)
{
adapter = i2c_get_adapter(i);
- client = i2c_new_device(adapter, &ix1b_i2c_devices[16]); // eeprom for loopback module
+ client = i2c_new_device(adapter, &ix1b_i2c_devices[16]); // eeprom for loopback module - Address: 0x50
i2c_put_adapter(adapter);
}
printk("[CC] NEW device eeprom\n");
@@ -466,6 +473,9 @@ static int __init ix1b_platform_init(void)
}
printk("[CC] NEW device led\n");
+ platform_device_register(&qci_hwmon_device);
+ printk("[CC] NEW device hwmon\n");
+
return 0;
fail_platform_device:
diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix1b-32x/modules/qci_pmbus.c b/platform/broadcom/sonic-platform-modules-quanta/ix1b-32x/modules/qci_pmbus.c
index f54a0f204d..0fac27b59b 100755
--- a/platform/broadcom/sonic-platform-modules-quanta/ix1b-32x/modules/qci_pmbus.c
+++ b/platform/broadcom/sonic-platform-modules-quanta/ix1b-32x/modules/qci_pmbus.c
@@ -27,14 +27,268 @@
#include
#include
#include
-//#include <../drivers/hwmon/pmbus/pmbus.h>
-#include "pmbus.h"
#include
enum projects { ly8, ix1, ix2, ix1b };
#define DELAY_TIME 1000 /* uS */
+/* Pmbus reg defines are copied from drivers/hwmon/pmbus/pmbus.h*/
+/*
+ * Registers
+ */
+enum pmbus_regs {
+ PMBUS_PAGE = 0x00,
+ PMBUS_OPERATION = 0x01,
+ PMBUS_ON_OFF_CONFIG = 0x02,
+ PMBUS_CLEAR_FAULTS = 0x03,
+ PMBUS_PHASE = 0x04,
+
+ PMBUS_CAPABILITY = 0x19,
+ PMBUS_QUERY = 0x1A,
+
+ PMBUS_VOUT_MODE = 0x20,
+ PMBUS_VOUT_COMMAND = 0x21,
+ PMBUS_VOUT_TRIM = 0x22,
+ PMBUS_VOUT_CAL_OFFSET = 0x23,
+ PMBUS_VOUT_MAX = 0x24,
+ PMBUS_VOUT_MARGIN_HIGH = 0x25,
+ PMBUS_VOUT_MARGIN_LOW = 0x26,
+ PMBUS_VOUT_TRANSITION_RATE = 0x27,
+ PMBUS_VOUT_DROOP = 0x28,
+ PMBUS_VOUT_SCALE_LOOP = 0x29,
+ PMBUS_VOUT_SCALE_MONITOR = 0x2A,
+
+ PMBUS_COEFFICIENTS = 0x30,
+ PMBUS_POUT_MAX = 0x31,
+
+ PMBUS_FAN_CONFIG_12 = 0x3A,
+ PMBUS_FAN_COMMAND_1 = 0x3B,
+ PMBUS_FAN_COMMAND_2 = 0x3C,
+ PMBUS_FAN_CONFIG_34 = 0x3D,
+ PMBUS_FAN_COMMAND_3 = 0x3E,
+ PMBUS_FAN_COMMAND_4 = 0x3F,
+
+ PMBUS_VOUT_OV_FAULT_LIMIT = 0x40,
+ PMBUS_VOUT_OV_FAULT_RESPONSE = 0x41,
+ PMBUS_VOUT_OV_WARN_LIMIT = 0x42,
+ PMBUS_VOUT_UV_WARN_LIMIT = 0x43,
+ PMBUS_VOUT_UV_FAULT_LIMIT = 0x44,
+ PMBUS_VOUT_UV_FAULT_RESPONSE = 0x45,
+ PMBUS_IOUT_OC_FAULT_LIMIT = 0x46,
+ PMBUS_IOUT_OC_FAULT_RESPONSE = 0x47,
+ PMBUS_IOUT_OC_LV_FAULT_LIMIT = 0x48,
+ PMBUS_IOUT_OC_LV_FAULT_RESPONSE = 0x49,
+ PMBUS_IOUT_OC_WARN_LIMIT = 0x4A,
+ PMBUS_IOUT_UC_FAULT_LIMIT = 0x4B,
+ PMBUS_IOUT_UC_FAULT_RESPONSE = 0x4C,
+
+ PMBUS_OT_FAULT_LIMIT = 0x4F,
+ PMBUS_OT_FAULT_RESPONSE = 0x50,
+ PMBUS_OT_WARN_LIMIT = 0x51,
+ PMBUS_UT_WARN_LIMIT = 0x52,
+ PMBUS_UT_FAULT_LIMIT = 0x53,
+ PMBUS_UT_FAULT_RESPONSE = 0x54,
+ PMBUS_VIN_OV_FAULT_LIMIT = 0x55,
+ PMBUS_VIN_OV_FAULT_RESPONSE = 0x56,
+ PMBUS_VIN_OV_WARN_LIMIT = 0x57,
+ PMBUS_VIN_UV_WARN_LIMIT = 0x58,
+ PMBUS_VIN_UV_FAULT_LIMIT = 0x59,
+
+ PMBUS_IIN_OC_FAULT_LIMIT = 0x5B,
+ PMBUS_IIN_OC_WARN_LIMIT = 0x5D,
+
+ PMBUS_POUT_OP_FAULT_LIMIT = 0x68,
+ PMBUS_POUT_OP_WARN_LIMIT = 0x6A,
+ PMBUS_PIN_OP_WARN_LIMIT = 0x6B,
+
+ PMBUS_STATUS_BYTE = 0x78,
+ PMBUS_STATUS_WORD = 0x79,
+ PMBUS_STATUS_VOUT = 0x7A,
+ PMBUS_STATUS_IOUT = 0x7B,
+ PMBUS_STATUS_INPUT = 0x7C,
+ PMBUS_STATUS_TEMPERATURE = 0x7D,
+ PMBUS_STATUS_CML = 0x7E,
+ PMBUS_STATUS_OTHER = 0x7F,
+ PMBUS_STATUS_MFR_SPECIFIC = 0x80,
+ PMBUS_STATUS_FAN_12 = 0x81,
+ PMBUS_STATUS_FAN_34 = 0x82,
+
+ PMBUS_READ_VIN = 0x88,
+ PMBUS_READ_IIN = 0x89,
+ PMBUS_READ_VCAP = 0x8A,
+ PMBUS_READ_VOUT = 0x8B,
+ PMBUS_READ_IOUT = 0x8C,
+ PMBUS_READ_TEMPERATURE_1 = 0x8D,
+ PMBUS_READ_TEMPERATURE_2 = 0x8E,
+ PMBUS_READ_TEMPERATURE_3 = 0x8F,
+ PMBUS_READ_FAN_SPEED_1 = 0x90,
+ PMBUS_READ_FAN_SPEED_2 = 0x91,
+ PMBUS_READ_FAN_SPEED_3 = 0x92,
+ PMBUS_READ_FAN_SPEED_4 = 0x93,
+ PMBUS_READ_DUTY_CYCLE = 0x94,
+ PMBUS_READ_FREQUENCY = 0x95,
+ PMBUS_READ_POUT = 0x96,
+ PMBUS_READ_PIN = 0x97,
+
+ PMBUS_REVISION = 0x98,
+ PMBUS_MFR_ID = 0x99,
+ PMBUS_MFR_MODEL = 0x9A,
+ PMBUS_MFR_REVISION = 0x9B,
+ PMBUS_MFR_LOCATION = 0x9C,
+ PMBUS_MFR_DATE = 0x9D,
+ PMBUS_MFR_SERIAL = 0x9E,
+
+/*
+ * Virtual registers.
+ * Useful to support attributes which are not supported by standard PMBus
+ * registers but exist as manufacturer specific registers on individual chips.
+ * Must be mapped to real registers in device specific code.
+ *
+ * Semantics:
+ * Virtual registers are all word size.
+ * READ registers are read-only; writes are either ignored or return an error.
+ * RESET registers are read/write. Reading reset registers returns zero
+ * (used for detection), writing any value causes the associated history to be
+ * reset.
+ * Virtual registers have to be handled in device specific driver code. Chip
+ * driver code returns non-negative register values if a virtual register is
+ * supported, or a negative error code if not. The chip driver may return
+ * -ENODATA or any other error code in this case, though an error code other
+ * than -ENODATA is handled more efficiently and thus preferred. Either case,
+ * the calling PMBus core code will abort if the chip driver returns an error
+ * code when reading or writing virtual registers.
+ */
+ PMBUS_VIRT_BASE = 0x100,
+ PMBUS_VIRT_READ_TEMP_AVG,
+ PMBUS_VIRT_READ_TEMP_MIN,
+ PMBUS_VIRT_READ_TEMP_MAX,
+ PMBUS_VIRT_RESET_TEMP_HISTORY,
+ PMBUS_VIRT_READ_VIN_AVG,
+ PMBUS_VIRT_READ_VIN_MIN,
+ PMBUS_VIRT_READ_VIN_MAX,
+ PMBUS_VIRT_RESET_VIN_HISTORY,
+ PMBUS_VIRT_READ_IIN_AVG,
+ PMBUS_VIRT_READ_IIN_MIN,
+ PMBUS_VIRT_READ_IIN_MAX,
+ PMBUS_VIRT_RESET_IIN_HISTORY,
+ PMBUS_VIRT_READ_PIN_AVG,
+ PMBUS_VIRT_READ_PIN_MIN,
+ PMBUS_VIRT_READ_PIN_MAX,
+ PMBUS_VIRT_RESET_PIN_HISTORY,
+ PMBUS_VIRT_READ_POUT_AVG,
+ PMBUS_VIRT_READ_POUT_MIN,
+ PMBUS_VIRT_READ_POUT_MAX,
+ PMBUS_VIRT_RESET_POUT_HISTORY,
+ PMBUS_VIRT_READ_VOUT_AVG,
+ PMBUS_VIRT_READ_VOUT_MIN,
+ PMBUS_VIRT_READ_VOUT_MAX,
+ PMBUS_VIRT_RESET_VOUT_HISTORY,
+ PMBUS_VIRT_READ_IOUT_AVG,
+ PMBUS_VIRT_READ_IOUT_MIN,
+ PMBUS_VIRT_READ_IOUT_MAX,
+ PMBUS_VIRT_RESET_IOUT_HISTORY,
+ PMBUS_VIRT_READ_TEMP2_AVG,
+ PMBUS_VIRT_READ_TEMP2_MIN,
+ PMBUS_VIRT_READ_TEMP2_MAX,
+ PMBUS_VIRT_RESET_TEMP2_HISTORY,
+
+ PMBUS_VIRT_READ_VMON,
+ PMBUS_VIRT_VMON_UV_WARN_LIMIT,
+ PMBUS_VIRT_VMON_OV_WARN_LIMIT,
+ PMBUS_VIRT_VMON_UV_FAULT_LIMIT,
+ PMBUS_VIRT_VMON_OV_FAULT_LIMIT,
+ PMBUS_VIRT_STATUS_VMON,
+};
+
+enum pmbus_sensor_classes {
+ PSC_VOLTAGE_IN = 0,
+ PSC_VOLTAGE_OUT,
+ PSC_CURRENT_IN,
+ PSC_CURRENT_OUT,
+ PSC_POWER,
+ PSC_TEMPERATURE,
+ PSC_FAN,
+ PSC_NUM_CLASSES /* Number of power sensor classes */
+};
+
+#define PMBUS_PAGES 32 /* Per PMBus specification */
+
+/* Functionality bit mask */
+#define PMBUS_HAVE_VIN BIT(0)
+#define PMBUS_HAVE_VCAP BIT(1)
+#define PMBUS_HAVE_VOUT BIT(2)
+#define PMBUS_HAVE_IIN BIT(3)
+#define PMBUS_HAVE_IOUT BIT(4)
+#define PMBUS_HAVE_PIN BIT(5)
+#define PMBUS_HAVE_POUT BIT(6)
+#define PMBUS_HAVE_FAN12 BIT(7)
+#define PMBUS_HAVE_FAN34 BIT(8)
+#define PMBUS_HAVE_TEMP BIT(9)
+#define PMBUS_HAVE_TEMP2 BIT(10)
+#define PMBUS_HAVE_TEMP3 BIT(11)
+#define PMBUS_HAVE_STATUS_VOUT BIT(12)
+#define PMBUS_HAVE_STATUS_IOUT BIT(13)
+#define PMBUS_HAVE_STATUS_INPUT BIT(14)
+#define PMBUS_HAVE_STATUS_TEMP BIT(15)
+#define PMBUS_HAVE_STATUS_FAN12 BIT(16)
+#define PMBUS_HAVE_STATUS_FAN34 BIT(17)
+#define PMBUS_HAVE_VMON BIT(18)
+#define PMBUS_HAVE_STATUS_VMON BIT(19)
+
+enum pmbus_data_format { linear = 0, direct, vid };
+enum vrm_version { vr11 = 0, vr12, vr13 };
+
+struct pmbus_driver_info {
+ int pages; /* Total number of pages */
+ enum pmbus_data_format format[PSC_NUM_CLASSES];
+ enum vrm_version vrm_version;
+ /*
+ * Support one set of coefficients for each sensor type
+ * Used for chips providing data in direct mode.
+ */
+ int m[PSC_NUM_CLASSES]; /* mantissa for direct data format */
+ int b[PSC_NUM_CLASSES]; /* offset */
+ int R[PSC_NUM_CLASSES]; /* exponent */
+
+ u32 func[PMBUS_PAGES]; /* Functionality, per page */
+ /*
+ * The following functions map manufacturing specific register values
+ * to PMBus standard register values. Specify only if mapping is
+ * necessary.
+ * Functions return the register value (read) or zero (write) if
+ * successful. A return value of -ENODATA indicates that there is no
+ * manufacturer specific register, but that a standard PMBus register
+ * may exist. Any other negative return value indicates that the
+ * register does not exist, and that no attempt should be made to read
+ * the standard register.
+ */
+ int (*read_byte_data)(struct i2c_client *client, int page, int reg);
+ int (*read_word_data)(struct i2c_client *client, int page, int reg);
+ int (*write_word_data)(struct i2c_client *client, int page, int reg,
+ u16 word);
+ int (*write_byte)(struct i2c_client *client, int page, u8 value);
+ /*
+ * The identify function determines supported PMBus functionality.
+ * This function is only necessary if a chip driver supports multiple
+ * chips, and the chip functionality is not pre-determined.
+ */
+ int (*identify)(struct i2c_client *client,
+ struct pmbus_driver_info *info);
+
+ /* Regulator functionality, if supported by this chip driver. */
+ int num_regulators;
+ const struct regulator_desc *reg_desc;
+};
+
+extern int pmbus_set_page(struct i2c_client *client, u8 page);
+extern int pmbus_read_byte_data(struct i2c_client *client, int page, u8 reg);
+extern bool pmbus_check_byte_register(struct i2c_client *client, int page, int reg);
+extern bool pmbus_check_word_register(struct i2c_client *client, int page, int reg);
+extern int pmbus_do_probe(struct i2c_client *client, const struct i2c_device_id *id,
+ struct pmbus_driver_info *info);
+extern int pmbus_do_remove(struct i2c_client *client);
+
/* Needed to access the mutex. Copied from pmbus_core.c */
#define PB_STATUS_BASE 0
#define PB_STATUS_VOUT_BASE (PB_STATUS_BASE + PMBUS_PAGES)
@@ -327,6 +581,7 @@ static int qci_pmbus_identify(struct i2c_client *client,
break;
case 1:
info->format[PSC_VOLTAGE_OUT] = vid;
+ info->vrm_version = vr11;
break;
case 2:
info->format[PSC_VOLTAGE_OUT] = direct;
@@ -411,7 +666,7 @@ static int qci_pmbus_probe(struct i2c_client *client,
{
struct device *dev = &client->dev;
struct pmbus_driver_info *info;
- int ret, i;
+ int ret;
dev_info(dev, "qci_pmbus_probe\n");
@@ -419,8 +674,7 @@ static int qci_pmbus_probe(struct i2c_client *client,
I2C_FUNC_SMBUS_READ_WORD_DATA))
return -ENODEV;
- info = devm_kzalloc(&client->dev, sizeof(struct pmbus_driver_info),
- GFP_KERNEL);
+ info = devm_kzalloc(dev, sizeof(struct pmbus_driver_info), GFP_KERNEL);
if (!info)
return -ENOMEM;
diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix1b-32x/utils/quanta_ix1b_util.py b/platform/broadcom/sonic-platform-modules-quanta/ix1b-32x/utils/quanta_ix1b_util.py
index f530cf3dbb..2135932938 100755
--- a/platform/broadcom/sonic-platform-modules-quanta/ix1b-32x/utils/quanta_ix1b_util.py
+++ b/platform/broadcom/sonic-platform-modules-quanta/ix1b-32x/utils/quanta_ix1b_util.py
@@ -40,75 +40,96 @@ args = []
FORCE = 0
i2c_prefix = '/sys/bus/i2c/devices/'
-
if DEBUG == True:
print sys.argv[0]
- print 'ARGV :', sys.argv[1:]
-
+ print 'ARGV :', sys.argv[1:]
def main():
global DEBUG
global args
global FORCE
-
- if len(sys.argv)<2:
+
+ if len(sys.argv) < 2:
show_help()
-
+
options, args = getopt.getopt(sys.argv[1:], 'hdf', ['help',
'debug',
'force',
])
- if DEBUG == True:
+ if DEBUG == True:
print options
print args
print len(sys.argv)
-
+
for opt, arg in options:
if opt in ('-h', '--help'):
show_help()
- elif opt in ('-d', '--debug'):
+ elif opt in ('-d', '--debug'):
DEBUG = True
- logging.basicConfig(level=logging.INFO)
- elif opt in ('-f', '--force'):
+ logging.basicConfig(level = logging.INFO)
+ elif opt in ('-f', '--force'):
FORCE = 1
else:
- logging.info('no option')
- for arg in args:
+ logging.info('no option')
+
+ for arg in args:
if arg == 'install':
- install()
+ install()
elif arg == 'clean':
- uninstall()
+ uninstall()
else:
show_help()
-
-
- return 0
-
+
+ return 0
+
def show_help():
print __doc__ % {'scriptName' : sys.argv[0].split("/")[-1]}
sys.exit(0)
-
+
def show_log(txt):
if DEBUG == True:
- print "[IX1B-32X]"+txt
+ print "[IX1B-32X]" + txt
+
return
-
+
def exec_cmd(cmd, show):
- logging.info('Run :'+cmd)
- status, output = commands.getstatusoutput(cmd)
- show_log (cmd +"with result:" + str(status))
- show_log (" output:"+output)
+ logging.info('Run :' + cmd)
+ status, output = commands.getstatusoutput(cmd)
+ show_log (cmd + "with result:" + str(status))
+ show_log (" output:" + output)
if status:
- logging.info('Failed :'+cmd)
+ logging.info('Failed :' + cmd)
if show:
- print('Failed :'+cmd)
- return status, output
-
-instantiate =[
+ print('Failed :' + cmd)
+
+ return status, output
+
+instantiate = [
#turn on module power
'echo 53 > /sys/class/gpio/export',
'echo out > /sys/class/gpio/gpio53/direction',
-'echo 1 >/sys/class/gpio/gpio53/value',
+'echo 1 > /sys/class/gpio/gpio53/value',
+#PSU1 present
+'echo 16 > /sys/class/gpio/export',
+'echo in > /sys/class/gpio/gpio16/direction',
+#PSU1 power good signal
+'echo 17 > /sys/class/gpio/export',
+'echo in > /sys/class/gpio/gpio17/direction',
+#PSU2 present
+'echo 19 > /sys/class/gpio/export',
+'echo in > /sys/class/gpio/gpio19/direction',
+#PSU2 power good signal
+'echo 20 > /sys/class/gpio/export',
+'echo in > /sys/class/gpio/gpio20/direction',
+#FAN 1-4 present
+'echo 36 > /sys/class/gpio/export',
+'echo in > /sys/class/gpio/gpio36/direction',
+'echo 37 > /sys/class/gpio/export',
+'echo in > /sys/class/gpio/gpio37/direction',
+'echo 38 > /sys/class/gpio/export',
+'echo in > /sys/class/gpio/gpio38/direction',
+'echo 39 > /sys/class/gpio/export',
+'echo in > /sys/class/gpio/gpio39/direction',
#turn on 100G led by default
'i2cset -y 0x13 0x38 0x00 0xff',
'i2cset -y 0x13 0x38 0x01 0xff',
@@ -124,77 +145,89 @@ drivers =[
'gpio-pca953x',
'qci_pmbus',
'leds-gpio',
+'optoe',
'qci_cpld_qsfp28',
'qci_platform_ix1b'
]
-
-
def system_install():
global FORCE
-
+
+ time.sleep(3)
#remove default drivers to avoid modprobe order conflicts
status, output = exec_cmd("rmmod i2c_ismt ", 1)
status, output = exec_cmd("rmmod i2c-i801 ", 1)
#setup driver dependency
status, output = exec_cmd("depmod -a ", 1)
+
#install drivers
- for i in range(0,len(drivers)):
- status, output = exec_cmd("modprobe "+drivers[i], 1)
+ for i in range(0, len(drivers)):
+ status, output = exec_cmd("modprobe " + drivers[i], 1)
+
if status:
- print output
- if FORCE == 0:
- return status
-
+ print output
+ if FORCE == 0:
+ return status
+
#instantiate devices
- for i in range(0,len(instantiate)):
- time.sleep(1)
- status, output = exec_cmd(instantiate[i], 1)
+ for i in range(0, len(instantiate)):
+ status, output = exec_cmd(instantiate[i], 1)
+
if status:
- print output
- if FORCE == 0:
- return status
-
- #for i in range(22,30):
- # status, output =exec_cmd("echo sff8436 0x50 > /sys/bus/i2c/devices/i2c-0/i2c-4/i2c-"+str(i)+"/new_device", 1)
- # if status:
- # print output
- # if FORCE == 0:
- # return status
-
- return
-
-
+ print output
+ if FORCE == 0:
+ return status
+
+ #Mount Quanta hardware monitor driver
+ status, output = exec_cmd("modprobe qci_hwmon_ix1b", 1)
+
+ #QSFP for 1~32 port
+ for port_number in range(1, 33):
+ bus_number = port_number + 31
+ os.system("echo %d >/sys/bus/i2c/devices/%d-0050/port_name" % (port_number, bus_number))
+
+ #Set system LED to green
+ status, output = exec_cmd("echo 1 > /sys/class/leds/sysled_green/brightness", 1)
+
+ return
+
def system_ready():
- if not device_found():
- return False
- return True
-
-def install():
if not device_found():
- print "No device, installing...."
- status = system_install()
+ return False
+
+ return True
+
+def install():
+ if not device_found():
+ print "No device, installing...."
+ status = system_install()
+
if status:
- if FORCE == 0:
- return status
+ if FORCE == 0:
+ return status
else:
- print " ix1b driver already installed...."
+ print " ix1b driver already installed...."
+
return
def uninstall():
global FORCE
+
#uninstall drivers
- for i in range(len(drivers)-1,-1,-1):
- status, output = exec_cmd("rmmod "+drivers[i], 1)
+ for i in range(len(drivers) - 1, -1, -1):
+ status, output = exec_cmd("rmmod " + drivers[i], 1)
+
if status:
- print output
- if FORCE == 0:
- return status
+ print output
+ if FORCE == 0:
+ return status
+
return
def device_found():
- ret1, log = exec_cmd("ls "+i2c_prefix+"i2c-0", 0)
- return ret1
+ ret1, log = exec_cmd("ls " + i2c_prefix + "i2c-0", 0)
+
+ return ret1
if __name__ == "__main__":
main()