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

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

相关内容

热门资讯

贝特利IPO,核心业务成长性、... 中国网财经2月2日讯 近期,苏州市贝特利高分子材料股份有限公司(简称“贝特利”)回复二轮审核问询函,...
A股三大指数均跌超1%!黄金股... 2月2日早盘,A股低开震荡,截至午间收盘,沪指跌1.32%,深成指跌1.41%,创业板指跌1.18%...
和讯投顾周大勇:慢就是快,切忌... 许多投资者或许有过类似经历:明明拥有一套稳定盈利的方法,却总是忍不住追逐热点、更换模式,最终越做越亏...
穿499元的鞋,敲千亿市值的钟... 文|无相财经 白色卫衣、卷边牛仔裤、券后499元的国潮鞋,上市敲锣时轻轻一点,波澜不惊……这大概是...
小红书爆款笔记秘诀!4步轻松拿... 运营小红书的宝子们,是不是总卡在内容环节?明明做好了赛道定位、找好了对标,却始终做不出戳中用户的爆款...
为何说石家庄眼科是近视手术的优... 近视手术价格考量因素 在考虑近视手术时,很多人会关注价格是否昂贵。其实,手术价格受多种因素影响,如手...
腾讯回应元宝“崩了”,多只算力... AI厂商激战春节“营销档”,带来算力需求增长。 2月2日凌晨,第一财经记者在腾讯元宝看到,从领现金红...
1月4家IPO审核终止,远低去... 财联社2月2日讯(记者 赵昕睿)三大交易所官网显示,今年1月共计4家IPO终止,较去年同期的29家大...
惠东臻品走进广州商圈,联动展销... 1月30日,由广东省“百千万工程”纵向帮扶工作队联合多家省属企业主办的“山海惠东·品味时尚”促消费活...
中长期资金入市有望推动银行板块... 2月2日,三大股指早盘持续走低,其中银行板块逆势拉升。截至上午10:30,银行ETF南方(15935...
移动互联与AI时代的律所管理,... 来源:市场资讯 (来源:第一法商CHANNEL) 管理,是生产力。 思想前进一小步,事业前进一大步。...
刚刚,崩了!大面积跌停!这一板... 【导读】有色金属板块继续暴跌,个股开盘大面积跌停;石油石化板块不振,三大运营商集体走低;白酒股再度冲...
以后的黄金会是以前的房子吗? 有人的地方就有江湖,有金钱的地方就有喜忧。 最近贵金属的价格像过山车一样跌宕起伏,相信关注的朋友都深...
东契奇30+15布伦森12+1... 【搜狐体育战报】北京时间2月2日NBA常规赛,主场作战的尼克斯以112-100击败湖人,尼克斯取得6...
商业航天产业链共链行动大会在上... 2026年1月29日,以“链聚产业合力 共建航天强国”为主题的商业航天器及应用产业链共链行动大会在上...
中山公用事业集团股份有限公司 ... 来源:证券日报 证券代码:000685 证券简称:中山公用 公告编号:2026-006 本公司及董...
玖亓周评 | 一日暴跌创下40... 黄金成了新的修罗场。 1月30日,黄金价格经历了踩踏式的暴跌,并且是过山车式的暴跌。现货黄金价格在势...
华为云发布“行业AI梦工厂”智... 科技日报 科技日报记者 崔爽 AI正向产业落地深水区迈进。2月1日举行的医疗人工智能协同创新论坛暨医...
港股IPO热潮背后:中资券商的... 来源:梧桐树下v 继2025年IPO募资额问鼎全球榜首之后,港股市场在2026年延续了这份灼热势头—...