Skip to content

dvb-usb: use designated initializers

Mauro Carvalho Chehab linux-media lkml 1 version In review

Get series with b4
b4 am [email protected]

Versions newest first

  1. v1 Latest26 patches 1 replyIn review

Patches in v1 No applies recorded yet

#Subject and filesSizeRepliesApplied
1/26media: dvb-usb-ids.h: sort entriesinclude/media/dvb-usb-ids.h+297 -2940 replies
2/26media: dvb-usb: move USB IDs to dvb-usb-ids.hdrivers/media/usb/dvb-usb/cinergyT2-core.c drivers/media/usb/dvb-usb/dtv5100.c drivers/media/usb/dvb-usb/dw2102.c +1 more+37 -210 replies
3/26media: dvb-usb: vp702x: reference to usb ID tabledrivers/media/usb/dvb-usb/vp702x.c+2 -20 replies
4/26media: dvb-usb: Add helper macros for using USB VID/PIDinclude/media/dvb-usb-ids.h+8 -00 replies
5/26media: dvb-usb: a800: use an enum for the device numberdrivers/media/usb/dvb-usb/a800.c+12 -60 replies
6/26media: af9005: use the newer dvb-usb macros for USB devicedrivers/media/usb/dvb-usb/af9005.c+8 -110 replies
7/26media: dvb-usb: az6027: use an enum for the device numberdrivers/media/usb/dvb-usb/az6027.c+28 -170 replies
8/26media: cinergyT2-core: use the newer dvb-usb macros for USB devicedrivers/media/usb/dvb-usb/cinergyT2-core.c+7 -30 replies
9/26media: cxusb: use the newer dvb-usb macros for USB devicedrivers/media/usb/dvb-usb/cxusb.c+23 -650 replies
10/26media: digitv: use the newer dvb-usb macros for USB devicedrivers/media/usb/dvb-usb/digitv.c include/media/dvb-usb-ids.h+10 -50 replies
11/26media: dvb-usb: dtt200u: use an enum for the device numberdrivers/media/usb/dvb-usb/dtt200u.c include/media/dvb-usb-ids.h+45 -300 replies
12/26media: dtv5100: use the newer dvb-usb macros for USB devicedrivers/media/usb/dvb-usb/dtv5100.c+8 -30 replies
13/26media: dw2102: use the newer dvb-usb macros for USB devicedrivers/media/usb/dvb-usb/dw2102.c include/media/dvb-usb-ids.h+45 -510 replies
14/26media: dvb-usb: gp8psk: use an enum for the device numberdrivers/media/usb/dvb-usb/gp8psk.c+23 -130 replies
15/26media: dvb-usb: m920x: use an enum for the device numberdrivers/media/usb/dvb-usb/m920x.c include/media/dvb-usb-ids.h+35 -260 replies
16/26media: dvb-usb: nova-t-usb2: use an enum for the device numberdrivers/media/usb/dvb-usb/nova-t-usb2.c include/media/dvb-usb-ids.h+14 -80 replies
17/26media: dvb-usb: opera1: use an enum for the device numberdrivers/media/usb/dvb-usb/opera1.c include/media/dvb-usb-ids.h+11 -60 replies
18/26media: dvb-usb: pctv452e: use an enum for the device numberdrivers/media/usb/dvb-usb/pctv452e.c include/media/dvb-usb-ids.h+15 -90 replies
19/26media: technisat-usb2: use the newer dvb-usb macros for USB devicedrivers/media/usb/dvb-usb/technisat-usb2.c+8 -30 replies
20/26media: dvb-usb: ttusb2: use an enum for the device numberdrivers/media/usb/dvb-usb/ttusb2.c include/media/dvb-usb-ids.h+23 -170 replies
21/26media: dvb-usb: umt-010: use an enum for the device numberdrivers/media/usb/dvb-usb/umt-010.c+12 -60 replies
22/26media: dvb-usb: vp702x: use an enum for the device numberdrivers/media/usb/dvb-usb/vp702x.c include/media/dvb-usb-ids.h+18 -110 replies
23/26media: dvb-usb: vp7045: use an enum for the device numberdrivers/media/usb/dvb-usb/vp7045.c include/media/dvb-usb-ids.h+22 -140 replies
24/26media: dvb-usb: dibusb-mb: use an enum for the device numberdrivers/media/usb/dvb-usb/dibusb-mb.c include/media/dvb-usb-ids.h+101 -750 replies
25/26media: dvb-usb: dibusb-mc: use an enum for the device numberdrivers/media/usb/dvb-usb/dibusb-mc.c include/media/dvb-usb-ids.h+62 -420 replies
26/26media: dvb-usb: dib0700_devices: use an enum for the device numberdrivers/media/usb/dvb-usb/dib0700_devices.c include/media/dvb-usb-ids.h+268 -1770 replies

