View difference between Paste ID: LwcSY6Fi and 6pghxU6n
SHOW: | | - or go back to the newest paste.
1
#include <linux/init.h>
2
3
#include <linux/module.h>
4
#include <linux/backlight.h>
5
#include <linux/usb.h>
6
7
#include <linux/kernel.h>
8
#include <linux/slab.h>
9
10
#include "usb-pkk-backlight.h"
11
12-
static usb_complete_t urb_out_complete(struct urb *urb)
12+
static void urb_out_complete(struct urb *urb)
13
{
14
    return;
15
}
16
17
static int pkk_bl_get_brightness(struct backlight_device *bdev)
18
{
19
    struct pkk_bl_data *data = bl_get_data(bdev);
20
    //uint8_t *brightness = &bdev->props.brightness; //Not sure, that this is right
21
    uint8_t *brightness = &data->brightness;
22
23
    printk(KERN_DEBUG PKK_BL_DRIVER_NAME "Brightness get function called. Current brightness: %d.\n", *brightness);
24
    return *brightness;
25
}
26
27
static int pkk_bl_set_brightness(struct backlight_device *bdev)
28
{
29
    struct pkk_bl_data *data = bl_get_data(bdev);
30
    //uint8_t *brightness = &bdev->props.brightness; //Not sure, that this is right
31
    uint8_t *brightness = &data->brightness;
32
    unsigned char *transfer_buffer_out = data->transfer_buffer_out;
33
    int error;
34
35
    *brightness = bdev->props.brightness;
36
    printk(KERN_DEBUG PKK_BL_DRIVER_NAME "Brightness set function called. New brightness: %d.\n", *brightness);
37
38
    *transfer_buffer_out = PKK_BL_CMD_SET_BRIGHTNESS;
39
    transfer_buffer_out++;
40
    *transfer_buffer_out = *brightness;
41
42
    error = usb_submit_urb(data->urb, GFP_KERNEL);
43
    if (data->urb->status != 0 || error != 0)
44
    {
45
        printk(KERN_ERR PKK_BL_DRIVER_NAME "Urb submit failled. Urb status: %d. Usb_submit_urb returned:%d./n", data->urb->status, error);
46
    }
47
48
    return 0;
49
}
50
51
static const struct backlight_ops pkk_bl_blops = {
52
    .update_status  = pkk_bl_set_brightness,
53
    .get_brightness = pkk_bl_get_brightness,
54
};
55
56
57
static int pkk_bl_init_backlight(struct pkk_bl_data *data) // I'm not sure that it should be static
58
{
59
    struct device *dev = &data->intf->dev;
60
    struct backlight_device *bdev;
61
    struct backlight_properties props;
62
63
    printk(KERN_DEBUG PKK_BL_DRIVER_NAME "Backlight device initialization...\n");
64
65
    /* PicoLCD - There was sommething for hid_report */
66
67
    memset(&props, 0, sizeof(props));
68
    props.type = BACKLIGHT_RAW; //I don't know what is it
69
    props.max_brightness = PKK_BL_MAX_BRIGHTNESS;
70
71
    bdev = backlight_device_register(dev_name(dev), dev, data, &pkk_bl_blops, &props);
72
    if (IS_ERR(bdev))
73
    {
74
        printk(KERN_ERR PKK_BL_DRIVER_NAME "Failed to register backlight.\n");
75
        return PTR_ERR(bdev);
76
    }
77
78
    bdev->props.brightness  = PKK_BL_DEFAULT_BRIGHTNESS;
79
    data->bdev = bdev;
80
81
    pkk_bl_set_brightness(bdev);
82
83
    printk(KERN_DEBUG PKK_BL_DRIVER_NAME "Backlight device initialized.");
84
85
    return 0;
86
}
87
88
static void pkk_bl_exit_backlight(struct pkk_bl_data *data) // I'm not sure that it should be static
89
{
90
    struct backlight_device *bdev = data->bdev;
91
92
    printk(KERN_DEBUG PKK_BL_DRIVER_NAME "Backlight device unregistering...");
93
94
    data->bdev = NULL;
95
    if (bdev)
96
        backlight_device_unregister(bdev);
97
98
    printk(KERN_DEBUG PKK_BL_DRIVER_NAME "Backlight device unregistered successfully.");
99
}
100
101
static int pkk_bl_probe(struct usb_interface *intf, const struct usb_device_id *id)
102
{
103
    struct pkk_bl_data *data;
104
    int error = 0;
105
    struct urb *urb;
106
    unsigned char *transfer_buffer_out;
107
    struct usb_device *udev = interface_to_usbdev(intf);
108
109
    printk(KERN_DEBUG PKK_BL_DRIVER_NAME "Hardware probe...\n");
110
111
    /* Varibles initialization and assigments */
112
    data = kzalloc(sizeof(struct pkk_bl_data), GFP_KERNEL);
113
    if (data == NULL)
114
    {
115
        printk(KERN_ERR PKK_BL_DRIVER_NAME "Can't allocate space for device data.\n");
116
        error = -ENOMEM;
117
        goto err_no_cleanup;
118
    }
119
120
    /* PicoLCD - There was synchronization elements (initialization & using) */
121
122
    dev_set_drvdata(&intf->dev, data);
123
124
    /* Filling data structure */
125
126-
    data->udev_id = id;
126+
    data->udev_id = (struct usb_device_id *)id;
127
    data->udev = udev;
128
129
    /* Modules initialization */
130
    error = pkk_bl_init_backlight(data);
131
    if (error)
132
    {
133
        pkk_bl_exit_backlight(data);
134
        printk(KERN_ERR PKK_BL_DRIVER_NAME "Can't initializate backlight device.\n");
135
        goto err_cleanup_data;
136
    }
137
138
    urb = usb_alloc_urb(0, GFP_KERNEL);
139
    if (urb == NULL)
140
    {
141
        printk(KERN_ERR PKK_BL_DRIVER_NAME "Can't initializate urb.\n");
142
        goto err_exit_backlight;
143
    }
144
    data->urb = urb;
145
146
    transfer_buffer_out = kzalloc(sizeof(unsigned char) * PKK_BL_TRANSFER_BUFFER_OUT_SIZE, GFP_KERNEL);
147
    if (transfer_buffer_out == NULL)
148
    {
149
        printk(KERN_ERR PKK_BL_DRIVER_NAME "Can't allocate space for transfer buffer (out).\n");
150
        error = -ENOMEM;
151
        goto err_urb_cleanup;
152
    }
153
    data->transfer_buffer_out = transfer_buffer_out;
154
155-
    usb_fill_int_urb(urb, udev, usb_rcvintpipe(&intf->dev, PKK_BL_OUT_ENDPOINT), transfer_buffer_out, PKK_BL_TRANSFER_BUFFER_OUT_SIZE, urb_out_complete, data, PKK_BL_OUT_INTERVAL);
155+
    usb_fill_int_urb(urb, udev, usb_rcvintpipe(to_usb_device(&intf->dev), PKK_BL_OUT_ENDPOINT), transfer_buffer_out, PKK_BL_TRANSFER_BUFFER_OUT_SIZE, urb_out_complete, data, PKK_BL_OUT_INTERVAL);
156
157
    printk(KERN_DEBUG PKK_BL_DRIVER_NAME "Device activated and initialized.");
158
159
    return 0;
160
161
err_urb_cleanup:
162
    usb_free_urb(urb);
163
err_exit_backlight:
164
    pkk_bl_exit_backlight(data);
165
err_cleanup_data:
166
    kfree(data);
167
err_no_cleanup:
168
    //dev_set_drvdata(&intf->dev, NULL); - intf->dev->data Wasn't assigned in this step(dev_setdrvdata wasn't called)
169
170
    return error;
171
}
172
173
static void pkk_bl_disconnect(struct usb_interface *intf)
174
{
175
    struct pkk_bl_data *data = dev_get_drvdata(&intf->dev);
176
177
    printk(KERN_DEBUG PKK_BL_DRIVER_NAME "Hardware remove...");
178
179
    /* PicoLCD - There was synchronization elements (removing & using) */
180
181
    pkk_bl_exit_backlight(data);
182
    dev_set_drvdata(&intf->dev, NULL);
183
184
    usb_free_urb(data->urb);
185
    kfree(data->transfer_buffer_out);
186
    kfree(data);
187
188
    printk(KERN_DEBUG PKK_BL_DRIVER_NAME "Device disconnected successfully.");
189
}
190
191
static struct usb_device_id pkk_bl_devices [] = {
192
    { USB_DEVICE(USB_VENDOR_ID_PKK_BL, USB_DEVICE_ID_PKK_BL) },
193
    {}
194
};
195
MODULE_DEVICE_TABLE (usb, pkk_bl_devices);
196
197
static struct usb_driver pkk_bl_driver = {
198
    .name = "usb_pkk_backlight",
199
    .id_table = pkk_bl_devices,
200
    .probe = pkk_bl_probe,
201
    .disconnect = pkk_bl_disconnect,
202
};
203
module_usb_driver(pkk_bl_driver);
204
205
MODULE_DESCRIPTION("PKK USB backlight driver");
206
MODULE_LICENSE("GPL v2");
207
MODULE_AUTHOR("Dmitry Chepurovskiy <dm3chip@gmail.com>");