ARM: kirkwood: extend the kirkwood i2s driver for DT usage
Subsystems (3)
PATCH v2 1/1 ARM: kirkwood: extend the kirkwood i2s driver for DT usage
The kirkwood i2s driver is used without DT in the Kirkwood machine. This patch adds a DT compatible definition for use in other Marvell machines as the Armada 88AP510 (Dove).
---
v2
- this patch replaces the previous
[PATCH 2/2] ARM: kirkwood: extend the kirkwood i2s driver for DT usage
- 2 possible clocks (Sebastian Hesselbarth)
- shorter io mapping (Andrew Lunn)
- less #ifdef's
--- .../devicetree/bindings/sound/kirkwood-i2s.txt | 26 +++++++++ sound/soc/kirkwood/kirkwood-i2s.c | 58 +++++++++++++++----- 2 files changed, 70 insertions(+), 14 deletions(-) create mode 100644 Documentation/devicetree/bindings/sound/kirkwood-i2s.txt
Documentation/devicetree/bindings/sound/kirkwood-i2s.txt new file +26 -0
@@ -0,0 +1,26 @@ +* Kirkwood I2S controller + +Required properties: + +- compatible: "marvell,kirkwood-i2s" +- reg: physical base address of the controller and length of memory mapped + region. +- interrupts: list of two irq numbers. + The first irq is used for data flow and the second one is used for errors. +- clocks: one or two phandles. + The first one is mandatory and defines the internal clock. + The second one is optional and defines an external clock. + +Optional property: + +- marvell,burst-size: burst size which can be only 32 or 128. + Default value is 128. + +Example: + +i2s1: audio-controller at b4000 { + compatible = "marvell,kirkwood-i2s"; + reg = <0xb4000 0x2210>; + interrupts = <21>, <22>; + clocks = <&gate_clk 13>; +};
sound/soc/kirkwood/kirkwood-i2s.c +43 -13
121 lines not on this page · raw message
Signature · 7 lines
1.7.10.4 -- Ken ar c'henta? | ** Breizh ha Linux atav! ** Jef | http://moinejf.free.fr/
PATCH v2 1/1 ARM: kirkwood: extend the kirkwood i2s driver for DT usage
Quoted 6 lines · Jean-Francois Moine
The kirkwood i2s driver is used without DT in the Kirkwood machine. This patch adds a DT compatible definition for use in other Marvell machines as the Armada 88AP510 (Dove).
Signed-off-by Jean-Francois Moine<[email protected]>---
[...]
Documentation/devicetree/bindings/sound/kirkwood-i2s.txt line 17
Quoted 4 lines
Documentation/devicetree/bindings/sound/kirkwood-i2s.txt new file +4
-0+Optional property: + +- marvell,burst-size: burst size which can be only 32 or 128. + Default value is 128.
Jean-Francois,
I still think we don't need to expose burst-size at all. Is there any SoC using a different burst-size of 128?
Quoted 31 lines
Documentation/devicetree/bindings/sound/kirkwood-i2s.txt new file +9
-0+ +Example: + +i2s1: audio-controller at b4000 { + compatible = "marvell,kirkwood-i2s"; + reg =<0xb4000 0x2210>; + interrupts =<21>,<22>; + clocks =<&gate_clk 13>; +};sound/soc/kirkwood/kirkwood-i2s.c +2
-1@@ -12,7 +12,6 @@#include <linux/init.h> #include <linux/module.h> -#include <linux/platform_device.h> #include <linux/io.h> #include <linux/slab.h> #include <linux/mbus.h> @@ -22,6 +21,8 @@#include <sound/pcm_params.h> #include <sound/soc.h> #include <linux/platform_data/asoc-kirkwood.h> +#include <linux/of.h> +#include "kirkwood.h" #define DRV_NAME "kirkwood-i2s"
sound/soc/kirkwood/kirkwood-i2s.c static int kirkwood_i2s_dev_probe(struct platform_device *pdev) · line 461
Quoted 4 lines
sound/soc/kirkwood/kirkwood-i2s.c +1
-0@@ -457,6 +458,7 @@ static int kirkwood_i2s_dev_probe(struct platform_device *pdev)struct snd_soc_dai_driver *soc_dai =&kirkwood_i2s_dai;struct kirkwood_dma_data *priv;struct resource *mem; +struct device_node *np;
struct device_node *np = pdev->dev.of_node;
and remove the assignment below.
Quoted 86 lines
sound/soc/kirkwood/kirkwood-i2s.c +31
-12int err; priv =devm_kzalloc (&pdev->dev,sizeof (*priv),GFP_KERNEL );@@ -482,24 +484,41 @@ static int kirkwood_i2s_dev_probe(struct platform_device *pdev)return -ENXIO ; } -if (!data) { -dev_err (&pdev->dev,"no platform data ?!\n" ); -return -EINVAL ; - } +/* get the DT or static parameters */ + np = pdev->dev.of_node; +if (np) { +u32 val; + +if (of_property_read_u32 (np,"marvell,burst-size" ,&val)) { + val =128 ;/* default value */ + }else if (val !=32 && val !=128 ) { +dev_err (&pdev->dev, +"'marvell,burst-size' can be only 32 or 128\n" ); +return -EINVAL ; + } + priv->burst = val; + priv->clk =of_clk_get (np,0 );/* internal clock */ + priv->extclk =of_clk_get (np,1 );/* optional external clock */ + }else { +if (!data) { +dev_err (&pdev->dev,"no platform data ?!\n" ); +return -EINVAL ; + } + priv->burst = data->burst; - priv->burst = data->burst; + priv->clk =clk_get (&pdev->dev,NULL ); + priv->extclk =clk_get (&pdev->dev,"extclk" ); + } - priv->clk =devm_clk_get (&pdev->dev,NULL );if (IS_ERR (priv->clk)) {dev_err (&pdev->dev,"no clock\n" ); -return PTR_ERR (priv->clk); + err =PTR_ERR (priv->clk); + goto error; } - err =clk_prepare_enable (priv->clk);if (err<0 ) -return err; + goto error; - priv->extclk =clk_get (&pdev->dev,"extclk" );if (!IS_ERR (priv->extclk)) {if (priv->extclk == priv->clk) {clk_put (priv->extclk);@@ -516,7 +535,7 @@ static int kirkwood_i2s_dev_probe(struct platform_device *pdev) priv->ctl_rec =KIRKWOOD_RECCTL_SIZE_24 ;/* Select the burst size */ -if (data->burst ==32 ) { +if (priv->burst ==32 ) { priv->ctl_play |=KIRKWOOD_PLAYCTL_BURST_32 ; priv->ctl_rec |=KIRKWOOD_RECCTL_BURST_32 ; }else {@@ -528,12 +547,13 @@ static int kirkwood_i2s_dev_probe(struct platform_device *pdev)if (!err)return 0 ;dev_err (&pdev->dev,"snd_soc_register_dai failed\n" ); - +error:if (!IS_ERR (priv->extclk)) {clk_disable_unprepare (priv->extclk);clk_put (priv->extclk); }clk_disable_unprepare (priv->clk); +clk_put (priv->clk);return err; }@@ -549,16 +569,26 @@ static int kirkwood_i2s_dev_remove(struct platform_device *pdev)clk_put (priv->extclk); }clk_disable_unprepare (priv->clk); +clk_put (priv->clk);return 0 ;
sound/soc/kirkwood/kirkwood-i2s.c static int kirkwood_i2s_dev_remove(struct platform_device *pdev) · line 584
Quoted 10 lines
sound/soc/kirkwood/kirkwood-i2s.c +8
-0} +#ifdef CONFIG_OF +static struct of_device_id kirkwood_i2s_of_match[] = { + { .compatible ="marvell,kirkwood-i2s" }, + { } +}; +MODULE_DEVICE_TABLE (of, kirkwood_i2s_of_match); +#endif +
What about kirkwood-dma? We don't want to have that as another DT node. IMHO both kirkwood-dma and kirkwood-i2s should be merged into one file, then dma can be initialized by a common probe function.
Sebastian
Quoted 10 lines
sound/soc/kirkwood/kirkwood-i2s.c +1
-0static struct platform_driver kirkwood_i2s_driver = { .probe = kirkwood_i2s_dev_probe, .remove = kirkwood_i2s_dev_remove, .driver = { .name =DRV_NAME , .owner =THIS_MODULE , + .of_match_table =of_match_ptr (kirkwood_i2s_of_match), }, };