]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - arch/arm/mach-omap2/pm-debug.c
OMAP3: PM: UART: disable clocks when idle
[linux-2.6-omap-h63xx.git] / arch / arm / mach-omap2 / pm-debug.c
index 0832e05520e403149fe3b2ad11fc241d42ee11b8..b00f5f4dfe4101bc5dd1c957491d63c7154b9f75 100644 (file)
 #ifdef CONFIG_PM_DEBUG
 int omap2_pm_debug = 0;
 
-static int serial_console_clock_disabled;
-static int serial_console_uart;
-static unsigned int serial_console_next_disable;
-
-static struct clk *console_iclk, *console_fclk;
-
-static void serial_console_kick(void)
-{
-       serial_console_next_disable = omap2_read_32k_sync_counter();
-       /* Keep the clocks on for 4 secs */
-       serial_console_next_disable += 4 * 32768;
-}
-
-static void serial_wait_tx(void)
-{
-       static const unsigned long uart_bases[3] = {
-               0x4806a000, 0x4806c000, 0x4806e000
-       };
-       unsigned long lsr_reg;
-       int looped = 0;
-
-       /* Wait for TX FIFO and THR to get empty */
-       lsr_reg = IO_ADDRESS(uart_bases[serial_console_uart - 1] + (5 << 2));
-       while ((__raw_readb(lsr_reg) & 0x60) != 0x60)
-               looped = 1;
-       if (looped)
-               serial_console_kick();
-}
-
-u32 omap2_read_32k_sync_counter(void)
-{
-        return omap_readl(OMAP2_32KSYNCT_BASE + 0x0010);
-}
-
-void serial_console_fclk_mask(u32 *f1, u32 *f2)
-{
-       switch (serial_console_uart)  {
-       case 1:
-               *f1 &= ~(1 << 21);
-               break;
-       case 2:
-               *f1 &= ~(1 << 22);
-               break;
-       case 3:
-               *f2 &= ~(1 << 2);
-               break;
-       }
-}
-
-void serial_console_sleep(int enable)
-{
-       if (console_iclk == NULL || console_fclk == NULL)
-               return;
-
-       if (enable) {
-               BUG_ON(serial_console_clock_disabled);
-               if (console_fclk->usecount == 0)
-                       return;
-               if ((int) serial_console_next_disable - (int) omap2_read_32k_sync_counter() >= 0)
-                       return;
-               serial_wait_tx();
-               clk_disable(console_iclk);
-               clk_disable(console_fclk);
-               serial_console_clock_disabled = 1;
-       } else {
-               int serial_wakeup = 0;
-               u32 l;
-
-               switch (serial_console_uart)  {
-               case 1:
-                       l = prm_read_mod_reg(CORE_MOD, PM_WKST1);
-                       if (l & OMAP24XX_ST_UART1_MASK)
-                               serial_wakeup = 1;
-                       break;
-               case 2:
-                       l = prm_read_mod_reg(CORE_MOD, PM_WKST1);
-                       if (l & OMAP24XX_ST_UART2_MASK)
-                               serial_wakeup = 1;
-                       break;
-               case 3:
-                       l = prm_read_mod_reg(CORE_MOD, OMAP24XX_PM_WKST2);
-                       if (l & OMAP24XX_ST_UART3_MASK)
-                               serial_wakeup = 1;
-                       break;
-               }
-               if (serial_wakeup)
-                       serial_console_kick();
-               if (!serial_console_clock_disabled)
-                       return;
-               clk_enable(console_iclk);
-               clk_enable(console_fclk);
-               serial_console_clock_disabled = 0;
-       }
-}
-
-void pm_init_serial_console(void)
-{
-       const struct omap_serial_console_config *conf;
-       char name[16];
-
-       conf = omap_get_config(OMAP_TAG_SERIAL_CONSOLE,
-                              struct omap_serial_console_config);
-       if (conf == NULL)
-               return;
-       if (conf->console_uart > 3 || conf->console_uart < 1)
-               return;
-       serial_console_uart = conf->console_uart;
-       sprintf(name, "uart%d_fck", conf->console_uart);
-       console_fclk = clk_get(NULL, name);
-       if (IS_ERR(console_fclk))
-               console_fclk = NULL;
-       name[6] = 'i';
-       console_iclk = clk_get(NULL, name);
-       if (IS_ERR(console_fclk))
-               console_iclk = NULL;
-       if (console_fclk == NULL || console_iclk == NULL) {
-               serial_console_uart = 0;
-               return;
-       }
-       switch (serial_console_uart) {
-       case 1:
-               prm_set_mod_reg_bits(OMAP24XX_ST_UART1_MASK, CORE_MOD,
-                                    PM_WKEN1);
-               break;
-       case 2:
-               prm_set_mod_reg_bits(OMAP24XX_ST_UART2_MASK, CORE_MOD,
-                                    PM_WKEN1);
-               break;
-       case 3:
-               prm_set_mod_reg_bits(OMAP24XX_ST_UART3_MASK, CORE_MOD,
-                                    OMAP24XX_PM_WKEN2);
-               break;
-       }
-}
-
 #define DUMP_PRM_MOD_REG(mod, reg)    \
        regs[reg_count].name = #mod "." #reg; \
        regs[reg_count++].val = prm_read_mod_reg(mod, reg)