1 | // SPDX-License-Identifier: GPL-2.0-only |
2 | /* |
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(dev: &bd->dev); |
19 | int intensity = backlight_get_brightness(bd); |
20 | struct ipaq_micro_msg msg = { |
21 | .id = MSG_BACKLIGHT, |
22 | .tx_len = 3, |
23 | }; |
24 | |
25 | /* |
26 | * Message format: |
27 | * Byte 0: backlight instance (usually 1) |
28 | * Byte 1: on/off |
29 | * Byte 2: intensity, 0-255 |
30 | */ |
31 | msg.tx_data[0] = 0x01; |
32 | msg.tx_data[1] = intensity > 0 ? 1 : 0; |
33 | msg.tx_data[2] = intensity; |
34 | return ipaq_micro_tx_msg_sync(micro, msg: &msg); |
35 | } |
36 | |
37 | static const struct backlight_ops micro_bl_ops = { |
38 | .options = BL_CORE_SUSPENDRESUME, |
39 | .update_status = micro_bl_update_status, |
40 | }; |
41 | |
42 | static const struct backlight_properties micro_bl_props = { |
43 | .type = BACKLIGHT_RAW, |
44 | .max_brightness = 255, |
45 | .power = FB_BLANK_UNBLANK, |
46 | .brightness = 64, |
47 | }; |
48 | |
49 | static int micro_backlight_probe(struct platform_device *pdev) |
50 | { |
51 | struct backlight_device *bd; |
52 | struct ipaq_micro *micro = dev_get_drvdata(dev: pdev->dev.parent); |
53 | |
54 | bd = devm_backlight_device_register(dev: &pdev->dev, name: "ipaq-micro-backlight" , |
55 | parent: &pdev->dev, devdata: micro, ops: µ_bl_ops, |
56 | props: µ_bl_props); |
57 | if (IS_ERR(ptr: bd)) |
58 | return PTR_ERR(ptr: bd); |
59 | |
60 | platform_set_drvdata(pdev, data: bd); |
61 | backlight_update_status(bd); |
62 | |
63 | return 0; |
64 | } |
65 | |
66 | static struct platform_driver micro_backlight_device_driver = { |
67 | .driver = { |
68 | .name = "ipaq-micro-backlight" , |
69 | }, |
70 | .probe = micro_backlight_probe, |
71 | }; |
72 | module_platform_driver(micro_backlight_device_driver); |
73 | |
74 | MODULE_LICENSE("GPL v2" ); |
75 | MODULE_DESCRIPTION("driver for iPAQ Atmel micro backlight" ); |
76 | MODULE_ALIAS("platform:ipaq-micro-backlight" ); |
77 | |