Ticket #79: preserve_gps_pwrstate_gta01.patch

File preserve_gps_pwrstate_gta01.patch, 2.8 KB (added by mwester@…, 11 years ago)

Preserve the GPS power state over suspend/resume - temporary patch

  • arch/arm/plat-s3c24xx/neo1973_pm_gps.c

    old new  
    3030#include <linux/pcf50633.h> 
    3131#endif 
    3232 
     33struct pm_gps_info { 
     34        int saved_state;      /* Saved power status for suspend/resume */ 
     35}; 
     36 
    3337/* This is the 2.8V supply for the RTC crystal, the mail clock crystal and 
    3438 * the input to VDD_RF */ 
    3539static void gps_power_2v8_set(int on) 
     
    385389 
    386390static void gps_power_sequence_up(void) 
    387391{ 
     392        printk(KERN_ERR "%s: powering up GPS\n", __FUNCTION__ ); 
    388393        /* According to PMB2520 Data Sheet, Rev. 2006-06-05, 
    389394         * Chapter 4.2.2 */ 
    390395 
     
    420425 
    421426static void gps_power_sequence_down(void) 
    422427{ 
     428        printk(KERN_ERR "%s: powering down GPS\n", __FUNCTION__ ); 
    423429        /* According to PMB2520 Data Sheet, Rev. 2006-06-05, 
    424430         * Chapter 4.2.3.1 */ 
    425431        gps_pwron_set(0); 
     
    477483                                pm_message_t state) 
    478484{ 
    479485#ifdef CONFIG_MACH_NEO1973_GTA01 
     486        struct pm_gps_info *gpsinfo = dev_get_drvdata(&pdev->dev); 
    480487        if (machine_is_neo1973_gta01()) { 
    481488                /* FIXME */ 
     489                gpsinfo->saved_state = 
     490                        s3c2410_gpio_getpin(GTA01_GPIO_GPS_PWRON); 
    482491                gps_power_sequence_down(); 
    483492        } 
    484493#endif /* CONFIG_MACH_NEO1973_GTA01 */ 
     
    497506static int gta01_pm_gps_resume(struct platform_device *pdev) 
    498507{ 
    499508#ifdef CONFIG_MACH_NEO1973_GTA01 
     509        struct pm_gps_info *gpsinfo = dev_get_drvdata(&pdev->dev); 
    500510        if (machine_is_neo1973_gta01()) { 
    501511                /* FIXME */ 
    502                 gps_power_sequence_up(); 
     512                if (gpsinfo->saved_state) 
     513                        gps_power_sequence_up(); 
     514                else 
     515                        printk(KERN_ERR "%s: leaving GPS powered down\n", 
     516                               __FUNCTION__ ); 
     517 
    503518        } 
    504519#endif /* CONFIG_MACH_NEO1973_GTA01 */ 
    505520 
     
    547562static int __init gta01_pm_gps_probe(struct platform_device *pdev) 
    548563{ 
    549564#ifdef CONFIG_MACH_NEO1973_GTA01 
     565        int rc; 
     566        struct pm_gps_info *gpsinfo; 
     567 
    550568        if (machine_is_neo1973_gta01()) { 
    551569                s3c2410_gpio_cfgpin(GTA01_GPIO_GPS_PWRON, S3C2410_GPIO_OUTPUT); 
    552570 
     
    591609                        break; 
    592610                } 
    593611 
    594                 return sysfs_create_group(&pdev->dev.kobj, &gta01_gps_attr_group); 
     612                rc = sysfs_create_group(&pdev->dev.kobj, &gta01_gps_attr_group); 
     613                if (rc < 0) 
     614                        return rc; 
     615                gpsinfo = kzalloc(sizeof(*gpsinfo), GFP_KERNEL); 
     616                if (!gpsinfo) { 
     617                        printk(KERN_ERR "%s: ENOMEM while probing pm_gps\n", 
     618                               __FUNCTION__ ); 
     619                        return -ENOMEM; 
     620                } 
     621                dev_set_drvdata(&pdev->dev, gpsinfo); 
     622                return rc; 
    595623        } 
    596624#endif /* CONFIG_MACH_NEO1973_GTA01 */ 
    597625 
     
    626654static int gta01_pm_gps_remove(struct platform_device *pdev) 
    627655{ 
    628656#ifdef CONFIG_MACH_NEO1973_GTA01 
     657        struct pm_gps_info *gpsinfo = dev_get_drvdata(&pdev->dev); 
    629658        if (machine_is_neo1973_gta01()) { 
    630659                gps_power_sequence_down(); 
    631660                sysfs_remove_group(&pdev->dev.kobj, &gta01_gps_attr_group); 
     661                dev_set_drvdata(&pdev->dev, NULL); 
     662                kfree(gpsinfo); 
    632663        } 
    633664#endif /* CONFIG_MACH_NEO1973_GTA01 */ 
    634665