// SPDX-License-Identifier: GPL-2.0
/*
 * Support for Intel Camera Imaging ISP subsystem.
 * Copyright (c) 2015, Intel Corporation.
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms and conditions of the GNU General Public License,
 * version 2, as published by the Free Software Foundation.
 *
 * This program is distributed in the hope it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 * more details.
 */

#include "ia_css_frame.h"
#include "ia_css_debug.h"
#define IA_CSS_INCLUDE_CONFIGURATIONS
#include "ia_css_isp_configs.h"
#include "ia_css_output.host.h"
#include "isp.h"

#include "assert_support.h"

const struct ia_css_output_config default_output_config = {
	0,
	0
};

static const struct ia_css_output_configuration default_output_configuration = {
	.info = (struct ia_css_frame_info *)NULL,
};

static const struct ia_css_output0_configuration default_output0_configuration
	= {
	.info = (struct ia_css_frame_info *)NULL,
};

static const struct ia_css_output1_configuration default_output1_configuration
	= {
	.info = (struct ia_css_frame_info *)NULL,
};

void
ia_css_output_encode(
    struct sh_css_isp_output_params *to,
    const struct ia_css_output_config *from,
    unsigned int size)
{
	(void)size;
	to->enable_hflip = from->enable_hflip;
	to->enable_vflip = from->enable_vflip;
}

void
ia_css_output_config(
    struct sh_css_isp_output_isp_config *to,
    const struct ia_css_output_configuration  *from,
    unsigned int size)
{
	unsigned int elems_a = ISP_VEC_NELEMS;

	(void)size;
	ia_css_dma_configure_from_info(&to->port_b, from->info);
	to->width_a_over_b = elems_a / to->port_b.elems;
	to->height = from->info ? from->info->res.height : 0;
	to->enable = from->info != NULL;
	ia_css_frame_info_to_frame_sp_info(&to->info, from->info);

	/* Assume divisiblity here, may need to generalize to fixed point. */
	assert(elems_a % to->port_b.elems == 0);
}

void
ia_css_output0_config(
    struct sh_css_isp_output_isp_config       *to,
    const struct ia_css_output0_configuration *from,
    unsigned int size)
{
	ia_css_output_config(
	    to, (const struct ia_css_output_configuration *)from, size);
}

void
ia_css_output1_config(
    struct sh_css_isp_output_isp_config       *to,
    const struct ia_css_output1_configuration *from,
    unsigned int size)
{
	ia_css_output_config(
	    to, (const struct ia_css_output_configuration *)from, size);
}

void
ia_css_output_configure(
    const struct ia_css_binary     *binary,
    const struct ia_css_frame_info *info)
{
	if (info) {
		struct ia_css_output_configuration config =
			    default_output_configuration;

		config.info = info;

		ia_css_configure_output(binary, &config);
	}
}

void
ia_css_output0_configure(
    const struct ia_css_binary     *binary,
    const struct ia_css_frame_info *info)
{
	if (info) {
		struct ia_css_output0_configuration config =
			    default_output0_configuration;

		config.info = info;

		ia_css_configure_output0(binary, &config);
	}
}

void
ia_css_output1_configure(
    const struct ia_css_binary     *binary,
    const struct ia_css_frame_info *info)
{
	if (info) {
		struct ia_css_output1_configuration config =
			    default_output1_configuration;

		config.info = info;

		ia_css_configure_output1(binary, &config);
	}
}

void
ia_css_output_dump(
    const struct sh_css_isp_output_params *output,
    unsigned int level)
{
	if (!output) return;
	ia_css_debug_dtrace(level, "Horizontal Output Flip:\n");
	ia_css_debug_dtrace(level, "\t%-32s = %d\n",
			    "enable", output->enable_hflip);
	ia_css_debug_dtrace(level, "Vertical Output Flip:\n");
	ia_css_debug_dtrace(level, "\t%-32s = %d\n",
			    "enable", output->enable_vflip);
}

void
ia_css_output_debug_dtrace(
    const struct ia_css_output_config *config,
    unsigned int level)
{
	ia_css_debug_dtrace(level,
			    "config.enable_hflip=%d",
			    config->enable_hflip);
	ia_css_debug_dtrace(level,
			    "config.enable_vflip=%d",
			    config->enable_vflip);
}
