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