]>
Commit | Line | Data |
---|---|---|
d2912cb1 | 1 | // SPDX-License-Identifier: GPL-2.0-only |
2188a988 | 2 | /* |
2188a988 LW |
3 | * |
4 | * iPAQ microcontroller backlight support | |
5 | * Author : Linus Walleij <linus.walleij@linaro.org> | |
6 | */ | |
7 | ||
8 | #include <linux/backlight.h> | |
9 | #include <linux/err.h> | |
10 | #include <linux/fb.h> | |
11 | #include <linux/init.h> | |
12 | #include <linux/mfd/ipaq-micro.h> | |
13 | #include <linux/module.h> | |
14 | #include <linux/platform_device.h> | |
15 | ||
16 | static int micro_bl_update_status(struct backlight_device *bd) | |
17 | { | |
18 | struct ipaq_micro *micro = dev_get_drvdata(&bd->dev); | |
19 | int intensity = bd->props.brightness; | |
20 | struct ipaq_micro_msg msg = { | |
21 | .id = MSG_BACKLIGHT, | |
22 | .tx_len = 3, | |
23 | }; | |
24 | ||
25 | if (bd->props.power != FB_BLANK_UNBLANK) | |
26 | intensity = 0; | |
27 | if (bd->props.state & (BL_CORE_FBBLANK | BL_CORE_SUSPENDED)) | |
28 | intensity = 0; | |
29 | ||
30 | /* | |
31 | * Message format: | |
32 | * Byte 0: backlight instance (usually 1) | |
33 | * Byte 1: on/off | |
34 | * Byte 2: intensity, 0-255 | |
35 | */ | |
36 | msg.tx_data[0] = 0x01; | |
37 | msg.tx_data[1] = intensity > 0 ? 1 : 0; | |
38 | msg.tx_data[2] = intensity; | |
39 | return ipaq_micro_tx_msg_sync(micro, &msg); | |
40 | } | |
41 | ||
42 | static const struct backlight_ops micro_bl_ops = { | |
43 | .options = BL_CORE_SUSPENDRESUME, | |
44 | .update_status = micro_bl_update_status, | |
45 | }; | |
46 | ||
47 | static struct backlight_properties micro_bl_props = { | |
48 | .type = BACKLIGHT_RAW, | |
49 | .max_brightness = 255, | |
50 | .power = FB_BLANK_UNBLANK, | |
51 | .brightness = 64, | |
52 | }; | |
53 | ||
54 | static int micro_backlight_probe(struct platform_device *pdev) | |
55 | { | |
56 | struct backlight_device *bd; | |
57 | struct ipaq_micro *micro = dev_get_drvdata(pdev->dev.parent); | |
58 | ||
59 | bd = devm_backlight_device_register(&pdev->dev, "ipaq-micro-backlight", | |
60 | &pdev->dev, micro, µ_bl_ops, | |
61 | µ_bl_props); | |
62 | if (IS_ERR(bd)) | |
63 | return PTR_ERR(bd); | |
64 | ||
65 | platform_set_drvdata(pdev, bd); | |
66 | backlight_update_status(bd); | |
67 | ||
68 | return 0; | |
69 | } | |
70 | ||
87464cdb | 71 | static struct platform_driver micro_backlight_device_driver = { |
2188a988 LW |
72 | .driver = { |
73 | .name = "ipaq-micro-backlight", | |
74 | }, | |
75 | .probe = micro_backlight_probe, | |
76 | }; | |
77 | module_platform_driver(micro_backlight_device_driver); | |
78 | ||
79 | MODULE_LICENSE("GPL v2"); | |
80 | MODULE_DESCRIPTION("driver for iPAQ Atmel micro backlight"); | |
81 | MODULE_ALIAS("platform:ipaq-micro-backlight"); |