Mauro Carvalho Chehab <mchehab at infradead dot org>
					Updated on 2010 January 30

This file describes the general procedures used by the LinuxTV team (*)
and by the v4l-dvb community.

(*) This is just an aka for the main developers involved in V4L/DVB
drivers. They are a volunteer and unremunerated group of people that
have the common interest of providing a good support on Linux for
receiving and capturing video streams from webcams, analog TV, digital
TV and radio broadcast AM/FM.

   CONTENTS
   ========

     Part I - Patch management on LinuxTV
	1. A brief introduction about patch management
	2. Git and Mercurial trees hosted on LinuxTV site
	3. Git and Mercurial trees' relationships with v4l/dvb development
	4. Patch submission process overall
	5. Other Git trees used for v4l/dvb development
	6. Other Mercurial trees used for v4l/dvb development

     Part II - Git trees
	1. Kernel development procedures at the kernel upstream
	  1.1 Subsystem procedures for merging patches upstream
	  1.2 A practical example
	  1.3 Patches for stable
	2. Kernel development procedures for V4L/DVB
	  2.1 Fixes and linux-next patches
	  2.2 How to solve those issues?
	3. How to submit a -git pull request
	  3.1 Tags that a patch receive after its submission
	4. Patches submitted via email
	  4.1 Example

     Part III - Best Practices
	1. Community best practices
	2. Mercurial specific procedures
	3. Knowing about newer patches committed at the development repositories
	4. Patch submission from the community
	5. Identifying regressions with Mercurial
	6. Identifying regressions with Git
	7. Creating a newer driver
	  7.1. Simple drivers
	  7.2. Bigger drivers

===================================
PART I. PATCH MANAGEMENT ON LINUXTV
===================================


1. A brief introduction about patch management
   ===========================================

V4L/DVB development is based on modern SCM (Source Code Management) systems
that fits better into kernel development model.

At the beginning, the usage CVS for of a SCM (Source Code Management) were
choosen on V4L/DVB. Both of the original V4L and DVB trees were developed with
the help of cvs. On that time, upstream Linux kernel used to have another tree
(BitKeeper).

In 2005, Upstream Kernel development model changed to use git (a SCM tool
developed by Linus Torvalds, the inventor and main maintainer of the Linux
Kernel).

Also in 2005, both V4L and DVB trees got merged into one cvs repository, and
the community discussed about what would be the better SCM solution. It were
mainly availed the usage of svn, hg and git. On that time, both hg and git were
new technologies, based on the concept of a distributed SCM, where there's no
need to go to the server every time a command is used at the SCM. This speeds
up the development time, and allows descentralized development.

Mercurial used to be stable and had more projects using, while git were giving
its first steps, being used almost only by the Linux Kernel, and several distros
didn't use to package it. Git objects were stored uncompressed, generating very
large trees. Also, -git tools were complex to use, and some "porcelain" packages
were needed, in order to be used by a normal user.

So, the decision was made to use Mercurial. However, as time goes by, git got
much more eyes than any other SCM, having all their weakness solved, and being
developed really fast. Also, it got adopted by several other projects, due to
its capability and its number of features.

Technically speaking, -git is currently the most advanced distributed
open-source SCM application available today.

Yet, Mercurial has been doing a very good job maintaining the V4L/DVB trees,
and, except for a few points, it does the job.

However, the entire Linux Kernel development happens around -git. Even the ones
that were adopting other tools (like -alsa, that used to have also Mercurial
repositories) migrated to -git.

Despite all technical advantages, the rationale for the migration to git is
quite simple: converting patches between different repositories and SCM tools
cause development and merge delays, may cause patch mangling and eats lot of
the time for people that are part of the process.

Also, every time a patch needs to touch on files outside the incomplete tree
used at the subsystem, an workaround need to be done, in order to avoid troubles
and to be able to send the patch upstream.

So, it is simpler to just use -git.

2. Git and Mercurial trees hosted on LinuxTV site
   ==============================================

A list of current available Mercurial repositories used on LinuxTV is available at:
	http://linuxtv.org/hg/


A list of current available Git repositories used on LinuxTV is available
at:
	http://git.linuxtv.org

3. Git and Mercurial trees' relationships with v4l/dvb development
   ===============================================================

The main subsystem kernel trees are hosted at http://git.kernel.org. Each tree
is owned by a maintainer. In the case of LinuxTV, the subsystem maintainer is
Mauro Carvalho Chehab, who owns all sybsystem trees.

The main kernel tree is owned by Linus Torvalds, being located at:
	http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git

The subsystem maintainer's master tree is located at:
	http://git.kernel.org/?p=linux/kernel/git/mchehab/linux-2.6.git

The subsystem maintainer's tree with development patches that aren't ready yet
for upstream is handled at:
	http://git.linuxtv.org/git/v4l-dvb.git

The main function of this tree is to merge patches received via email and from
other Git and Mercurial repositories and to test the entire subsystem with the
finished patches.

The subsystem maintainer's tree with development patches that will be sent soon
to upstream is located at:
	http://git.linuxtv.org/git/fixes.git

There is also an experimental tree, that contains all experimental patches
from all subsystem trees, called linux-next. Its purpose is to check in
advance if patches from different trees would conflict. The main tree for
linux-next is owned by Stephen Rothwell and it is located at:
	http://git.kernel.org/?p=linux/kernel/git/sfr/linux-next.git

Warning: linux-next is meant to be used by developers. As it may contain broken
+++++++  patches on several subsystems, it may cause damage if used on
	 production systems.

The subsystem maintainer's linux-next tree is located at:
	http://www.kernel.org/git/?p=linux/kernel/git/mchehab/linux-next.git

In general, it contains a replica of the contents of the development tree.

