diff options
Diffstat (limited to 'extras/recipes-kernel/linux/linux-omap/media/0009-media-Media-device.patch')
-rw-r--r-- | extras/recipes-kernel/linux/linux-omap/media/0009-media-Media-device.patch | 398 |
1 files changed, 398 insertions, 0 deletions
diff --git a/extras/recipes-kernel/linux/linux-omap/media/0009-media-Media-device.patch b/extras/recipes-kernel/linux/linux-omap/media/0009-media-Media-device.patch new file mode 100644 index 00000000..d82c798e --- /dev/null +++ b/extras/recipes-kernel/linux/linux-omap/media/0009-media-Media-device.patch @@ -0,0 +1,398 @@ +From 6bfbc237b86be01ad23b836ba047e76e23cc7a00 Mon Sep 17 00:00:00 2001 +From: Laurent Pinchart <laurent.pinchart@ideasonboard.com> +Date: Wed, 9 Dec 2009 12:39:58 +0100 +Subject: [PATCH 09/43] media: Media device + +The media_device structure abstracts functions common to all kind of +media devices (v4l2, dvb, alsa, ...). It manages media entities and +offers a userspace API to discover and configure the media device +internal topology. + +Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> +--- + Documentation/ABI/testing/sysfs-bus-media | 6 ++ + Documentation/DocBook/media-entities.tmpl | 2 + + Documentation/DocBook/media.tmpl | 3 + + Documentation/DocBook/v4l/media-controller.xml | 56 +++++++++++++ + Documentation/media-framework.txt | 67 ++++++++++++++++ + drivers/media/Makefile | 2 +- + drivers/media/media-device.c | 100 ++++++++++++++++++++++++ + include/media/media-device.h | 69 ++++++++++++++++ + 8 files changed, 304 insertions(+), 1 deletions(-) + create mode 100644 Documentation/ABI/testing/sysfs-bus-media + create mode 100644 Documentation/DocBook/v4l/media-controller.xml + create mode 100644 Documentation/media-framework.txt + create mode 100644 drivers/media/media-device.c + create mode 100644 include/media/media-device.h + +diff --git a/Documentation/ABI/testing/sysfs-bus-media b/Documentation/ABI/testing/sysfs-bus-media +new file mode 100644 +index 0000000..7057e57 +--- /dev/null ++++ b/Documentation/ABI/testing/sysfs-bus-media +@@ -0,0 +1,6 @@ ++What: /sys/bus/media/devices/.../model ++Date: January 2011 ++Contact: Laurent Pinchart <laurent.pinchart@ideasonboard.com> ++ linux-media@vger.kernel.org ++Description: Contains the device model name in UTF-8. The device version is ++ is not be appended to the model name. +diff --git a/Documentation/DocBook/media-entities.tmpl b/Documentation/DocBook/media-entities.tmpl +index be34dcb..61d6f11 100644 +--- a/Documentation/DocBook/media-entities.tmpl ++++ b/Documentation/DocBook/media-entities.tmpl +@@ -321,6 +321,8 @@ + <!ENTITY sub-media-entities SYSTEM "media-entities.tmpl"> + <!ENTITY sub-media-indices SYSTEM "media-indices.tmpl"> + ++<!ENTITY sub-media-controller SYSTEM "v4l/media-controller.xml"> ++ + <!-- Function Reference --> + <!ENTITY close SYSTEM "v4l/func-close.xml"> + <!ENTITY ioctl SYSTEM "v4l/func-ioctl.xml"> +diff --git a/Documentation/DocBook/media.tmpl b/Documentation/DocBook/media.tmpl +index f11048d..73464b0 100644 +--- a/Documentation/DocBook/media.tmpl ++++ b/Documentation/DocBook/media.tmpl +@@ -106,6 +106,9 @@ Foundation. A copy of the license is included in the chapter entitled + &sub-remote_controllers; + </chapter> + </part> ++<part id="media_common"> ++&sub-media-controller; ++</part> + + &sub-fdl-appendix; + +diff --git a/Documentation/DocBook/v4l/media-controller.xml b/Documentation/DocBook/v4l/media-controller.xml +new file mode 100644 +index 0000000..253ddb4 +--- /dev/null ++++ b/Documentation/DocBook/v4l/media-controller.xml +@@ -0,0 +1,56 @@ ++<partinfo> ++ <authorgroup> ++ <author> ++ <firstname>Laurent</firstname> ++ <surname>Pinchart</surname> ++ <affiliation><address><email>laurent.pinchart@ideasonboard.com</email></address></affiliation> ++ <contrib>Initial version.</contrib> ++ </author> ++ </authorgroup> ++ <copyright> ++ <year>2010</year> ++ <holder>Laurent Pinchart</holder> ++ </copyright> ++ ++ <revhistory> ++ <!-- Put document revisions here, newest first. --> ++ <revision> ++ <revnumber>1.0.0</revnumber> ++ <date>2010-11-10</date> ++ <authorinitials>lp</authorinitials> ++ <revremark>Initial revision</revremark> ++ </revision> ++ </revhistory> ++</partinfo> ++ ++<title>Media Controller API</title> ++ ++<chapter id="media_controller"> ++ <title>Media Controller</title> ++ ++ <section id="media-controller-intro"> ++ <title>Introduction</title> ++ <para>Media devices increasingly handle multiple related functions. Many USB ++ cameras include microphones, video capture hardware can also output video, ++ or SoC camera interfaces also perform memory-to-memory operations similar to ++ video codecs.</para> ++ <para>Independent functions, even when implemented in the same hardware, can ++ be modelled as separate devices. A USB camera with a microphone will be ++ presented to userspace applications as V4L2 and ALSA capture devices. The ++ devices' relationships (when using a webcam, end-users shouldn't have to ++ manually select the associated USB microphone), while not made available ++ directly to applications by the drivers, can usually be retrieved from ++ sysfs.</para> ++ <para>With more and more advanced SoC devices being introduced, the current ++ approach will not scale. Device topologies are getting increasingly complex ++ and can't always be represented by a tree structure. Hardware blocks are ++ shared between different functions, creating dependencies between seemingly ++ unrelated devices.</para> ++ <para>Kernel abstraction APIs such as V4L2 and ALSA provide means for ++ applications to access hardware parameters. As newer hardware expose an ++ increasingly high number of those parameters, drivers need to guess what ++ applications really require based on limited information, thereby ++ implementing policies that belong to userspace.</para> ++ <para>The media controller API aims at solving those problems.</para> ++ </section> ++</chapter> +diff --git a/Documentation/media-framework.txt b/Documentation/media-framework.txt +new file mode 100644 +index 0000000..1844c3f +--- /dev/null ++++ b/Documentation/media-framework.txt +@@ -0,0 +1,67 @@ ++Linux kernel media framework ++============================ ++ ++This document describes the Linux kernel media framework, its data structures, ++functions and their usage. ++ ++ ++Introduction ++------------ ++ ++The media controller API is documented in DocBook format in ++Documentation/DocBook/v4l/media-controller.xml. This document will focus on ++the kernel-side implementation of the media framework. ++ ++ ++Media device ++------------ ++ ++A media device is represented by a struct media_device instance, defined in ++include/media/media-device.h. Allocation of the structure is handled by the ++media device driver, usually by embedding the media_device instance in a ++larger driver-specific structure. ++ ++Drivers register media device instances by calling ++ ++ media_device_register(struct media_device *mdev); ++ ++The caller is responsible for initializing the media_device structure before ++registration. The following fields must be set: ++ ++ - dev must point to the parent device (usually a pci_dev, usb_interface or ++ platform_device instance). ++ ++ - model must be filled with the device model name as a NUL-terminated UTF-8 ++ string. The device/model revision must not be stored in this field. ++ ++The following fields are optional: ++ ++ - serial is a unique serial number stored as a NUL-terminated ASCII string. ++ The field is big enough to store a GUID in text form. If the hardware ++ doesn't provide a unique serial number this field must be left empty. ++ ++ - bus_info represents the location of the device in the system as a ++ NUL-terminated ASCII string. For PCI/PCIe devices bus_info must be set to ++ "PCI:" (or "PCIe:") followed by the value of pci_name(). For USB devices, ++ the usb_make_path() function must be used. This field is used by ++ applications to distinguish between otherwise identical devices that don't ++ provide a serial number. ++ ++ - hw_revision is the hardware device revision in a driver-specific format. ++ When possible the revision should be formatted with the KERNEL_VERSION ++ macro. ++ ++ - driver_version is formatted with the KERNEL_VERSION macro. The version ++ minor must be incremented when new features are added to the userspace API ++ without breaking binary compatibility. The version major must be ++ incremented when binary compatibility is broken. ++ ++Upon successful registration a character device named media[0-9]+ is created. ++The device major and minor numbers are dynamic. The model name is exported as ++a sysfs attribute. ++ ++Drivers unregister media device instances by calling ++ ++ media_device_unregister(struct media_device *mdev); ++ ++Unregistering a media device that hasn't been registered is *NOT* safe. +diff --git a/drivers/media/Makefile b/drivers/media/Makefile +index 3a08991..019d3e0 100644 +--- a/drivers/media/Makefile ++++ b/drivers/media/Makefile +@@ -2,7 +2,7 @@ + # Makefile for the kernel multimedia device drivers. + # + +-media-objs := media-devnode.o ++media-objs := media-device.o media-devnode.o + + ifeq ($(CONFIG_MEDIA_CONTROLLER),y) + obj-$(CONFIG_MEDIA_SUPPORT) += media.o +diff --git a/drivers/media/media-device.c b/drivers/media/media-device.c +new file mode 100644 +index 0000000..57a9c6b +--- /dev/null ++++ b/drivers/media/media-device.c +@@ -0,0 +1,100 @@ ++/* ++ * Media device ++ * ++ * Copyright (C) 2010 Nokia Corporation ++ * ++ * Contacts: Laurent Pinchart <laurent.pinchart@ideasonboard.com> ++ * Sakari Ailus <sakari.ailus@maxwell.research.nokia.com> ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ++ */ ++ ++#include <linux/types.h> ++#include <linux/ioctl.h> ++ ++#include <media/media-device.h> ++#include <media/media-devnode.h> ++ ++static const struct media_file_operations media_device_fops = { ++ .owner = THIS_MODULE, ++}; ++ ++/* ----------------------------------------------------------------------------- ++ * sysfs ++ */ ++ ++static ssize_t show_model(struct device *cd, ++ struct device_attribute *attr, char *buf) ++{ ++ struct media_device *mdev = to_media_device(to_media_devnode(cd)); ++ ++ return sprintf(buf, "%.*s\n", (int)sizeof(mdev->model), mdev->model); ++} ++ ++static DEVICE_ATTR(model, S_IRUGO, show_model, NULL); ++ ++/* ----------------------------------------------------------------------------- ++ * Registration/unregistration ++ */ ++ ++static void media_device_release(struct media_devnode *mdev) ++{ ++} ++ ++/** ++ * media_device_register - register a media device ++ * @mdev: The media device ++ * ++ * The caller is responsible for initializing the media device before ++ * registration. The following fields must be set: ++ * ++ * - dev must point to the parent device ++ * - model must be filled with the device model name ++ */ ++int __must_check media_device_register(struct media_device *mdev) ++{ ++ int ret; ++ ++ if (WARN_ON(mdev->dev == NULL || mdev->model[0] == 0)) ++ return -EINVAL; ++ ++ /* Register the device node. */ ++ mdev->devnode.fops = &media_device_fops; ++ mdev->devnode.parent = mdev->dev; ++ mdev->devnode.release = media_device_release; ++ ret = media_devnode_register(&mdev->devnode); ++ if (ret < 0) ++ return ret; ++ ++ ret = device_create_file(&mdev->devnode.dev, &dev_attr_model); ++ if (ret < 0) { ++ media_devnode_unregister(&mdev->devnode); ++ return ret; ++ } ++ ++ return 0; ++} ++EXPORT_SYMBOL_GPL(media_device_register); ++ ++/** ++ * media_device_unregister - unregister a media device ++ * @mdev: The media device ++ * ++ */ ++void media_device_unregister(struct media_device *mdev) ++{ ++ device_remove_file(&mdev->devnode.dev, &dev_attr_model); ++ media_devnode_unregister(&mdev->devnode); ++} ++EXPORT_SYMBOL_GPL(media_device_unregister); +diff --git a/include/media/media-device.h b/include/media/media-device.h +new file mode 100644 +index 0000000..e11f01a +--- /dev/null ++++ b/include/media/media-device.h +@@ -0,0 +1,69 @@ ++/* ++ * Media device ++ * ++ * Copyright (C) 2010 Nokia Corporation ++ * ++ * Contacts: Laurent Pinchart <laurent.pinchart@ideasonboard.com> ++ * Sakari Ailus <sakari.ailus@maxwell.research.nokia.com> ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ++ */ ++ ++#ifndef _MEDIA_DEVICE_H ++#define _MEDIA_DEVICE_H ++ ++#include <linux/device.h> ++#include <linux/list.h> ++ ++#include <media/media-devnode.h> ++ ++/** ++ * struct media_device - Media device ++ * @dev: Parent device ++ * @devnode: Media device node ++ * @model: Device model name ++ * @serial: Device serial number (optional) ++ * @bus_info: Unique and stable device location identifier ++ * @hw_revision: Hardware device revision ++ * @driver_version: Device driver version ++ * ++ * This structure represents an abstract high-level media device. It allows easy ++ * access to entities and provides basic media device-level support. The ++ * structure can be allocated directly or embedded in a larger structure. ++ * ++ * The parent @dev is a physical device. It must be set before registering the ++ * media device. ++ * ++ * @model is a descriptive model name exported through sysfs. It doesn't have to ++ * be unique. ++ */ ++struct media_device { ++ /* dev->driver_data points to this struct. */ ++ struct device *dev; ++ struct media_devnode devnode; ++ ++ char model[32]; ++ char serial[40]; ++ char bus_info[32]; ++ u32 hw_revision; ++ u32 driver_version; ++}; ++ ++/* media_devnode to media_device */ ++#define to_media_device(node) container_of(node, struct media_device, devnode) ++ ++int __must_check media_device_register(struct media_device *mdev); ++void media_device_unregister(struct media_device *mdev); ++ ++#endif +-- +1.6.6.1 + |