Skip to content

Commit a8f5b6e

Browse files
committed
Merge tag 'omap-fixes-a2-for-3.4rc' of git://git.kernel.org/pub/scm/linux/kernel/git/pjw/omap-pending into fixes
From Paul Walmsley: OMAP clock, powerdomain, clockdomain, and hwmod fixes intended for the early v3.4-rc series. Also contains an HSMMC integration refinement of an earlier hardware bug workaround. * tag 'omap-fixes-a2-for-3.4rc' of git://git.kernel.org/pub/scm/linux/kernel/git/pjw/omap-pending: ARM: OMAP2+: hwmod: Fix wrong SYSC_TYPE1_XXX_MASK bit definitions ARM: OMAP2+: hwmod: Make omap_hwmod_softreset wait for reset status ARM: OMAP2+: hwmod: Restore sysc after a reset ARM: OMAP2+: omap_hwmod: Allow io_ring wakeup configuration for all modules ARM: OMAP3: clock data: fill in some missing clockdomains ARM: OMAP4: clock data: Force a DPLL clkdm/pwrdm ON before a relock ARM: OMAP4: clock data: fix mult and div mask for USB_DPLL ARM: OMAP2+: powerdomain: Wait for powerdomain transition in pwrdm_state_switch() ARM: OMAP AM3517/3505: clock data: change EMAC clocks aliases ARM: OMAP: clock: fix race in disable all clocks ARM: OMAP4: hwmod data: Add aliases for McBSP fclk clocks ARM: OMAP3xxx: clock data: fix DPLL4 CLKSEL masks ARM: OMAP3xxx: HSMMC: avoid erratum workaround when transceiver is attached ARM: OMAP44xx: clockdomain data: correct the emu_sys_clkdm CLKTRCTRL data
2 parents 1ac02d7 + a9dd31b commit a8f5b6e

File tree

9 files changed

+105
-68
lines changed

9 files changed

+105
-68
lines changed

