19a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski/*
29a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski * soc-camera media bus helper routines
39a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski *
49a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski * Copyright (C) 2009, Guennadi Liakhovetski <g.liakhovetski@gmx.de>
59a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski *
69a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski * This program is free software; you can redistribute it and/or modify
79a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski * it under the terms of the GNU General Public License version 2 as
89a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski * published by the Free Software Foundation.
99a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski */
109a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski
119a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski#include <linux/kernel.h>
129a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski#include <linux/module.h>
139a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski
149a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski#include <media/v4l2-device.h>
159a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski#include <media/v4l2-mediabus.h>
169a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski#include <media/soc_mediabus.h>
179a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski
1893f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetskistatic const struct soc_mbus_lookup mbus_fmt[] = {
1993f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski{
2093f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski	.code = V4L2_MBUS_FMT_YUYV8_2X8,
2193f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski	.fmt = {
229a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		.fourcc			= V4L2_PIX_FMT_YUYV,
239a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		.name			= "YUYV",
249a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		.bits_per_sample	= 8,
259a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		.packing		= SOC_MBUS_PACKING_2X8_PADHI,
269a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		.order			= SOC_MBUS_ORDER_LE,
2781355e40826acea76274c2ef5ff7d156ff28d183Guennadi Liakhovetski	},
2893f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski}, {
2993f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski	.code = V4L2_MBUS_FMT_YVYU8_2X8,
3093f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski	.fmt = {
319a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		.fourcc			= V4L2_PIX_FMT_YVYU,
329a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		.name			= "YVYU",
339a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		.bits_per_sample	= 8,
349a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		.packing		= SOC_MBUS_PACKING_2X8_PADHI,
359a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		.order			= SOC_MBUS_ORDER_LE,
3681355e40826acea76274c2ef5ff7d156ff28d183Guennadi Liakhovetski	},
3793f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski}, {
3893f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski	.code = V4L2_MBUS_FMT_UYVY8_2X8,
3993f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski	.fmt = {
409a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		.fourcc			= V4L2_PIX_FMT_UYVY,
419a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		.name			= "UYVY",
429a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		.bits_per_sample	= 8,
439a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		.packing		= SOC_MBUS_PACKING_2X8_PADHI,
449a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		.order			= SOC_MBUS_ORDER_LE,
4581355e40826acea76274c2ef5ff7d156ff28d183Guennadi Liakhovetski	},
4693f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski}, {
4793f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski	.code = V4L2_MBUS_FMT_VYUY8_2X8,
4893f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski	.fmt = {
499a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		.fourcc			= V4L2_PIX_FMT_VYUY,
509a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		.name			= "VYUY",
519a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		.bits_per_sample	= 8,
529a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		.packing		= SOC_MBUS_PACKING_2X8_PADHI,
539a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		.order			= SOC_MBUS_ORDER_LE,
5481355e40826acea76274c2ef5ff7d156ff28d183Guennadi Liakhovetski	},
5593f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski}, {
5693f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski	.code = V4L2_MBUS_FMT_RGB555_2X8_PADHI_LE,
5793f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski	.fmt = {
589a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		.fourcc			= V4L2_PIX_FMT_RGB555,
599a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		.name			= "RGB555",
609a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		.bits_per_sample	= 8,
619a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		.packing		= SOC_MBUS_PACKING_2X8_PADHI,
629a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		.order			= SOC_MBUS_ORDER_LE,
6381355e40826acea76274c2ef5ff7d156ff28d183Guennadi Liakhovetski	},
6493f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski}, {
6593f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski	.code = V4L2_MBUS_FMT_RGB555_2X8_PADHI_BE,
6693f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski	.fmt = {
679a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		.fourcc			= V4L2_PIX_FMT_RGB555X,
689a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		.name			= "RGB555X",
699a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		.bits_per_sample	= 8,
709a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		.packing		= SOC_MBUS_PACKING_2X8_PADHI,
719a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		.order			= SOC_MBUS_ORDER_LE,
7281355e40826acea76274c2ef5ff7d156ff28d183Guennadi Liakhovetski	},
7393f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski}, {
7493f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski	.code = V4L2_MBUS_FMT_RGB565_2X8_LE,
7593f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski	.fmt = {
769a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		.fourcc			= V4L2_PIX_FMT_RGB565,
779a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		.name			= "RGB565",
789a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		.bits_per_sample	= 8,
799a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		.packing		= SOC_MBUS_PACKING_2X8_PADHI,
809a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		.order			= SOC_MBUS_ORDER_LE,
8181355e40826acea76274c2ef5ff7d156ff28d183Guennadi Liakhovetski	},
8293f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski}, {
8393f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski	.code = V4L2_MBUS_FMT_RGB565_2X8_BE,
8493f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski	.fmt = {
859a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		.fourcc			= V4L2_PIX_FMT_RGB565X,
869a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		.name			= "RGB565X",
879a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		.bits_per_sample	= 8,
889a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		.packing		= SOC_MBUS_PACKING_2X8_PADHI,
899a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		.order			= SOC_MBUS_ORDER_LE,
9081355e40826acea76274c2ef5ff7d156ff28d183Guennadi Liakhovetski	},
9193f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski}, {
9293f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski	.code = V4L2_MBUS_FMT_SBGGR8_1X8,
9393f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski	.fmt = {
949a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		.fourcc			= V4L2_PIX_FMT_SBGGR8,
959a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		.name			= "Bayer 8 BGGR",
969a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		.bits_per_sample	= 8,
979a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		.packing		= SOC_MBUS_PACKING_NONE,
989a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		.order			= SOC_MBUS_ORDER_LE,
9981355e40826acea76274c2ef5ff7d156ff28d183Guennadi Liakhovetski	},
10093f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski}, {
10193f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski	.code = V4L2_MBUS_FMT_SBGGR10_1X10,
10293f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski	.fmt = {
1039a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		.fourcc			= V4L2_PIX_FMT_SBGGR10,
1049a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		.name			= "Bayer 10 BGGR",
1059a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		.bits_per_sample	= 10,
1069a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		.packing		= SOC_MBUS_PACKING_EXTEND16,
1079a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		.order			= SOC_MBUS_ORDER_LE,
10881355e40826acea76274c2ef5ff7d156ff28d183Guennadi Liakhovetski	},
10993f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski}, {
11093f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski	.code = V4L2_MBUS_FMT_Y8_1X8,
11193f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski	.fmt = {
1129a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		.fourcc			= V4L2_PIX_FMT_GREY,
1139a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		.name			= "Grey",
1149a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		.bits_per_sample	= 8,
1159a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		.packing		= SOC_MBUS_PACKING_NONE,
1169a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		.order			= SOC_MBUS_ORDER_LE,
11781355e40826acea76274c2ef5ff7d156ff28d183Guennadi Liakhovetski	},
11893f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski}, {
11993f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski	.code = V4L2_MBUS_FMT_Y10_1X10,
12093f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski	.fmt = {
1219a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		.fourcc			= V4L2_PIX_FMT_Y10,
1229a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		.name			= "Grey 10bit",
1239a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		.bits_per_sample	= 10,
1249a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		.packing		= SOC_MBUS_PACKING_EXTEND16,
1259a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		.order			= SOC_MBUS_ORDER_LE,
12681355e40826acea76274c2ef5ff7d156ff28d183Guennadi Liakhovetski	},
12793f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski}, {
12893f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski	.code = V4L2_MBUS_FMT_SBGGR10_2X8_PADHI_LE,
12993f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski	.fmt = {
1309a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		.fourcc			= V4L2_PIX_FMT_SBGGR10,
1319a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		.name			= "Bayer 10 BGGR",
1329a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		.bits_per_sample	= 8,
1339a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		.packing		= SOC_MBUS_PACKING_2X8_PADHI,
1349a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		.order			= SOC_MBUS_ORDER_LE,
13581355e40826acea76274c2ef5ff7d156ff28d183Guennadi Liakhovetski	},
13693f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski}, {
13793f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski	.code = V4L2_MBUS_FMT_SBGGR10_2X8_PADLO_LE,
13893f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski	.fmt = {
1399a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		.fourcc			= V4L2_PIX_FMT_SBGGR10,
1409a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		.name			= "Bayer 10 BGGR",
1419a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		.bits_per_sample	= 8,
1429a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		.packing		= SOC_MBUS_PACKING_2X8_PADLO,
1439a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		.order			= SOC_MBUS_ORDER_LE,
14481355e40826acea76274c2ef5ff7d156ff28d183Guennadi Liakhovetski	},
14593f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski}, {
14693f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski	.code = V4L2_MBUS_FMT_SBGGR10_2X8_PADHI_BE,
14793f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski	.fmt = {
1489a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		.fourcc			= V4L2_PIX_FMT_SBGGR10,
1499a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		.name			= "Bayer 10 BGGR",
1509a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		.bits_per_sample	= 8,
1519a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		.packing		= SOC_MBUS_PACKING_2X8_PADHI,
1529a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		.order			= SOC_MBUS_ORDER_BE,
15381355e40826acea76274c2ef5ff7d156ff28d183Guennadi Liakhovetski	},
15493f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski}, {
15593f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski	.code = V4L2_MBUS_FMT_SBGGR10_2X8_PADLO_BE,
15693f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski	.fmt = {
1579a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		.fourcc			= V4L2_PIX_FMT_SBGGR10,
1589a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		.name			= "Bayer 10 BGGR",
1599a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		.bits_per_sample	= 8,
1609a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		.packing		= SOC_MBUS_PACKING_2X8_PADLO,
1619a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		.order			= SOC_MBUS_ORDER_BE,
1629a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski	},
16393f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski}, {
16493f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski	.code = V4L2_MBUS_FMT_JPEG_1X8,
16593f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski	.fmt = {
16664149deb6a9ec35cc8a3ac3e7b5bc19d4a79ff44Kassey Li		.fourcc                 = V4L2_PIX_FMT_JPEG,
16764149deb6a9ec35cc8a3ac3e7b5bc19d4a79ff44Kassey Li		.name                   = "JPEG",
16864149deb6a9ec35cc8a3ac3e7b5bc19d4a79ff44Kassey Li		.bits_per_sample        = 8,
16964149deb6a9ec35cc8a3ac3e7b5bc19d4a79ff44Kassey Li		.packing                = SOC_MBUS_PACKING_VARIABLE,
17064149deb6a9ec35cc8a3ac3e7b5bc19d4a79ff44Kassey Li		.order                  = SOC_MBUS_ORDER_LE,
17164149deb6a9ec35cc8a3ac3e7b5bc19d4a79ff44Kassey Li	},
172e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski}, {
173e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski	.code = V4L2_MBUS_FMT_RGB444_2X8_PADHI_BE,
174e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski	.fmt = {
175e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski		.fourcc			= V4L2_PIX_FMT_RGB444,
176e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski		.name			= "RGB444",
177e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski		.bits_per_sample	= 8,
178e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski		.packing		= SOC_MBUS_PACKING_2X8_PADHI,
179e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski		.order			= SOC_MBUS_ORDER_BE,
180e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski	},
181e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski}, {
182e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski	.code = V4L2_MBUS_FMT_YUYV8_1_5X8,
183e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski	.fmt = {
184e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski		.fourcc			= V4L2_PIX_FMT_YUV420,
185e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski		.name			= "YUYV 4:2:0",
186e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski		.bits_per_sample	= 8,
187e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski		.packing		= SOC_MBUS_PACKING_1_5X8,
188e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski		.order			= SOC_MBUS_ORDER_LE,
189e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski	},
190e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski}, {
191e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski	.code = V4L2_MBUS_FMT_YVYU8_1_5X8,
192e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski	.fmt = {
193e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski		.fourcc			= V4L2_PIX_FMT_YVU420,
194e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski		.name			= "YVYU 4:2:0",
195e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski		.bits_per_sample	= 8,
196e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski		.packing		= SOC_MBUS_PACKING_1_5X8,
197e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski		.order			= SOC_MBUS_ORDER_LE,
198e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski	},
199e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski}, {
200e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski	.code = V4L2_MBUS_FMT_UYVY8_1X16,
201e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski	.fmt = {
202e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski		.fourcc			= V4L2_PIX_FMT_UYVY,
203e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski		.name			= "UYVY 16bit",
204e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski		.bits_per_sample	= 16,
205e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski		.packing		= SOC_MBUS_PACKING_EXTEND16,
206e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski		.order			= SOC_MBUS_ORDER_LE,
207e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski	},
208e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski}, {
209e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski	.code = V4L2_MBUS_FMT_VYUY8_1X16,
210e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski	.fmt = {
211e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski		.fourcc			= V4L2_PIX_FMT_VYUY,
212e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski		.name			= "VYUY 16bit",
213e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski		.bits_per_sample	= 16,
214e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski		.packing		= SOC_MBUS_PACKING_EXTEND16,
215e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski		.order			= SOC_MBUS_ORDER_LE,
216e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski	},
217e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski}, {
218e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski	.code = V4L2_MBUS_FMT_YUYV8_1X16,
219e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski	.fmt = {
220e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski		.fourcc			= V4L2_PIX_FMT_YUYV,
221e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski		.name			= "YUYV 16bit",
222e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski		.bits_per_sample	= 16,
223e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski		.packing		= SOC_MBUS_PACKING_EXTEND16,
224e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski		.order			= SOC_MBUS_ORDER_LE,
225e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski	},
226e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski}, {
227e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski	.code = V4L2_MBUS_FMT_YVYU8_1X16,
228e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski	.fmt = {
229e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski		.fourcc			= V4L2_PIX_FMT_YVYU,
230e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski		.name			= "YVYU 16bit",
231e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski		.bits_per_sample	= 16,
232e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski		.packing		= SOC_MBUS_PACKING_EXTEND16,
233e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski		.order			= SOC_MBUS_ORDER_LE,
234e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski	},
235e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski}, {
236e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski	.code = V4L2_MBUS_FMT_SGRBG8_1X8,
237e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski	.fmt = {
238e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski		.fourcc			= V4L2_PIX_FMT_SGRBG8,
239e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski		.name			= "Bayer 8 GRBG",
240e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski		.bits_per_sample	= 8,
241e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski		.packing		= SOC_MBUS_PACKING_NONE,
242e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski		.order			= SOC_MBUS_ORDER_LE,
243e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski	},
244e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski}, {
245e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski	.code = V4L2_MBUS_FMT_SGRBG10_DPCM8_1X8,
246e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski	.fmt = {
247e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski		.fourcc			= V4L2_PIX_FMT_SGRBG10DPCM8,
248e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski		.name			= "Bayer 10 BGGR DPCM 8",
249e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski		.bits_per_sample	= 8,
250e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski		.packing		= SOC_MBUS_PACKING_NONE,
251e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski		.order			= SOC_MBUS_ORDER_LE,
252e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski	},
253e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski}, {
254e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski	.code = V4L2_MBUS_FMT_SGBRG10_1X10,
255e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski	.fmt = {
256e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski		.fourcc			= V4L2_PIX_FMT_SGBRG10,
257e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski		.name			= "Bayer 10 GBRG",
258e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski		.bits_per_sample	= 10,
259e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski		.packing		= SOC_MBUS_PACKING_EXTEND16,
260e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski		.order			= SOC_MBUS_ORDER_LE,
261e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski	},
262e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski}, {
263e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski	.code = V4L2_MBUS_FMT_SGRBG10_1X10,
264e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski	.fmt = {
265e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski		.fourcc			= V4L2_PIX_FMT_SGRBG10,
266e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski		.name			= "Bayer 10 GRBG",
267e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski		.bits_per_sample	= 10,
268e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski		.packing		= SOC_MBUS_PACKING_EXTEND16,
269e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski		.order			= SOC_MBUS_ORDER_LE,
270e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski	},
271e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski}, {
272e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski	.code = V4L2_MBUS_FMT_SRGGB10_1X10,
273e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski	.fmt = {
274e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski		.fourcc			= V4L2_PIX_FMT_SRGGB10,
275e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski		.name			= "Bayer 10 RGGB",
276e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski		.bits_per_sample	= 10,
277e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski		.packing		= SOC_MBUS_PACKING_EXTEND16,
278e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski		.order			= SOC_MBUS_ORDER_LE,
279e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski	},
280e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski}, {
281e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski	.code = V4L2_MBUS_FMT_SBGGR12_1X12,
282e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski	.fmt = {
283e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski		.fourcc			= V4L2_PIX_FMT_SBGGR12,
284e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski		.name			= "Bayer 12 BGGR",
285e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski		.bits_per_sample	= 12,
286e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski		.packing		= SOC_MBUS_PACKING_EXTEND16,
287e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski		.order			= SOC_MBUS_ORDER_LE,
288e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski	},
289e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski}, {
290e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski	.code = V4L2_MBUS_FMT_SGBRG12_1X12,
291e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski	.fmt = {
292e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski		.fourcc			= V4L2_PIX_FMT_SGBRG12,
293e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski		.name			= "Bayer 12 GBRG",
294e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski		.bits_per_sample	= 12,
295e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski		.packing		= SOC_MBUS_PACKING_EXTEND16,
296e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski		.order			= SOC_MBUS_ORDER_LE,
297e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski	},
298e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski}, {
299e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski	.code = V4L2_MBUS_FMT_SGRBG12_1X12,
300e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski	.fmt = {
301e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski		.fourcc			= V4L2_PIX_FMT_SGRBG12,
302e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski		.name			= "Bayer 12 GRBG",
303e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski		.bits_per_sample	= 12,
304e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski		.packing		= SOC_MBUS_PACKING_EXTEND16,
305e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski		.order			= SOC_MBUS_ORDER_LE,
306e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski	},
307e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski}, {
308e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski	.code = V4L2_MBUS_FMT_SRGGB12_1X12,
309e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski	.fmt = {
310e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski		.fourcc			= V4L2_PIX_FMT_SRGGB12,
311e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski		.name			= "Bayer 12 RGGB",
312e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski		.bits_per_sample	= 12,
313e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski		.packing		= SOC_MBUS_PACKING_EXTEND16,
314e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski		.order			= SOC_MBUS_ORDER_LE,
315e23b961dd1206aceaad28233212f3d506595432fGuennadi Liakhovetski	},
31693f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski},
3179a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski};
3189a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski
319cc552b620fa3a184ba3d4064223ca1d59325b166Guennadi Liakhovetskiint soc_mbus_samples_per_pixel(const struct soc_mbus_pixelfmt *mf,
320cc552b620fa3a184ba3d4064223ca1d59325b166Guennadi Liakhovetski			unsigned int *numerator, unsigned int *denominator)
32148a3c77338d725d4976fa792d822eb940ce5c296Alberto Panizzo{
32248a3c77338d725d4976fa792d822eb940ce5c296Alberto Panizzo	switch (mf->packing) {
32348a3c77338d725d4976fa792d822eb940ce5c296Alberto Panizzo	case SOC_MBUS_PACKING_NONE:
32448a3c77338d725d4976fa792d822eb940ce5c296Alberto Panizzo	case SOC_MBUS_PACKING_EXTEND16:
325cc552b620fa3a184ba3d4064223ca1d59325b166Guennadi Liakhovetski		*numerator = 1;
326cc552b620fa3a184ba3d4064223ca1d59325b166Guennadi Liakhovetski		*denominator = 1;
327cc552b620fa3a184ba3d4064223ca1d59325b166Guennadi Liakhovetski		return 0;
32848a3c77338d725d4976fa792d822eb940ce5c296Alberto Panizzo	case SOC_MBUS_PACKING_2X8_PADHI:
32948a3c77338d725d4976fa792d822eb940ce5c296Alberto Panizzo	case SOC_MBUS_PACKING_2X8_PADLO:
330cc552b620fa3a184ba3d4064223ca1d59325b166Guennadi Liakhovetski		*numerator = 2;
331cc552b620fa3a184ba3d4064223ca1d59325b166Guennadi Liakhovetski		*denominator = 1;
332cc552b620fa3a184ba3d4064223ca1d59325b166Guennadi Liakhovetski		return 0;
333cc552b620fa3a184ba3d4064223ca1d59325b166Guennadi Liakhovetski	case SOC_MBUS_PACKING_1_5X8:
334cc552b620fa3a184ba3d4064223ca1d59325b166Guennadi Liakhovetski		*numerator = 3;
335cc552b620fa3a184ba3d4064223ca1d59325b166Guennadi Liakhovetski		*denominator = 2;
336cc552b620fa3a184ba3d4064223ca1d59325b166Guennadi Liakhovetski		return 0;
33764149deb6a9ec35cc8a3ac3e7b5bc19d4a79ff44Kassey Li	case SOC_MBUS_PACKING_VARIABLE:
338cc552b620fa3a184ba3d4064223ca1d59325b166Guennadi Liakhovetski		*numerator = 0;
339cc552b620fa3a184ba3d4064223ca1d59325b166Guennadi Liakhovetski		*denominator = 1;
34064149deb6a9ec35cc8a3ac3e7b5bc19d4a79ff44Kassey Li		return 0;
34148a3c77338d725d4976fa792d822eb940ce5c296Alberto Panizzo	}
34248a3c77338d725d4976fa792d822eb940ce5c296Alberto Panizzo	return -EINVAL;
34348a3c77338d725d4976fa792d822eb940ce5c296Alberto Panizzo}
34448a3c77338d725d4976fa792d822eb940ce5c296Alberto PanizzoEXPORT_SYMBOL(soc_mbus_samples_per_pixel);
34548a3c77338d725d4976fa792d822eb940ce5c296Alberto Panizzo
3469a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetskis32 soc_mbus_bytes_per_line(u32 width, const struct soc_mbus_pixelfmt *mf)
3479a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski{
3489a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski	switch (mf->packing) {
3499a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski	case SOC_MBUS_PACKING_NONE:
3509a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		return width * mf->bits_per_sample / 8;
3519a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski	case SOC_MBUS_PACKING_2X8_PADHI:
3529a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski	case SOC_MBUS_PACKING_2X8_PADLO:
3539a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski	case SOC_MBUS_PACKING_EXTEND16:
3549a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		return width * 2;
355cc552b620fa3a184ba3d4064223ca1d59325b166Guennadi Liakhovetski	case SOC_MBUS_PACKING_1_5X8:
356cc552b620fa3a184ba3d4064223ca1d59325b166Guennadi Liakhovetski		return width * 3 / 2;
35764149deb6a9ec35cc8a3ac3e7b5bc19d4a79ff44Kassey Li	case SOC_MBUS_PACKING_VARIABLE:
35864149deb6a9ec35cc8a3ac3e7b5bc19d4a79ff44Kassey Li		return 0;
3599a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski	}
3609a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski	return -EINVAL;
3619a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski}
3629a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi LiakhovetskiEXPORT_SYMBOL(soc_mbus_bytes_per_line);
3639a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski
36493f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetskiconst struct soc_mbus_pixelfmt *soc_mbus_find_fmtdesc(
36593f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski	enum v4l2_mbus_pixelcode code,
36693f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski	const struct soc_mbus_lookup *lookup,
36793f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski	int n)
36893f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski{
36993f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski	int i;
37093f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski
37193f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski	for (i = 0; i < n; i++)
37293f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski		if (lookup[i].code == code)
37393f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski			return &lookup[i].fmt;
37493f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski
37593f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski	return NULL;
37693f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski}
37793f116d595e9aa7dca5f6507376d6995f217d420Guennadi LiakhovetskiEXPORT_SYMBOL(soc_mbus_find_fmtdesc);
37893f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski
3799a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetskiconst struct soc_mbus_pixelfmt *soc_mbus_get_fmtdesc(
3809a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski	enum v4l2_mbus_pixelcode code)
3819a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski{
38293f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski	return soc_mbus_find_fmtdesc(code, mbus_fmt, ARRAY_SIZE(mbus_fmt));
3839a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski}
3849a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi LiakhovetskiEXPORT_SYMBOL(soc_mbus_get_fmtdesc);
3859a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski
38632c69fcc785a2f8122c73d44ad160d9cfc4c9615Guennadi Liakhovetskiunsigned int soc_mbus_config_compatible(const struct v4l2_mbus_config *cfg,
38732c69fcc785a2f8122c73d44ad160d9cfc4c9615Guennadi Liakhovetski					unsigned int flags)
38832c69fcc785a2f8122c73d44ad160d9cfc4c9615Guennadi Liakhovetski{
38932c69fcc785a2f8122c73d44ad160d9cfc4c9615Guennadi Liakhovetski	unsigned long common_flags;
39032c69fcc785a2f8122c73d44ad160d9cfc4c9615Guennadi Liakhovetski	bool hsync = true, vsync = true, pclk, data, mode;
39132c69fcc785a2f8122c73d44ad160d9cfc4c9615Guennadi Liakhovetski	bool mipi_lanes, mipi_clock;
39232c69fcc785a2f8122c73d44ad160d9cfc4c9615Guennadi Liakhovetski
39332c69fcc785a2f8122c73d44ad160d9cfc4c9615Guennadi Liakhovetski	common_flags = cfg->flags & flags;
39432c69fcc785a2f8122c73d44ad160d9cfc4c9615Guennadi Liakhovetski
39532c69fcc785a2f8122c73d44ad160d9cfc4c9615Guennadi Liakhovetski	switch (cfg->type) {
39632c69fcc785a2f8122c73d44ad160d9cfc4c9615Guennadi Liakhovetski	case V4L2_MBUS_PARALLEL:
39732c69fcc785a2f8122c73d44ad160d9cfc4c9615Guennadi Liakhovetski		hsync = common_flags & (V4L2_MBUS_HSYNC_ACTIVE_HIGH |
39832c69fcc785a2f8122c73d44ad160d9cfc4c9615Guennadi Liakhovetski					V4L2_MBUS_HSYNC_ACTIVE_LOW);
39932c69fcc785a2f8122c73d44ad160d9cfc4c9615Guennadi Liakhovetski		vsync = common_flags & (V4L2_MBUS_VSYNC_ACTIVE_HIGH |
40032c69fcc785a2f8122c73d44ad160d9cfc4c9615Guennadi Liakhovetski					V4L2_MBUS_VSYNC_ACTIVE_LOW);
40132c69fcc785a2f8122c73d44ad160d9cfc4c9615Guennadi Liakhovetski	case V4L2_MBUS_BT656:
40232c69fcc785a2f8122c73d44ad160d9cfc4c9615Guennadi Liakhovetski		pclk = common_flags & (V4L2_MBUS_PCLK_SAMPLE_RISING |
40332c69fcc785a2f8122c73d44ad160d9cfc4c9615Guennadi Liakhovetski				       V4L2_MBUS_PCLK_SAMPLE_FALLING);
40432c69fcc785a2f8122c73d44ad160d9cfc4c9615Guennadi Liakhovetski		data = common_flags & (V4L2_MBUS_DATA_ACTIVE_HIGH |
40532c69fcc785a2f8122c73d44ad160d9cfc4c9615Guennadi Liakhovetski				       V4L2_MBUS_DATA_ACTIVE_LOW);
40632c69fcc785a2f8122c73d44ad160d9cfc4c9615Guennadi Liakhovetski		mode = common_flags & (V4L2_MBUS_MASTER | V4L2_MBUS_SLAVE);
40732c69fcc785a2f8122c73d44ad160d9cfc4c9615Guennadi Liakhovetski		return (!hsync || !vsync || !pclk || !data || !mode) ?
40832c69fcc785a2f8122c73d44ad160d9cfc4c9615Guennadi Liakhovetski			0 : common_flags;
40932c69fcc785a2f8122c73d44ad160d9cfc4c9615Guennadi Liakhovetski	case V4L2_MBUS_CSI2:
41032c69fcc785a2f8122c73d44ad160d9cfc4c9615Guennadi Liakhovetski		mipi_lanes = common_flags & V4L2_MBUS_CSI2_LANES;
41132c69fcc785a2f8122c73d44ad160d9cfc4c9615Guennadi Liakhovetski		mipi_clock = common_flags & (V4L2_MBUS_CSI2_NONCONTINUOUS_CLOCK |
41232c69fcc785a2f8122c73d44ad160d9cfc4c9615Guennadi Liakhovetski					     V4L2_MBUS_CSI2_CONTINUOUS_CLOCK);
41332c69fcc785a2f8122c73d44ad160d9cfc4c9615Guennadi Liakhovetski		return (!mipi_lanes || !mipi_clock) ? 0 : common_flags;
41432c69fcc785a2f8122c73d44ad160d9cfc4c9615Guennadi Liakhovetski	}
41532c69fcc785a2f8122c73d44ad160d9cfc4c9615Guennadi Liakhovetski	return 0;
41632c69fcc785a2f8122c73d44ad160d9cfc4c9615Guennadi Liakhovetski}
41732c69fcc785a2f8122c73d44ad160d9cfc4c9615Guennadi LiakhovetskiEXPORT_SYMBOL(soc_mbus_config_compatible);
41832c69fcc785a2f8122c73d44ad160d9cfc4c9615Guennadi Liakhovetski
4199a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetskistatic int __init soc_mbus_init(void)
4209a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski{
4219a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski	return 0;
4229a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski}
4239a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski
4249a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetskistatic void __exit soc_mbus_exit(void)
4259a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski{
4269a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski}
4279a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski
4289a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetskimodule_init(soc_mbus_init);
4299a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetskimodule_exit(soc_mbus_exit);
4309a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski
4319a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi LiakhovetskiMODULE_DESCRIPTION("soc-camera media bus interface");
4329a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi LiakhovetskiMODULE_AUTHOR("Guennadi Liakhovetski <g.liakhovetski@gmx.de>");
4339a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi LiakhovetskiMODULE_LICENSE("GPL v2");
434