BSP_S32 adp_int_connect(int ulLvl,FUNCPTR_1 routine,void* parameter) { if(ulLvl<INT_LVL_MAX && ulLvl>=0) return BSP_INT_Connect(ulLvl, (VOIDFUNCPTR)routine, parameter); else if(ulLvl>=INT_LVL_MAX && ulLvl<INT_LVL_MAX+64) { #ifdef CONFIG_MODULE_VIC return bsp_vic_connect(ulLvl-INT_LVL_MAX,(vicfuncptr)routine,parameter); #else return -1; #endif } else return -1; }
void bsp_ipc_init(void) { s32 ret = 0,i = 0; struct device_node *ptr_device_node = NULL; const char *compatible_name = "hisilicon,ipc_balong_mdm"; char *ret_of_iomap = NULL; u32 irq_no_ipc_int = 0; u32 irq_no_ipc_sem = 0; ipc_ctrl.core_num = IPC_CORE_CCORE; for(i = 0;i< INTSRC_NUM;i++ ) { ipc_ctrl.sem_exist[i] = false; } #ifdef CONFIG_CCORE_PM ret = bsp_device_pm_add(&ipc_dpm); if(ret) { bsp_trace(BSP_LOG_LEVEL_ERROR,BSP_MODU_IPC,"ipc init fail\n"); return; } #endif /* 读取基地址并映射 */ ptr_device_node = of_find_compatible_node(NULL, NULL, compatible_name); if (!ptr_device_node) /* 找不到节点 */ { bsp_trace(BSP_LOG_LEVEL_ERROR,BSP_MODU_IPC,"ccore ipc of_find_compatible_node fail\n"); return; } ret_of_iomap = of_iomap(ptr_device_node, 0); if (!ret_of_iomap) /* 映射错误 */ { bsp_trace(BSP_LOG_LEVEL_ERROR,BSP_MODU_IPC,"of_iomap fail\n"); return; } #ifdef CONFIG_IPCM_USE_FPGA_VIC g_p532_asic_ipcm_virt_addr = (unsigned long)ret_of_iomap; /* 读取基地址并映射 */ ptr_device_node = of_find_compatible_node(NULL, NULL, "hisilicon,ipc_balong_mdm_fpga"); if (!ptr_device_node) /* 找不到节点 */ { bsp_trace(BSP_LOG_LEVEL_ERROR,BSP_MODU_IPC,"ccore ipc of_find_compatible_node fail\n"); return; } ret_of_iomap = of_iomap(ptr_device_node, 0); if (!ret_of_iomap) /* 映射错误 */ { bsp_trace(BSP_LOG_LEVEL_ERROR,BSP_MODU_IPC,"of_iomap fail\n"); return; } #endif (void)memset_s((void*)(ipc_ctrl.ipc_int_table), sizeof(struct ipc_entry) * INTSRC_NUM, 0x0, sizeof(struct ipc_entry) * INTSRC_NUM); ipc_ctrl.ipc_base[IPCM_NS] = (u32)ret_of_iomap; //HI_IPCM_REGBASE_ADDR_VIRT writel(0x0,ipc_ctrl.ipc_base[IPCM_NS] + BSP_IPC_CPU_INT_MASK(ipc_ctrl.core_num)); writel(0x0,ipc_ctrl.ipc_base[IPCM_NS] + BSP_IPC_SEM_INT_MASK(ipc_ctrl.core_num)); writel(0xffffffff,ipc_ctrl.ipc_base[IPCM_NS] + BSP_IPC_CPU_INT_CLR(ipc_ctrl.core_num));/*清所有32个中断*/ writel(0xffffffff,ipc_ctrl.ipc_base[IPCM_NS] + BSP_IPC_SEM_INT_CLR(ipc_ctrl.core_num));/*清所有32个中断*/ ipc_free_sem_taked((u32)IPC_CORE_CCORE); ipc_free_sem_taked((u32)IPC_CORE_LDSP); spin_lock_init(&ipc_ctrl.lock); #ifdef CONFIG_IPCM_USE_FPGA_VIC /* 获取中断号 */ irq_no_ipc_int = irq_of_parse_and_map(ptr_device_node, 0); ret = bsp_vic_connect(irq_no_ipc_int, (vicfuncptr)ipc_int_handler, 0); ret |= bsp_vic_enable(irq_no_ipc_int); if (ret ) { bsp_trace(BSP_LOG_LEVEL_ERROR,BSP_MODU_IPC,"ipc int handler error,init failed\n"); return; } /* 获取中断号 */ irq_no_ipc_sem = irq_of_parse_and_map(ptr_device_node, 1); ret = bsp_vic_connect(irq_no_ipc_sem, (vicfuncptr)ipc_sem_int_handler, 0); ret |= bsp_vic_enable(irq_no_ipc_sem); if (ret ) { bsp_trace(BSP_LOG_LEVEL_ERROR,BSP_MODU_IPC,"ipc sem handler error,init failed\n"); return; } #else /* 获取中断号 */ irq_no_ipc_int = irq_of_parse_and_map(ptr_device_node, 0); ret = request_irq(irq_no_ipc_int,(irq_handler_t) ipc_int_handler, 0, "ipc_irq",(void*)IPCM_NS); //IPC_INT if (ret ) { bsp_trace(BSP_LOG_LEVEL_ERROR,BSP_MODU_IPC,"ipc int handler error,init failed\n"); return; } /* 获取中断号 */ irq_no_ipc_sem = irq_of_parse_and_map(ptr_device_node, 1); ret = request_irq(irq_no_ipc_sem, (irq_handler_t) ipc_sem_int_handler, 0, "ipc_sem",(void*) NULL); //IPC_SEM if (ret ) { bsp_trace(BSP_LOG_LEVEL_ERROR,BSP_MODU_IPC,"ipc sem handler error,init failed\n"); return; } #endif #ifdef ENABLE_TEST_CODE ret = bsp_ipc_test_init(); if (ret ) { bsp_trace(BSP_LOG_LEVEL_ERROR,BSP_MODU_IPC,"bsp_ipc_test_init failed\n"); return; } #endif bsp_trace(BSP_LOG_LEVEL_ERROR,BSP_MODU_IPC,"ccore ipc_ns init success\n"); bsp_ipc_s_init(); return; }
/***************************************************************************** 函 数 名 : hi6559_irq_probe 功能描述 : 输入参数 : 无 输出参数 : 无 返 回 值 : 无 *****************************************************************************/ static s32 __init hi6559_irq_probe(struct platform_device *pdev) { s32 ret = BSP_PMU_OK; u16 i = 0; u8 regvalue = 0; hi6559_irq_data_st = kzalloc(sizeof(*hi6559_irq_data_st), GFP_KERNEL); if (hi6559_irq_data_st == NULL) { pmic_print_error("hi6559 irq kzalloc is failed,please check!\n"); return -ENOMEM; } hi6559_irq_data_st->irq = (unsigned)platform_get_irq(pdev, 0); spin_lock_init(&hi6559_irq_data_st->irq_lock);/*中断只在Acore实现,多core*/ /* 初始化工作队列 */ hi6559_irq_data_st->hi6559_irq_wq = create_singlethread_workqueue("bsp_hi6559_irq"); INIT_WORK(&hi6559_irq_data_st->hi6559_irq_wk, (void *)hi6559_irq_wk_handler); /* 处理usb拔出误报,若usb不在位,多报usb拔出无影响 */ bsp_hi6559_reg_read(HI6559_IRQ2_OFFSET, ®value); if((regvalue & (0x01 << 2)) && hi6559_usb_state_get()) { bsp_hi6559_reg_write(HI6559_IRQ2_OFFSET, 0x04); } /* 清除所有下电中断寄存器 */ for(i = 0;i < HI6559_IRQ_REG_NUM; i++) { bsp_hi6559_reg_read(HI6559_IRQ1_OFFSET + i,®value); bsp_hi6559_reg_write(HI6559_IRQ1_OFFSET + i, regvalue); } /* 清除短路过流中断寄存器,这样过流中断位才能消除 */ for(i = 0; i < HI6559_NP_OCP_SCP_REG_NUM; i++) { bsp_hi6559_reg_read(HI6559_SCP_RECORD1_OFFSET + i, ®value); bsp_hi6559_reg_write(HI6559_SCP_RECORD1_OFFSET + i, regvalue); } /* 屏蔽所有中断 */ for(i = 0;i < HI6559_IRQ_REG_NUM;i++) { bsp_hi6559_reg_write(HI6559_IRQ1_MASK_OFFSET + i, 0xff); } /* 中断注册 */ #ifdef CONFIG_MODULE_VIC ret = bsp_vic_connect(hi6559_irq_data_st->irq, hi6559_irq_handler,(s32)(hi6559_irq_data_st->irq)); if (ret < 0) { pmic_print_error("unable to connect PMIC HI6559 IRQ!\n"); goto out; } ret = bsp_vic_enable(hi6559_irq_data_st->irq); if (ret < 0) { pmic_print_error("enable PMIC HI6559 IRQ error!\n"); goto out; } #else ret = request_irq((hi6559_irq_data_st->irq), hi6559_irq_handler, IRQF_DISABLED, "hi6559_irq", hi6559_irq_data_st); if (ret < 0) { pmic_print_error("unable to request PMIC HI6559 IRQ!\n"); goto out; } #endif /* 打开所有中断 */ for(i = 0; i < HI6559_IRQ_REG_NUM; i++) { bsp_hi6559_reg_write(HI6559_IRQ1_MASK_OFFSET + i, 0x0); } platform_set_drvdata(pdev, hi6559_irq_data_st); pmic_print_error("hi6559_irq_probe ok !\n"); return ret; out: kfree(hi6559_irq_data_st); return ret; }