Lines Matching +full:platform +full:- +full:data
1 // SPDX-License-Identifier: GPL-2.0-or-later
10 * Implementation inspired by existing x86 platform drivers.
33 #define DRIVER_NAME "samsung-galaxybook"
36 struct platform_device *platform; member
81 #define GB_ATTR_LANGUAGE_CODE "en_US.UTF-8"
173 /* guid 8246028d-8bca-4a55-ba0f-6f1e6b921b8f */
236 status = acpi_evaluate_object_typed(galaxybook->acpi->handle, method, &input, &output, in galaxybook_acpi_method()
240 dev_err(&galaxybook->acpi->dev, "failed to execute method %s; got %s\n", in galaxybook_acpi_method()
242 return -EIO; in galaxybook_acpi_method()
247 if (out_obj->buffer.length != len || out_obj->buffer.length < GB_SAWB_GB_GUNM_POS + 1) { in galaxybook_acpi_method()
248 dev_err(&galaxybook->acpi->dev, in galaxybook_acpi_method()
251 err = -EPROTO; in galaxybook_acpi_method()
254 if (out_obj->buffer.pointer[GB_SAWB_RFLG_POS] != GB_RFLG_SUCCESS) { in galaxybook_acpi_method()
255 dev_err(&galaxybook->acpi->dev, in galaxybook_acpi_method()
258 err = -ENXIO; in galaxybook_acpi_method()
261 if (out_obj->buffer.pointer[GB_SAWB_GB_GUNM_POS] == GB_GUNM_FAIL) { in galaxybook_acpi_method()
262 dev_err(&galaxybook->acpi->dev, in galaxybook_acpi_method()
265 err = -ENXIO; in galaxybook_acpi_method()
269 memcpy(buf, out_obj->buffer.pointer, len); in galaxybook_acpi_method()
294 return -ENODEV; in galaxybook_enable_acpi_feature()
367 err = devm_mutex_init(&galaxybook->platform->dev, &galaxybook->kbd_backlight_lock); in galaxybook_kbd_backlight_init()
373 dev_dbg(&galaxybook->platform->dev, in galaxybook_kbd_backlight_init()
380 dev_dbg(&galaxybook->platform->dev, in galaxybook_kbd_backlight_init()
389 galaxybook->kbd_backlight.brightness_get = kbd_backlight_show; in galaxybook_kbd_backlight_init()
390 galaxybook->kbd_backlight.brightness_set_blocking = kbd_backlight_store; in galaxybook_kbd_backlight_init()
391 galaxybook->kbd_backlight.flags = LED_BRIGHT_HW_CHANGED; in galaxybook_kbd_backlight_init()
392 galaxybook->kbd_backlight.max_brightness = GB_KBD_BACKLIGHT_MAX_BRIGHTNESS; in galaxybook_kbd_backlight_init()
394 return devm_led_classdev_register_ext(&galaxybook->platform->dev, in galaxybook_kbd_backlight_init()
395 &galaxybook->kbd_backlight, &init_data); in galaxybook_kbd_backlight_init()
448 return -EINVAL; in galaxybook_battery_ext_property_get()
450 err = charge_control_end_threshold_acpi_get(galaxybook, (u8 *)&val->intval); in galaxybook_battery_ext_property_get()
458 if (val->intval == 0) in galaxybook_battery_ext_property_get()
459 val->intval = 100; in galaxybook_battery_ext_property_get()
474 return -EINVAL; in galaxybook_battery_ext_property_set()
476 value = val->intval; in galaxybook_battery_ext_property_set()
479 return -EINVAL; in galaxybook_battery_ext_property_set()
521 &battery->dev, galaxybook); in galaxybook_battery_add()
537 dev_dbg(&galaxybook->platform->dev, in galaxybook_battery_threshold_init()
542 galaxybook->battery_hook.add_battery = galaxybook_battery_add; in galaxybook_battery_threshold_init()
543 galaxybook->battery_hook.remove_battery = galaxybook_battery_remove; in galaxybook_battery_threshold_init()
544 galaxybook->battery_hook.name = "Samsung Galaxy Book Battery Extension"; in galaxybook_battery_threshold_init()
546 return devm_battery_hook_register(&galaxybook->platform->dev, &galaxybook->battery_hook); in galaxybook_battery_threshold_init()
550 * Platform Profile / Performance mode
612 return -EOPNOTSUPP; in get_performance_mode_profile()
614 dev_warn(&galaxybook->platform->dev, in get_performance_mode_profile()
616 return -EOPNOTSUPP; in get_performance_mode_profile()
642 galaxybook->profile_performance_modes[profile]); in galaxybook_platform_profile_set()
648 u8 *perfmodes = galaxybook->profile_performance_modes; in galaxybook_platform_profile_probe()
663 dev_dbg(&galaxybook->platform->dev, in galaxybook_platform_profile_probe()
677 * list after this (iob1-iobX). Loop through the supported values and in galaxybook_platform_profile_probe()
679 * values along the way if a non-legacy value exists. in galaxybook_platform_profile_probe()
684 dev_dbg(&galaxybook->platform->dev, in galaxybook_platform_profile_probe()
704 dev_dbg(&galaxybook->platform->dev, in galaxybook_platform_profile_probe()
705 "setting platform profile %d to use performance mode 0x%x\n", in galaxybook_platform_profile_probe()
730 dev_dbg(&galaxybook->platform->dev, in galaxybook_platform_profile_init()
735 platform_profile_dev = devm_platform_profile_register(&galaxybook->platform->dev, in galaxybook_platform_profile_init()
773 lockdep_assert_held(&galaxybook->fw_attr_lock); in power_on_lid_open_acpi_set()
811 lockdep_assert_held(&galaxybook->fw_attr_lock); in usb_charging_acpi_set()
847 lockdep_assert_held(&galaxybook->fw_attr_lock); in block_recording_acpi_set()
859 input_report_switch(galaxybook->camera_lens_cover_switch, in block_recording_acpi_set()
861 input_sync(galaxybook->camera_lens_cover_switch); in block_recording_acpi_set()
873 dev_dbg(&galaxybook->platform->dev, in galaxybook_block_recording_init()
878 guard(mutex)(&galaxybook->fw_attr_lock); in galaxybook_block_recording_init()
882 dev_dbg(&galaxybook->platform->dev, in galaxybook_block_recording_init()
887 galaxybook->camera_lens_cover_switch = in galaxybook_block_recording_init()
888 devm_input_allocate_device(&galaxybook->platform->dev); in galaxybook_block_recording_init()
889 if (!galaxybook->camera_lens_cover_switch) in galaxybook_block_recording_init()
890 return -ENOMEM; in galaxybook_block_recording_init()
892 galaxybook->camera_lens_cover_switch->name = "Samsung Galaxy Book Camera Lens Cover"; in galaxybook_block_recording_init()
893 galaxybook->camera_lens_cover_switch->phys = DRIVER_NAME "/input0"; in galaxybook_block_recording_init()
894 galaxybook->camera_lens_cover_switch->id.bustype = BUS_HOST; in galaxybook_block_recording_init()
896 input_set_capability(galaxybook->camera_lens_cover_switch, EV_SW, SW_CAMERA_LENS_COVER); in galaxybook_block_recording_init()
898 err = input_register_device(galaxybook->camera_lens_cover_switch); in galaxybook_block_recording_init()
902 input_report_switch(galaxybook->camera_lens_cover_switch, in galaxybook_block_recording_init()
904 input_sync(galaxybook->camera_lens_cover_switch); in galaxybook_block_recording_init()
946 return sysfs_emit(buf, "%s\n", galaxybook_fw_attr_desc[fw_attr->fw_attr_id]); in display_name_show()
956 err = fw_attr->get_value(fw_attr->galaxybook, &value); in current_value_show()
968 struct samsung_galaxybook *galaxybook = fw_attr->galaxybook; in current_value_store()
973 return -EINVAL; in current_value_store()
979 guard(mutex)(&galaxybook->fw_attr_lock); in current_value_store()
981 err = fw_attr->set_value(galaxybook, value); in current_value_store()
1000 fw_attr = devm_kzalloc(&galaxybook->platform->dev, sizeof(*fw_attr), GFP_KERNEL); in galaxybook_fw_attr_init()
1002 return -ENOMEM; in galaxybook_fw_attr_init()
1004 attrs = devm_kcalloc(&galaxybook->platform->dev, NUM_FW_ATTR_ENUM_ATTRS + 1, in galaxybook_fw_attr_init()
1007 return -ENOMEM; in galaxybook_fw_attr_init()
1014 sysfs_attr_init(&fw_attr->display_name.attr); in galaxybook_fw_attr_init()
1015 fw_attr->display_name.attr.name = "display_name"; in galaxybook_fw_attr_init()
1016 fw_attr->display_name.attr.mode = 0444; in galaxybook_fw_attr_init()
1017 fw_attr->display_name.show = display_name_show; in galaxybook_fw_attr_init()
1018 attrs[4] = &fw_attr->display_name.attr; in galaxybook_fw_attr_init()
1020 sysfs_attr_init(&fw_attr->current_value.attr); in galaxybook_fw_attr_init()
1021 fw_attr->current_value.attr.name = "current_value"; in galaxybook_fw_attr_init()
1022 fw_attr->current_value.attr.mode = 0644; in galaxybook_fw_attr_init()
1023 fw_attr->current_value.show = current_value_show; in galaxybook_fw_attr_init()
1024 fw_attr->current_value.store = current_value_store; in galaxybook_fw_attr_init()
1025 attrs[5] = &fw_attr->current_value.attr; in galaxybook_fw_attr_init()
1029 fw_attr->galaxybook = galaxybook; in galaxybook_fw_attr_init()
1030 fw_attr->fw_attr_id = fw_attr_id; in galaxybook_fw_attr_init()
1031 fw_attr->attr_group.name = galaxybook_fw_attr_name[fw_attr_id]; in galaxybook_fw_attr_init()
1032 fw_attr->attr_group.attrs = attrs; in galaxybook_fw_attr_init()
1033 fw_attr->get_value = get_value; in galaxybook_fw_attr_init()
1034 fw_attr->set_value = set_value; in galaxybook_fw_attr_init()
1036 return sysfs_create_group(&galaxybook->fw_attrs_kset->kobj, &fw_attr->attr_group); in galaxybook_fw_attr_init()
1039 static void galaxybook_kset_unregister(void *data) in galaxybook_kset_unregister() argument
1041 struct kset *kset = data; in galaxybook_kset_unregister()
1046 static void galaxybook_fw_attrs_dev_unregister(void *data) in galaxybook_fw_attrs_dev_unregister() argument
1048 struct device *fw_attrs_dev = data; in galaxybook_fw_attrs_dev_unregister()
1058 err = devm_mutex_init(&galaxybook->platform->dev, &galaxybook->fw_attr_lock); in galaxybook_fw_attrs_init()
1062 galaxybook->fw_attrs_dev = device_create(&firmware_attributes_class, NULL, MKDEV(0, 0), in galaxybook_fw_attrs_init()
1064 if (IS_ERR(galaxybook->fw_attrs_dev)) in galaxybook_fw_attrs_init()
1065 return PTR_ERR(galaxybook->fw_attrs_dev); in galaxybook_fw_attrs_init()
1067 err = devm_add_action_or_reset(&galaxybook->platform->dev, in galaxybook_fw_attrs_init()
1069 galaxybook->fw_attrs_dev); in galaxybook_fw_attrs_init()
1073 galaxybook->fw_attrs_kset = kset_create_and_add("attributes", NULL, in galaxybook_fw_attrs_init()
1074 &galaxybook->fw_attrs_dev->kobj); in galaxybook_fw_attrs_init()
1075 if (!galaxybook->fw_attrs_kset) in galaxybook_fw_attrs_init()
1076 return -ENOMEM; in galaxybook_fw_attrs_init()
1077 err = devm_add_action_or_reset(&galaxybook->platform->dev, in galaxybook_fw_attrs_init()
1078 galaxybook_kset_unregister, galaxybook->fw_attrs_kset); in galaxybook_fw_attrs_init()
1108 galaxybook->has_block_recording = true; in galaxybook_fw_attrs_init()
1127 guard(mutex)(&galaxybook->kbd_backlight_lock); in galaxybook_kbd_backlight_hotkey_work()
1129 brightness = galaxybook->kbd_backlight.brightness; in galaxybook_kbd_backlight_hotkey_work()
1130 if (brightness < galaxybook->kbd_backlight.max_brightness) in galaxybook_kbd_backlight_hotkey_work()
1135 err = led_set_brightness_sync(&galaxybook->kbd_backlight, brightness); in galaxybook_kbd_backlight_hotkey_work()
1137 dev_err(&galaxybook->platform->dev, in galaxybook_kbd_backlight_hotkey_work()
1142 led_classdev_notify_brightness_hw_changed(&galaxybook->kbd_backlight, brightness); in galaxybook_kbd_backlight_hotkey_work()
1152 guard(mutex)(&galaxybook->fw_attr_lock); in galaxybook_block_recording_hotkey_work()
1156 dev_err(&galaxybook->platform->dev, in galaxybook_block_recording_hotkey_work()
1163 dev_err(&galaxybook->platform->dev, in galaxybook_block_recording_hotkey_work()
1167 static bool galaxybook_i8042_filter(unsigned char data, unsigned char str, struct serio *port, in galaxybook_i8042_filter() argument
1176 if (data == 0xe0) { in galaxybook_i8042_filter()
1181 switch (data) { in galaxybook_i8042_filter()
1185 if (galaxybook->has_kbd_backlight) in galaxybook_i8042_filter()
1186 schedule_work(&galaxybook->kbd_backlight_hotkey_work); in galaxybook_i8042_filter()
1192 if (galaxybook->has_block_recording) in galaxybook_i8042_filter()
1193 schedule_work(&galaxybook->block_recording_hotkey_work); in galaxybook_i8042_filter()
1204 * with the next non-filtered byte. in galaxybook_i8042_filter()
1214 static void galaxybook_i8042_filter_remove(void *data) in galaxybook_i8042_filter_remove() argument
1216 struct samsung_galaxybook *galaxybook = data; in galaxybook_i8042_filter_remove()
1219 cancel_work_sync(&galaxybook->kbd_backlight_hotkey_work); in galaxybook_i8042_filter_remove()
1220 cancel_work_sync(&galaxybook->block_recording_hotkey_work); in galaxybook_i8042_filter_remove()
1227 if (!galaxybook->has_kbd_backlight && !galaxybook->has_block_recording) in galaxybook_i8042_filter_install()
1230 INIT_WORK(&galaxybook->kbd_backlight_hotkey_work, in galaxybook_i8042_filter_install()
1232 INIT_WORK(&galaxybook->block_recording_hotkey_work, in galaxybook_i8042_filter_install()
1239 return devm_add_action_or_reset(&galaxybook->platform->dev, in galaxybook_i8042_filter_install()
1247 static void galaxybook_acpi_notify(acpi_handle handle, u32 event, void *data) in galaxybook_acpi_notify() argument
1249 struct samsung_galaxybook *galaxybook = data; in galaxybook_acpi_notify()
1257 if (galaxybook->has_performance_mode) in galaxybook_acpi_notify()
1261 dev_warn(&galaxybook->platform->dev, in galaxybook_acpi_notify()
1265 acpi_bus_generate_netlink_event(DRIVER_NAME, dev_name(&galaxybook->platform->dev), in galaxybook_acpi_notify()
1287 static void galaxybook_acpi_remove_notify_handler(void *data) in galaxybook_acpi_remove_notify_handler() argument
1289 struct samsung_galaxybook *galaxybook = data; in galaxybook_acpi_remove_notify_handler()
1291 acpi_remove_notify_handler(galaxybook->acpi->handle, ACPI_ALL_NOTIFY, in galaxybook_acpi_remove_notify_handler()
1295 static void galaxybook_acpi_disable(void *data) in galaxybook_acpi_disable() argument
1297 struct samsung_galaxybook *galaxybook = data; in galaxybook_acpi_disable()
1299 acpi_execute_simple_method(galaxybook->acpi->handle, in galaxybook_acpi_disable()
1308 status = acpi_execute_simple_method(galaxybook->acpi->handle, GB_ACPI_METHOD_ENABLE, in galaxybook_acpi_init()
1311 return -EIO; in galaxybook_acpi_init()
1312 err = devm_add_action_or_reset(&galaxybook->platform->dev, in galaxybook_acpi_init()
1317 status = acpi_install_notify_handler(galaxybook->acpi->handle, ACPI_ALL_NOTIFY, in galaxybook_acpi_init()
1320 return -EIO; in galaxybook_acpi_init()
1321 err = devm_add_action_or_reset(&galaxybook->platform->dev, in galaxybook_acpi_init()
1328 dev_dbg(&galaxybook->platform->dev, "failed to enable ACPI notifications; " in galaxybook_acpi_init()
1333 dev_dbg(&galaxybook->platform->dev, in galaxybook_acpi_init()
1341 * Platform driver
1346 struct acpi_device *adev = ACPI_COMPANION(&pdev->dev); in galaxybook_probe()
1351 return -ENODEV; in galaxybook_probe()
1353 galaxybook = devm_kzalloc(&pdev->dev, sizeof(*galaxybook), GFP_KERNEL); in galaxybook_probe()
1355 return -ENOMEM; in galaxybook_probe()
1357 galaxybook->platform = pdev; in galaxybook_probe()
1358 galaxybook->acpi = adev; in galaxybook_probe()
1363 * - GB_SASB_POWER_MANAGEMENT (including performance mode) in galaxybook_probe()
1364 * - GB_SASB_KBD_BACKLIGHT in galaxybook_probe()
1365 * - GB_SASB_BLOCK_RECORDING (as part of fw_attrs init) in galaxybook_probe()
1370 return dev_err_probe(&galaxybook->platform->dev, err, in galaxybook_probe()
1375 galaxybook->has_performance_mode = true; in galaxybook_probe()
1377 return dev_err_probe(&galaxybook->platform->dev, err, in galaxybook_probe()
1378 "failed to initialize platform profile\n"); in galaxybook_probe()
1382 return dev_err_probe(&galaxybook->platform->dev, err, in galaxybook_probe()
1387 galaxybook->has_kbd_backlight = true; in galaxybook_probe()
1389 return dev_err_probe(&galaxybook->platform->dev, err, in galaxybook_probe()
1394 return dev_err_probe(&galaxybook->platform->dev, err, in galaxybook_probe()
1395 "failed to initialize firmware-attributes\n"); in galaxybook_probe()
1399 return dev_err_probe(&galaxybook->platform->dev, err, in galaxybook_probe()