📄 at32ap7000.c
字号:
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 + -