Clock problems in i.MX27 Visstrim M10 (linux-3.5-rc5).

javier Martin javier.martin at vista-silicon.com
Wed Jul 4 04:49:43 EDT 2012


On 4 July 2012 10:35, Sascha Hauer <s.hauer at pengutronix.de> wrote:
> On Wed, Jul 04, 2012 at 10:30:40AM +0200, javier Martin wrote:
>> On 4 July 2012 09:48, javier Martin <javier.martin at vista-silicon.com> wrote:
>> > Hi,
>> >
>> > On 3 July 2012 15:13, Fabio Estevam <festevam at gmail.com> wrote:
>> >> Hi Javier,
>> >>
>> >> On Tue, Jul 3, 2012 at 8:09 AM, javier Martin
>> >> <javier.martin at vista-silicon.com> wrote:
>> >>> Hi,
>> >>> I've found the following problems in linux-3.5-rc5
>> >>> (6887a4131da3adaab011613776d865f4bcfb5678) in our Visstrim M10 board:
>> >>
>> >> Could you please try the two attached patches?
>> >>
>> >> They should fix the dma and mx2-camera issues.
>> >>
>> >> I will try to look at the ssi problem, but my mx27pdk board still does
>> >> not have audio supported.
>> >>
>> >> Regards,
>> >>
>> >
>> > thanks for the patches. The first one solves the issue with the audio.
>> > Now I can do an aplay properly too.
>> >
>> > However, second patch for the mx2-camera seems that it's not right
>> > yet. I get a timeout here:
>> >
>> > static int mx27_camera_emma_prp_reset(struct mx2_camera_dev *pcdev)
>> > {
>> >         u32 cntl;
>> >         int count = 0;
>> >
>> >         cntl = readl(pcdev->base_emma + PRP_CNTL);
>> >         writel(PRP_CNTL_SWRST, pcdev->base_emma + PRP_CNTL);
>> >         while (count++ < 100) {
>> >                 if (!(readl(pcdev->base_emma + PRP_CNTL) & PRP_CNTL_SWRST))
>> >                         return 0;
>> >                 barrier();
>> >                 udelay(1);
>> >         }
>> >
>> >         return -ETIMEDOUT;
>> > }
>> >
>> > Keeping this in mind I infer that probably emma clocks have not been
>> > properly enabled.
>> >
>>
>> The problem is that in 'clk-imx27.c' the clocks for the emma are
>> defined as follows:
>>
>>       clk_register_clkdev(clk[emma_ahb_gate], "ahb", "imx-emma");
>>       clk_register_clkdev(clk[emma_ipg_gate], "ipg", "imx-emma");
>>
>> However, in the patch you submitted they are requested as shown:
>>
>>       pcdev->clk_emma_ipg = devm_clk_get(&pdev->dev, "ipg");
>>       if (IS_ERR(pcdev->clk_emma_ipg)) {
>>               err = PTR_ERR(pcdev->clk_emma_ipg);
>>               goto exit_kfree;
>>       }
>>
>>       pcdev->clk_emma_ahb = devm_clk_get(&pdev->dev, "ahb");
>>       if (IS_ERR(pcdev->clk_emma_ahb)) {
>>               err = PTR_ERR(pcdev->clk_emma_ahb);
>>               goto exit_kfree;
>>       }
>>
>> Which means the dev_id used is "mx2-camera.0" instead of "imx-emma".
>> We cannot change the name in 'clk-imx27.c' to "mx2-camera.0" since
>> there is another device "mx2_emmaprp.c" which uses these clocks,
>> unless two different names can be associated with the same clock.
>
> This can be done just by calling clk_register_clkdev again with the
> second name and this is also the preferred way of associating the same
> clock to different devices.
>
> Sascha
>

So, we would have:

	clk_register_clkdev(clk[csi_ahb_gate], NULL, "mx2-camera.0");
	...
        clk_register_clkdev(clk[emma_ahb_gate], "ahb", "mx2-camera.0");
	clk_register_clkdev(clk[emma_ipg_gate], "ipg", "mx2-camera.0");
	clk_register_clkdev(clk[emma_ahb_gate], "ahb", "m2m-emmaprp.0");
	clk_register_clkdev(clk[emma_ipg_gate], "ipg", "m2m-emmaprp.0"));

And in mx2_camera.c:

	pcdev->clk_csi = devm_clk_get(&pdev->dev, NULL);
	if (IS_ERR(pcdev->clk_csi)) {
		dev_err(&pdev->dev, "Could not get csi clock\n");
		err = PTR_ERR(pcdev->clk_csi);
		goto exit_kfree;
	}

        pcdev->clk_emma_ipg = devm_clk_get(&pdev->dev, "ipg");
        if (IS_ERR(pcdev->clk_emma_ipg)) {
                err = PTR_ERR(pcdev->clk_emma_ipg);
                goto exit_kfree;
        }

        pcdev->clk_emma_ahb = devm_clk_get(&pdev->dev, "ahb");
        if (IS_ERR(pcdev->clk_emma_ahb)) {
                err = PTR_ERR(pcdev->clk_emma_ahb);
                goto exit_kfree;
        }

In this case, can we guarantee that the framework is able to tell the
difference between "csi_ahb_gate" and "emma_ahb_gate",
"emma_ipg_gate"? For instance, for requesting 'clk_csi' we use:

devm_clk_get(&pdev->dev, NULL);

since 'NULL' is handled as a wildcard, how can we make sure that we
are not requesting 'emma_ahb_gate' or 'emma_ipg_gate' instead?

-- 
Javier Martin
Vista Silicon S.L.
CDTUC - FASE C - Oficina S-345
Avda de los Castros s/n
39005- Santander. Cantabria. Spain
+34 942 25 32 60
www.vista-silicon.com



More information about the linux-arm-kernel mailing list