soc_mediabus.c revision 81355e40826acea76274c2ef5ff7d156ff28d183
11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * soc-camera media bus helper routines
3fed21641be7b31338dcf6753ef7f8a396242a410Sergei Shtylyov *
44fce3164b84d5b014acbf5a3f57eb3650e154f5bBartlomiej Zolnierkiewicz * Copyright (C) 2009, Guennadi Liakhovetski <g.liakhovetski@gmx.de>
51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This program is free software; you can redistribute it and/or modify
71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * it under the terms of the GNU General Public License version 2 as
81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * published by the Free Software Foundation.
91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/kernel.h>
121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/module.h>
131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <media/v4l2-device.h>
151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <media/v4l2-mediabus.h>
161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <media/soc_mediabus.h>
171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MBUS_IDX(f) (V4L2_MBUS_FMT_ ## f - V4L2_MBUS_FMT_FIXED - 1)
191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic const struct soc_mbus_pixelfmt mbus_fmt[] = {
211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	[MBUS_IDX(YUYV8_2X8_LE)] = {
221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.fourcc			= V4L2_PIX_FMT_YUYV,
231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.name			= "YUYV",
241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.bits_per_sample	= 8,
251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.packing		= SOC_MBUS_PACKING_2X8_PADHI,
261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.order			= SOC_MBUS_ORDER_LE,
271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	[MBUS_IDX(YVYU8_2X8_LE)] = {
291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.fourcc			= V4L2_PIX_FMT_YVYU,
301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.name			= "YVYU",
311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.bits_per_sample	= 8,
321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.packing		= SOC_MBUS_PACKING_2X8_PADHI,
331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.order			= SOC_MBUS_ORDER_LE,
341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	[MBUS_IDX(YUYV8_2X8_BE)] = {
361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.fourcc			= V4L2_PIX_FMT_UYVY,
374fce3164b84d5b014acbf5a3f57eb3650e154f5bBartlomiej Zolnierkiewicz		.name			= "UYVY",
381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.bits_per_sample	= 8,
3988b2b32babd46cd54d2de4d17eb869aea3383e11Bartlomiej Zolnierkiewicz		.packing		= SOC_MBUS_PACKING_2X8_PADHI,
401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.order			= SOC_MBUS_ORDER_LE,
411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
4236501650ec45b1db308c3b51886044863be2d762Bartlomiej Zolnierkiewicz	[MBUS_IDX(YVYU8_2X8_BE)] = {
431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.fourcc			= V4L2_PIX_FMT_VYUY,
441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.name			= "VYUY",
454fce3164b84d5b014acbf5a3f57eb3650e154f5bBartlomiej Zolnierkiewicz		.bits_per_sample	= 8,
461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.packing		= SOC_MBUS_PACKING_2X8_PADHI,
471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.order			= SOC_MBUS_ORDER_LE,
484fce3164b84d5b014acbf5a3f57eb3650e154f5bBartlomiej Zolnierkiewicz	},
494fce3164b84d5b014acbf5a3f57eb3650e154f5bBartlomiej Zolnierkiewicz	[MBUS_IDX(RGB555_2X8_PADHI_LE)] = {
501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.fourcc			= V4L2_PIX_FMT_RGB555,
514fce3164b84d5b014acbf5a3f57eb3650e154f5bBartlomiej Zolnierkiewicz		.name			= "RGB555",
521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.bits_per_sample	= 8,
534fce3164b84d5b014acbf5a3f57eb3650e154f5bBartlomiej Zolnierkiewicz		.packing		= SOC_MBUS_PACKING_2X8_PADHI,
544fce3164b84d5b014acbf5a3f57eb3650e154f5bBartlomiej Zolnierkiewicz		.order			= SOC_MBUS_ORDER_LE,
554fce3164b84d5b014acbf5a3f57eb3650e154f5bBartlomiej Zolnierkiewicz	},
564fce3164b84d5b014acbf5a3f57eb3650e154f5bBartlomiej Zolnierkiewicz	[MBUS_IDX(RGB555_2X8_PADHI_BE)] = {
574fce3164b84d5b014acbf5a3f57eb3650e154f5bBartlomiej Zolnierkiewicz		.fourcc			= V4L2_PIX_FMT_RGB555X,
581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.name			= "RGB555X",
594fce3164b84d5b014acbf5a3f57eb3650e154f5bBartlomiej Zolnierkiewicz		.bits_per_sample	= 8,
604fce3164b84d5b014acbf5a3f57eb3650e154f5bBartlomiej Zolnierkiewicz		.packing		= SOC_MBUS_PACKING_2X8_PADHI,
614fce3164b84d5b014acbf5a3f57eb3650e154f5bBartlomiej Zolnierkiewicz		.order			= SOC_MBUS_ORDER_LE,
621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	[MBUS_IDX(RGB565_2X8_LE)] = {
641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.fourcc			= V4L2_PIX_FMT_RGB565,
651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.name			= "RGB565",
661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.bits_per_sample	= 8,
671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.packing		= SOC_MBUS_PACKING_2X8_PADHI,
681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.order			= SOC_MBUS_ORDER_LE,
691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	[MBUS_IDX(RGB565_2X8_BE)] = {
711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.fourcc			= V4L2_PIX_FMT_RGB565X,
724fce3164b84d5b014acbf5a3f57eb3650e154f5bBartlomiej Zolnierkiewicz		.name			= "RGB565X",
731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.bits_per_sample	= 8,
741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.packing		= SOC_MBUS_PACKING_2X8_PADHI,
751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.order			= SOC_MBUS_ORDER_LE,
761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	[MBUS_IDX(SBGGR8_1X8)] = {
781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.fourcc			= V4L2_PIX_FMT_SBGGR8,
791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.name			= "Bayer 8 BGGR",
801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.bits_per_sample	= 8,
811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.packing		= SOC_MBUS_PACKING_NONE,
824fce3164b84d5b014acbf5a3f57eb3650e154f5bBartlomiej Zolnierkiewicz		.order			= SOC_MBUS_ORDER_LE,
834fce3164b84d5b014acbf5a3f57eb3650e154f5bBartlomiej Zolnierkiewicz	},
844fce3164b84d5b014acbf5a3f57eb3650e154f5bBartlomiej Zolnierkiewicz	[MBUS_IDX(SBGGR10_1X10)] = {
854fce3164b84d5b014acbf5a3f57eb3650e154f5bBartlomiej Zolnierkiewicz		.fourcc			= V4L2_PIX_FMT_SBGGR10,
864fce3164b84d5b014acbf5a3f57eb3650e154f5bBartlomiej Zolnierkiewicz		.name			= "Bayer 10 BGGR",
874fce3164b84d5b014acbf5a3f57eb3650e154f5bBartlomiej Zolnierkiewicz		.bits_per_sample	= 10,
884fce3164b84d5b014acbf5a3f57eb3650e154f5bBartlomiej Zolnierkiewicz		.packing		= SOC_MBUS_PACKING_EXTEND16,
894fce3164b84d5b014acbf5a3f57eb3650e154f5bBartlomiej Zolnierkiewicz		.order			= SOC_MBUS_ORDER_LE,
904fce3164b84d5b014acbf5a3f57eb3650e154f5bBartlomiej Zolnierkiewicz	},
914fce3164b84d5b014acbf5a3f57eb3650e154f5bBartlomiej Zolnierkiewicz	[MBUS_IDX(GREY8_1X8)] = {
924fce3164b84d5b014acbf5a3f57eb3650e154f5bBartlomiej Zolnierkiewicz		.fourcc			= V4L2_PIX_FMT_GREY,
934fce3164b84d5b014acbf5a3f57eb3650e154f5bBartlomiej Zolnierkiewicz		.name			= "Grey",
944fce3164b84d5b014acbf5a3f57eb3650e154f5bBartlomiej Zolnierkiewicz		.bits_per_sample	= 8,
951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.packing		= SOC_MBUS_PACKING_NONE,
964fce3164b84d5b014acbf5a3f57eb3650e154f5bBartlomiej Zolnierkiewicz		.order			= SOC_MBUS_ORDER_LE,
974fce3164b84d5b014acbf5a3f57eb3650e154f5bBartlomiej Zolnierkiewicz	},
984fce3164b84d5b014acbf5a3f57eb3650e154f5bBartlomiej Zolnierkiewicz	[MBUS_IDX(Y10_1X10)] = {
994fce3164b84d5b014acbf5a3f57eb3650e154f5bBartlomiej Zolnierkiewicz		.fourcc			= V4L2_PIX_FMT_Y10,
1004fce3164b84d5b014acbf5a3f57eb3650e154f5bBartlomiej Zolnierkiewicz		.name			= "Grey 10bit",
1014fce3164b84d5b014acbf5a3f57eb3650e154f5bBartlomiej Zolnierkiewicz		.bits_per_sample	= 10,
1021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.packing		= SOC_MBUS_PACKING_EXTEND16,
1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.order			= SOC_MBUS_ORDER_LE,
1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	[MBUS_IDX(SBGGR10_2X8_PADHI_LE)] = {
1061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.fourcc			= V4L2_PIX_FMT_SBGGR10,
1071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.name			= "Bayer 10 BGGR",
1084fce3164b84d5b014acbf5a3f57eb3650e154f5bBartlomiej Zolnierkiewicz		.bits_per_sample	= 8,
1091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.packing		= SOC_MBUS_PACKING_2X8_PADHI,
1104fce3164b84d5b014acbf5a3f57eb3650e154f5bBartlomiej Zolnierkiewicz		.order			= SOC_MBUS_ORDER_LE,
1111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
1121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	[MBUS_IDX(SBGGR10_2X8_PADLO_LE)] = {
11326bcb879c03254545a19c6700fe5bcef6f21e7b1Bartlomiej Zolnierkiewicz		.fourcc			= V4L2_PIX_FMT_SBGGR10,
1141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.name			= "Bayer 10 BGGR",
11588b2b32babd46cd54d2de4d17eb869aea3383e11Bartlomiej Zolnierkiewicz		.bits_per_sample	= 8,
1161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.packing		= SOC_MBUS_PACKING_2X8_PADLO,
1171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.order			= SOC_MBUS_ORDER_LE,
118ac95beedf8bc97b24f9540d4da9952f07221c023Bartlomiej Zolnierkiewicz	},
1191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	[MBUS_IDX(SBGGR10_2X8_PADHI_BE)] = {
12036501650ec45b1db308c3b51886044863be2d762Bartlomiej Zolnierkiewicz		.fourcc			= V4L2_PIX_FMT_SBGGR10,
1211bee4d1dce2d76bcf0bf9565298c62666de0fa1dAlan Cox		.name			= "Bayer 10 BGGR",
12249521f97ccd3c2bf6e71a91cea8fe65d170fa4fbBartlomiej Zolnierkiewicz		.bits_per_sample	= 8,
12336501650ec45b1db308c3b51886044863be2d762Bartlomiej Zolnierkiewicz		.packing		= SOC_MBUS_PACKING_2X8_PADHI,
12449521f97ccd3c2bf6e71a91cea8fe65d170fa4fbBartlomiej Zolnierkiewicz		.order			= SOC_MBUS_ORDER_BE,
12549521f97ccd3c2bf6e71a91cea8fe65d170fa4fbBartlomiej Zolnierkiewicz	},
1261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	[MBUS_IDX(SBGGR10_2X8_PADLO_BE)] = {
1271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.fourcc			= V4L2_PIX_FMT_SBGGR10,
1281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.name			= "Bayer 10 BGGR",
1291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.bits_per_sample	= 8,
1301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.packing		= SOC_MBUS_PACKING_2X8_PADLO,
1311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.order			= SOC_MBUS_ORDER_BE,
1324fce3164b84d5b014acbf5a3f57eb3650e154f5bBartlomiej Zolnierkiewicz	},
1334fce3164b84d5b014acbf5a3f57eb3650e154f5bBartlomiej Zolnierkiewicz};
1341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldss32 soc_mbus_bytes_per_line(u32 width, const struct soc_mbus_pixelfmt *mf)
1361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
1371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	switch (mf->packing) {
1381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case SOC_MBUS_PACKING_NONE:
1391c029fd658baa2442e8e51dc9c819301cad95777Bartlomiej Zolnierkiewicz		return width * mf->bits_per_sample / 8;
1400ecdca26e556eae9668ce6de9554757dddb942efBartlomiej Zolnierkiewicz	case SOC_MBUS_PACKING_2X8_PADHI:
1411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case SOC_MBUS_PACKING_2X8_PADLO:
1420ecdca26e556eae9668ce6de9554757dddb942efBartlomiej Zolnierkiewicz	case SOC_MBUS_PACKING_EXTEND16:
1431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return width * 2;
1441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
1451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return -EINVAL;
1461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
1471c029fd658baa2442e8e51dc9c819301cad95777Bartlomiej ZolnierkiewiczEXPORT_SYMBOL(soc_mbus_bytes_per_line);
1480ecdca26e556eae9668ce6de9554757dddb942efBartlomiej Zolnierkiewicz
1491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsconst struct soc_mbus_pixelfmt *soc_mbus_get_fmtdesc(
1500ecdca26e556eae9668ce6de9554757dddb942efBartlomiej Zolnierkiewicz	enum v4l2_mbus_pixelcode code)
1511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
1521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if ((unsigned int)(code - V4L2_MBUS_FMT_FIXED) > ARRAY_SIZE(mbus_fmt))
153f01393e48c44e30f7c9a36c8b98a07b0232580feBartlomiej Zolnierkiewicz		return NULL;
1541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return mbus_fmt + code - V4L2_MBUS_FMT_FIXED - 1;
155d24ec426b3be3a011bc8568d53fea486b604a684Sergei Shtylyov}
156d24ec426b3be3a011bc8568d53fea486b604a684Sergei ShtylyovEXPORT_SYMBOL(soc_mbus_get_fmtdesc);
157d24ec426b3be3a011bc8568d53fea486b604a684Sergei Shtylyov
158f01393e48c44e30f7c9a36c8b98a07b0232580feBartlomiej Zolnierkiewiczstatic int __init soc_mbus_init(void)
159f01393e48c44e30f7c9a36c8b98a07b0232580feBartlomiej Zolnierkiewicz{
160f01393e48c44e30f7c9a36c8b98a07b0232580feBartlomiej Zolnierkiewicz	return 0;
161f01393e48c44e30f7c9a36c8b98a07b0232580feBartlomiej Zolnierkiewicz}
162f01393e48c44e30f7c9a36c8b98a07b0232580feBartlomiej Zolnierkiewicz
163f01393e48c44e30f7c9a36c8b98a07b0232580feBartlomiej Zolnierkiewiczstatic void __exit soc_mbus_exit(void)
1641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
1651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
1661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsmodule_init(soc_mbus_init);
1681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsmodule_exit(soc_mbus_exit);
1691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
170f3d5b34caae393f13a9486036f98c81cac1595c4Tobias OedMODULE_DESCRIPTION("soc-camera media bus interface");
1711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_AUTHOR("Guennadi Liakhovetski <g.liakhovetski@gmx.de>");
1721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_LICENSE("GPL v2");
1731c029fd658baa2442e8e51dc9c819301cad95777Bartlomiej Zolnierkiewicz