Michael Krufky maintains a backport tree, containing a subset of the
patches from the subsystem tree that are meant to be sent to kernel
-stable team, at:
	http://git.kernel.org/http://git.kernel.org/?p=linux/kernel/git/mkrufky/
v4l-dvb-2.6.x.y.git

In order to allow testing the LinuxTV drivers with older kernels, a backport
tree is maintained by Douglas Schilling Landgraf <dougsland at redhat dot com>.

The backport tree is at:
	http://linuxtv.org/hg/v4l-dvb

 Basically, all patches added at -git
are manually imported on this tree, that also contains some logic to allow
compilation of the core system since kernel 2.6.16. It should be noticed,
however, that some drivers may require newer kernels in order to compile.

Also, those backports are developped as best efforts, and are mainly against
upstream stable kernels, so they may not compile with distro-patched kernels,
nor they are meant to offer production level of support. So, if you need to
run any prodution machine, you should really be using a Linux distribution
that offers support for the drivers you need and has a Quality Assurance
process when doing backports. You were warned.

Users are welcome to use, test and report any issues via the mailing
lists or via the Kernel Bug Tracker, available at:
	http://bugzilla.kernel.org

4. Patch submission process overall
   ================================

When a developer believes that there are done to be merged, he sends a request
for the patches to get merged at the v4l-dvb.git tree, at the linux-media at
vger.kernel.org (the main mailing list for LinuxTV).

The patches are analyzed and, if they look ok, they got merged into v4l-dvb.git.

Currently, there are thre ways to submit a patch:
  as an email, with the subject [PATCH];
  as a hg pull request, with the subject [PULL];
  as a git pull request, with the subject [GIT FIXES ...] or [GIT UPDATES ...]

If the patch is developed against the Mercurial repositories, it is converted
to the format git expects and have any backport code removed.

No matter how the patch is received, after being checked and accepted by the maintainer,
the patch will receive the maintainer's Certificate of Origin (Signed-off-by,
as explained later within this document), and will be added at:

  http://git.linuxtv.org/git/v4l-dvb.git

Later, it will be backported to the -hg tree.

The community also reviews the patches and may send emails informing that the
patch has problems or were tested/acked. When those reviews happen after the
patch merge at the tree, the patch is modified before its upstream submission.

Also, the maintainer may need to modify the patch at his trees, in order to
fix conflicts that may happen with the patch.

The subsystem maintainer, when preparing the kernel patches to be sent
to mainstream, send the patches first to linux-next tree, and waits for some
to receive contributions from other upstream developers. If, during that period,
he notices a problem, he may correct the patch at his upstream submission tree.

5. Other Git trees used for v4l/dvb development
   ============================================

V4L/DVB Git trees are hosted at
  git://linuxtv.org.

There are a number of trees there each owned by a developer of the LinuxTV team.

The submission emails are generated via the usage of git request-pull, as
described on part II.

Git is a distributed SCM, which means every developer gets his
own full copy of the repository (including the complete revision
history), and can work and commit locally without network connection.
The resulting changesets can then be exchanged between repositories and
finally merged into a common repository on linuxtv.org.

The Git trees used on LinuxTV have the entire Linux Kernel tree and history
since kernel 2.6.12. So, it generally takes some time to update it at the
first time.

There are several good documents on how to use -git, including:
  http://git.or.cz/
  http://www.kernel.org/pub/software/scm/git/docs/gittutorial.html
  http://www.kernel.org/pub/software/scm/git/docs

6. Other Mercurial trees used for v4l/dvb development
   ==================================================

V4L/DVB Mercurial trees are hosted at
  http://linuxtv.org/hg.

There are a number of trees there each owned by a developer of the LinuxTV team.

A script called v4l/scripts/hg-pull-req.pl is included that will generate this
request, providing a list of patches that will be pulled, links to each
patch, and a diffstat of the all patches.  It will work best if Hg has
been configured with the correct username (also used by the commit
message generator) and push path.  The script is designed to be easy to
modify to produce text for a given contributor's style.

It is good practice that each developer will have at least one tree
called 'v4l-dvb', which keeps their patches, and periodically update
this tree with the master tree's patches.

Mercurial is a distributed SCM, which means every developer gets his
own full copy of the repository (including the complete revision
history), and can work and commit locally without network connection.
The resulting changesets can then be exchanged between repositories and
finally merged into a common repository on linuxtv.org.

There are some tutorials, FAQs and other valuable information at
  http://selenic.com/mercurial/


==================
PART II. GIT TREES
==================


1. Kernel development procedures at the kernel upstream
   ====================================================

It is important that people understand how upstream development works.

Kernel development has 2 phases:

a) a merge window typically with 2 weeks (although Linus is gave some
  indications that he may reduce it on 2.6.34), starting with the release of
  a new kernel version;

b) the -rc period, where the Kernel is tested and receive fixes.

The length of the -rc period depends on the number and relevance of the fixes.
Considering the recent history, it ranges from -rc6 to -rc8, where each -rc
takes one week.

Those are the latest -rc kernels since 2.6.12:
  kernel 	latest -rc version
  2.6.12 	rc6
  2.6.13 	rc7
  2.6.14 	rc5
  2.6.15 	rc7
  2.6.16 	rc6
  2.6.17 	rc6
  2.6.18 	rc7
  2.6.19 	rc6
  2.6.20 	rc7
  2.6.21 	rc7
  2.6.22 	rc7
  2.6.23 	rc9
  2.6.24 	rc8
  2.6.25 	rc9
  2.6.26 	rc9
  2.6.27 	rc9
  2.6.28 	rc9
  2.6.29 	rc8
  2.6.30 	rc8
  2.6.31 	rc9
  2.6.32 	rc8

