/*****************************************************************************
 function name  : mali_domain_powerdown_begin
 description    : powerdown begin with it
 input vars     : void
 output vars    : NA
 return value   : void
 calls          : phy_reg_writel

 called         : mali_platform_powerdown

 history        :
  1.data        : 04/03/2014
    author      : s00250033
    modify      : new

*****************************************************************************/
void mali_domain_powerdown_begin(void)
{   
    MALI_DEBUG_PRINT(3, ("mali power down start! \n"));
    
    phy_reg_writel(SOC_MEDIA_SCTRL_BASE_ADDR,SOC_MEDIA_SCTRL_SC_MEDIA_RSTEN_ADDR(0),0,0,1);

    phy_reg_writel(SOC_MEDIA_SCTRL_BASE_ADDR,SOC_MEDIA_SCTRL_SC_MEDIA_CLKDIS_ADDR(0),1,1,1);

    phy_reg_writel(SOC_AO_SCTRL_BASE_ADDR,SOC_AO_SCTRL_SC_PW_CLKDIS0_ADDR(0),1,1,1);

    phy_reg_writel(SOC_AO_SCTRL_BASE_ADDR,SOC_AO_SCTRL_SC_PW_ISOEN0_ADDR(0),1,1,1);

    phy_reg_writel(SOC_AO_SCTRL_BASE_ADDR,SOC_AO_SCTRL_SC_PW_RSTEN0_ADDR(0),1,1,1);
    
    MALI_DEBUG_PRINT(3, ("mali power down end! \n"));
}
/***************************************************************************
 * FunctionName: ispv1_csi_phy_set;
 * Description : csi phyhardware poweron region set;
 * Input       : csiphy_power_enum;
 * Output      : NA;
 * ReturnValue : NA;
 * Other       : NA;
 ***************************************************************************/
