Skip to content
  • Nishanth Menon's avatar
    hwmon: (gpio-fan) Move the thermal registration after registration is complete · e76ea261
    Nishanth Menon authored
    Thermal framework may already be ready and cooling policies might
    already be functional when we are attempting to register gpio fan as
    a cooling device. This can be reproduced by changing probe order in
    which registration of various modules are done in a system. In such
    a case, kernel generates an oops since the data structures are not
    completely populated with the wrong assumption that thermal framework
    is not yet ready. Fix this by reordering the thermal framework
    registration to occur after hwmon registration of the fan is complete.
    
    Example kernel oops:
    [  149.005828] Unable to handle kernel NULL pointer dereference at virtual address 0000008c
    [  149.014369] pgd = ecf48000
    [  149.017204] [0000008c] *pgd=ac065831, *pte=00000000, *ppte=00000000
    [  149.023820] Internal error: Oops: 17 [#1] SMP ARM
    [  149.028745] Modules linked in: gpio_fan(+) cpufreq_dt ipv6 evdev leds_gpio led_class omap_wdt phy_omap_usb2 rtc_palmas palmas_pwrbutton tmp102 ti_soc_thermal dwc3_omap thermal_sys extcon rtc_omap rtc_ds1307 hwmon
    [  149.048629] CPU: 1 PID: 1183 Comm: modprobe Not tainted 4.0.0-rc7-next-20150407-00002-g7a82da074c99 #3
    [  149.058383] Hardware name: Generic DRA74X (Flattened Device Tree)
    [  149.064763] task: edec1240 ti: ec0e0000 task.ti: ec0e0000
    [  149.070421] PC is at dev_driver_string+0x0/0x38
    [  149.075165] LR is at __dev_printk+0x24/0x70
    [  149.079540] pc : [<c03d6cd0>]    lr : [<c03d72c4>]    psr: 20000013
    [  149.079540] sp : ec0e1c28  ip : edec1240  fp : 00000000
    [  149.091568] r10: edf3eee0  r9 : 00000000  r8 : ffffffff
    [  149.097040] r7 : edf3eea0  r6 : 00000034  r5 : 00000010  r4 : ec0e1c44
    [  149.103871] r3 : ec0e1c4c  r2 : ec0e1c44  r1 : c079d800  r0 : 00000010
    [  149.110709] Flags: nzCv  IRQs on  FIQs on  Mode SVC_32  ISA ARM  Segment user
    [  149.118182] Control: 10c5387d  Table: acf4806a  DAC: 00000015
    [  149.124198] Process modprobe (pid: 1183, stack limit = 0xec0e0218)
    [  149.130673] Stack: (0xec0e1c28 to 0xec0e2000)
    [  149.135235] 1c20:                   60000013 c05e2ae0 00000000 edf3ec00 ec934a10 c03d73d4
    ...
    [  149.392230] 1fe0: befe1888 befe1878 00019418 b6ea08f0 80000010 00000003 00000000 00000000
    [  149.400798] [<c03d6cd0>] (dev_driver_string) from [<c03d72c4>] (__dev_printk+0x24/0x70)
    [  149.409193] [<c03d72c4>] (__dev_printk) from [<c03d73d4>] (dev_warn+0x34/0x48)
    [  149.416767] [<c03d73d4>] (dev_warn) from [<bf0f54fc>] (get_fan_speed_index+0x94/0xa4 [gpio_fan])
    [  149.425980] [<bf0f54fc>] (get_fan_speed_index [gpio_fan]) from [<bf0f5524>] (gpio_fan_get_cur_state+0x18/0x30 [gpio_fan])
    [  149.437476] [<bf0f5524>] (gpio_fan_get_cur_state [gpio_fan]) from [<bf02767c>] (thermal_zone_trip_update+0xe8/0x2a4 [thermal_sys])
    [  149.449794] [<bf02767c>] (thermal_zone_trip_update [thermal_sys]) from [<bf027844>] (step_wise_throttle+0xc/0x74 [thermal_sys])
    [  149.461832] [<bf027844>] (step_wise_throttle [thermal_sys]) from [<bf024ff4>] (handle_thermal_trip+0x5c/0x188 [thermal_sys])
    [  149.473603] [<bf024ff4>] (handle_thermal_trip [thermal_sys]) from [<bf0256c4>] (thermal_zone_device_update+0x94/0x108 [thermal_sys])
    [  149.486104] [<bf0256c4>] (thermal_zone_device_update [thermal_sys]) from [<bf026470>] (__thermal_cooling_device_register+0x2e8/0x374 [thermal_sys])
    [  149.499956] [<bf026470>] (__thermal_cooling_device_register [thermal_sys]) from [<bf0f58e4>] (gpio_fan_probe+0x350/0x4d0 [gpio_fan])
    [  149.512438] [<bf0f58e4>] (gpio_fan_probe [gpio_fan]) from [<c03db8a0>] (platform_drv_probe+0x48/0x98)
    [  149.522109] [<c03db8a0>] (platform_drv_probe) from [<c03da30c>] (driver_probe_device+0x1b0/0x26c)
    [  149.531399] [<c03da30c>] (driver_probe_device) from [<c03da45c>] (__driver_attach+0x94/0x98)
    [  149.540238] [<c03da45c>] (__driver_attach) from [<c03d8bb0>] (bus_for_each_dev+0x54/0x88)
    [  149.548814] [<c03d8bb0>] (bus_for_each_dev) from [<c03d9a34>] (bus_add_driver+0xdc/0x1d4)
    [  149.557381] [<c03d9a34>] (bus_add_driver) from [<c03dac30>] (driver_register+0x78/0xf4)
    [  149.565765] [<c03dac30>] (driver_register) from [<c0009784>] (do_one_initcall+0x80/0x1d8)
    [  149.574340] [<c0009784>] (do_one_initcall) from [<c00c2278>] (do_init_module+0x5c/0x1b8)
    [  149.582833] [<c00c2278>] (do_init_module) from [<c00c3bbc>] (load_module+0x1720/0x1dcc)
    [  149.591212] [<c00c3bbc>] (load_module) from [<c00c43d0>] (SyS_finit_module+0x68/0x6c)
    [  149.599418] [<c00c43d0>] (SyS_finit_module) from [<c000f3c0>] (ret_fast_syscall+0x0/0x4c)
    [  149.607994] Code: 15830000 e1a00006 e28dd008 e8bd8070 (e590307c)
    
    Cc: Eduardo Valentin <edubezval@gmail.com>
    Fixes: b5cf88e4
    
     ("(gpio-fan): Add thermal control hooks")
    Signed-off-by: default avatarNishanth Menon <nm@ti.com>
    Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
    e76ea261