⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 at32ap7000.c

📁 linux 内核源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
		clk_set_parent(&atmel_lcdfb0_pixclk, &pll0);		clk_set_rate(&atmel_lcdfb0_pixclk, clk_get_rate(&pll0));		break;	default:		goto err_invalid_id;	}	if (fbmem_len) {		pdev->resource[2].start = fbmem_start;		pdev->resource[2].end = fbmem_start + fbmem_len - 1;		pdev->resource[2].flags = IORESOURCE_MEM;	}	info = pdev->dev.platform_data;	memcpy(info, data, sizeof(struct atmel_lcdfb_info));	info->default_monspecs = monspecs;	platform_device_register(pdev);	return pdev;err_invalid_id:	kfree(modedb);err_dup_modedb:	kfree(monspecs);	return NULL;}/* -------------------------------------------------------------------- *  SSC * -------------------------------------------------------------------- */static struct resource ssc0_resource[] = {	PBMEM(0xffe01c00),	IRQ(10),};DEFINE_DEV(ssc, 0);DEV_CLK(pclk, ssc0, pba, 7);static struct resource ssc1_resource[] = {	PBMEM(0xffe02000),	IRQ(11),};DEFINE_DEV(ssc, 1);DEV_CLK(pclk, ssc1, pba, 8);static struct resource ssc2_resource[] = {	PBMEM(0xffe02400),	IRQ(12),};DEFINE_DEV(ssc, 2);DEV_CLK(pclk, ssc2, pba, 9);struct platform_device *__initat32_add_device_ssc(unsigned int id, unsigned int flags){	struct platform_device *pdev;	switch (id) {	case 0:		pdev = &ssc0_device;		if (flags & ATMEL_SSC_RF)			select_peripheral(PA(21), PERIPH_A, 0);	/* RF */		if (flags & ATMEL_SSC_RK)			select_peripheral(PA(22), PERIPH_A, 0);	/* RK */		if (flags & ATMEL_SSC_TK)			select_peripheral(PA(23), PERIPH_A, 0);	/* TK */		if (flags & ATMEL_SSC_TF)			select_peripheral(PA(24), PERIPH_A, 0);	/* TF */		if (flags & ATMEL_SSC_TD)			select_peripheral(PA(25), PERIPH_A, 0);	/* TD */		if (flags & ATMEL_SSC_RD)			select_peripheral(PA(26), PERIPH_A, 0);	/* RD */		break;	case 1:		pdev = &ssc1_device;		if (flags & ATMEL_SSC_RF)			select_peripheral(PA(0), PERIPH_B, 0);	/* RF */		if (flags & ATMEL_SSC_RK)			select_peripheral(PA(1), PERIPH_B, 0);	/* RK */		if (flags & ATMEL_SSC_TK)			select_peripheral(PA(2), PERIPH_B, 0);	/* TK */		if (flags & ATMEL_SSC_TF)			select_peripheral(PA(3), PERIPH_B, 0);	/* TF */		if (flags & ATMEL_SSC_TD)			select_peripheral(PA(4), PERIPH_B, 0);	/* TD */		if (flags & ATMEL_SSC_RD)			select_peripheral(PA(5), PERIPH_B, 0);	/* RD */		break;	case 2:		pdev = &ssc2_device;		if (flags & ATMEL_SSC_TD)			select_peripheral(PB(13), PERIPH_A, 0);	/* TD */		if (flags & ATMEL_SSC_RD)			select_peripheral(PB(14), PERIPH_A, 0);	/* RD */		if (flags & ATMEL_SSC_TK)			select_peripheral(PB(15), PERIPH_A, 0);	/* TK */		if (flags & ATMEL_SSC_TF)			select_peripheral(PB(16), PERIPH_A, 0);	/* TF */		if (flags & ATMEL_SSC_RF)			select_peripheral(PB(17), PERIPH_A, 0);	/* RF */		if (flags & ATMEL_SSC_RK)			select_peripheral(PB(18), PERIPH_A, 0);	/* RK */		break;	default:		return NULL;	}	platform_device_register(pdev);	return pdev;}/* -------------------------------------------------------------------- *  USB Device Controller * -------------------------------------------------------------------- */static struct resource usba0_resource[] __initdata = {	{		.start		= 0xff300000,		.end		= 0xff3fffff,		.flags		= IORESOURCE_MEM,	}, {		.start		= 0xfff03000,		.end		= 0xfff033ff,		.flags		= IORESOURCE_MEM,	},	IRQ(31),};static struct clk usba0_pclk = {	.name		= "pclk",	.parent		= &pbb_clk,	.mode		= pbb_clk_mode,	.get_rate	= pbb_clk_get_rate,	.index		= 12,};static struct clk usba0_hclk = {	.name		= "hclk",	.parent		= &hsb_clk,	.mode		= hsb_clk_mode,	.get_rate	= hsb_clk_get_rate,	.index		= 6,};struct platform_device *__initat32_add_device_usba(unsigned int id, struct usba_platform_data *data){	struct platform_device *pdev;	if (id != 0)		return NULL;	pdev = platform_device_alloc("atmel_usba_udc", 0);	if (!pdev)		return NULL;	if (platform_device_add_resources(pdev, usba0_resource,					  ARRAY_SIZE(usba0_resource)))		goto out_free_pdev;	if (data) {		if (platform_device_add_data(pdev, data, sizeof(*data)))			goto out_free_pdev;		if (data->vbus_pin != GPIO_PIN_NONE)			at32_select_gpio(data->vbus_pin, 0);	}	usba0_pclk.dev = &pdev->dev;	usba0_hclk.dev = &pdev->dev;	platform_device_add(pdev);	return pdev;out_free_pdev:	platform_device_put(pdev);	return NULL;}/* -------------------------------------------------------------------- * IDE / CompactFlash * -------------------------------------------------------------------- */static struct resource at32_smc_cs4_resource[] __initdata = {	{		.start	= 0x04000000,		.end	= 0x07ffffff,		.flags	= IORESOURCE_MEM,	},	IRQ(~0UL), /* Magic IRQ will be overridden */};static struct resource at32_smc_cs5_resource[] __initdata = {	{		.start	= 0x20000000,		.end	= 0x23ffffff,		.flags	= IORESOURCE_MEM,	},	IRQ(~0UL), /* Magic IRQ will be overridden */};static int __init at32_init_ide_or_cf(struct platform_device *pdev,		unsigned int cs, unsigned int extint){	static unsigned int extint_pin_map[4] __initdata = {		GPIO_PIN_PB(25),		GPIO_PIN_PB(26),		GPIO_PIN_PB(27),		GPIO_PIN_PB(28),	};	static bool common_pins_initialized __initdata = false;	unsigned int extint_pin;	int ret;	if (extint >= ARRAY_SIZE(extint_pin_map))		return -EINVAL;	extint_pin = extint_pin_map[extint];	switch (cs) {	case 4:		ret = platform_device_add_resources(pdev,				at32_smc_cs4_resource,				ARRAY_SIZE(at32_smc_cs4_resource));		if (ret)			return ret;		select_peripheral(PE(21), PERIPH_A, 0); /* NCS4   -> OE_N  */		set_ebi_sfr_bits(HMATRIX_BIT(CS4A));		break;	case 5:		ret = platform_device_add_resources(pdev,				at32_smc_cs5_resource,				ARRAY_SIZE(at32_smc_cs5_resource));		if (ret)			return ret;		select_peripheral(PE(22), PERIPH_A, 0); /* NCS5   -> OE_N  */		set_ebi_sfr_bits(HMATRIX_BIT(CS5A));		break;	default:		return -EINVAL;	}	if (!common_pins_initialized) {		select_peripheral(PE(19), PERIPH_A, 0);	/* CFCE1  -> CS0_N */		select_peripheral(PE(20), PERIPH_A, 0);	/* CFCE2  -> CS1_N */		select_peripheral(PE(23), PERIPH_A, 0); /* CFRNW  -> DIR   */		select_peripheral(PE(24), PERIPH_A, 0); /* NWAIT  <- IORDY */		common_pins_initialized = true;	}	at32_select_periph(extint_pin, GPIO_PERIPH_A, AT32_GPIOF_DEGLITCH);	pdev->resource[1].start = EIM_IRQ_BASE + extint;	pdev->resource[1].end = pdev->resource[1].start;	return 0;}struct platform_device *__initat32_add_device_ide(unsigned int id, unsigned int extint,		    struct ide_platform_data *data){	struct platform_device *pdev;	pdev = platform_device_alloc("at32_ide", id);	if (!pdev)		goto fail;	if (platform_device_add_data(pdev, data,				sizeof(struct ide_platform_data)))		goto fail;	if (at32_init_ide_or_cf(pdev, data->cs, extint))		goto fail;	platform_device_add(pdev);	return pdev;fail:	platform_device_put(pdev);	return NULL;}struct platform_device *__initat32_add_device_cf(unsigned int id, unsigned int extint,		    struct cf_platform_data *data){	struct platform_device *pdev;	pdev = platform_device_alloc("at32_cf", id);	if (!pdev)		goto fail;	if (platform_device_add_data(pdev, data,				sizeof(struct cf_platform_data)))		goto fail;	if (at32_init_ide_or_cf(pdev, data->cs, extint))		goto fail;	if (data->detect_pin != GPIO_PIN_NONE)		at32_select_gpio(data->detect_pin, AT32_GPIOF_DEGLITCH);	if (data->reset_pin != GPIO_PIN_NONE)		at32_select_gpio(data->reset_pin, 0);	if (data->vcc_pin != GPIO_PIN_NONE)		at32_select_gpio(data->vcc_pin, 0);	/* READY is used as extint, so we can't select it as gpio */	platform_device_add(pdev);	return pdev;fail:	platform_device_put(pdev);	return NULL;}/* -------------------------------------------------------------------- * AC97C * -------------------------------------------------------------------- */static struct resource atmel_ac97c0_resource[] __initdata = {	PBMEM(0xfff02800),	IRQ(29),};static struct clk atmel_ac97c0_pclk = {	.name		= "pclk",	.parent		= &pbb_clk,	.mode		= pbb_clk_mode,	.get_rate	= pbb_clk_get_rate,	.index		= 10,};struct platform_device *__init at32_add_device_ac97c(unsigned int id){	struct platform_device *pdev;	if (id != 0)		return NULL;	pdev = platform_device_alloc("atmel_ac97c", id);	if (!pdev)		return NULL;	if (platform_device_add_resources(pdev, atmel_ac97c0_resource,				ARRAY_SIZE(atmel_ac97c0_resource)))		goto err_add_resources;	select_peripheral(PB(20), PERIPH_B, 0);	/* SYNC	*/	select_peripheral(PB(21), PERIPH_B, 0);	/* SDO	*/	select_peripheral(PB(22), PERIPH_B, 0);	/* SDI	*/	select_peripheral(PB(23), PERIPH_B, 0);	/* SCLK	*/	atmel_ac97c0_pclk.dev = &pdev->dev;	platform_device_add(pdev);	return pdev;err_add_resources:	platform_device_put(pdev);	return NULL;}/* -------------------------------------------------------------------- * ABDAC * -------------------------------------------------------------------- */static struct resource abdac0_resource[] __initdata = {	PBMEM(0xfff02000),	IRQ(27),};static struct clk abdac0_pclk = {	.name		= "pclk",	.parent		= &pbb_clk,	.mode		= pbb_clk_mode,	.get_rate	= pbb_clk_get_rate,	.index		= 8,};static struct clk abdac0_sample_clk = {	.name		= "sample_clk",	.mode		= genclk_mode,	.get_rate	= genclk_get_rate,	.set_rate	= genclk_set_rate,	.set_parent	= genclk_set_parent,	.index		= 6,};struct platform_device *__init at32_add_device_abdac(unsigned int id){	struct platform_device *pdev;	if (id != 0)		return NULL;	pdev = platform_device_alloc("abdac", id);	if (!pdev)		return NULL;	if (platform_device_add_resources(pdev, abdac0_resource,				ARRAY_SIZE(abdac0_resource)))		goto err_add_resources;	select_peripheral(PB(20), PERIPH_A, 0);	/* DATA1	*/	select_peripheral(PB(21), PERIPH_A, 0);	/* DATA0	*/	select_peripheral(PB(22), PERIPH_A, 0);	/* DATAN1	*/	select_peripheral(PB(23), PERIPH_A, 0);	/* DATAN0	*/	abdac0_pclk.dev = &pdev->dev;	abdac0_sample_clk.dev = &pdev->dev;	platform_device_add(pdev);	return pdev;err_add_resources:	platform_device_put(pdev);	return NULL;}/* -------------------------------------------------------------------- *  GCLK * -------------------------------------------------------------------- */static struct clk gclk0 = {	.name		= "gclk0",	.mode		= genclk_mode,	.get_rate	= genclk_get_rate,	.set_rate	= genclk_set_rate,	.set_parent	= genclk_set_parent,	.index		= 0,};static struct clk gclk1 = {	.name		= "gclk1",	.mode		= genclk_mode,	.get_rate	= genclk_get_rate,	.set_rate	= genclk_set_rate,	.set_parent	= genclk_set_parent,	.index		= 1,};static struct clk gclk2 = {	.name		= "gclk2",	.mode		= genclk_mode,	.get_rate	= genclk_get_rate,	.set_rate	= genclk_set_rate,	.set_parent	= genclk_set_parent,	.index		= 2,};static struct clk gclk3 = {	.name		= "gclk3",	.mode		= genclk_mode,	.get_rate	= genclk_get_rate,	.set_rate	= genclk_set_rate,	.set_parent	= genclk_set_parent,	.index		= 3,};static struct clk gclk4 = {	.name		= "gclk4",	.mode		= genclk_mode,	.get_rate	= genclk_get_rate,	.set_rate	= genclk_set_rate,	.set_parent	= genclk_set_parent,	.index		= 4,};struct clk *at32_clock_list[] = {	&osc32k,	&osc0,	&osc1,	&pll0,	&pll1,	&cpu_clk,	&hsb_clk,	&pba_clk,	&pbb_clk,	&at32_pm_pclk,	&at32_intc0_pclk,	&hmatrix_clk,	&ebi_clk,	&hramc_clk,	&smc0_pclk,	&smc0_mck,	&pdc_hclk,	&pdc_pclk,	&dmaca0_hclk,	&pico_clk,	&pio0_mck,	&pio1_mck,	&pio2_mck,	&pio3_mck,	&pio4_mck,	&at32_systc0_pclk,	&atmel_usart0_usart,	&atmel_usart1_usart,	&atmel_usart2_usart,	&atmel_usart3_usart,	&macb0_hclk,	&macb0_pclk,	&macb1_hclk,	&macb1_pclk,	&atmel_spi0_spi_clk,	&atmel_spi1_spi_clk,	&atmel_twi0_pclk,	&atmel_mci0_pclk,	&atmel_lcdfb0_hck1,	&atmel_lcdfb0_pixclk,	&ssc0_pclk,	&ssc1_pclk,	&ssc2_pclk,	&usba0_hclk,	&usba0_pclk,	&atmel_ac97c0_pclk,	&abdac0_pclk,	&abdac0_sample_clk,	&gclk0,	&gclk1,	&gclk2,	&gclk3,	&gclk4,};unsigned int at32_nr_clocks = ARRAY_SIZE(at32_clock_list);void __init at32_portmux_init(void){	at32_init_pio(&pio0_device);	at32_init_pio(&pio1_device);	at32_init_pio(&pio2_device);	at32_init_pio(&pio3_device);	at32_init_pio(&pio4_device);}void __init at32_clock_init(void){	u32 cpu_mask = 0, hsb_mask = 0, pba_mask = 0, pbb_mask = 0;	int i;	if (pm_readl(MCCTRL) & PM_BIT(PLLSEL)) {		main_clock = &pll0;		cpu_clk.parent = &pll0;	} else {		main_clock = &osc0;		cpu_clk.parent = &osc0;	}	if (pm_readl(PLL0) & PM_BIT(PLLOSC))		pll0.parent = &osc1;	if (pm_readl(PLL1) & PM_BIT(PLLOSC))		pll1.parent = &osc1;	genclk_init_parent(&gclk0);	genclk_init_parent(&gclk1);	genclk_init_parent(&gclk2);	genclk_init_parent(&gclk3);	genclk_init_parent(&gclk4);	genclk_init_parent(&atmel_lcdfb0_pixclk);	genclk_init_parent(&abdac0_sample_clk);	/*	 * Turn on all clocks that have at least one user already, and	 * turn off everything else. We only do this for module	 * clocks, and even though it isn't particularly pretty to	 * check the address of the mode function, it should do the	 * trick...	 */	for (i = 0; i < ARRAY_SIZE(at32_clock_list); i++) {		struct clk *clk = at32_clock_list[i];		if (clk->users == 0)			continue;		if (clk->mode == &cpu_clk_mode)			cpu_mask |= 1 << clk->index;		else if (clk->mode == &hsb_clk_mode)			hsb_mask |= 1 << clk->index;		else if (clk->mode == &pba_clk_mode)			pba_mask |= 1 << clk->index;		else if (clk->mode == &pbb_clk_mode)			pbb_mask |= 1 << clk->index;	}	pm_writel(CPU_MASK, cpu_mask);	pm_writel(HSB_MASK, hsb_mask);	pm_writel(PBA_MASK, pba_mask);	pm_writel(PBB_MASK, pbb_mask);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -