2 * OMAP2/3 interface clock control
4 * Copyright (C) 2011 Nokia Corporation
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
13 #include <linux/kernel.h>
14 #include <linux/clk-provider.h>
16 #include <linux/clk/ti.h>
20 /* Register offsets */
21 #define OMAP24XX_CM_FCLKEN2 0x04
22 #define CM_AUTOIDLE 0x30
23 #define CM_ICLKEN 0x10
24 #define CM_IDLEST 0x20
26 #define OMAP24XX_CM_IDLEST_VAL 0
28 /* Private functions */
31 void omap2_clkt_iclk_allow_idle(struct clk_hw_omap
*clk
)
34 struct clk_omap_reg r
;
36 memcpy(&r
, &clk
->enable_reg
, sizeof(r
));
37 r
.offset
^= (CM_AUTOIDLE
^ CM_ICLKEN
);
39 v
= ti_clk_ll_ops
->clk_readl(&r
);
40 v
|= (1 << clk
->enable_bit
);
41 ti_clk_ll_ops
->clk_writel(v
, &r
);
45 void omap2_clkt_iclk_deny_idle(struct clk_hw_omap
*clk
)
48 struct clk_omap_reg r
;
50 memcpy(&r
, &clk
->enable_reg
, sizeof(r
));
52 r
.offset
^= (CM_AUTOIDLE
^ CM_ICLKEN
);
54 v
= ti_clk_ll_ops
->clk_readl(&r
);
55 v
&= ~(1 << clk
->enable_bit
);
56 ti_clk_ll_ops
->clk_writel(v
, &r
);
60 * omap2430_clk_i2chs_find_idlest - return CM_IDLEST info for 2430 I2CHS
61 * @clk: struct clk * being enabled
62 * @idlest_reg: void __iomem ** to store CM_IDLEST reg address into
63 * @idlest_bit: pointer to a u8 to store the CM_IDLEST bit shift into
64 * @idlest_val: pointer to a u8 to store the CM_IDLEST indicator
66 * OMAP2430 I2CHS CM_IDLEST bits are in CM_IDLEST1_CORE, but the
67 * CM_*CLKEN bits are in CM_{I,F}CLKEN2_CORE. This custom function
68 * passes back the correct CM_IDLEST register address for I2CHS
69 * modules. No return value.
71 static void omap2430_clk_i2chs_find_idlest(struct clk_hw_omap
*clk
,
72 struct clk_omap_reg
*idlest_reg
,
76 memcpy(idlest_reg
, &clk
->enable_reg
, sizeof(*idlest_reg
));
77 idlest_reg
->offset
^= (OMAP24XX_CM_FCLKEN2
^ CM_IDLEST
);
78 *idlest_bit
= clk
->enable_bit
;
79 *idlest_val
= OMAP24XX_CM_IDLEST_VAL
;
84 const struct clk_hw_omap_ops clkhwops_iclk
= {
85 .allow_idle
= omap2_clkt_iclk_allow_idle
,
86 .deny_idle
= omap2_clkt_iclk_deny_idle
,
89 const struct clk_hw_omap_ops clkhwops_iclk_wait
= {
90 .allow_idle
= omap2_clkt_iclk_allow_idle
,
91 .deny_idle
= omap2_clkt_iclk_deny_idle
,
92 .find_idlest
= omap2_clk_dflt_find_idlest
,
93 .find_companion
= omap2_clk_dflt_find_companion
,
96 /* 2430 I2CHS has non-standard IDLEST register */
97 const struct clk_hw_omap_ops clkhwops_omap2430_i2chs_wait
= {
98 .find_idlest
= omap2430_clk_i2chs_find_idlest
,
99 .find_companion
= omap2_clk_dflt_find_companion
,