Browse Source

nanofury: Convert to lowl_probe

Luke Dashjr 12 years ago
parent
commit
18e2c9d00c
5 changed files with 24 additions and 20 deletions
  1. 10 18
      driver-nanofury.c
  2. 9 0
      lowlevel.c
  3. 3 0
      lowlevel.h
  4. 1 1
      mcp2210.c
  5. 1 1
      mcp2210.h

+ 10 - 18
driver-nanofury.c

@@ -173,7 +173,13 @@ fail:
 }
 
 static
-bool nanofury_foundlowl(struct lowlevel_device_info * const info, __maybe_unused void *userp)
+bool nanofury_lowl_match(const struct lowlevel_device_info * const info)
+{
+	return lowlevel_match_lowlproduct(info, &lowl_mcp2210, NANOFURY_USB_PRODUCT);
+}
+
+static
+bool nanofury_lowl_probe(const struct lowlevel_device_info * const info)
 {
 	const char * const product = info->product;
 	const char * const serial = info->serial;
@@ -211,7 +217,7 @@ bool nanofury_foundlowl(struct lowlevel_device_info * const info, __maybe_unused
 	cgpu = malloc(sizeof(*cgpu));
 	*cgpu = (struct cgpu_info){
 		.drv = &nanofury_drv,
-		.device_data = info,
+		.device_data = lowlevel_ref(info),
 		.threads = 1,
 		// TODO: .name
 		.device_path = strdup(info->path),
@@ -225,21 +231,6 @@ bool nanofury_foundlowl(struct lowlevel_device_info * const info, __maybe_unused
 	return add_cgpu(cgpu);
 }
 
-static bool nanofury_detect_one(const char *serial)
-{
-	return lowlevel_detect_serial(nanofury_foundlowl, serial);
-}
-
-static int nanofury_detect_auto()
-{
-	return lowlevel_detect(nanofury_foundlowl, NANOFURY_USB_PRODUCT);
-}
-
-static void nanofury_detect()
-{
-	serial_detect_auto(&nanofury_drv, nanofury_detect_one, nanofury_detect_auto);
-}
-
 static
 bool nanofury_init(struct thr_info * const thr)
 {
@@ -335,7 +326,8 @@ void nanofury_shutdown(struct thr_info * const thr)
 struct device_drv nanofury_drv = {
 	.dname = "nanofury",
 	.name = "NFY",
-	.drv_detect = nanofury_detect,
+	.lowl_match = nanofury_lowl_match,
+	.lowl_probe = nanofury_lowl_probe,
 	
 	.thread_init = nanofury_init,
 	.thread_disable = nanofury_disable,

+ 9 - 0
lowlevel.c

@@ -34,6 +34,8 @@ void lowlevel_devinfo_semicpy(struct lowlevel_device_info * const dst, const str
 
 void lowlevel_devinfo_free(struct lowlevel_device_info * const info)
 {
+	if (info->ref--)
+		return;
 	if (info->lowl->devinfo_free)
 		info->lowl->devinfo_free(info);
 	free(info->manufacturer);
@@ -44,6 +46,13 @@ void lowlevel_devinfo_free(struct lowlevel_device_info * const info)
 	free(info);
 }
 
+struct lowlevel_device_info *lowlevel_ref(const struct lowlevel_device_info * const cinfo)
+{
+	struct lowlevel_device_info * const info = (void*)cinfo;
+	++info->ref;
+	return info;
+}
+
 void lowlevel_scan_free()
 {
 	if (!devinfo_list)

+ 3 - 0
lowlevel.h

@@ -32,6 +32,7 @@ struct lowlevel_device_info {
 	struct lowlevel_device_info *next;
 	UT_hash_handle hh;
 	pthread_t probe_pth;
+	int ref;
 };
 
 extern struct lowlevel_device_info *lowlevel_scan();
@@ -46,6 +47,8 @@ extern int _lowlevel_detect(lowl_found_devinfo_func_t, const char *serial, const
 #define lowlevel_detect_serial(func, serial)  _lowlevel_detect(func, serial, (const char *[]){NULL}, NULL)
 extern int lowlevel_detect_id(lowl_found_devinfo_func_t, void *, const struct lowlevel_driver *, int32_t vid, int32_t pid);
 extern void lowlevel_scan_free();
+
+extern struct lowlevel_device_info *lowlevel_ref(const struct lowlevel_device_info *);
 extern void lowlevel_devinfo_semicpy(struct lowlevel_device_info *dst, const struct lowlevel_device_info *src);
 extern void lowlevel_devinfo_free(struct lowlevel_device_info *);
 

+ 1 - 1
mcp2210.c

@@ -107,7 +107,7 @@ bool mcp2210_get_configs(struct mcp2210_device * const h)
 	return true;
 }
 
-struct mcp2210_device *mcp2210_open(struct lowlevel_device_info *info)
+struct mcp2210_device *mcp2210_open(const struct lowlevel_device_info * const info)
 {
 	struct mcp2210_device *h;
 	char * const path = info->path;

+ 1 - 1
mcp2210.h

@@ -17,7 +17,7 @@ enum mcp2210_gpio_value {
 
 struct mcp2210_device;
 
-extern struct mcp2210_device *mcp2210_open(struct lowlevel_device_info *);
+extern struct mcp2210_device *mcp2210_open(const struct lowlevel_device_info *);
 extern void mcp2210_close(struct mcp2210_device *);
 
 extern bool mcp2210_spi_cancel(struct mcp2210_device *);