| /* |
| * linux/arch/arm/mach-omap1/clock.h |
| * |
| * Copyright (C) 2004 - 2005 Nokia corporation |
| * Written by Tuukka Tikkanen <tuukka.tikkanen@elektrobit.com> |
| * Based on clocks.h by Tony Lindgren, Gordon McNutt and RidgeRun, Inc |
| * |
| * This program is free software; you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License version 2 as |
| * published by the Free Software Foundation. |
| */ |
| |
| #ifndef __ARCH_ARM_MACH_OMAP1_CLOCK_H |
| #define __ARCH_ARM_MACH_OMAP1_CLOCK_H |
| |
| static void omap1_ckctl_recalc(struct clk * clk); |
| static void omap1_watchdog_recalc(struct clk * clk); |
| static int omap1_set_sossi_rate(struct clk *clk, unsigned long rate); |
| static void omap1_sossi_recalc(struct clk *clk); |
| static void omap1_ckctl_recalc_dsp_domain(struct clk * clk); |
| static int omap1_clk_set_rate_dsp_domain(struct clk * clk, unsigned long rate); |
| static int omap1_set_uart_rate(struct clk * clk, unsigned long rate); |
| static void omap1_uart_recalc(struct clk * clk); |
| static int omap1_set_ext_clk_rate(struct clk * clk, unsigned long rate); |
| static long omap1_round_ext_clk_rate(struct clk * clk, unsigned long rate); |
| static void omap1_init_ext_clk(struct clk * clk); |
| static int omap1_select_table_rate(struct clk * clk, unsigned long rate); |
| static long omap1_round_to_table_rate(struct clk * clk, unsigned long rate); |
| |
| struct mpu_rate { |
| unsigned long rate; |
| unsigned long xtal; |
| unsigned long pll_rate; |
| __u16 ckctl_val; |
| __u16 dpllctl_val; |
| }; |
| |
| struct uart_clk { |
| struct clk clk; |
| unsigned long sysc_addr; |
| }; |
| |
| /* Provide a method for preventing idling some ARM IDLECT clocks */ |
| struct arm_idlect1_clk { |
| struct clk clk; |
| unsigned long no_idle_count; |
| __u8 idlect_shift; |
| }; |
| |
| /* ARM_CKCTL bit shifts */ |
| #define CKCTL_PERDIV_OFFSET 0 |
| #define CKCTL_LCDDIV_OFFSET 2 |
| #define CKCTL_ARMDIV_OFFSET 4 |
| #define CKCTL_DSPDIV_OFFSET 6 |
| #define CKCTL_TCDIV_OFFSET 8 |
| #define CKCTL_DSPMMUDIV_OFFSET 10 |
| /*#define ARM_TIMXO 12*/ |
| #define EN_DSPCK 13 |
| /*#define ARM_INTHCK_SEL 14*/ /* Divide-by-2 for mpu inth_ck */ |
| /* DSP_CKCTL bit shifts */ |
| #define CKCTL_DSPPERDIV_OFFSET 0 |
| |
| /* ARM_IDLECT2 bit shifts */ |
| #define EN_WDTCK 0 |
| #define EN_XORPCK 1 |
| #define EN_PERCK 2 |
| #define EN_LCDCK 3 |
| #define EN_LBCK 4 /* Not on 1610/1710 */ |
| /*#define EN_HSABCK 5*/ |
| #define EN_APICK 6 |
| #define EN_TIMCK 7 |
| #define DMACK_REQ 8 |
| #define EN_GPIOCK 9 /* Not on 1610/1710 */ |
| /*#define EN_LBFREECK 10*/ |
| #define EN_CKOUT_ARM 11 |
| |
| /* ARM_IDLECT3 bit shifts */ |
| #define EN_OCPI_CK 0 |
| #define EN_TC1_CK 2 |
| #define EN_TC2_CK 4 |
| |
| /* DSP_IDLECT2 bit shifts (0,1,2 are same as for ARM_IDLECT2) */ |
| #define EN_DSPTIMCK 5 |
| |
| /* Various register defines for clock controls scattered around OMAP chip */ |
| #define SDW_MCLK_INV_BIT 2 /* In ULPD_CLKC_CTRL */ |
| #define USB_MCLK_EN_BIT 4 /* In ULPD_CLKC_CTRL */ |
| #define USB_HOST_HHC_UHOST_EN 9 /* In MOD_CONF_CTRL_0 */ |
| #define SWD_ULPD_PLL_CLK_REQ 1 /* In SWD_CLK_DIV_CTRL_SEL */ |
| #define COM_ULPD_PLL_CLK_REQ 1 /* In COM_CLK_DIV_CTRL_SEL */ |
| #define SWD_CLK_DIV_CTRL_SEL 0xfffe0874 |
| #define COM_CLK_DIV_CTRL_SEL 0xfffe0878 |
| #define SOFT_REQ_REG 0xfffe0834 |
| #define SOFT_REQ_REG2 0xfffe0880 |
| |
| /*------------------------------------------------------------------------- |
| * Omap1 MPU rate table |
| *-------------------------------------------------------------------------*/ |
| static struct mpu_rate rate_table[] = { |
| /* MPU MHz, xtal MHz, dpll1 MHz, CKCTL, DPLL_CTL |
| * NOTE: Comment order here is different from bits in CKCTL value: |
| * armdiv, dspdiv, dspmmu, tcdiv, perdiv, lcddiv |
| */ |
| #if defined(CONFIG_OMAP_ARM_216MHZ) |
| { 216000000, 12000000, 216000000, 0x050d, 0x2910 }, /* 1/1/2/2/2/8 */ |
| #endif |
| #if defined(CONFIG_OMAP_ARM_195MHZ) |
| { 195000000, 13000000, 195000000, 0x050e, 0x2790 }, /* 1/1/2/2/4/8 */ |
| #endif |
| #if defined(CONFIG_OMAP_ARM_192MHZ) |
| { 192000000, 19200000, 192000000, 0x050f, 0x2510 }, /* 1/1/2/2/8/8 */ |
| { 192000000, 12000000, 192000000, 0x050f, 0x2810 }, /* 1/1/2/2/8/8 */ |
| { 96000000, 12000000, 192000000, 0x055f, 0x2810 }, /* 2/2/2/2/8/8 */ |
| { 48000000, 12000000, 192000000, 0x0baf, 0x2810 }, /* 4/4/4/8/8/8 */ |
| { 24000000, 12000000, 192000000, 0x0fff, 0x2810 }, /* 8/8/8/8/8/8 */ |
| #endif |
| #if defined(CONFIG_OMAP_ARM_182MHZ) |
| { 182000000, 13000000, 182000000, 0x050e, 0x2710 }, /* 1/1/2/2/4/8 */ |
| #endif |
| #if defined(CONFIG_OMAP_ARM_168MHZ) |
| { 168000000, 12000000, 168000000, 0x010f, 0x2710 }, /* 1/1/1/2/8/8 */ |
| #endif |
| #if defined(CONFIG_OMAP_ARM_150MHZ) |
| { 150000000, 12000000, 150000000, 0x010a, 0x2cb0 }, /* 1/1/1/2/4/4 */ |
| #endif |
| #if defined(CONFIG_OMAP_ARM_120MHZ) |
| { 120000000, 12000000, 120000000, 0x010a, 0x2510 }, /* 1/1/1/2/4/4 */ |
| #endif |
| #if defined(CONFIG_OMAP_ARM_96MHZ) |
| { 96000000, 12000000, 96000000, 0x0005, 0x2410 }, /* 1/1/1/1/2/2 */ |
| #endif |
| #if defined(CONFIG_OMAP_ARM_60MHZ) |
| { 60000000, 12000000, 60000000, 0x0005, 0x2290 }, /* 1/1/1/1/2/2 */ |
| #endif |
| #if defined(CONFIG_OMAP_ARM_30MHZ) |
| { 30000000, 12000000, 60000000, 0x0555, 0x2290 }, /* 2/2/2/2/2/2 */ |
| #endif |
| { 0, 0, 0, 0, 0 }, |
| }; |
| |
| /*------------------------------------------------------------------------- |
| * Omap1 clocks |
| *-------------------------------------------------------------------------*/ |
| |
| static struct clk ck_ref = { |
| .name = "ck_ref", |
| .ops = &clkops_generic, |
| .rate = 12000000, |
| .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX | |
| CLOCK_IN_OMAP310 | ALWAYS_ENABLED, |
| }; |
| |
| static struct clk ck_dpll1 = { |
| .name = "ck_dpll1", |
| .ops = &clkops_generic, |
| .parent = &ck_ref, |
| .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX | |
| CLOCK_IN_OMAP310 | RATE_PROPAGATES | ALWAYS_ENABLED, |
| }; |
| |
| static struct arm_idlect1_clk ck_dpll1out = { |
| .clk = { |
| .name = "ck_dpll1out", |
| .ops = &clkops_generic, |
| .parent = &ck_dpll1, |
| .flags = CLOCK_IN_OMAP16XX | CLOCK_IDLE_CONTROL | |
| ENABLE_REG_32BIT | RATE_PROPAGATES, |
| .enable_reg = (void __iomem *)ARM_IDLECT2, |
| .enable_bit = EN_CKOUT_ARM, |
| .recalc = &followparent_recalc, |
| }, |
| .idlect_shift = 12, |
| }; |
| |
| static struct clk sossi_ck = { |
| .name = "ck_sossi", |
| .ops = &clkops_generic, |
| .parent = &ck_dpll1out.clk, |
| .flags = CLOCK_IN_OMAP16XX | CLOCK_NO_IDLE_PARENT | |
| ENABLE_REG_32BIT, |
| .enable_reg = (void __iomem *)MOD_CONF_CTRL_1, |
| .enable_bit = 16, |
| .recalc = &omap1_sossi_recalc, |
| .set_rate = &omap1_set_sossi_rate, |
| }; |
| |
| static struct clk arm_ck = { |
| .name = "arm_ck", |
| .ops = &clkops_generic, |
| .parent = &ck_dpll1, |
| .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX | |
| CLOCK_IN_OMAP310 | RATE_CKCTL | RATE_PROPAGATES | |
| ALWAYS_ENABLED, |
| .rate_offset = CKCTL_ARMDIV_OFFSET, |
| .recalc = &omap1_ckctl_recalc, |
| }; |
| |
| static struct arm_idlect1_clk armper_ck = { |
| .clk = { |
| .name = "armper_ck", |
| .ops = &clkops_generic, |
| .parent = &ck_dpll1, |
| .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX | |
| CLOCK_IN_OMAP310 | RATE_CKCTL | |
| CLOCK_IDLE_CONTROL, |
| .enable_reg = (void __iomem *)ARM_IDLECT2, |
| .enable_bit = EN_PERCK, |
| .rate_offset = CKCTL_PERDIV_OFFSET, |
| .recalc = &omap1_ckctl_recalc, |
| }, |
| .idlect_shift = 2, |
| }; |
| |
| static struct clk arm_gpio_ck = { |
| .name = "arm_gpio_ck", |
| .ops = &clkops_generic, |
| .parent = &ck_dpll1, |
| .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP310, |
| .enable_reg = (void __iomem *)ARM_IDLECT2, |
| .enable_bit = EN_GPIOCK, |
| .recalc = &followparent_recalc, |
| }; |
| |
| static struct arm_idlect1_clk armxor_ck = { |
| .clk = { |
| .name = "armxor_ck", |
| .ops = &clkops_generic, |
| .parent = &ck_ref, |
| .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX | |
| CLOCK_IN_OMAP310 | CLOCK_IDLE_CONTROL, |
| .enable_reg = (void __iomem *)ARM_IDLECT2, |
| .enable_bit = EN_XORPCK, |
| .recalc = &followparent_recalc, |
| }, |
| .idlect_shift = 1, |
| }; |
| |
| static struct arm_idlect1_clk armtim_ck = { |
| .clk = { |
| .name = "armtim_ck", |
| .ops = &clkops_generic, |
| .parent = &ck_ref, |
| .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX | |
| CLOCK_IN_OMAP310 | CLOCK_IDLE_CONTROL, |
| .enable_reg = (void __iomem *)ARM_IDLECT2, |
| .enable_bit = EN_TIMCK, |
| .recalc = &followparent_recalc, |
| }, |
| .idlect_shift = 9, |
| }; |
| |
| static struct arm_idlect1_clk armwdt_ck = { |
| .clk = { |
| .name = "armwdt_ck", |
| .ops = &clkops_generic, |
| .parent = &ck_ref, |
| .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX | |
| CLOCK_IN_OMAP310 | CLOCK_IDLE_CONTROL, |
| .enable_reg = (void __iomem *)ARM_IDLECT2, |
| .enable_bit = EN_WDTCK, |
| .recalc = &omap1_watchdog_recalc, |
| }, |
| .idlect_shift = 0, |
| }; |
| |
| static struct clk arminth_ck16xx = { |
| .name = "arminth_ck", |
| .ops = &clkops_generic, |
| .parent = &arm_ck, |
| .flags = CLOCK_IN_OMAP16XX | ALWAYS_ENABLED, |
| .recalc = &followparent_recalc, |
| /* Note: On 16xx the frequency can be divided by 2 by programming |
| * ARM_CKCTL:ARM_INTHCK_SEL(14) to 1 |
| * |
| * 1510 version is in TC clocks. |
| */ |
| }; |
| |
| static struct clk dsp_ck = { |
| .name = "dsp_ck", |
| .ops = &clkops_generic, |
| .parent = &ck_dpll1, |
| .flags = CLOCK_IN_OMAP310 | CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX | |
| RATE_CKCTL, |
| .enable_reg = (void __iomem *)ARM_CKCTL, |
| .enable_bit = EN_DSPCK, |
| .rate_offset = CKCTL_DSPDIV_OFFSET, |
| .recalc = &omap1_ckctl_recalc, |
| }; |
| |
| static struct clk dspmmu_ck = { |
| .name = "dspmmu_ck", |
| .ops = &clkops_generic, |
| .parent = &ck_dpll1, |
| .flags = CLOCK_IN_OMAP310 | CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX | |
| RATE_CKCTL | ALWAYS_ENABLED, |
| .rate_offset = CKCTL_DSPMMUDIV_OFFSET, |
| .recalc = &omap1_ckctl_recalc, |
| }; |
| |
| static struct clk dspper_ck = { |
| .name = "dspper_ck", |
| .ops = &clkops_dspck, |
| .parent = &ck_dpll1, |
| .flags = CLOCK_IN_OMAP310 | CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX | |
| RATE_CKCTL | VIRTUAL_IO_ADDRESS, |
| .enable_reg = DSP_IDLECT2, |
| .enable_bit = EN_PERCK, |
| .rate_offset = CKCTL_PERDIV_OFFSET, |
| .recalc = &omap1_ckctl_recalc_dsp_domain, |
| .set_rate = &omap1_clk_set_rate_dsp_domain, |
| }; |
| |
| static struct clk dspxor_ck = { |
| .name = "dspxor_ck", |
| .ops = &clkops_dspck, |
| .parent = &ck_ref, |
| .flags = CLOCK_IN_OMAP310 | CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX | |
| VIRTUAL_IO_ADDRESS, |
| .enable_reg = DSP_IDLECT2, |
| .enable_bit = EN_XORPCK, |
| .recalc = &followparent_recalc, |
| }; |
| |
| static struct clk dsptim_ck = { |
| .name = "dsptim_ck", |
| .ops = &clkops_dspck, |
| .parent = &ck_ref, |
| .flags = CLOCK_IN_OMAP310 | CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX | |
| VIRTUAL_IO_ADDRESS, |
| .enable_reg = DSP_IDLECT2, |
| .enable_bit = EN_DSPTIMCK, |
| .recalc = &followparent_recalc, |
| }; |
| |
| /* Tie ARM_IDLECT1:IDLIF_ARM to this logical clock structure */ |
| static struct arm_idlect1_clk tc_ck = { |
| .clk = { |
| .name = "tc_ck", |
| .ops = &clkops_generic, |
| .parent = &ck_dpll1, |
| .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX | |
| CLOCK_IN_OMAP730 | CLOCK_IN_OMAP310 | |
| RATE_CKCTL | RATE_PROPAGATES | |
| ALWAYS_ENABLED | CLOCK_IDLE_CONTROL, |
| .rate_offset = CKCTL_TCDIV_OFFSET, |
| .recalc = &omap1_ckctl_recalc, |
| }, |
| .idlect_shift = 6, |
| }; |
| |
| static struct clk arminth_ck1510 = { |
| .name = "arminth_ck", |
| .ops = &clkops_generic, |
| .parent = &tc_ck.clk, |
| .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP310 | |
| ALWAYS_ENABLED, |
| .recalc = &followparent_recalc, |
| /* Note: On 1510 the frequency follows TC_CK |
| * |
| * 16xx version is in MPU clocks. |
| */ |
| }; |
| |
| static struct clk tipb_ck = { |
| /* No-idle controlled by "tc_ck" */ |
| .name = "tipb_ck", |
| .ops = &clkops_generic, |
| .parent = &tc_ck.clk, |
| .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP310 | |
| ALWAYS_ENABLED, |
| .recalc = &followparent_recalc, |
| }; |
| |
| static struct clk l3_ocpi_ck = { |
| /* No-idle controlled by "tc_ck" */ |
| .name = "l3_ocpi_ck", |
| .ops = &clkops_generic, |
| .parent = &tc_ck.clk, |
| .flags = CLOCK_IN_OMAP16XX, |
| .enable_reg = (void __iomem *)ARM_IDLECT3, |
| .enable_bit = EN_OCPI_CK, |
| .recalc = &followparent_recalc, |
| }; |
| |
| static struct clk tc1_ck = { |
| .name = "tc1_ck", |
| .ops = &clkops_generic, |
| .parent = &tc_ck.clk, |
| .flags = CLOCK_IN_OMAP16XX, |
| .enable_reg = (void __iomem *)ARM_IDLECT3, |
| .enable_bit = EN_TC1_CK, |
| .recalc = &followparent_recalc, |
| }; |
| |
| static struct clk tc2_ck = { |
| .name = "tc2_ck", |
| .ops = &clkops_generic, |
| .parent = &tc_ck.clk, |
| .flags = CLOCK_IN_OMAP16XX, |
| .enable_reg = (void __iomem *)ARM_IDLECT3, |
| .enable_bit = EN_TC2_CK, |
| .recalc = &followparent_recalc, |
| }; |
| |
| static struct clk dma_ck = { |
| /* No-idle controlled by "tc_ck" */ |
| .name = "dma_ck", |
| .ops = &clkops_generic, |
| .parent = &tc_ck.clk, |
| .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX | |
| CLOCK_IN_OMAP310 | ALWAYS_ENABLED, |
| .recalc = &followparent_recalc, |
| }; |
| |
| static struct clk dma_lcdfree_ck = { |
| .name = "dma_lcdfree_ck", |
| .ops = &clkops_generic, |
| .parent = &tc_ck.clk, |
| .flags = CLOCK_IN_OMAP16XX | ALWAYS_ENABLED, |
| .recalc = &followparent_recalc, |
| }; |
| |
| static struct arm_idlect1_clk api_ck = { |
| .clk = { |
| .name = "api_ck", |
| .ops = &clkops_generic, |
| .parent = &tc_ck.clk, |
| .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX | |
| CLOCK_IN_OMAP310 | CLOCK_IDLE_CONTROL, |
| .enable_reg = (void __iomem *)ARM_IDLECT2, |
| .enable_bit = EN_APICK, |
| .recalc = &followparent_recalc, |
| }, |
| .idlect_shift = 8, |
| }; |
| |
| static struct arm_idlect1_clk lb_ck = { |
| .clk = { |
| .name = "lb_ck", |
| .ops = &clkops_generic, |
| .parent = &tc_ck.clk, |
| .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP310 | |
| CLOCK_IDLE_CONTROL, |
| .enable_reg = (void __iomem *)ARM_IDLECT2, |
| .enable_bit = EN_LBCK, |
| .recalc = &followparent_recalc, |
| }, |
| .idlect_shift = 4, |
| }; |
| |
| static struct clk rhea1_ck = { |
| .name = "rhea1_ck", |
| .ops = &clkops_generic, |
| .parent = &tc_ck.clk, |
| .flags = CLOCK_IN_OMAP16XX | ALWAYS_ENABLED, |
| .recalc = &followparent_recalc, |
| }; |
| |
| static struct clk rhea2_ck = { |
| .name = "rhea2_ck", |
| .ops = &clkops_generic, |
| .parent = &tc_ck.clk, |
| .flags = CLOCK_IN_OMAP16XX | ALWAYS_ENABLED, |
| .recalc = &followparent_recalc, |
| }; |
| |
| static struct clk lcd_ck_16xx = { |
| .name = "lcd_ck", |
| .ops = &clkops_generic, |
| .parent = &ck_dpll1, |
| .flags = CLOCK_IN_OMAP16XX | CLOCK_IN_OMAP730 | RATE_CKCTL, |
| .enable_reg = (void __iomem *)ARM_IDLECT2, |
| .enable_bit = EN_LCDCK, |
| .rate_offset = CKCTL_LCDDIV_OFFSET, |
| .recalc = &omap1_ckctl_recalc, |
| }; |
| |
| static struct arm_idlect1_clk lcd_ck_1510 = { |
| .clk = { |
| .name = "lcd_ck", |
| .ops = &clkops_generic, |
| .parent = &ck_dpll1, |
| .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP310 | |
| RATE_CKCTL | CLOCK_IDLE_CONTROL, |
| .enable_reg = (void __iomem *)ARM_IDLECT2, |
| .enable_bit = EN_LCDCK, |
| .rate_offset = CKCTL_LCDDIV_OFFSET, |
| .recalc = &omap1_ckctl_recalc, |
| }, |
| .idlect_shift = 3, |
| }; |
| |
| static struct clk uart1_1510 = { |
| .name = "uart1_ck", |
| .ops = &clkops_generic, |
| /* Direct from ULPD, no real parent */ |
| .parent = &armper_ck.clk, |
| .rate = 12000000, |
| .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP310 | |
| ENABLE_REG_32BIT | ALWAYS_ENABLED | |
| CLOCK_NO_IDLE_PARENT, |
| .enable_reg = (void __iomem *)MOD_CONF_CTRL_0, |
| .enable_bit = 29, /* Chooses between 12MHz and 48MHz */ |
| .set_rate = &omap1_set_uart_rate, |
| .recalc = &omap1_uart_recalc, |
| }; |
| |
| static struct uart_clk uart1_16xx = { |
| .clk = { |
| .name = "uart1_ck", |
| .ops = &clkops_uart, |
| /* Direct from ULPD, no real parent */ |
| .parent = &armper_ck.clk, |
| .rate = 48000000, |
| .flags = CLOCK_IN_OMAP16XX | RATE_FIXED | |
| ENABLE_REG_32BIT | CLOCK_NO_IDLE_PARENT, |
| .enable_reg = (void __iomem *)MOD_CONF_CTRL_0, |
| .enable_bit = 29, |
| }, |
| .sysc_addr = 0xfffb0054, |
| }; |
| |
| static struct clk uart2_ck = { |
| .name = "uart2_ck", |
| .ops = &clkops_generic, |
| /* Direct from ULPD, no real parent */ |
| .parent = &armper_ck.clk, |
| .rate = 12000000, |
| .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX | |
| CLOCK_IN_OMAP310 | ENABLE_REG_32BIT | |
| ALWAYS_ENABLED | CLOCK_NO_IDLE_PARENT, |
| .enable_reg = (void __iomem *)MOD_CONF_CTRL_0, |
| .enable_bit = 30, /* Chooses between 12MHz and 48MHz */ |
| .set_rate = &omap1_set_uart_rate, |
| .recalc = &omap1_uart_recalc, |
| }; |
| |
| static struct clk uart3_1510 = { |
| .name = "uart3_ck", |
| .ops = &clkops_generic, |
| /* Direct from ULPD, no real parent */ |
| .parent = &armper_ck.clk, |
| .rate = 12000000, |
| .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP310 | |
| ENABLE_REG_32BIT | ALWAYS_ENABLED | |
| CLOCK_NO_IDLE_PARENT, |
| .enable_reg = (void __iomem *)MOD_CONF_CTRL_0, |
| .enable_bit = 31, /* Chooses between 12MHz and 48MHz */ |
| .set_rate = &omap1_set_uart_rate, |
| .recalc = &omap1_uart_recalc, |
| }; |
| |
| static struct uart_clk uart3_16xx = { |
| .clk = { |
| .name = "uart3_ck", |
| .ops = &clkops_uart, |
| /* Direct from ULPD, no real parent */ |
| .parent = &armper_ck.clk, |
| .rate = 48000000, |
| .flags = CLOCK_IN_OMAP16XX | RATE_FIXED | |
| ENABLE_REG_32BIT | CLOCK_NO_IDLE_PARENT, |
| .enable_reg = (void __iomem *)MOD_CONF_CTRL_0, |
| .enable_bit = 31, |
| }, |
| .sysc_addr = 0xfffb9854, |
| }; |
| |
| static struct clk usb_clko = { /* 6 MHz output on W4_USB_CLKO */ |
| .name = "usb_clko", |
| .ops = &clkops_generic, |
| /* Direct from ULPD, no parent */ |
| .rate = 6000000, |
| .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX | |
| CLOCK_IN_OMAP310 | RATE_FIXED | ENABLE_REG_32BIT, |
| .enable_reg = (void __iomem *)ULPD_CLOCK_CTRL, |
| .enable_bit = USB_MCLK_EN_BIT, |
| }; |
| |
| static struct clk usb_hhc_ck1510 = { |
| .name = "usb_hhc_ck", |
| .ops = &clkops_generic, |
| /* Direct from ULPD, no parent */ |
| .rate = 48000000, /* Actually 2 clocks, 12MHz and 48MHz */ |
| .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP310 | |
| RATE_FIXED | ENABLE_REG_32BIT, |
| .enable_reg = (void __iomem *)MOD_CONF_CTRL_0, |
| .enable_bit = USB_HOST_HHC_UHOST_EN, |
| }; |
| |
| static struct clk usb_hhc_ck16xx = { |
| .name = "usb_hhc_ck", |
| .ops = &clkops_generic, |
| /* Direct from ULPD, no parent */ |
| .rate = 48000000, |
| /* OTG_SYSCON_2.OTG_PADEN == 0 (not 1510-compatible) */ |
| .flags = CLOCK_IN_OMAP16XX | |
| RATE_FIXED | ENABLE_REG_32BIT, |
| .enable_reg = (void __iomem *)OTG_BASE + 0x08 /* OTG_SYSCON_2 */, |
| .enable_bit = 8 /* UHOST_EN */, |
| }; |
| |
| static struct clk usb_dc_ck = { |
| .name = "usb_dc_ck", |
| .ops = &clkops_generic, |
| /* Direct from ULPD, no parent */ |
| .rate = 48000000, |
| .flags = CLOCK_IN_OMAP16XX | RATE_FIXED, |
| .enable_reg = (void __iomem *)SOFT_REQ_REG, |
| .enable_bit = 4, |
| }; |
| |
| static struct clk mclk_1510 = { |
| .name = "mclk", |
| .ops = &clkops_generic, |
| /* Direct from ULPD, no parent. May be enabled by ext hardware. */ |
| .rate = 12000000, |
| .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP310 | RATE_FIXED, |
| .enable_reg = (void __iomem *)SOFT_REQ_REG, |
| .enable_bit = 6, |
| }; |
| |
| static struct clk mclk_16xx = { |
| .name = "mclk", |
| .ops = &clkops_generic, |
| /* Direct from ULPD, no parent. May be enabled by ext hardware. */ |
| .flags = CLOCK_IN_OMAP16XX, |
| .enable_reg = (void __iomem *)COM_CLK_DIV_CTRL_SEL, |
| .enable_bit = COM_ULPD_PLL_CLK_REQ, |
| .set_rate = &omap1_set_ext_clk_rate, |
| .round_rate = &omap1_round_ext_clk_rate, |
| .init = &omap1_init_ext_clk, |
| }; |
| |
| static struct clk bclk_1510 = { |
| .name = "bclk", |
| .ops = &clkops_generic, |
| /* Direct from ULPD, no parent. May be enabled by ext hardware. */ |
| .rate = 12000000, |
| .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP310 | RATE_FIXED, |
| }; |
| |
| static struct clk bclk_16xx = { |
| .name = "bclk", |
| .ops = &clkops_generic, |
| /* Direct from ULPD, no parent. May be enabled by ext hardware. */ |
| .flags = CLOCK_IN_OMAP16XX, |
| .enable_reg = (void __iomem *)SWD_CLK_DIV_CTRL_SEL, |
| .enable_bit = SWD_ULPD_PLL_CLK_REQ, |
| .set_rate = &omap1_set_ext_clk_rate, |
| .round_rate = &omap1_round_ext_clk_rate, |
| .init = &omap1_init_ext_clk, |
| }; |
| |
| static struct clk mmc1_ck = { |
| .name = "mmc_ck", |
| .ops = &clkops_generic, |
| /* Functional clock is direct from ULPD, interface clock is ARMPER */ |
| .parent = &armper_ck.clk, |
| .rate = 48000000, |
| .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX | |
| CLOCK_IN_OMAP310 | RATE_FIXED | ENABLE_REG_32BIT | |
| CLOCK_NO_IDLE_PARENT, |
| .enable_reg = (void __iomem *)MOD_CONF_CTRL_0, |
| .enable_bit = 23, |
| }; |
| |
| static struct clk mmc2_ck = { |
| .name = "mmc_ck", |
| .id = 1, |
| .ops = &clkops_generic, |
| /* Functional clock is direct from ULPD, interface clock is ARMPER */ |
| .parent = &armper_ck.clk, |
| .rate = 48000000, |
| .flags = CLOCK_IN_OMAP16XX | |
| RATE_FIXED | ENABLE_REG_32BIT | CLOCK_NO_IDLE_PARENT, |
| .enable_reg = (void __iomem *)MOD_CONF_CTRL_0, |
| .enable_bit = 20, |
| }; |
| |
| static struct clk virtual_ck_mpu = { |
| .name = "mpu", |
| .ops = &clkops_generic, |
| .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX | |
| CLOCK_IN_OMAP310 | ALWAYS_ENABLED, |
| .parent = &arm_ck, /* Is smarter alias for */ |
| .recalc = &followparent_recalc, |
| .set_rate = &omap1_select_table_rate, |
| .round_rate = &omap1_round_to_table_rate, |
| }; |
| |
| /* virtual functional clock domain for I2C. Just for making sure that ARMXOR_CK |
| remains active during MPU idle whenever this is enabled */ |
| static struct clk i2c_fck = { |
| .name = "i2c_fck", |
| .id = 1, |
| .ops = &clkops_generic, |
| .flags = CLOCK_IN_OMAP310 | CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX | |
| CLOCK_NO_IDLE_PARENT | ALWAYS_ENABLED, |
| .parent = &armxor_ck.clk, |
| .recalc = &followparent_recalc, |
| }; |
| |
| static struct clk i2c_ick = { |
| .name = "i2c_ick", |
| .id = 1, |
| .ops = &clkops_generic, |
| .flags = CLOCK_IN_OMAP16XX | CLOCK_NO_IDLE_PARENT | |
| ALWAYS_ENABLED, |
| .parent = &armper_ck.clk, |
| .recalc = &followparent_recalc, |
| }; |
| |
| static struct clk * onchip_clks[] = { |
| /* non-ULPD clocks */ |
| &ck_ref, |
| &ck_dpll1, |
| /* CK_GEN1 clocks */ |
| &ck_dpll1out.clk, |
| &sossi_ck, |
| &arm_ck, |
| &armper_ck.clk, |
| &arm_gpio_ck, |
| &armxor_ck.clk, |
| &armtim_ck.clk, |
| &armwdt_ck.clk, |
| &arminth_ck1510, &arminth_ck16xx, |
| /* CK_GEN2 clocks */ |
| &dsp_ck, |
| &dspmmu_ck, |
| &dspper_ck, |
| &dspxor_ck, |
| &dsptim_ck, |
| /* CK_GEN3 clocks */ |
| &tc_ck.clk, |
| &tipb_ck, |
| &l3_ocpi_ck, |
| &tc1_ck, |
| &tc2_ck, |
| &dma_ck, |
| &dma_lcdfree_ck, |
| &api_ck.clk, |
| &lb_ck.clk, |
| &rhea1_ck, |
| &rhea2_ck, |
| &lcd_ck_16xx, |
| &lcd_ck_1510.clk, |
| /* ULPD clocks */ |
| &uart1_1510, |
| &uart1_16xx.clk, |
| &uart2_ck, |
| &uart3_1510, |
| &uart3_16xx.clk, |
| &usb_clko, |
| &usb_hhc_ck1510, &usb_hhc_ck16xx, |
| &usb_dc_ck, |
| &mclk_1510, &mclk_16xx, |
| &bclk_1510, &bclk_16xx, |
| &mmc1_ck, |
| &mmc2_ck, |
| /* Virtual clocks */ |
| &virtual_ck_mpu, |
| &i2c_fck, |
| &i2c_ick, |
| }; |
| |
| #endif |