diff --git a/rmi4update/main.cpp b/rmi4update/main.cpp
index 41289d8..2ca6efc 100644
--- a/rmi4update/main.cpp
+++ b/rmi4update/main.cpp
@@ -19,23 +19,41 @@
 #include <string.h>
 #include <errno.h>
 #include <getopt.h>
+#include <sys/types.h>
+#include <dirent.h>
 
 #include "hiddevice.h"
 #include "rmi4update.h"
 
-#define RMI4UPDATE_GETOPTS	"hf"
+#define RMI4UPDATE_GETOPTS	"hfd:"
 
 void printHelp(const char *prog_name)
 {
-	fprintf(stdout, "Usage: %s [OPTIONS] DEVICEFILE FIRMWAREFILE\n", prog_name);
+	fprintf(stdout, "Usage: %s [OPTIONS] FIRMWAREFILE\n", prog_name);
 	fprintf(stdout, "\t-h, --help\tPrint this message\n");
 	fprintf(stdout, "\t-f, --force\tForce updating firmware even it the image provided is older\n\t\t\tthen the current firmware on the device.\n");
+	fprintf(stdout, "\t-d, --device\thidraw device file associated with the device being updated.\n");
+}
+
+int UpdateDevice(FirmwareImage & image, bool force, const char * deviceFile) {
+	HIDDevice rmidevice;
+	int rc;
+
+	rc = rmidevice.Open(deviceFile);
+	if (rc)
+		return rc;
+
+	RMI4Update update(rmidevice, image);
+	rc = update.UpdateFirmware(force);
+	if (rc != UPDATE_SUCCESS)
+		return rc;
+
+	return rc;
 }
 
 int main(int argc, char **argv)
 {
 	int rc;
-	HIDDevice rmidevice;
 	FirmwareImage image;
 	int opt;
 	int index;
@@ -45,8 +63,11 @@
 	static struct option long_options[] = {
 		{"help", 0, NULL, 'h'},
 		{"force", 0, NULL, 'f'},
+		{"device", 1, NULL, 'd'},
 		{0, 0, 0, 0},
 	};
+	struct dirent * devDirEntry;
+	DIR * devDir;
 
 	while ((opt = getopt_long(argc, argv, RMI4UPDATE_GETOPTS, long_options, &index)) != -1) {
 		switch (opt) {
@@ -56,26 +77,20 @@
 			case 'f':
 				force = true;
 				break;
+			case 'd':
+				deviceName = optarg;
+				break;
 			default:
 				break;
 
 		}
 	}
 
-	if (optind < argc)
-		deviceName = argv[optind++];
-	else
-		return -1;
-
-	if (optind < argc)
+	if (optind < argc) {
 		firmwareName = argv[optind];
-	else
+	} else {
+		printHelp(argv[0]);
 		return -1;
-
-	rc = rmidevice.Open(deviceName);
-	if (rc) {
-		fprintf(stderr, "Failed to open rmi device: %s\n", strerror(errno));
-		return rc;
 	}
 
 	rc = image.Initialize(firmwareName);
@@ -84,13 +99,32 @@
 		return 1;
 	}
 
+	if (deviceName) {
+		return UpdateDevice(image, force, deviceName);
+	} else {
+		char buf[PATH_MAX];
+		bool found = false;
 
+		devDir = opendir("/dev");
+		if (!devDir)
+			return -1;
 
-	RMI4Update update(rmidevice, image);
-	rc = update.UpdateFirmware(force);
-	if (rc != UPDATE_SUCCESS) {
-		fprintf(stderr, "Firmware update failed because: %s\n", update_err_to_string(rc));
-		return 1;
+		while ((devDirEntry = readdir(devDir)) != NULL) {
+			if (strstr(devDirEntry->d_name, "hidraw")) {
+				snprintf(buf, PATH_MAX, "/dev/%s", devDirEntry->d_name);
+				rc = UpdateDevice(image, force, buf);
+				if (rc != 0) {
+					continue;
+				} else {
+					found = true;
+					break;
+				}
+			}
+		}
+		closedir(devDir);
+
+		if (!found)
+			return rc;
 	}
 
 	return 0;
diff --git a/rmidevice/hiddevice.cpp b/rmidevice/hiddevice.cpp
index 473b552..9ef4c32 100644
--- a/rmidevice/hiddevice.cpp
+++ b/rmidevice/hiddevice.cpp
@@ -64,6 +64,8 @@
 #define HID_RMI4_ATTN_INTERUPT_SOURCES		1
 #define HID_RMI4_ATTN_DATA			2
 
+#define SYNAPTICS_VENDOR_ID			0x06cb
+
 int HIDDevice::Open(const char * filename)
 {
 	int rc;
@@ -92,23 +94,36 @@
 	if (rc < 0)
 		return rc;
 
+	if (m_info.vendor != SYNAPTICS_VENDOR_ID) {
+		errno = -ENODEV;
+		return -1;
+	}
+
 	ParseReportSizes();
 
 	m_inputReport = new unsigned char[m_inputReportSize]();
-	if (!m_inputReport)
-		return -ENOMEM;
+	if (!m_inputReport) {
+		errno = -ENOMEM;
+		return -1;
+	}
 
 	m_outputReport = new unsigned char[m_outputReportSize]();
-	if (!m_outputReport)
-		return -ENOMEM;
+	if (!m_outputReport) {
+		errno = -ENOMEM;
+		return -1;
+	}
 
 	m_readData = new unsigned char[m_inputReportSize]();
-	if (!m_readData)
-		return -ENOMEM;
+	if (!m_readData) {
+		errno = -ENOMEM;
+		return -1;
+	}
 
 	m_attnReportQueue = new unsigned char[m_inputReportSize * HID_REPORT_QUEUE_MAX_SIZE]();
-	if (!m_attnReportQueue)
-		return -ENOMEM;
+	if (!m_attnReportQueue) {
+		errno = -ENOMEM;
+		return -1;
+	}
 
 	m_deviceOpen = true;
 