Reviews trailers per patch

No Reviewed-by, Acked-by or Tested-by trailers for v1 yet.

Read the v1 thread

Cover letter [PATCH 00/26] dvb-usb: use designated initializers

There are two DVB USB cores on media. The new one (dvb-usb-v2) solves several problems with the previous one, but, unfortunately, there are several drivers that weren't migrated yet.

One of the problems with dvb-usb is that, besides the common DVB USB table, it also uses a per-device table which require links to the USB ID table.

This is done, on most drivers, using a magic number, which is easy to get outdated.

Rewrite the drivers in order to use an enum and use designated initializers where needed.

This patch series was inspired on this patch:
https://patchwork.kernel.org/project/linux-media/patch/[email protected]/

While it would be nice to also change the tables to be const, this is currently not possible, as a couple drivers that depend on the dvb-usb struct depend on it to not be const.

Writing a patch series like that and making it properly referencing the right entries is not fun. That's most drivers were never fixed. So, I ended using a script to change it, adding several checks on it, in order to avoid the risk of problems.

Even so, I needed to manually adjust some patches.

This is the used script:

<script>
#!/usr/bin/perl
use strict;
use warnings;
use Text::Tabs;
use File::Find;

my $usb_id_pre = "";
my $usb_id_end = "";

my %vid;
my %pid;

my %pid_count;

my $state = "pre";

sub out_ids()

{
	open OUT, "> include/media/dvb-usb-ids.h" or die;
	print OUT $usb_id_pre;
	foreach my $k(sort keys %vid) {
		my $ln = sprintf "#define USB_VID_%-31s %s\n", $k, $vid{$k};
		$ln = unexpand($ln);
		print OUT $ln;
	}

	print OUT "\n/* Product IDs */\n\n";
	foreach my $k(sort keys %pid) {
		my $ln = sprintf "#define USB_PID_%-39s %s\n", $k, $pid{$k};
		$ln = unexpand($ln);
		print OUT $ln;
	}
	print OUT $usb_id_end;
	close OUT;
}

my @enum;

sub validate_model($$)

{
	my $my_vid = $1;
	my $my_pid = $2;

	if (!$vid{$my_vid}) {
		print "$.# ERROR! VID: $my_vid\n";
		return "";
	}

	if (!$pid{$my_pid}) {
		print "$.# ERROR! PID: $my_pid\n";
		return "";
	}

	my $tmp_vid = $my_vid;
	$tmp_vid =~ s/_ELECTRONIC$//;
	$tmp_vid =~ s/_MICRO$//;
	$tmp_vid =~ s/_1$//;
	$tmp_vid =~ s/_2$//;
	$tmp_vid =~ s/_UNK$//;
	$tmp_vid =~ s/GTEK/GENIATECH/;

	# Change model name to be different
	my $model = $tmp_vid . "_" . $my_pid;

	return $my_pid if ($my_pid =~ /$tmp_vid[_]/ && !grep(/^$my_pid$/, @enum));

	print "NEW model: $model\n";

	# Add the new PID to include/media/dvb-usb-ids.h
	$pid{$model} = $pid{$my_pid};

	$pid_count{$my_pid}--;

	# Drop unused PIDs
	if (!$pid_count{$my_pid}) {
		delete ($pid{$my_pid});
		print "Drop: $my_pid\n";
	}

	return $model if (!grep(/^$model$/, @enum));

	print "$.# ERROR! Model $model aready exists\n";
	return "";
}

sub count_pid()