In general, the announcement of a new -rc kernel gives some hints when that
-rc kernel may be the last one.

1.1. Subsystem procedures for merging patches upstream
     =================================================

The required procedure on subsystem trees is that:

a) During -rc period (e.g. latest main kernel available is 2.6.x, the latest
  -rc kernel is 2.6.[x+1]-rc<y>):

    * fix patches for the -rc kernel (2.6.[x+1]) should be sent upstream,
      being a good idea to send them for some time at linux-next tree, allowing
      other people to test it, and check for potential conflicts with the other
      arch's;
    * patches for 2.6.[x+2] should be sent to linux-next.

b) the release of 2.6.[x+1] kernel:

    * closes the -rc period and starts the merge window.

c) During the merge window:

    * the patch that were added on linux-next during the -rc period for
      2.6.[x+2] should be sent upstream;
    * new non-fix patches should be hold until the next -rc period starts, so,
      they'll be added on 2.6.[x+3];
    * fix patches for 2.6.[x+2] should go to linux-next, wait for a few days
      and then send upstream.

d) the release of 2.6.[x+2]-rc1 kernel:

    * the merge window has closed. No new features are allowed.
    * the patches with new features that arrived during the merge window
      will be moved to linux-next

1.2. A practical example
     ===================

Considering that, at the time this document were written, the last main release
is 2.6.32, and the latest -rc release is 2.6.33-rc5, this means that:

    * Stable patches, after adding upstream, are being received for 2.6.32
      kernel series;
    * Bug fixes are being received for kernel 2.6.33;
    * New feature patches are being received for kernel 2.6.34.

After the release of kernel 2.6.33, starts the period for receiving patches
for 2.6.35.

In other words, the features being developed are always meant to be included on
the next 2 kernels.

In the specific case of new drivers that don't touch on existing features, it
could be possible to send it during the -rc period, but it is safer to assume
that those drivers should follow the above procedure, as a later submission may
be nacked.

1.3. Patches for stable
   ====================

Sometimes, a fix patch corrects a problem that happens also on stable kernels
(e. g. on kernel 2.6.x or even 2.6.y, where y < x). In this case, the patch
should be sent to stable@kernel.org, in order to be added on stable kernels.

In the case of git-submitted patches with fixes, that also need to be send to
stable, all the developer needs to do is to add, a the patch description:

 CC: stable.kernel.org

At the moment the patch reaches upstream, a copy of the patch will be
automatically be sent to the stable maintainer and will be considered for
inclusion on the next stable kernel (2.6.x.y).

2. Kernel development procedures for V4L/DVB
   =========================================

The upsteam procedures should be followed by every kernel subsystem. The
subsystems have their own specific procedures detailing how the development
patches are handled before arriving upstream. In the case of v4l/dvb, those
are the used procedures.

2.1. Fixes and linux-next patches
     ============================

One of the big problems of our model used in the past by the subsystem, based on
one Mercurial tree, is that there were just one tree/branch for everything. This
makes hard to send some fix patches for 2.6.[x+1], as they may have conflicts
with the patches for 2.6.[x+2]. So, when the conflict is simple to solve, the
patch is sent as fixes. Otherwise, the patch generally needed to hold to the
next cycle. The fix patches used to get a special tag, added by the developer
("Priority: high", in the body of the description), to give a hint to the
subsystem maintainer that the patch should be sent upstream.

Unfortunately, sometimes people mark the driver with the wrong tag. For example,
a patch got merged on Jan, 22 2010 that marked with "high". However, that patch
didn't apply at the fixes tree, because it fix a regression introduced by a
driver that weren't merged upstream yet.

2.2. How to solve those issues?
     ==========================

Well, basically, the subsystem should work with more than one tree (or branch),
on upstream submission:

    * a tree(branch) with the fix patches;
    * a tree(branch) with the new feature patches.

So, the subsystem uses two development -git trees:

    * http://linuxtv.org/git//v4l-dvb.git - for patches that will be sent to the
      [x+2] kernel (and merged at upstream linux-next tree)

    * http://linuxtv.org/git//fixes.git - for bug patches that will be sent to
      the [x+1] kernel (also, patches that need to go to both [x+1] and [x])

While the patches via -hg, due to the merge conflicts its mentioned, the better
is that, even those developers that prefer to develop patches use the old way,
to send the fix patches via -git. This way, if is there a conflict, he is the
one that can better solve it. Also, it avoids the risk of a patch being wrongly
tagged.

Also, after having a patch added on one of the above trees, it can't simply
remove it, as others will be cloning that tree. So, the only option would be to
send a revert patch, causing the patch history to be dirty and could be
resulting on some troubles when submitting upstream. I've seen some nacks on
receiving patches upstream from dirty git trees. So, we should really avoid
this.

3. how to submit a -git pull request
   =================================

As the same git tree may have more than one branch, and we'll have 2 -git trees
for upstream, it is required that people specify what should be done. The
internal maintainer's workflow is based on different mail queues for each type
of requesting received.

There are some scripts to automate the process, so it is important that everyone
that sends -git pull do it at the same way.

So, a pull request to be send with the following email tags:

 From: <your real email>
 Subject: [GIT FIXES FOR 2.6.33] Fixes for driver cx88
 To: linux-media@vger.kernel.org

 From: <your real email>
 Subject: [GIT PATCHES FOR 2.6.34] Updates for the driver saa7134
 To: linux-media@vger.kernel.org

The from line may later be used by the git mailbomb script to send you a copy
when the patch were committed, so it should be your real email.

The indication between [] on the subject will be handled by the mailer scripts
to put the request at the right queue. So, if tagged wrong, it may not be
committed.

Don't send a copy of the pull to the maintainer addresses. The pull will be
filtering based on the subject and on the mailing list. If you send a c/c to the
maintainer, it will be simply discarded.

NEVER send a copy of any pull request to a subscribers-only mailing list.
Everyone is free to answer to the email, reviewing your patches. Don't penalty
people that wants to contribute with you with SPAM bouncing emails, produced by
subscribers only lists.

When a patch touches on other subsystem codes, please copy the other subsystem
maintainers. This is important for patches that touches on arch files, and also
for -alsa non-trivial patches.

The email should be generated with the usage of git request-pull:

      git request-pull $ORIGIN $URL

where $ORIGIN is the commit hash of the tree before your patches, and $URL is
the URL for your repository.

For example, for the patches merged directly from -hg at the -git trees on Jan,
22 2010, the above commands produced:

 The following changes since commit 2f52713ab3cb9af2eb0f9354dba1421d1497f3e7:
   Abylay Ospan (1):
	 V4L/DVB: 22-kHz set_tone fix for NetUP Dual DVB-S2-CI card. 22kHz logic controlled by demod

 are available in the git repository at:

   git://linuxtv.org/v4l-dvb.git master

 Andy Walls (4):
       V4L/DVB: cx25840, v4l2-subdev, ivtv, pvrusb2: Fix ivtv/cx25840 tinny audio
       V4L/DVB: ivtv: Adjust msleep() delays used to prevent tinny audio and PCI bus hang
       V4L/DVB: cx18-alsa: Initial non-working cx18-alsa files
       V4L/DVB: cx18-alsa: Add non-working cx18-alsa-pcm.[ch] files to avoid data loss

 Devin Heitmueller (20):
       V4L/DVB: xc3028: fix regression in firmware loading time
       V4L/DVB: cx18: rename cx18-alsa.c
       V4L/DVB: cx18: make it so cx18-alsa-main.c compiles
       V4L/DVB: cx18: export a couple of symbols so they can be shared with cx18-alsa
       V4L/DVB: cx18: overhaul ALSA PCM device handling so it works
       V4L/DVB: cx18: add cx18-alsa module to Makefile
       V4L/DVB: cx18: export more symbols required by cx18-alsa
       V4L/DVB: cx18-alsa: remove unneeded debug line
       V4L/DVB: cx18: rework cx18-alsa module loading to support automatic loading
       V4L/DVB: cx18: cleanup cx18-alsa debug logging
       V4L/DVB: cx18-alsa: name alsa device after the actual card
       V4L/DVB: cx18-alsa: remove a couple of warnings
       V4L/DVB: cx18-alsa: fix memory leak in error condition
       V4L/DVB: cx18-alsa: fix codingstyle issue
       V4L/DVB: cx18-alsa: codingstyle fixes
       V4L/DVB: cx18: codingstyle fixes
       V4L/DVB: cx18-alsa: codingstyle cleanup
       V4L/DVB: cx18-alsa: codingstyle cleanup
       V4L/DVB: cx18: address possible passing of NULL to snd_card_free
       V4L/DVB: cx18-alsa: Fix the rates definition and move some buffer freeing code.

 Ian Armstrong (1):
       V4L/DVB: ivtv: Fix race condition for queued udma transfers

 Igor M. Liplianin (4):
       V4L/DVB: Add Support for DVBWorld DVB-S2 PCI 2004D card
       V4L/DVB: dm1105: connect splitted else-if statements
       V4L/DVB: dm1105: use dm1105_dev & dev instead of dm1105dvb
       V4L/DVB: dm1105: use macro for read/write registers

 JD Louw (1):
       V4L/DVB: Compro S350 GPIO change

  drivers/media/common/tuners/tuner-xc2028.c  |   11 +-
  drivers/media/dvb/dm1105/Kconfig            |    1 +
  drivers/media/dvb/dm1105/dm1105.c           |  501 ++++++++++++++-------------
  drivers/media/video/cx18/Kconfig            |   11 +
  drivers/media/video/cx18/Makefile           |    2 +
  drivers/media/video/cx18/cx18-alsa-main.c   |  293 ++++++++++++++++
  drivers/media/video/cx18/cx18-alsa-mixer.c  |  191 ++++++++++
  drivers/media/video/cx18/cx18-alsa-mixer.h  |   23 ++
  drivers/media/video/cx18/cx18-alsa-pcm.c    |  353 +++++++++++++++++++
  drivers/media/video/cx18/cx18-alsa-pcm.h    |   27 ++
  drivers/media/video/cx18/cx18-alsa.h        |   59 ++++
  drivers/media/video/cx18/cx18-driver.c      |   40 ++-
  drivers/media/video/cx18/cx18-driver.h      |   10 +
  drivers/media/video/cx18/cx18-fileops.c     |    6 +-
  drivers/media/video/cx18/cx18-fileops.h     |    3 +
  drivers/media/video/cx18/cx18-mailbox.c     |   46 +++-
  drivers/media/video/cx18/cx18-streams.c     |    2 +
  drivers/media/video/cx25840/cx25840-core.c  |   48 ++-
  drivers/media/video/ivtv/ivtv-irq.c         |    5 +-
  drivers/media/video/ivtv/ivtv-streams.c     |    6 +-
  drivers/media/video/ivtv/ivtv-udma.c        |    1 +
  drivers/media/video/pvrusb2/pvrusb2-hdw.c   |    1 +
  drivers/media/video/saa7134/saa7134-cards.c |    4 +-
  include/media/v4l2-subdev.h                 |    1 +
  24 files changed, 1380 insertions(+), 265 deletions(-)
  create mode 100644 drivers/media/video/cx18/cx18-alsa-main.c
  create mode 100644 drivers/media/video/cx18/cx18-alsa-mixer.c
  create mode 100644 drivers/media/video/cx18/cx18-alsa-mixer.h
  create mode 100644 drivers/media/video/cx18/cx18-alsa-pcm.c
  create mode 100644 drivers/media/video/cx18/cx18-alsa-pcm.h
  create mode 100644 drivers/media/video/cx18/cx18-alsa.h

