spin_lock(&drvdata->spinlock);
        config->mode = val & ETMv4_MODE_ALL;
-       etm4_set_mode_exclude(drvdata,
-                             config->mode & ETM_MODE_EXCLUDE ? true : false);
 
        if (drvdata->instrp0 == true) {
                /* start by clearing instruction P0 field */
        unsigned long val1, val2;
        struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
        struct etmv4_config *config = &drvdata->config;
+       int elements, exclude;
 
-       if (sscanf(buf, "%lx %lx", &val1, &val2) != 2)
+       elements = sscanf(buf, "%lx %lx %x", &val1, &val2, &exclude);
+
+       /*  exclude is optional, but need at least two parameter */
+       if (elements < 2)
                return -EINVAL;
        /* lower address comparator cannot have a higher address value */
        if (val1 > val2)
        /*
         * Program include or exclude control bits for vinst or vdata
         * whenever we change addr comparators to ETM_ADDR_TYPE_RANGE
+        * use supplied value, or default to bit set in 'mode'
         */
-       etm4_set_mode_exclude(drvdata,
-                             config->mode & ETM_MODE_EXCLUDE ? true : false);
+       if (elements != 3)
+               exclude = config->mode & ETM_MODE_EXCLUDE;
+       etm4_set_mode_exclude(drvdata, exclude ? true : false);
 
        spin_unlock(&drvdata->spinlock);
        return size;