/*
 * Copyright (C) 2018 Synaptics Incorporated. All rights reserved.
 *
 * 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.
 *
 * INFORMATION CONTAINED IN THIS DOCUMENT IS PROVIDED "AS-IS," AND
 * SYNAPTICS EXPRESSLY DISCLAIMS ALL EXPRESS AND IMPLIED WARRANTIES,
 * INCLUDING ANY IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE, AND ANY WARRANTIES OF NON-INFRINGEMENT OF ANY
 * INTELLECTUAL PROPERTY RIGHTS. IN NO EVENT SHALL SYNAPTICS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, PUNITIVE, OR
 * CONSEQUENTIAL DAMAGES ARISING OUT OF OR IN CONNECTION WITH THE USE
 * OF THE INFORMATION CONTAINED IN THIS DOCUMENT, HOWEVER CAUSED AND
 * BASED ON ANY THEORY OF LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
 * NEGLIGENCE OR OTHER TORTIOUS ACTION, AND EVEN IF SYNAPTICS WAS
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. IF A TRIBUNAL OF
 * COMPETENT JURISDICTION DOES NOT PERMIT THE DISCLAIMER OF DIRECT
 * DAMAGES OR ANY OTHER DAMAGES, SYNAPTICS' TOTAL CUMULATIVE LIABILITY
 * TO ANY PARTY SHALL NOT EXCEED ONE HUNDRED U.S. DOLLARS.
 */

#include <common.h>
#include "show_logoframe.h"
#include "fastlogo.h"
#include "error_logo_data.h"
#include "normal_logo_data.h"

void fastlogo_init(void)
{
    int ret = 0;

    ret = MV_VPP_Init();
    if(ret != 0)
    {
        printf("MV_VPP_Init failed\n");
        return;
    }
}

int showlogo_start(int error)
{
    int yuv_logo_width, yuv_logo_height, yuv_logo_stride;
    void *yuv_logo;
    int x = 0, y = 0;

    if (error) {
        yuv_logo_width = error_yuv_logo_width;
        yuv_logo_height = error_yuv_logo_height;
        yuv_logo = error_yuv_logo;
    } else {
        yuv_logo_width = normal_yuv_logo_width;
        yuv_logo_height = normal_yuv_logo_height;
        yuv_logo = normal_yuv_logo;
    }
    yuv_logo_stride = yuv_logo_width * 2;

    x = (MV_SYSTEM_XRES  - yuv_logo_width) / 2;
    y = (MV_SYSTEM_YRES  - yuv_logo_height) / 2;
    printf("Show fastlogo frame\n");
    MV_VPP_DisplayPatternFrame(x, y, yuv_logo_width, yuv_logo_height,
                            yuv_logo_stride, yuv_logo);
    MV_VPP_Enable_IRQ();
    return 0;
}

int showlogo_stop()
{
    MV_VPP_Deinit();

    return 0;
}
