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
  • ……

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

相关内容

热门资讯

韩国股市暴跌触发熔断机制 △韩国证券交易所(资料图) 韩国综合股价指数(KOSPI)7日盘中一度大跌超8%,触发市场熔断机制。...
爱柯迪跌3.11%,成交额1.... 来源:新浪证券-红岸工作室 7月7日,爱柯迪跌3.11%,成交额1.57亿元,换手率1.08%,总市...
高善文去世,享年55岁 记者据多方证实,国投证券前首席经济学家高善文因病去世,享年55岁。 高善文被公认为是中国资本市场上颇...
南昌黄金回收怎么选更安心 附近... 近年来随着黄金价格波动,不少南昌市民有处置闲置黄金的需求,但黄金回收市场鱼龙混杂,不少用户曾遭遇套路...
SpaceX股票几乎回到首日开... 来源:环球市场播报 SpaceX股价今日下跌逾5%,至152美元以下,距离该火箭制造商在6月12日...
景泽生物三闯港股IPO:尚未实... 财通社——7月3日,景泽生物医药(合肥)股份有限公司(简称“景泽生物”)再次向香港交易所递交主板上市...
亚马逊拟发行债券募资至少250... 来源:环球市场播报 核心要点 消息人士向记者戴维・费伯透露,亚马逊计划通过债券发行募资至少 25...
一季净利暴涨3020%!又一存... 作者 | 铅笔道 松格 编辑 | 铅笔道 黄小贵 2025年前四个月,宏芯宇的净利润只有1.23亿元...
原创 暴... 2026年夏天,饮料这行的人普遍难受。以往一到六七月,仓库就得连轴转,货车排队装水,老板数钱数到手抽...
活力中国调研行|探访李政道研究... 东方网记者程琦7月7日报道:初夏的张江科学城,草木葱茏,创新活力跃动。2026年“活力中国调研行”上...
超5家上市银行密集“自购”,释... 下半年伊始,A股上市银行再度传来股东、高管增持的消息。 常熟银行日前接连发布两份公告称,为提升持股比...
经济学家高善文去世,享年55岁 7月7日晚,据新经济学家智库消息,著名经济学家高善文去世,享年55岁。 公开资料显示,高善文出生于1...
连板背后的资本棋局:华芯晶电实... 图片来源:视觉中国 蓝鲸新闻7月7日讯(记者 徐晓春)因筹划控制权变更停牌五个交易日后,阿科力(60...
AI高端对话:智能体“凉了”?... 智东西 作者 | 杨京丽 编辑 | 心缘 智东西7月7日报道,7月2日,2026中国智能体大会在杭州...
著名经济学家高善文因病去世,享... 据上海证券报7月7日报道,记者据多方证实,国投证券前首席经济学家高善文因病去世,享年55岁。 高善...
医药股跨界并购半导体,周三停牌 7月7日晚间,五洲医疗(301234)发布《关于筹划发行股份及支付现金购买资产事项的停牌公告》。公告...
原创 上... 同一条马路两头,售楼处里排号验资的人挤到门口,中介橱窗上的挂牌广告却贴了一层又一层没人问。这就是20...
A股交易规则三大修订 投资必看 今天开始,A股市场的全新交易规则正式落地执行。A股交易新规涉及多项内容,和投资者密切相关,具体有哪些...
原创 金... 金价这两天走得有点拧巴。 7月6日现货黄金盘初一口气冲到4202.09美元/盎司,创了两周新高,谁料...
韩股两度熔断!赚疯的三星,吓崩... 三星一跃成为“全球最赚钱巨头”,韩国股市反倒崩了。 周二,亚太市场集体下挫,韩国股市两度上演暴跌熔断...