root/drivers/media/platform/qcom/camss/camss-format.h
/* SPDX-License-Identifier: GPL-2.0 */
/*
 * camss-format.h
 *
 * Qualcomm MSM Camera Subsystem - Format helpers
 *
 * Copyright (c) 2023, The Linux Foundation. All rights reserved.
 * Copyright (c) 2023 Qualcomm Technologies, Inc.
 */
#ifndef __CAMSS_FORMAT_H__
#define __CAMSS_FORMAT_H__

#include <linux/types.h>

#define PER_PLANE_DATA(plane, h_fract_num, h_fract_den, v_fract_num, v_fract_den, _bpp)         \
        .hsub[(plane)].numerator        = (h_fract_num),                                        \
        .hsub[(plane)].denominator      = (h_fract_den),                                        \
        .vsub[(plane)].numerator        = (v_fract_num),                                        \
        .vsub[(plane)].denominator      = (v_fract_den),                                        \
        .bpp[(plane)]                   = (_bpp)

/*
 * struct fract - Represents a fraction
 * @numerator: Store the numerator part of the fraction
 * @denominator: Store the denominator part of the fraction
 */
struct fract {
        u8 numerator;
        u8 denominator;
};

/*
 * struct camss_format_info - ISP media bus format information
 * @code: V4L2 media bus format code
 * @mbus_bpp: Media bus bits per pixel
 * @pixelformat: V4L2 pixel format FCC identifier
 * @planes: Number of planes
 * @hsub: Horizontal subsampling (for each plane)
 * @vsub: Vertical subsampling (for each plane)
 * @bpp: Bits per pixel when stored in memory (for each plane)
 */
struct camss_format_info {
        u32 code;
        u32 mbus_bpp;
        u32 pixelformat;
        u8 planes;
        struct fract hsub[3];
        struct fract vsub[3];
        unsigned int bpp[3];
};

struct camss_formats {
        unsigned int nformats;
        const struct camss_format_info *formats;
};

u8 camss_format_get_bpp(const struct camss_format_info *formats, unsigned int nformats, u32 code);
unsigned int camss_format_get_bpl_alignment(const struct camss_format_info *f);
u32 camss_format_find_code(u32 *code, unsigned int n_code, unsigned int index, u32 req_code);
int camss_format_find_format(u32 code, u32 pixelformat, const struct camss_format_info *formats,
                             unsigned int nformats);

#endif /* __CAMSS_FORMAT_H__ */