/* * This function initializes the memory map. It is called during the * system startup to create static physical to virtual memory mappings * for the IO modules. */ void __init mx51_map_io(void) { mxc_set_cpu_type(MXC_CPU_MX51); mxc_iomux_v3_init(MX51_IO_ADDRESS(MX51_IOMUXC_BASE_ADDR)); mxc_arch_reset_init(MX51_IO_ADDRESS(MX51_WDOG1_BASE_ADDR)); iotable_init(mx51_io_desc, ARRAY_SIZE(mx51_io_desc)); }
void __init imx51_init_early(void) { mxc_set_cpu_type(MXC_CPU_MX51); mxc_iomux_v3_init(MX51_IO_ADDRESS(MX51_IOMUXC_BASE_ADDR)); mxc_arch_reset_init(MX51_IO_ADDRESS(MX51_WDOG1_BASE_ADDR)); arm_pm_idle = imx5_idle; }
void __init imx51_init_early(void) { imx51_ipu_mipi_setup(); mxc_set_cpu_type(MXC_CPU_MX51); mxc_iomux_v3_init(MX51_IO_ADDRESS(MX51_IOMUXC_BASE_ADDR)); mxc_arch_reset_init(MX51_IO_ADDRESS(MX51_WDOG1_BASE_ADDR)); }
static int __init post_cpu_init(void) { unsigned int reg; void __iomem *base; if (cpu_is_mx51() || cpu_is_mx53()) { if (cpu_is_mx51()) base = MX51_IO_ADDRESS(MX51_AIPS1_BASE_ADDR); else base = MX53_IO_ADDRESS(MX53_AIPS1_BASE_ADDR); __raw_writel(0x0, base + 0x40); __raw_writel(0x0, base + 0x44); __raw_writel(0x0, base + 0x48); __raw_writel(0x0, base + 0x4C); reg = __raw_readl(base + 0x50) & 0x00FFFFFF; __raw_writel(reg, base + 0x50); if (cpu_is_mx51()) base = MX51_IO_ADDRESS(MX51_AIPS2_BASE_ADDR); else base = MX53_IO_ADDRESS(MX53_AIPS2_BASE_ADDR); __raw_writel(0x0, base + 0x40); __raw_writel(0x0, base + 0x44); __raw_writel(0x0, base + 0x48); __raw_writel(0x0, base + 0x4C); reg = __raw_readl(base + 0x50) & 0x00FFFFFF; __raw_writel(reg, base + 0x50); } return 0; }
int apf51_fpga_abort(void) { __raw_writel(temp_clk, MX51_IO_ADDRESS(MX51_CCM_BASE_ADDR) + MXC_CCM_CBCDR); udelay(10); __raw_writel(temp_rcr1, MX51_IO_ADDRESS(MX51_WEIM_BASE_ADDR) + MXC_CS1RCR1_ADDR); __raw_writel(temp_wcr1, MX51_IO_ADDRESS(MX51_WEIM_BASE_ADDR) + MXC_CS1WCR1_ADDR); iounmap(cs1_base); return 1; }
int apf51_fpga_post(void) { /* restore emi_clk_sel */ __raw_writel(temp_clk, MX51_IO_ADDRESS(MX51_CCM_BASE_ADDR) + MXC_CCM_CBCDR); udelay(10); __raw_writel(temp_rcr1, MX51_IO_ADDRESS(MX51_WEIM_BASE_ADDR) + MXC_CS1RCR1_ADDR); __raw_writel(temp_wcr1, MX51_IO_ADDRESS(MX51_WEIM_BASE_ADDR) + MXC_CS1WCR1_ADDR); iounmap(cs1_base); return 0; }
void __init imx51_soc_init(void) { /* */ mxc_register_gpio("imx31-gpio", 0, MX51_GPIO1_BASE_ADDR, SZ_16K, MX51_INT_GPIO1_LOW, MX51_INT_GPIO1_HIGH); mxc_register_gpio("imx31-gpio", 1, MX51_GPIO2_BASE_ADDR, SZ_16K, MX51_INT_GPIO2_LOW, MX51_INT_GPIO2_HIGH); mxc_register_gpio("imx31-gpio", 2, MX51_GPIO3_BASE_ADDR, SZ_16K, MX51_INT_GPIO3_LOW, MX51_INT_GPIO3_HIGH); mxc_register_gpio("imx31-gpio", 3, MX51_GPIO4_BASE_ADDR, SZ_16K, MX51_INT_GPIO4_LOW, MX51_INT_GPIO4_HIGH); /* */ imx_add_imx_sdma("imx35-sdma", MX51_SDMA_BASE_ADDR, MX51_INT_SDMA, &imx51_sdma_pdata); /* */ imx_set_aips(MX51_IO_ADDRESS(MX51_AIPS1_BASE_ADDR)); imx_set_aips(MX51_IO_ADDRESS(MX51_AIPS2_BASE_ADDR)); /* */ platform_device_register_simple("imx31-audmux", 0, imx51_audmux_res, ARRAY_SIZE(imx51_audmux_res)); }
static int get_mx51_srev(void) { void __iomem *iim_base = MX51_IO_ADDRESS(MX51_IIM_BASE_ADDR); u32 rev = readl(iim_base + IIM_SREV) & 0xff; if (rev == 0x0) return IMX_CHIP_REVISION_2_0; else if (rev == 0x10) return IMX_CHIP_REVISION_3_0; return 0; }
/* * The MIPI HSC unit has been removed from the i.MX51 Reference Manual by * the Freescale marketing division. However this did not remove the * hardware from the chip which still needs to be configured for proper * IPU support. */ static void __init imx51_ipu_mipi_setup(void) { void __iomem *hsc_addr; hsc_addr = MX51_IO_ADDRESS(MX51_MIPI_HSC_BASE_ADDR); /* setup MIPI module to legacy mode */ __raw_writel(0xf00, hsc_addr); /* CSI mode: reserved; DI control mode: legacy (from Freescale BSP) */ __raw_writel(__raw_readl(hsc_addr + 0x800) | 0x30ff, hsc_addr + 0x800); }
void __init imx51_soc_init(void) { /* i.mx51 has the i.mx31 type gpio */ mxc_register_gpio("imx31-gpio", 0, MX51_GPIO1_BASE_ADDR, SZ_16K, MX51_INT_GPIO1_LOW, MX51_INT_GPIO1_HIGH); mxc_register_gpio("imx31-gpio", 1, MX51_GPIO2_BASE_ADDR, SZ_16K, MX51_INT_GPIO2_LOW, MX51_INT_GPIO2_HIGH); mxc_register_gpio("imx31-gpio", 2, MX51_GPIO3_BASE_ADDR, SZ_16K, MX51_INT_GPIO3_LOW, MX51_INT_GPIO3_HIGH); mxc_register_gpio("imx31-gpio", 3, MX51_GPIO4_BASE_ADDR, SZ_16K, MX51_INT_GPIO4_LOW, MX51_INT_GPIO4_HIGH); pinctrl_provide_dummies(); /* i.mx51 has the i.mx35 type sdma */ imx_add_imx_sdma("imx35-sdma", MX51_SDMA_BASE_ADDR, MX51_INT_SDMA, &imx51_sdma_pdata); /* Setup AIPS registers */ imx_set_aips(MX51_IO_ADDRESS(MX51_AIPS1_BASE_ADDR)); imx_set_aips(MX51_IO_ADDRESS(MX51_AIPS2_BASE_ADDR)); /* i.mx51 has the i.mx31 type audmux */ platform_device_register_simple("imx31-audmux", 0, imx51_audmux_res, ARRAY_SIZE(imx51_audmux_res)); }
static int get_mx51_srev(void) { void __iomem *iim_base = MX51_IO_ADDRESS(MX51_IIM_BASE_ADDR); u32 rev = readl(iim_base + IIM_SREV) & 0xff; switch (rev) { case 0x0: return IMX_CHIP_REVISION_2_0; case 0x10: return IMX_CHIP_REVISION_3_0; default: return IMX_CHIP_REVISION_UNKNOWN; } }
/* Initialize GPIO port before download */ int apf51_fpga_pre(void) { #define EMI_CLK_SEL 1<<26 temp_rcr1 = __raw_readl(MX51_IO_ADDRESS(MX51_WEIM_BASE_ADDR) + MXC_CS1RCR1_ADDR); __raw_writel(0x01000010, MX51_IO_ADDRESS(MX51_WEIM_BASE_ADDR) + MXC_CS1RCR1_ADDR); temp_wcr1 = __raw_readl(MX51_IO_ADDRESS(MX51_WEIM_BASE_ADDR) + MXC_CS1WCR1_ADDR); __raw_writel(0x01000008, MX51_IO_ADDRESS(MX51_WEIM_BASE_ADDR) + MXC_CS1WCR1_ADDR); /* change emi_clk_sel to ensure blck smaller than 50MHz */ temp_clk = __raw_readl(MX51_IO_ADDRESS(MX51_CCM_BASE_ADDR) + MXC_CCM_CBCDR); __raw_writel(temp_clk | EMI_CLK_SEL, MX51_IO_ADDRESS(MX51_CCM_BASE_ADDR) + MXC_CCM_CBCDR); /* FPGA PROG */ gpio_direction_output(CONFIG_SYS_FPGA_PRG, 1); /* FPGA SUSPEND */ gpio_direction_output(CONFIG_SYS_FPGA_SUSPEND, 1); /* FPGA DONE */ gpio_direction_input(CONFIG_SYS_FPGA_DONE); /* FPGA INIT# */ gpio_direction_input(CONFIG_SYS_FPGA_INIT); /* FPGA PWR */ gpio_direction_output(CONFIG_SYS_FPGA_PWR, 1); cs1_base = ioremap(MX51_CS1_BASE_ADDR, SZ_4K); return 0; }
void __init mx51_init_irq(void) { tzic_init_irq(MX51_IO_ADDRESS(MX51_TZIC_BASE_ADDR)); }
static int eim_init(void) { int ret = 0; const int CSREC = 3; const int PSZ = 0; const int AUS = 1; const int BCS = 0; const int BCD = 0; const int BL = 3; const int WFL = 1; const int RFL = 1; const int WC = 0; const int ADH = 0; const int RWSC = 3; const int WWSC = 1; const int ADVA = 0; /* RADVA and WADVA */ const int ADVN = 0; /* RADVN and WADVN */ const int OEA = 0; const int CSA = 0; /* RCSA and WCSA */ const int RL = 0; const int BEA = 0; const int BE = 1; const int WEA = 0; const int INTPOL = 1; /* Interrupt polarity */ const int INTEN = 0; /* Interrupt enable */ const int GBCD = 0; /* Burst clock divisor */ const int BCM = 1; /* Burst clock mode (set c ontinuous here) */ u32 GCR1, GCR2, RCR1, RCR2, WCR1, WEIMCR; u32 temp_clk; const int emi_slow_podf = 7; iomux_v3_cfg_t iomux_cs2 = MX51_PAD_EIM_CS2__EIM_CS2; iomux_v3_cfg_t iomux_dtack = MX51_PAD_EIM_DTACK__GPIO2_31; iomux_v3_cfg_t iomux_event = MX51_PAD_GPIO1_5__SDMA_EXT_EVENT; mxc_iomux_v3_setup_pad(iomux_cs2); mxc_iomux_v3_setup_pad(iomux_dtack); mxc_iomux_v3_setup_pad(iomux_event); /* * Change the clock divider for EMI bus from divide-by-7 to divide-by-8, so * that the bus frequency is below 90 MHz, in accordance with footnote 4 in * section 4.6.7.3 in the datasheet. This is necessary to prevent bus errors * as the device heats up. */ temp_clk = __raw_readl( MX51_IO_ADDRESS(MX51_CCM_BASE_ADDR)+ MXC_CCM_CBCDR ); __raw_writel( (temp_clk & (~0x1c00000)) | bitfield(22, 3, emi_slow_podf), MX51_IO_ADDRESS(MX51_CCM_BASE_ADDR)+ MXC_CCM_CBCDR ); if (gpio_request(event_gpio_num, "xillybus")) { printk(KERN_ERR THIS "GPIO pin %i is already in use\n", event_gpio_num); return -ENODEV; } gpio_direction_input(event_gpio_num); GCR1 = 0x0111008f | bitfield(28, 4, PSZ) | bitfield(23, 1, AUS) | bitfield(20, 3, CSREC) | bitfield(14, 2, BCS) | bitfield(12, 2, BCD) | bitfield(11, 1, WC) | bitfield(8, 3, BL) | bitfield(5, 1, RFL) | bitfield(4, 1, WFL); GCR2 = bitfield(0, 2, ADH); RCR1 = bitfield(24, 6, RWSC) | bitfield(20, 3, ADVA) | bitfield(16, 3, ADVN) | bitfield(12, 3, OEA) | bitfield(4, 3, CSA); RCR2 = bitfield(8, 2, RL) | bitfield(4, 3, BEA) | bitfield(3, 1, BE); WCR1 = bitfield(30, 1, !BE) | bitfield(24, 6, WWSC) | bitfield(21, 3, ADVA) | bitfield(18, 3, ADVN) | bitfield(15, 3, BEA) | bitfield(9, 3, WEA) | bitfield(3, 3, CSA); WEIMCR = bitfield(5, 1, INTPOL) | bitfield(4, 1, INTEN) | bitfield(1, 2, GBCD) | bitfield(0, 1, BCM); writereg(0x30, GCR1); writereg(0x34, GCR2); writereg(0x38, RCR1); writereg(0x3c, RCR2); writereg(0x40, WCR1); writereg(0x90, WEIMCR); if (!request_mem_region(MX51_CS2_BASE_ADDR, SZ_64K, "xillybus_sdma")) { printk(KERN_ERR THIS "request_mem_region failed. Aborting.\n"); return -ENODEV; } cs2_base = ioremap_nocache(MX51_CS2_BASE_ADDR, SZ_64K); if (!cs2_base) { printk(KERN_WARNING THIS "Failed to obtain I/O space\n"); ret = -ENODEV; goto failed_ioremap; } return 0; failed_ioremap: release_mem_region(MX51_CS2_BASE_ADDR, SZ_64K); return ret; }
.end = MX51_KPP_BASE_ADDR + 0x8 - 1, .flags = IORESOURCE_MEM, }, }; struct platform_device mxc_keypad_device = { .name = "imx-keypad", .id = 0, .num_resources = ARRAY_SIZE(mxc_kpp_resources), .resource = mxc_kpp_resources, }; static struct mxc_gpio_port mxc_gpio_ports[] = { { .chip.label = "gpio-0", .base = MX51_IO_ADDRESS(MX51_GPIO1_BASE_ADDR), .irq = MX51_MXC_INT_GPIO1_LOW, .irq_high = MX51_MXC_INT_GPIO1_HIGH, .virtual_irq_start = MXC_GPIO_IRQ_START }, { .chip.label = "gpio-1", .base = MX51_IO_ADDRESS(MX51_GPIO2_BASE_ADDR), .irq = MX51_MXC_INT_GPIO2_LOW, .irq_high = MX51_MXC_INT_GPIO2_HIGH, .virtual_irq_start = MXC_GPIO_IRQ_START + 32 * 1 }, { .chip.label = "gpio-2", .base = MX51_IO_ADDRESS(MX51_GPIO3_BASE_ADDR), .irq = MX51_MXC_INT_GPIO3_LOW,
/* * Reset the system. It is called by machine_restart(). */ void arch_reset(char mode, const char *cmd) { unsigned int wcr_enable; arch_reset_special_mode(mode, cmd); #ifdef CONFIG_ARCH_MX6 /* wait for reset to assert... */ if (enable_ldo_mode == LDO_MODE_BYPASSED && !(machine_is_mx6sl_evk() || machine_is_mx6sl_arm2())) { /*On Sabresd board use WDOG2 to reset external PMIC, so here do * more WDOG2 reset.*/ wcr_enable = 0x04;//rudolph add for reboot. 0x14 --> 0x04 20150302 __raw_writew(wcr_enable, IO_ADDRESS(MX6Q_WDOG2_BASE_ADDR)); __raw_writew(wcr_enable, IO_ADDRESS(MX6Q_WDOG2_BASE_ADDR)); } else { wcr_enable = (1 << 2); __raw_writew(wcr_enable, wdog_base); /* errata TKT039676, SRS bit may be missed when SRC sample it, need to write the wdog controller twice to avoid it */ __raw_writew(wcr_enable, wdog_base); } /* wait for reset to assert... */ mdelay(500); printk(KERN_ERR "Watchdog reset failed to assert reset\n"); return; #endif #ifdef CONFIG_MACH_MX51_EFIKAMX if (machine_is_mx51_efikamx()) { mx51_efikamx_reset(); return; } #endif #ifdef CONFIG_ARCH_MX51 /* Workaround to reset NFC_CONFIG3 register * due to the chip warm reset does not reset it */ if (cpu_is_mx53()) __raw_writel(0x20600, MX53_IO_ADDRESS(MX53_NFC_BASE_ADDR)+0x28); if (cpu_is_mx51()) __raw_writel(0x20600, MX51_IO_ADDRESS(MX51_NFC_BASE_ADDR)+0x28); #endif #ifdef CONFIG_ARCH_MX5 /* Stop DVFS-CORE before reboot. */ if (dvfs_core_is_active) stop_dvfs(); #endif if (cpu_is_mx1()) { wcr_enable = (1 << 0); } else { struct clk *clk; clk = clk_get_sys("imx2-wdt.0", NULL); if (!IS_ERR(clk)) clk_enable(clk); wcr_enable = (1 << 2); } /* Assert SRS signal */ __raw_writew(wcr_enable, wdog_base); /* wait for reset to assert... */ mdelay(500); printk(KERN_ERR "Watchdog reset failed to assert reset\n"); /* delay to allow the serial port to show the message */ mdelay(50); /* we'll take a jump through zero as a poor second */ cpu_reset(0); }
int __init mx51_clocks_init(unsigned long rate_ckil, unsigned long rate_osc, unsigned long rate_ckih1, unsigned long rate_ckih2) { int i; u32 val; struct device_node *np; clk[pll1_sw] = imx_clk_pllv2("pll1_sw", "osc", MX51_DPLL1_BASE); clk[pll2_sw] = imx_clk_pllv2("pll2_sw", "osc", MX51_DPLL2_BASE); clk[pll3_sw] = imx_clk_pllv2("pll3_sw", "osc", MX51_DPLL3_BASE); clk[ipu_di0_sel] = imx_clk_mux("ipu_di0_sel", MXC_CCM_CSCMR2, 26, 3, mx51_ipu_di0_sel, ARRAY_SIZE(mx51_ipu_di0_sel)); clk[ipu_di1_sel] = imx_clk_mux("ipu_di1_sel", MXC_CCM_CSCMR2, 29, 3, mx51_ipu_di1_sel, ARRAY_SIZE(mx51_ipu_di1_sel)); clk[tve_ext_sel] = imx_clk_mux_flags("tve_ext_sel", MXC_CCM_CSCMR1, 6, 1, mx51_tve_ext_sel, ARRAY_SIZE(mx51_tve_ext_sel), CLK_SET_RATE_PARENT); clk[tve_s] = imx_clk_mux("tve_sel", MXC_CCM_CSCMR1, 7, 1, mx51_tve_sel, ARRAY_SIZE(mx51_tve_sel)); clk[tve_gate] = imx_clk_gate2("tve_gate", "tve_sel", MXC_CCM_CCGR2, 30); clk[tve_pred] = imx_clk_divider("tve_pred", "pll3_sw", MXC_CCM_CDCDR, 28, 3); clk[esdhc1_per_gate] = imx_clk_gate2("esdhc1_per_gate", "esdhc_a_podf", MXC_CCM_CCGR3, 2); clk[esdhc2_per_gate] = imx_clk_gate2("esdhc2_per_gate", "esdhc_b_podf", MXC_CCM_CCGR3, 6); clk[esdhc3_per_gate] = imx_clk_gate2("esdhc3_per_gate", "esdhc_c_sel", MXC_CCM_CCGR3, 10); clk[esdhc4_per_gate] = imx_clk_gate2("esdhc4_per_gate", "esdhc_d_sel", MXC_CCM_CCGR3, 14); clk[usb_phy_gate] = imx_clk_gate2("usb_phy_gate", "usb_phy_sel", MXC_CCM_CCGR2, 0); clk[hsi2c_gate] = imx_clk_gate2("hsi2c_gate", "ipg", MXC_CCM_CCGR1, 22); clk[mipi_hsc1_gate] = imx_clk_gate2("mipi_hsc1_gate", "ipg", MXC_CCM_CCGR4, 6); clk[mipi_hsc2_gate] = imx_clk_gate2("mipi_hsc2_gate", "ipg", MXC_CCM_CCGR4, 8); clk[mipi_esc_gate] = imx_clk_gate2("mipi_esc_gate", "ipg", MXC_CCM_CCGR4, 10); clk[mipi_hsp_gate] = imx_clk_gate2("mipi_hsp_gate", "ipg", MXC_CCM_CCGR4, 12); clk[spdif_xtal_sel] = imx_clk_mux("spdif_xtal_sel", MXC_CCM_CSCMR1, 2, 2, mx51_spdif_xtal_sel, ARRAY_SIZE(mx51_spdif_xtal_sel)); clk[spdif1_sel] = imx_clk_mux("spdif1_sel", MXC_CCM_CSCMR2, 2, 2, spdif_sel, ARRAY_SIZE(spdif_sel)); clk[spdif1_pred] = imx_clk_divider("spdif1_podf", "spdif1_sel", MXC_CCM_CDCDR, 16, 3); clk[spdif1_podf] = imx_clk_divider("spdif1_podf", "spdif1_pred", MXC_CCM_CDCDR, 9, 6); clk[spdif1_com_sel] = imx_clk_mux("spdif1_com_sel", MXC_CCM_CSCMR2, 5, 1, mx51_spdif1_com_sel, ARRAY_SIZE(mx51_spdif1_com_sel)); clk[spdif1_gate] = imx_clk_gate2("spdif1_gate", "spdif1_com_sel", MXC_CCM_CCGR5, 28); for (i = 0; i < ARRAY_SIZE(clk); i++) if (IS_ERR(clk[i])) pr_err("i.MX51 clk %d: register failed with %ld\n", i, PTR_ERR(clk[i])); np = of_find_compatible_node(NULL, NULL, "fsl,imx51-ccm"); clk_data.clks = clk; clk_data.clk_num = ARRAY_SIZE(clk); of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data); mx5_clocks_common_init(rate_ckil, rate_osc, rate_ckih1, rate_ckih2); clk_register_clkdev(clk[hsi2c_gate], NULL, "imx21-i2c.2"); clk_register_clkdev(clk[mx51_mipi], "mipi_hsp", NULL); clk_register_clkdev(clk[vpu_gate], NULL, "imx51-vpu.0"); clk_register_clkdev(clk[fec_gate], NULL, "imx27-fec.0"); clk_register_clkdev(clk[usb_phy_gate], "phy", "mxc-ehci.0"); clk_register_clkdev(clk[esdhc1_ipg_gate], "ipg", "sdhci-esdhc-imx51.0"); clk_register_clkdev(clk[dummy], "ahb", "sdhci-esdhc-imx51.0"); clk_register_clkdev(clk[esdhc1_per_gate], "per", "sdhci-esdhc-imx51.0"); clk_register_clkdev(clk[esdhc2_ipg_gate], "ipg", "sdhci-esdhc-imx51.1"); clk_register_clkdev(clk[dummy], "ahb", "sdhci-esdhc-imx51.1"); clk_register_clkdev(clk[esdhc2_per_gate], "per", "sdhci-esdhc-imx51.1"); clk_register_clkdev(clk[esdhc3_ipg_gate], "ipg", "sdhci-esdhc-imx51.2"); clk_register_clkdev(clk[dummy], "ahb", "sdhci-esdhc-imx51.2"); clk_register_clkdev(clk[esdhc3_per_gate], "per", "sdhci-esdhc-imx51.2"); clk_register_clkdev(clk[esdhc4_ipg_gate], "ipg", "sdhci-esdhc-imx51.3"); clk_register_clkdev(clk[dummy], "ahb", "sdhci-esdhc-imx51.3"); clk_register_clkdev(clk[esdhc4_per_gate], "per", "sdhci-esdhc-imx51.3"); /* set the usboh3 parent to pll2_sw */ clk_set_parent(clk[usboh3_sel], clk[pll2_sw]); /* set SDHC root clock to 166.25MHZ*/ clk_set_rate(clk[esdhc_a_podf], 166250000); clk_set_rate(clk[esdhc_b_podf], 166250000); /* System timer */ mxc_timer_init(MX51_IO_ADDRESS(MX51_GPT1_BASE_ADDR), MX51_INT_GPT); clk_prepare_enable(clk[iim_gate]); imx_print_silicon_rev("i.MX51", mx51_revision()); clk_disable_unprepare(clk[iim_gate]); /* * Reference Manual says: Functionality of CCDR[18] and CLPCR[23] is no * longer supported. Set to one for better power saving. * * The effect of not setting these bits is that MIPI clocks can't be * enabled without the IPU clock being enabled aswell. */ val = readl(MXC_CCM_CCDR); val |= 1 << 18; writel(val, MXC_CCM_CCDR); val = readl(MXC_CCM_CLPCR); val |= 1 << 23; writel(val, MXC_CCM_CLPCR); return 0; }
static void writereg(int offset, u32 val) { __raw_writel(val, MX51_IO_ADDRESS(MX51_WEIM_BASE_ADDR) + offset); }