diff --git a/source/drivers/.meta/gpio/soc/gpio_am243x.syscfg.js b/source/drivers/.meta/gpio/soc/gpio_am243x.syscfg.js
index d189ddd..8412cea 100644
--- a/source/drivers/.meta/gpio/soc/gpio_am243x.syscfg.js
+++ b/source/drivers/.meta/gpio/soc/gpio_am243x.syscfg.js
@@ -19,14 +19,35 @@ function getMaxInterruptRouters(inst) {
 
 function getInstanceString(moduleInstance) {
     let interfaceName = getInterfaceName(moduleInstance);
-    let solution = moduleInstance[interfaceName].$solution
+    let peripheralName = interfaceName;
 
-    return solution.peripheralName;
+    if( interfaceName == "GPIO")
+        peripheralName = "GPIO_n"
+
+    let solution = moduleInstance[peripheralName].$solution
+
+    if ( peripheralName == "GPIO_n" ){
+        let splitStrings = (solution.peripheralPinName === null ) ? "": solution.peripheralPinName.split("_");
+        let gpioBank = splitStrings[0];
+        return gpioBank
+    }
+    else {
+        return solution.peripheralName;
+    }
+
+    // return gpioBank
+
+    //return solution.peripheralName;
 }
 
 function getPinIndex(moduleInstance) {
     let interfaceName = getInterfaceName(moduleInstance);
-    let peripheralPinName = moduleInstance[interfaceName].gpioPin.$solution.peripheralPinName;
+    let peripheralPinName;
+
+    if( interfaceName == "GPIO")
+        peripheralPinName = moduleInstance["GPIO_n"].$solution.peripheralPinName;
+    else
+        peripheralPinName = moduleInstance[interfaceName].gpioPin.$solution.peripheralPinName;
 
     if(! peripheralPinName)
         return "INVALID";
@@ -69,4 +90,4 @@ exports = {
     getMaxInterruptRouters,
     getCpuRouterId,
     getTisciDestCoreID,
-};
+};
\ No newline at end of file
diff --git a/source/drivers/.meta/gpio/templates/gpio.h.xdt b/source/drivers/.meta/gpio/templates/gpio.h.xdt
index f40d7f3..6bcfb1a 100644
--- a/source/drivers/.meta/gpio/templates/gpio.h.xdt
+++ b/source/drivers/.meta/gpio/templates/gpio.h.xdt
@@ -11,12 +11,16 @@
 % for(let i = 0; i < module.$instances.length; i++) {
     % let instance = module.$instances[i];
     % let config = module.getInstanceConfig(instance);
+% if (!config.baseAddr.includes("undefined")){
 #define `instance.$name.toUpperCase()`_BASE_ADDR (`config.baseAddr`)
+%}
+% if (!config.pinIndex.includes("INVALID")){
 #define `instance.$name.toUpperCase()`_PIN (`config.pinIndex`)
+%}
 #define `instance.$name.toUpperCase()`_DIR (GPIO_DIRECTION_`config.pinDir`)
 #define `instance.$name.toUpperCase()`_TRIG_TYPE (GPIO_TRIG_TYPE_`config.trigType`)
 % if(config.enableIntr){
 #define `instance.$name.toUpperCase()`_INTR_NUM     (CSLR_`config.coreId`_INTR_MAIN_GPIOMUX_INTROUTER0_OUTP_`config.intrOut`)
 % }
 % }
-#define CONFIG_GPIO_NUM_INSTANCES (`module.$instances.length`U)
+#define CONFIG_GPIO_NUM_INSTANCES (`module.$instances.length`U)
\ No newline at end of file
diff --git a/source/drivers/.meta/gpio/templates/gpio_config.c.xdt b/source/drivers/.meta/gpio/templates/gpio_config.c.xdt
index e152659..1af0190 100644
--- a/source/drivers/.meta/gpio/templates/gpio_config.c.xdt
+++ b/source/drivers/.meta/gpio/templates/gpio_config.c.xdt
@@ -11,22 +11,31 @@
 
 void GPIO_init()
 {
-    uint32_t    baseAddr;
-% for(let i = 0; i < module.$instances.length; i++) {
+     % for(let i = 0; i < module.$instances.length; i++) {
     % let instance = module.$instances[i];
     % let config = module.getInstanceConfig(instance);
+    % if(!config.pinIndex.includes("INVALID")){
+    uint32_t    baseAddr;
+    % break;
+    % }
+    % }
 
+%   for(let i = 0; i < module.$instances.length; i++) {
+    % let instance = module.$instances[i];
+    % let config = module.getInstanceConfig(instance);
+    % if (!config.baseAddr.includes("undefined") && !config.pinIndex.includes("INVALID")){
     /* Instance `i` */
     /* Get address after translation translate */
     baseAddr = (uint32_t) AddrTranslateP_getLocalAddr(`instance.$name.toUpperCase()`_BASE_ADDR);
     GPIO_setDirMode(baseAddr, `instance.$name.toUpperCase()`_PIN, `instance.$name.toUpperCase()`_DIR);
-    % if(config.trigType != "NONE"){
+        % if(config.trigType != "NONE"){
     GPIO_setTrigType(baseAddr, `instance.$name.toUpperCase()`_PIN, `instance.$name.toUpperCase()`_TRIG_TYPE);
-    % }
-    % if(config.enableIntr){
+        % }
+        % if(config.enableIntr){
     GPIO_bankIntrEnable(baseAddr, GPIO_GET_BANK_INDEX(`instance.$name.toUpperCase()`_PIN));
+        % }
     % }
-% }
+  %}
 }
 
 %for(let i = 0; i < module.$instances.length; i++) {
@@ -91,8 +100,12 @@ static void Sciclient_gpioIrqSet(void)
     rmIrqReq.valid_params          |= TISCI_MSG_VALUE_RM_DST_ID_VALID;
     rmIrqReq.valid_params          |= TISCI_MSG_VALUE_RM_DST_HOST_IRQ_VALID;
     rmIrqReq.global_event           = 0U;
+    % if (config.moduleIndex !== undefined){
     rmIrqReq.src_id                 = TISCI_DEV_`config.moduleIndex`;
+    % if ( config.pinIndex !== "INVALID" ){
     rmIrqReq.src_index              = TISCI_BANK_SRC_IDX_BASE_`config.moduleIndex` + GPIO_GET_BANK_INDEX(`config.pinIndex`);
+    %}
+    %}
     rmIrqReq.dst_id                 = TISCI_DEV_`config.coreId`;
     rmIrqReq.dst_host_irq           = CSLR_`config.routerId`_GPIOMUX_INTROUTER0_OUTP_`config.intrOut`;
     rmIrqReq.ia_id                  = 0U;
@@ -123,8 +136,12 @@ static void Sciclient_gpioIrqRelease(void)
     rmIrqReq.valid_params          |= TISCI_MSG_VALUE_RM_DST_ID_VALID;
     rmIrqReq.valid_params          |= TISCI_MSG_VALUE_RM_DST_HOST_IRQ_VALID;
     rmIrqReq.global_event           = 0U;
+     % if (config.moduleIndex !== undefined){
     rmIrqReq.src_id                 = TISCI_DEV_`config.moduleIndex`;
+    % if ( config.pinIndex !== "INVALID" ){
     rmIrqReq.src_index              = TISCI_BANK_SRC_IDX_BASE_`config.moduleIndex` + GPIO_GET_BANK_INDEX(`config.pinIndex`);
+    %}
+    %}
     rmIrqReq.dst_id                 = TISCI_DEV_`config.coreId`;
     rmIrqReq.dst_host_irq           = CSLR_`config.routerId`_GPIOMUX_INTROUTER0_OUTP_`config.intrOut`;
     rmIrqReq.ia_id                  = 0U;
@@ -152,7 +169,7 @@ void GPIO_deinit()
     % for(let i = 0; i < module.$instances.length; i++) {
     % let instance = module.$instances[i];
     % let config = module.getInstanceConfig(instance);
-    % if(config.enableIntr){
+    % if(config.enableIntr && !config.pinIndex.includes("INVALID")){
     uint32_t    baseAddr;
     % break;
     % }
@@ -161,6 +178,7 @@ void GPIO_deinit()
     % for(let i = 0; i < module.$instances.length; i++) {
     % let instance = module.$instances[i];
     % let config = module.getInstanceConfig(instance);
+    % if (!config.baseAddr.includes("undefined") && !config.pinIndex.includes("INVALID")){
     % if(config.enableIntr){
     /* Unregister interrupt Instance `i`*/
     baseAddr = (uint32_t) AddrTranslateP_getLocalAddr(`instance.$name.toUpperCase()`_BASE_ADDR);
@@ -168,5 +186,6 @@ void GPIO_deinit()
     GPIO_setTrigType(baseAddr, `instance.$name.toUpperCase()`_PIN, GPIO_TRIG_TYPE_NONE);
     GPIO_clearIntrStatus(baseAddr, `instance.$name.toUpperCase()`_PIN);
     % }
+    %}
     % }
-}
+}
\ No newline at end of file
diff --git a/source/drivers/.meta/gpio/templates/gpio_open_close_config_v1.c.xdt b/source/drivers/.meta/gpio/templates/gpio_open_close_config_v1.c.xdt
new file mode 100644
index 0000000..76a1fc7
--- /dev/null
+++ b/source/drivers/.meta/gpio/templates/gpio_open_close_config_v1.c.xdt
@@ -0,0 +1,35 @@
+%%{
+    let module = system.modules['/drivers/gpio/gpio'];
+%%}
+
+/*
+ * GPIO
+ */
+#include <drivers/gpio.h>
+#include <drivers/soc.h>
+
+
+void Drivers_gpioOpen(void)
+{
+    % for(let i = 0; i < module.$instances.length; i++) {
+    % let instance = module.$instances[i];
+    % let config = module.getInstanceConfig(instance);
+    % if(!config.pinIndex.includes("INVALID")){
+    uint32_t    baseAddr;
+    %}
+    %}
+    % for(let i = 0; i < module.$instances.length; i++) {
+    % let instance = module.$instances[i];
+    % let config = module.getInstanceConfig(instance);
+
+    /* Instance `i` */
+    /* Get address after translation translate */
+    % if (!config.pinIndex.includes("INVALID")){
+    baseAddr = (uint32_t) AddrTranslateP_getLocalAddr(`instance.$name.toUpperCase()`_BASE_ADDR);
+    GPIO_setDirMode(baseAddr, `instance.$name.toUpperCase()`_PIN, `instance.$name.toUpperCase()`_DIR);
+    % if(config.trigType != "NONE"){
+    GPIO_setTrigType(baseAddr, `instance.$name.toUpperCase()`_PIN, `instance.$name.toUpperCase()`_TRIG_TYPE);
+    % }
+    %}
+% }
+}
\ No newline at end of file
diff --git a/source/drivers/.meta/gpio/templates/gpio_v1.h.xdt b/source/drivers/.meta/gpio/templates/gpio_v1.h.xdt
index 918ca96..9c61782 100644
--- a/source/drivers/.meta/gpio/templates/gpio_v1.h.xdt
+++ b/source/drivers/.meta/gpio/templates/gpio_v1.h.xdt
@@ -18,7 +18,9 @@
     %   pinIndex = config.pinIndex - 32;
     % }
 #define `instance.$name.toUpperCase()`_BASE_ADDR (`config.baseAddr`)
+% if (!config.pinIndex.includes("INVALID")){
 #define `instance.$name.toUpperCase()`_PIN (`pinIndex`U)
+%}
 #define `instance.$name.toUpperCase()`_DIR (GPIO_DIRECTION_`config.pinDir`)
 #define `instance.$name.toUpperCase()`_TRIG_TYPE (GPIO_TRIG_TYPE_`config.trigType`)
 #define `instance.$name.toUpperCase()`_OPEN_DRAIN (GPIO_OPEN_DRAIN_`config.openDrain`)
@@ -26,4 +28,4 @@
 #define `instance.$name.toUpperCase()`_INTR_HIGH (`config.intrNumHigh`)
 #define `instance.$name.toUpperCase()`_INTR_LOW (`config.intrNumLow`)
 % }
-#define CONFIG_GPIO_NUM_INSTANCES (`module.$instances.length`U)
+#define CONFIG_GPIO_NUM_INSTANCES (`module.$instances.length`U)
\ No newline at end of file
diff --git a/source/drivers/.meta/gpio/v0/gpio_grand_child.syscfg.js b/source/drivers/.meta/gpio/v0/gpio_grand_child.syscfg.js
new file mode 100644
index 0000000..6dcee79
--- /dev/null
+++ b/source/drivers/.meta/gpio/v0/gpio_grand_child.syscfg.js
@@ -0,0 +1,74 @@
+let common = system.getScript("/common");
+let soc = system.getScript(`/drivers/gpio/soc/gpio_${common.getSocName()}`);
+
+function migrate(inst){
+
+    let props = [
+        "$assign", "$suggestSolution", "$assignAllowConflicts", "pu_pd", "slewRate", "inv", "qualSel", "rx"
+    ]
+
+    _.each(props, ele => {
+            if( inst[ele] !== undefined){
+            if (inst.$ownedBy.$module.name === "GPIO"){
+
+                if([ "$assign", "$suggestSolution", "$assignAllowConflicts"].includes(ele) && inst[ele] !== ""){
+                    inst.$ownedBy.$ownedBy.GPIO_n[ele] = inst[ele]
+                }
+                else {
+                    if (ele == "rx" || ele == "inv")
+                        inst.$ownedBy.$ownedBy[ele] = (inst[ele] == true)
+                    else if(inst[ele] !== "")
+                        inst.$ownedBy.$ownedBy[ele] = inst[ele]
+                }
+            }
+        }
+    })
+}
+
+exports = {
+    name: "gpioPin",
+    displayName: "GPIO GRAND CHILD",
+    config:[
+        {
+            name: "$assign",
+            deprecated: true,
+            default: "",
+        },
+        {
+            name: "$suggestSolution",
+            deprecated: true,
+            default: "",
+        },
+        {
+            name: "$assignWithConflicts",
+            deprecated: true,
+            default: "",
+        },
+        {
+            name: "pu_pd",
+            deprecated: true,
+            default: "",
+        },
+        {
+            name: "slewRate",
+            deprecated: true,
+            default: "",
+        },
+        {
+            name: "inv",
+            deprecated: true,
+            default: false,
+        },
+        {
+            name: "qualSel",
+            deprecated: true,
+            default: "",
+        },
+        {
+            name: "rx",
+            deprecated: true,
+            default: true,
+        },
+    ],
+    migrateLegacyConfiguration: migrate,
+}
\ No newline at end of file
diff --git a/source/drivers/.meta/gpio/v0/gpio_v0.syscfg.js b/source/drivers/.meta/gpio/v0/gpio_v0.syscfg.js
index 6958c0e..50b35bc 100644
--- a/source/drivers/.meta/gpio/v0/gpio_v0.syscfg.js
+++ b/source/drivers/.meta/gpio/v0/gpio_v0.syscfg.js
@@ -27,23 +27,132 @@ function getInstanceConfig(moduleInstance) {
     };
 };
 