arch/arm/mach-omap2/clock3xxx_data.c

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -747,7 +747,7 @@ static struct clk dpll4_m3_ck = {
747747
.parent = &dpll4_ck,
748748
.init = &omap2_init_clksel_parent,
749749
.clksel_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_CLKSEL),
750-
.clksel_mask = OMAP3430_CLKSEL_TV_MASK,
750+
.clksel_mask = OMAP3630_CLKSEL_TV_MASK,
751751
.clksel = dpll4_clksel,
752752
.clkdm_name = "dpll4_clkdm",
753753
.recalc = &omap2_clksel_recalc,
@@ -832,7 +832,7 @@ static struct clk dpll4_m4_ck = {
832832
.parent = &dpll4_ck,
833833
.init = &omap2_init_clksel_parent,
834834
.clksel_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_CLKSEL),
835-
.clksel_mask = OMAP3430_CLKSEL_DSS1_MASK,
835+
.clksel_mask = OMAP3630_CLKSEL_DSS1_MASK,
836836
.clksel = dpll4_clksel,
837837
.clkdm_name = "dpll4_clkdm",
838838
.recalc = &omap2_clksel_recalc,
@@ -859,7 +859,7 @@ static struct clk dpll4_m5_ck = {
859859
.parent = &dpll4_ck,
860860
.init = &omap2_init_clksel_parent,
861861
.clksel_reg = OMAP_CM_REGADDR(OMAP3430_CAM_MOD, CM_CLKSEL),
862-
.clksel_mask = OMAP3430_CLKSEL_CAM_MASK,
862+
.clksel_mask = OMAP3630_CLKSEL_CAM_MASK,
863863
.clksel = dpll4_clksel,
864864
.clkdm_name = "dpll4_clkdm",
865865
.set_rate = &omap2_clksel_set_rate,
@@ -886,7 +886,7 @@ static struct clk dpll4_m6_ck = {
886886
.parent = &dpll4_ck,
887887
.init = &omap2_init_clksel_parent,
888888
.clksel_reg = OMAP_CM_REGADDR(OMAP3430_EMU_MOD, CM_CLKSEL1),
889-
.clksel_mask = OMAP3430_DIV_DPLL4_MASK,
889+
.clksel_mask = OMAP3630_DIV_DPLL4_MASK,
890890
.clksel = dpll4_clksel,
891891
.clkdm_name = "dpll4_clkdm",
892892
.recalc = &omap2_clksel_recalc,
@@ -1394,6 +1394,7 @@ static struct clk cpefuse_fck = {
13941394
.name = "cpefuse_fck",
13951395
.ops = &clkops_omap2_dflt,
13961396
.parent = &sys_ck,
1397+
.clkdm_name = "core_l4_clkdm",
13971398
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP3430ES2_CM_FCLKEN3),
13981399
.enable_bit = OMAP3430ES2_EN_CPEFUSE_SHIFT,
13991400
.recalc = &followparent_recalc,
@@ -1403,6 +1404,7 @@ static struct clk ts_fck = {
14031404
.name = "ts_fck",
14041405
.ops = &clkops_omap2_dflt,
14051406
.parent = &omap_32k_fck,
1407+
.clkdm_name = "core_l4_clkdm",
14061408
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP3430ES2_CM_FCLKEN3),
14071409
.enable_bit = OMAP3430ES2_EN_TS_SHIFT,
14081410
.recalc = &followparent_recalc,
@@ -1412,6 +1414,7 @@ static struct clk usbtll_fck = {
14121414
.name = "usbtll_fck",
14131415
.ops = &clkops_omap2_dflt_wait,
14141416
.parent = &dpll5_m2_ck,
1417+
.clkdm_name = "core_l4_clkdm",
14151418
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP3430ES2_CM_FCLKEN3),
14161419
.enable_bit = OMAP3430ES2_EN_USBTLL_SHIFT,
14171420
.recalc = &followparent_recalc,
@@ -1617,6 +1620,7 @@ static struct clk fshostusb_fck = {
16171620
.name = "fshostusb_fck",
16181621
.ops = &clkops_omap2_dflt_wait,
16191622
.parent = &core_48m_fck,
1623+
.clkdm_name = "core_l4_clkdm",
16201624
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
16211625
.enable_bit = OMAP3430ES1_EN_FSHOSTUSB_SHIFT,
16221626
.recalc = &followparent_recalc,
@@ -2043,6 +2047,7 @@ static struct clk omapctrl_ick = {
20432047
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
20442048
.enable_bit = OMAP3430_EN_OMAPCTRL_SHIFT,
20452049
.flags = ENABLE_ON_INIT,
2050+
.clkdm_name = "core_l4_clkdm",
20462051
.recalc = &followparent_recalc,
20472052
};
20482053

@@ -2094,6 +2099,7 @@ static struct clk usb_l4_ick = {
20942099
.clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL),
20952100
.clksel_mask = OMAP3430ES1_CLKSEL_FSHOSTUSB_MASK,
20962101
.clksel = usb_l4_clksel,
2102+
.clkdm_name = "core_l4_clkdm",
20972103
.recalc = &omap2_clksel_recalc,
20982104
};
20992105

@@ -3467,8 +3473,8 @@ static struct omap_clk omap3xxx_clks[] = {
34673473
CLK(NULL, "ipss_ick", &ipss_ick, CK_AM35XX),
34683474
CLK(NULL, "rmii_ck", &rmii_ck, CK_AM35XX),
34693475
CLK(NULL, "pclk_ck", &pclk_ck, CK_AM35XX),
3470-
CLK("davinci_emac", "emac_clk", &emac_ick, CK_AM35XX),
3471-
CLK("davinci_emac", "phy_clk", &emac_fck, CK_AM35XX),
3476+
CLK("davinci_emac", NULL, &emac_ick, CK_AM35XX),
3477+
CLK("davinci_mdio.0", NULL, &emac_fck, CK_AM35XX),
34723478
CLK("vpfe-capture", "master", &vpfe_ick, CK_AM35XX),
34733479
CLK("vpfe-capture", "slave", &vpfe_fck, CK_AM35XX),
34743480
CLK("musb-am35x", "ick", &hsotgusb_ick_am35xx, CK_AM35XX),

arch/arm/mach-omap2/clock44xx_data.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -957,8 +957,8 @@ static struct dpll_data dpll_usb_dd = {
957957
.modes = (1 << DPLL_LOW_POWER_BYPASS) | (1 << DPLL_LOCKED),
958958
.autoidle_reg = OMAP4430_CM_AUTOIDLE_DPLL_USB,
959959
.idlest_reg = OMAP4430_CM_IDLEST_DPLL_USB,
960-
.mult_mask = OMAP4430_DPLL_MULT_MASK,
961-
.div1_mask = OMAP4430_DPLL_DIV_MASK,
960+
.mult_mask = OMAP4430_DPLL_MULT_USB_MASK,
961+
.div1_mask = OMAP4430_DPLL_DIV_0_7_MASK,
962962
.enable_mask = OMAP4430_DPLL_EN_MASK,
963963
.autoidle_mask = OMAP4430_AUTO_DPLL_MODE_MASK,
964964
.idlest_mask = OMAP4430_ST_DPLL_CLK_MASK,
@@ -978,6 +978,7 @@ static struct clk dpll_usb_ck = {
978978
.recalc = &omap3_dpll_recalc,
979979
.round_rate = &omap2_dpll_round_rate,
980980
.set_rate = &omap3_noncore_dpll_set_rate,
981+
.clkdm_name = "l3_init_clkdm",
981982
};
982983

983984
static struct clk dpll_usb_clkdcoldo_ck = {

arch/arm/mach-omap2/clockdomains44xx_data.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -390,7 +390,7 @@ static struct clockdomain emu_sys_44xx_clkdm = {
390390
.prcm_partition = OMAP4430_PRM_PARTITION,
391391
.cm_inst = OMAP4430_PRM_EMU_CM_INST,
392392
.clkdm_offs = OMAP4430_PRM_EMU_CM_EMU_CDOFFS,
393-
.flags = CLKDM_CAN_HWSUP,
393+
.flags = CLKDM_CAN_ENABLE_AUTO | CLKDM_CAN_FORCE_WAKEUP,
394394
};
395395

396396
static struct clockdomain l3_dma_44xx_clkdm = {

arch/arm/mach-omap2/hsmmc.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -506,6 +506,13 @@ static void __init omap_hsmmc_init_one(struct omap2_hsmmc_info *hsmmcinfo,
506506
if (oh->dev_attr != NULL) {
507507
mmc_dev_attr = oh->dev_attr;
508508
mmc_data->controller_flags = mmc_dev_attr->flags;
509+
/*
510+
* erratum 2.1.1.128 doesn't apply if board has
511+
* a transceiver is attached
512+
*/
513+
if (hsmmcinfo->transceiver)
514+
mmc_data->controller_flags &=
515+
~OMAP_HSMMC_BROKEN_MULTIBLOCK_READ;
509516
}
510517

511518
pdev = platform_device_alloc(name, ctrl_nr - 1);

arch/arm/mach-omap2/omap_hwmod.c

Lines changed: 38 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1479,6 +1479,11 @@ static int _reset(struct omap_hwmod *oh)
14791479

14801480
ret = (oh->class->reset) ? oh->class->reset(oh) : _ocp_softreset(oh);
14811481

1482+
if (oh->class->sysc) {
1483+
_update_sysc_cache(oh);
1484+
_enable_sysc(oh);
1485+
}
1486+
14821487
return ret;
14831488
}
14841489

@@ -1788,20 +1793,9 @@ static int _setup(struct omap_hwmod *oh, void *data)
17881793
return 0;
17891794
}
17901795

1791-
if (!(oh->flags & HWMOD_INIT_NO_RESET)) {
1796+
if (!(oh->flags & HWMOD_INIT_NO_RESET))
17921797
_reset(oh);
17931798

1794-
/*
1795-
* OCP_SYSCONFIG bits need to be reprogrammed after a softreset.
1796-
* The _enable() function should be split to
1797-
* avoid the rewrite of the OCP_SYSCONFIG register.
1798-
*/
1799-
if (oh->class->sysc) {
1800-
_update_sysc_cache(oh);
1801-
_enable_sysc(oh);
1802-
}
1803-
}
1804-
18051799
postsetup_state = oh->_postsetup_state;
18061800
if (postsetup_state == _HWMOD_STATE_UNKNOWN)
18071801
postsetup_state = _HWMOD_STATE_ENABLED;
@@ -1909,20 +1903,10 @@ void omap_hwmod_write(u32 v, struct omap_hwmod *oh, u16 reg_offs)
19091903
*/
19101904
int omap_hwmod_softreset(struct omap_hwmod *oh)
19111905
{
1912-
u32 v;
1913-
int ret;
1914-
1915-
if (!oh || !(oh->_sysc_cache))
1906+
if (!oh)
19161907
return -EINVAL;
19171908

1918-
v = oh->_sysc_cache;
1919-
ret = _set_softreset(oh, &v);
1920-
if (ret)
1921-
goto error;
1922-
_write_sysconfig(v, oh);
1923-
1924-
error:
1925-
return ret;
1909+
return _ocp_softreset(oh);
19261910
}
19271911

19281912
/**
@@ -2465,26 +2449,28 @@ int omap_hwmod_del_initiator_dep(struct omap_hwmod *oh,
24652449
* @oh: struct omap_hwmod *
24662450
*
24672451
* Sets the module OCP socket ENAWAKEUP bit to allow the module to
2468-
* send wakeups to the PRCM. Eventually this should sets PRCM wakeup
2469-
* registers to cause the PRCM to receive wakeup events from the
2470-
* module. Does not set any wakeup routing registers beyond this
2471-
* point - if the module is to wake up any other module or subsystem,
2472-
* that must be set separately. Called by omap_device code. Returns
2473-
* -EINVAL on error or 0 upon success.
2452+
* send wakeups to the PRCM, and enable I/O ring wakeup events for
2453+
* this IP block if it has dynamic mux entries. Eventually this
2454+
* should set PRCM wakeup registers to cause the PRCM to receive
2455+
* wakeup events from the module. Does not set any wakeup routing
2456+
* registers beyond this point - if the module is to wake up any other
2457+
* module or subsystem, that must be set separately. Called by
2458+
* omap_device code. Returns -EINVAL on error or 0 upon success.
24742459
*/
24752460
int omap_hwmod_enable_wakeup(struct omap_hwmod *oh)
24762461
{
24772462
unsigned long flags;
24782463
u32 v;
24792464

2480-
if (!oh->class->sysc ||
2481-
!(oh->class->sysc->sysc_flags & SYSC_HAS_ENAWAKEUP))
2482-
return -EINVAL;
2483-
24842465
spin_lock_irqsave(&oh->_lock, flags);
2485-
v = oh->_sysc_cache;
2486-
_enable_wakeup(oh, &v);
2487-
_write_sysconfig(v, oh);
2466+
2467+
if (oh->class->sysc &&
2468+
(oh->class->sysc->sysc_flags & SYSC_HAS_ENAWAKEUP)) {
2469+
v = oh->_sysc_cache;
2470+
_enable_wakeup(oh, &v);
2471+
_write_sysconfig(v, oh);
2472+
}
2473+
24882474
_set_idle_ioring_wakeup(oh, true);
24892475
spin_unlock_irqrestore(&oh->_lock, flags);
24902476

@@ -2496,26 +2482,28 @@ int omap_hwmod_enable_wakeup(struct omap_hwmod *oh)
24962482
* @oh: struct omap_hwmod *
24972483
*
24982484
* Clears the module OCP socket ENAWAKEUP bit to prevent the module
2499-
* from sending wakeups to the PRCM. Eventually this should clear
2500-
* PRCM wakeup registers to cause the PRCM to ignore wakeup events
2501-
* from the module. Does not set any wakeup routing registers beyond
2502-
* this point - if the module is to wake up any other module or
2503-
* subsystem, that must be set separately. Called by omap_device
2504-
* code. Returns -EINVAL on error or 0 upon success.
2485+
* from sending wakeups to the PRCM, and disable I/O ring wakeup
2486+
* events for this IP block if it has dynamic mux entries. Eventually
2487+
* this should clear PRCM wakeup registers to cause the PRCM to ignore
2488+
* wakeup events from the module. Does not set any wakeup routing
2489+
* registers beyond this point - if the module is to wake up any other
2490+
* module or subsystem, that must be set separately. Called by
2491+
* omap_device code. Returns -EINVAL on error or 0 upon success.
25052492
*/
25062493
int omap_hwmod_disable_wakeup(struct omap_hwmod *oh)
25072494
{
25082495
unsigned long flags;
25092496
u32 v;
25102497

2511-
if (!oh->class->sysc ||
2512-
!(oh->class->sysc->sysc_flags & SYSC_HAS_ENAWAKEUP))
2513-
return -EINVAL;
2514-
25152498
spin_lock_irqsave(&oh->_lock, flags);
2516-
v = oh->_sysc_cache;
2517-
_disable_wakeup(oh, &v);
2518-
_write_sysconfig(v, oh);
2499+
2500+
if (oh->class->sysc &&
2501+
(oh->class->sysc->sysc_flags & SYSC_HAS_ENAWAKEUP)) {
2502+
v = oh->_sysc_cache;
2503+
_disable_wakeup(oh, &v);
2504+
_write_sysconfig(v, oh);
2505+
}
2506+
25192507
_set_idle_ioring_wakeup(oh, false);
25202508
spin_unlock_irqrestore(&oh->_lock, flags);
25212509

arch/arm/mach-omap2/omap_hwmod_44xx_data.c

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2996,6 +2996,11 @@ static struct omap_hwmod_ocp_if *omap44xx_mcbsp1_slaves[] = {
29962996
&omap44xx_l4_abe__mcbsp1_dma,
29972997
};
29982998

2999+
static struct omap_hwmod_opt_clk mcbsp1_opt_clks[] = {
3000+
{ .role = "pad_fck", .clk = "pad_clks_ck" },
3001+
{ .role = "prcm_clk", .clk = "mcbsp1_sync_mux_ck" },
3002+
};
3003+
29993004
static struct omap_hwmod omap44xx_mcbsp1_hwmod = {
30003005
.name = "mcbsp1",
30013006
.class = &omap44xx_mcbsp_hwmod_class,
@@ -3012,6 +3017,8 @@ static struct omap_hwmod omap44xx_mcbsp1_hwmod = {
30123017
},
30133018
.slaves = omap44xx_mcbsp1_slaves,
30143019
.slaves_cnt = ARRAY_SIZE(omap44xx_mcbsp1_slaves),
3020+
.opt_clks = mcbsp1_opt_clks,
3021+
.opt_clks_cnt = ARRAY_SIZE(mcbsp1_opt_clks),
30153022
};
30163023

30173024
/* mcbsp2 */
@@ -3071,6 +3078,11 @@ static struct omap_hwmod_ocp_if *omap44xx_mcbsp2_slaves[] = {
30713078
&omap44xx_l4_abe__mcbsp2_dma,
30723079
};
30733080

3081+
static struct omap_hwmod_opt_clk mcbsp2_opt_clks[] = {
3082+
{ .role = "pad_fck", .clk = "pad_clks_ck" },
3083+
{ .role = "prcm_clk", .clk = "mcbsp2_sync_mux_ck" },
3084+
};
3085+
30743086
static struct omap_hwmod omap44xx_mcbsp2_hwmod = {
30753087
.name = "mcbsp2",
30763088
.class = &omap44xx_mcbsp_hwmod_class,
@@ -3087,6 +3099,8 @@ static struct omap_hwmod omap44xx_mcbsp2_hwmod = {
30873099
},
30883100
.slaves = omap44xx_mcbsp2_slaves,
30893101
.slaves_cnt = ARRAY_SIZE(omap44xx_mcbsp2_slaves),
3102+
.opt_clks = mcbsp2_opt_clks,
3103+
.opt_clks_cnt = ARRAY_SIZE(mcbsp2_opt_clks),
30903104
};
30913105

30923106
/* mcbsp3 */
@@ -3146,6 +3160,11 @@ static struct omap_hwmod_ocp_if *omap44xx_mcbsp3_slaves[] = {
31463160
&omap44xx_l4_abe__mcbsp3_dma,
31473161
};
31483162

3163+
static struct omap_hwmod_opt_clk mcbsp3_opt_clks[] = {
3164+
{ .role = "pad_fck", .clk = "pad_clks_ck" },
3165+
{ .role = "prcm_clk", .clk = "mcbsp3_sync_mux_ck" },
3166+
};
3167+
31493168
static struct omap_hwmod omap44xx_mcbsp3_hwmod = {
31503169
.name = "mcbsp3",
31513170
.class = &omap44xx_mcbsp_hwmod_class,
@@ -3162,6 +3181,8 @@ static struct omap_hwmod omap44xx_mcbsp3_hwmod = {
31623181
},
31633182
.slaves = omap44xx_mcbsp3_slaves,
31643183
.slaves_cnt = ARRAY_SIZE(omap44xx_mcbsp3_slaves),
3184+
.opt_clks = mcbsp3_opt_clks,
3185+
.opt_clks_cnt = ARRAY_SIZE(mcbsp3_opt_clks),
31653186
};
31663187

31673188
/* mcbsp4 */
@@ -3200,6 +3221,11 @@ static struct omap_hwmod_ocp_if *omap44xx_mcbsp4_slaves[] = {
32003221
&omap44xx_l4_per__mcbsp4,
32013222
};
32023223

3224+
static struct omap_hwmod_opt_clk mcbsp4_opt_clks[] = {
3225+
{ .role = "pad_fck", .clk = "pad_clks_ck" },
3226+
{ .role = "prcm_clk", .clk = "mcbsp4_sync_mux_ck" },
3227+
};
3228+
32033229
static struct omap_hwmod omap44xx_mcbsp4_hwmod = {
32043230
.name = "mcbsp4",
32053231
.class = &omap44xx_mcbsp_hwmod_class,
@@ -3216,6 +3242,8 @@ static struct omap_hwmod omap44xx_mcbsp4_hwmod = {
32163242
},
32173243
.slaves = omap44xx_mcbsp4_slaves,
32183244
.slaves_cnt = ARRAY_SIZE(omap44xx_mcbsp4_slaves),
3245+
.opt_clks = mcbsp4_opt_clks,
3246+
.opt_clks_cnt = ARRAY_SIZE(mcbsp4_opt_clks),
32193247
};
32203248

32213249
/*

arch/arm/mach-omap2/powerdomain.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -972,7 +972,13 @@ int pwrdm_wait_transition(struct powerdomain *pwrdm)
972972

973973
int pwrdm_state_switch(struct powerdomain *pwrdm)
974974
{
975-
return _pwrdm_state_switch(pwrdm, PWRDM_STATE_NOW);
975+
int ret;
976+
977+
ret = pwrdm_wait_transition(pwrdm);
978+
if (!ret)
979+
ret = _pwrdm_state_switch(pwrdm, PWRDM_STATE_NOW);
980+
981+
return ret;
976982
}
977983

978984
int pwrdm_clkdm_state_switch(struct clockdomain *clkdm)

arch/arm/plat-omap/clock.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -441,17 +441,18 @@ static int __init clk_disable_unused(void)
441441
return 0;
442442

443443
pr_info("clock: disabling unused clocks to save power\n");
444+
445+
spin_lock_irqsave(&clockfw_lock, flags);
444446
list_for_each_entry(ck, &clocks, node) {
445447
if (ck->ops == &clkops_null)
446448
continue;
447449

448450
if (ck->usecount > 0 || !ck->enable_reg)
449451
continue;
450452

451-
spin_lock_irqsave(&clockfw_lock, flags);
452453
arch_clock->clk_disable_unused(ck);
453-
spin_unlock_irqrestore(&clockfw_lock, flags);
454454
}
455+
spin_unlock_irqrestore(&clockfw_lock, flags);
455456

456457
return 0;
457458
}

0 commit comments

Comments
 (0)