Lines Matching full:ec
76 * codes used by the EC. For example 0x16 (T14S_EC_EVT_KEY_FN_F7) is mapped
93 struct t14s_ec *ec; member
118 struct t14s_ec *ec = context; in t14s_ec_write() local
119 struct i2c_client *client = to_i2c_client(ec->dev); in t14s_ec_write()
134 struct t14s_ec *ec = context; in t14s_ec_read() local
135 struct i2c_client *client = to_i2c_client(ec->dev); in t14s_ec_read()
174 static int t14s_ec_read_evt(struct t14s_ec *ec, u8 *val) in t14s_ec_read_evt() argument
176 struct i2c_client *client = to_i2c_client(ec->dev); in t14s_ec_read_evt()
209 static void t14s_ec_write_sequence(struct t14s_ec *ec, u8 reg, u8 val, u8 cnt) in t14s_ec_write_sequence() argument
214 regmap_write(ec->regmap, reg, val); in t14s_ec_write_sequence()
217 static int t14s_led_set_status(struct t14s_ec *ec, in t14s_led_set_status() argument
223 ret = regmap_write(ec->regmap, T14S_EC_REG_LED, in t14s_led_set_status()
246 return t14s_led_set_status(led->ec, led, new_state); in t14s_led_brightness_set()
264 return t14s_led_set_status(led->ec, led, T14S_EC_LED_BLINK); in t14s_led_blink_set()
267 static int t14s_init_led(struct t14s_ec *ec, struct t14s_ec_led_classdev *led, in t14s_init_led() argument
275 led->ec = ec; in t14s_init_led()
278 return devm_led_classdev_register(ec->dev, &led->led_classdev); in t14s_init_led()
281 static int t14s_leds_probe(struct t14s_ec *ec) in t14s_leds_probe() argument
285 ret = t14s_init_led(ec, &ec->led_pwr_btn, 0, "platform::power"); in t14s_leds_probe()
289 ret = t14s_init_led(ec, &ec->led_chrg_orange, 1, in t14s_leds_probe()
294 ret = t14s_init_led(ec, &ec->led_chrg_white, 2, in t14s_leds_probe()
299 ret = t14s_init_led(ec, &ec->led_lid_logo_dot, 10, in t14s_leds_probe()
310 struct t14s_ec *ec = container_of(led_cdev, struct t14s_ec, in t14s_kbd_bl_set() local
316 ret = regmap_update_bits(ec->regmap, T14S_EC_REG_KBD_BL1, in t14s_kbd_bl_set()
322 ret = regmap_update_bits(ec->regmap, T14S_EC_REG_KBD_BL2, in t14s_kbd_bl_set()
332 struct t14s_ec *ec = container_of(led_cdev, struct t14s_ec, in t14s_kbd_bl_get() local
337 ret = regmap_read(ec->regmap, T14S_EC_REG_KBD_BL1, &val); in t14s_kbd_bl_get()
344 static void t14s_kbd_bl_update(struct t14s_ec *ec) in t14s_kbd_bl_update() argument
346 enum led_brightness brightness = t14s_kbd_bl_get(&ec->kbd_backlight); in t14s_kbd_bl_update()
348 led_classdev_notify_brightness_hw_changed(&ec->kbd_backlight, brightness); in t14s_kbd_bl_update()
351 static int t14s_kbd_backlight_probe(struct t14s_ec *ec) in t14s_kbd_backlight_probe() argument
353 ec->kbd_backlight.name = "platform::kbd_backlight"; in t14s_kbd_backlight_probe()
354 ec->kbd_backlight.flags = LED_BRIGHT_HW_CHANGED; in t14s_kbd_backlight_probe()
355 ec->kbd_backlight.max_brightness = 2; in t14s_kbd_backlight_probe()
356 ec->kbd_backlight.brightness_set_blocking = t14s_kbd_bl_set; in t14s_kbd_backlight_probe()
357 ec->kbd_backlight.brightness_get = t14s_kbd_bl_get; in t14s_kbd_backlight_probe()
359 return devm_led_classdev_register(ec->dev, &ec->kbd_backlight); in t14s_kbd_backlight_probe()
362 static enum led_brightness t14s_audio_led_get(struct t14s_ec *ec, u8 led_bit) in t14s_audio_led_get() argument
367 ret = regmap_read(ec->regmap, T14S_EC_REG_AUD, &val); in t14s_audio_led_get()
374 static enum led_brightness t14s_audio_led_set(struct t14s_ec *ec, in t14s_audio_led_set() argument
378 return regmap_assign_bits(ec->regmap, T14S_EC_REG_AUD, led_mask, brightness > 0); in t14s_audio_led_set()
383 struct t14s_ec *ec = container_of(led_cdev, struct t14s_ec, in t14s_mic_mute_led_get() local
386 return t14s_audio_led_get(ec, T14S_EC_MIC_MUTE_LED); in t14s_mic_mute_led_get()
392 struct t14s_ec *ec = container_of(led_cdev, struct t14s_ec, in t14s_mic_mute_led_set() local
395 return t14s_audio_led_set(ec, T14S_EC_MIC_MUTE_LED, brightness); in t14s_mic_mute_led_set()
400 struct t14s_ec *ec = container_of(led_cdev, struct t14s_ec, in t14s_spk_mute_led_get() local
403 return t14s_audio_led_get(ec, T14S_EC_SPK_MUTE_LED); in t14s_spk_mute_led_get()
409 struct t14s_ec *ec = container_of(led_cdev, struct t14s_ec, in t14s_spk_mute_led_set() local
412 return t14s_audio_led_set(ec, T14S_EC_SPK_MUTE_LED, brightness); in t14s_spk_mute_led_set()
415 static int t14s_kbd_audio_led_probe(struct t14s_ec *ec) in t14s_kbd_audio_led_probe() argument
419 ec->led_mic_mute.name = "platform::micmute"; in t14s_kbd_audio_led_probe()
420 ec->led_mic_mute.max_brightness = 1; in t14s_kbd_audio_led_probe()
421 ec->led_mic_mute.default_trigger = "audio-micmute"; in t14s_kbd_audio_led_probe()
422 ec->led_mic_mute.brightness_set_blocking = t14s_mic_mute_led_set; in t14s_kbd_audio_led_probe()
423 ec->led_mic_mute.brightness_get = t14s_mic_mute_led_get; in t14s_kbd_audio_led_probe()
425 ec->led_spk_mute.name = "platform::mute"; in t14s_kbd_audio_led_probe()
426 ec->led_spk_mute.max_brightness = 1; in t14s_kbd_audio_led_probe()
427 ec->led_spk_mute.default_trigger = "audio-mute"; in t14s_kbd_audio_led_probe()
428 ec->led_spk_mute.brightness_set_blocking = t14s_spk_mute_led_set; in t14s_kbd_audio_led_probe()
429 ec->led_spk_mute.brightness_get = t14s_spk_mute_led_get; in t14s_kbd_audio_led_probe()
431 ret = devm_led_classdev_register(ec->dev, &ec->led_mic_mute); in t14s_kbd_audio_led_probe()
435 return devm_led_classdev_register(ec->dev, &ec->led_spk_mute); in t14s_kbd_audio_led_probe()
455 static int t14s_input_probe(struct t14s_ec *ec) in t14s_input_probe() argument
459 ec->inputdev = devm_input_allocate_device(ec->dev); in t14s_input_probe()
460 if (!ec->inputdev) in t14s_input_probe()
463 ec->inputdev->name = "ThinkPad Extra Buttons"; in t14s_input_probe()
464 ec->inputdev->phys = "thinkpad/input0"; in t14s_input_probe()
465 ec->inputdev->id.bustype = BUS_HOST; in t14s_input_probe()
466 ec->inputdev->dev.parent = ec->dev; in t14s_input_probe()
468 ret = sparse_keymap_setup(ec->inputdev, t14s_keymap, NULL); in t14s_input_probe()
472 return input_register_device(ec->inputdev); in t14s_input_probe()
477 struct t14s_ec *ec = data; in t14s_ec_irq_handler() local
481 ret = t14s_ec_read_evt(ec, &val); in t14s_ec_irq_handler()
483 dev_err(ec->dev, "Failed to read event\n"); in t14s_ec_irq_handler()
491 t14s_kbd_bl_update(ec); in t14s_ec_irq_handler()
505 sparse_keymap_report_event(ec->inputdev, in t14s_ec_irq_handler()
509 dev_dbg(ec->dev, "AC connected\n"); in t14s_ec_irq_handler()
512 dev_dbg(ec->dev, "AC disconnected\n"); in t14s_ec_irq_handler()
515 dev_dbg(ec->dev, "power button\n"); in t14s_ec_irq_handler()
518 dev_dbg(ec->dev, "LID open\n"); in t14s_ec_irq_handler()
521 dev_dbg(ec->dev, "LID closed\n"); in t14s_ec_irq_handler()
524 dev_dbg(ec->dev, "Thermal Zone 40 Status Change Event (CPU/GPU)\n"); in t14s_ec_irq_handler()
527 dev_dbg(ec->dev, "Thermal Zone 42 Status Change Event (Battery)\n"); in t14s_ec_irq_handler()
530 dev_dbg(ec->dev, "Thermal Zone 39 Status Change Event (CPU/GPU)\n"); in t14s_ec_irq_handler()
533 dev_dbg(ec->dev, "FN + G - toggle double-tapping\n"); in t14s_ec_irq_handler()
536 dev_dbg(ec->dev, "FN + L - low performance mode\n"); in t14s_ec_irq_handler()
539 dev_dbg(ec->dev, "FN + M - medium performance mode\n"); in t14s_ec_irq_handler()
542 dev_dbg(ec->dev, "FN + H - high performance mode\n"); in t14s_ec_irq_handler()
545 dev_dbg(ec->dev, "FN + T - toggle intelligent cooling mode\n"); in t14s_ec_irq_handler()
548 dev_dbg(ec->dev, "FN + D - toggle privacy guard mode\n"); in t14s_ec_irq_handler()
551 dev_info(ec->dev, "Unknown EC event: 0x%02x\n", val); in t14s_ec_irq_handler()
561 struct t14s_ec *ec; in t14s_ec_probe() local
564 ec = devm_kzalloc(dev, sizeof(*ec), GFP_KERNEL); in t14s_ec_probe()
565 if (!ec) in t14s_ec_probe()
568 ec->dev = dev; in t14s_ec_probe()
569 i2c_set_clientdata(client, ec); in t14s_ec_probe()
571 ec->regmap = devm_regmap_init(dev, &t14s_ec_regmap_bus, in t14s_ec_probe()
572 ec, &t14s_ec_regmap_config); in t14s_ec_probe()
573 if (IS_ERR(ec->regmap)) in t14s_ec_probe()
574 return dev_err_probe(dev, PTR_ERR(ec->regmap), in t14s_ec_probe()
577 ret = t14s_leds_probe(ec); in t14s_ec_probe()
581 ret = t14s_kbd_backlight_probe(ec); in t14s_ec_probe()
585 ret = t14s_kbd_audio_led_probe(ec); in t14s_ec_probe()
589 ret = t14s_input_probe(ec); in t14s_ec_probe()
595 IRQF_ONESHOT, dev_name(dev), ec); in t14s_ec_probe()
611 struct t14s_ec *ec = dev_get_drvdata(dev); in t14s_ec_suspend() local
613 led_classdev_suspend(&ec->kbd_backlight); in t14s_ec_suspend()
615 t14s_ec_write_sequence(ec, T14S_EC_REG_MODERN_STANDBY, in t14s_ec_suspend()
623 struct t14s_ec *ec = dev_get_drvdata(dev); in t14s_ec_resume() local
625 t14s_ec_write_sequence(ec, T14S_EC_REG_MODERN_STANDBY, in t14s_ec_resume()
628 led_classdev_resume(&ec->kbd_backlight); in t14s_ec_resume()
634 { .compatible = "lenovo,thinkpad-t14s-ec" },
640 { "thinkpad-t14s-ec", },
651 .name = "thinkpad-t14s-ec",