soc_mediabus.c revision 93f116d595e9aa7dca5f6507376d6995f217d420
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	},
17293f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski},
1739a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski};
1749a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski
17548a3c77338d725d4976fa792d822eb940ce5c296Alberto Panizzoint soc_mbus_samples_per_pixel(const struct soc_mbus_pixelfmt *mf)
17648a3c77338d725d4976fa792d822eb940ce5c296Alberto Panizzo{
17748a3c77338d725d4976fa792d822eb940ce5c296Alberto Panizzo	switch (mf->packing) {
17848a3c77338d725d4976fa792d822eb940ce5c296Alberto Panizzo	case SOC_MBUS_PACKING_NONE:
17948a3c77338d725d4976fa792d822eb940ce5c296Alberto Panizzo	case SOC_MBUS_PACKING_EXTEND16:
18048a3c77338d725d4976fa792d822eb940ce5c296Alberto Panizzo		return 1;
18148a3c77338d725d4976fa792d822eb940ce5c296Alberto Panizzo	case SOC_MBUS_PACKING_2X8_PADHI:
18248a3c77338d725d4976fa792d822eb940ce5c296Alberto Panizzo	case SOC_MBUS_PACKING_2X8_PADLO:
18348a3c77338d725d4976fa792d822eb940ce5c296Alberto Panizzo		return 2;
18464149deb6a9ec35cc8a3ac3e7b5bc19d4a79ff44Kassey Li	case SOC_MBUS_PACKING_VARIABLE:
18564149deb6a9ec35cc8a3ac3e7b5bc19d4a79ff44Kassey Li		return 0;
18648a3c77338d725d4976fa792d822eb940ce5c296Alberto Panizzo	}
18748a3c77338d725d4976fa792d822eb940ce5c296Alberto Panizzo	return -EINVAL;
18848a3c77338d725d4976fa792d822eb940ce5c296Alberto Panizzo}
18948a3c77338d725d4976fa792d822eb940ce5c296Alberto PanizzoEXPORT_SYMBOL(soc_mbus_samples_per_pixel);
19048a3c77338d725d4976fa792d822eb940ce5c296Alberto Panizzo
1919a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetskis32 soc_mbus_bytes_per_line(u32 width, const struct soc_mbus_pixelfmt *mf)
1929a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski{
1939a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski	switch (mf->packing) {
1949a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski	case SOC_MBUS_PACKING_NONE:
1959a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		return width * mf->bits_per_sample / 8;
1969a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski	case SOC_MBUS_PACKING_2X8_PADHI:
1979a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski	case SOC_MBUS_PACKING_2X8_PADLO:
1989a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski	case SOC_MBUS_PACKING_EXTEND16:
1999a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski		return width * 2;
20064149deb6a9ec35cc8a3ac3e7b5bc19d4a79ff44Kassey Li	case SOC_MBUS_PACKING_VARIABLE:
20164149deb6a9ec35cc8a3ac3e7b5bc19d4a79ff44Kassey Li		return 0;
2029a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski	}
2039a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski	return -EINVAL;
2049a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski}
2059a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi LiakhovetskiEXPORT_SYMBOL(soc_mbus_bytes_per_line);
2069a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski
20793f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetskiconst struct soc_mbus_pixelfmt *soc_mbus_find_fmtdesc(
20893f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski	enum v4l2_mbus_pixelcode code,
20993f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski	const struct soc_mbus_lookup *lookup,
21093f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski	int n)
21193f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski{
21293f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski	int i;
21393f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski
21493f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski	for (i = 0; i < n; i++)
21593f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski		if (lookup[i].code == code)
21693f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski			return &lookup[i].fmt;
21793f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski
21893f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski	return NULL;
21993f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski}
22093f116d595e9aa7dca5f6507376d6995f217d420Guennadi LiakhovetskiEXPORT_SYMBOL(soc_mbus_find_fmtdesc);
22193f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski
2229a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetskiconst struct soc_mbus_pixelfmt *soc_mbus_get_fmtdesc(
2239a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski	enum v4l2_mbus_pixelcode code)
2249a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski{
22593f116d595e9aa7dca5f6507376d6995f217d420Guennadi Liakhovetski	return soc_mbus_find_fmtdesc(code, mbus_fmt, ARRAY_SIZE(mbus_fmt));
2269a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski}
2279a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi LiakhovetskiEXPORT_SYMBOL(soc_mbus_get_fmtdesc);
2289a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski
2299a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetskistatic int __init soc_mbus_init(void)
2309a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski{
2319a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski	return 0;
2329a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski}
2339a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski
2349a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetskistatic void __exit soc_mbus_exit(void)
2359a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski{
2369a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski}
2379a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski
2389a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetskimodule_init(soc_mbus_init);
2399a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetskimodule_exit(soc_mbus_exit);
2409a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi Liakhovetski
2419a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi LiakhovetskiMODULE_DESCRIPTION("soc-camera media bus interface");
2429a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi LiakhovetskiMODULE_AUTHOR("Guennadi Liakhovetski <g.liakhovetski@gmx.de>");
2439a74251d8bee7a25fee89a0be3ccea73e01c1a05Guennadi LiakhovetskiMODULE_LICENSE("GPL v2");
244