+let gConfig = [
+    {
+        name: "pu_pd",
+        displayName: "Pull Up/Down",
+        default: "nopull",
+        "readOnly": false,
+        "hidden": false,
+        // "type": "DropDown",
+        "options": [
+            {
+                "name": "pu",
+                "displayName": "Pull Up",
+                // "value": "N/A"
+            },
+            {
+                "name": "pd",
+                "displayName": "Pull Down",
+                // "value": "N/A"
+            },
+            {
+                "name": "nopull",
+                "displayName": "No Pull",
+                // "value": "N/A"
+            },
+        ],
+        // "legacy": true
+    },
+    {
+        // "type": "DropDown",
+        "name": "slewRate",
+        "readOnly": false,
+        "hidden": common.getSocName().includes("am243x"),
+        "displayName": "Slew Rate",
+        "options": [
+            {
+                "name": "high",
+                "displayName": "High",
+                // "value": "N/A"
+            },
+            {
+                "name": "low",
+                "displayName": "Low",
+                // "value": "N/A"
+            },
+        ],
+        "default": "low",
+        // "legacy": true
+    },
+    {
+        // "type": "CheckBox",
+        "name": "inv",
+        "readOnly": false,
+        "hidden": common.getSocName().includes("am243x"),
+        "displayName": "Invert",
+        "default": false,
+        // "legacy": true
+    },
+    {
+        // "type": "DropDown",
+        "name": "qualSel",
+        "readOnly": false,
+        "hidden": common.getSocName().includes("am243x"),
+        "displayName": "Qual Sel",
+        "options": [
+            {
+                "name": "sync",
+                "displayName": "Sync",
+                // "value": "N/A"
+            },
+            {
+                "name": "3sample",
+                "displayName": "3 Sample",
+                // "value": "N/A"
+            },
+            {
+                "name": "6sample",
+                "displayName": "6 Sample",
+                // "value": "N/A"
+            },
+            {
+                "name": "async",
+                "displayName": "Async",
+                // "value": "N/A"
+            }
+        ],
+        "default": "sync",
+        // "legacy": true
+    },
+    {
+        // "type": "CheckBox",
+        "name": "rx",
+        "readOnly": false,
+        "hidden": common.getSocName().includes("am26"),
+        "displayName": "RX",
+        "default": false,
+        // "legacy": true
+    }
+]
 function getInterfaceName(inst) {
     return soc.getInterfaceName(inst);
 }
 
 function pinmuxRequirements(inst) {
     let interfaceName = getInterfaceName(inst);
+    let peripheralName = interfaceName;
+    let peripheral;
 
-    let resources = [];
-    resources.push(pinmux.getGpioPinRequirements(interfaceName, "0"));
-
-    let peripheral = {
-        name: interfaceName,
-        displayName: "GPIO Peripheral",
-        interfaceName: interfaceName,
-        resources: resources,
-        canShareWith: "/drivers/gpio/gpio",
-    };
+    if( interfaceName == "GPIO"){
+        peripheralName = peripheralName + "_n"
+        peripheral = {
+            name: peripheralName,
+            displayName: "GPIO Peripheral",
+            interfaceName: interfaceName,
+        };
+    }
+    else{
+        let resources = [];
+        resources.push(pinmux.getGpioPinRequirements(interfaceName, "0"));
+        peripheral = {
+            name: peripheralName,
+            displayName: "GPIO Peripheral",
+            interfaceName: interfaceName,
+            resources: resources,
+            canShareWith: "/drivers/gpio/gpio",
+        };
+    }
 
     return [peripheral];
 }