static void ispv1_csi_phy_set(camera_power_state type, csi_index_t index)
{
    if (POWER_ON == type) {
        if (index == CSI_INDEX_0) {
            /* CSI PHY0 RSTDIS */
            phy_reg_writel(SOC_SC_ON_BASE_ADDR,
                           SOC_AO_SCTRL_SC_PW_RSTDIS0_ADDR(0),
                           SOC_AO_SCTRL_SC_PW_RSTDIS0_pw_rstdis0_22cs0phy_START,
                           SOC_AO_SCTRL_SC_PW_RSTDIS0_pw_rstdis0_22cs0phy_END,
                           0x1);

            /* CSI PHY0 CLKREG ENABLE */
            phy_reg_writel(SOC_SC_ON_BASE_ADDR,
                           SOC_AO_SCTRL_SC_PW_CLKEN0_ADDR(0),
                           SOC_AO_SCTRL_SC_PW_CLKEN0_pw_clken0_22cs0phy_START,
                           SOC_AO_SCTRL_SC_PW_CLKEN0_pw_clken0_22cs0phy_END,
                           0x1);
        } else {
            /* CSI PHY2 RSTDIS */
            phy_reg_writel(SOC_SC_ON_BASE_ADDR,
                           SOC_AO_SCTRL_SC_PW_RSTDIS0_ADDR(0),
                           SOC_AO_SCTRL_SC_PW_RSTDIS0_pw_rstdis0_24cs2phy_START,
                           SOC_AO_SCTRL_SC_PW_RSTDIS0_pw_rstdis0_24cs2phy_END,
                           0x1);

            /* CSI PHY2 CLKREG ENABLE */
            phy_reg_writel(SOC_SC_ON_BASE_ADDR,
                           SOC_AO_SCTRL_SC_PW_CLKEN0_ADDR(0),
                           SOC_AO_SCTRL_SC_PW_CLKEN0_pw_clken0_24cs2phy_START,
                           SOC_AO_SCTRL_SC_PW_CLKEN0_pw_clken0_24cs2phy_END,
                           0x1);
        }
    } else if (POWER_OFF == type) {
        if (index == CSI_INDEX_0) {
            /* CSI PHY0 CLKREG DISABLE */
            phy_reg_writel(SOC_SC_ON_BASE_ADDR,
                           SOC_AO_SCTRL_SC_PW_CLKDIS0_ADDR(0),
                           SOC_AO_SCTRL_SC_PW_CLKDIS0_pw_clkdis0_22cs0phy_START,
                           SOC_AO_SCTRL_SC_PW_CLKDIS0_pw_clkdis0_22cs0phy_END,
                           0x1);

            /* CSI PHY0 RST ENABLE */
            phy_reg_writel(SOC_SC_ON_BASE_ADDR,
                           SOC_AO_SCTRL_SC_PW_RSTEN0_ADDR(0),
                           SOC_AO_SCTRL_SC_PW_RSTEN0_pw_rsten0_22cs0phy_START,
                           SOC_AO_SCTRL_SC_PW_RSTEN0_pw_rsten0_22cs0phy_END,
                           0x1);
        } else {
            /* CSI PHY2 CLKREG DISABLE */
            phy_reg_writel(SOC_SC_ON_BASE_ADDR,
                           SOC_AO_SCTRL_SC_PW_CLKDIS0_ADDR(0),
                           SOC_AO_SCTRL_SC_PW_CLKDIS0_pw_clkdis0_24cs2phy_START,
                           SOC_AO_SCTRL_SC_PW_CLKDIS0_pw_clkdis0_24cs2phy_END,
                           0x1);

            /* CSI PHY2 RST ENABLE */
            phy_reg_writel(SOC_SC_ON_BASE_ADDR,
                           SOC_AO_SCTRL_SC_PW_RSTEN0_ADDR(0),
                           SOC_AO_SCTRL_SC_PW_RSTEN0_pw_rsten0_24cs2phy_START,
                           SOC_AO_SCTRL_SC_PW_RSTEN0_pw_rsten0_24cs2phy_END,
                           0x1);
        }
    } else {
        print_error("%s, ispv1_power_enum input error:%d", __func__, type);
    }

    return;
}
int video_harden_clkdis_isoen_rsten(video_harden_dev_id_enum dev_id)
{
    int ret = 0;

    printk(KERN_INFO "dev_id is %d.\n", dev_id);

    ret = video_harden_device_id_check(dev_id);
    if (ret != 0) {
        return -1;
    }

    if ((video_harden_rst_iso_clk_vote.vcodec_bit == 0)
        && (video_harden_rst_iso_clk_vote.jpeg_bit == 0)
        && (video_harden_rst_iso_clk_vote.isp_bit == 0)) {
        printk(KERN_ERR "video_harden_clkdis_isoen_rsten is already done!\n");
        return -1;
    }

    ret = down_interruptible(&video_harden_busy_lock);
	if (0 != ret) {
		printk(KERN_ERR "video_harden_busy_lock failed\n");
		return -1;
	}

    switch (dev_id) {
        case VIDEO_HARDEN_DEV_ID_VCODEC: /* VCODEC */
            video_harden_rst_iso_clk_vote.vcodec_bit    = 0;
            break;

        case VIDEO_HARDEN_DEV_ID_JPEG: /* JPEG */
            video_harden_rst_iso_clk_vote.jpeg_bit      = 0;
            break;

        case VIDEO_HARDEN_DEV_ID_ISP: /* ISP */
            video_harden_rst_iso_clk_vote.isp_bit       = 0;
            break;

        default:
            break;
    }

    if ( (video_harden_rst_iso_clk_vote.vcodec_bit == 0)
        && (video_harden_rst_iso_clk_vote.jpeg_bit == 0)
        && (video_harden_rst_iso_clk_vote.isp_bit == 0)) {
        /* AO_SC SOC_AO_SCTRL_SC_PW_CLKDIS0_ADDR [0x804] */
        phy_reg_writel(SOC_AO_SCTRL_BASE_ADDR,
                       SOC_AO_SCTRL_SC_PW_CLKDIS0_ADDR(CALC_REG_OFFSET),
                       SOC_AO_SCTRL_SC_PW_CLKDIS0_pw_clkdis0_2codecisp_START,
                       SOC_AO_SCTRL_SC_PW_CLKDIS0_pw_clkdis0_2codecisp_END,
                       0x1);

        /* AO_SC SC_PW_ISOEN0 [0x820] */
        phy_reg_writel(SOC_AO_SCTRL_BASE_ADDR,
                       SOC_AO_SCTRL_SC_PW_ISOEN0_ADDR(CALC_REG_OFFSET),
                       SOC_AO_SCTRL_SC_PW_ISOEN0_pw_isoen0_2codecisp_START,
                       SOC_AO_SCTRL_SC_PW_ISOEN0_pw_isoen0_2codecisp_END,
                       0x1);

        /* AO_SC SC_PW_RSTEN0 [0x810] */
        phy_reg_writel(SOC_AO_SCTRL_BASE_ADDR,
                      SOC_AO_SCTRL_SC_PW_RSTEN0_ADDR(CALC_REG_OFFSET),
                      SOC_AO_SCTRL_SC_PW_RSTEN0_pw_rsten0_2codecisp_START,
                      SOC_AO_SCTRL_SC_PW_RSTEN0_pw_rsten0_2codecisp_END,
                      0x1);

        printk(KERN_INFO "video harden clkdis_isoen_rsten is sucessful.\n");
    } else {
        printk(KERN_INFO "video_harden_clkdis_isoen_rsten is already done!.\n");
    }

    up(&video_harden_busy_lock);

    printk(KERN_INFO "video_harden_rst_iso_clk_vote is 0x%x.\n",
        *((unsigned int *)&video_harden_rst_iso_clk_vote));

    return ret;
}