#include #include #include #include #include #include #include "kernel/kernel.h" #include "kernel/proc.h" #include "kernel/vm.h" #include "kernel/proto.h" #include "arch_proto.h" #include "bsp_reset.h" #include "omap_rtc.h" #define AM335X_CM_BASE 0x44E00000 #define AM335X_CM_SIZE 0x1000 #define AM335X_PRM_DEVICE_OFFSET 0xf00 #define AM335X_PRM_RSTCTRL_REG 0x00 #define AM335X_RST_GLOBAL_WARM_SW_BIT 0 #define DM37XX_CM_BASE 0x48307000 #define DM37XX_CM_SIZE 0x1000 #define DM37XX_PRM_RSTCTRL_REG 0x250 #define DM37XX_RST_DPLL3_BIT 2 struct omap_reset { vir_bytes base; vir_bytes size; }; static struct omap_reset omap_reset; static kern_phys_map reset_phys_map; void bsp_reset_init(void) { if (BOARD_IS_BBXM(machine.board_id)) { omap_reset.base = DM37XX_CM_BASE; omap_reset.size = DM37XX_CM_SIZE; } else if (BOARD_IS_BB(machine.board_id)) { omap_reset.base = AM335X_CM_BASE; omap_reset.size = AM335X_CM_SIZE; } kern_phys_map_ptr(omap_reset.base, omap_reset.size, VMMF_UNCACHED | VMMF_WRITE, &reset_phys_map, (vir_bytes) & omap_reset.base); } void bsp_reset(void) { if (BOARD_IS_BBXM(machine.board_id)) { mmio_set((omap_reset.base + DM37XX_PRM_RSTCTRL_REG), (1 << DM37XX_RST_DPLL3_BIT)); } else if (BOARD_IS_BB(machine.board_id)) { mmio_set((omap_reset.base + AM335X_PRM_DEVICE_OFFSET + AM335X_PRM_RSTCTRL_REG), (1 << AM335X_RST_GLOBAL_WARM_SW_BIT)); } } void bsp_poweroff(void) { /* * The am335x can signal an external power management chip to cut the power * by toggling the PMIC_POWER_EN pin. It might fail if there isn't an * external PMIC or if the PMIC hasn't been configured to respond to toggles. * The only way to pull the pin low is via ALARM2 (see TRM 20.3.3.8). * At this point PM should have already signaled readclock to set the alarm. */ if (BOARD_IS_BB(machine.board_id)) { /* rtc was frozen to prevent premature power-off, unfreeze it * now */ omap3_rtc_run(); /* wait for the alarm to go off and PMIC to disable power to * SoC */ while (1); } }