@@ -114,6 +223,25 @@ function getConfigurables() {
         },
         ],
         description: "GPIO PIN direction",
+        onChange: function(inst, ui) {
+            if(inst.pinDir == "OUTPUT"){
+                ui.defaultValue.hidden = false;
+            }
+            else {
+                ui.defaultValue.hidden = true;
+            }
+        }
+    },
+    {
+        name: "defaultValue",
+        displayName: "Default Value",
+        default: "0",
+        options: [
+            { name: "0" },
+            { name: "1" },
+        ],
+        description: "Default value of GPIO OUT register",
+        hidden: true,
     }, {
         name: "trigType",
         displayName: "Trigger Type",
@@ -153,6 +281,7 @@ function getConfigurables() {
             }
         },
     },
+    ...gConfig
     )
     if (common.isSciClientSupported()) {
         config.push(
@@ -215,6 +344,27 @@ function getConfigurables() {
     return config;
 }
 
+
+function addModuleInstances(inst) {
+    let modInstances = new Array();
+
+    modInstances.push({
+        name: "GPIO",
+        displayName: "MAIN GPIO CHILD",
+        moduleName: "/drivers/gpio/v0/main_gpio_child",
+        requiredArgs: {$name: inst.$name + "_main_child"}
+    })
+
+    // modInstances.push({
+    //     name: "MCU_GPIO",
+    //     displayName: "MCU GPIO CHILD",
+    //     moduleName: "/drivers/gpio/v0/mcu_gpio_child",
+    //     requiredArgs: {$name: inst.$name + "_mcu_child"}
+    // })
+
+    return modInstances;
+}
+
 let gpio_module_name = "/drivers/gpio/gpio";
 
 let gpio_module = {
@@ -243,10 +393,18 @@ let gpio_module = {
             moduleName: "/system_common",
         }]
     },
+    moduleInstances: addModuleInstances,
     getInstanceConfig,
     pinmuxRequirements,
     getInterfaceName,
     getPeripheralPinNames,
+    onMigrate,
 };
 
+function onMigrate(newInst, oldInst, oldSystem) {
+    let pins = getPeripheralPinNames(oldInst)
+    let interfaceName = getInterfaceName(oldInst)
+    common.onMigrate(newInst, oldInst, oldSystem, pins, interfaceName)
+}
+
 exports = gpio_module;
\ No newline at end of file
diff --git a/source/drivers/.meta/gpio/v0/main_gpio_child.syscfg.js b/source/drivers/.meta/gpio/v0/main_gpio_child.syscfg.js
new file mode 100644
index 0000000..c026b2f
--- /dev/null
+++ b/source/drivers/.meta/gpio/v0/main_gpio_child.syscfg.js
@@ -0,0 +1,39 @@
+let common = system.getScript("/common");
+let soc = system.getScript(`/drivers/gpio/soc/gpio_${common.getSocName()}`);
+let pinmux = system.getScript(`/drivers/pinmux/pinmux_${common.getSocName()}`);
+
+function addModuleInstances(inst) {
+    let modInstances = new Array();
+
+    modInstances.push({
+        name: "gpioPin",
+        displayName: "GPIO GRANDCHILD",
+        moduleName: "/drivers/gpio/v0/gpio_grand_child",
+        requiredArgs: {$name: inst.$name + "_grandchild"}
+    })
+
+    return modInstances;
+}
+
+exports = {
+    name: "GPIO",
+    displayName: "GPIO CHILD",
+    config:[
+        {
+            name: "$assign",
+            deprecated: true,
+            default: "",
+        },
+        {
+            name: "$suggestSolution",
+            deprecated: true,
+            default: "",
+        },
+        {
+            name: "$assignWithConflicts",
+            deprecated: true,
+            default: "",
+        },
+    ],
+    moduleInstances: addModuleInstances,
+}
\ No newline at end of file
diff --git a/source/drivers/.meta/gpio/v0_1/gpio_v0_1.syscfg.js b/source/drivers/.meta/gpio/v0_1/gpio_v0_1.syscfg.js
new file mode 100644
index 0000000..66ce4f6
--- /dev/null
+++ b/source/drivers/.meta/gpio/v0_1/gpio_v0_1.syscfg.js
@@ -0,0 +1,252 @@
+let common = system.getScript("/common");
+let pinmux = system.getScript("/drivers/pinmux/pinmux");
+let soc = system.getScript(`/drivers/gpio/soc/gpio_${common.getSocName()}`);
+let boardConfig = system.getScript(`/drivers/gpio/soc/k3BoardConfig.json`);
+
+let errorFlag = 0;
+let errorLog = '';
+
+function getInstanceConfig(moduleInstance) {
+    let coreId = undefined;
+    let routerId = undefined;
+    if (common.isMcuDomainSupported()) {
+        coreId = soc.getTisciDestCoreID();
+        routerId = soc.getCpuRouterId();
+    }
+    let additionalConfig = {
+        baseAddr: `CSL_${soc.getInstanceString(moduleInstance)}_BASE`,
+        moduleIndex: soc.getInstanceString(moduleInstance),
+        pinIndex: soc.getPinIndex(moduleInstance),
+    }
+
+    return {
+        ...moduleInstance,
+        ...additionalConfig,
+        coreId,
+        routerId,
+    };
+};
+
+function getInterfaceName(inst) {
+    return soc.getInterfaceName(inst);
+}
+
+function pinmuxRequirements(inst) {
+    let interfaceName = getInterfaceName(inst);
+
+    let resources = [];
+    resources.push(pinmux.getGpioPinRequirements(interfaceName, "0"));
+
+    let peripheral = {
+        name: interfaceName,
+        displayName: "GPIO Peripheral",
+        interfaceName: interfaceName,
+        resources: resources,
+        canShareWith: "/drivers/gpio/gpio",
+    };
+
+    return [peripheral];
+}
+
+function getPeripheralPinNames(inst) {
+    return ["gpioPin"];
+}
+
+function validate(inst, report) {
+        validateInterruptRouter(inst, report, "intrOut");
+}
+
+
+//Function to validate if same interrupt router is selected for other instances
+function validateInterruptRouter(instance, report, fieldname) {
+    /* Verified by SYSCFG based on selected pin */
+    if (instance.enableIntr && common.isSciClientSupported()) {
+        common.validate.checkNumberRange(instance, report, fieldname, 0, soc.getMaxInterruptRouters(), "dec");
+        if(errorFlag == 1) {
+            report.logWarning(errorLog, instance, fieldname);
+        }
+        let moduleInstances = instance.$module.$instances;
+        let validOptions = instance.$module.$configByName.intrOut.options(instance);
+        let selectedOptions = instance.intrOut;
+        let found = _.find(validOptions, (o) => o.name === selectedOptions)
+        if (found === undefined || found === null) {
+            report.logError("Selected option is invalid, please reselect.", instance, fieldname);
+        }
+        for (let i = 0; i < moduleInstances.length; i++) {
+            if (instance[fieldname] === moduleInstances[i][fieldname] && instance !== moduleInstances[i]
+                && instance.enableIntr === true && moduleInstances[i].enableIntr === true) {
+                report.logError("Same Interrupt Router lines cannot be selected", instance, fieldname);
+                return
+            }
+        }
+    }
+}
+
+let routerDescription =
+`The interrupt router input to the Core are shared for different resources.
+ Although many output pins were available for the GPIO MUX interrupt router,
+ only resource pin that are allocated in board configuration is available for use`;
+let buttonDescription =
+`If you manually changed the resource management (RM) data in
+source/drivers/sciclient/sciclient_default_boardcfg/am64x_am243x/sciclient_defaultBoardcfg_rm.c,
+click this button to reflect it in SysConfig`;
+
+//function to get router pin data from boardConfig
+function getRouterPins() {
+    let socName = common.getSocName();
+    let core = common.getSelfSysCfgCoreName();
+    return boardConfig[socName][core]["outPinCfg"];
+}
+
+function getConfigurables() {
+    let config = [];
+    config.push({
+        name: "pinDir",
+        displayName: "PIN Direction",
+        default: "INPUT",
+        options: [{
+            name: "INPUT",
+            displayName: "Input"
+        },
+        {
+            name: "OUTPUT",
+            displayName: "Output"
+        },
+        ],
+        description: "GPIO PIN direction",
+    }, {
+        name: "trigType",
+        displayName: "Trigger Type",
+        default: "NONE",
+        options: [{
+            name: "NONE",
+            displayName: "None",
+        },
+        {
+            name: "RISE_EDGE",
+            displayName: "Rising Edge",
+        },
+        {
+            name: "FALL_EDGE",
+            displayName: "Falling Edge",
+        },
+        {
+            name: "BOTH_EDGE",
+            displayName: "Rising and Falling",
+        },
+        ],
+        description: "GPIO PIN Trigger Type",
+    },
+    {
+        name: "enableIntr",
+        displayName: "Enable Interrupt Configuration",
+        default: false,
+        onChange: function (inst, ui) {
+            if (common.isSciClientSupported())
+            {
+                let hideConfigs = true;
+                if (inst.enableIntr == true) {
+                    hideConfigs = false;
+                }
+                ui.intrOut.hidden = hideConfigs;
+                ui.getBoardCfg.hidden = hideConfigs;
+            }
+        },
+    },
+    )
+    if (common.isSciClientSupported()) {
+        config.push(
+            {
+                name: "getBoardCfg",
+                displayName: "Fetch Board Configuration",
+                description: 'Click this button to fetch GPIO RM data automatically',
+                longDescription: buttonDescription,
+                buttonText: "GET RM DATA",
+                hidden: true,
+                onLaunch: (inst) => {
+                    let nodeCmd = common.getNodePath()
+                    let products = system.getProducts()
+                    let sdkPath = products[0].path.split("/.metadata/product.json")[0]
+                    let filePath = sdkPath + "/source/drivers/.meta/gpio/soc/getBoardConfigRm.js"
+                    let socName = common.getSocName();
+                    if (system.getOS() == "win") {
+                        sdkPath = products[0].path.split("\\.metadata\\product.json")[0]
+                        filePath = sdkPath + "//source//drivers//.meta//gpio//soc//getBoardConfigRm.js"
+                    }
+                    return {
+                        command: nodeCmd,
+                        args: [filePath, "$comFile", socName],
+                        initialData: "initialData",
+                        inSystemPath: true,
+                    };
+                },
+                onComplete: (inst, _ui, result) => {
+                    if (result.data === "error") {
+                        return;
+                    } else if (result.data === "initialData") {
+                        return;
+                    } else {
+                        try {
+                            errorFlag = 0;
+                            boardConfig = JSON.parse(result.data);
+                        } catch (e) {
+                            errorFlag = 1;
+                            errorLog = result.data;
+                            return;
+                        }
+                        return;
+                    }
+                },
+            },
+            {
+                name: "intrOut",
+                displayName: "Interrupt Router Output",
+                description: 'GPIO-MUX interrupt Router Output to the destination Core',
+                longDescription: routerDescription,
+                hidden: true,
+                default: getRouterPins()[0].name,
+                options: getRouterPins,
+            },
+        )
+    }
+    if (common.isMcuDomainSupported()) {
+        config.push(common.getUseMcuDomainPeripheralsConfig());
+    }
+    return config;
+}
+
+let gpio_module_name = "/drivers/gpio/gpio";
+
+let gpio_module = {
+    displayName: "GPIO",
+    templates: {
+        "/drivers/system/system_config.h.xdt": {
+            driver_config: "/drivers/gpio/templates/gpio.h.xdt",
+            moduleName: gpio_module_name,
+        },
+        "/drivers/system/system_config.c.xdt": {
+            driver_config: "/drivers/gpio/templates/gpio_config.c.xdt",
+            driver_init: "/drivers/gpio/templates/gpio_init.c.xdt",
+            driver_deinit: "/drivers/gpio/templates/gpio_deinit.c.xdt",
+            moduleName: gpio_module_name,
+        },
+        "/drivers/pinmux/pinmux_config.c.xdt": {
+            moduleName: gpio_module_name,
+        },
+    },
+    defaultInstanceName: "CONFIG_GPIO",
+    config: getConfigurables(),
+    validate: validate,
+    modules: function (inst) {
+        return [{
+            name: "system_common",
+            moduleName: "/system_common",
+        }]
+    },
+    getInstanceConfig,
+    pinmuxRequirements,
+    getInterfaceName,
+    getPeripheralPinNames,
+};
+
+exports = gpio_module;
\ No newline at end of file
diff --git a/source/drivers/.meta/pinmux/pinmux.syscfg.js b/source/drivers/.meta/pinmux/pinmux.syscfg.js
index faaad24..7b6e517 100644
--- a/source/drivers/.meta/pinmux/pinmux.syscfg.js
+++ b/source/drivers/.meta/pinmux/pinmux.syscfg.js
@@ -5,7 +5,6 @@ let soc = system.getScript(`/drivers/pinmux/pinmux_${common.getSocName()}`);
 function getPinRequirements(interfaceName, pinName, pinDisplayName)
 {
     let pinConfig = soc.getPinConfigurables(interfaceName, pinName);
-
     let pin = {
         name           : pinName,
         displayName    : (pinDisplayName ? pinDisplayName : pinName),
@@ -70,8 +69,14 @@ function getPinConfigurables(interfaceName, pinName)
 function getGpioPinRequirements(interfaceName, pinName)
 {
     let pinConfig = soc.getPinConfigurables(interfaceName, pinName);
+    let interfacePins;
 
-    let interfacePins = Object.keys(system.deviceData.interfaces[interfaceName].interfacePins);
+    if (interfaceName == "GPIO" && !(common.getSocName() == "am64x" || common.getSocName() == "am273x")){
+        interfacePins = Object.keys(system.deviceData.interfaces[interfaceName].interfacePins[interfaceName].pinMappings);
+    }
+    else {
+        interfacePins = Object.keys(system.deviceData.interfaces[interfaceName].interfacePins);
+    }
 
     let pin = {
 		name           : "gpioPin",
@@ -82,6 +87,21 @@ function getGpioPinRequirements(interfaceName, pinName)
     return pin;
 }
 
+function getXbarPinRequirements(interfaceName, pinName)
+{
+    let pinConfig = soc.getPinConfigurables(interfaceName, pinName);
+
+    let interfacePins = Object.keys(system.deviceData.interfaces[interfaceName].interfacePins);
+
+    let pin = {
+		name           : "XBAROUT",
+		displayName    : "XBAR",
+        interfaceNames : interfacePins,
+        config         : pinConfig,
+    };
+    return pin;
+}
+
 exports = {
     getPinRequirements,
     getGpioPinRequirements,
@@ -89,4 +109,5 @@ exports = {
     getInterfacePinList,
     setConfigurableDefault,
     setPeripheralPinConfigurableDefault,
-};
+    getXbarPinRequirements,
+};
\ No newline at end of file
diff --git a/source/drivers/.meta/pinmux/pinmux_am243x.syscfg.js b/source/drivers/.meta/pinmux/pinmux_am243x.syscfg.js
index 68ca6e0..9d8bc25 100644
--- a/source/drivers/.meta/pinmux/pinmux_am243x.syscfg.js
+++ b/source/drivers/.meta/pinmux/pinmux_am243x.syscfg.js
@@ -24,8 +24,15 @@ function getPinModeOverRide(peripheralPin, muxSetting)
 
 function getPinConfigurables(interfaceName, pinName)
 {
-    let pinConfig = _.cloneDeep(
-        system.deviceData.interfaces[interfaceName].interfacePins[pinName].configurables
+    let pinConfig
+
+    if (interfaceName == "GPIO")
+        pinConfig = _.cloneDeep(
+            system.deviceData.interfaces[interfaceName].interfacePins[interfaceName].configurables
+    );
+    else
+        pinConfig = _.cloneDeep(
+            system.deviceData.interfaces[interfaceName].interfacePins[pinName].configurables
     );
     return pinConfig;
 }
@@ -33,11 +40,14 @@ function getPinConfigurables(interfaceName, pinName)
 function getPinMode(peripheralPin)
 {
     let devicePin = system.deviceData.devicePins[peripheralPin.$solution.packagePinName];
+
+    if (devicePin === undefined) return null
+
     let muxSetting = _.find(devicePin.mux.muxSetting,
-                                function(muxSetting) {
-                                    return (muxSetting.peripheralPin.name == peripheralPin.$solution.peripheralPinName);
-                                }
-                            );
+                            function(muxSetting) {
+                                return (muxSetting.peripheralPin.name == peripheralPin.$solution.peripheralPinName);
+                            }
+                        );
 
     let muxMode = muxSetting.mode;
 
@@ -49,17 +59,22 @@ function getPinMode(peripheralPin)
     return muxMode;
 }
 
-function getPinConfigCStruct(pin, interfaceName)
+function getPinConfigCStruct(pin, interfaceName, inst)
 {
     let pu_pd = undefined;
 
-    if(pin.pu_pd != undefined)
-       pu_pd = pin.pu_pd;
-    if(pin.pull != undefined)
-       pu_pd = pin.pull;
+    let obj;
+    if( interfaceName == "GPIO_n") obj = inst;
+    else obj = pin;
+
+    if(obj.pu_pd != undefined)
+       pu_pd = obj.pu_pd;
+    if(obj.pull != undefined)
+       pu_pd = obj.pull;
 
-    let rx = pin.rx;
+    let rx = obj.rx;
     let mode = getPinMode(pin);
+    if (mode === null) return ""
     let settings = "( ";
 
     /* if no values provided for pu_pd and rx, then use defaults as defined in deviceData */
@@ -108,4 +123,4 @@ exports = {
     getPinModeOverRide,
     getPinConfigurables,
     getPinConfigCStruct,
-};
+};
\ No newline at end of file
diff --git a/source/drivers/.meta/pinmux/pinmux_module_config.c.xdt b/source/drivers/.meta/pinmux/pinmux_module_config.c.xdt
index d778646..d1dd29d 100644
--- a/source/drivers/.meta/pinmux/pinmux_module_config.c.xdt
+++ b/source/drivers/.meta/pinmux/pinmux_module_config.c.xdt
@@ -18,8 +18,14 @@
                 doGenerateCode = true;
         %%}
         % if(doGenerateCode) {
+            % if (interfaceName == "GPIO" && !(common.getSocName() == "am64x" || common.getSocName() == "am273x")){
+            %    interfaceName = interfaceName + "_n"
+            %}
             % let peripheral = (module.defaultInstanceName === "CONFIG_ENET_CPSW") ? (instance.pinmux[0])[interfaceName] :instance[interfaceName];
-            % let pinNames = module.getPeripheralPinNames(instance);
+            % let pinNames = (module.getPeripheralPinNames) ? module.getPeripheralPinNames(instance) : "";
+            % if (interfaceName == "GPIO_n" && !(common.getSocName() == "am64x" || common.getSocName() == "am273x")){
+        `soc.getPinConfigCStruct(peripheral, interfaceName, instance)`
+            % } else {
             % for (let pinName of pinNames) {
                 % let peripheralPin = peripheral[pinName];
                 % if (peripheralPin && peripheralPin.$solution.peripheralPinName) {
@@ -27,6 +33,7 @@
     `soc.getPinConfigCStruct(peripheralPin, interfaceName)`
                 % }
             % }
+            %}
         % }
     % }
     % if (module.getInterfaceNameList) {
@@ -79,4 +86,4 @@
             % }
         % }
     % }
-% }
+% }
\ No newline at end of file
