Example #1
0
static void aucodec_digitalio_on_1(void)
{
	/* aucodec_digitalio_on */
#if (CHIP_REV == A3)||(CHIP_REV == A5)||(CHIP_REV == A6)|| \
	(CHIP_REV == A5S)||(CHIP_REV == I1)||(CHIP_REV == S2)
	unsigned long flags;

	ambarella_gpio_raw_lock(1, &flags);
	amba_clrbitsl(GPIO1_AFSEL_REG, 0x80000000);
	ambarella_gpio_raw_unlock(1, &flags);

	/* GPIO77~GPIO78 and GPIO81~GPIO83 program as hardware mode */
	ambarella_gpio_raw_lock(2, &flags);
	amba_setbitsl(GPIO2_AFSEL_REG, 0x000e6000);
	ambarella_gpio_raw_unlock(2, &flags);

#elif (CHIP_REV == S2)
	unsigned long flags;

	ambarella_gpio_raw_lock(3, &flags);
	amba_clrbitsl(GPIO3_AFSEL_REG, 0x0000000c);
	ambarella_gpio_raw_unlock(3, &flags);

	/* GPIO82~GPIO83 program as hardware mode */
	ambarella_gpio_raw_lock(2, &flags);
	amba_setbitsl(GPIO2_AFSEL_REG, 0x000c0000);
	ambarella_gpio_raw_unlock(2, &flags);

#else
	pr_err("aucodec_digitalio_on: Unknown Chip Architecture\n");
#endif
}
Example #2
0
int __init ambarella_init_fio(void)
{
#ifndef CONFIG_AMBARELLA_QUICK_INIT
	/* Following should be handled by the bootloader... */
#if (HOST_MAX_AHB_CLK_EN_BITS == 10)
	amba_clrbitsl(HOST_AHB_CLK_ENABLE_REG,
		(HOST_AHB_BOOT_SEL | HOST_AHB_FDMA_BURST_DIS));
#endif
	rct_reset_fio();
	fio_amb_exit_random_mode();
	enable_fio_dma();
	amba_writel(FLASH_INT_REG, 0x0);
	amba_writel(XD_INT_REG, 0x0);
	amba_writel(CF_STA_REG, CF_STA_CW | CF_STA_DW);
#endif

	//SMIO_38 ~ SMIO_43
	amba_setbitsl(GPIO2_MASK_REG, 0x000007e0);
	amba_clrbitsl(GPIO2_DIR_REG, 0x00000780);
	amba_setbitsl(GPIO2_DIR_REG, 0x00000060);
	amba_setbitsl(GPIO2_DATA_REG, 0x00000040);
	amba_clrbitsl(GPIO2_DATA_REG, 0x00000020);

	return 0;
}
Example #3
0
void ambarella_disable_usb_port(int owner)
{
#if defined(CONFIG_PLAT_AMBARELLA_SUPPORT_HAL)
#if (CHIP_REV == A5S) || (CHIP_REV == A7)
	if (amb_set_usb_interface_state(HAL_BASE_VP, AMB_USB_OFF)
			!= AMB_HAL_SUCCESS) {
		pr_info("%s: amb_set_usb_interface_state fail!\n", __func__);
	}

#elif (CHIP_REV == I1)
	if (amb_set_usb_port0_state(HAL_BASE_VP, AMB_USB_OFF)
			!= AMB_HAL_SUCCESS) {
		pr_info("%s: amb_set_usb_port0_state fail!\n", __func__);
	}

	/* We disable usb port1 when neither UHC nor UDC use it */
	ambarella_usb_port_owner &= (~owner);
	if (ambarella_usb_port_owner == 0) {
		if (amb_set_usb_port1_state(HAL_BASE_VP, AMB_USB_OFF)
				!= AMB_HAL_SUCCESS) {
			pr_info("%s: amb_set_usb_port1_state fail!\n", __func__);
		}
	}

#elif (CHIP_REV == S2)
	/* We disable usb port when neither UHC nor UDC use it */
	ambarella_usb_port_owner &= (~owner);
	if (ambarella_usb_port_owner == 0)
		amb_set_usb_port_state(HAL_BASE_VP, AMB_USB_OFF);

#elif (CHIP_REV == A7L)
	if (amb_set_usb_port1_state(HAL_BASE_VP, AMB_USB_OFF)
			!= AMB_HAL_SUCCESS) {
		pr_info("%s: amb_set_usb_port1_state fail!\n", __func__);
	}
#endif

#else

#if (CHIP_REV == A5S) || (CHIP_REV == A7) || (CHIP_REV == A7L)
	amba_clrbitsl(ANA_PWR_REG, 0x6);
#elif (CHIP_REV == I1)
	amba_clrbitsl(ANA_PWR_REG, 0x3000);
	/* We disable usb port when neither UHC nor UDC use it */
	ambarella_usb_port_owner &= (~owner);
	if (ambarella_usb_port_owner == 0)
		amba_clrbitsl(ANA_PWR_REG, 0x6);
#elif (CHIP_REV == S2)
	/* We disable usb port when neither UHC nor UDC use it */
	ambarella_usb_port_owner &= (~owner);
	if (ambarella_usb_port_owner == 0)
		amba_clrbitsl(ANA_PWR_REG, 0x6);
#endif

#endif
}
Example #4
0
static inline void ambarella_ce_timer_disable(void)
{
#if !defined(CONFIG_MACH_HYACINTH_0) && !defined(CONFIG_MACH_HYACINTH_1)
	amba_clrbitsl(TIMER_CTR_REG, AMBARELLA_CE_TIMER_CTR_EN);
#else /* defined(CONFIG_MACH_HYACINTH_0) || defined(CONFIG_MACH_HYACINTH_1) */
	if (machine_is_hyacinth_0())
		amba_clrbitsl(TIMER_CTR_REG, AMBARELLA_CE_TIMER_AXI0_CTR_EN);
	else if (machine_is_hyacinth_1())
		amba_clrbitsl(TIMER_CTR_REG, AMBARELLA_CE_TIMER_AXI1_CTR_EN);
#endif /* defined(CONFIG_MACH_HYACINTH_0) || defined(CONFIG_MACH_HYACINTH_1) */
}
Example #5
0
static inline void ambarella_ce_timer_misc(void)
{
#if !defined(CONFIG_MACH_HYACINTH_0) && !defined(CONFIG_MACH_HYACINTH_1)
	amba_setbitsl(TIMER_CTR_REG, AMBARELLA_CE_TIMER_CTR_OF);
	amba_clrbitsl(TIMER_CTR_REG, AMBARELLA_CE_TIMER_CTR_CSL);
#else /* defined(CONFIG_MACH_HYACINTH_0) || defined(CONFIG_MACH_HYACINTH_1) */
	if (machine_is_hyacinth_0()) {
		amba_setbitsl(TIMER_CTR_REG, AMBARELLA_CE_TIMER_AXI0_CTR_OF);
		amba_clrbitsl(TIMER_CTR_REG, AMBARELLA_CE_TIMER_AXI0_CTR_CSL);
	}
	else if (machine_is_hyacinth_1()) {
		amba_setbitsl(TIMER_CTR_REG, AMBARELLA_CE_TIMER_AXI1_CTR_OF);
		amba_clrbitsl(TIMER_CTR_REG, AMBARELLA_CE_TIMER_AXI1_CTR_CSL);
	}
#endif /* defined(CONFIG_MACH_HYACINTH_0) || defined(CONFIG_MACH_HYACINTH_1) */
}
Example #6
0
static void aucodec_digitalio_on_0(void)
{
	/* aucodec_digitalio_on */
#if (CHIP_REV == A2S) || (CHIP_REV == A2M)
	unsigned long flags;

	ambarella_gpio_raw_lock(2, &flags);
	amba_setbitsl(GPIO2_AFSEL_REG, (0xf << 18) | (0xf << 13));
	ambarella_gpio_raw_unlock(2, &flags);

#elif (CHIP_REV == A2)
	unsigned long flags;

	ambarella_gpio_raw_lock(2, &flags);
	amba_setbitsl(GPIO2_AFSEL_REG, (0x3 << 15) | (0x3 << 20));
	ambarella_gpio_raw_unlock(2, &flags);

#elif (CHIP_REV == A3)||(CHIP_REV == A5)||(CHIP_REV == A6)|| \
	(CHIP_REV == A5S)||(CHIP_REV == I1)
	unsigned long flags;

	ambarella_gpio_raw_lock(1, &flags);
	amba_clrbitsl(GPIO1_AFSEL_REG, 0x80000000);
	ambarella_gpio_raw_unlock(1, &flags);

	/* GPIO77~GPIO81 program as hardware mode */
	ambarella_gpio_raw_lock(2, &flags);
	amba_setbitsl(GPIO2_AFSEL_REG, 0x0003e000);
	ambarella_gpio_raw_unlock(2, &flags);

#elif (CHIP_REV == S2)
	unsigned long flags;

	ambarella_gpio_raw_lock(3, &flags);
	amba_clrbitsl(GPIO3_AFSEL_REG, 0x00000030);
	ambarella_gpio_raw_unlock(3, &flags);

	/* GPIO77~GPIO81 program as hardware mode */
	ambarella_gpio_raw_lock(2, &flags);
	amba_setbitsl(GPIO2_AFSEL_REG, 0x0003e000);
	ambarella_gpio_raw_unlock(2, &flags);

#else
	pr_err("aucodec_digitalio_on: Unknown Chip Architecture\n");
#endif
}
Example #7
0
int __init ambarella_init_fio(void)
{
#if defined(CONFIG_AMBARELLA_FIO_FORCE_SDIO_GPIO)
	unsigned long				flags;

	//SMIO_38 ~ SMIO_43
	ambarella_gpio_raw_lock(2, &flags);
	amba_clrbitsl(GPIO2_AFSEL_REG, 0x000007e0);
	amba_clrbitsl(GPIO2_DIR_REG, 0x00000780);
	amba_setbitsl(GPIO2_DIR_REG, 0x00000060);
	amba_writel(GPIO2_MASK_REG, 0x00000060);
	amba_writel(GPIO2_DATA_REG, 0x00000040);
	ambarella_gpio_raw_unlock(2, &flags);
#endif

	return 0;
}
Example #8
0
static void serial_ambarella_break_ctl(struct uart_port *port, int break_state)
{
	unsigned long				flags;

	spin_lock_irqsave(&port->lock, flags);
	if (break_state != 0)
		amba_setbitsl(port->membase + UART_LC_OFFSET, UART_LC_BRK);
	else
		amba_clrbitsl(port->membase + UART_LC_OFFSET, UART_LC_BRK);
	spin_unlock_irqrestore(&port->lock, flags);
}
Example #9
0
static void serial_ambarella_shutdown(struct uart_port *port)
{
	unsigned long				flags;

	free_irq(port->irq, port);

	spin_lock_irqsave(&port->lock, flags);
	amba_clrbitsl(port->membase + UART_LC_OFFSET, UART_LC_BRK);
	amba_setbitsl(port->membase + UART_SRR_OFFSET, 0x01);
	spin_unlock_irqrestore(&port->lock, flags);
}
Example #10
0
static void ambench_apbread(void)
{
	u64					raw_counter = 0;
	u64					amba_counter = 0;
	unsigned long				flags;

	disable_nonboot_cpus();
	local_irq_save(flags);

	amba_clrbitsl(TIMER_CTR_REG, TIMER_CTR_EN1);
	amba_writel(TIMER1_STATUS_REG, APBREAD_RELOAD_NUM);
	amba_writel(TIMER1_RELOAD_REG, 0x0);
	amba_writel(TIMER1_MATCH1_REG, 0x0);
	amba_writel(TIMER1_MATCH2_REG, 0x0);
	amba_clrbitsl(TIMER_CTR_REG, TIMER_CTR_OF1);
	amba_clrbitsl(TIMER_CTR_REG, TIMER_CTR_CSL1);

	amba_setbitsl(TIMER_CTR_REG, TIMER_CTR_EN1);
	do {
		raw_counter++;
	} while(__raw_readl((const volatile void *)TIMER1_STATUS_REG));

	amba_clrbitsl(TIMER_CTR_REG, TIMER_CTR_EN1);
	amba_writel(TIMER1_STATUS_REG, APBREAD_RELOAD_NUM);
	amba_writel(TIMER1_RELOAD_REG, 0x0);
	amba_writel(TIMER1_MATCH1_REG, 0x0);
	amba_writel(TIMER1_MATCH2_REG, 0x0);
	amba_clrbitsl(TIMER_CTR_REG, TIMER_CTR_OF1);
	amba_clrbitsl(TIMER_CTR_REG, TIMER_CTR_CSL1);

	amba_setbitsl(TIMER_CTR_REG, TIMER_CTR_EN1);
	do {
		amba_counter++;
	} while(amba_readl(TIMER1_STATUS_REG));
	amba_clrbitsl(TIMER_CTR_REG, TIMER_CTR_EN1);

	local_irq_restore(flags);
	enable_nonboot_cpus();

#if defined(CONFIG_PLAT_AMBARELLA_SUPPORT_HAL)
	raw_counter *= get_apb_bus_freq_hz();
#else
	raw_counter *= clk_get_rate(clk_get(NULL, "gclk_apb"));
#endif
	do_div(raw_counter, APBREAD_RELOAD_NUM);
#if defined(CONFIG_PLAT_AMBARELLA_SUPPORT_HAL)
	amba_counter *= get_apb_bus_freq_hz();
#else
	amba_counter *= clk_get_rate(clk_get(NULL, "gclk_apb"));
#endif
	do_div(amba_counter, APBREAD_RELOAD_NUM);
	pr_info("CPU[0x%x] APBRead: raw speed %llu/s!\n",
		cpu_architecture(), raw_counter);
	pr_info("CPU[0x%x] APBRead: amba speed %llu/s!\n",
		cpu_architecture(), amba_counter);
}
Example #11
0
static int flush_rxfifo(void)
{
	int retry_count = 1000;
	int rval = 0;

#if (CHIP_REV == A2) || (CHIP_REV == A3)
	retry_count = retry_count * 10;
	if (!(amba_readl(USB_DEV_STS_REG) & USB_DEV_RXFIFO_EMPTY_STS)){
		/* Switch to slave mode */
		amba_clrbitsl(USB_DEV_CTRL_REG, USB_DEV_DMA_MD);

		while (!(amba_readl(USB_DEV_STS_REG) & USB_DEV_RXFIFO_EMPTY_STS)) {
			if (retry_count-- < 0) {
				printk (KERN_ERR "%s: failed", __func__);
				rval = -1;
				break;
			}
			amba_readl(USB_RXFIFO_BASE);
			udelay(5);
		}
		/* Switch to DMA mode */
		amba_setbitsl(USB_DEV_CTRL_REG, USB_DEV_DMA_MD);
	}
#else
	amba_setbitsl(USB_DEV_CTRL_REG, USB_DEV_NAK);
	amba_setbitsl(USB_DEV_CTRL_REG, USB_DEV_FLUSH_RXFIFO);
	while(!(amba_readl(USB_DEV_STS_REG) & USB_DEV_RXFIFO_EMPTY_STS)) {
		if (retry_count-- < 0) {
			printk (KERN_ERR "%s: failed", __func__);
			rval = -1;
			break;
		}
		udelay(5);
	}
	amba_clrbitsl(USB_DEV_CTRL_REG, USB_DEV_NAK);
#endif
	return rval;
}
Example #12
0
int __init ambarella_init_fio(void)
{

	fio_amb_exit_random_mode();
	enable_fio_dma();
	amba_writel(FLASH_INT_REG, 0x0);
	amba_writel(XD_INT_REG, 0x0);
	amba_writel(CF_STA_REG, CF_STA_CW | CF_STA_DW);
//#if defined(CONFIG_AMBARELLA_FIO_FORCE_SDIO_GPIO)
	unsigned long				flags;

	//SMIO_38 ~ SMIO_43
	ambarella_gpio_raw_lock(2, &flags);
	amba_clrbitsl(GPIO2_AFSEL_REG, 0x000007e0);
	amba_clrbitsl(GPIO2_DIR_REG, 0x00000780);
	amba_setbitsl(GPIO2_DIR_REG, 0x00000060);
	amba_writel(GPIO2_MASK_REG, 0x00000060);
	amba_writel(GPIO2_DATA_REG, 0x00000040);
	ambarella_gpio_raw_unlock(2, &flags);
//#endif

	return 0;
}
Example #13
0
static inline void ambarella_cs_timer_init(void)
{
#if defined(CONFIG_PLAT_AMBARELLA_SUPPORT_HAL)
#else
	ambarella_register_clk(&pll_out_core);
	ambarella_register_clk(&pll_out_idsp);
	ambarella_register_clk(&gclk_core);
	ambarella_register_clk(&gclk_ahb);
	ambarella_register_clk(&gclk_apb);
#endif
#if !defined(CONFIG_MACH_HYACINTH_0) && !defined(CONFIG_MACH_HYACINTH_1)
	amba_clrbitsl(TIMER_CTR_REG, AMBARELLA_CS_TIMER_CTR_EN);
	amba_clrbitsl(TIMER_CTR_REG, AMBARELLA_CS_TIMER_CTR_OF);
	amba_clrbitsl(TIMER_CTR_REG, AMBARELLA_CS_TIMER_CTR_CSL);
	amba_writel(AMBARELLA_CS_TIMER_STATUS_REG, 0xffffffff);
	amba_writel(AMBARELLA_CS_TIMER_RELOAD_REG, 0xffffffff);
	amba_writel(AMBARELLA_CS_TIMER_MATCH1_REG, 0x0);
	amba_writel(AMBARELLA_CS_TIMER_MATCH2_REG, 0x0);
	amba_setbitsl(TIMER_CTR_REG, AMBARELLA_CS_TIMER_CTR_EN);
#else /* defined(CONFIG_MACH_HYACINTH_0) || defined(CONFIG_MACH_HYACINTH_1) */
	if (machine_is_hyacinth_0()) {
		amba_clrbitsl(TIMER_CTR_REG, AMBARELLA_CS_TIMER_AXI0_CTR_EN);
		amba_clrbitsl(TIMER_CTR_REG, AMBARELLA_CS_TIMER_AXI0_CTR_OF);
		amba_clrbitsl(TIMER_CTR_REG, AMBARELLA_CS_TIMER_AXI0_CTR_CSL);
		amba_writel(AMBARELLA_CS_TIMER_AXI0_STATUS_REG, 0xffffffff);
		amba_writel(AMBARELLA_CS_TIMER_AXI0_RELOAD_REG, 0xffffffff);
		amba_writel(AMBARELLA_CS_TIMER_AXI0_MATCH1_REG, 0x0);
		amba_writel(AMBARELLA_CS_TIMER_AXI0_MATCH2_REG, 0x0);
		amba_setbitsl(TIMER_CTR_REG, AMBARELLA_CS_TIMER_AXI0_CTR_EN);
	}
	else if (machine_is_hyacinth_1()) {
		amba_clrbitsl(TIMER_CTR_REG, AMBARELLA_CS_TIMER_AXI1_CTR_EN);
		amba_clrbitsl(TIMER_CTR_REG, AMBARELLA_CS_TIMER_AXI1_CTR_OF);
		amba_clrbitsl(TIMER_CTR_REG, AMBARELLA_CS_TIMER_AXI1_CTR_CSL);
		amba_writel(AMBARELLA_CS_TIMER_AXI1_STATUS_REG, 0xffffffff);
		amba_writel(AMBARELLA_CS_TIMER_AXI1_RELOAD_REG, 0xffffffff);
		amba_writel(AMBARELLA_CS_TIMER_AXI1_MATCH1_REG, 0x0);
		amba_writel(AMBARELLA_CS_TIMER_AXI1_MATCH2_REG, 0x0);
		amba_setbitsl(TIMER_CTR_REG, AMBARELLA_CS_TIMER_AXI1_CTR_EN);
	}
#endif /* defined(CONFIG_MACH_HYACINTH_0) || defined(CONFIG_MACH_HYACINTH_1) */
}
Example #14
0
static void ambench_apbread(void)
{
	u64					raw_counter = 0;
	u64					amba_counter = 0;
	unsigned long				flags;

	disable_nonboot_cpus();
	local_irq_save(flags);

	amba_clrbitsl(TIMER_CTR_REG, TIMER_CTR_EN1);
	amba_writel(TIMER1_STATUS_REG, APBREAD_RELOAD_NUM);
	amba_writel(TIMER1_RELOAD_REG, 0x0);
	amba_writel(TIMER1_MATCH1_REG, 0x0);
	amba_writel(TIMER1_MATCH2_REG, 0x0);
	amba_clrbitsl(TIMER_CTR_REG, TIMER_CTR_OF1);
	amba_clrbitsl(TIMER_CTR_REG, TIMER_CTR_CSL1);

	amba_setbitsl(TIMER_CTR_REG, TIMER_CTR_EN1);
	do {
		raw_counter++;
	} while(__raw_readl(TIMER1_STATUS_REG));

	amba_clrbitsl(TIMER_CTR_REG, TIMER_CTR_EN1);
	amba_writel(TIMER1_STATUS_REG, APBREAD_RELOAD_NUM);
	amba_writel(TIMER1_RELOAD_REG, 0x0);
	amba_writel(TIMER1_MATCH1_REG, 0x0);
	amba_writel(TIMER1_MATCH2_REG, 0x0);
	amba_clrbitsl(TIMER_CTR_REG, TIMER_CTR_OF1);
	amba_clrbitsl(TIMER_CTR_REG, TIMER_CTR_CSL1);

	amba_setbitsl(TIMER_CTR_REG, TIMER_CTR_EN1);
	do {
		amba_counter++;
	} while(amba_readl(TIMER1_STATUS_REG));
	amba_clrbitsl(TIMER_CTR_REG, TIMER_CTR_EN1);

	local_irq_restore(flags);
	enable_nonboot_cpus();

	raw_counter *= get_apb_bus_freq_hz();
	do_div(raw_counter, APBREAD_RELOAD_NUM);
	amba_counter *= get_apb_bus_freq_hz();
	do_div(amba_counter, APBREAD_RELOAD_NUM);
	pr_info("CPU[0x%x] APBRead: raw speed %llu/s!\n",
		cpu_architecture(), raw_counter);
	pr_info("CPU[0x%x] APBRead: amba speed %llu/s!\n",
		cpu_architecture(), amba_counter);
}
Example #15
0
/* ==========================================================================*/
void __fio_select_lock(int module)
{
	u32					fio_ctr;
	u32					fio_dmactr;
#if (SD_HAS_INTERNAL_MUXER == 1)
	unsigned long				flags;
#endif

	fio_ctr = amba_readl(FIO_CTR_REG);
	fio_dmactr = amba_readl(FIO_DMACTR_REG);

	switch (module) {
	case SELECT_FIO_FL:
		fio_ctr &= ~FIO_CTR_XD;
		fio_dmactr = (fio_dmactr & 0xcfffffff) | FIO_DMACTR_FL;
		break;

	case SELECT_FIO_XD:
		fio_ctr |= FIO_CTR_XD;
		fio_dmactr = (fio_dmactr & 0xcfffffff) | FIO_DMACTR_XD;
		break;

	case SELECT_FIO_CF:
		fio_ctr &= ~FIO_CTR_XD;
		fio_dmactr = (fio_dmactr & 0xcfffffff) | FIO_DMACTR_CF;
#if (FIO_SUPPORT_AHB_CLK_ENA == 1)
		fio_amb_sd2_disable();
		fio_amb_cf_enable();
#endif
		break;

	case SELECT_FIO_SD:
		fio_ctr &= ~FIO_CTR_XD;
		fio_dmactr = (fio_dmactr & 0xcfffffff) | FIO_DMACTR_SD;
		break;

	case SELECT_FIO_SDIO:
		fio_ctr |= FIO_CTR_XD;
		fio_dmactr = (fio_dmactr & 0xcfffffff) | FIO_DMACTR_SD;
		break;

	case SELECT_FIO_SD2:
#if (FIO_SUPPORT_AHB_CLK_ENA == 1)
		fio_amb_cf_disable();
		fio_amb_sd2_enable();
#endif
#if (SD_HOST1_HOST2_HAS_MUX == 1)
		fio_ctr &= ~FIO_CTR_XD;
		fio_dmactr = (fio_dmactr & 0xcfffffff) | FIO_DMACTR_SD;
#endif
		break;

	default:
		break;
	}

#if (SD_HAS_INTERNAL_MUXER == 1)
	spin_lock_irqsave(&fio_sd0_int_lock, flags);
	amba_clrbitsl(SD_NISEN_REG, SD_NISEN_CARD);
	spin_unlock_irqrestore(&fio_sd0_int_lock, flags);
#if defined(CONFIG_AMBARELLA_FIO_FORCE_SDIO_GPIO)
	if (module != SELECT_FIO_SDIO) {
		ambarella_gpio_raw_lock(2, &flags);
		amba_clrbitsl(GPIO2_AFSEL_REG, 0x000007e0);
		ambarella_gpio_raw_unlock(2, &flags);
	}
#endif
#endif
	amba_writel(FIO_CTR_REG, fio_ctr);
	amba_writel(FIO_DMACTR_REG, fio_dmactr);
#if (SD_HAS_INTERNAL_MUXER == 1)
	if (module == SELECT_FIO_SD) {
		spin_lock_irqsave(&fio_sd0_int_lock, flags);
		amba_writel(SD_NISEN_REG, fio_sd_int);
		amba_writel(SD_NIXEN_REG, fio_sd_int);
		spin_unlock_irqrestore(&fio_sd0_int_lock, flags);
	} else
	if (module == SELECT_FIO_SDIO) {
#if defined(CONFIG_AMBARELLA_FIO_FORCE_SDIO_GPIO)
		ambarella_gpio_raw_lock(2, &flags);
		amba_setbitsl(GPIO2_AFSEL_REG, 0x000007e0);
		ambarella_gpio_raw_unlock(2, &flags);
#endif
		spin_lock_irqsave(&fio_sd0_int_lock, flags);
		amba_writel(SD_NISEN_REG, fio_sdio_int);
		amba_writel(SD_NIXEN_REG, fio_sdio_int);
		spin_unlock_irqrestore(&fio_sd0_int_lock, flags);
	}
#endif
}
Example #16
0
/* ==========================================================================*/
void __fio_select_lock(int module)
{
	u32 fio_ctr;
	u32 fio_dmactr;

	fio_ctr = amba_readl(FIO_CTR_REG);
	fio_dmactr = amba_readl(FIO_DMACTR_REG);

	switch (module) {
	case SELECT_FIO_FL:
		fio_dmactr = (fio_dmactr & 0xcfffffff) | FIO_DMACTR_FL;
		break;

	case SELECT_FIO_XD:
		fio_ctr |= FIO_CTR_XD;
		fio_dmactr = (fio_dmactr & 0xcfffffff) | FIO_DMACTR_XD;
		break;

	case SELECT_FIO_CF:
		fio_ctr &= ~FIO_CTR_XD;
		fio_dmactr = (fio_dmactr & 0xcfffffff) | FIO_DMACTR_CF;
#if (FIO_SUPPORT_AHB_CLK_ENA == 1)
		fio_amb_sd2_disable();
		fio_amb_cf_enable();
#endif
		break;

	case SELECT_FIO_SD:
		fio_ctr &= ~FIO_CTR_XD;
		fio_dmactr = (fio_dmactr & 0xcfffffff) | FIO_DMACTR_SD;
		break;

	case SELECT_FIO_SDIO:
		fio_ctr |= FIO_CTR_XD;
		fio_dmactr = (fio_dmactr & 0xcfffffff) | FIO_DMACTR_SD;
		break;

	case SELECT_FIO_SD2:
#if (FIO_SUPPORT_AHB_CLK_ENA == 1)
		fio_amb_cf_disable();
		fio_amb_sd2_enable();
#endif
#if (CHIP_REV == A7L)
		fio_ctr &= ~FIO_CTR_XD;
		fio_dmactr = (fio_dmactr & 0xcfffffff) | FIO_DMACTR_SD;
#endif
		break;

	default:
		break;
	}

#if (SD_HAS_INTERNAL_MUXER == 1)
	if (module != SELECT_FIO_SDIO) {
#if (HANDLE_SDIO_FAKE_IRQ == 1)
		amba_clrbitsw(SD_NISEN_REG, SD_NISEN_CARD);
#endif
		//SMIO_38 ~ SMIO_43
		amba_clrbitsl(GPIO2_AFSEL_REG, 0x000007e0);
	}
#endif

	amba_writel(FIO_DMACTR_REG, fio_dmactr);
	amba_writel(FIO_CTR_REG, fio_ctr);

#if (SD_HAS_INTERNAL_MUXER == 1)
	if (module == SELECT_FIO_SDIO) {
		//SMIO_38 ~ SMIO_43
		amba_setbitsl(GPIO2_AFSEL_REG, 0x000007e0);
	}
#endif
}
Example #17
0
void fio_amb_exit_random_mode(void)
{
	amba_clrbitsl(FIO_CTR_REG, FIO_CTR_RR);
}
Example #18
0
void fio_amb_sd2_disable(void)
{
	amba_clrbitsl(HOST_AHB_CLK_ENABLE_REG, HOST_AHB_SDIO_SEL);
}
Example #19
0
void fio_amb_cf_disable(void)
{
	amba_clrbitsl(HOST_AHB_CLK_ENABLE_REG, HOST_AHB_CF_CLK_ENB);
}
Example #20
0
void fio_amb_fl_disable(void)
{
	amba_clrbitsl(HOST_AHB_CLK_ENABLE_REG, HOST_AHB_FLASH_CLK_ENB);
}
Example #21
0
static void __serial_ambarella_disable_ms(struct uart_port *port)
{
	amba_clrbitsl(port->membase + UART_IE_OFFSET, UART_IE_EDSSI);
}
Example #22
0
static void serial_ambarella_stop_rx(struct uart_port *port)
{
	amba_clrbitsl(port->membase + UART_IE_OFFSET, UART_IE_ERBFI);
}
Example #23
0
u32 ambarella_timer_resume(u32 level)
{
	u32					timer_ctr_mask;

#if !defined(CONFIG_MACH_HYACINTH_0) && !defined(CONFIG_MACH_HYACINTH_1)
		timer_ctr_mask = AMBARELLA_CE_TIMER_CTR_MASK;
#if defined(CONFIG_AMBARELLA_SUPPORT_CLOCKSOURCE)
		timer_ctr_mask |= AMBARELLA_CS_TIMER_CTR_MASK;
#endif
		amba_clrbitsl(TIMER_CTR_REG, timer_ctr_mask);
#if defined(CONFIG_AMBARELLA_SUPPORT_CLOCKSOURCE)
		amba_writel(AMBARELLA_CS_TIMER_STATUS_REG,
				ambarella_timer_pm.timer_cs_status_reg);
		amba_writel(AMBARELLA_CS_TIMER_RELOAD_REG,
				ambarella_timer_pm.timer_cs_reload_reg);
		amba_writel(AMBARELLA_CS_TIMER_MATCH1_REG,
				ambarella_timer_pm.timer_cs_match1_reg);
		amba_writel(AMBARELLA_CS_TIMER_MATCH2_REG,
				ambarella_timer_pm.timer_cs_match2_reg);
#endif
		if ((ambarella_timer_pm.timer_ce_status_reg == 0) &&
			(ambarella_timer_pm.timer_ce_reload_reg == 0)){
			amba_writel(AMBARELLA_CE_TIMER_STATUS_REG,
					AMBARELLA_TIMER_FREQ / HZ);
		} else {
			amba_writel(AMBARELLA_CE_TIMER_STATUS_REG,
					ambarella_timer_pm.timer_ce_status_reg);
		}
		amba_writel(AMBARELLA_CE_TIMER_RELOAD_REG,
				ambarella_timer_pm.timer_ce_reload_reg);
		amba_writel(AMBARELLA_CE_TIMER_MATCH1_REG,
				ambarella_timer_pm.timer_ce_match1_reg);
		amba_writel(AMBARELLA_CE_TIMER_MATCH2_REG,
				ambarella_timer_pm.timer_ce_match2_reg);
#else /* defined(CONFIG_MACH_HYACINTH_0) || defined(CONFIG_MACH_HYACINTH_1) */
	if (machine_is_hyacinth_0()) {
		timer_ctr_mask = AMBARELLA_CE_TIMER_AXI0_CTR_MASK;
#if defined(CONFIG_AMBARELLA_SUPPORT_CLOCKSOURCE)
		timer_ctr_mask |= AMBARELLA_CS_TIMER_AXI0_CTR_MASK;
#endif
		amba_clrbitsl(TIMER_CTR_REG, timer_ctr_mask);
#if defined(CONFIG_AMBARELLA_SUPPORT_CLOCKSOURCE)
		amba_writel(AMBARELLA_CS_TIMER_AXI0_STATUS_REG,
				ambarella_timer_pm.timer_cs_status_reg);
		amba_writel(AMBARELLA_CS_TIMER_AXI0_RELOAD_REG,
				ambarella_timer_pm.timer_cs_reload_reg);
		amba_writel(AMBARELLA_CS_TIMER_AXI0_MATCH1_REG,
				ambarella_timer_pm.timer_cs_match1_reg);
		amba_writel(AMBARELLA_CS_TIMER_AXI0_MATCH2_REG,
				ambarella_timer_pm.timer_cs_match2_reg);
#endif
		if ((ambarella_timer_pm.timer_ce_status_reg == 0) &&
			(ambarella_timer_pm.timer_ce_reload_reg == 0)){
			amba_writel(AMBARELLA_CE_TIMER_AXI0_STATUS_REG,
					AMBARELLA_TIMER_FREQ / HZ);
		} else {
			amba_writel(AMBARELLA_CE_TIMER_AXI0_STATUS_REG,
					ambarella_timer_pm.timer_ce_status_reg);
		}
		amba_writel(AMBARELLA_CE_TIMER_AXI0_RELOAD_REG,
				ambarella_timer_pm.timer_ce_reload_reg);
		amba_writel(AMBARELLA_CE_TIMER_AXI0_MATCH1_REG,
				ambarella_timer_pm.timer_ce_match1_reg);
		amba_writel(AMBARELLA_CE_TIMER_AXI0_MATCH2_REG,
				ambarella_timer_pm.timer_ce_match2_reg);
	}
	else if (machine_is_hyacinth_1()) {
		timer_ctr_mask = AMBARELLA_CE_TIMER_AXI1_CTR_MASK;
#if defined(CONFIG_AMBARELLA_SUPPORT_CLOCKSOURCE)
		timer_ctr_mask |= AMBARELLA_CS_TIMER_AXI1_CTR_MASK;
#endif
		amba_clrbitsl(TIMER_CTR_REG, timer_ctr_mask);
#if defined(CONFIG_AMBARELLA_SUPPORT_CLOCKSOURCE)
		amba_writel(AMBARELLA_CS_TIMER_AXI1_STATUS_REG,
				ambarella_timer_pm.timer_cs_status_reg);
		amba_writel(AMBARELLA_CS_TIMER_AXI1_RELOAD_REG,
				ambarella_timer_pm.timer_cs_reload_reg);
		amba_writel(AMBARELLA_CS_TIMER_AXI1_MATCH1_REG,
				ambarella_timer_pm.timer_cs_match1_reg);
		amba_writel(AMBARELLA_CS_TIMER_AXI1_MATCH2_REG,
				ambarella_timer_pm.timer_cs_match2_reg);
#endif
		if ((ambarella_timer_pm.timer_ce_status_reg == 0) &&
			(ambarella_timer_pm.timer_ce_reload_reg == 0)){
			amba_writel(AMBARELLA_CE_TIMER_AXI1_STATUS_REG,
					AMBARELLA_TIMER_FREQ / HZ);
		} else {
			amba_writel(AMBARELLA_CE_TIMER_AXI1_STATUS_REG,
					ambarella_timer_pm.timer_ce_status_reg);
		}
		amba_writel(AMBARELLA_CE_TIMER_AXI1_RELOAD_REG,
				ambarella_timer_pm.timer_ce_reload_reg);
		amba_writel(AMBARELLA_CE_TIMER_AXI1_MATCH1_REG,
				ambarella_timer_pm.timer_ce_match1_reg);
		amba_writel(AMBARELLA_CE_TIMER_AXI1_MATCH2_REG,
				ambarella_timer_pm.timer_ce_match2_reg);
	}
#endif /* defined(CONFIG_MACH_HYACINTH_0) || defined(CONFIG_MACH_HYACINTH_1) */

	if (ambarella_timer_pm.timer_clk != AMBARELLA_TIMER_FREQ) {
		clockevents_calc_mult_shift(&ambarella_clkevt,
				AMBARELLA_TIMER_FREQ, 5);
		ambarella_clkevt.max_delta_ns =
			clockevent_delta2ns(0xffffffff, &ambarella_clkevt);
		ambarella_clkevt.min_delta_ns =
			clockevent_delta2ns(1, &ambarella_clkevt);
		switch (ambarella_clkevt.mode) {
		case CLOCK_EVT_MODE_PERIODIC:
			ambarella_ce_timer_set_periodic();
			break;
		case CLOCK_EVT_MODE_ONESHOT:
		case CLOCK_EVT_MODE_UNUSED:
		case CLOCK_EVT_MODE_SHUTDOWN:
		case CLOCK_EVT_MODE_RESUME:
			break;
		}

#if defined(CONFIG_AMBARELLA_SUPPORT_CLOCKSOURCE)
		clocksource_change_rating(&ambarella_cs_timer_clksrc, 0);
		ambarella_cs_timer_clksrc.mult = clocksource_hz2mult(
			AMBARELLA_TIMER_FREQ, ambarella_cs_timer_clksrc.shift);
		pr_debug("%s: mult = %u, shift = %u\n",
			ambarella_cs_timer_clksrc.name,
			ambarella_cs_timer_clksrc.mult,
			ambarella_cs_timer_clksrc.shift);
		clocksource_change_rating(&ambarella_cs_timer_clksrc,
			AMBARELLA_TIMER_RATING);
#if defined(CONFIG_HAVE_SCHED_CLOCK)
		setup_sched_clock(ambarella_read_sched_clock,
			32, AMBARELLA_TIMER_FREQ);
#endif
#endif
	}

#if !defined(CONFIG_MACH_HYACINTH_0) && !defined(CONFIG_MACH_HYACINTH_1)
		timer_ctr_mask = AMBARELLA_CE_TIMER_CTR_MASK;
#if defined(CONFIG_AMBARELLA_SUPPORT_CLOCKSOURCE)
		timer_ctr_mask |= AMBARELLA_CS_TIMER_CTR_MASK;
#endif
		amba_setbitsl(TIMER_CTR_REG,
				(ambarella_timer_pm.timer_ctr_reg & timer_ctr_mask));
		if (level)
			enable_irq(AMBARELLA_CE_TIMER_IRQ);
#else /* defined(CONFIG_MACH_HYACINTH_0) || defined(CONFIG_MACH_HYACINTH_1) */
	if (machine_is_hyacinth_0()) {
		timer_ctr_mask = AMBARELLA_CE_TIMER_AXI0_CTR_MASK;
#if defined(CONFIG_AMBARELLA_SUPPORT_CLOCKSOURCE)
		timer_ctr_mask |= AMBARELLA_CS_TIMER_AXI0_CTR_MASK;
#endif
		amba_setbitsl(TIMER_CTR_REG,
				(ambarella_timer_pm.timer_ctr_reg & timer_ctr_mask));
		if (level)
			enable_irq(AMBARELLA_CE_TIMER_AXI0_IRQ);
	}
	else if (machine_is_hyacinth_1()) {
		timer_ctr_mask = AMBARELLA_CE_TIMER_AXI1_CTR_MASK;
#if defined(CONFIG_AMBARELLA_SUPPORT_CLOCKSOURCE)
		timer_ctr_mask |= AMBARELLA_CS_TIMER_AXI1_CTR_MASK;
#endif
		amba_setbitsl(TIMER_CTR_REG,
				(ambarella_timer_pm.timer_ctr_reg & timer_ctr_mask));
		if (level)
			enable_irq(AMBARELLA_CE_TIMER_AXI1_IRQ);
	}
#endif /* defined(CONFIG_MACH_HYACINTH_0) || defined(CONFIG_MACH_HYACINTH_1) */

#if defined(CONFIG_SMP)
	//percpu_timer_update_rate(amb_get_axi_clock_frequency(HAL_BASE_VP));
#endif

	return 0;
}
Example #24
0
u32 ambarella_timer_suspend(u32 level)
{
	u32					timer_ctr_mask;

	ambarella_timer_pm.timer_ctr_reg = amba_readl(TIMER_CTR_REG);
	ambarella_timer_pm.timer_clk = AMBARELLA_TIMER_FREQ;

#if !defined(CONFIG_MACH_HYACINTH_0) && !defined(CONFIG_MACH_HYACINTH_1)
		ambarella_timer_pm.timer_ce_status_reg =
			amba_readl(AMBARELLA_CE_TIMER_STATUS_REG);
		ambarella_timer_pm.timer_ce_reload_reg =
			amba_readl(AMBARELLA_CE_TIMER_RELOAD_REG);
		ambarella_timer_pm.timer_ce_match1_reg =
			amba_readl(AMBARELLA_CE_TIMER_MATCH1_REG);
		ambarella_timer_pm.timer_ce_match2_reg =
			amba_readl(AMBARELLA_CE_TIMER_MATCH2_REG);
#if defined(CONFIG_AMBARELLA_SUPPORT_CLOCKSOURCE)
		ambarella_timer_pm.timer_cs_status_reg =
			amba_readl(AMBARELLA_CS_TIMER_STATUS_REG);
		ambarella_timer_pm.timer_cs_reload_reg =
			amba_readl(AMBARELLA_CS_TIMER_RELOAD_REG);
		ambarella_timer_pm.timer_cs_match1_reg =
			amba_readl(AMBARELLA_CS_TIMER_MATCH1_REG);
		ambarella_timer_pm.timer_cs_match2_reg =
			amba_readl(AMBARELLA_CS_TIMER_MATCH2_REG);
#endif

#else /* defined(CONFIG_MACH_HYACINTH_0) || defined(CONFIG_MACH_HYACINTH_1) */
	if (machine_is_hyacinth_0()) {
		ambarella_timer_pm.timer_ce_status_reg =
			amba_readl(AMBARELLA_CE_TIMER_AXI0_STATUS_REG);
		ambarella_timer_pm.timer_ce_reload_reg =
			amba_readl(AMBARELLA_CE_TIMER_AXI0_RELOAD_REG);
		ambarella_timer_pm.timer_ce_match1_reg =
			amba_readl(AMBARELLA_CE_TIMER_AXI0_MATCH1_REG);
		ambarella_timer_pm.timer_ce_match2_reg =
			amba_readl(AMBARELLA_CE_TIMER_AXI0_MATCH2_REG);
#if defined(CONFIG_AMBARELLA_SUPPORT_CLOCKSOURCE)
		ambarella_timer_pm.timer_cs_status_reg =
			amba_readl(AMBARELLA_CS_TIMER_AXI0_STATUS_REG);
		ambarella_timer_pm.timer_cs_reload_reg =
			amba_readl(AMBARELLA_CS_TIMER_AXI0_RELOAD_REG);
		ambarella_timer_pm.timer_cs_match1_reg =
			amba_readl(AMBARELLA_CS_TIMER_AXI0_MATCH1_REG);
		ambarella_timer_pm.timer_cs_match2_reg =
			amba_readl(AMBARELLA_CS_TIMER_AXI0_MATCH2_REG);
#endif
	}
	else if (machine_is_hyacinth_1()) {
		ambarella_timer_pm.timer_ce_status_reg =
			amba_readl(AMBARELLA_CE_TIMER_AXI1_STATUS_REG);
		ambarella_timer_pm.timer_ce_reload_reg =
			amba_readl(AMBARELLA_CE_TIMER_AXI1_RELOAD_REG);
		ambarella_timer_pm.timer_ce_match1_reg =
			amba_readl(AMBARELLA_CE_TIMER_AXI1_MATCH1_REG);
		ambarella_timer_pm.timer_ce_match2_reg =
			amba_readl(AMBARELLA_CE_TIMER_AXI1_MATCH2_REG);
#if defined(CONFIG_AMBARELLA_SUPPORT_CLOCKSOURCE)
		ambarella_timer_pm.timer_cs_status_reg =
			amba_readl(AMBARELLA_CS_TIMER_AXI1_STATUS_REG);
		ambarella_timer_pm.timer_cs_reload_reg =
			amba_readl(AMBARELLA_CS_TIMER_AXI1_RELOAD_REG);
		ambarella_timer_pm.timer_cs_match1_reg =
			amba_readl(AMBARELLA_CS_TIMER_AXI1_MATCH1_REG);
		ambarella_timer_pm.timer_cs_match2_reg =
			amba_readl(AMBARELLA_CS_TIMER_AXI1_MATCH2_REG);
#endif
	}
#endif /* defined(CONFIG_MACH_HYACINTH_0) || defined(CONFIG_MACH_HYACINTH_1) */
	if (level) {
#if !defined(CONFIG_MACH_HYACINTH_0) && !defined(CONFIG_MACH_HYACINTH_1)
			disable_irq(AMBARELLA_CE_TIMER_IRQ);
			timer_ctr_mask = AMBARELLA_CE_TIMER_CTR_MASK;
#if defined(CONFIG_AMBARELLA_SUPPORT_CLOCKSOURCE)
			timer_ctr_mask |= AMBARELLA_CS_TIMER_CTR_MASK;
#endif
#else /* defined(CONFIG_MACH_HYACINTH_0) || defined(CONFIG_MACH_HYACINTH_1) */
		if (machine_is_hyacinth_0()) {
			disable_irq(AMBARELLA_CE_TIMER_AXI0_IRQ);
			timer_ctr_mask = AMBARELLA_CE_TIMER_AXI0_CTR_MASK;
#if defined(CONFIG_AMBARELLA_SUPPORT_CLOCKSOURCE)
			timer_ctr_mask |= AMBARELLA_CS_TIMER_AXI0_CTR_MASK;
#endif
		}
		else if (machine_is_hyacinth_1()) {
			disable_irq(AMBARELLA_CE_TIMER_AXI1_IRQ);
			timer_ctr_mask = AMBARELLA_CE_TIMER_AXI1_CTR_MASK;
#if defined(CONFIG_AMBARELLA_SUPPORT_CLOCKSOURCE)
			timer_ctr_mask |= AMBARELLA_CS_TIMER_AXI1_CTR_MASK;
#endif
		}
#endif /* defined(CONFIG_MACH_HYACINTH_0) || defined(CONFIG_MACH_HYACINTH_1) */
		amba_clrbitsl(TIMER_CTR_REG, timer_ctr_mask);
	}

	return 0;
}