/* * Handle the receive of an inter-core interrupt */ static irqreturn_t ipc_int_rx_interrupt(int irq, void * dummy) { volatile u32 *reg_ipcgr = ((u32 *) IPCGR_BASE) + get_coreid(); volatile u32 *reg_ipcar = ((u32 *) IPCAR_BASE) + get_coreid(); u32 mask; u32 ipc_src; u32 ipc_num; while((mask = (*reg_ipcgr) & ~0xf) != 0) { ipc_src = __ffs(mask) ; *reg_ipcar = (1 << ipc_src); /* un-assert handled IPC source */ ipc_num = ipc_src - IPC_INT_SHIFT; /* Call handler if any */ if (ipc_list[ipc_num].handler != NULL) { if (!(ipc_list[ipc_num].flags & IRQF_DISABLED)) local_irq_enable(); ipc_list[ipc_num].handler(ipc_num, ipc_list[ipc_num].data); local_irq_disable(); } /* Wake up waiting processes */ wake_up_all(&ipc_list[ipc_num].wq); } return IRQ_HANDLED; }
static void __init c6472_setup_clocks(struct device_node *node) { struct pll_data *pll = &c6x_soc_pll1; struct clk *sysclks = pll->sysclks; int i; pll->flags = PLL_HAS_MUL; for (i = 1; i <= 6; i++) { sysclks[i].flags |= FIXED_DIV_PLL; sysclks[i].div = 1; } sysclks[7].flags |= FIXED_DIV_PLL; sysclks[7].div = 3; sysclks[8].flags |= FIXED_DIV_PLL; sysclks[8].div = 6; sysclks[9].flags |= FIXED_DIV_PLL; sysclks[9].div = 2; sysclks[10].div = PLLDIV10; c6x_core_clk.parent = &sysclks[get_coreid() + 1]; c6x_i2c_clk.parent = &sysclks[8]; c6x_watchdog_clk.parent = &sysclks[8]; c6x_mdio_clk.parent = &sysclks[5]; c6x_clks_init(c6472_clks); }