Dear RT folks! I'm pleased to announce the v4.19.1-rt3 patch set.
Changes since v4.19.1-rt2: - A patch to the bcm2835 pinctrl driver to use raw_spinlock_t. Patch by Lukas Wunner. - The Atmel TCB timer patch set by Alexandre Belloni has been update to v7. - The RCU Kconfig entry has been tweaked and now it is no longer required to enable RCU_EXPERT in order to enable RCU_BOOST. Suggested by Paul E. McKenney. - The crypto caam driver did not compile. Patch by Horia Geantă. - The kbuild test robot complained about various patches because they did not compile and so hurt bisectibility. As a result a few patches and hunks have been moved to avoid that. Known issues - A warning triggered in "rcu_note_context_switch" originated from SyS_timer_gettime(). The issue was always there, it is now visible. Reported by Grygorii Strashko and Daniel Wagner. The delta patch against v4.19.1-rt2 is appended below and can be found here: https://cdn.kernel.org/pub/linux/kernel/projects/rt/4.19/incr/patch-4.19.1-rt2-rt3.patch.xz You can get this release via the git tree at: git://git.kernel.org/pub/scm/linux/kernel/git/rt/linux-rt-devel.git v4.19.1-rt3 The RT patch against v4.19.1 can be found here: https://cdn.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patch-4.19.1-rt3.patch.xz The split quilt queue is available at: https://cdn.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.1-rt3.tar.xz Sebastian diff --git a/drivers/clocksource/timer-atmel-tcb.c b/drivers/clocksource/timer-atmel-tcb.c index bbbacf8c46b0f..63ce3b69338a0 100644 --- a/drivers/clocksource/timer-atmel-tcb.c +++ b/drivers/clocksource/timer-atmel-tcb.c @@ -11,7 +11,7 @@ #include <linux/sched_clock.h> #include <soc/at91/atmel_tcb.h> -static struct atmel_tcb_clksrc { +struct atmel_tcb_clksrc { struct clocksource clksrc; struct clock_event_device clkevt; struct regmap *regmap; @@ -29,56 +29,55 @@ static struct atmel_tcb_clksrc { } cache[2]; u32 bmr_cache; bool registered; -} tc = { - .clksrc = { - .rating = 200, - .mask = CLOCKSOURCE_MASK(32), - .flags = CLOCK_SOURCE_IS_CONTINUOUS, - }, - .clkevt = { - .features = CLOCK_EVT_FEAT_ONESHOT, - /* Should be lower than at91rm9200's system timer */ - .rating = 125, - }, + bool clk_enabled; }; -static struct tc_clkevt_device { - struct clock_event_device clkevt; - struct regmap *regmap; - void __iomem *base; - struct clk *slow_clk; +static struct atmel_tcb_clksrc tc, tce; + +static struct clk *tcb_clk_get(struct device_node *node, int channel) +{ struct clk *clk; - char name[20]; - int channel; - int irq; - struct { - u32 cmr; - u32 imr; - u32 rc; - bool clken; - } cache; - bool registered; -} tce = { - .clkevt = { - .features = CLOCK_EVT_FEAT_PERIODIC | - CLOCK_EVT_FEAT_ONESHOT, - /* - * Should be lower than at91rm9200's system timer - * but higher than tc.clkevt.rating - */ - .rating = 140, - }, -}; + char clk_name[] = "t0_clk"; + + clk_name[1] += channel; + clk = of_clk_get_by_name(node->parent, clk_name); + if (!IS_ERR(clk)) + return clk; + + return of_clk_get_by_name(node->parent, "t0_clk"); +} /* * Clockevent device using its own channel */ + +static void tc_clkevt2_clk_disable(struct clock_event_device *d) +{ + clk_disable(tce.clk[0]); + tce.clk_enabled = false; +} + +static void tc_clkevt2_clk_enable(struct clock_event_device *d) +{ + if (tce.clk_enabled) + return; + clk_enable(tce.clk[0]); + tce.clk_enabled = true; +} + +static int tc_clkevt2_stop(struct clock_event_device *d) +{ + writel(0xff, tce.base + ATMEL_TC_IDR(tce.channels[0])); + writel(ATMEL_TC_CCR_CLKDIS, tce.base + ATMEL_TC_CCR(tce.channels[0])); + + return 0; +} + static int tc_clkevt2_shutdown(struct clock_event_device *d) { - writel(0xff, tce.base + ATMEL_TC_IDR(tce.channel)); - writel(ATMEL_TC_CCR_CLKDIS, tce.base + ATMEL_TC_CCR(tce.channel)); + tc_clkevt2_stop(d); if (!clockevent_state_detached(d)) - clk_disable(tce.clk); + tc_clkevt2_clk_disable(d); return 0; } @@ -93,15 +92,15 @@ static int tc_clkevt2_shutdown(struct clock_event_device *d) static int tc_clkevt2_set_oneshot(struct clock_event_device *d) { if (clockevent_state_oneshot(d) || clockevent_state_periodic(d)) - tc_clkevt2_shutdown(d); + tc_clkevt2_stop(d); - clk_enable(tce.clk); + tc_clkevt2_clk_enable(d); /* slow clock, count up to RC, then irq and stop */ writel(ATMEL_TC_CMR_TCLK(4) | ATMEL_TC_CMR_CPCSTOP | ATMEL_TC_CMR_WAVE | ATMEL_TC_CMR_WAVESEL_UPRC, - tce.base + ATMEL_TC_CMR(tce.channel)); - writel(ATMEL_TC_CPCS, tce.base + ATMEL_TC_IER(tce.channel)); + tce.base + ATMEL_TC_CMR(tce.channels[0])); + writel(ATMEL_TC_CPCS, tce.base + ATMEL_TC_IER(tce.channels[0])); return 0; } @@ -109,23 +108,23 @@ static int tc_clkevt2_set_oneshot(struct clock_event_device *d) static int tc_clkevt2_set_periodic(struct clock_event_device *d) { if (clockevent_state_oneshot(d) || clockevent_state_periodic(d)) - tc_clkevt2_shutdown(d); + tc_clkevt2_stop(d); /* By not making the gentime core emulate periodic mode on top * of oneshot, we get lower overhead and improved accuracy. */ - clk_enable(tce.clk); + tc_clkevt2_clk_enable(d); /* slow clock, count up to RC, then irq and restart */ writel(ATMEL_TC_CMR_TCLK(4) | ATMEL_TC_CMR_WAVE | ATMEL_TC_CMR_WAVESEL_UPRC, - tce.base + ATMEL_TC_CMR(tce.channel)); - writel((32768 + HZ / 2) / HZ, tce.base + ATMEL_TC_RC(tce.channel)); + tce.base + ATMEL_TC_CMR(tce.channels[0])); + writel((32768 + HZ / 2) / HZ, tce.base + ATMEL_TC_RC(tce.channels[0])); /* Enable clock and interrupts on RC compare */ - writel(ATMEL_TC_CPCS, tce.base + ATMEL_TC_IER(tce.channel)); + writel(ATMEL_TC_CPCS, tce.base + ATMEL_TC_IER(tce.channels[0])); writel(ATMEL_TC_CCR_CLKEN | ATMEL_TC_CCR_SWTRG, - tce.base + ATMEL_TC_CCR(tce.channel)); + tce.base + ATMEL_TC_CCR(tce.channels[0])); return 0; } @@ -133,9 +132,9 @@ static int tc_clkevt2_set_periodic(struct clock_event_device *d) static int tc_clkevt2_next_event(unsigned long delta, struct clock_event_device *d) { - writel(delta, tce.base + ATMEL_TC_RC(tce.channel)); + writel(delta, tce.base + ATMEL_TC_RC(tce.channels[0])); writel(ATMEL_TC_CCR_CLKEN | ATMEL_TC_CCR_SWTRG, - tce.base + ATMEL_TC_CCR(tce.channel)); + tce.base + ATMEL_TC_CCR(tce.channels[0])); return 0; } @@ -144,7 +143,7 @@ static irqreturn_t tc_clkevt2_irq(int irq, void *handle) { unsigned int sr; - sr = readl(tce.base + ATMEL_TC_SR(tce.channel)); + sr = readl(tce.base + ATMEL_TC_SR(tce.channels[0])); if (sr & ATMEL_TC_CPCS) { tce.clkevt.event_handler(&tce.clkevt); return IRQ_HANDLED; @@ -155,29 +154,29 @@ static irqreturn_t tc_clkevt2_irq(int irq, void *handle) static void tc_clkevt2_suspend(struct clock_event_device *d) { - tce.cache.cmr = readl(tce.base + ATMEL_TC_CMR(tce.channel)); - tce.cache.imr = readl(tce.base + ATMEL_TC_IMR(tce.channel)); - tce.cache.rc = readl(tce.base + ATMEL_TC_RC(tce.channel)); - tce.cache.clken = !!(readl(tce.base + ATMEL_TC_SR(tce.channel)) & + tce.cache[0].cmr = readl(tce.base + ATMEL_TC_CMR(tce.channels[0])); + tce.cache[0].imr = readl(tce.base + ATMEL_TC_IMR(tce.channels[0])); + tce.cache[0].rc = readl(tce.base + ATMEL_TC_RC(tce.channels[0])); + tce.cache[0].clken = !!(readl(tce.base + ATMEL_TC_SR(tce.channels[0])) & ATMEL_TC_CLKSTA); } static void tc_clkevt2_resume(struct clock_event_device *d) { /* Restore registers for the channel, RA and RB are not used */ - writel(tce.cache.cmr, tc.base + ATMEL_TC_CMR(tce.channel)); - writel(tce.cache.rc, tc.base + ATMEL_TC_RC(tce.channel)); - writel(0, tc.base + ATMEL_TC_RA(tce.channel)); - writel(0, tc.base + ATMEL_TC_RB(tce.channel)); + writel(tce.cache[0].cmr, tc.base + ATMEL_TC_CMR(tce.channels[0])); + writel(tce.cache[0].rc, tc.base + ATMEL_TC_RC(tce.channels[0])); + writel(0, tc.base + ATMEL_TC_RA(tce.channels[0])); + writel(0, tc.base + ATMEL_TC_RB(tce.channels[0])); /* Disable all the interrupts */ - writel(0xff, tc.base + ATMEL_TC_IDR(tce.channel)); + writel(0xff, tc.base + ATMEL_TC_IDR(tce.channels[0])); /* Reenable interrupts that were enabled before suspending */ - writel(tce.cache.imr, tc.base + ATMEL_TC_IER(tce.channel)); + writel(tce.cache[0].imr, tc.base + ATMEL_TC_IER(tce.channels[0])); /* Start the clock if it was used */ - if (tce.cache.clken) + if (tce.cache[0].clken) writel(ATMEL_TC_CCR_CLKEN | ATMEL_TC_CCR_SWTRG, - tc.base + ATMEL_TC_CCR(tce.channel)); + tc.base + ATMEL_TC_CCR(tce.channels[0])); } static int __init tc_clkevt_register(struct device_node *node, @@ -185,23 +184,24 @@ static int __init tc_clkevt_register(struct device_node *node, int channel, int irq, int bits) { int ret; + struct clk *slow_clk; tce.regmap = regmap; tce.base = base; - tce.channel = channel; + tce.channels[0] = channel; tce.irq = irq; - tce.slow_clk = of_clk_get_by_name(node->parent, "slow_clk"); - if (IS_ERR(tce.slow_clk)) - return PTR_ERR(tce.slow_clk); + slow_clk = of_clk_get_by_name(node->parent, "slow_clk"); + if (IS_ERR(slow_clk)) + return PTR_ERR(slow_clk); - ret = clk_prepare_enable(tce.slow_clk); + ret = clk_prepare_enable(slow_clk); if (ret) return ret; - tce.clk = tcb_clk_get(node, tce.channel); - if (IS_ERR(tce.clk)) { - ret = PTR_ERR(tce.clk); + tce.clk[0] = tcb_clk_get(node, tce.channels[0]); + if (IS_ERR(tce.clk[0])) { + ret = PTR_ERR(tce.clk[0]); goto err_slow; } @@ -215,14 +215,17 @@ static int __init tc_clkevt_register(struct device_node *node, tce.clkevt.set_state_oneshot = tc_clkevt2_set_oneshot, tce.clkevt.suspend = tc_clkevt2_suspend, tce.clkevt.resume = tc_clkevt2_resume, + tce.clkevt.features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT; + tce.clkevt.rating = 140; /* try to enable clk to avoid future errors in mode change */ - ret = clk_prepare_enable(tce.clk); + ret = clk_prepare_enable(tce.clk[0]); if (ret) goto err_slow; - clk_disable(tce.clk); + clk_disable(tce.clk[0]); - clockevents_config_and_register(&tce.clkevt, 32768, 1, BIT(bits) - 1); + clockevents_config_and_register(&tce.clkevt, 32768, 1, + CLOCKSOURCE_MASK(bits)); ret = request_irq(tce.irq, tc_clkevt2_irq, IRQF_TIMER | IRQF_SHARED, tce.clkevt.name, &tce); @@ -234,9 +237,9 @@ static int __init tc_clkevt_register(struct device_node *node, return 0; err_clk: - clk_unprepare(tce.clk); + clk_unprepare(tce.clk[0]); err_slow: - clk_disable_unprepare(tce.slow_clk); + clk_disable_unprepare(slow_clk); return ret; } @@ -276,7 +279,6 @@ static int tcb_clkevt_next_event(unsigned long delta, { u32 old, next, cur; - old = readl(tc.base + ATMEL_TC_CV(tc.channels[0])); next = old + delta; writel(next, tc.base + ATMEL_TC_RC(tc.channels[0])); @@ -503,6 +505,9 @@ static int __init tcb_clksrc_register(struct device_node *node, tc.clksrc.name = tc.name; tc.clksrc.suspend = tc_clksrc_suspend; tc.clksrc.resume = tc_clksrc_resume; + tc.clksrc.rating = 200; + tc.clksrc.mask = CLOCKSOURCE_MASK(32); + tc.clksrc.flags = CLOCK_SOURCE_IS_CONTINUOUS; err = clocksource_register_hz(&tc.clksrc, divided_rate); if (err) @@ -518,6 +523,9 @@ static int __init tcb_clksrc_register(struct device_node *node, tc.clkevt.set_next_event = tcb_clkevt_next_event; tc.clkevt.set_state_oneshot = tcb_clkevt_oneshot; tc.clkevt.set_state_shutdown = tcb_clkevt_shutdown; + tc.clkevt.features = CLOCK_EVT_FEAT_ONESHOT; + tc.clkevt.rating = 125; + clockevents_config_and_register(&tc.clkevt, divided_rate, 1, BIT(tc.bits) - 1); @@ -546,11 +554,11 @@ static int __init tcb_clksrc_register(struct device_node *node, static int __init tcb_clksrc_init(struct device_node *node) { const struct of_device_id *match; - const struct atmel_tcb_info *tcb_info; struct regmap *regmap; void __iomem *tcb_base; u32 channel; - int bits, irq, err, chan1 = -1; + int irq, err, chan1 = -1; + unsigned bits; if (tc.registered && tce.registered) return -ENODEV; @@ -571,16 +579,18 @@ static int __init tcb_clksrc_init(struct device_node *node) } match = of_match_node(atmel_tcb_dt_ids, node->parent); - tcb_info = match->data; - bits = tcb_info->bits; + bits = (uintptr_t)match->data; err = of_property_read_u32_index(node, "reg", 0, &channel); if (err) return err; - irq = tcb_irq_get(node, channel); - if (irq < 0) - return irq; + irq = of_irq_get(node->parent, channel); + if (irq < 0) { + irq = of_irq_get(node->parent, 0); + if (irq < 0) + return irq; + } if (tc.registered) return tc_clkevt_register(node, regmap, tcb_base, channel, irq, @@ -604,5 +614,4 @@ static int __init tcb_clksrc_init(struct device_node *node) return tcb_clksrc_register(node, regmap, tcb_base, channel, chan1, irq, bits); } -CLOCKSOURCE_OF_DECLARE(atmel_tcb_clksrc, "atmel,tcb-timer", - tcb_clksrc_init); +TIMER_OF_DECLARE(atmel_tcb_clksrc, "atmel,tcb-timer", tcb_clksrc_init); diff --git a/drivers/crypto/caam/qi.c b/drivers/crypto/caam/qi.c index 67f7f8c42c932..b84e6c8b1e138 100644 --- a/drivers/crypto/caam/qi.c +++ b/drivers/crypto/caam/qi.c @@ -83,13 +83,6 @@ EXPORT_SYMBOL(caam_congested); static u64 times_congested; #endif -/* - * CPU from where the module initialised. This is required because QMan driver - * requires CGRs to be removed from same CPU from where they were originally - * allocated. - */ -static int mod_init_cpu; - /* * This is a a cache of buffers, from which the users of CAAM QI driver * can allocate short (CAAM_QI_MEMCACHE_SIZE) buffers. It's faster than @@ -492,12 +485,11 @@ void caam_drv_ctx_rel(struct caam_drv_ctx *drv_ctx) } EXPORT_SYMBOL(caam_drv_ctx_rel); -int caam_qi_shutdown(struct device *qidev) +void caam_qi_shutdown(struct device *qidev) { - int i, ret; + int i; struct caam_qi_priv *priv = dev_get_drvdata(qidev); const cpumask_t *cpus = qman_affine_cpus(); - struct cpumask old_cpumask = current->cpus_allowed; for_each_cpu(i, cpus) { struct napi_struct *irqtask; @@ -510,26 +502,12 @@ int caam_qi_shutdown(struct device *qidev) dev_err(qidev, "Rsp FQ kill failed, cpu: %d\n", i); } - /* - * QMan driver requires CGRs to be deleted from same CPU from where they - * were instantiated. Hence we get the module removal execute from the - * same CPU from where it was originally inserted. - */ - set_cpus_allowed_ptr(current, get_cpu_mask(mod_init_cpu)); - - ret = qman_delete_cgr(&priv->cgr); - if (ret) - dev_err(qidev, "Deletion of CGR failed: %d\n", ret); - else - qman_release_cgrid(priv->cgr.cgrid); + qman_delete_cgr_safe(&priv->cgr); + qman_release_cgrid(priv->cgr.cgrid); kmem_cache_destroy(qi_cache); - /* Now that we're done with the CGRs, restore the cpus allowed mask */ - set_cpus_allowed_ptr(current, &old_cpumask); - platform_device_unregister(priv->qi_pdev); - return ret; } static void cgr_cb(struct qman_portal *qm, struct qman_cgr *cgr, int congested) @@ -718,22 +696,11 @@ int caam_qi_init(struct platform_device *caam_pdev) struct device *ctrldev = &caam_pdev->dev, *qidev; struct caam_drv_private *ctrlpriv; const cpumask_t *cpus = qman_affine_cpus(); - struct cpumask old_cpumask = current->cpus_allowed; static struct platform_device_info qi_pdev_info = { .name = "caam_qi", .id = PLATFORM_DEVID_NONE }; - /* - * QMAN requires CGRs to be removed from same CPU+portal from where it - * was originally allocated. Hence we need to note down the - * initialisation CPU and use the same CPU for module exit. - * We select the first CPU to from the list of portal owning CPUs. - * Then we pin module init to this CPU. - */ - mod_init_cpu = cpumask_first(cpus); - set_cpus_allowed_ptr(current, get_cpu_mask(mod_init_cpu)); - qi_pdev_info.parent = ctrldev; qi_pdev_info.dma_mask = dma_get_mask(ctrldev); qi_pdev = platform_device_register_full(&qi_pdev_info); @@ -795,8 +762,6 @@ int caam_qi_init(struct platform_device *caam_pdev) return -ENOMEM; } - /* Done with the CGRs; restore the cpus allowed mask */ - set_cpus_allowed_ptr(current, &old_cpumask); #ifdef CONFIG_DEBUG_FS debugfs_create_file("qi_congested", 0444, ctrlpriv->ctl, ×_congested, &caam_fops_u64_ro); diff --git a/drivers/crypto/caam/qi.h b/drivers/crypto/caam/qi.h index 357b69f570725..b6c8acc308536 100644 --- a/drivers/crypto/caam/qi.h +++ b/drivers/crypto/caam/qi.h @@ -174,7 +174,7 @@ int caam_drv_ctx_update(struct caam_drv_ctx *drv_ctx, u32 *sh_desc); void caam_drv_ctx_rel(struct caam_drv_ctx *drv_ctx); int caam_qi_init(struct platform_device *pdev); -int caam_qi_shutdown(struct device *dev); +void caam_qi_shutdown(struct device *dev); /** * qi_cache_alloc - Allocate buffers from CAAM-QI cache diff --git a/drivers/pinctrl/bcm/pinctrl-bcm2835.c b/drivers/pinctrl/bcm/pinctrl-bcm2835.c index fa530913a2c8f..08925d24180b0 100644 --- a/drivers/pinctrl/bcm/pinctrl-bcm2835.c +++ b/drivers/pinctrl/bcm/pinctrl-bcm2835.c @@ -90,7 +90,7 @@ struct bcm2835_pinctrl { struct gpio_chip gpio_chip; struct pinctrl_gpio_range gpio_range; - spinlock_t irq_lock[BCM2835_NUM_BANKS]; + raw_spinlock_t irq_lock[BCM2835_NUM_BANKS]; }; /* pins are just named GPIO0..GPIO53 */ @@ -461,10 +461,10 @@ static void bcm2835_gpio_irq_enable(struct irq_data *data) unsigned bank = GPIO_REG_OFFSET(gpio); unsigned long flags; - spin_lock_irqsave(&pc->irq_lock[bank], flags); + raw_spin_lock_irqsave(&pc->irq_lock[bank], flags); set_bit(offset, &pc->enabled_irq_map[bank]); bcm2835_gpio_irq_config(pc, gpio, true); - spin_unlock_irqrestore(&pc->irq_lock[bank], flags); + raw_spin_unlock_irqrestore(&pc->irq_lock[bank], flags); } static void bcm2835_gpio_irq_disable(struct irq_data *data) @@ -476,12 +476,12 @@ static void bcm2835_gpio_irq_disable(struct irq_data *data) unsigned bank = GPIO_REG_OFFSET(gpio); unsigned long flags; - spin_lock_irqsave(&pc->irq_lock[bank], flags); + raw_spin_lock_irqsave(&pc->irq_lock[bank], flags); bcm2835_gpio_irq_config(pc, gpio, false); /* Clear events that were latched prior to clearing event sources */ bcm2835_gpio_set_bit(pc, GPEDS0, gpio); clear_bit(offset, &pc->enabled_irq_map[bank]); - spin_unlock_irqrestore(&pc->irq_lock[bank], flags); + raw_spin_unlock_irqrestore(&pc->irq_lock[bank], flags); } static int __bcm2835_gpio_irq_set_type_disabled(struct bcm2835_pinctrl *pc, @@ -584,7 +584,7 @@ static int bcm2835_gpio_irq_set_type(struct irq_data *data, unsigned int type) unsigned long flags; int ret; - spin_lock_irqsave(&pc->irq_lock[bank], flags); + raw_spin_lock_irqsave(&pc->irq_lock[bank], flags); if (test_bit(offset, &pc->enabled_irq_map[bank])) ret = __bcm2835_gpio_irq_set_type_enabled(pc, gpio, type); @@ -596,7 +596,7 @@ static int bcm2835_gpio_irq_set_type(struct irq_data *data, unsigned int type) else irq_set_handler_locked(data, handle_level_irq); - spin_unlock_irqrestore(&pc->irq_lock[bank], flags); + raw_spin_unlock_irqrestore(&pc->irq_lock[bank], flags); return ret; } @@ -1047,7 +1047,7 @@ static int bcm2835_pinctrl_probe(struct platform_device *pdev) for_each_set_bit(offset, &events, 32) bcm2835_gpio_wr(pc, GPEDS0 + i * 4, BIT(offset)); - spin_lock_init(&pc->irq_lock[i]); + raw_spin_lock_init(&pc->irq_lock[i]); } err = gpiochip_add_data(&pc->gpio_chip, pc); diff --git a/include/soc/at91/atmel_tcb.h b/include/soc/at91/atmel_tcb.h index d263ea6772259..657e234b14832 100644 --- a/include/soc/at91/atmel_tcb.h +++ b/include/soc/at91/atmel_tcb.h @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: GPL-2.0 +//SPDX-License-Identifier: GPL-2.0 /* Copyright (C) 2018 Microchip */ #ifndef __SOC_ATMEL_TCB_H @@ -166,48 +166,15 @@ #define ATMEL_TC_WPMR_WPKEY (0x54494d << 8) #define ATMEL_TC_WPMR_WPEN BIT(0) -static inline struct clk *tcb_clk_get(struct device_node *node, int channel) -{ - struct clk *clk; - char clk_name[] = "t0_clk"; - - clk_name[1] += channel; - clk = of_clk_get_by_name(node->parent, clk_name); - if (!IS_ERR(clk)) - return clk; - - return of_clk_get_by_name(node->parent, "t0_clk"); -} - -static inline int tcb_irq_get(struct device_node *node, int channel) -{ - int irq; - - irq = of_irq_get(node->parent, channel); - if (irq > 0) - return irq; - - return of_irq_get(node->parent, 0); -} - static const u8 atmel_tc_divisors[5] = { 2, 8, 32, 128, 0, }; -struct atmel_tcb_info { - int bits; -}; - -static const struct atmel_tcb_info atmel_tcb_infos[] = { - { .bits = 16 }, - { .bits = 32 }, -}; - static const struct of_device_id atmel_tcb_dt_ids[] = { { .compatible = "atmel,at91rm9200-tcb", - .data = &atmel_tcb_infos[0], + .data = (void *)16, }, { .compatible = "atmel,at91sam9x5-tcb", - .data = &atmel_tcb_infos[1], + .data = (void *)32, }, { /* sentinel */ } diff --git a/kernel/rcu/Kconfig b/kernel/rcu/Kconfig index 0be2c96fb640e..a243a78ff38c0 100644 --- a/kernel/rcu/Kconfig +++ b/kernel/rcu/Kconfig @@ -36,7 +36,7 @@ config TINY_RCU config RCU_EXPERT bool "Make expert-level adjustments to RCU configuration" - default y if PREEMPT_RT_FULL + default n help This option needs to be enabled if you wish to make expert-level adjustments to RCU configuration. By default, @@ -190,7 +190,7 @@ config RCU_FAST_NO_HZ config RCU_BOOST bool "Enable RCU priority boosting" - depends on RT_MUTEXES && PREEMPT_RCU && RCU_EXPERT + depends on (RT_MUTEXES && PREEMPT_RCU && RCU_EXPERT) || PREEMPT_RT_FULL default y if PREEMPT_RT_FULL help This option boosts the priority of preempted RCU readers that diff --git a/localversion-rt b/localversion-rt index c3054d08a1129..1445cd65885cd 100644 --- a/localversion-rt +++ b/localversion-rt @@ -1 +1 @@ --rt2 +-rt3