| /* |
| * soc-camera media bus helper routines |
| * |
| * Copyright (C) 2009, Guennadi Liakhovetski <g.liakhovetski@gmx.de> |
| * |
| * 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. |
| */ |
| |
| #include <linux/kernel.h> |
| #include <linux/module.h> |
| |
| #include <media/v4l2-device.h> |
| #include <media/v4l2-mediabus.h> |
| #include <media/soc_mediabus.h> |
| |
| #define MBUS_IDX(f) (V4L2_MBUS_FMT_ ## f - V4L2_MBUS_FMT_FIXED - 1) |
| |
| static const struct soc_mbus_pixelfmt mbus_fmt[] = { |
| [MBUS_IDX(YUYV8_2X8_LE)] = { |
| .fourcc = V4L2_PIX_FMT_YUYV, |
| .name = "YUYV", |
| .bits_per_sample = 8, |
| .packing = SOC_MBUS_PACKING_2X8_PADHI, |
| .order = SOC_MBUS_ORDER_LE, |
| }, [MBUS_IDX(YVYU8_2X8_LE)] = { |
| .fourcc = V4L2_PIX_FMT_YVYU, |
| .name = "YVYU", |
| .bits_per_sample = 8, |
| .packing = SOC_MBUS_PACKING_2X8_PADHI, |
| .order = SOC_MBUS_ORDER_LE, |
| }, [MBUS_IDX(YUYV8_2X8_BE)] = { |
| .fourcc = V4L2_PIX_FMT_UYVY, |
| .name = "UYVY", |
| .bits_per_sample = 8, |
| .packing = SOC_MBUS_PACKING_2X8_PADHI, |
| .order = SOC_MBUS_ORDER_LE, |
| }, [MBUS_IDX(YVYU8_2X8_BE)] = { |
| .fourcc = V4L2_PIX_FMT_VYUY, |
| .name = "VYUY", |
| .bits_per_sample = 8, |
| .packing = SOC_MBUS_PACKING_2X8_PADHI, |
| .order = SOC_MBUS_ORDER_LE, |
| }, [MBUS_IDX(RGB555_2X8_PADHI_LE)] = { |
| .fourcc = V4L2_PIX_FMT_RGB555, |
| .name = "RGB555", |
| .bits_per_sample = 8, |
| .packing = SOC_MBUS_PACKING_2X8_PADHI, |
| .order = SOC_MBUS_ORDER_LE, |
| }, [MBUS_IDX(RGB555_2X8_PADHI_BE)] = { |
| .fourcc = V4L2_PIX_FMT_RGB555X, |
| .name = "RGB555X", |
| .bits_per_sample = 8, |
| .packing = SOC_MBUS_PACKING_2X8_PADHI, |
| .order = SOC_MBUS_ORDER_LE, |
| }, [MBUS_IDX(RGB565_2X8_LE)] = { |
| .fourcc = V4L2_PIX_FMT_RGB565, |
| .name = "RGB565", |
| .bits_per_sample = 8, |
| .packing = SOC_MBUS_PACKING_2X8_PADHI, |
| .order = SOC_MBUS_ORDER_LE, |
| }, [MBUS_IDX(RGB565_2X8_BE)] = { |
| .fourcc = V4L2_PIX_FMT_RGB565X, |
| .name = "RGB565X", |
| .bits_per_sample = 8, |
| .packing = SOC_MBUS_PACKING_2X8_PADHI, |
| .order = SOC_MBUS_ORDER_LE, |
| }, [MBUS_IDX(SBGGR8_1X8)] = { |
| .fourcc = V4L2_PIX_FMT_SBGGR8, |
| .name = "Bayer 8 BGGR", |
| .bits_per_sample = 8, |
| .packing = SOC_MBUS_PACKING_NONE, |
| .order = SOC_MBUS_ORDER_LE, |
| }, [MBUS_IDX(SBGGR10_1X10)] = { |
| .fourcc = V4L2_PIX_FMT_SBGGR10, |
| .name = "Bayer 10 BGGR", |
| .bits_per_sample = 10, |
| .packing = SOC_MBUS_PACKING_EXTEND16, |
| .order = SOC_MBUS_ORDER_LE, |
| }, [MBUS_IDX(GREY8_1X8)] = { |
| .fourcc = V4L2_PIX_FMT_GREY, |
| .name = "Grey", |
| .bits_per_sample = 8, |
| .packing = SOC_MBUS_PACKING_NONE, |
| .order = SOC_MBUS_ORDER_LE, |
| }, [MBUS_IDX(Y10_1X10)] = { |
| .fourcc = V4L2_PIX_FMT_Y10, |
| .name = "Grey 10bit", |
| .bits_per_sample = 10, |
| .packing = SOC_MBUS_PACKING_EXTEND16, |
| .order = SOC_MBUS_ORDER_LE, |
| }, [MBUS_IDX(SBGGR10_2X8_PADHI_LE)] = { |
| .fourcc = V4L2_PIX_FMT_SBGGR10, |
| .name = "Bayer 10 BGGR", |
| .bits_per_sample = 8, |
| .packing = SOC_MBUS_PACKING_2X8_PADHI, |
| .order = SOC_MBUS_ORDER_LE, |
| }, [MBUS_IDX(SBGGR10_2X8_PADLO_LE)] = { |
| .fourcc = V4L2_PIX_FMT_SBGGR10, |
| .name = "Bayer 10 BGGR", |
| .bits_per_sample = 8, |
| .packing = SOC_MBUS_PACKING_2X8_PADLO, |
| .order = SOC_MBUS_ORDER_LE, |
| }, [MBUS_IDX(SBGGR10_2X8_PADHI_BE)] = { |
| .fourcc = V4L2_PIX_FMT_SBGGR10, |
| .name = "Bayer 10 BGGR", |
| .bits_per_sample = 8, |
| .packing = SOC_MBUS_PACKING_2X8_PADHI, |
| .order = SOC_MBUS_ORDER_BE, |
| }, [MBUS_IDX(SBGGR10_2X8_PADLO_BE)] = { |
| .fourcc = V4L2_PIX_FMT_SBGGR10, |
| .name = "Bayer 10 BGGR", |
| .bits_per_sample = 8, |
| .packing = SOC_MBUS_PACKING_2X8_PADLO, |
| .order = SOC_MBUS_ORDER_BE, |
| }, |
| }; |
| |
| s32 soc_mbus_bytes_per_line(u32 width, const struct soc_mbus_pixelfmt *mf) |
| { |
| switch (mf->packing) { |
| case SOC_MBUS_PACKING_NONE: |
| return width * mf->bits_per_sample / 8; |
| case SOC_MBUS_PACKING_2X8_PADHI: |
| case SOC_MBUS_PACKING_2X8_PADLO: |
| case SOC_MBUS_PACKING_EXTEND16: |
| return width * 2; |
| } |
| return -EINVAL; |
| } |
| EXPORT_SYMBOL(soc_mbus_bytes_per_line); |
| |
| const struct soc_mbus_pixelfmt *soc_mbus_get_fmtdesc( |
| enum v4l2_mbus_pixelcode code) |
| { |
| if ((unsigned int)(code - V4L2_MBUS_FMT_FIXED) > ARRAY_SIZE(mbus_fmt)) |
| return NULL; |
| return mbus_fmt + code - V4L2_MBUS_FMT_FIXED - 1; |
| } |
| EXPORT_SYMBOL(soc_mbus_get_fmtdesc); |
| |
| static int __init soc_mbus_init(void) |
| { |
| return 0; |
| } |
| |
| static void __exit soc_mbus_exit(void) |
| { |
| } |
| |
| module_init(soc_mbus_init); |
| module_exit(soc_mbus_exit); |
| |
| MODULE_DESCRIPTION("soc-camera media bus interface"); |
| MODULE_AUTHOR("Guennadi Liakhovetski <g.liakhovetski@gmx.de>"); |
| MODULE_LICENSE("GPL v2"); |