aboutsummaryrefslogtreecommitdiff
path: root/drivers/pwm
AgeCommit message (Collapse)AuthorFilesLines
2020-01-20pwm: sun4i: Fix inconsistent IS_ERR and PTR_ERRGustavo A. R. Silva1-3/+3
Fix inconsistent IS_ERR and PTR_ERR in sun4i_pwm_probe(). The proper pointers to be passed as arguments are pwm->clk and pwm->bus_clk. This bug was detected with the help of Coccinelle. Fixes: b8d74644f34a ("pwm: sun4i: Prefer "mod" clock to unnamed") Fixes: 5b090b430d75 ("pwm: sun4i: Add an optional probe for bus clock") Signed-off-by: Gustavo A. R. Silva <[email protected]> Reviewed-by: Uwe Kleine-König <[email protected]> Signed-off-by: Thierry Reding <[email protected]>
2020-01-20pwm: sun4i: Move pwm_calculate() out of spin_lock()Clément Péron1-4/+3
pwm_calculate() calls clk_get_rate() while holding a spin_lock(). This create an issue as clk_get_rate() may sleep. Move pwm_calculate() out of this spin_lock(). Fixes: c32c5c50d4fe ("pwm: sun4i: Switch to atomic PWM") Reported-by: Alexander Finger <[email protected]> Sugested-by: Vasily Khoruzhick <[email protected]> Tested-by: Alexander Finger <[email protected]> Reviewed-by: Uwe Kleine-König <[email protected]> Signed-off-by: Clément Péron <[email protected]> Signed-off-by: Thierry Reding <[email protected]>
2020-01-20pwm: omap-dmtimer: Allow compiling with COMPILE_TESTUwe Kleine-König1-1/+2
The dependency on OMAP_DM_TIMER is only a runtime dependency. Also OMAP_DM_TIMER cannot be enabled without ARCH_OMAP being enabled. Signed-off-by: Uwe Kleine-König <[email protected]> Signed-off-by: Thierry Reding <[email protected]>
2020-01-20pwm: omap-dmtimer: put_device() after of_find_device_by_node()Uwe Kleine-König1-6/+15
This was found by coccicheck: drivers/pwm/pwm-omap-dmtimer.c:304:2-8: ERROR: missing put_device; call of_find_device_by_node on line 255, but without a corresponding object release within this function. Reported-by: Markus Elfring <[email protected]> Fixes: 6604c6556db9 ("pwm: Add PWM driver for OMAP using dual-mode timers") Signed-off-by: Uwe Kleine-König <[email protected]> Signed-off-by: Thierry Reding <[email protected]>
2020-01-20pwm: omap-dmtimer: Simplify error handlingUwe Kleine-König1-9/+19
Instead of doing error handling in the middle of ->probe(), move error handling and freeing the reference to timer to the end. This fixes a resource leak as dm_timer wasn't freed when allocating *omap failed. Implementation note: The put: label was never reached without a goto and ret being unequal to 0, so the removed return statement is fine. Fixes: 6604c6556db9 ("pwm: Add PWM driver for OMAP using dual-mode timers") Signed-off-by: Uwe Kleine-König <[email protected]> Signed-off-by: Thierry Reding <[email protected]>
2020-01-20pwm: omap-dmtimer: Remove PWM chip in .remove before making it unfunctionalUwe Kleine-König1-1/+6
In the old code (e.g.) mutex_destroy() was called before pwmchip_remove(). Between these two calls it is possible that a PWM callback is used which tries to grab the mutex. Fixes: 6604c6556db9 ("pwm: Add PWM driver for OMAP using dual-mode timers") Signed-off-by: Uwe Kleine-König <[email protected]> Signed-off-by: Thierry Reding <[email protected]>
2020-01-20pwm: Implement tracing for .get_state() and .apply_state()Uwe Kleine-König1-1/+8
This allows to log all calls to the driver's lowlevel functions which simplifies debugging in some cases. Signed-off-by: Uwe Kleine-König <[email protected]> Reviewed-by: Steven Rostedt (VMware) <[email protected]> Signed-off-by: Thierry Reding <[email protected]>
2020-01-20pwm: rcar: Document inability to set duty_cycle = 0Uwe Kleine-König1-0/+3
When .apply() is called with state->duty_cycle = 0 the duty_ns parameter to rcar_pwm_set_counter() is 0 which results in ph being 0 and rcar_pwm_set_counter() returning -EINVAL. Signed-off-by: Uwe Kleine-König <[email protected]> Reviewed-by: Yoshihiro Shimoda <[email protected]> Signed-off-by: Thierry Reding <[email protected]>
2020-01-20pwm: rcar: Drop useless call to pwm_get_state()Uwe Kleine-König1-2/+0
pwm_get_state has no side effects and the resulting pwm_state is unused. So drop the call to pwm_get_state() and the local variable from rcar_pwm_apply(). The call was introduced in commit 7f68ce8287d3 ("pwm: rcar: Add support "atomic" API") and already then was useless. Signed-off-by: Uwe Kleine-König <[email protected]> Reviewed-by: Yoshihiro Shimoda <[email protected]> Signed-off-by: Thierry Reding <[email protected]>
2020-01-08pwm: Fix minor Kconfig whitespace issuesKrzysztof Kozlowski1-2/+2
Remove double whitespace after "config" keyword. Signed-off-by: Krzysztof Kozlowski <[email protected]> Signed-off-by: Thierry Reding <[email protected]>
2020-01-08pwm: atmel: Implement .get_state()Uwe Kleine-König1-0/+40
This function reads back the configured parameters from the hardware. As .apply() rounds down (mostly) I'm rounding up in .get_state() to achieve that applying a state just read from hardware is a no-op. Signed-off-by: Uwe Kleine-König <[email protected]> Acked-by: Claudiu Beznea <[email protected]> Signed-off-by: Thierry Reding <[email protected]>
2020-01-08pwm: atmel: Use register accessors for channelsUwe Kleine-König1-2/+2
This makes it a bit easier when instrumenting register access to only have to add code in one place. Signed-off-by: Uwe Kleine-König <[email protected]> Signed-off-by: Thierry Reding <[email protected]>
2020-01-08pwm: atmel: Document known weaknesses of both hardware and softwareUwe Kleine-König1-0/+10
This documents the my findings while reading through the driver and the reference manual. Signed-off-by: Uwe Kleine-König <[email protected]> Signed-off-by: Thierry Reding <[email protected]>
2020-01-08pwm: atmel: Replace loop in prescale calculation by ad-hoc calculationUwe Kleine-König1-7/+17
The calculated values are the same with the modified algorithm. The only difference is that the calculation is a bit more efficient. Acked-by: Claudiu Beznea <[email protected]> Signed-off-by: Uwe Kleine-König <[email protected]> Signed-off-by: Thierry Reding <[email protected]>
2020-01-08pwm: atmel: Use a constant for maximum prescale valueUwe Kleine-König1-5/+3
The maximal prescale value is 10 for all supported variants. So drop the member in the variant description and introduce a global constant instead. This reduces the size of the variant descriptions and the .apply() callback can be compiled a bit more effectively. Acked-by: Claudiu Beznea <[email protected]> Signed-off-by: Uwe Kleine-König <[email protected]> Signed-off-by: Thierry Reding <[email protected]>
2020-01-08pwm: atmel: Add a hint where to find hardware documentationUwe Kleine-König1-0/+3
Most Microchip (formerly Atmel) chips have publicly available manuals. A comprehensive list is already contained in the documentation folder. Reference this list in the header of the driver to allow reviewers to find the relevant manuals. Signed-off-by: Uwe Kleine-König <[email protected]> Acked-by: Nicolas Ferre <[email protected]> Signed-off-by: Thierry Reding <[email protected]>
2020-01-08pwm: mxs: Avoid a division in mxs_pwm_apply()Rasmus Villemoes1-3/+3
Since the divisor is not a compile-time constant (unless gcc somehow decided to unroll the loop PERIOD_CDIV_MAX times), this does a somewhat expensive 32/32 division. Replace that with a right shift. We still have a 64/32 division just below, but at least in that case the divisor is compile-time constant. Signed-off-by: Rasmus Villemoes <[email protected]> Reviewed-by: Uwe Kleine-König <[email protected]> Signed-off-by: Thierry Reding <[email protected]>
2020-01-08pwm: mxs: Add support for inverse polarityRasmus Villemoes1-4/+10
If I'm reading of_pwm_xlate_with_flags() right, existing device trees that set #pwm-cells = 2 will continue to work. Signed-off-by: Rasmus Villemoes <[email protected]> Signed-off-by: Thierry Reding <[email protected]>
2020-01-08pwm: mxs: Remove legacy methodsRasmus Villemoes1-77/+0
Since we now have ->apply(), these are no longer relevant. Signed-off-by: Rasmus Villemoes <[email protected]> Reviewed-by: Uwe Kleine-König <[email protected]> Signed-off-by: Thierry Reding <[email protected]>
2020-01-08pwm: mxs: Implement ->apply()Rasmus Villemoes1-0/+70
In preparation for supporting setting the polarity, switch the driver to support the ->apply() method. Signed-off-by: Rasmus Villemoes <[email protected]> Reviewed-by: Uwe Kleine-König <[email protected]> Signed-off-by: Thierry Reding <[email protected]>
2020-01-08pwm: sun4i: Add support for H6 PWMJernej Skrabec1-0/+9
Now that sun4i PWM driver supports deasserting reset line and enabling bus clock, support for H6 PWM can be added. Note that while H6 PWM has two channels, only first one is wired to output pin. Second channel is used as a clock source to companion AC200 chip which is bundled into same package. Signed-off-by: Jernej Skrabec <[email protected]> Acked-by: Uwe Kleine-König <[email protected]> Signed-off-by: Clément Péron <[email protected]> Signed-off-by: Thierry Reding <[email protected]>
2020-01-08pwm: sun4i: Add support to output source clock directlyJernej Skrabec1-2/+46
PWM core has an option to bypass whole logic and output unchanged source clock as PWM output. This is achieved by enabling bypass bit. Note that when bypass is enabled, no other setting has any meaning, not even enable bit. This mode of operation is needed to achieve high enough frequency to serve as clock source for AC200 chip which is integrated into same package as H6 SoC. Signed-off-by: Jernej Skrabec <[email protected]> Signed-off-by: Clément Péron <[email protected]> Reviewed-by: Uwe Kleine-König <[email protected]> Signed-off-by: Thierry Reding <[email protected]>
2020-01-08pwm: sun4i: Always calculate params when applying new parametersClément Péron1-29/+23
Bypass mode will require to be re-calculated when the pwm state is changed. Remove the condition so pwm_sun4i_calculate is always called. Reviewed-by: Uwe Kleine-König <[email protected]> Signed-off-by: Clément Péron <[email protected]> Signed-off-by: Thierry Reding <[email protected]>
2020-01-08pwm: sun4i: Add an optional probe for bus clockJernej Skrabec1-0/+23
H6 PWM core needs bus clock to be enabled in order to work. Add an optional probe for it. Signed-off-by: Jernej Skrabec <[email protected]> Signed-off-by: Clément Péron <[email protected]> Reviewed-by: Uwe Kleine-König <[email protected]> Signed-off-by: Thierry Reding <[email protected]>
2020-01-08pwm: sun4i: Prefer "mod" clock to unnamedClément Péron1-2/+27
New device tree bindings called the source clock of the module "mod" when several clocks are defined. Try to get a clock called "mod" if nothing is found try to get an unnamed clock. Reviewed-by: Uwe Kleine-König <[email protected]> Signed-off-by: Clément Péron <[email protected]> Signed-off-by: Thierry Reding <[email protected]>
2020-01-08pwm: sun4i: Add an optional probe for reset lineJernej Skrabec1-2/+32
H6 PWM core needs deasserted reset line in order to work. Add an optional probe for it. Signed-off-by: Jernej Skrabec <[email protected]> Reviewed-by: Uwe Kleine-König <[email protected]> Signed-off-by: Clément Péron <[email protected]> Signed-off-by: Thierry Reding <[email protected]>
2019-12-09pwm: imx27: Unconditionally write state to hardwareThierry Reding1-61/+59
The i.MX driver currently uses a shortcut and doesn't write all of the state through to the hardware when the PWM is disabled. This causes an inconsistent state to be read back by consumers with the result of them malfunctioning. Fix this by always writing the full state through to the hardware registers so that the correct state can always be read back. Tested-by: Michal Vokáč <[email protected]> Tested-by: Adam Ford <[email protected]> Signed-off-by: Thierry Reding <[email protected]>
2019-12-09pwm: imx27: Cache duty cycle register valueThierry Reding1-7/+24
The hardware register containing the duty cycle value cannot be accessed when the PWM is disabled. This causes the ->get_state() callback to read back a duty cycle value of 0, which can confuse consumer drivers. Tested-by: Michal Vokáč <[email protected]> Tested-by: Adam Ford <[email protected]> Signed-off-by: Thierry Reding <[email protected]>
2019-12-09pwm: cros-ec: Cache duty cycle valueThierry Reding1-4/+54
The ChromeOS embedded controller doesn't differentiate between disabled and duty cycle being 0. In order not to potentially confuse consumers, cache the duty cycle and return the cached value instead of the real value when the PWM is disabled. Tested-by: Enric Balletbo i Serra <[email protected]> Signed-off-by: Thierry Reding <[email protected]>
2019-12-09pwm: Read initial hardware state at request timeThierry Reding1-3/+3
Drivers that support reading the hardware state (using ->get_state()) may want to rely on per-PWM data to do so. Defer reading the hardware state for the first time until the PWM has been requested and after drivers have had a chance to allocate per-PWM data. Conceptually this is also a more natural place to read the hardware state because the PWM core doesn't need to know the hardware state of a PWM unless there is a user for it. This also ensures that the state is read everytime a user requests a PWM. If the PWM changes between users for some reason, the PWM core will reload the state from hardware and keep its copy of the state up-to-date. Tested-by: Enric Balletbo i Serra <[email protected]> Tested-by: Michal Vokáč <[email protected]> Signed-off-by: Thierry Reding <[email protected]>
2019-12-05Merge tag 'pwm/for-5.5-rc1' of ↵Linus Torvalds2-33/+84
git://git.kernel.org/pub/scm/linux/kernel/git/thierry.reding/linux-pwm Pull pwm updates from Thierry Reding: "Various changes and minor fixes across a couple of drivers" * tag 'pwm/for-5.5-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/thierry.reding/linux-pwm: pwm: stm32: Pass breakinput instead of its values pwm: stm32: Remove clutter from ternary operator pwm: stm32: Validate breakinput data from DT pwm: Update comment on struct pwm_ops::apply pwm: sun4i: Fix incorrect calculation of duty_cycle/period pwm: stm32: Add power management support pwm: stm32: Split breakinput apply routine to ease PM support dt-bindings: pwm-stm32: Document pinctrl sleep state pwm: sun4i: Drop redundant assignment to variable pval dt-bindings: pwm: mediatek: Remove gratuitous compatible string for MT7629
2019-11-11Merge 5.4-rc7 into staging-nextGreg Kroah-Hartman2-8/+2
We want the staging fixes in here, and it resolves some merge issues. Signed-off-by: Greg Kroah-Hartman <[email protected]>
2019-11-08pwm: bcm-iproc: Prevent unloading the driver module while in useUwe Kleine-König1-0/+1
The owner member of struct pwm_ops must be set to THIS_MODULE to increase the reference count of the module such that the module cannot be removed while its code is in use. Fixes: daa5abc41c80 ("pwm: Add support for Broadcom iProc PWM controller") Signed-off-by: Uwe Kleine-König <[email protected]> Reviewed-by: Florian Fainelli <[email protected]> Signed-off-by: Thierry Reding <[email protected]>
2019-10-21pwm: stm32: Pass breakinput instead of its valuesThierry Reding1-11/+8
Instead of passing the individual values of the breakpoint, pass a pointer to the breakpoint. Signed-off-by: Thierry Reding <[email protected]>
2019-10-21pwm: stm32: Remove clutter from ternary operatorThierry Reding1-12/+9
Remove usage of the ternary operator to assign values for register fields. Instead, parameterize the register and field offset macros and pass the index to them. This removes clutter and improves readability. Signed-off-by: Thierry Reding <[email protected]>
2019-10-21pwm: stm32: Validate breakinput data from DTThierry Reding1-0/+8
Both index and level can only be either 0 or 1 and the filter value is limited to values between (and including) 0 and 15. Validate that the device tree node contains values that are within these ranges. Signed-off-by: Thierry Reding <[email protected]>
2019-10-21pwm: sun4i: Fix incorrect calculation of duty_cycle/periodOndrej Jirman1-2/+2
Since 5.4-rc1, pwm_apply_state calls ->get_state after ->apply if available, and this revealed an issue with integer precision when calculating duty_cycle and period for the currently set state in ->get_state callback. This issue manifested in broken backlight on several Allwinner based devices. Previously this worked, because ->apply updated the passed state directly. Fixes: deb9c462f4e53 ("pwm: sun4i: Don't update the state for the caller of pwm_apply_state") Signed-off-by: Ondrej Jirman <[email protected]> Acked-by: Uwe Kleine-König <[email protected]> Signed-off-by: Thierry Reding <[email protected]>
2019-10-21pwm: stm32: Add power management supportFabrice Gasnier1-0/+38
Add suspend/resume PM sleep ops. When going to low power, enforce the PWM channel isn't active. Let the PWM consumers disable it during their own suspend sequence, see [1]. So, perform a check here, and handle the pinctrl states. Also restore the break inputs upon resume, as registers content may be lost when going to low power mode. [1] https://lkml.org/lkml/2019/2/5/770 Signed-off-by: Fabrice Gasnier <[email protected]> Signed-off-by: Thierry Reding <[email protected]>
2019-10-21pwm: stm32: Split breakinput apply routine to ease PM supportFabrice Gasnier1-19/+31
Split breakinput routine that configures STM32 timers 'break' safety feature upon probe, into two routines: - stm32_pwm_apply_breakinputs() sets all the break inputs into registers. - stm32_pwm_probe_breakinputs() probes the device tree break input settings before calling stm32_pwm_apply_breakinputs() This is a precursor patch to ease PM support. Registers content may get lost during low power. So, break input settings applied upon probe need to be restored upon resume (e.g. by calling stm32_pwm_apply_breakinputs()). Signed-off-by: Fabrice Gasnier <[email protected]> Signed-off-by: Thierry Reding <[email protected]>
2019-10-21pwm: sun4i: Drop redundant assignment to variable pvalColin Ian King1-1/+0
Variable pval is being assigned a value that is never read. The assignment is redundant and hence can be removed. Addresses-Coverity: ("Unused value") Signed-off-by: Colin Ian King <[email protected]> Signed-off-by: Thierry Reding <[email protected]>
2019-10-21Revert "pwm: Let pwm_get_state() return the last implemented state"Thierry Reding1-8/+1
It turns out that commit 01ccf903edd6 ("pwm: Let pwm_get_state() return the last implemented state") causes backlight failures on a number of boards. The reason is that some of the drivers do not write the full state through to the hardware registers, which means that ->get_state() subsequently does not return the correct state. Consumers which rely on pwm_get_state() returning the current state will therefore get confused and subsequently try to program a bad state. Before this change can be made, existing drivers need to be more carefully audited and fixed to behave as the framework expects. Until then, keep the original behaviour of returning the software state that was applied rather than reading the state back from hardware. Reviewed-by: Uwe Kleine-König <[email protected]> Tested-by: Enric Balletbo i Serra <[email protected]> Tested-by: Michal Vokáč <[email protected]> Signed-off-by: Thierry Reding <[email protected]>
2019-10-17bus/ti-pwmss: move TI PWMSS driver from PWM to bus subsystemDavid Lechner3-65/+0
The TI PWMSS driver is a simple bus driver for providing power power management for the PWM peripherals on TI AM33xx SoCs, namely eCAP, eHRPWM and eQEP. The eQEP is a counter rather than a PWM, so it does not make sense to have the bus driver in the PWM subsystem since the PWMSS is not exclusive to PWM devices. Signed-off-by: David Lechner <[email protected]> Signed-off-by: Jonathan Cameron <[email protected]>
2019-09-27Merge tag 'pwm/for-5.4-rc1' of ↵Linus Torvalds26-233/+528
git://git.kernel.org/pub/scm/linux/kernel/git/thierry.reding/linux-pwm Pull pwm updates from Thierry Reding: "Besides one new driver being added for the PWM controller found in various Spreadtrum SoCs, this series of changes brings a slew of, mostly minor, fixes and cleanups for existing drivers, as well as some enhancements to the core code. Lastly, Uwe is added to the PWM subsystem entry of the MAINTAINERS file, making official his role as a reviewer" * tag 'pwm/for-5.4-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/thierry.reding/linux-pwm: (34 commits) MAINTAINERS: Add myself as reviewer for the PWM subsystem MAINTAINERS: Add patchwork link for PWM entry MAINTAINERS: Add a selection of PWM related keywords to the PWM entry pwm: mediatek: Add MT7629 compatible string dt-bindings: pwm: Update bindings for MT7629 SoC pwm: mediatek: Update license and switch to SPDX tag pwm: mediatek: Use pwm_mediatek as common prefix pwm: mediatek: Allocate the clks array dynamically pwm: mediatek: Remove the has_clks field pwm: mediatek: Drop the check for of_device_get_match_data() pwm: atmel: Consolidate driver data initialization pwm: atmel: Remove unneeded check for match data pwm: atmel: Remove platform_device_id and use only dt bindings pwm: stm32-lp: Add check in case requested period cannot be achieved pwm: Ensure pwm_apply_state() doesn't modify the state argument pwm: fsl-ftm: Don't update the state for the caller of pwm_apply_state() pwm: sun4i: Don't update the state for the caller of pwm_apply_state() pwm: rockchip: Don't update the state for the caller of pwm_apply_state() pwm: Let pwm_get_state() return the last implemented state pwm: Introduce local struct pwm_chip in pwm_apply_state() ...
2019-09-26pwm: mediatek: Add MT7629 compatible stringSam Shih1-0/+6
This adds pwm support for MT7629, and separate mt7629 compatible string from mt7622 Signed-off-by: Sam Shih <[email protected]> Signed-off-by: Thierry Reding <[email protected]>
2019-09-25pwm: mediatek: Update license and switch to SPDX tagSam Shih1-5/+3
Add SPDX identifiers to pwm-mediatek.c. Update MODULE_LICENSE to correctly reflect the GNU General Public License v2.0. Signed-off-by: Ryder Lee <[email protected]> Signed-off-by: Sam Shih <[email protected]> Reviewed-by: Uwe Kleine-König <[email protected]> Signed-off-by: Thierry Reding <[email protected]>
2019-09-25pwm: mediatek: Use pwm_mediatek as common prefixSam Shih1-57/+60
Use pwm_mediatek as common prefix to match the filename. No functional change intended. Signed-off-by: Ryder Lee <[email protected]> Signed-off-by: Sam Shih <[email protected]> Acked-by: Uwe Kleine-König <[email protected]> Signed-off-by: Thierry Reding <[email protected]>
2019-09-25pwm: mediatek: Allocate the clks array dynamicallySam Shih1-35/+44
Instead of using fixed size of arrays, allocate the memory for them based on the number of PWMs specified for each SoC generation. Signed-off-by: Ryder Lee <[email protected]> Signed-off-by: Sam Shih <[email protected]> Reviewed-by: Uwe Kleine-König <[email protected]> Signed-off-by: Thierry Reding <[email protected]>
2019-09-25pwm: mediatek: Remove the has_clks fieldSam Shih1-13/+1
We can use fixed clocks to repair mt7628 PWM during configure from userspace. The SoC is legacy MIPS and has no complex clock tree. Because we can get the clock frequency for period calculation from fixed clocks specified in DT, we can remove the has_clock field, and directly use devm_clk_get() and clk_get_rate(). Signed-off-by: Ryder Lee <[email protected]> Signed-off-by: Sam Shih <[email protected]> Acked-by: Uwe Kleine-König <[email protected]> Signed-off-by: Thierry Reding <[email protected]>
2019-09-21pwm: mediatek: Drop the check for of_device_get_match_data()Sam Shih1-7/+3
This patch drop the check for of_device_get_match_data. Due to the only way call driver probe is compatible match. The data pointer which points to the SoC specify data is directly set by driver, and it should not be NULL in our case. We can safety remove the check for the result of of_device_get_match_data(). Signed-off-by: Ryder Lee <[email protected]> Signed-off-by: Sam Shih <[email protected]> Acked-by: Uwe Kleine-König <[email protected]> Signed-off-by: Thierry Reding <[email protected]>
2019-09-21pwm: atmel: Consolidate driver data initializationThierry Reding1-4/+2
This helps readability by separating the driver-specific bits from the PWM framework bits. Signed-off-by: Thierry Reding <[email protected]>