lkml.org 
[lkml]   [2013]   [Jun]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectRe: [PATCH 1/2] i2c: omap: convert to module_platform_driver()
    Hi Kevin,
    On 06/03/2013 11:59 PM, Kevin Hilman wrote:
    > Grygorii Strashko <grygorii.strashko@ti.com> writes:
    >
    >> The OMAP I2C driver has a relation to pinctrl-single driver. As result,
    >> its probe will be deferred during system boot until late init time,
    >> because the pinctrl-single is initizalized as moudle/device init time.
    >> This, in turn, will delay initialization of all I2C devices (like mfd,
    >> I2C regulators and etc.) and cause boot delay (more over, it can broken
    >> initialization of drivers which are not ready to use deferred probe
    >> mechanism yet, for example DSS).
    >>
    >> There are no sense to keep OMAP I2C initialization on subsys init layer
    >> any more, hence shift it to module/device layer where the i2c <-->
    >> pinctrl-single dependency is resolved in drivers/Makefile now.
    >>
    >> Cc: Wolfram Sang <wsa@the-dreams.de>
    >> Cc: "Ben Dooks (embedded platforms)" <ben-linux@fluff.org>
    >> Cc: Santosh Shilimkar <santosh.shilimkar@ti.com>
    >> Cc: linux-omap@vger.kernel.org
    >> Cc: linux-i2c@vger.kernel.org
    >> Cc: linux-kernel@vger.kernel.org
    >>
    >> Signed-off-by: Grygorii Strashko <grygorii.strashko@ti.com>
    > Testing this patch with PATCH 1/2, the twl_rtc driver fails to correctly
    > initialize on OMAP3:
    >
    > twl_rtc rtc.22: hctosys: invalid date/time
    >
    > instead of the expected result:
    >
    > twl_rtc rtc.22: setting system clock to 2000-01-01 00:00:00 UTC (946684800)
    >
    > so something is still not right for the init sequence.
    >
    > Kevin
    I think, the root cause of the problem isn't this patch - it's just yet
    another side effect
    of using deferred probes :). I've taken a look on twl-rtc code and found
    possible error place
    static int __init twl_rtc_init(void)
    {
    if (twl_class_is_4030()) <------ here,
    rtc_reg_map = (u8 *) twl4030_rtc_reg_map;
    else
    rtc_reg_map = (u8 *) twl6030_rtc_reg_map;

    return platform_driver_register(&twl4030rtc_driver);
    }
    In drivers/Makefile:
    obj-$(CONFIG_RTC_LIB) += rtc/ <------ RTC is placed before I2C
    obj-y += i2c/ media/ <----- and only here I2C bus
    instantiates TWL-core device
    and configures twl_priv->twl_id

    Thats why it's working on my OMAP4/twl6030 board. Could you check if
    below fix will work on OMAP3:
    diff --git a/drivers/rtc/rtc-twl.c b/drivers/rtc/rtc-twl.c
    index 8751a52..aaa5015 100644
    --- a/drivers/rtc/rtc-twl.c
    +++ b/drivers/rtc/rtc-twl.c
    @@ -469,6 +469,11 @@ static int twl_rtc_probe(struct platform_device *pdev)
    if (irq <= 0)
    goto out1;

    + if (twl_class_is_4030())
    + rtc_reg_map = (u8 *) twl4030_rtc_reg_map;
    + else
    + rtc_reg_map = (u8 *) twl6030_rtc_reg_map;
    +
    ret = twl_rtc_read_u8(&rd_reg, REG_RTC_STATUS_REG);
    if (ret < 0)
    goto out1;
    @@ -610,11 +615,6 @@ static struct platform_driver twl4030rtc_driver = {

    static int __init twl_rtc_init(void)
    {
    - if (twl_class_is_4030())
    - rtc_reg_map = (u8 *) twl4030_rtc_reg_map;
    - else
    - rtc_reg_map = (u8 *) twl6030_rtc_reg_map;
    -
    return platform_driver_register(&twl4030rtc_driver);
    }
    module_init(twl_rtc_init);
    Unfortunately, I have no OMAP3 HW and can't check it.

    Regards,
    -grygorii




    \
     
     \ /
      Last update: 2013-06-04 14:21    [W:7.263 / U:0.024 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site