]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
Merge branch 'soc' of git://git.kernel.org/pub/scm/linux/kernel/git/horms/renesas...
authorArnd Bergmann <arnd@arndb.de>
Mon, 12 Nov 2012 20:45:19 +0000 (21:45 +0100)
committerArnd Bergmann <arnd@arndb.de>
Mon, 12 Nov 2012 20:45:19 +0000 (21:45 +0100)
From Simon Horman <horms@verge.net.au>:
  This series is based on the renesas/soc branch of the arm-soc tree.
  There will be a subquent 'SoC2' pull request which is based on this
  pull-request and a pull-request for boards.

* 'soc' of git://git.kernel.org/pub/scm/linux/kernel/git/horms/renesas:
  ARM: shmobile: add fsi external clock sh7372
  ARM: shmobile: add fsi external clock on r8a7740
  ARM: shmobile: r8a7740: add FSI-DVI clocks
  ARM: shmobile: sh7372: use sh_clk_fsidiv_register() for FSI-DIV clocks
  ARM: shmobile: sh7372: sh7372_fsidivX_clk become non-global
  sh: clkfwk: add sh_clk_fsidiv_register()
  ARM: shmobile: r8a7779: add USB OHCI clock support
  ARM: shmobile: r8a7779: add USB EHCI clock support
  ARM: shmobile: r8a7740: add USB24 clock explain
  ARM: shmobile: r8a7779: PFC rename PENCx -> USB_PENCx

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
arch/arm/mach-shmobile/board-ap4evb.c
arch/arm/mach-shmobile/board-mackerel.c
arch/arm/mach-shmobile/clock-r8a7740.c
arch/arm/mach-shmobile/clock-r8a7779.c
arch/arm/mach-shmobile/clock-sh7372.c
arch/arm/mach-shmobile/include/mach/r8a7779.h
arch/arm/mach-shmobile/include/mach/sh7372.h
arch/arm/mach-shmobile/pfc-r8a7779.c
drivers/sh/clk/cpg.c
include/linux/sh_clk.h

