123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925 |
- From 9d38f8ad8156a83b2f9e3c68ddf87541a8511395 Mon Sep 17 00:00:00 2001
- From: Martin Sperl <kernel@martin.sperl.org>
- Date: Mon, 29 Feb 2016 12:51:42 +0000
- Subject: [PATCH] clk: bcm2835: reorganize bcm2835_clock_array assignment
- Reorganize bcm2835_clock_array so that there is no more
- need for separate bcm2835_*_data structures to be defined.
- Instead the required structures are generated inline via
- helper macros.
- To allow this to also work for pll alone it was required that
- the parent_pll was changed from a pointer to bcm2835_pll_data
- to the name of the pll instead.
- Signed-off-by: Martin Sperl <kernel@martin.sperl.org>
- Signed-off-by: Eric Anholt <eric@anholt.net>
- Reviewed-by: Eric Anholt <eric@anholt.net>
- (cherry picked from commit 3b15afefbef9b5952e3d68ad73d93f981b9faca8)
- ---
- drivers/clk/bcm/clk-bcm2835.c | 852 +++++++++++++++++++-----------------------
- 1 file changed, 393 insertions(+), 459 deletions(-)
- --- a/drivers/clk/bcm/clk-bcm2835.c
- +++ b/drivers/clk/bcm/clk-bcm2835.c
- @@ -418,115 +418,10 @@ static const struct bcm2835_pll_ana_bits
- .fb_prediv_mask = BIT(11),
- };
-
- -/*
- - * PLLA is the auxiliary PLL, used to drive the CCP2 (Compact Camera
- - * Port 2) transmitter clock.
- - *
- - * It is in the PX LDO power domain, which is on when the AUDIO domain
- - * is on.
- - */
- -static const struct bcm2835_pll_data bcm2835_plla_data = {
- - .name = "plla",
- - .cm_ctrl_reg = CM_PLLA,
- - .a2w_ctrl_reg = A2W_PLLA_CTRL,
- - .frac_reg = A2W_PLLA_FRAC,
- - .ana_reg_base = A2W_PLLA_ANA0,
- - .reference_enable_mask = A2W_XOSC_CTRL_PLLA_ENABLE,
- - .lock_mask = CM_LOCK_FLOCKA,
- -
- - .ana = &bcm2835_ana_default,
- -
- - .min_rate = 600000000u,
- - .max_rate = 2400000000u,
- - .max_fb_rate = BCM2835_MAX_FB_RATE,
- -};
- -
- -/* PLLB is used for the ARM's clock. */
- -static const struct bcm2835_pll_data bcm2835_pllb_data = {
- - .name = "pllb",
- - .cm_ctrl_reg = CM_PLLB,
- - .a2w_ctrl_reg = A2W_PLLB_CTRL,
- - .frac_reg = A2W_PLLB_FRAC,
- - .ana_reg_base = A2W_PLLB_ANA0,
- - .reference_enable_mask = A2W_XOSC_CTRL_PLLB_ENABLE,
- - .lock_mask = CM_LOCK_FLOCKB,
- -
- - .ana = &bcm2835_ana_default,
- -
- - .min_rate = 600000000u,
- - .max_rate = 3000000000u,
- - .max_fb_rate = BCM2835_MAX_FB_RATE,
- -};
- -
- -/*
- - * PLLC is the core PLL, used to drive the core VPU clock.
- - *
- - * It is in the PX LDO power domain, which is on when the AUDIO domain
- - * is on.
- -*/
- -static const struct bcm2835_pll_data bcm2835_pllc_data = {
- - .name = "pllc",
- - .cm_ctrl_reg = CM_PLLC,
- - .a2w_ctrl_reg = A2W_PLLC_CTRL,
- - .frac_reg = A2W_PLLC_FRAC,
- - .ana_reg_base = A2W_PLLC_ANA0,
- - .reference_enable_mask = A2W_XOSC_CTRL_PLLC_ENABLE,
- - .lock_mask = CM_LOCK_FLOCKC,
- -
- - .ana = &bcm2835_ana_default,
- -
- - .min_rate = 600000000u,
- - .max_rate = 3000000000u,
- - .max_fb_rate = BCM2835_MAX_FB_RATE,
- -};
- -
- -/*
- - * PLLD is the display PLL, used to drive DSI display panels.
- - *
- - * It is in the PX LDO power domain, which is on when the AUDIO domain
- - * is on.
- - */
- -static const struct bcm2835_pll_data bcm2835_plld_data = {
- - .name = "plld",
- - .cm_ctrl_reg = CM_PLLD,
- - .a2w_ctrl_reg = A2W_PLLD_CTRL,
- - .frac_reg = A2W_PLLD_FRAC,
- - .ana_reg_base = A2W_PLLD_ANA0,
- - .reference_enable_mask = A2W_XOSC_CTRL_DDR_ENABLE,
- - .lock_mask = CM_LOCK_FLOCKD,
- -
- - .ana = &bcm2835_ana_default,
- -
- - .min_rate = 600000000u,
- - .max_rate = 2400000000u,
- - .max_fb_rate = BCM2835_MAX_FB_RATE,
- -};
- -
- -/*
- - * PLLH is used to supply the pixel clock or the AUX clock for the TV
- - * encoder.
- - *
- - * It is in the HDMI power domain.
- - */
- -static const struct bcm2835_pll_data bcm2835_pllh_data = {
- - "pllh",
- - .cm_ctrl_reg = CM_PLLH,
- - .a2w_ctrl_reg = A2W_PLLH_CTRL,
- - .frac_reg = A2W_PLLH_FRAC,
- - .ana_reg_base = A2W_PLLH_ANA0,
- - .reference_enable_mask = A2W_XOSC_CTRL_PLLC_ENABLE,
- - .lock_mask = CM_LOCK_FLOCKH,
- -
- - .ana = &bcm2835_ana_pllh,
- -
- - .min_rate = 600000000u,
- - .max_rate = 3000000000u,
- - .max_fb_rate = BCM2835_MAX_FB_RATE,
- -};
- -
- struct bcm2835_pll_divider_data {
- const char *name;
- - const struct bcm2835_pll_data *source_pll;
- + const char *source_pll;
- +
- u32 cm_reg;
- u32 a2w_reg;
-
- @@ -535,124 +430,6 @@ struct bcm2835_pll_divider_data {
- u32 fixed_divider;
- };
-
- -static const struct bcm2835_pll_divider_data bcm2835_plla_core_data = {
- - .name = "plla_core",
- - .source_pll = &bcm2835_plla_data,
- - .cm_reg = CM_PLLA,
- - .a2w_reg = A2W_PLLA_CORE,
- - .load_mask = CM_PLLA_LOADCORE,
- - .hold_mask = CM_PLLA_HOLDCORE,
- - .fixed_divider = 1,
- -};
- -
- -static const struct bcm2835_pll_divider_data bcm2835_plla_per_data = {
- - .name = "plla_per",
- - .source_pll = &bcm2835_plla_data,
- - .cm_reg = CM_PLLA,
- - .a2w_reg = A2W_PLLA_PER,
- - .load_mask = CM_PLLA_LOADPER,
- - .hold_mask = CM_PLLA_HOLDPER,
- - .fixed_divider = 1,
- -};
- -
- -static const struct bcm2835_pll_divider_data bcm2835_pllb_arm_data = {
- - .name = "pllb_arm",
- - .source_pll = &bcm2835_pllb_data,
- - .cm_reg = CM_PLLB,
- - .a2w_reg = A2W_PLLB_ARM,
- - .load_mask = CM_PLLB_LOADARM,
- - .hold_mask = CM_PLLB_HOLDARM,
- - .fixed_divider = 1,
- -};
- -
- -static const struct bcm2835_pll_divider_data bcm2835_pllc_core0_data = {
- - .name = "pllc_core0",
- - .source_pll = &bcm2835_pllc_data,
- - .cm_reg = CM_PLLC,
- - .a2w_reg = A2W_PLLC_CORE0,
- - .load_mask = CM_PLLC_LOADCORE0,
- - .hold_mask = CM_PLLC_HOLDCORE0,
- - .fixed_divider = 1,
- -};
- -
- -static const struct bcm2835_pll_divider_data bcm2835_pllc_core1_data = {
- - .name = "pllc_core1", .source_pll = &bcm2835_pllc_data,
- - .cm_reg = CM_PLLC, A2W_PLLC_CORE1,
- - .load_mask = CM_PLLC_LOADCORE1,
- - .hold_mask = CM_PLLC_HOLDCORE1,
- - .fixed_divider = 1,
- -};
- -
- -static const struct bcm2835_pll_divider_data bcm2835_pllc_core2_data = {
- - .name = "pllc_core2",
- - .source_pll = &bcm2835_pllc_data,
- - .cm_reg = CM_PLLC,
- - .a2w_reg = A2W_PLLC_CORE2,
- - .load_mask = CM_PLLC_LOADCORE2,
- - .hold_mask = CM_PLLC_HOLDCORE2,
- - .fixed_divider = 1,
- -};
- -
- -static const struct bcm2835_pll_divider_data bcm2835_pllc_per_data = {
- - .name = "pllc_per",
- - .source_pll = &bcm2835_pllc_data,
- - .cm_reg = CM_PLLC,
- - .a2w_reg = A2W_PLLC_PER,
- - .load_mask = CM_PLLC_LOADPER,
- - .hold_mask = CM_PLLC_HOLDPER,
- - .fixed_divider = 1,
- -};
- -
- -static const struct bcm2835_pll_divider_data bcm2835_plld_core_data = {
- - .name = "plld_core",
- - .source_pll = &bcm2835_plld_data,
- - .cm_reg = CM_PLLD,
- - .a2w_reg = A2W_PLLD_CORE,
- - .load_mask = CM_PLLD_LOADCORE,
- - .hold_mask = CM_PLLD_HOLDCORE,
- - .fixed_divider = 1,
- -};
- -
- -static const struct bcm2835_pll_divider_data bcm2835_plld_per_data = {
- - .name = "plld_per",
- - .source_pll = &bcm2835_plld_data,
- - .cm_reg = CM_PLLD,
- - .a2w_reg = A2W_PLLD_PER,
- - .load_mask = CM_PLLD_LOADPER,
- - .hold_mask = CM_PLLD_HOLDPER,
- - .fixed_divider = 1,
- -};
- -
- -static const struct bcm2835_pll_divider_data bcm2835_pllh_rcal_data = {
- - .name = "pllh_rcal",
- - .source_pll = &bcm2835_pllh_data,
- - .cm_reg = CM_PLLH,
- - .a2w_reg = A2W_PLLH_RCAL,
- - .load_mask = CM_PLLH_LOADRCAL,
- - .hold_mask = 0,
- - .fixed_divider = 10,
- -};
- -
- -static const struct bcm2835_pll_divider_data bcm2835_pllh_aux_data = {
- - .name = "pllh_aux",
- - .source_pll = &bcm2835_pllh_data,
- - .cm_reg = CM_PLLH,
- - .a2w_reg = A2W_PLLH_AUX,
- - .load_mask = CM_PLLH_LOADAUX,
- - .hold_mask = 0,
- - .fixed_divider = 10,
- -};
- -
- -static const struct bcm2835_pll_divider_data bcm2835_pllh_pix_data = {
- - .name = "pllh_pix",
- - .source_pll = &bcm2835_pllh_data,
- - .cm_reg = CM_PLLH,
- - .a2w_reg = A2W_PLLH_PIX,
- - .load_mask = CM_PLLH_LOADPIX,
- - .hold_mask = 0,
- - .fixed_divider = 10,
- -};
- -
- struct bcm2835_clock_data {
- const char *name;
-
- @@ -671,188 +448,6 @@ struct bcm2835_clock_data {
- bool is_mash_clock;
- };
-
- -static const char *const bcm2835_clock_per_parents[] = {
- - "gnd",
- - "xosc",
- - "testdebug0",
- - "testdebug1",
- - "plla_per",
- - "pllc_per",
- - "plld_per",
- - "pllh_aux",
- -};
- -
- -static const char *const bcm2835_clock_vpu_parents[] = {
- - "gnd",
- - "xosc",
- - "testdebug0",
- - "testdebug1",
- - "plla_core",
- - "pllc_core0",
- - "plld_core",
- - "pllh_aux",
- - "pllc_core1",
- - "pllc_core2",
- -};
- -
- -static const char *const bcm2835_clock_osc_parents[] = {
- - "gnd",
- - "xosc",
- - "testdebug0",
- - "testdebug1"
- -};
- -
- -/*
- - * Used for a 1Mhz clock for the system clocksource, and also used by
- - * the watchdog timer and the camera pulse generator.
- - */
- -static const struct bcm2835_clock_data bcm2835_clock_timer_data = {
- - .name = "timer",
- - .num_mux_parents = ARRAY_SIZE(bcm2835_clock_osc_parents),
- - .parents = bcm2835_clock_osc_parents,
- - .ctl_reg = CM_TIMERCTL,
- - .div_reg = CM_TIMERDIV,
- - .int_bits = 6,
- - .frac_bits = 12,
- -};
- -
- -/* One Time Programmable Memory clock. Maximum 10Mhz. */
- -static const struct bcm2835_clock_data bcm2835_clock_otp_data = {
- - .name = "otp",
- - .num_mux_parents = ARRAY_SIZE(bcm2835_clock_osc_parents),
- - .parents = bcm2835_clock_osc_parents,
- - .ctl_reg = CM_OTPCTL,
- - .div_reg = CM_OTPDIV,
- - .int_bits = 4,
- - .frac_bits = 0,
- -};
- -
- -/*
- - * VPU clock. This doesn't have an enable bit, since it drives the
- - * bus for everything else, and is special so it doesn't need to be
- - * gated for rate changes. It is also known as "clk_audio" in various
- - * hardware documentation.
- - */
- -static const struct bcm2835_clock_data bcm2835_clock_vpu_data = {
- - .name = "vpu",
- - .num_mux_parents = ARRAY_SIZE(bcm2835_clock_vpu_parents),
- - .parents = bcm2835_clock_vpu_parents,
- - .ctl_reg = CM_VPUCTL,
- - .div_reg = CM_VPUDIV,
- - .int_bits = 12,
- - .frac_bits = 8,
- - .is_vpu_clock = true,
- -};
- -
- -static const struct bcm2835_clock_data bcm2835_clock_v3d_data = {
- - .name = "v3d",
- - .num_mux_parents = ARRAY_SIZE(bcm2835_clock_vpu_parents),
- - .parents = bcm2835_clock_vpu_parents,
- - .ctl_reg = CM_V3DCTL,
- - .div_reg = CM_V3DDIV,
- - .int_bits = 4,
- - .frac_bits = 8,
- -};
- -
- -static const struct bcm2835_clock_data bcm2835_clock_isp_data = {
- - .name = "isp",
- - .num_mux_parents = ARRAY_SIZE(bcm2835_clock_vpu_parents),
- - .parents = bcm2835_clock_vpu_parents,
- - .ctl_reg = CM_ISPCTL,
- - .div_reg = CM_ISPDIV,
- - .int_bits = 4,
- - .frac_bits = 8,
- -};
- -
- -static const struct bcm2835_clock_data bcm2835_clock_h264_data = {
- - .name = "h264",
- - .num_mux_parents = ARRAY_SIZE(bcm2835_clock_vpu_parents),
- - .parents = bcm2835_clock_vpu_parents,
- - .ctl_reg = CM_H264CTL,
- - .div_reg = CM_H264DIV,
- - .int_bits = 4,
- - .frac_bits = 8,
- -};
- -
- -/* TV encoder clock. Only operating frequency is 108Mhz. */
- -static const struct bcm2835_clock_data bcm2835_clock_vec_data = {
- - .name = "vec",
- - .num_mux_parents = ARRAY_SIZE(bcm2835_clock_per_parents),
- - .parents = bcm2835_clock_per_parents,
- - .ctl_reg = CM_VECCTL,
- - .div_reg = CM_VECDIV,
- - .int_bits = 4,
- - .frac_bits = 0,
- -};
- -
- -static const struct bcm2835_clock_data bcm2835_clock_uart_data = {
- - .name = "uart",
- - .num_mux_parents = ARRAY_SIZE(bcm2835_clock_per_parents),
- - .parents = bcm2835_clock_per_parents,
- - .ctl_reg = CM_UARTCTL,
- - .div_reg = CM_UARTDIV,
- - .int_bits = 10,
- - .frac_bits = 12,
- -};
- -
- -/* HDMI state machine */
- -static const struct bcm2835_clock_data bcm2835_clock_hsm_data = {
- - .name = "hsm",
- - .num_mux_parents = ARRAY_SIZE(bcm2835_clock_per_parents),
- - .parents = bcm2835_clock_per_parents,
- - .ctl_reg = CM_HSMCTL,
- - .div_reg = CM_HSMDIV,
- - .int_bits = 4,
- - .frac_bits = 8,
- -};
- -
- -/*
- - * Secondary SDRAM clock. Used for low-voltage modes when the PLL in
- - * the SDRAM controller can't be used.
- - */
- -static const struct bcm2835_clock_data bcm2835_clock_sdram_data = {
- - .name = "sdram",
- - .num_mux_parents = ARRAY_SIZE(bcm2835_clock_vpu_parents),
- - .parents = bcm2835_clock_vpu_parents,
- - .ctl_reg = CM_SDCCTL,
- - .div_reg = CM_SDCDIV,
- - .int_bits = 6,
- - .frac_bits = 0,
- -};
- -
- -/* Clock for the temperature sensor. Generally run at 2Mhz, max 5Mhz. */
- -static const struct bcm2835_clock_data bcm2835_clock_tsens_data = {
- - .name = "tsens",
- - .num_mux_parents = ARRAY_SIZE(bcm2835_clock_osc_parents),
- - .parents = bcm2835_clock_osc_parents,
- - .ctl_reg = CM_TSENSCTL,
- - .div_reg = CM_TSENSDIV,
- - .int_bits = 5,
- - .frac_bits = 0,
- -};
- -
- -/* Arasan EMMC clock */
- -static const struct bcm2835_clock_data bcm2835_clock_emmc_data = {
- - .name = "emmc",
- - .num_mux_parents = ARRAY_SIZE(bcm2835_clock_per_parents),
- - .parents = bcm2835_clock_per_parents,
- - .ctl_reg = CM_EMMCCTL,
- - .div_reg = CM_EMMCDIV,
- - .int_bits = 4,
- - .frac_bits = 8,
- -};
- -
- -static const struct bcm2835_clock_data bcm2835_clock_pwm_data = {
- - .name = "pwm",
- - .num_mux_parents = ARRAY_SIZE(bcm2835_clock_per_parents),
- - .parents = bcm2835_clock_per_parents,
- - .ctl_reg = CM_PWMCTL,
- - .div_reg = CM_PWMDIV,
- - .int_bits = 12,
- - .frac_bits = 12,
- - .is_mash_clock = true,
- -};
- -
- struct bcm2835_gate_data {
- const char *name;
- const char *parent;
- @@ -860,18 +455,6 @@ struct bcm2835_gate_data {
- u32 ctl_reg;
- };
-
- -/*
- - * CM_PERIICTL (and CM_PERIACTL, CM_SYSCTL and CM_VPUCTL if
- - * you have the debug bit set in the power manager, which we
- - * don't bother exposing) are individual gates off of the
- - * non-stop vpu clock.
- - */
- -static const struct bcm2835_gate_data bcm2835_clock_peri_image_data = {
- - .name = "peri_image",
- - .parent = "vpu",
- - .ctl_reg = CM_PERIICTL,
- -};
- -
- struct bcm2835_pll {
- struct clk_hw hw;
- struct bcm2835_cprman *cprman;
- @@ -1602,7 +1185,7 @@ bcm2835_register_pll_divider(struct bcm2
-
- memset(&init, 0, sizeof(init));
-
- - init.parent_names = &data->source_pll->name;
- + init.parent_names = &data->source_pll;
- init.num_parents = 1;
- init.name = divider_name;
- init.ops = &bcm2835_pll_divider_clk_ops;
- @@ -1701,50 +1284,401 @@ struct bcm2835_clk_desc {
- const void *data;
- };
-
- -#define _REGISTER(f, d) { .clk_register = (bcm2835_clk_register)f, \
- - .data = d }
- -#define REGISTER_PLL(d) _REGISTER(&bcm2835_register_pll, d)
- -#define REGISTER_PLL_DIV(d) _REGISTER(&bcm2835_register_pll_divider, d)
- -#define REGISTER_CLK(d) _REGISTER(&bcm2835_register_clock, d)
- -#define REGISTER_GATE(d) _REGISTER(&bcm2835_register_gate, d)
- +/* assignment helper macros for different clock types */
- +#define _REGISTER(f, ...) { .clk_register = (bcm2835_clk_register)f, \
- + .data = __VA_ARGS__ }
- +#define REGISTER_PLL(...) _REGISTER(&bcm2835_register_pll, \
- + &(struct bcm2835_pll_data) \
- + {__VA_ARGS__})
- +#define REGISTER_PLL_DIV(...) _REGISTER(&bcm2835_register_pll_divider, \
- + &(struct bcm2835_pll_divider_data) \
- + {__VA_ARGS__})
- +#define REGISTER_CLK(...) _REGISTER(&bcm2835_register_clock, \
- + &(struct bcm2835_clock_data) \
- + {__VA_ARGS__})
- +#define REGISTER_GATE(...) _REGISTER(&bcm2835_register_gate, \
- + &(struct bcm2835_gate_data) \
- + {__VA_ARGS__})
- +
- +/* parent mux arrays plus helper macros */
- +
- +/* main oscillator parent mux */
- +static const char *const bcm2835_clock_osc_parents[] = {
- + "gnd",
- + "xosc",
- + "testdebug0",
- + "testdebug1"
- +};
- +
- +#define REGISTER_OSC_CLK(...) REGISTER_CLK( \
- + .num_mux_parents = ARRAY_SIZE(bcm2835_clock_osc_parents), \
- + .parents = bcm2835_clock_osc_parents, \
- + __VA_ARGS__)
- +
- +/* main peripherial parent mux */
- +static const char *const bcm2835_clock_per_parents[] = {
- + "gnd",
- + "xosc",
- + "testdebug0",
- + "testdebug1",
- + "plla_per",
- + "pllc_per",
- + "plld_per",
- + "pllh_aux",
- +};
- +
- +#define REGISTER_PER_CLK(...) REGISTER_CLK( \
- + .num_mux_parents = ARRAY_SIZE(bcm2835_clock_per_parents), \
- + .parents = bcm2835_clock_per_parents, \
- + __VA_ARGS__)
- +
- +/* main vpu parent mux */
- +static const char *const bcm2835_clock_vpu_parents[] = {
- + "gnd",
- + "xosc",
- + "testdebug0",
- + "testdebug1",
- + "plla_core",
- + "pllc_core0",
- + "plld_core",
- + "pllh_aux",
- + "pllc_core1",
- + "pllc_core2",
- +};
- +
- +#define REGISTER_VPU_CLK(...) REGISTER_CLK( \
- + .num_mux_parents = ARRAY_SIZE(bcm2835_clock_vpu_parents), \
- + .parents = bcm2835_clock_vpu_parents, \
- + __VA_ARGS__)
-
- +/*
- + * the real definition of all the pll, pll_dividers and clocks
- + * these make use of the above REGISTER_* macros
- + */
- static const struct bcm2835_clk_desc clk_desc_array[] = {
- - /* register PLL */
- - [BCM2835_PLLA] = REGISTER_PLL(&bcm2835_plla_data),
- - [BCM2835_PLLB] = REGISTER_PLL(&bcm2835_pllb_data),
- - [BCM2835_PLLC] = REGISTER_PLL(&bcm2835_pllc_data),
- - [BCM2835_PLLD] = REGISTER_PLL(&bcm2835_plld_data),
- - [BCM2835_PLLH] = REGISTER_PLL(&bcm2835_pllh_data),
- - /* the PLL dividers */
- - [BCM2835_PLLA_CORE] = REGISTER_PLL_DIV(&bcm2835_plla_core_data),
- - [BCM2835_PLLA_PER] = REGISTER_PLL_DIV(&bcm2835_plla_per_data),
- - [BCM2835_PLLC_CORE0] = REGISTER_PLL_DIV(&bcm2835_pllc_core0_data),
- - [BCM2835_PLLC_CORE1] = REGISTER_PLL_DIV(&bcm2835_pllc_core1_data),
- - [BCM2835_PLLC_CORE2] = REGISTER_PLL_DIV(&bcm2835_pllc_core2_data),
- - [BCM2835_PLLC_PER] = REGISTER_PLL_DIV(&bcm2835_pllc_per_data),
- - [BCM2835_PLLD_CORE] = REGISTER_PLL_DIV(&bcm2835_plld_core_data),
- - [BCM2835_PLLD_PER] = REGISTER_PLL_DIV(&bcm2835_plld_per_data),
- - [BCM2835_PLLH_RCAL] = REGISTER_PLL_DIV(&bcm2835_pllh_rcal_data),
- - [BCM2835_PLLH_AUX] = REGISTER_PLL_DIV(&bcm2835_pllh_aux_data),
- - [BCM2835_PLLH_PIX] = REGISTER_PLL_DIV(&bcm2835_pllh_pix_data),
- + /* the PLL + PLL dividers */
- +
- + /*
- + * PLLA is the auxiliary PLL, used to drive the CCP2
- + * (Compact Camera Port 2) transmitter clock.
- + *
- + * It is in the PX LDO power domain, which is on when the
- + * AUDIO domain is on.
- + */
- + [BCM2835_PLLA] = REGISTER_PLL(
- + .name = "plla",
- + .cm_ctrl_reg = CM_PLLA,
- + .a2w_ctrl_reg = A2W_PLLA_CTRL,
- + .frac_reg = A2W_PLLA_FRAC,
- + .ana_reg_base = A2W_PLLA_ANA0,
- + .reference_enable_mask = A2W_XOSC_CTRL_PLLA_ENABLE,
- + .lock_mask = CM_LOCK_FLOCKA,
- +
- + .ana = &bcm2835_ana_default,
- +
- + .min_rate = 600000000u,
- + .max_rate = 2400000000u,
- + .max_fb_rate = BCM2835_MAX_FB_RATE),
- + [BCM2835_PLLA_CORE] = REGISTER_PLL_DIV(
- + .name = "plla_core",
- + .source_pll = "plla",
- + .cm_reg = CM_PLLA,
- + .a2w_reg = A2W_PLLA_CORE,
- + .load_mask = CM_PLLA_LOADCORE,
- + .hold_mask = CM_PLLA_HOLDCORE,
- + .fixed_divider = 1),
- + [BCM2835_PLLA_PER] = REGISTER_PLL_DIV(
- + .name = "plla_per",
- + .source_pll = "plla",
- + .cm_reg = CM_PLLA,
- + .a2w_reg = A2W_PLLA_PER,
- + .load_mask = CM_PLLA_LOADPER,
- + .hold_mask = CM_PLLA_HOLDPER,
- + .fixed_divider = 1),
- +
- + /* PLLB is used for the ARM's clock. */
- + [BCM2835_PLLB] = REGISTER_PLL(
- + .name = "pllb",
- + .cm_ctrl_reg = CM_PLLB,
- + .a2w_ctrl_reg = A2W_PLLB_CTRL,
- + .frac_reg = A2W_PLLB_FRAC,
- + .ana_reg_base = A2W_PLLB_ANA0,
- + .reference_enable_mask = A2W_XOSC_CTRL_PLLB_ENABLE,
- + .lock_mask = CM_LOCK_FLOCKB,
- +
- + .ana = &bcm2835_ana_default,
- +
- + .min_rate = 600000000u,
- + .max_rate = 3000000000u,
- + .max_fb_rate = BCM2835_MAX_FB_RATE),
- + [BCM2835_PLLB_ARM] = REGISTER_PLL_DIV(
- + .name = "pllb_arm",
- + .source_pll = "pllb",
- + .cm_reg = CM_PLLB,
- + .a2w_reg = A2W_PLLB_ARM,
- + .load_mask = CM_PLLB_LOADARM,
- + .hold_mask = CM_PLLB_HOLDARM,
- + .fixed_divider = 1),
- +
- + /*
- + * PLLC is the core PLL, used to drive the core VPU clock.
- + *
- + * It is in the PX LDO power domain, which is on when the
- + * AUDIO domain is on.
- + */
- + [BCM2835_PLLC] = REGISTER_PLL(
- + .name = "pllc",
- + .cm_ctrl_reg = CM_PLLC,
- + .a2w_ctrl_reg = A2W_PLLC_CTRL,
- + .frac_reg = A2W_PLLC_FRAC,
- + .ana_reg_base = A2W_PLLC_ANA0,
- + .reference_enable_mask = A2W_XOSC_CTRL_PLLC_ENABLE,
- + .lock_mask = CM_LOCK_FLOCKC,
- +
- + .ana = &bcm2835_ana_default,
- +
- + .min_rate = 600000000u,
- + .max_rate = 3000000000u,
- + .max_fb_rate = BCM2835_MAX_FB_RATE),
- + [BCM2835_PLLC_CORE0] = REGISTER_PLL_DIV(
- + .name = "pllc_core0",
- + .source_pll = "pllc",
- + .cm_reg = CM_PLLC,
- + .a2w_reg = A2W_PLLC_CORE0,
- + .load_mask = CM_PLLC_LOADCORE0,
- + .hold_mask = CM_PLLC_HOLDCORE0,
- + .fixed_divider = 1),
- + [BCM2835_PLLC_CORE1] = REGISTER_PLL_DIV(
- + .name = "pllc_core1",
- + .source_pll = "pllc",
- + .cm_reg = CM_PLLC,
- + .a2w_reg = A2W_PLLC_CORE1,
- + .load_mask = CM_PLLC_LOADCORE1,
- + .hold_mask = CM_PLLC_HOLDCORE1,
- + .fixed_divider = 1),
- + [BCM2835_PLLC_CORE2] = REGISTER_PLL_DIV(
- + .name = "pllc_core2",
- + .source_pll = "pllc",
- + .cm_reg = CM_PLLC,
- + .a2w_reg = A2W_PLLC_CORE2,
- + .load_mask = CM_PLLC_LOADCORE2,
- + .hold_mask = CM_PLLC_HOLDCORE2,
- + .fixed_divider = 1),
- + [BCM2835_PLLC_PER] = REGISTER_PLL_DIV(
- + .name = "pllc_per",
- + .source_pll = "pllc",
- + .cm_reg = CM_PLLC,
- + .a2w_reg = A2W_PLLC_PER,
- + .load_mask = CM_PLLC_LOADPER,
- + .hold_mask = CM_PLLC_HOLDPER,
- + .fixed_divider = 1),
- +
- + /*
- + * PLLD is the display PLL, used to drive DSI display panels.
- + *
- + * It is in the PX LDO power domain, which is on when the
- + * AUDIO domain is on.
- + */
- + [BCM2835_PLLD] = REGISTER_PLL(
- + .name = "plld",
- + .cm_ctrl_reg = CM_PLLD,
- + .a2w_ctrl_reg = A2W_PLLD_CTRL,
- + .frac_reg = A2W_PLLD_FRAC,
- + .ana_reg_base = A2W_PLLD_ANA0,
- + .reference_enable_mask = A2W_XOSC_CTRL_DDR_ENABLE,
- + .lock_mask = CM_LOCK_FLOCKD,
- +
- + .ana = &bcm2835_ana_default,
- +
- + .min_rate = 600000000u,
- + .max_rate = 2400000000u,
- + .max_fb_rate = BCM2835_MAX_FB_RATE),
- + [BCM2835_PLLD_CORE] = REGISTER_PLL_DIV(
- + .name = "plld_core",
- + .source_pll = "plld",
- + .cm_reg = CM_PLLD,
- + .a2w_reg = A2W_PLLD_CORE,
- + .load_mask = CM_PLLD_LOADCORE,
- + .hold_mask = CM_PLLD_HOLDCORE,
- + .fixed_divider = 1),
- + [BCM2835_PLLD_PER] = REGISTER_PLL_DIV(
- + .name = "plld_per",
- + .source_pll = "plld",
- + .cm_reg = CM_PLLD,
- + .a2w_reg = A2W_PLLD_PER,
- + .load_mask = CM_PLLD_LOADPER,
- + .hold_mask = CM_PLLD_HOLDPER,
- + .fixed_divider = 1),
- +
- + /*
- + * PLLH is used to supply the pixel clock or the AUX clock for the
- + * TV encoder.
- + *
- + * It is in the HDMI power domain.
- + */
- + [BCM2835_PLLH] = REGISTER_PLL(
- + "pllh",
- + .cm_ctrl_reg = CM_PLLH,
- + .a2w_ctrl_reg = A2W_PLLH_CTRL,
- + .frac_reg = A2W_PLLH_FRAC,
- + .ana_reg_base = A2W_PLLH_ANA0,
- + .reference_enable_mask = A2W_XOSC_CTRL_PLLC_ENABLE,
- + .lock_mask = CM_LOCK_FLOCKH,
- +
- + .ana = &bcm2835_ana_pllh,
- +
- + .min_rate = 600000000u,
- + .max_rate = 3000000000u,
- + .max_fb_rate = BCM2835_MAX_FB_RATE),
- + [BCM2835_PLLH_RCAL] = REGISTER_PLL_DIV(
- + .name = "pllh_rcal",
- + .source_pll = "pllh",
- + .cm_reg = CM_PLLH,
- + .a2w_reg = A2W_PLLH_RCAL,
- + .load_mask = CM_PLLH_LOADRCAL,
- + .hold_mask = 0,
- + .fixed_divider = 10),
- + [BCM2835_PLLH_AUX] = REGISTER_PLL_DIV(
- + .name = "pllh_aux",
- + .source_pll = "pllh",
- + .cm_reg = CM_PLLH,
- + .a2w_reg = A2W_PLLH_AUX,
- + .load_mask = CM_PLLH_LOADAUX,
- + .hold_mask = 0,
- + .fixed_divider = 10),
- + [BCM2835_PLLH_PIX] = REGISTER_PLL_DIV(
- + .name = "pllh_pix",
- + .source_pll = "pllh",
- + .cm_reg = CM_PLLH,
- + .a2w_reg = A2W_PLLH_PIX,
- + .load_mask = CM_PLLH_LOADPIX,
- + .hold_mask = 0,
- + .fixed_divider = 10),
- +
- /* the clocks */
- - [BCM2835_CLOCK_TIMER] = REGISTER_CLK(&bcm2835_clock_timer_data),
- - [BCM2835_CLOCK_OTP] = REGISTER_CLK(&bcm2835_clock_otp_data),
- - [BCM2835_CLOCK_TSENS] = REGISTER_CLK(&bcm2835_clock_tsens_data),
- - [BCM2835_CLOCK_VPU] = REGISTER_CLK(&bcm2835_clock_vpu_data),
- - [BCM2835_CLOCK_V3D] = REGISTER_CLK(&bcm2835_clock_v3d_data),
- - [BCM2835_CLOCK_ISP] = REGISTER_CLK(&bcm2835_clock_isp_data),
- - [BCM2835_CLOCK_H264] = REGISTER_CLK(&bcm2835_clock_h264_data),
- - [BCM2835_CLOCK_V3D] = REGISTER_CLK(&bcm2835_clock_v3d_data),
- - [BCM2835_CLOCK_SDRAM] = REGISTER_CLK(&bcm2835_clock_sdram_data),
- - [BCM2835_CLOCK_UART] = REGISTER_CLK(&bcm2835_clock_uart_data),
- - [BCM2835_CLOCK_VEC] = REGISTER_CLK(&bcm2835_clock_vec_data),
- - [BCM2835_CLOCK_HSM] = REGISTER_CLK(&bcm2835_clock_hsm_data),
- - [BCM2835_CLOCK_EMMC] = REGISTER_CLK(&bcm2835_clock_emmc_data),
- - [BCM2835_CLOCK_PWM] = REGISTER_CLK(&bcm2835_clock_pwm_data),
- +
- + /* clocks with oscillator parent mux */
- +
- + /* One Time Programmable Memory clock. Maximum 10Mhz. */
- + [BCM2835_CLOCK_OTP] = REGISTER_OSC_CLK(
- + .name = "otp",
- + .ctl_reg = CM_OTPCTL,
- + .div_reg = CM_OTPDIV,
- + .int_bits = 4,
- + .frac_bits = 0),
- + /*
- + * Used for a 1Mhz clock for the system clocksource, and also used
- + * bythe watchdog timer and the camera pulse generator.
- + */
- + [BCM2835_CLOCK_TIMER] = REGISTER_OSC_CLK(
- + .name = "timer",
- + .ctl_reg = CM_TIMERCTL,
- + .div_reg = CM_TIMERDIV,
- + .int_bits = 6,
- + .frac_bits = 12),
- + /*
- + * Clock for the temperature sensor.
- + * Generally run at 2Mhz, max 5Mhz.
- + */
- + [BCM2835_CLOCK_TSENS] = REGISTER_OSC_CLK(
- + .name = "tsens",
- + .ctl_reg = CM_TSENSCTL,
- + .div_reg = CM_TSENSDIV,
- + .int_bits = 5,
- + .frac_bits = 0),
- +
- + /* clocks with vpu parent mux */
- + [BCM2835_CLOCK_H264] = REGISTER_VPU_CLK(
- + .name = "h264",
- + .ctl_reg = CM_H264CTL,
- + .div_reg = CM_H264DIV,
- + .int_bits = 4,
- + .frac_bits = 8),
- + [BCM2835_CLOCK_ISP] = REGISTER_VPU_CLK(
- + .name = "isp",
- + .ctl_reg = CM_ISPCTL,
- + .div_reg = CM_ISPDIV,
- + .int_bits = 4,
- + .frac_bits = 8),
- + /*
- + * Secondary SDRAM clock. Used for low-voltage modes when the PLL
- + * in the SDRAM controller can't be used.
- + */
- + [BCM2835_CLOCK_SDRAM] = REGISTER_VPU_CLK(
- + .name = "sdram",
- + .ctl_reg = CM_SDCCTL,
- + .div_reg = CM_SDCDIV,
- + .int_bits = 6,
- + .frac_bits = 0),
- + [BCM2835_CLOCK_V3D] = REGISTER_VPU_CLK(
- + .name = "v3d",
- + .ctl_reg = CM_V3DCTL,
- + .div_reg = CM_V3DDIV,
- + .int_bits = 4,
- + .frac_bits = 8),
- + /*
- + * VPU clock. This doesn't have an enable bit, since it drives
- + * the bus for everything else, and is special so it doesn't need
- + * to be gated for rate changes. It is also known as "clk_audio"
- + * in various hardware documentation.
- + */
- + [BCM2835_CLOCK_VPU] = REGISTER_VPU_CLK(
- + .name = "vpu",
- + .ctl_reg = CM_VPUCTL,
- + .div_reg = CM_VPUDIV,
- + .int_bits = 12,
- + .frac_bits = 8,
- + .is_vpu_clock = true),
- +
- + /* clocks with per parent mux */
- +
- + /* Arasan EMMC clock */
- + [BCM2835_CLOCK_EMMC] = REGISTER_PER_CLK(
- + .name = "emmc",
- + .ctl_reg = CM_EMMCCTL,
- + .div_reg = CM_EMMCDIV,
- + .int_bits = 4,
- + .frac_bits = 8),
- + /* HDMI state machine */
- + [BCM2835_CLOCK_HSM] = REGISTER_PER_CLK(
- + .name = "hsm",
- + .ctl_reg = CM_HSMCTL,
- + .div_reg = CM_HSMDIV,
- + .int_bits = 4,
- + .frac_bits = 8),
- + [BCM2835_CLOCK_PWM] = REGISTER_PER_CLK(
- + .name = "pwm",
- + .ctl_reg = CM_PWMCTL,
- + .div_reg = CM_PWMDIV,
- + .int_bits = 12,
- + .frac_bits = 12,
- + .is_mash_clock = true),
- + [BCM2835_CLOCK_UART] = REGISTER_PER_CLK(
- + .name = "uart",
- + .ctl_reg = CM_UARTCTL,
- + .div_reg = CM_UARTDIV,
- + .int_bits = 10,
- + .frac_bits = 12),
- + /* TV encoder clock. Only operating frequency is 108Mhz. */
- + [BCM2835_CLOCK_VEC] = REGISTER_PER_CLK(
- + .name = "vec",
- + .ctl_reg = CM_VECCTL,
- + .div_reg = CM_VECDIV,
- + .int_bits = 4,
- + .frac_bits = 0),
- +
- /* the gates */
- +
- + /*
- + * CM_PERIICTL (and CM_PERIACTL, CM_SYSCTL and CM_VPUCTL if
- + * you have the debug bit set in the power manager, which we
- + * don't bother exposing) are individual gates off of the
- + * non-stop vpu clock.
- + */
- [BCM2835_CLOCK_PERI_IMAGE] = REGISTER_GATE(
- - &bcm2835_clock_peri_image_data),
- + .name = "peri_image",
- + .parent = "vpu",
- + .ctl_reg = CM_PERIICTL),
- };
-
- static int bcm2835_clk_probe(struct platform_device *pdev)
|