This helps to identify what's expected to be found at the -git tree and to
double check if the merge happened fine.

3.1. Tags that a patch receive after its submission
     ==============================================

This is probably the most complex issue to solve.

Signed-off-by/Acked-by/Tested-by/Nacked-by tags may be received after a patch or
a -git submission. This can happen even while the patch is being tested at
linux-next, from people reporting problems on the existing patches, or reporting
that a patch worked fine.

Also, the driver maintainer and the subsystem maintainer that is committing
those patches should sign each one, to indicate that he reviewed and has
accepted the patch.

Currently, if a new tag is added to a committed patch, its hash will change.
There were some discussions at Linux Kernel Mailing List about allowing adding
new tags on -git without changing the hash, but I think this weren't implemented
(yet?).

The same problem occurs with -hg, but, as -hg doesn't support multiple branches
(well, it has a "branch" command, but the concept of branch there is different),
it was opted that the -hg trees won't have all the needed SOBs. Instead, those
would be added only at the submission tree.

With -git, a better procedure can be used:

The developer may have two separate branches on his tree. For example, let's
assume that the developer has the following branches on his tree:

    * media-master (associated with "linuxtv" remote)
    * fixes
    * devel

His development happens on devel branch. When the patches are ready to
submission will be copied into a new for_submission branch: git branch
for_submission devel

And a pull request from the branch "for_submission" will be sent.

Eventually, he'll write new patches on his devel branch.

After merged, the developer updates the linuxtv remote and drops the
for_submission branch. This way, "media-master" will contain his patches that
got a new hash, due to the maintainer's SOB. However, he has some new patches on
his devel, that applies over the old hashes.

Fortunately, git has a special command to automatically remove the old objects:
git rebase.

All the developer needs to do is to run the commands bellow:
  git remote update 		# to update his remotes, including "linuxtv"
  git checkout devel		# move to devel branch
  git pull . media-master 	# to make a recursive merge from v4l/dvb upstream
  git rebase media-master 	# to remove the legacy hashes

After this, his development branch will contain only upstream patches + the new
ones he added after sending the patches for upstream submission.

4. Patches submitted via email
   ===========================

All valid patches submitted via email to linux-media at vger.kernel.org are
automatically stored at http://patchwork.kernel.org/project/linux-media/list. A
patch, to be valid, should be in diff unified format. If you're using a -git
tree, the simplest way to generate unified diff patches is to run:

 git diff

If you're writing several patches, the better is to create a tag or a branch for
the changes you're working. After that, you can use

  git format-patch <origin_branch>

to create the patches for email submission.

4.1. Example
     =======

Suppose that the -git tree were created with:

 git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git v4l-dvb
 cd v4l-dvb
 git remote add linuxtv git://linuxtv.org/v4l-dvb.git
 git remote update
 git checkout -b media-master linuxtv/master


Before start working, you need to create your work branch:

 git branch work media-master

And move the working copy to the "work" branch:

 git checkout work

Some changes were done at the driver and saved by commit:

 git commit -as

When the patches are ready for submission via email, all that is needed is to
run:

 git format-patch work

The command will create a series of emails bodies, one file per email.

Just send the email with the patch inlined for it to ge caught by patchwork.

  BE CAREFUL: several emailers including Thunderdird breaks long lines, causing
  patch corruption.
  In the specific case of Thunderbird, an extension is needed to send the
  patches, called Asalted Patches:
	https://hg.mozilla.org/users/clarkbw_gnome.org/asalted-patches/


=========================
Part III - BEST PRACTICES
=========================


1. Community best practices
   ========================

From accumulated experience, there are some basic rules that should
be followed by the community:

a) Every developer should follow the "rules of thumb" of kernel development
   stated at Linux source code, especially those stated at kernel,
   under:
	Documentation/HOWTO
	Documentation/SubmittingPatches
	Documentation/SubmittingDrivers
	Documentation/SubmitChecklist
	Documentation/CodingStyle

b) All commits at the trees should have a consistent message, describing the
   patch.

   When a patch is generated against the git tree, the better is to commit it
   with:
	git commit -as

  This will automatically add all existing patches that got modified and add
  your Certificate of Origin (Signed-off-by).

  It will open an editor for you to provide a description of the patch.
  The first line is a short summary describing why the patch is needed, and
  the following lines describe what and how the patch does that.

  If you've added new files, don't forget to add them before the commit, with:
	git add <the name of each file you've created>

  Before committing a patch, you need to check it with checkpatch.pl tool. This
  is done by running:
	git diff | ./script/checkpatch.pl -

c) All patches are requested to have their coding style validated by using
   ./script/checkpatch.pl.

   On Git, the script checks not only the patch against coding style, but
   also checks for the usage of functions that are marked to be removed
   from the kernel ABI.

d) All patches shall have a Developer's Certificate of Origin
   version 1.1 in the commit log or the email description, signed by the
   patch authors, as postulated in the Linux kernel source at:

	Documentation/SubmittingPatches

   This is done by adding Signed-off-by: fields to the commit message.

   It is not acceptable to use fake signatures, e.g.:

	Signed-off-by: Fake me <me@snakeoilcompany.com>

   The email must be a valid one.
   The author that is submitting the email should be at the button of
   the author's signed-off-by (SOB) block. Other SOBs or Acked-by: will be
   added at the bottom, marking that somebody else reviewed the patch.

   Each person who is in the kernel patch submission chain (driver author
   and/or driver maintainer, subsystem/core maintainers, etc) will
   review each patch. If they agree, the patch will be added to their
   trees and signed. Otherwise, they may comment on the patch, asking
   for some review.

e) Although not documented at kernel's Documentation/, a common kernel
   practice is to use Acked-by: and Tested-by: tags.

   An Acked-by: tag usually means that the acked person didn't write the
   patch, nor is in the chain responsible for sending the patch to
   kernel, but reviewed the patch and agreed that it was good.

  A Tested-by: tag is a stronger variation of Acked-by. It means that the
  person not only reviewed the patch, but also successfully tested it.

   The better is that the patch author submitting his patches via git or hg
   to add any acked-by/tested-by tags he received. When a patch is sent via
   email, Patchwork tool will automatically include any such tags it receives
   in reply together with the patch.

   It is also common to receive acks after having a patch inserted at the
   maintainer's trees. In this case, the ack will be added only at -git tree
   used to send patches upstream.

f) Another kernel's practice that is agreed to be good is that a
   patchset should be reviewed/tested by other developers. So, a new
   tag should be used by testers/reviewers. So, reviewers are welcome.
   After reviewing a patchset, please send an e-mail indicating that, if
   possible, with some additional data about the testing, with the tag:
	Reviewed-by: My Name <myemail@mysite.com>
   This is particularly important for Kernel to userspace ABI changes.

g) If the patch also affects other parts of kernel (like ALSA
   or i2c), it is required that, when submitting upstream, the patch
   also goes to the maintainers of that subsystem. To do this, the
   developer shall copy the interested parties.

   When submitting a patch via e-mail, it is better to copy all interested
   parties directly, by adding them as cc's to the email itself.

   Please note that those changes generally require ack from the
   other subsystem maintainers. So, the best practice is to first ask
   for their acks, then commit to the development tree or send the
   patch via email with their Acked-by: already included.

   NOTE: at Mercurial tree, it used to be possible to use the cc: meta tag to
   warn other users/mailing lists about a patch submission. However, this only
   works when a patch is merged at the backport tree. So, it's usage is
   considered obsolete nowadays.

h) If the patch modifies the V4L or DVB API's (for example, modifying
   include/linux/videodev2.h) file, then it must verify be verified that the
   V4L2 specification document still builds. Of course, any changes you make
   to the public V4L2 API must be documented anyway.

   Currently, this can be done only with the Mercurial trees, by running:
	make spec

   Patches are welcome to migrate this functionality to upstream kernel DocBook
   makefile rules.

i) By submitting a patch to the subsystem maintainer, either via email
   or via pull request, the patch author(s) are agreeing that the
   submitted code will be added on Kernel, and that the submitted code
   are being released as GPLv2. The author may grant additional licenses
   to the submitted code (for example, using dual GPL/BSD) or GPLv2 or
   later. If no specific clause are added, the added code will be
   assumed as GPLv2 only.

j) "Commit earlier and commit often". This is a common used rule at
   Kernel. This means that a sooner submission of a patch will mean that
   a review can happen sooner, and help the develop to address the
   comments. This helps to reduce the life-cycle for having a changeset
   committed at kernel at the proper time. It also means that the one
   changeset should ideally address just one issue. So, mixing different
   things at the same patch should be avoided.

k) Sometimes, the maintainer may need to slightly modify patches you receive
   in order to merge them, because the code is not exactly the same in your
   tree and the submitters'. In order to save time, it may do the changes and
   add a line before his SOB, as stated on Documentation/SubmittingPatches,
   describing what he did to merge it. Something like:

	Signed-off-by: Random J Developer <random@developer.example.org>
	[lucky@maintainer.example.org: struct foo moved from foo.c to foo.h]
	Signed-off-by: Lucky K Maintainer <lucky@maintainer.example.org>

2. Mercurial specific procedures
   =============================

a) With the -hg trees, some scripts are used to generate the patch. This is
      done by running:

	make commit

   This will run some scripts that check changed files, correct
   bad whitespace and prepare the last Signed-off-by: field, as
   described below. A good comment will have a brief
   description at the first line, up to 68 characters wide, a blank
   line, the patch author's name on the third line, a blank line, and
   then a brief description, with no more than 80 chars per line, e. g.:

	   This patch does nothing

	   From: nowhere <nowhere@noplace.org>

	   This is just a sample commit comment, just for reference purposes.

	   This "patch" does nothing.

	   Priority: normal

	   Signed-off-by: nowhere <nowhere@noplace.org>

   All lines starting with # and all lines starting with HG: will be
   removed from the Mercurial commit log.

   *WARNING* Be careful not to leave the first line blank, otherwise hg
   will leave subject blank.

   From: line shouldn't be omitted, since it will be used for the
   patch author when converting to -git.

   Priority: meta-tag will be used as a hint to the subsystem maintainer, to
   help him to identify if the patch is an improvement or board addition
   ("normal"), that will follow the normal lifecycle of a patch (e.g. will be
   sent upstream on the next merge tree), if the patch is a bug fix tree for a
   while without merging upstream ("low").
   Valid values for "Priority:" are "low", "normal" and "high".

b)For "make commit" to work properly, the HGUSER shell environment var should
  be defined (replacing the names at the right):

	HGUSER="My Name <myemail@mysite.com>"

   If HGUSER is not set, then, if present, the username defined in the
   user's ~/.hgrc file will be used.  Use of the .hgrc file is preferred
   over the HGUSER variable according to the hg man page.

   This name will be used for both the user metadata in the Hg commit
   log and the initial values of the "From:" and "Signed-off-by:" lines
   in the pre-made commit message.

   It is also possible to use a different login name at the site
   hosting the repository, by using:

	CHANGE_LOG_LOGIN=my_log_name

   With this, "make push" will use my_log_name, instead of the name for
   the current Unix user.

   Don't forget to export the vars at shell, with something like:

	export CHANGE_LOG_LOGIN HGUSER

   It is strongly recommended to have those lines in .bashrc or .profile.