{
	my $file = $File::Find::name;

	return if (!($file =~ /[.][ch]/));

	open IN, $file or die "Can't open $file";
	while (<IN>) {
		if (/USB_PID_([\w\_]+)/) {
			$pid_count{$1}++;
			next;
		}
	}
	close IN;
}

open IN, "include/media/dvb-usb-ids.h" or die;

while (<IN>) {
	if (/#define\s+USB_VID_(\S+)\s+(\S+)/) {
		$state = "vid";
		$vid{$1} = $2;
#print "VID: $1 -> $2\n";
		next;
	}
	if (/#define\s+USB_PID_(\S+)\s+(\S+)/) {
		$state = "pid";
		$pid{$1} = $2;
#print "PID: $1 -> $2\n";
		next;
	}

	if ($state eq "pre") {
		$usb_id_pre .= $_;
	} elsif ($state eq "pid") {
		$usb_id_end .= $_;
	}
}

close IN;

find({wanted => \&count_pid, no_chdir => 1}, "drivers/media/usb/");

while (scalar @ARGV) {
	@enum = ();
	my @dev_id;


	my $usb_dev_id_table;
	my $out = "";
	my $should_write = 1;

	my $file = $ARGV[0];

	print "Processing $file...\n";

	open IN, $file or die "Can't open $1";

	my $entry = "";

	my $pos = 0;

	while (<IN>) {
		if (m/struct\s.*usb_device_id\s+([\w\_]+).*{/) {
			$usb_dev_id_table = $1;
		}
		if (!$usb_dev_id_table) {
			$out .= $_;
			next;
		}

		if (m,\/\*\s*(\d+)\s*\*\/,) {
			if ($1 != $pos) {
				printf "$.# ERROR! Count is wrong! Want %d, got %d\n", $pos, $1;
				$should_write = 0;
				last;
			}
		}

		$pos++ if (m/USB_DEVICE/);

		last if (m/^}\s*;/);

		$entry .= $_;
		next if (!(m/}\s*,/));

		if ($entry =~ m/USB_DEVICE\(USB_VID_([\w\_]+)\s*,\s*USB_PID_([\w\_]+)/) {
			my $my_vid = $1;
			my $my_pid = $2;

			my $model = validate_model($my_vid, $my_pid);
			if ($model eq "") {
				$should_write = 0;
				last;
			}

			push @enum, $model;
			push @dev_id, "DVB_USB_DEV($my_vid, $model)";
			print "DVB_USB_DEV($my_vid, $model)\n";
		}
		if ($entry =~ m/USB_DEVICE_VER\(USB_VID_([\w\_]+)\s*,\s*USB_PID_([\w\_]+)\s*,\s*(\w+)\s*,\s*(\w+)/) {
			my $my_vid = $1;
			my $my_pid = $2;
			my $lo = $3;
			my $hi = $4;

			my $model = validate_model($my_vid, $my_pid);
			if ($model eq "") {
				$should_write = 0;
				last;
			}

			push @enum, $model;
			push @dev_id, "DVB_USB_DEV_VER($my_vid, $model, $lo, $hi)";
			print "DVB_USB_DEV_VER($my_vid, $model, $lo, $hi)\n";
		}
		$entry = "";
	}

	if ($should_write && scalar(@enum) != $pos) {
		printf "ERROR! Count is wrong! Want %d, got %d\n", $pos, scalar(@enum);
		$should_write = 0;
	}

	if ($usb_dev_id_table && $should_write) {
		$out .= "enum {\n";
		for my $e (@enum) {
			$out .= "\t$e,\n";
		}
		$out .= "};\n\n";

		$out .= "static struct usb_device_id $usb_dev_id_table\[\] = {\n";
		for my $e (@dev_id) {
			$out .= "\t$e,\n";
		}
		$out .= "\t{ }\n";
		$out .= "};\n\n";

		my $start = 1;

		while (<IN>) {
			next if ($start && m/^$/);
			$start = 0;
			while (m/$usb_dev_id_table\[(\d+)\]/g) {
				my $i = $1;

				if ($1 > scalar @enum) {
					print "ERROR! $usb_dev_id_table element $1 doesn't exist!\n";
					$should_write = 0;
					last;
				}

				my $idx = $enum[$1];

				if (!(s,($usb_dev_id_table)\[$i\],$1\[$idx],g)) {
					print "ERROR! can't replace $1!\n";
					$should_write = 0;
					last;
				}
			}
			$out .= $_;
		}
		close IN;
	} else {
		while (<IN>) {
			$out .= $_;
		}
		print "\tunchanged\n";
		$should_write = 0;
	}

	if ($should_write || $file eq "include/media/dvb-usb-ids.h") {
		open OUT, ">$file" or die "Can't write on file $file";
		print OUT $out;
		close OUT;
		printf "\twrote\n";

		out_ids();
	}

	shift @ARGV;
}

</script>

Mauro Carvalho Chehab (26):
media: dvb-usb-ids.h: sort entries
media: dvb-usb: move USB IDs to dvb-usb-ids.h
media: dvb-usb: vp702x: reference to usb ID table
media: dvb-usb: Add helper macros for using USB VID/PID
media: dvb-usb: a800: use an enum for the device number
media: af9005: use the newer dvb-usb macros for USB device
media: dvb-usb: az6027: use an enum for the device number
media: cinergyT2-core: use the newer dvb-usb macros for USB device
media: cxusb: use the newer dvb-usb macros for USB device
media: digitv: use the newer dvb-usb macros for USB device
media: dvb-usb: dtt200u: use an enum for the device number
media: dtv5100: use the newer dvb-usb macros for USB device
media: dw2102: use the newer dvb-usb macros for USB device
media: dvb-usb: gp8psk: use an enum for the device number
media: dvb-usb: m920x: use an enum for the device number
media: dvb-usb: nova-t-usb2: use an enum for the device number
media: dvb-usb: opera1: use an enum for the device number
media: dvb-usb: pctv452e: use an enum for the device number
media: technisat-usb2: use the newer dvb-usb macros for USB device
media: dvb-usb: ttusb2: use an enum for the device number
media: dvb-usb: umt-010: use an enum for the device number
media: dvb-usb: vp702x: use an enum for the device number
media: dvb-usb: vp7045: use an enum for the device number
media: dvb-usb: dibusb-mb: use an enum for the device number
media: dvb-usb: dibusb-mc: use an enum for the device number
media: dvb-usb: dib0700_devices: use an enum for the device number

 drivers/media/usb/dvb-usb/a800.c            |  18 +-
 drivers/media/usb/dvb-usb/af9005.c          |  19 +-
 drivers/media/usb/dvb-usb/az6027.c          |  45 +-
 drivers/media/usb/dvb-usb/cinergyT2-core.c  |  10 +-
 drivers/media/usb/dvb-usb/cxusb.c           |  88 +--
 drivers/media/usb/dvb-usb/dib0700_devices.c | 428 +++++++------
 drivers/media/usb/dvb-usb/dibusb-mb.c       | 165 ++---
 drivers/media/usb/dvb-usb/dibusb-mc.c       |  88 +--
 drivers/media/usb/dvb-usb/digitv.c          |  13 +-
 drivers/media/usb/dvb-usb/dtt200u.c         |  56 +-
 drivers/media/usb/dvb-usb/dtv5100.c         |  11 +-
 drivers/media/usb/dvb-usb/dw2102.c          |  84 ++-
 drivers/media/usb/dvb-usb/gp8psk.c          |  36 +-
 drivers/media/usb/dvb-usb/m920x.c           |  51 +-
 drivers/media/usb/dvb-usb/nova-t-usb2.c     |  18 +-
 drivers/media/usb/dvb-usb/opera1.c          |  15 +-
 drivers/media/usb/dvb-usb/pctv452e.c        |  22 +-
 drivers/media/usb/dvb-usb/technisat-usb2.c  |  11 +-
 drivers/media/usb/dvb-usb/ttusb2.c          |  36 +-
 drivers/media/usb/dvb-usb/umt-010.c         |  18 +-
 drivers/media/usb/dvb-usb/vp702x.c          |  23 +-
 drivers/media/usb/dvb-usb/vp7045.c          |  28 +-
 include/media/dvb-usb-ids.h                 | 632 +++++++++++---------
 23 files changed, 1071 insertions(+), 844 deletions(-)
Signature · 1 line
2.35.1