index 790dc68c431250a8ae7021bf622102826471ba16..cefdd030361d21fe2120626ccfc1e1f2b726e951 100644 (file)
@@ -728,7 +728,7 @@ fsia_ick_out:
 static int fsi_hdmi_set_rate(struct device *dev, int rate, int enable)
 {
        struct clk *fsib_clk;
-       struct clk *fdiv_clk = &sh7372_fsidivb_clk;
+       struct clk *fdiv_clk = clk_get(NULL, "fsidivb");
        long fsib_rate = 0;
        long fdiv_rate = 0;
        int ackmd_bpfmd;
index 0c27c810cf99d0906b655f298091ffab257644fc..c826d77ab8a6ff86c319a958a532365ab6c0bdbf 100644 (file)
@@ -882,7 +882,7 @@ static int __fsi_set_round_rate(struct clk *clk, long rate, int enable)
 static int fsi_b_set_rate(struct device *dev, int rate, int enable)
 {
        struct clk *fsib_clk;
-       struct clk *fdiv_clk = &sh7372_fsidivb_clk;
+       struct clk *fdiv_clk = clk_get(NULL, "fsidivb");
        long fsib_rate = 0;
        long fdiv_rate = 0;
        int ackmd_bpfmd;
index 6729e0032180ca7967c9ff05d3eff3471537092e..eac49d59782f3a66df3de2994f2d95e8a66b2c10 100644 (file)
@@ -65,6 +65,9 @@
 #define SMSTPCR3       IOMEM(0xe615013c)
 #define SMSTPCR4       IOMEM(0xe6150140)
 
+#define FSIDIVA                IOMEM(0xFE1F8000)
+#define FSIDIVB                IOMEM(0xFE1F8008)
+
 /* Fixed 32 KHz root clock from EXTALR pin */
 static struct clk extalr_clk = {
        .rate   = 32768,
@@ -188,6 +191,22 @@ static struct clk pllc1_div2_clk = {
 };
 
 /* USB clock */
+/*
+ * USBCKCR is controlling usb24 clock
+ * bit[7] : parent clock
+ * bit[6] : clock divide rate
+ * And this bit[7] is used as a "usb24s" from other devices.
+ * (Video clock / Sub clock / SPU clock)
+ * You can controll this clock as a below.
+ *
+ * struct clk *usb24   = clk_get(dev,  "usb24");
+ * struct clk *usb24s  = clk_get(NULL, "usb24s");
+ * struct clk *system  = clk_get(NULL, "system_clk");
+ * int rate = clk_get_rate(system);
+ *
+ * clk_set_parent(usb24s, system);  // for bit[7]
+ * clk_set_rate(usb24, rate / 2);   // for bit[6]
+ */
 static struct clk *usb24s_parents[] = {
        [0] = &system_clk,
        [1] = &extal2_clk
@@ -427,6 +446,14 @@ static struct clk *late_main_clks[] = {
        &hdmi2_clk,
 };
 
+/* FSI DIV */
+enum { FSIDIV_A, FSIDIV_B, FSIDIV_REPARENT_NR };
+
+static struct clk fsidivs[] = {
+       [FSIDIV_A] = SH_CLK_FSIDIV(FSIDIVA, &div6_reparent_clks[DIV6_FSIA]),
+       [FSIDIV_B] = SH_CLK_FSIDIV(FSIDIVB, &div6_reparent_clks[DIV6_FSIB]),
+};
+
 /* MSTP */
 enum {
        DIV4_I, DIV4_ZG, DIV4_B, DIV4_M1, DIV4_HP,
@@ -596,6 +623,10 @@ static struct clk_lookup lookups[] = {
 
        CLKDEV_ICK_ID("icka", "sh_fsi2",        &div6_reparent_clks[DIV6_FSIA]),
        CLKDEV_ICK_ID("ickb", "sh_fsi2",        &div6_reparent_clks[DIV6_FSIB]),
+       CLKDEV_ICK_ID("diva", "sh_fsi2",        &fsidivs[FSIDIV_A]),
+       CLKDEV_ICK_ID("divb", "sh_fsi2",        &fsidivs[FSIDIV_B]),
+       CLKDEV_ICK_ID("xcka", "sh_fsi2",        &fsiack_clk),
+       CLKDEV_ICK_ID("xckb", "sh_fsi2",        &fsibck_clk),
 };
 
 void __init r8a7740_clock_init(u8 md_ck)
@@ -641,6 +672,9 @@ void __init r8a7740_clock_init(u8 md_ck)
        for (k = 0; !ret && (k < ARRAY_SIZE(late_main_clks)); k++)
                ret = clk_register(late_main_clks[k]);
 
+       if (!ret)
+               ret = sh_clk_fsidiv_register(fsidivs, FSIDIV_REPARENT_NR);
+
        clkdev_add_table(lookups, ARRAY_SIZE(lookups));
 
        if (!ret)
index e48509b938cf6d672dbf0fbba93e05545345002d..c019609da660c07567c4cd9551bba1ea1d492a86 100644 (file)
@@ -87,6 +87,7 @@ static struct clk div4_clks[DIV4_NR] = {
 };
 
 enum { MSTP323, MSTP322, MSTP321, MSTP320,
+       MSTP101, MSTP100,
        MSTP030,
        MSTP029, MSTP028, MSTP027, MSTP026, MSTP025, MSTP024, MSTP023, MSTP022, MSTP021,
        MSTP016, MSTP015, MSTP014,
@@ -98,6 +99,8 @@ static struct clk mstp_clks[MSTP_NR] = {
        [MSTP322] = SH_CLK_MSTP32(&div4_clks[DIV4_P], MSTPCR3, 22, 0), /* SDHI1 */
        [MSTP321] = SH_CLK_MSTP32(&div4_clks[DIV4_P], MSTPCR3, 21, 0), /* SDHI2 */
        [MSTP320] = SH_CLK_MSTP32(&div4_clks[DIV4_P], MSTPCR3, 20, 0), /* SDHI3 */
+       [MSTP101] = SH_CLK_MSTP32(&div4_clks[DIV4_P], MSTPCR1,  1, 0), /* USB2 */
+       [MSTP100] = SH_CLK_MSTP32(&div4_clks[DIV4_P], MSTPCR1,  0, 0), /* USB0/1 */
        [MSTP030] = SH_CLK_MSTP32(&div4_clks[DIV4_P], MSTPCR0, 30, 0), /* I2C0 */
        [MSTP029] = SH_CLK_MSTP32(&div4_clks[DIV4_P], MSTPCR0, 29, 0), /* I2C1 */
        [MSTP028] = SH_CLK_MSTP32(&div4_clks[DIV4_P], MSTPCR0, 28, 0), /* I2C2 */
@@ -153,6 +156,10 @@ static struct clk_lookup lookups[] = {
        CLKDEV_CON_ID("peripheral_clk", &div4_clks[DIV4_P]),
 
        /* MSTP32 clocks */
+       CLKDEV_DEV_ID("ehci-platform.1", &mstp_clks[MSTP101]), /* USB EHCI port2 */
+       CLKDEV_DEV_ID("ohci-platform.1", &mstp_clks[MSTP101]), /* USB OHCI port2 */
+       CLKDEV_DEV_ID("ehci-platform.0", &mstp_clks[MSTP100]), /* USB EHCI port0/1 */
+       CLKDEV_DEV_ID("ohci-platform.0", &mstp_clks[MSTP100]), /* USB OHCI port0/1 */
        CLKDEV_DEV_ID("sh_tmu.0", &mstp_clks[MSTP016]), /* TMU00 */
        CLKDEV_DEV_ID("sh_tmu.1", &mstp_clks[MSTP016]), /* TMU01 */
        CLKDEV_DEV_ID("i2c-rcar.0", &mstp_clks[MSTP030]), /* I2C0 */
index 430a90ffa120ec5d84b7682b68f0c893a891107b..4d57e342537b6b24bde3dd17d189887636dcbaa4 100644 (file)
@@ -420,87 +420,11 @@ static struct clk div6_reparent_clks[DIV6_REPARENT_NR] = {
 };
 
 /* FSI DIV */
-static unsigned long fsidiv_recalc(struct clk *clk)
-{
-       unsigned long value;
-
-       value = __raw_readl(clk->mapping->base);
-
-       value >>= 16;
-       if (value < 2)
-               return 0;
-
-       return clk->parent->rate / value;
-}
-
-static long fsidiv_round_rate(struct clk *clk, unsigned long rate)
-{
-       return clk_rate_div_range_round(clk, 2, 0xffff, rate);
-}
-
-static void fsidiv_disable(struct clk *clk)
-{
-       __raw_writel(0, clk->mapping->base);
-}
-
-static int fsidiv_enable(struct clk *clk)
-{
-       unsigned long value;
-
-       value  = __raw_readl(clk->mapping->base) >> 16;
-       if (value < 2)
-               return -EIO;
-
-       __raw_writel((value << 16) | 0x3, clk->mapping->base);
-
-       return 0;
-}
+enum { FSIDIV_A, FSIDIV_B, FSIDIV_REPARENT_NR };
 
-static int fsidiv_set_rate(struct clk *clk, unsigned long rate)
-{
-       int idx;
-
-       idx = (clk->parent->rate / rate) & 0xffff;
-       if (idx < 2)
-               return -EINVAL;
-
-       __raw_writel(idx << 16, clk->mapping->base);
-       return 0;
-}
-
-static struct sh_clk_ops fsidiv_clk_ops = {
-       .recalc         = fsidiv_recalc,
-       .round_rate     = fsidiv_round_rate,
-       .set_rate       = fsidiv_set_rate,
-       .enable         = fsidiv_enable,
-       .disable        = fsidiv_disable,
-};
-
-static struct clk_mapping fsidiva_clk_mapping = {
-       .phys   = FSIDIVA,
-       .len    = 8,
-};
-
-struct clk sh7372_fsidiva_clk = {
-       .ops            = &fsidiv_clk_ops,
-       .parent         = &div6_reparent_clks[DIV6_FSIA], /* late install */
-       .mapping        = &fsidiva_clk_mapping,
-};
-
-static struct clk_mapping fsidivb_clk_mapping = {
-       .phys   = FSIDIVB,
-       .len    = 8,
-};
-
-struct clk sh7372_fsidivb_clk = {
-       .ops            = &fsidiv_clk_ops,
-       .parent         = &div6_reparent_clks[DIV6_FSIB],  /* late install */
-       .mapping        = &fsidivb_clk_mapping,
-};
-
-static struct clk *late_main_clks[] = {
-       &sh7372_fsidiva_clk,
-       &sh7372_fsidivb_clk,
+static struct clk fsidivs[] = {
+       [FSIDIV_A] = SH_CLK_FSIDIV(FSIDIVA, &div6_reparent_clks[DIV6_FSIA]),
+       [FSIDIV_B] = SH_CLK_FSIDIV(FSIDIVB, &div6_reparent_clks[DIV6_FSIB]),
 };
 
 enum { MSTP001, MSTP000,
@@ -583,6 +507,8 @@ static struct clk_lookup lookups[] = {
        CLKDEV_CON_ID("pllc1_clk", &pllc1_clk),
        CLKDEV_CON_ID("pllc1_div2_clk", &pllc1_div2_clk),
        CLKDEV_CON_ID("pllc2_clk", &sh7372_pllc2_clk),
+       CLKDEV_CON_ID("fsidiva", &fsidivs[FSIDIV_A]),
+       CLKDEV_CON_ID("fsidivb", &fsidivs[FSIDIV_B]),
 
        /* DIV4 clocks */
        CLKDEV_CON_ID("i_clk", &div4_clks[DIV4_I]),
@@ -678,6 +604,10 @@ static struct clk_lookup lookups[] = {
        CLKDEV_ICK_ID("icka", "sh_fsi2", &div6_reparent_clks[DIV6_FSIA]),
        CLKDEV_ICK_ID("ickb", "sh_fsi2", &div6_reparent_clks[DIV6_FSIB]),
        CLKDEV_ICK_ID("spu2", "sh_fsi2", &mstp_clks[MSTP223]),
+       CLKDEV_ICK_ID("diva", "sh_fsi2", &fsidivs[FSIDIV_A]),
+       CLKDEV_ICK_ID("divb", "sh_fsi2", &fsidivs[FSIDIV_B]),
+       CLKDEV_ICK_ID("xcka", "sh_fsi2", &sh7372_fsiack_clk),
+       CLKDEV_ICK_ID("xckb", "sh_fsi2", &sh7372_fsibck_clk),
 };
 
 void __init sh7372_clock_init(void)
@@ -706,8 +636,8 @@ void __init sh7372_clock_init(void)
        if (!ret)
                ret = sh_clk_mstp_register(mstp_clks, MSTP_NR);
 
-       for (k = 0; !ret && (k < ARRAY_SIZE(late_main_clks)); k++)
-               ret = clk_register(late_main_clks[k]);
+       if (!ret)
+               ret = sh_clk_fsidiv_register(fsidivs, FSIDIV_REPARENT_NR);
 
        clkdev_add_table(lookups, ARRAY_SIZE(lookups));
 
index 499f52d2a4a193acbcf659af657aed58d7e27ffb..8ab0cd6ad6b0c7c8a4d75b35ddbb3a92e9870003 100644 (file)
@@ -71,7 +71,7 @@ enum {
        GPIO_FN_A19,
 
        /* IPSR0 */
-       GPIO_FN_PENC2, GPIO_FN_SCK0, GPIO_FN_PWM1, GPIO_FN_PWMFSW0,
+       GPIO_FN_USB_PENC2, GPIO_FN_SCK0, GPIO_FN_PWM1, GPIO_FN_PWMFSW0,
        GPIO_FN_SCIF_CLK, GPIO_FN_TCLK0_C, GPIO_FN_BS, GPIO_FN_SD1_DAT2,
        GPIO_FN_MMC0_D2, GPIO_FN_FD2, GPIO_FN_ATADIR0, GPIO_FN_SDSELF,
        GPIO_FN_HCTS1, GPIO_FN_TX4_C, GPIO_FN_A0, GPIO_FN_SD1_DAT3,
index d65fbbe84678190522c1b6a40b3f830082ba47b0..26cd1016fad85dde44d9e0d9b21f6ebab0678d66 100644 (file)
@@ -479,8 +479,6 @@ extern struct clk sh7372_dv_clki_div2_clk;
 extern struct clk sh7372_pllc2_clk;
 extern struct clk sh7372_fsiack_clk;
 extern struct clk sh7372_fsibck_clk;
-extern struct clk sh7372_fsidiva_clk;
-extern struct clk sh7372_fsidivb_clk;
 
 extern void sh7372_intcs_suspend(void);
 extern void sh7372_intcs_resume(void);
index cbc26ba2a0a23d6ce818a4d19a4e4b2b3ca9da43..9513234d322b07208d19e351991597b5506d0428 100644 (file)
@@ -140,7 +140,7 @@ enum {
        FN_IP7_3_2, FN_IP7_6_4, FN_IP7_9_7, FN_IP7_12_10,
        FN_IP7_14_13, FN_IP2_7_4, FN_IP2_11_8, FN_IP2_15_12,
        FN_IP1_28_25, FN_IP2_3_0, FN_IP8_3_0, FN_IP8_7_4,
-       FN_IP8_11_8, FN_IP8_15_12, FN_PENC0, FN_PENC1,
+       FN_IP8_11_8, FN_IP8_15_12, FN_USB_PENC0, FN_USB_PENC1,
        FN_IP0_2_0, FN_IP8_17_16, FN_IP8_18, FN_IP8_19,
 
        /* GPSR5 */
@@ -176,7 +176,7 @@ enum {
        FN_A0, FN_SD1_DAT3, FN_MMC0_D3, FN_FD3,
        FN_BS, FN_SD1_DAT2, FN_MMC0_D2, FN_FD2,
        FN_ATADIR0, FN_SDSELF, FN_HCTS1, FN_TX4_C,
-       FN_PENC2, FN_SCK0, FN_PWM1, FN_PWMFSW0,
+       FN_USB_PENC2, FN_SCK0, FN_PWM1, FN_PWMFSW0,
        FN_SCIF_CLK, FN_TCLK0_C,
 
        /* IPSR1 */
@@ -447,7 +447,7 @@ enum {
        A0_MARK, SD1_DAT3_MARK, MMC0_D3_MARK, FD3_MARK,
        BS_MARK, SD1_DAT2_MARK, MMC0_D2_MARK, FD2_MARK,
        ATADIR0_MARK, SDSELF_MARK, HCTS1_MARK, TX4_C_MARK,
-       PENC2_MARK, SCK0_MARK, PWM1_MARK, PWMFSW0_MARK,
+       USB_PENC2_MARK, SCK0_MARK, PWM1_MARK, PWMFSW0_MARK,
        SCIF_CLK_MARK, TCLK0_C_MARK,
 
        EX_CS0_MARK, RX3_C_IRDA_RX_C_MARK, MMC0_D6_MARK,
@@ -658,7 +658,7 @@ static pinmux_enum_t pinmux_data[] = {
        PINMUX_DATA(A18_MARK, FN_A18),
        PINMUX_DATA(A19_MARK, FN_A19),
 
-       PINMUX_IPSR_DATA(IP0_2_0, PENC2),
+       PINMUX_IPSR_DATA(IP0_2_0, USB_PENC2),
        PINMUX_IPSR_MODSEL_DATA(IP0_2_0, SCK0, SEL_SCIF0_0),
        PINMUX_IPSR_DATA(IP0_2_0, PWM1),
        PINMUX_IPSR_MODSEL_DATA(IP0_2_0, PWMFSW0, SEL_PWMFSW_0),
@@ -1456,7 +1456,7 @@ static struct pinmux_gpio pinmux_gpios[] = {
        GPIO_FN(A19),
 
        /* IPSR0 */
-       GPIO_FN(PENC2), GPIO_FN(SCK0), GPIO_FN(PWM1), GPIO_FN(PWMFSW0),
+       GPIO_FN(USB_PENC2), GPIO_FN(SCK0), GPIO_FN(PWM1), GPIO_FN(PWMFSW0),
        GPIO_FN(SCIF_CLK), GPIO_FN(TCLK0_C), GPIO_FN(BS), GPIO_FN(SD1_DAT2),
        GPIO_FN(MMC0_D2), GPIO_FN(FD2), GPIO_FN(ATADIR0), GPIO_FN(SDSELF),
        GPIO_FN(HCTS1), GPIO_FN(TX4_C), GPIO_FN(A0), GPIO_FN(SD1_DAT3),
@@ -1865,8 +1865,8 @@ static struct pinmux_cfg_reg pinmux_config_regs[] = {
                GP_4_30_FN, FN_IP8_18,
                GP_4_29_FN, FN_IP8_17_16,
                GP_4_28_FN, FN_IP0_2_0,
-               GP_4_27_FN, FN_PENC1,
-               GP_4_26_FN, FN_PENC0,
+               GP_4_27_FN, FN_USB_PENC1,
+               GP_4_26_FN, FN_USB_PENC0,
                GP_4_25_FN, FN_IP8_15_12,
                GP_4_24_FN, FN_IP8_11_8,
                GP_4_23_FN, FN_IP8_7_4,
@@ -1981,7 +1981,7 @@ static struct pinmux_cfg_reg pinmux_config_regs[] = {
                FN_BS, FN_SD1_DAT2, FN_MMC0_D2, FN_FD2,
                FN_ATADIR0, FN_SDSELF, FN_HCTS1, FN_TX4_C,
                /* IP0_2_0 [3] */
-               FN_PENC2, FN_SCK0, FN_PWM1, FN_PWMFSW0,
+               FN_USB_PENC2, FN_SCK0, FN_PWM1, FN_PWMFSW0,
                FN_SCIF_CLK, FN_TCLK0_C, 0, 0 }
        },
        { PINMUX_CFG_REG_VAR("IPSR1", 0xfffc0024, 32,
index 07e9fb4f8041d9d93371fab60aa50e61f23bbabb..b3dc44146ca072bdacc97ab0ba3f872a664a341a 100644 (file)
@@ -361,3 +361,89 @@ int __init sh_clk_div4_reparent_register(struct clk *clks, int nr,
        return sh_clk_div_register_ops(clks, nr, table,
                                       &sh_clk_div4_reparent_clk_ops);
 }
+
+/* FSI-DIV */
+static unsigned long fsidiv_recalc(struct clk *clk)
+{
+       u32 value;
+
+       value = __raw_readl(clk->mapping->base);
+
+       value >>= 16;
+       if (value < 2)
+               return clk->parent->rate;
+
+       return clk->parent->rate / value;
+}
+
+static long fsidiv_round_rate(struct clk *clk, unsigned long rate)
+{
+       return clk_rate_div_range_round(clk, 1, 0xffff, rate);
+}
+
+static void fsidiv_disable(struct clk *clk)
+{
+       __raw_writel(0, clk->mapping->base);
+}
+
+static int fsidiv_enable(struct clk *clk)
+{
+       u32 value;
+
+       value  = __raw_readl(clk->mapping->base) >> 16;
+       if (value < 2)
+               return 0;
+
+       __raw_writel((value << 16) | 0x3, clk->mapping->base);
+
+       return 0;
+}
+
+static int fsidiv_set_rate(struct clk *clk, unsigned long rate)
+{
+       u32 val;
+       int idx;
+
+       idx = (clk->parent->rate / rate) & 0xffff;
+       if (idx < 2)
+               __raw_writel(0, clk->mapping->base);
+       else
+               __raw_writel(idx << 16, clk->mapping->base);
+
+       return 0;
+}
+
+static struct sh_clk_ops fsidiv_clk_ops = {
+       .recalc         = fsidiv_recalc,
+       .round_rate     = fsidiv_round_rate,
+       .set_rate       = fsidiv_set_rate,
+       .enable         = fsidiv_enable,
+       .disable        = fsidiv_disable,
+};
+
+int __init sh_clk_fsidiv_register(struct clk *clks, int nr)
+{
+       struct clk_mapping *map;
+       int i;
+
+       for (i = 0; i < nr; i++) {
+
+               map = kzalloc(sizeof(struct clk_mapping), GFP_KERNEL);
+               if (!map) {
+                       pr_err("%s: unable to alloc memory\n", __func__);
+                       return -ENOMEM;
+               }
+
+               /* clks[i].enable_reg came from SH_CLK_FSIDIV() */
+               map->phys               = (phys_addr_t)clks[i].enable_reg;
+               map->len                = 8;
+
+               clks[i].enable_reg      = 0; /* remove .enable_reg */
+               clks[i].ops             = &fsidiv_clk_ops;
+               clks[i].mapping         = map;
+
+               clk_register(&clks[i]);
+       }
+
+       return 0;
+}
index 50910913b2687928bf59b4053b92beb21e569918..60c72395ec6bf9f90a98b79f2698c72e161ae41e 100644 (file)
@@ -199,4 +199,13 @@ int sh_clk_div6_reparent_register(struct clk *clks, int nr);
 #define CLKDEV_DEV_ID(_id, _clk) { .dev_id = _id, .clk = _clk }
 #define CLKDEV_ICK_ID(_cid, _did, _clk) { .con_id = _cid, .dev_id = _did, .clk = _clk }
 
+/* .enable_reg will be updated to .mapping on sh_clk_fsidiv_register() */
+#define SH_CLK_FSIDIV(_reg, _parent)           \
+{                                              \
+       .enable_reg = (void __iomem *)_reg,     \
+       .parent         = _parent,              \
+}
+
+int sh_clk_fsidiv_register(struct clk *clks, int nr);
+
 #endif /* __SH_CLOCK_H */