Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
5cfe9614
Commit
5cfe9614
authored
Aug 05, 2013
by
Mike Turquette
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'clk-next-s3c64xx' into clk-next
parents
6f9a4894
06dda9d7
Changes
8
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
906 additions
and
1 deletion
+906
-1
Documentation/devicetree/bindings/clock/samsung,s3c64xx-clock.txt
...ation/devicetree/bindings/clock/samsung,s3c64xx-clock.txt
+77
-0
drivers/clk/clk-mux.c
drivers/clk/clk-mux.c
+9
-1
drivers/clk/samsung/Makefile
drivers/clk/samsung/Makefile
+3
-0
drivers/clk/samsung/clk-pll.c
drivers/clk/samsung/clk-pll.c
+160
-0
drivers/clk/samsung/clk-pll.h
drivers/clk/samsung/clk-pll.h
+4
-0
drivers/clk/samsung/clk-s3c64xx.c
drivers/clk/samsung/clk-s3c64xx.c
+473
-0
include/dt-bindings/clock/samsung,s3c64xx-clock.h
include/dt-bindings/clock/samsung,s3c64xx-clock.h
+178
-0
include/linux/clk-provider.h
include/linux/clk-provider.h
+2
-0
No files found.
Documentation/devicetree/bindings/clock/samsung,s3c64xx-clock.txt
0 → 100644
View file @
5cfe9614
* Samsung S3C64xx Clock Controller
The S3C64xx clock controller generates and supplies clock to various controllers
within the SoC. The clock binding described here is applicable to all SoCs in
the S3C64xx family.
Required Properties:
- compatible: should be one of the following.
- "samsung,s3c6400-clock" - controller compatible with S3C6400 SoC.
- "samsung,s3c6410-clock" - controller compatible with S3C6410 SoC.
- reg: physical base address of the controller and length of memory mapped
region.
- #clock-cells: should be 1.
Each clock is assigned an identifier and client nodes can use this identifier
to specify the clock which they consume. Some of the clocks are available only
on a particular S3C64xx SoC and this is specified where applicable.
All available clocks are defined as preprocessor macros in
dt-bindings/clock/samsung,s3c64xx-clock.h header and can be used in device
tree sources.
External clocks:
There are several clocks that are generated outside the SoC. It is expected
that they are defined using standard clock bindings with following
clock-output-names:
- "fin_pll" - PLL input clock (xtal/extclk) - required,
- "xusbxti" - USB xtal - required,
- "iiscdclk0" - I2S0 codec clock - optional,
- "iiscdclk1" - I2S1 codec clock - optional,
- "iiscdclk2" - I2S2 codec clock - optional,
- "pcmcdclk0" - PCM0 codec clock - optional,
- "pcmcdclk1" - PCM1 codec clock - optional, only S3C6410.
Example: Clock controller node:
clock: clock-controller@7e00f000 {
compatible = "samsung,s3c6410-clock";
reg = <0x7e00f000 0x1000>;
#clock-cells = <1>;
};
Example: Required external clocks:
fin_pll: clock-fin-pll {
compatible = "fixed-clock";
clock-output-names = "fin_pll";
clock-frequency = <12000000>;
#clock-cells = <0>;
};
xusbxti: clock-xusbxti {
compatible = "fixed-clock";
clock-output-names = "xusbxti";
clock-frequency = <48000000>;
#clock-cells = <0>;
};
Example: UART controller node that consumes the clock generated by the clock
controller (refer to the standard clock bindings for information about
"clocks" and "clock-names" properties):
uart0: serial@7f005000 {
compatible = "samsung,s3c6400-uart";
reg = <0x7f005000 0x100>;
interrupt-parent = <&vic1>;
interrupts = <5>;
clock-names = "uart", "clk_uart_baud2",
"clk_uart_baud3";
clocks = <&clock PCLK_UART0>, <&clocks PCLK_UART0>,
<&clock SCLK_UART>;
status = "disabled";
};
drivers/clk/clk-mux.c
View file @
5cfe9614
...
@@ -107,6 +107,11 @@ const struct clk_ops clk_mux_ops = {
...
@@ -107,6 +107,11 @@ const struct clk_ops clk_mux_ops = {
};
};
EXPORT_SYMBOL_GPL
(
clk_mux_ops
);
EXPORT_SYMBOL_GPL
(
clk_mux_ops
);
const
struct
clk_ops
clk_mux_ro_ops
=
{
.
get_parent
=
clk_mux_get_parent
,
};
EXPORT_SYMBOL_GPL
(
clk_mux_ro_ops
);
struct
clk
*
clk_register_mux_table
(
struct
device
*
dev
,
const
char
*
name
,
struct
clk
*
clk_register_mux_table
(
struct
device
*
dev
,
const
char
*
name
,
const
char
**
parent_names
,
u8
num_parents
,
unsigned
long
flags
,
const
char
**
parent_names
,
u8
num_parents
,
unsigned
long
flags
,
void
__iomem
*
reg
,
u8
shift
,
u32
mask
,
void
__iomem
*
reg
,
u8
shift
,
u32
mask
,
...
@@ -133,7 +138,10 @@ struct clk *clk_register_mux_table(struct device *dev, const char *name,
...
@@ -133,7 +138,10 @@ struct clk *clk_register_mux_table(struct device *dev, const char *name,
}
}
init
.
name
=
name
;
init
.
name
=
name
;
init
.
ops
=
&
clk_mux_ops
;
if
(
clk_mux_flags
&
CLK_MUX_READ_ONLY
)
init
.
ops
=
&
clk_mux_ro_ops
;
else
init
.
ops
=
&
clk_mux_ops
;
init
.
flags
=
flags
|
CLK_IS_BASIC
;
init
.
flags
=
flags
|
CLK_IS_BASIC
;
init
.
parent_names
=
parent_names
;
init
.
parent_names
=
parent_names
;
init
.
num_parents
=
num_parents
;
init
.
num_parents
=
num_parents
;
...
...
drivers/clk/samsung/Makefile
View file @
5cfe9614
...
@@ -8,3 +8,6 @@ obj-$(CONFIG_SOC_EXYNOS5250) += clk-exynos5250.o
...
@@ -8,3 +8,6 @@ obj-$(CONFIG_SOC_EXYNOS5250) += clk-exynos5250.o
obj-$(CONFIG_SOC_EXYNOS5420)
+=
clk-exynos5420.o
obj-$(CONFIG_SOC_EXYNOS5420)
+=
clk-exynos5420.o
obj-$(CONFIG_SOC_EXYNOS5440)
+=
clk-exynos5440.o
obj-$(CONFIG_SOC_EXYNOS5440)
+=
clk-exynos5440.o
obj-$(CONFIG_ARCH_EXYNOS)
+=
clk-exynos-audss.o
obj-$(CONFIG_ARCH_EXYNOS)
+=
clk-exynos-audss.o
ifdef
CONFIG_COMMON_CLK
obj-$(CONFIG_ARCH_S3C64XX)
+=
clk-s3c64xx.o
endif
drivers/clk/samsung/clk-pll.c
View file @
5cfe9614
...
@@ -437,6 +437,166 @@ struct clk * __init samsung_clk_register_pll46xx(const char *name,
...
@@ -437,6 +437,166 @@ struct clk * __init samsung_clk_register_pll46xx(const char *name,
return
clk
;
return
clk
;
}
}
/*
* PLL6552 Clock Type
*/
#define PLL6552_LOCK_REG 0x00
#define PLL6552_CON_REG 0x0c
#define PLL6552_MDIV_MASK 0x3ff
#define PLL6552_PDIV_MASK 0x3f
#define PLL6552_SDIV_MASK 0x7
#define PLL6552_MDIV_SHIFT 16
#define PLL6552_PDIV_SHIFT 8
#define PLL6552_SDIV_SHIFT 0
struct
samsung_clk_pll6552
{
struct
clk_hw
hw
;
void
__iomem
*
reg_base
;
};
#define to_clk_pll6552(_hw) container_of(_hw, struct samsung_clk_pll6552, hw)
static
unsigned
long
samsung_pll6552_recalc_rate
(
struct
clk_hw
*
hw
,
unsigned
long
parent_rate
)
{
struct
samsung_clk_pll6552
*
pll
=
to_clk_pll6552
(
hw
);
u32
mdiv
,
pdiv
,
sdiv
,
pll_con
;
u64
fvco
=
parent_rate
;
pll_con
=
__raw_readl
(
pll
->
reg_base
+
PLL6552_CON_REG
);
mdiv
=
(
pll_con
>>
PLL6552_MDIV_SHIFT
)
&
PLL6552_MDIV_MASK
;
pdiv
=
(
pll_con
>>
PLL6552_PDIV_SHIFT
)
&
PLL6552_PDIV_MASK
;
sdiv
=
(
pll_con
>>
PLL6552_SDIV_SHIFT
)
&
PLL6552_SDIV_MASK
;
fvco
*=
mdiv
;
do_div
(
fvco
,
(
pdiv
<<
sdiv
));
return
(
unsigned
long
)
fvco
;
}
static
const
struct
clk_ops
samsung_pll6552_clk_ops
=
{
.
recalc_rate
=
samsung_pll6552_recalc_rate
,
};
struct
clk
*
__init
samsung_clk_register_pll6552
(
const
char
*
name
,
const
char
*
pname
,
void
__iomem
*
base
)
{
struct
samsung_clk_pll6552
*
pll
;
struct
clk
*
clk
;
struct
clk_init_data
init
;
pll
=
kzalloc
(
sizeof
(
*
pll
),
GFP_KERNEL
);
if
(
!
pll
)
{
pr_err
(
"%s: could not allocate pll clk %s
\n
"
,
__func__
,
name
);
return
NULL
;
}
init
.
name
=
name
;
init
.
ops
=
&
samsung_pll6552_clk_ops
;
init
.
parent_names
=
&
pname
;
init
.
num_parents
=
1
;
pll
->
hw
.
init
=
&
init
;
pll
->
reg_base
=
base
;
clk
=
clk_register
(
NULL
,
&
pll
->
hw
);
if
(
IS_ERR
(
clk
))
{
pr_err
(
"%s: failed to register pll clock %s
\n
"
,
__func__
,
name
);
kfree
(
pll
);
}
if
(
clk_register_clkdev
(
clk
,
name
,
NULL
))
pr_err
(
"%s: failed to register lookup for %s"
,
__func__
,
name
);
return
clk
;
}
/*
* PLL6553 Clock Type
*/
#define PLL6553_LOCK_REG 0x00
#define PLL6553_CON0_REG 0x0c
#define PLL6553_CON1_REG 0x10
#define PLL6553_MDIV_MASK 0xff
#define PLL6553_PDIV_MASK 0x3f
#define PLL6553_SDIV_MASK 0x7
#define PLL6553_KDIV_MASK 0xffff
#define PLL6553_MDIV_SHIFT 16
#define PLL6553_PDIV_SHIFT 8
#define PLL6553_SDIV_SHIFT 0
#define PLL6553_KDIV_SHIFT 0
struct
samsung_clk_pll6553
{
struct
clk_hw
hw
;
void
__iomem
*
reg_base
;
};
#define to_clk_pll6553(_hw) container_of(_hw, struct samsung_clk_pll6553, hw)
static
unsigned
long
samsung_pll6553_recalc_rate
(
struct
clk_hw
*
hw
,
unsigned
long
parent_rate
)
{
struct
samsung_clk_pll6553
*
pll
=
to_clk_pll6553
(
hw
);
u32
mdiv
,
pdiv
,
sdiv
,
kdiv
,
pll_con0
,
pll_con1
;
u64
fvco
=
parent_rate
;
pll_con0
=
__raw_readl
(
pll
->
reg_base
+
PLL6553_CON0_REG
);
pll_con1
=
__raw_readl
(
pll
->
reg_base
+
PLL6553_CON1_REG
);
mdiv
=
(
pll_con0
>>
PLL6553_MDIV_SHIFT
)
&
PLL6553_MDIV_MASK
;
pdiv
=
(
pll_con0
>>
PLL6553_PDIV_SHIFT
)
&
PLL6553_PDIV_MASK
;
sdiv
=
(
pll_con0
>>
PLL6553_SDIV_SHIFT
)
&
PLL6553_SDIV_MASK
;
kdiv
=
(
pll_con1
>>
PLL6553_KDIV_SHIFT
)
&
PLL6553_KDIV_MASK
;
fvco
*=
(
mdiv
<<
16
)
+
kdiv
;
do_div
(
fvco
,
(
pdiv
<<
sdiv
));
fvco
>>=
16
;
return
(
unsigned
long
)
fvco
;
}
static
const
struct
clk_ops
samsung_pll6553_clk_ops
=
{
.
recalc_rate
=
samsung_pll6553_recalc_rate
,
};
struct
clk
*
__init
samsung_clk_register_pll6553
(
const
char
*
name
,
const
char
*
pname
,
void
__iomem
*
base
)
{
struct
samsung_clk_pll6553
*
pll
;
struct
clk
*
clk
;
struct
clk_init_data
init
;
pll
=
kzalloc
(
sizeof
(
*
pll
),
GFP_KERNEL
);
if
(
!
pll
)
{
pr_err
(
"%s: could not allocate pll clk %s
\n
"
,
__func__
,
name
);
return
NULL
;
}
init
.
name
=
name
;
init
.
ops
=
&
samsung_pll6553_clk_ops
;
init
.
parent_names
=
&
pname
;
init
.
num_parents
=
1
;
pll
->
hw
.
init
=
&
init
;
pll
->
reg_base
=
base
;
clk
=
clk_register
(
NULL
,
&
pll
->
hw
);
if
(
IS_ERR
(
clk
))
{
pr_err
(
"%s: failed to register pll clock %s
\n
"
,
__func__
,
name
);
kfree
(
pll
);
}
if
(
clk_register_clkdev
(
clk
,
name
,
NULL
))
pr_err
(
"%s: failed to register lookup for %s"
,
__func__
,
name
);
return
clk
;
}
/*
/*
* PLL2550x Clock Type
* PLL2550x Clock Type
*/
*/
...
...
drivers/clk/samsung/clk-pll.h
View file @
5cfe9614
...
@@ -64,6 +64,10 @@ extern struct clk * __init samsung_clk_register_pll45xx(const char *name,
...
@@ -64,6 +64,10 @@ extern struct clk * __init samsung_clk_register_pll45xx(const char *name,
extern
struct
clk
*
__init
samsung_clk_register_pll46xx
(
const
char
*
name
,
extern
struct
clk
*
__init
samsung_clk_register_pll46xx
(
const
char
*
name
,
const
char
*
pname
,
const
void
__iomem
*
con_reg
,
const
char
*
pname
,
const
void
__iomem
*
con_reg
,
enum
pll46xx_type
type
);
enum
pll46xx_type
type
);
extern
struct
clk
*
samsung_clk_register_pll6552
(
const
char
*
name
,
const
char
*
pname
,
void
__iomem
*
base
);
extern
struct
clk
*
samsung_clk_register_pll6553
(
const
char
*
name
,
const
char
*
pname
,
void
__iomem
*
base
);
extern
struct
clk
*
__init
samsung_clk_register_pll2550x
(
const
char
*
name
,
extern
struct
clk
*
__init
samsung_clk_register_pll2550x
(
const
char
*
name
,
const
char
*
pname
,
const
void
__iomem
*
reg_base
,
const
char
*
pname
,
const
void
__iomem
*
reg_base
,
const
unsigned
long
offset
);
const
unsigned
long
offset
);
...
...
drivers/clk/samsung/clk-s3c64xx.c
0 → 100644
View file @
5cfe9614
This diff is collapsed.
Click to expand it.
include/dt-bindings/clock/samsung,s3c64xx-clock.h
0 → 100644
View file @
5cfe9614
/*
* Copyright (c) 2013 Tomasz Figa <tomasz.figa at gmail.com>
*
* 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.
*
* Device Tree binding constants for Samsung S3C64xx clock controller.
*/
#ifndef _DT_BINDINGS_CLOCK_SAMSUNG_S3C64XX_CLOCK_H
#define _DT_BINDINGS_CLOCK_SAMSUNG_S3C64XX_CLOCK_H
/*
* Let each exported clock get a unique index, which is used on DT-enabled
* platforms to lookup the clock from a clock specifier. These indices are
* therefore considered an ABI and so must not be changed. This implies
* that new clocks should be added either in free spaces between clock groups
* or at the end.
*/
/* Core clocks. */
#define CLK27M 1
#define CLK48M 2
#define FOUT_APLL 3
#define FOUT_MPLL 4
#define FOUT_EPLL 5
#define ARMCLK 6
#define HCLKX2 7
#define HCLK 8
#define PCLK 9
/* HCLK bus clocks. */
#define HCLK_3DSE 16
#define HCLK_UHOST 17
#define HCLK_SECUR 18
#define HCLK_SDMA1 19
#define HCLK_SDMA0 20
#define HCLK_IROM 21
#define HCLK_DDR1 22
#define HCLK_MEM1 23
#define HCLK_MEM0 24
#define HCLK_USB 25
#define HCLK_HSMMC2 26
#define HCLK_HSMMC1 27
#define HCLK_HSMMC0 28
#define HCLK_MDP 29
#define HCLK_DHOST 30
#define HCLK_IHOST 31
#define HCLK_DMA1 32
#define HCLK_DMA0 33
#define HCLK_JPEG 34
#define HCLK_CAMIF 35
#define HCLK_SCALER 36
#define HCLK_2D 37
#define HCLK_TV 38
#define HCLK_POST0 39
#define HCLK_ROT 40
#define HCLK_LCD 41
#define HCLK_TZIC 42
#define HCLK_INTC 43
#define HCLK_MFC 44
#define HCLK_DDR0 45
/* PCLK bus clocks. */
#define PCLK_IIC1 48
#define PCLK_IIS2 49
#define PCLK_SKEY 50
#define PCLK_CHIPID 51
#define PCLK_SPI1 52
#define PCLK_SPI0 53
#define PCLK_HSIRX 54
#define PCLK_HSITX 55
#define PCLK_GPIO 56
#define PCLK_IIC0 57
#define PCLK_IIS1 58
#define PCLK_IIS0 59
#define PCLK_AC97 60
#define PCLK_TZPC 61
#define PCLK_TSADC 62
#define PCLK_KEYPAD 63
#define PCLK_IRDA 64
#define PCLK_PCM1 65
#define PCLK_PCM0 66
#define PCLK_PWM 67
#define PCLK_RTC 68
#define PCLK_WDT 69
#define PCLK_UART3 70
#define PCLK_UART2 71
#define PCLK_UART1 72
#define PCLK_UART0 73
#define PCLK_MFC 74
/* Special clocks. */
#define SCLK_UHOST 80
#define SCLK_MMC2_48 81
#define SCLK_MMC1_48 82
#define SCLK_MMC0_48 83
#define SCLK_MMC2 84
#define SCLK_MMC1 85
#define SCLK_MMC0 86
#define SCLK_SPI1_48 87
#define SCLK_SPI0_48 88
#define SCLK_SPI1 89
#define SCLK_SPI0 90
#define SCLK_DAC27 91
#define SCLK_TV27 92
#define SCLK_SCALER27 93
#define SCLK_SCALER 94
#define SCLK_LCD27 95
#define SCLK_LCD 96
#define SCLK_FIMC 97
#define SCLK_POST0_27 98
#define SCLK_AUDIO2 99
#define SCLK_POST0 100
#define SCLK_AUDIO1 101
#define SCLK_AUDIO0 102
#define SCLK_SECUR 103
#define SCLK_IRDA 104
#define SCLK_UART 105
#define SCLK_MFC 106
#define SCLK_CAM 107
#define SCLK_JPEG 108
#define SCLK_ONENAND 109
/* MEM0 bus clocks - S3C6410-specific. */
#define MEM0_CFCON 112
#define MEM0_ONENAND1 113
#define MEM0_ONENAND0 114
#define MEM0_NFCON 115
#define MEM0_SROM 116
/* Muxes. */
#define MOUT_APLL 128
#define MOUT_MPLL 129
#define MOUT_EPLL 130
#define MOUT_MFC 131
#define MOUT_AUDIO0 132
#define MOUT_AUDIO1 133
#define MOUT_UART 134
#define MOUT_SPI0 135
#define MOUT_SPI1 136
#define MOUT_MMC0 137
#define MOUT_MMC1 138
#define MOUT_MMC2 139
#define MOUT_UHOST 140
#define MOUT_IRDA 141
#define MOUT_LCD 142
#define MOUT_SCALER 143
#define MOUT_DAC27 144
#define MOUT_TV27 145
#define MOUT_AUDIO2 146
/* Dividers. */
#define DOUT_MPLL 160
#define DOUT_SECUR 161
#define DOUT_CAM 162
#define DOUT_JPEG 163
#define DOUT_MFC 164
#define DOUT_MMC0 165
#define DOUT_MMC1 166
#define DOUT_MMC2 167
#define DOUT_LCD 168
#define DOUT_SCALER 169
#define DOUT_UHOST 170
#define DOUT_SPI0 171
#define DOUT_SPI1 172
#define DOUT_AUDIO0 173
#define DOUT_AUDIO1 174
#define DOUT_UART 175
#define DOUT_IRDA 176
#define DOUT_FIMC 177
#define DOUT_AUDIO2 178
/* Total number of clocks. */
#define NR_CLKS (DOUT_AUDIO2 + 1)
#endif
/* _DT_BINDINGS_CLOCK_SAMSUNG_S3C64XX_CLOCK_H */
include/linux/clk-provider.h
View file @
5cfe9614
...
@@ -327,8 +327,10 @@ struct clk_mux {
...
@@ -327,8 +327,10 @@ struct clk_mux {
#define CLK_MUX_INDEX_ONE BIT(0)
#define CLK_MUX_INDEX_ONE BIT(0)
#define CLK_MUX_INDEX_BIT BIT(1)
#define CLK_MUX_INDEX_BIT BIT(1)
#define CLK_MUX_HIWORD_MASK BIT(2)
#define CLK_MUX_HIWORD_MASK BIT(2)
#define CLK_MUX_READ_ONLY BIT(3)
/* mux setting cannot be changed */
extern
const
struct
clk_ops
clk_mux_ops
;
extern
const
struct
clk_ops
clk_mux_ops
;
extern
const
struct
clk_ops
clk_mux_ro_ops
;
struct
clk
*
clk_register_mux
(
struct
device
*
dev
,
const
char
*
name
,
struct
clk
*
clk_register_mux
(
struct
device
*
dev
,
const
char
*
name
,
const
char
**
parent_names
,
u8
num_parents
,
unsigned
long
flags
,
const
char
**
parent_names
,
u8
num_parents
,
unsigned
long
flags
,
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment