Linux内核中ideapad-laptop.c文件全解析2
admin
2024-02-25 02:25:00
0

接前一篇文章《Linux内核中ideapad-laptop.c文件全解析1》,地址为:

Linux内核中ideapad-laptop.c文件全解析1_蓝天居士的博客-CSDN博客

上一回讲到了ideapad_acpi_driver。本文对于其成员进行详细解析。再列一下其源码:

static const struct acpi_device_id ideapad_device_ids[] = {{"VPC2004", 0},{"", 0},
};
MODULE_DEVICE_TABLE(acpi, ideapad_device_ids);static struct platform_driver ideapad_acpi_driver = {.probe = ideapad_acpi_add,.remove = ideapad_acpi_remove,.driver = {.name   = "ideapad_acpi",.pm     = &ideapad_pm,.acpi_match_table = ACPI_PTR(ideapad_device_ids),},
};module_platform_driver(ideapad_acpi_driver);

ideapad_device_ids数组也可以说是表的定义和初始化就在上边,它是用来匹配平台驱动和平台设备的。

probe探测函数对应的ideapad_acpi_add函数在同文件(drivers/platform/x86/ideapad-laptop.c)中实现,源码如下:

static int ideapad_acpi_add(struct platform_device *pdev)
{struct acpi_device *adev = ACPI_COMPANION(&pdev->dev);struct ideapad_private *priv;acpi_status status;unsigned long cfg;int err, i;if (!adev || eval_int(adev->handle, "_CFG", &cfg))return -ENODEV;priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);if (!priv)return -ENOMEM;dev_set_drvdata(&pdev->dev, priv);priv->cfg = cfg;priv->adev = adev;priv->platform_device = pdev;ideapad_check_features(priv);err = ideapad_sysfs_init(priv);if (err)return err;ideapad_debugfs_init(priv);err = ideapad_input_init(priv);if (err)goto input_failed;err = ideapad_kbd_bl_init(priv);if (err) {if (err != -ENODEV)dev_warn(&pdev->dev, "Could not set up keyboard backlight LED: %d\n", err);elsedev_info(&pdev->dev, "Keyboard backlight control not available\n");}/** On some models without a hw-switch (the yoga 2 13 at least)* VPCCMD_W_RF must be explicitly set to 1 for the wifi to work.*/if (!priv->features.hw_rfkill_switch)write_ec_cmd(priv->adev->handle, VPCCMD_W_RF, 1);/* The same for Touchpad */if (!priv->features.touchpad_ctrl_via_ec)write_ec_cmd(priv->adev->handle, VPCCMD_W_TOUCHPAD, 1);for (i = 0; i < IDEAPAD_RFKILL_DEV_NUM; i++)if (test_bit(ideapad_rfk_data[i].cfgbit, &priv->cfg))ideapad_register_rfkill(priv, i);ideapad_sync_rfk_state(priv);ideapad_sync_touchpad_state(priv);err = ideapad_dytc_profile_init(priv);if (err) {if (err != -ENODEV)dev_warn(&pdev->dev, "Could not set up DYTC interface: %d\n", err);elsedev_info(&pdev->dev, "DYTC interface is not available\n");}if (acpi_video_get_backlight_type() == acpi_backlight_vendor) {err = ideapad_backlight_init(priv);if (err && err != -ENODEV)goto backlight_failed;}status = acpi_install_notify_handler(adev->handle,ACPI_DEVICE_NOTIFY,ideapad_acpi_notify, priv);if (ACPI_FAILURE(status)) {err = -EIO;goto notification_failed;}#if IS_ENABLED(CONFIG_ACPI_WMI)for (i = 0; i < ARRAY_SIZE(ideapad_wmi_fnesc_events); i++) {status = wmi_install_notify_handler(ideapad_wmi_fnesc_events[i],ideapad_wmi_notify, priv);if (ACPI_SUCCESS(status)) {priv->fnesc_guid = ideapad_wmi_fnesc_events[i];break;}}if (ACPI_FAILURE(status) && status != AE_NOT_EXIST) {err = -EIO;goto notification_failed_wmi;}
#endifreturn 0;#if IS_ENABLED(CONFIG_ACPI_WMI)
notification_failed_wmi:acpi_remove_notify_handler(priv->adev->handle,ACPI_DEVICE_NOTIFY,ideapad_acpi_notify);
#endifnotification_failed:ideapad_backlight_exit(priv);backlight_failed:ideapad_dytc_profile_exit(priv);for (i = 0; i < IDEAPAD_RFKILL_DEV_NUM; i++)ideapad_unregister_rfkill(priv, i);ideapad_kbd_bl_exit(priv);ideapad_input_exit(priv);input_failed:ideapad_debugfs_exit(priv);ideapad_sysfs_exit(priv);return err;
}

remove移除函数对应的ideapad_acpi_remove函数也在同文件(drivers/platform/x86/ideapad-laptop.c)中实现,源码如下:

