Message ID | 1441086101-15303-3-git-send-email-songjun.wu@atmel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Tue, Sep 01, 2015 at 01:41:41PM +0800, Songjun Wu wrote: > +classd: classd@fc048000 { > + compatible = "atmel,sama5d2-classd"; > + reg = <0xfc048000 0x100>; > + interrupts = <59 IRQ_TYPE_LEVEL_HIGH 7>; > + dmas = <&dma0 > + (AT91_XDMAC_DT_MEM_IF(0) | AT91_XDMAC_DT_PER_IF(1) > + | AT91_XDMAC_DT_PERID(47))>; > + dma-names = "tx"; > + clocks = <&classd_clk>, <&classd_gclk>, <&audio_pll_pmc>; > + clock-names = "pclk", "gclk", "aclk"; > + > + pinctrl-names = "default"; > + pinctrl-0 = <&pinctrl_classd_default>; > + atmel,pwm-type = "diff"; > + atmel,non-overlap-time = <10>; > +}; > +Example: > +sound { > + compatible = "atmel,asoc-classd"; > + > + atmel,model = "classd @ SAMA5D2-Xplained"; > + atmel,audio-platform = <&classd>; > + atmel,audio-cpu-dai-name = "fc048000.classd"; > + atmel,audio-codec = <&classd>; > +}; Why is this a separate DT node? It seems that this IP is entirely self contained so I'm not clear why we need a separate node for the card, the card is usually a separate node because it ties together multiple different devices in the system but that's not the case here.
On 9/3/2015 19:43, Mark Brown wrote: > On Tue, Sep 01, 2015 at 01:41:41PM +0800, Songjun Wu wrote: > >> +classd: classd@fc048000 { >> + compatible = "atmel,sama5d2-classd"; >> + reg = <0xfc048000 0x100>; >> + interrupts = <59 IRQ_TYPE_LEVEL_HIGH 7>; >> + dmas = <&dma0 >> + (AT91_XDMAC_DT_MEM_IF(0) | AT91_XDMAC_DT_PER_IF(1) >> + | AT91_XDMAC_DT_PERID(47))>; >> + dma-names = "tx"; >> + clocks = <&classd_clk>, <&classd_gclk>, <&audio_pll_pmc>; >> + clock-names = "pclk", "gclk", "aclk"; >> + >> + pinctrl-names = "default"; >> + pinctrl-0 = <&pinctrl_classd_default>; >> + atmel,pwm-type = "diff"; >> + atmel,non-overlap-time = <10>; >> +}; > >> +Example: >> +sound { >> + compatible = "atmel,asoc-classd"; >> + >> + atmel,model = "classd @ SAMA5D2-Xplained"; >> + atmel,audio-platform = <&classd>; >> + atmel,audio-cpu-dai-name = "fc048000.classd"; >> + atmel,audio-codec = <&classd>; >> +}; > > Why is this a separate DT node? It seems that this IP is entirely self > contained so I'm not clear why we need a separate node for the card, the > card is usually a separate node because it ties together multiple > different devices in the system but that's not the case here. > The classD can finish the audio function without other devices. But I want to reuse the code in ASoC, leave many things(like creating PCM, DMA operations) to ASoC, then the driver can only focus on how to configure classD. The classD IP is divided to tree parts logically, platform, CPU dai, and codec, and these parts are registered to ASoC. This separate DT node is needed in ASoC, ties these tree parts in ClassD.
On Sun, Sep 06, 2015 at 05:44:30PM +0800, Wu, Songjun wrote: > On 9/3/2015 19:43, Mark Brown wrote: > >Why is this a separate DT node? It seems that this IP is entirely self > >contained so I'm not clear why we need a separate node for the card, the > >card is usually a separate node because it ties together multiple > >different devices in the system but that's not the case here. > The classD can finish the audio function without other devices. > But I want to reuse the code in ASoC, leave many things(like creating PCM, > DMA operations) to ASoC, then the driver can only focus on how to configure > classD. > The classD IP is divided to tree parts logically, platform, CPU dai, > and codec, and these parts are registered to ASoC. > This separate DT node is needed in ASoC, ties these tree parts in ClassD. Sure, there's no problem at all having that structure in software but it should be possible to do this without having to represent this structure in DT. It should be possible to register the card at the same time as the rest of the components rather than needing the separate device in the DT.
On 9/8/2015 00:25, Mark Brown wrote: > On Sun, Sep 06, 2015 at 05:44:30PM +0800, Wu, Songjun wrote: >> On 9/3/2015 19:43, Mark Brown wrote: > >>> Why is this a separate DT node? It seems that this IP is entirely self >>> contained so I'm not clear why we need a separate node for the card, the >>> card is usually a separate node because it ties together multiple >>> different devices in the system but that's not the case here. > >> The classD can finish the audio function without other devices. >> But I want to reuse the code in ASoC, leave many things(like creating PCM, >> DMA operations) to ASoC, then the driver can only focus on how to configure >> classD. >> The classD IP is divided to tree parts logically, platform, CPU dai, >> and codec, and these parts are registered to ASoC. > >> This separate DT node is needed in ASoC, ties these tree parts in ClassD. > > Sure, there's no problem at all having that structure in software but it > should be possible to do this without having to represent this structure > in DT. It should be possible to register the card at the same time as > the rest of the components rather than needing the separate device in > the DT. > Do you mean using a single entry in the DT for the whole classD system and instantiate ASoC components from it. For now, there are two entry, they could be combined to one entry.
On Tue, Sep 08, 2015 at 05:36:13PM +0800, Wu, Songjun wrote: > On 9/8/2015 00:25, Mark Brown wrote: > >Sure, there's no problem at all having that structure in software but it > >should be possible to do this without having to represent this structure > >in DT. It should be possible to register the card at the same time as > >the rest of the components rather than needing the separate device in > >the DT. > Do you mean using a single entry in the DT for the whole classD system and > instantiate ASoC components from it. > For now, there are two entry, they could be combined to one entry. Yes, exactly.
On 9/8/2015 20:23, Mark Brown wrote: > On Tue, Sep 08, 2015 at 05:36:13PM +0800, Wu, Songjun wrote: >> On 9/8/2015 00:25, Mark Brown wrote: > >>> Sure, there's no problem at all having that structure in software but it >>> should be possible to do this without having to represent this structure >>> in DT. It should be possible to register the card at the same time as >>> the rest of the components rather than needing the separate device in >>> the DT. > >> Do you mean using a single entry in the DT for the whole classD system and >> instantiate ASoC components from it. >> For now, there are two entry, they could be combined to one entry. > > Yes, exactly. > Accept. the two entries will be combined to one entry.
On 9/8/2015 20:23, Mark Brown wrote: > On Tue, Sep 08, 2015 at 05:36:13PM +0800, Wu, Songjun wrote: >> On 9/8/2015 00:25, Mark Brown wrote: > >>> Sure, there's no problem at all having that structure in software but it >>> should be possible to do this without having to represent this structure >>> in DT. It should be possible to register the card at the same time as >>> the rest of the components rather than needing the separate device in >>> the DT. > >> Do you mean using a single entry in the DT for the whole classD system and >> instantiate ASoC components from it. >> For now, there are two entry, they could be combined to one entry. > > Yes, exactly. > I try to use one entry, but there is a problem. It's about 'driver_data' in struct device. In function snd_soc_register_card, the parameter 'card' will be set to 'driver_data' by the code 'dev_set_drvdata(card->dev, card)'. Then some resources(eg. regmap, clock) also need be recorded by 'driver_data'. One entry could only has one 'driver_data'. I think the best way is to create two entries, like the current dts. What's your opinion?
On Tue, Sep 15, 2015 at 11:11:53AM +0800, Wu, Songjun wrote: > I try to use one entry, but there is a problem. > It's about 'driver_data' in struct device. > In function snd_soc_register_card, the parameter 'card' will be set to > 'driver_data' by the code 'dev_set_drvdata(card->dev, card)'. > Then some resources(eg. regmap, clock) also need be recorded by > 'driver_data'. One entry could only has one 'driver_data'. I think the best > way is to create two entries, like the current dts. > What's your opinion? Look at the recently applied sunxi driver for an example of how to do this - it's a similar piece of hardware (entirely in the SoC and so on).
On 9/17/2015 03:42, Mark Brown wrote: > On Tue, Sep 15, 2015 at 11:11:53AM +0800, Wu, Songjun wrote: > >> I try to use one entry, but there is a problem. >> It's about 'driver_data' in struct device. >> In function snd_soc_register_card, the parameter 'card' will be set to >> 'driver_data' by the code 'dev_set_drvdata(card->dev, card)'. >> Then some resources(eg. regmap, clock) also need be recorded by >> 'driver_data'. One entry could only has one 'driver_data'. I think the best >> way is to create two entries, like the current dts. >> What's your opinion? > > Look at the recently applied sunxi driver for an example of how to do > this - it's a similar piece of hardware (entirely in the SoC and so on). > Thank you, It really helps me. I will make a second version soon.
diff --git a/Documentation/devicetree/bindings/sound/atmel-classd.txt b/Documentation/devicetree/bindings/sound/atmel-classd.txt new file mode 100644 index 0000000..29d181a --- /dev/null +++ b/Documentation/devicetree/bindings/sound/atmel-classd.txt @@ -0,0 +1,73 @@ +* Atmel ClassD driver under ALSA SoC architecture + +* Atmel ClassD driver +Required properties: +- compatible + Should be "atmel,sama5d2-classd". +- reg + Should contain ClassD registers location and length. +- interrupts + Should contain the IRQ line for the ClassD. +- dmas + One DMA specifiers as described in atmel-dma.txt and dma.txt files. +- dma-names + Must be "tx". +- clock-names + tuple listing input clock names. + Required elements: "pclk", "gclk" and "aclk". +- clocks + phandles to input clocks. + +Optional properties: +- pinctrl-names, pinctrl-0 + Please refer to pinctrl-bindings.txt. +- atmel,pwm-type + PWM modulation type, "single" or "diff". +- atmel,non-overlap-time + Set non-overlapping time, the unit is nanosecond(ns). + There are four values, + <5>, <10>, <15>, <20>, the default value is <10>. + Non-overlapping will be disabled if not specified. + +Example: +classd: classd@fc048000 { + compatible = "atmel,sama5d2-classd"; + reg = <0xfc048000 0x100>; + interrupts = <59 IRQ_TYPE_LEVEL_HIGH 7>; + dmas = <&dma0 + (AT91_XDMAC_DT_MEM_IF(0) | AT91_XDMAC_DT_PER_IF(1) + | AT91_XDMAC_DT_PERID(47))>; + dma-names = "tx"; + clocks = <&classd_clk>, <&classd_gclk>, <&audio_pll_pmc>; + clock-names = "pclk", "gclk", "aclk"; + + pinctrl-names = "default"; + pinctrl-0 = <&pinctrl_classd_default>; + atmel,pwm-type = "diff"; + atmel,non-overlap-time = <10>; +}; + + +* Atmel ASoC driver with ClassD +Required properties: +- compatible + Should be "atmel,asoc-classd". +- atmel,model + The user-visible name of this sound complex. +- atmel,audio-platform + Should be <&classd>. +- atmel,audio-cpu-dai-name + The name of the CPU DAI in ALSA SoC architecture. + The format is <classd registers location>.classd. +- atmel,audio-codec + Should be <&classd>. + +Example: +sound { + compatible = "atmel,asoc-classd"; + + atmel,model = "classd @ SAMA5D2-Xplained"; + atmel,audio-platform = <&classd>; + atmel,audio-cpu-dai-name = "fc048000.classd"; + atmel,audio-codec = <&classd>; +};
DT binding documentation for this new ASoC driver. Signed-off-by: Songjun Wu <songjun.wu@atmel.com> --- .../devicetree/bindings/sound/atmel-classd.txt | 73 ++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 Documentation/devicetree/bindings/sound/atmel-classd.txt