b) the CodingStyle compliance check on Mercurial trees are done when
   "make check" is called. This happens also when "make commit" is done.

   There's a copy of the kernel tool at the mercurial repository. However,
   this copy may be outdated. So, by default, it will try to use the newest
   version of the script, between the one found at the kernel tree and
   its own copy.

   It is always a good idea to use in-kernel version, since additional tests
   are performed when called from the kernel tree. Yet, those tests are
   dependent of the kernel version, so, the results of checkpatch may not
   reflect the latest rules/deprecated functions, if you're not using -git.

   It is possible to override the in-kernel checkpatch.pl location, by using
   the CHECKPATCH shell environment var to something like:
	CHECKPATCH="/usr/src/linux/scripts/checkpatch.pl"


c) Sometimes, mainstream changes affect the v4l-dvb tree, and must be
   backported to the v4l-dvb tree. This kind of commit to the Mercurial
   tree should follow the rules above and should also have the line:

	kernel-sync:

   Patches with this line will not be submitted upstream.

d) Sometimes it is necessary to introduce some testing code inside a
   module or remove parts that are not yet finished. Also, compatibility
   tests may be required to provide backporting.

   To allow compatibility tests, linux/version.h is automatically
   included by the building system. This allows adding tests like:

	#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 16)
	#include <linux/mutex.h>
	#else
	#include <asm/semaphore.h>
	#endif

   It should be noticed, however, that an explicit inclusion of
   linux/version.h is required if it is needed to use KERNEL_VERSION()
   macro (this is required, for example, by V4L2 VIDIOC_QUERYCAP
   ioctl), otherwise, the driver won't compile when submitted to kernel.

   There are several compatibility procedures already defined
   in "compat.h" file. If needed, it is better to include it after all
   other kernel standard headers, and before any specific header
   for that file. Something like:

	#include <linux/kernel.h>
	#include <linux/module.h>
		...
	#include <linux/videodev2.h>
	#include <media/v4l2-common.h>

	#include "compat.h"

	#include "mydriver-header.h"

   should be included at the files under v4l-dvb tree. This header also
   includes linux/version.h.

   To include testing code, #if 0 or #if 1 may be used. If this code
   is meant to go also to kernel, a comment with the word "keep" should
   be used, e.g:

    #if 0 /* keep */
	or
    #if 1 /* keep */

   The kernel submit scripts will remove the compatibility codes, the
   tests for specific kernel versions and the #if 0/1 that doesn't have
   the "keep meta tag".

   See the file v4l/scripts/gentree.pl for a more complete description
   of what kind of code will be kept and what kind will be removed.

e) To import contributed stuff to a developer's, a script is provided.
   This allows an easy import of mbox-based patch emails.
   This is done with (called from the root tree directory):

	./mailimport <mbox file>

    For it to work properly, git tools need to be installed on the local
    machine, since git has a gitimport script that is used by mailimport.

    There's also a helper script to make easier to retrieve patches from
    other Mercurial repositories. The syntax is:
	./hgimport <URL>

    Also, hg has a feature, called mqueue, that allows having several patches
    that can be applied/unapplied for testing. mailimport trusts on it to work,
    so, this extension should be enabled for mailimport script to work.

3. Knowing about newer patches committed at the development repositories
   =====================================================================

There are patchbomb scripts at linuxtv.org that will send one copy of
each patch applied patch to v4l-dvb.git and v4l-dvb trees to announce
when a patch is received. This announcement goes to the linuxtv-commits mailing list, hosted on linuxtv.org.

The Mercurial script also currently sends a copy of the patch to:

1) The patch author (as stated on the From: field in the patch comments);

2) The patch committer (the "user" at hg metadata);

3) All people with Signed-off-by:, Acked-by:, or CC: metadata clause
   in the patch's comment.

If, for some reason, there's no "From:" metatag (or it is on the first
line, instead of the second one), sometimes the script may fail, maybe
filling patch authorship wrongly. So people should take care to properly
commit patches with "From:".

It is recommended that the developers who submit a pull request via Mercurial
to not touch on the submission tree, until he receives the notification email,
since, even after being merged at -git, the backport maintainer will need to
merge it.

4. Patch submission from the community
   ===================================

Patch submission is open to all the Free Software community. The general
procedure to have a patch accepted in the v4l/dvb subsystem and in the
kernel is the following:

a. Post your patches to the mailing list for review and test by other people:
	linux-media@vger.kernel.org

	This mailing list doesn't require subscription, although
	it is recommended to subscribe, expecially if you're
	developing V4L/DVB drivers.

b. Use [PATCH] and a brief description in the email's subject.
   This will help the LinuxTV team to better handle it.

c. Please include a brief description in the headers of your
   patch, like described above. Something like:

	   This is just a sample commit comment, just for reference purposes.
	   This does nothing.

	   Signed-off-by: nowhere <nowere@noplace.org>

d. Every patch shall have a Developer's Certificate of Origin and should
   be submitted by one of its authors. All the patch authors should sign
   it.

e. People will eventually comment about the patch. In this case,
   please fix problems and repeat until everyone is happy ;)

f. If the patch is fixing an existing maintained driver, the
   low-level driver maintainer will apply to his tree, and at some later
   time, ask the subsystem maintainer to pull it. It is a good idea to
   send the patch to the maintainer C/C the mailing list for him to know
   that you're expecting him to forward the patch.

g. If it is a newer driver (not yet in one of the development trees),
   please send the patch to the subsystem maintainer, C/C the proper
   mailing lists.

