Linux Power Managerment for misc device

参考kernel source tree下面的Documentation/power/里面的文档,对于misc设备的Power Managerment接口没有提及。
我的方法是在misc注册的模块里另外注册一个platform device. 同时为该设备注册一个platform driver。
在driver里面可以提供Power Managerment相关的方法如suspend和resume.

我的例子如下:

//声明设备和驱动,尤其是驱动所带的suspend和resume方法。
#ifdef CONFIG_PM
#define FPLED_NAME  "ledpw"

static int vhc164_suspend    (struct platform_device *pdev, pm_message_t state);
static int vhc164_resume    (struct platform_device *pdev);

static struct platform_device vhc164_pm_device = {
    .name          = FPLED_NAME,
    .id            = -1,
};

static struct platform_driver vhc164_pm_driver = {
    .driver    = {
        .name  = FPLED_NAME,
        .owner = THIS_MODULE,
    },
    .suspend   = vhc164_suspend,
    .resume    = vhc164_resume,
};


#endif

#ifdef CONFIG_PM
static int vhc164_suspend    (struct platform_device *pdev, pm_message_t state)
{
    //把设备转入待机状态
      GPIO_WRITE(phStbFP_pioInstance, gAllLedPios, 0);
      WriteData(gFPContent[1]);
      GPIO_WRITE(phStbFP_pioInstance, gAllLedPios, gaLedPios[1]);
    return 0;
}

static int vhc164_resume    (struct platform_device *pdev)
{
    //唤醒设备
      GPIO_WRITE(phStbFP_pioInstance, gAllLedPios, 0);
      WriteData(gFPContent[0]);
      GPIO_WRITE(phStbFP_pioInstance, gAllLedPios, gaLedPios[0]);
    return 0;
}
#endif

static int __init phStbFP_74VHC164_Init( void )
{
    ......
    error = misc_register( &gphStbFPLed_MiscDev );
    ......
#ifdef CONFIG_PM //注册platform device和挂载驱动
    error = platform_device_register(&vhc164_pm_device);
    if (error)
        return error;

    error = platform_driver_probe(&vhc164_pm_driver, NULL);
    if (error)
        return error;
#endif
}


这样待机时,suspend方法会被调用,换醒时resume会被调用。注意,suspend中的printk会被及时调用,但是输出却会被阻塞。另外jiffies在待机后,不再改变。

你可能感兴趣的:(linux,linux,职场,休闲,PM)