// 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 "platform_support.h"
|
|
#include "sh_css_hrt.h"
|
#include "ia_css_debug.h"
|
|
#include "device_access.h"
|
|
#define __INLINE_EVENT__
|
#include "event_fifo.h"
|
#define __INLINE_SP__
|
#include "sp.h"
|
#define __INLINE_ISP__
|
#include "isp.h"
|
#define __INLINE_IRQ__
|
#include "irq.h"
|
#define __INLINE_FIFO_MONITOR__
|
#include "fifo_monitor.h"
|
|
/* System independent */
|
#include "sh_css_internal.h"
|
|
bool sh_css_hrt_system_is_idle(void)
|
{
|
bool not_idle = false, idle;
|
fifo_channel_t ch;
|
|
idle = sp_ctrl_getbit(SP0_ID, SP_SC_REG, SP_IDLE_BIT);
|
not_idle |= !idle;
|
if (!idle)
|
IA_CSS_WARNING("SP not idle");
|
|
idle = isp_ctrl_getbit(ISP0_ID, ISP_SC_REG, ISP_IDLE_BIT);
|
not_idle |= !idle;
|
if (!idle)
|
IA_CSS_WARNING("ISP not idle");
|
|
for (ch = 0; ch < N_FIFO_CHANNEL; ch++) {
|
fifo_channel_state_t state;
|
|
fifo_channel_get_state(FIFO_MONITOR0_ID, ch, &state);
|
if (state.fifo_valid) {
|
IA_CSS_WARNING("FIFO channel %d is not empty", ch);
|
not_idle = true;
|
}
|
}
|
|
return !not_idle;
|
}
|
|
int sh_css_hrt_sp_wait(void)
|
{
|
irq_sw_channel_id_t irq_id = IRQ_SW_CHANNEL0_ID;
|
/*
|
* Wait till SP is idle or till there is a SW2 interrupt
|
* The SW2 interrupt will be used when frameloop runs on SP
|
* and signals an event with similar meaning as SP idle
|
* (e.g. frame_done)
|
*/
|
while (!sp_ctrl_getbit(SP0_ID, SP_SC_REG, SP_IDLE_BIT) &&
|
((irq_reg_load(IRQ0_ID,
|
_HRT_IRQ_CONTROLLER_STATUS_REG_IDX) &
|
(1U << (irq_id + IRQ_SW_CHANNEL_OFFSET))) == 0)) {
|
udelay(1);
|
}
|
|
return 0;
|
}
|