static int ideapad_acpi_remove(struct platform_device *pdev)
{struct ideapad_private *priv = dev_get_drvdata(&pdev->dev);int i;#if IS_ENABLED(CONFIG_ACPI_WMI)if (priv->fnesc_guid)wmi_remove_notify_handler(priv->fnesc_guid);
#endifacpi_remove_notify_handler(priv->adev->handle,ACPI_DEVICE_NOTIFY,ideapad_acpi_notify);ideapad_backlight_exit(priv);ideapad_dytc_profile_exit(priv);for (i = 0; i < IDEAPAD_RFKILL_DEV_NUM; i++)ideapad_unregister_rfkill(priv, i);ideapad_kbd_bl_exit(priv);ideapad_input_exit(priv);ideapad_debugfs_exit(priv);ideapad_sysfs_exit(priv);return 0;
}

实际上通过ideapad_acpi_remove函数更容易看出ideapad_acpi_add函数完成的工作,包括了:

  • sysfs初始化:ideapad_sysfs_init
  • debugfs初始化:ideapad_debugfs_init
  • 输入初始化:idea_input_init_init
  • 键盘(按键)背光初始化:ideapad_kbd_bl_init
  • 配置初始化:idea_dytc_profile_init
  • 背光初始化:ideapad_backlight_init
  • acpi通知处理:acpi_install_notify_handler
  • wmi通知处理:wmi_install_notify_handler
  • ……

欲知各个函数的具体实现细节,且听下回分解。

相关内容

热门资讯

盘前:科技股热潮降温 纳指期货... 来源:环球市场播报 周五,美国股指期货下跌。科技股走弱、美国国债收益率上升拖累大盘。科技板块近期大...
600096,拟投建1000万... 今日(5月15日),三大股指均收跌,全市场成交额为3.37万亿元,较上一个交易日缩量179亿元。收盘...
原创 应... 当地时间5月14日美股盘后,半导体设备达成应用材料(Applied Materials)公布了202...
歌手温岚被紧急送入ICU,主办... 歌手温岚原定于5月16日在上海举办巡回演唱会。15日,有消息称温岚因身体不适被紧急送医,随后,演唱会...
闪迪、美光越涨越便宜?股价暴涨... 存储芯片需求的爆炸式增长正在颠覆传统估值逻辑——股价越涨,闪迪和美光反而越便宜。 闪迪今年以来股价累...
监管部门“5·15”密集发声,... 监管新规密集发布,投资者保护防线再加固。 5月15日,证监会在北京举办2025年“5·15全国投资者...
纳指、标普500指数续创新高!... 美股三大指数集体收涨,纳指涨0.88%,标普500指数涨0.77%,道指涨0.75%。其中,纳指、标...
欧洲主要股指收盘集体下跌 英国富时100指数跌1.71%,法国CAC40指数跌1.72%,德国DAX30指数跌2.11%,富时...
巴宝莉去年扭亏盈利近两亿元,进... 英国奢侈品牌Burberry巴宝莉公布截至3月28日的2026财年业绩,释放明显复苏信号。集团营收同...
腾澎投资拟减持巨人网络不超3%... 巨人网络公告显示,公司控股股东一致行动人、第二大股东上海腾澎投资合伙企业(有限合伙)(下称“腾澎投资...
医疗健康领域投融资日报(5月1... 据亿欧数据统计,昨日(2026年5月14日)共披露23起投融资事件,涉及15家国内企业,8家国外企业...
债市ETF“工具箱”,解锁固收... 当前,市场波动有所加大,不确定性因素较多,单一资产投资模式难以有效应对市场起伏,引入固收类资产、优化...
招商蛇口股东会通过博时蛇口产园... 观点网讯:5月15日,招商蛇口2026年第一次临时股东会在公司总部会议室召开,会议由董事长朱文凯主持...
《学习时报》刊文:全球海洋可再... 海洋可再生能源一般指蕴藏于海水水面、水体及海床之中,可转化为电能的清洁能源类型,主要包括海上风能、潮...
数据看盘游资、量化抢筹多只机器... 沪深股通今日合计成交4353.39亿,其中澜起科技和中际旭创分居沪股通和深股通个股成交额首位。板块主...
土耳其BIST-100指数下跌... 土耳其BIST-100指数下跌1.8%,主要银行指数下跌2.4%。 来源:金融界AI电报
15分钟动态电价时代:园区光伏... 一、电价改革的“加速度”:从分时计费到现货波动 过去,工商业用户的电价表一年可能只调整几次,峰、平、...
湘潭上元产业港:多套成交 12... 湘潭上元产业港再迎成交热潮,近期3套优质厂房成功签约,多位企业家携手落子,以实力见证长株潭热土的产业...
4月新增人民币贷款跌入负区间,... 本报(chinatimes.net.cn)记者刘佳 北京报道 作为观察货币政策传导效率的核心窗口,4...
2.2/7.2馆展位图首发!5... 【2.2馆展位图】 【7.2馆展位图】 Bakery china 2.2馆部分 企业推介 22B...