Exemplo n.º 1
0
/*
 * 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;
}
Exemplo n.º 2
0
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);
}