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