platform驱动中struct platform_driver结构已经有电源管理函数,为什么还要在driver中还有电源管理函数操作呢?

在Linux Platform驱动注册过程中,我们要第一步关注的结构体有2个:

  • struct of_device_id
  • struct platform_drive
    前者负责告诉内核这个驱动可以支持什么样的设备,后者告诉内核支持了些什么。

本文关注下后者中与电源管理相关的部分,先放一个示例驱动代码片段:

static struct platform_driver rk_gmac_dwmac_driver = {
	.probe  = rk_gmac_probe,
	.remove = rk_gmac_remove,
	.driver = {
		.name           = "rk_gmac-dwmac",
		.pm		= &rk_gmac_pm_ops,
		.of_match_table = rk_gmac_dwmac_match,
	},
};
module_platform_driver(rk_gmac_dwmac_driver);

在这段代码中,分别告诉内核:

  1. 当匹配到驱动时我的probe探测函数是rk_gmac_probe
  2. remove卸载函数是rk_gmac_remove
  3. 驱动的名称叫rk_gmac-dwmac
  4. 电源管理操作方法是rk_gmac_pm_ops
  5. 驱动支持的设备有rk_gmac_dwmac_match

struct platform_driver在Kernel5.10中是这样子的:

struct platform_driver {
	int (*probe)(struct platform_device *);
	int (*remove)(struct platform_device *);
	void (*shutdown)(struct platform_device *);
	int (*suspend)(struct platform_device *, pm_message_t state);
	int (*resume)(struct platform_device *);
	struct device_driver driver;
	const struct platform_device_id *id_table;
	bool prevent_deferred_probe;

	ANDROID_KABI_RESERVE(1);
};

可以看到上述的结构中其中是有电源管理函数suspendresume,那为什么驱动还要再在.driver.pm再注册一下呢?或者说为什么还要在driver中再定义一次pm呢?这两者之间有什么关系呢?是有什么不同的地方吗?

在Linux内核中,struct platform_driverstruct device_driver中的电源管理字段有一些关键区别:

  1. struct platform_driver中的suspend和resume
    • 这些字段是平台驱动程序特定的电源管理回调函数,用于处理设备进入和退出低功耗状态的操作。它们通常定义为:
int (*suspend)(struct device *dev, pm_message_t state);
int (*resume)(struct device *dev);
  • 这些回调函数在系统进入和退出休眠状态时被调用,主要用于保存和恢复设备的状态。
  1. struct device_driver中的pm
    这个字段是一个指向struct dev_pm_ops的指针,定义了更通用的电源管理操作。struct dev_pm_ops包含多个回调函数,用于处理不同的电源管理事件,包括系统休眠和运行时电源管理。例如:
    const struct dev_pm_ops *pm;
    
    • struct dev_pm_ops中的回调函数包括:
      struct dev_pm_ops {
          int (*suspend)(struct device *dev);
          int (*resume)(struct device *dev);
          int (*runtime_suspend)(struct device *dev);
          int (*runtime_resume)(struct device *dev);
          int (*runtime_idle)(struct device *dev);
      };
      
    • 这些回调函数不仅处理系统休眠,还处理设备在系统运行时的电源管理¹²。

总结来说,struct platform_driver中的suspendresume回调函数主要用于平台设备的系统休眠管理,而struct device_driver中的pm字段提供了更全面的电源管理接口,涵盖了系统休眠和运行时电源管理。

在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值