usb clock not found on imx27 when using dt

s.hauer at pengutronix.de s.hauer at pengutronix.de
Wed Nov 14 03:36:09 EST 2012


On Tue, Nov 13, 2012 at 09:43:20PM +0100, trem wrote:
> On 13/11/12 08:38, s.hauer at pengutronix.de wrote:
> >>>Please investigate in using the chipidea driver. This will be the way
> >>>forward for i.MX.
> >>
> >>I use the chipidea driver for the usb.
> >>
> >>The main issue is that the chipidea driver don't found the clock :
> >>
> >>[    0.761693] imx_usb mxc-ehci.0: Failed to get clock, err=-2
> >>[    0.767620] imx_usb: probe of mxc-ehci.0 failed with error -2
> >>
> >>The driver ci13xxx_imx request the clock in the probe function
> >>in the following line:
> >>data->clk = devm_clk_get(&pdev->dev, NULL);
> >>calling: clk = clk_get(dev, id);
> >>calling: clk_get_sys(dev_id, con_id);
> >>calling: clk_find(dev_id, con_id);
> >>with dev_id = mxc-ehci.0 and con_id = NULL
> >>This last function fail to found a clock.
> >>
> >>In the function mx27_clocks_init, several mxc-ehci.0
> >>clocks are registered, but all with a con_id.
> >>
> >>So the function clk_find fails.
> >>
> >>As I'm not really sure of the dts, I don't know if the problem
> >>is in the dts or in the driver (maybe both).
> >
> >You have to register the lookups for the chipidea driver with
> >clk_register_clkdev(). The lookups are only what the name suggests:
> >lookups. They are no clocks by themselves. This means that you have to
> >add another lookup which matches the device name.
> 
> Thanks for this help, I've added three "clocks" for the chipidea driver :
> clk_register_clkdev(clk[usb_div], NULL, "mxc-ehci.0");

That does not fit to the chipidea driver. The third argument has to
match the device name (which is the output of dev_name), so in your case
it must be something like 'imx_usb.0' (I don't know if that's correct,
please just add a printk("%s\n", dev_name(dev)); to the chipidea driver
to get the correct string)

Other than that I suggest that you read through drivers/clk/clkdev.c
to see how clock lookups are matched against devices, specifically:

/*
 * Find the correct struct clk for the device and connection ID.
 * We do slightly fuzzy matching here:
 *  An entry with a NULL ID is assumed to be a wildcard.
 *  If an entry has a device ID, it must match
 *  If an entry has a connection ID, it must match
 * Then we take the most specific entry - with the following
 * order of precedence: dev+con > dev only > con only.
 */

/**
 * clk_register_clkdev - register one clock lookup for a struct clk
 * @clk: struct clk to associate with all clk_lookups
 * @con_id: connection ID string on device
 * @dev_id: format string describing device name
 *
 * con_id or dev_id may be NULL as a wildcard, just as in the rest of
 * clkdev.
 */


> [    0.754044] usbserial: USB Serial support registered for pl2303
> [    0.762611] Unhandled fault: external abort on non-linefetch (0x008) at 0xf4424100
> [    0.770227] Internal error: : 8 [#1] PREEMPT ARM
> [    0.774861] Modules linked in:
> [    0.777950] CPU: 0    Not tainted  (3.7.0-rc5-ge917a67 #2)
> [    0.783469] PC is at ci_hdrc_probe+0xcc/0x430
> [    0.787853] LR is at devm_kzalloc+0x4c/0x64

This seems to be something else. Are you sure you are beyond the clk_get
point? I can't imagine this given the lookup you registered.

Sascha

-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |



More information about the linux-arm-kernel mailing list