h. Prefer to submit your patches against git, especially if it contains fixes
   that needs to go upstream.

5. Identifying regressions with Mercurial
   ======================================

   The better way for you to identify regressions with Mercurial is to
   use hg bisect. This is an extension provided with the current
   Mercurial versions. For it to work, you need to have the proper setup
   at an hgrc file. To test if bisect is working, you can do:
	hg bisect help

   If Mercurial answers with
	hg: unknown command 'bisect'

   You will need to add the following lines to your ~/.hgrc file:
	[extensions]
	hgext.hbisect=/usr/lib/python2.5/site-packages/hgext/hbisect.py

	(assuming that hbisect.py is installed under python2.5 default dir)

   The first step is to initialize bisect for a newer regression testing
   session. This is done with:
	hg bisect init

   If the bisect were previously initialized, you should, instead do:
	hg bisect reset

   Supposing that the latest kernel version have some regression, you
   should do something like:
	hg update -C

   (This will clean any changes you had on your tree, and will update to
    the latest patch)

   Then, you will mark the latest version as "bad":
	hg bisect bad

   The next step is to find one version where the your board is properly
   working. Supposing that review "4000" is ok, you would do:
	hg update 4000

   Test if the review is really ok. If so, you should mark it as good:
	hg bisect good

   If everything is ok, it should print something like:

	Testing changeset 4481:a53c7904e47d (944 changesets remaining, ~9 tests)
	405 files updated, 0 files merged, 8 files removed, 0 files unresolved

   The above line shows that Mercurial selected another revision for you
   to test. Redo your tests. If this version is ok, you would do:

	hg bisect good

   otherwise, if the version is broken, you should do:

	hg bisect bad

   This should be repeated until you have an answer like:

	The first bad revision is:
	changeset:   4593:26d1ce012c5e
	user:        Someone <Someone@somewhere>
	date:        Thu Feb 31 17:52:53 2006 -0300
	summary:     This is the broken patch that we should find

   If, in the middle of the process, you need to know on what revision
      you are, you can do something like:
	hg log -r `hg id|cut -d' ' -f 1`

6. Identifying regressions with Git
   ================================

  A similar bisect procedure to identify broken patches exist on git, and it
  is used not only by LinuxTV. So, it is very important that any applied
  patch at the kernel don't break compilation, to avoid affecting the bisect
  procedures.

  There are several good texts explaining how to use bisect with git. Some
  recommended procedures can be seen at:

  http://www.kernel.org/pub/software/scm/git/docs/user-manual.html#using-bisect
  http://www.kernel.org/pub/software/scm/git/docs/git-bisect.html


7. Creating a newer driver
   =======================

   This quick HOWTO explains how to create a new driver using v4l-dvb
   tree.

   The v4l-dvb tree have a the following basic structure:
	/
	|-- Documentation
	|   |-- dvb		<== DVB drivers documentation
	|   `-- video4linux	<== V4L drivers documentation
	|-- drivers
	|   `-- media
	|       |-- common	<== Common stuff, like IR
	|       |-- dvb		<== DVB only drivers
	|       |-- radio	<== V4L Radio only drivers
	|       `-- video	<== V4L Analog TV  (plus radio and/or
	|					    DVB) drivers
	`-- include
	    |-- linux		<== V4L userspace API files
	    |   `-- dvb		<== DVB userspace API files
	    `-- media		<== V4L internal API files

   When using Mercurial trees, an additional /linux prefix should be added
   on all patches

7.1. Simple drivers
     ==============

   For very simple drivers that have only one .c and one .h file, the
   recommended way is not to create a newer directory, but keep the
   driver into an existing one.

   Assuming that the will be V4L+DVB, the better place for it to be is under
   /drivers/media/video. Assuming also that the newer driver
   will be called as "newdevice", you need to do:

   a) add at /drivers/media/video/Kconfig something like:

config VIDEO_NEWDEVICE
	tristate "newdevice driver"
	select VIDEO_V4L2
	select VIDEO_BUF
	help
	  Support for newdevice Device

	  Say Y if you own such a device and want to use it.

   b) add at /drivers/media/video/Makefile something like:

obj-$(CONFIG_VIDEO_NEWDEVICE) += newdevice.o
EXTRA_CFLAGS = -Idrivers/media/video

7.2. Bigger drivers
     ==============

   In this case, a driver will be splitted into several different source
   codes. Ideally, a source file should have up to 1000 source code
   lines. After that, you should consider splitting it into smaller files.

   In this case, assuming that the will be V4L+DVB, and that the driver
   is called "newdevice", all that is needed to add the newer driver is:

   a) create a newer dir with your driver, for example:
	/drivers/media/video/newdevice
   b) create /drivers/media/video/newdevice/Kconfig with something
      like:

config VIDEO_NEWDEVICE
	tristate "newdevice driver"
	select VIDEO_V4L2
	select VIDEO_BUF
	help
	  Support for new device Device

	  Say Y if you own such a device and want to use it.

   c) create /drivers/media/video/newdevice/Makefile with
      something like:

obj-$(CONFIG_VIDEO_NEWDEVICE) += newdevice.o
EXTRA_CFLAGS = -Idrivers/media/video

   d) Add your driver directory at /drivers/media/Makefile:

obj-$(CONFIG_VIDEO_NEWDEVICE) += newdevice/

   e) Add your driver directory at /drivers/media/Kconfig:

source "drivers/media/video/newdevice/Kconfig"

   After that, you will be able to use v4l-dvb Makefile to compile your
   driver.

   In order to test if your patch is properly compiling, you'll need to
   enable its compilation by using make menuconfig/make qconfig/make xconfig.
   After that, you can test if your patch compiles well with:

      make drivers/media        (on git)
  or
      make                      (on hg)
