Linux Audio

Check our new training course

Loading...
Note: File does not exist in v6.8.
   1/***************************************************************************
   2 *   Copyright (C) 2010 by Bruno Prémont <bonbons@linux-vserver.org>       *
   3 *                                                                         *
   4 *   Based on Logitech G13 driver (v0.4)                                   *
   5 *     Copyright (C) 2009 by Rick L. Vinyard, Jr. <rvinyard@cs.nmsu.edu>   *
   6 *                                                                         *
   7 *   This program is free software: you can redistribute it and/or modify  *
   8 *   it under the terms of the GNU General Public License as published by  *
   9 *   the Free Software Foundation, version 2 of the License.               *
  10 *                                                                         *
  11 *   This driver is distributed in the hope that it will be useful, but    *
  12 *   WITHOUT ANY WARRANTY; without even the implied warranty of            *
  13 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      *
  14 *   General Public License for more details.                              *
  15 *                                                                         *
  16 *   You should have received a copy of the GNU General Public License     *
  17 *   along with this software. If not see <http://www.gnu.org/licenses/>.  *
  18 ***************************************************************************/
  19
  20#include <linux/hid.h>
  21#include <linux/hid-debug.h>
  22#include <linux/input.h>
  23#include "hid-ids.h"
  24#include "usbhid/usbhid.h"
  25#include <linux/usb.h>
  26
  27#include <linux/fb.h>
  28#include <linux/vmalloc.h>
  29#include <linux/backlight.h>
  30#include <linux/lcd.h>
  31
  32#include <linux/leds.h>
  33
  34#include <linux/seq_file.h>
  35#include <linux/debugfs.h>
  36
  37#include <linux/completion.h>
  38#include <linux/uaccess.h>
  39
  40#define PICOLCD_NAME "PicoLCD (graphic)"
  41
  42/* Report numbers */
  43#define REPORT_ERROR_CODE      0x10 /* LCD: IN[16]  */
  44#define   ERR_SUCCESS            0x00
  45#define   ERR_PARAMETER_MISSING  0x01
  46#define   ERR_DATA_MISSING       0x02
  47#define   ERR_BLOCK_READ_ONLY    0x03
  48#define   ERR_BLOCK_NOT_ERASABLE 0x04
  49#define   ERR_BLOCK_TOO_BIG      0x05
  50#define   ERR_SECTION_OVERFLOW   0x06
  51#define   ERR_INVALID_CMD_LEN    0x07
  52#define   ERR_INVALID_DATA_LEN   0x08
  53#define REPORT_KEY_STATE       0x11 /* LCD: IN[2]   */
  54#define REPORT_IR_DATA         0x21 /* LCD: IN[63]  */
  55#define REPORT_EE_DATA         0x32 /* LCD: IN[63]  */
  56#define REPORT_MEMORY          0x41 /* LCD: IN[63]  */
  57#define REPORT_LED_STATE       0x81 /* LCD: OUT[1]  */
  58#define REPORT_BRIGHTNESS      0x91 /* LCD: OUT[1]  */
  59#define REPORT_CONTRAST        0x92 /* LCD: OUT[1]  */
  60#define REPORT_RESET           0x93 /* LCD: OUT[2]  */
  61#define REPORT_LCD_CMD         0x94 /* LCD: OUT[63] */
  62#define REPORT_LCD_DATA        0x95 /* LCD: OUT[63] */
  63#define REPORT_LCD_CMD_DATA    0x96 /* LCD: OUT[63] */
  64#define	REPORT_EE_READ         0xa3 /* LCD: OUT[63] */
  65#define REPORT_EE_WRITE        0xa4 /* LCD: OUT[63] */
  66#define REPORT_ERASE_MEMORY    0xb2 /* LCD: OUT[2]  */
  67#define REPORT_READ_MEMORY     0xb3 /* LCD: OUT[3]  */
  68#define REPORT_WRITE_MEMORY    0xb4 /* LCD: OUT[63] */
  69#define REPORT_SPLASH_RESTART  0xc1 /* LCD: OUT[1]  */
  70#define REPORT_EXIT_KEYBOARD   0xef /* LCD: OUT[2]  */
  71#define REPORT_VERSION         0xf1 /* LCD: IN[2],OUT[1]    Bootloader: IN[2],OUT[1]   */
  72#define REPORT_BL_ERASE_MEMORY 0xf2 /*                      Bootloader: IN[36],OUT[4]  */
  73#define REPORT_BL_READ_MEMORY  0xf3 /*                      Bootloader: IN[36],OUT[4]  */
  74#define REPORT_BL_WRITE_MEMORY 0xf4 /*                      Bootloader: IN[36],OUT[36] */
  75#define REPORT_DEVID           0xf5 /* LCD: IN[5], OUT[1]   Bootloader: IN[5],OUT[1]   */
  76#define REPORT_SPLASH_SIZE     0xf6 /* LCD: IN[4], OUT[1]   */
  77#define REPORT_HOOK_VERSION    0xf7 /* LCD: IN[2], OUT[1]   */
  78#define REPORT_EXIT_FLASHER    0xff /*                      Bootloader: OUT[2]         */
  79
  80#ifdef CONFIG_HID_PICOLCD_FB
  81/* Framebuffer
  82 *
  83 * The PicoLCD use a Topway LCD module of 256x64 pixel
  84 * This display area is tiled over 4 controllers with 8 tiles
  85 * each. Each tile has 8x64 pixel, each data byte representing
  86 * a 1-bit wide vertical line of the tile.
  87 *
  88 * The display can be updated at a tile granularity.
  89 *
  90 *       Chip 1           Chip 2           Chip 3           Chip 4
  91 * +----------------+----------------+----------------+----------------+
  92 * |     Tile 1     |     Tile 1     |     Tile 1     |     Tile 1     |
  93 * +----------------+----------------+----------------+----------------+
  94 * |     Tile 2     |     Tile 2     |     Tile 2     |     Tile 2     |
  95 * +----------------+----------------+----------------+----------------+
  96 *                                  ...
  97 * +----------------+----------------+----------------+----------------+
  98 * |     Tile 8     |     Tile 8     |     Tile 8     |     Tile 8     |
  99 * +----------------+----------------+----------------+----------------+
 100 */
 101#define PICOLCDFB_NAME "picolcdfb"
 102#define PICOLCDFB_WIDTH (256)
 103#define PICOLCDFB_HEIGHT (64)
 104#define PICOLCDFB_SIZE (PICOLCDFB_WIDTH * PICOLCDFB_HEIGHT / 8)
 105
 106#define PICOLCDFB_UPDATE_RATE_LIMIT   10
 107#define PICOLCDFB_UPDATE_RATE_DEFAULT  2
 108
 109/* Framebuffer visual structures */
 110static const struct fb_fix_screeninfo picolcdfb_fix = {
 111	.id          = PICOLCDFB_NAME,
 112	.type        = FB_TYPE_PACKED_PIXELS,
 113	.visual      = FB_VISUAL_MONO01,
 114	.xpanstep    = 0,
 115	.ypanstep    = 0,
 116	.ywrapstep   = 0,
 117	.line_length = PICOLCDFB_WIDTH / 8,
 118	.accel       = FB_ACCEL_NONE,
 119};
 120
 121static const struct fb_var_screeninfo picolcdfb_var = {
 122	.xres           = PICOLCDFB_WIDTH,
 123	.yres           = PICOLCDFB_HEIGHT,
 124	.xres_virtual   = PICOLCDFB_WIDTH,
 125	.yres_virtual   = PICOLCDFB_HEIGHT,
 126	.width          = 103,
 127	.height         = 26,
 128	.bits_per_pixel = 1,
 129	.grayscale      = 1,
 130	.red            = {
 131		.offset = 0,
 132		.length = 1,
 133		.msb_right = 0,
 134	},
 135	.green          = {
 136		.offset = 0,
 137		.length = 1,
 138		.msb_right = 0,
 139	},
 140	.blue           = {
 141		.offset = 0,
 142		.length = 1,
 143		.msb_right = 0,
 144	},
 145	.transp         = {
 146		.offset = 0,
 147		.length = 0,
 148		.msb_right = 0,
 149	},
 150};
 151#endif /* CONFIG_HID_PICOLCD_FB */
 152
 153/* Input device
 154 *
 155 * The PicoLCD has an IR receiver header, a built-in keypad with 5 keys
 156 * and header for 4x4 key matrix. The built-in keys are part of the matrix.
 157 */
 158static const unsigned short def_keymap[] = {
 159	KEY_RESERVED,	/* none */
 160	KEY_BACK,	/* col 4 + row 1 */
 161	KEY_HOMEPAGE,	/* col 3 + row 1 */
 162	KEY_RESERVED,	/* col 2 + row 1 */
 163	KEY_RESERVED,	/* col 1 + row 1 */
 164	KEY_SCROLLUP,	/* col 4 + row 2 */
 165	KEY_OK,		/* col 3 + row 2 */
 166	KEY_SCROLLDOWN,	/* col 2 + row 2 */
 167	KEY_RESERVED,	/* col 1 + row 2 */
 168	KEY_RESERVED,	/* col 4 + row 3 */
 169	KEY_RESERVED,	/* col 3 + row 3 */
 170	KEY_RESERVED,	/* col 2 + row 3 */
 171	KEY_RESERVED,	/* col 1 + row 3 */
 172	KEY_RESERVED,	/* col 4 + row 4 */
 173	KEY_RESERVED,	/* col 3 + row 4 */
 174	KEY_RESERVED,	/* col 2 + row 4 */
 175	KEY_RESERVED,	/* col 1 + row 4 */
 176};
 177#define PICOLCD_KEYS ARRAY_SIZE(def_keymap)
 178
 179/* Description of in-progress IO operation, used for operations
 180 * that trigger response from device */
 181struct picolcd_pending {
 182	struct hid_report *out_report;
 183	struct hid_report *in_report;
 184	struct completion ready;
 185	int raw_size;
 186	u8 raw_data[64];
 187};
 188
 189/* Per device data structure */
 190struct picolcd_data {
 191	struct hid_device *hdev;
 192#ifdef CONFIG_DEBUG_FS
 193	struct dentry *debug_reset;
 194	struct dentry *debug_eeprom;
 195	struct dentry *debug_flash;
 196	struct mutex mutex_flash;
 197	int addr_sz;
 198#endif
 199	u8 version[2];
 200	unsigned short opmode_delay;
 201	/* input stuff */
 202	u8 pressed_keys[2];
 203	struct input_dev *input_keys;
 204	struct input_dev *input_cir;
 205	unsigned short keycode[PICOLCD_KEYS];
 206
 207#ifdef CONFIG_HID_PICOLCD_FB
 208	/* Framebuffer stuff */
 209	u8 fb_update_rate;
 210	u8 fb_bpp;
 211	u8 fb_force;
 212	u8 *fb_vbitmap;		/* local copy of what was sent to PicoLCD */
 213	u8 *fb_bitmap;		/* framebuffer */
 214	struct fb_info *fb_info;
 215	struct fb_deferred_io fb_defio;
 216#endif /* CONFIG_HID_PICOLCD_FB */
 217#ifdef CONFIG_HID_PICOLCD_LCD
 218	struct lcd_device *lcd;
 219	u8 lcd_contrast;
 220#endif /* CONFIG_HID_PICOLCD_LCD */
 221#ifdef CONFIG_HID_PICOLCD_BACKLIGHT
 222	struct backlight_device *backlight;
 223	u8 lcd_brightness;
 224	u8 lcd_power;
 225#endif /* CONFIG_HID_PICOLCD_BACKLIGHT */
 226#ifdef CONFIG_HID_PICOLCD_LEDS
 227	/* LED stuff */
 228	u8 led_state;
 229	struct led_classdev *led[8];
 230#endif /* CONFIG_HID_PICOLCD_LEDS */
 231
 232	/* Housekeeping stuff */
 233	spinlock_t lock;
 234	struct mutex mutex;
 235	struct picolcd_pending *pending;
 236	int status;
 237#define PICOLCD_BOOTLOADER 1
 238#define PICOLCD_FAILED 2
 239#define PICOLCD_READY_FB 4
 240};
 241
 242
 243/* Find a given report */
 244#define picolcd_in_report(id, dev) picolcd_report(id, dev, HID_INPUT_REPORT)
 245#define picolcd_out_report(id, dev) picolcd_report(id, dev, HID_OUTPUT_REPORT)
 246
 247static struct hid_report *picolcd_report(int id, struct hid_device *hdev, int dir)
 248{
 249	struct list_head *feature_report_list = &hdev->report_enum[dir].report_list;
 250	struct hid_report *report = NULL;
 251
 252	list_for_each_entry(report, feature_report_list, list) {
 253		if (report->id == id)
 254			return report;
 255	}
 256	hid_warn(hdev, "No report with id 0x%x found\n", id);
 257	return NULL;
 258}
 259
 260#ifdef CONFIG_DEBUG_FS
 261static void picolcd_debug_out_report(struct picolcd_data *data,
 262		struct hid_device *hdev, struct hid_report *report);
 263#define usbhid_submit_report(a, b, c) \
 264	do { \
 265		picolcd_debug_out_report(hid_get_drvdata(a), a, b); \
 266		usbhid_submit_report(a, b, c); \
 267	} while (0)
 268#endif
 269
 270/* Submit a report and wait for a reply from device - if device fades away
 271 * or does not respond in time, return NULL */
 272static struct picolcd_pending *picolcd_send_and_wait(struct hid_device *hdev,
 273		int report_id, const u8 *raw_data, int size)
 274{
 275	struct picolcd_data *data = hid_get_drvdata(hdev);
 276	struct picolcd_pending *work;
 277	struct hid_report *report = picolcd_out_report(report_id, hdev);
 278	unsigned long flags;
 279	int i, j, k;
 280
 281	if (!report || !data)
 282		return NULL;
 283	if (data->status & PICOLCD_FAILED)
 284		return NULL;
 285	work = kzalloc(sizeof(*work), GFP_KERNEL);
 286	if (!work)
 287		return NULL;
 288
 289	init_completion(&work->ready);
 290	work->out_report = report;
 291	work->in_report  = NULL;
 292	work->raw_size   = 0;
 293
 294	mutex_lock(&data->mutex);
 295	spin_lock_irqsave(&data->lock, flags);
 296	for (i = k = 0; i < report->maxfield; i++)
 297		for (j = 0; j < report->field[i]->report_count; j++) {
 298			hid_set_field(report->field[i], j, k < size ? raw_data[k] : 0);
 299			k++;
 300		}
 301	data->pending = work;
 302	usbhid_submit_report(data->hdev, report, USB_DIR_OUT);
 303	spin_unlock_irqrestore(&data->lock, flags);
 304	wait_for_completion_interruptible_timeout(&work->ready, HZ*2);
 305	spin_lock_irqsave(&data->lock, flags);
 306	data->pending = NULL;
 307	spin_unlock_irqrestore(&data->lock, flags);
 308	mutex_unlock(&data->mutex);
 309	return work;
 310}
 311
 312#ifdef CONFIG_HID_PICOLCD_FB
 313/* Send a given tile to PicoLCD */
 314static int picolcd_fb_send_tile(struct hid_device *hdev, int chip, int tile)
 315{
 316	struct picolcd_data *data = hid_get_drvdata(hdev);
 317	struct hid_report *report1 = picolcd_out_report(REPORT_LCD_CMD_DATA, hdev);
 318	struct hid_report *report2 = picolcd_out_report(REPORT_LCD_DATA, hdev);
 319	unsigned long flags;
 320	u8 *tdata;
 321	int i;
 322
 323	if (!report1 || report1->maxfield != 1 || !report2 || report2->maxfield != 1)
 324		return -ENODEV;
 325
 326	spin_lock_irqsave(&data->lock, flags);
 327	hid_set_field(report1->field[0],  0, chip << 2);
 328	hid_set_field(report1->field[0],  1, 0x02);
 329	hid_set_field(report1->field[0],  2, 0x00);
 330	hid_set_field(report1->field[0],  3, 0x00);
 331	hid_set_field(report1->field[0],  4, 0xb8 | tile);
 332	hid_set_field(report1->field[0],  5, 0x00);
 333	hid_set_field(report1->field[0],  6, 0x00);
 334	hid_set_field(report1->field[0],  7, 0x40);
 335	hid_set_field(report1->field[0],  8, 0x00);
 336	hid_set_field(report1->field[0],  9, 0x00);
 337	hid_set_field(report1->field[0], 10,   32);
 338
 339	hid_set_field(report2->field[0],  0, (chip << 2) | 0x01);
 340	hid_set_field(report2->field[0],  1, 0x00);
 341	hid_set_field(report2->field[0],  2, 0x00);
 342	hid_set_field(report2->field[0],  3,   32);
 343
 344	tdata = data->fb_vbitmap + (tile * 4 + chip) * 64;
 345	for (i = 0; i < 64; i++)
 346		if (i < 32)
 347			hid_set_field(report1->field[0], 11 + i, tdata[i]);
 348		else
 349			hid_set_field(report2->field[0], 4 + i - 32, tdata[i]);
 350
 351	usbhid_submit_report(data->hdev, report1, USB_DIR_OUT);
 352	usbhid_submit_report(data->hdev, report2, USB_DIR_OUT);
 353	spin_unlock_irqrestore(&data->lock, flags);
 354	return 0;
 355}
 356
 357/* Translate a single tile*/
 358static int picolcd_fb_update_tile(u8 *vbitmap, const u8 *bitmap, int bpp,
 359		int chip, int tile)
 360{
 361	int i, b, changed = 0;
 362	u8 tdata[64];
 363	u8 *vdata = vbitmap + (tile * 4 + chip) * 64;
 364
 365	if (bpp == 1) {
 366		for (b = 7; b >= 0; b--) {
 367			const u8 *bdata = bitmap + tile * 256 + chip * 8 + b * 32;
 368			for (i = 0; i < 64; i++) {
 369				tdata[i] <<= 1;
 370				tdata[i] |= (bdata[i/8] >> (i % 8)) & 0x01;
 371			}
 372		}
 373	} else if (bpp == 8) {
 374		for (b = 7; b >= 0; b--) {
 375			const u8 *bdata = bitmap + (tile * 256 + chip * 8 + b * 32) * 8;
 376			for (i = 0; i < 64; i++) {
 377				tdata[i] <<= 1;
 378				tdata[i] |= (bdata[i] & 0x80) ? 0x01 : 0x00;
 379			}
 380		}
 381	} else {
 382		/* Oops, we should never get here! */
 383		WARN_ON(1);
 384		return 0;
 385	}
 386
 387	for (i = 0; i < 64; i++)
 388		if (tdata[i] != vdata[i]) {
 389			changed = 1;
 390			vdata[i] = tdata[i];
 391		}
 392	return changed;
 393}
 394
 395/* Reconfigure LCD display */
 396static int picolcd_fb_reset(struct picolcd_data *data, int clear)
 397{
 398	struct hid_report *report = picolcd_out_report(REPORT_LCD_CMD, data->hdev);
 399	int i, j;
 400	unsigned long flags;
 401	static const u8 mapcmd[8] = { 0x00, 0x02, 0x00, 0x64, 0x3f, 0x00, 0x64, 0xc0 };
 402
 403	if (!report || report->maxfield != 1)
 404		return -ENODEV;
 405
 406	spin_lock_irqsave(&data->lock, flags);
 407	for (i = 0; i < 4; i++) {
 408		for (j = 0; j < report->field[0]->maxusage; j++)
 409			if (j == 0)
 410				hid_set_field(report->field[0], j, i << 2);
 411			else if (j < sizeof(mapcmd))
 412				hid_set_field(report->field[0], j, mapcmd[j]);
 413			else
 414				hid_set_field(report->field[0], j, 0);
 415		usbhid_submit_report(data->hdev, report, USB_DIR_OUT);
 416	}
 417
 418	data->status |= PICOLCD_READY_FB;
 419	spin_unlock_irqrestore(&data->lock, flags);
 420
 421	if (data->fb_bitmap) {
 422		if (clear) {
 423			memset(data->fb_vbitmap, 0, PICOLCDFB_SIZE);
 424			memset(data->fb_bitmap, 0, PICOLCDFB_SIZE*data->fb_bpp);
 425		}
 426		data->fb_force = 1;
 427	}
 428
 429	/* schedule first output of framebuffer */
 430	if (data->fb_info)
 431		schedule_delayed_work(&data->fb_info->deferred_work, 0);
 432
 433	return 0;
 434}
 435
 436/* Update fb_vbitmap from the screen_base and send changed tiles to device */
 437static void picolcd_fb_update(struct picolcd_data *data)
 438{
 439	int chip, tile, n;
 440	unsigned long flags;
 441
 442	if (!data)
 443		return;
 444
 445	spin_lock_irqsave(&data->lock, flags);
 446	if (!(data->status & PICOLCD_READY_FB)) {
 447		spin_unlock_irqrestore(&data->lock, flags);
 448		picolcd_fb_reset(data, 0);
 449	} else {
 450		spin_unlock_irqrestore(&data->lock, flags);
 451	}
 452
 453	/*
 454	 * Translate the framebuffer into the format needed by the PicoLCD.
 455	 * See display layout above.
 456	 * Do this one tile after the other and push those tiles that changed.
 457	 *
 458	 * Wait for our IO to complete as otherwise we might flood the queue!
 459	 */
 460	n = 0;
 461	for (chip = 0; chip < 4; chip++)
 462		for (tile = 0; tile < 8; tile++)
 463			if (picolcd_fb_update_tile(data->fb_vbitmap,
 464					data->fb_bitmap, data->fb_bpp, chip, tile) ||
 465				data->fb_force) {
 466				n += 2;
 467				if (!data->fb_info->par)
 468					return; /* device lost! */
 469				if (n >= HID_OUTPUT_FIFO_SIZE / 2) {
 470					usbhid_wait_io(data->hdev);
 471					n = 0;
 472				}
 473				picolcd_fb_send_tile(data->hdev, chip, tile);
 474			}
 475	data->fb_force = false;
 476	if (n)
 477		usbhid_wait_io(data->hdev);
 478}
 479
 480/* Stub to call the system default and update the image on the picoLCD */
 481static void picolcd_fb_fillrect(struct fb_info *info,
 482		const struct fb_fillrect *rect)
 483{
 484	if (!info->par)
 485		return;
 486	sys_fillrect(info, rect);
 487
 488	schedule_delayed_work(&info->deferred_work, 0);
 489}
 490
 491/* Stub to call the system default and update the image on the picoLCD */
 492static void picolcd_fb_copyarea(struct fb_info *info,
 493		const struct fb_copyarea *area)
 494{
 495	if (!info->par)
 496		return;
 497	sys_copyarea(info, area);
 498
 499	schedule_delayed_work(&info->deferred_work, 0);
 500}
 501
 502/* Stub to call the system default and update the image on the picoLCD */
 503static void picolcd_fb_imageblit(struct fb_info *info, const struct fb_image *image)
 504{
 505	if (!info->par)
 506		return;
 507	sys_imageblit(info, image);
 508
 509	schedule_delayed_work(&info->deferred_work, 0);
 510}
 511
 512/*
 513 * this is the slow path from userspace. they can seek and write to
 514 * the fb. it's inefficient to do anything less than a full screen draw
 515 */
 516static ssize_t picolcd_fb_write(struct fb_info *info, const char __user *buf,
 517		size_t count, loff_t *ppos)
 518{
 519	ssize_t ret;
 520	if (!info->par)
 521		return -ENODEV;
 522	ret = fb_sys_write(info, buf, count, ppos);
 523	if (ret >= 0)
 524		schedule_delayed_work(&info->deferred_work, 0);
 525	return ret;
 526}
 527
 528static int picolcd_fb_blank(int blank, struct fb_info *info)
 529{
 530	if (!info->par)
 531		return -ENODEV;
 532	/* We let fb notification do this for us via lcd/backlight device */
 533	return 0;
 534}
 535
 536static void picolcd_fb_destroy(struct fb_info *info)
 537{
 538	struct picolcd_data *data = info->par;
 539	u32 *ref_cnt = info->pseudo_palette;
 540	int may_release;
 541
 542	info->par = NULL;
 543	if (data)
 544		data->fb_info = NULL;
 545	fb_deferred_io_cleanup(info);
 546
 547	ref_cnt--;
 548	mutex_lock(&info->lock);
 549	(*ref_cnt)--;
 550	may_release = !*ref_cnt;
 551	mutex_unlock(&info->lock);
 552	if (may_release) {
 553		vfree((u8 *)info->fix.smem_start);
 554		framebuffer_release(info);
 555	}
 556}
 557
 558static int picolcd_fb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
 559{
 560	__u32 bpp      = var->bits_per_pixel;
 561	__u32 activate = var->activate;
 562
 563	/* only allow 1/8 bit depth (8-bit is grayscale) */
 564	*var = picolcdfb_var;
 565	var->activate = activate;
 566	if (bpp >= 8) {
 567		var->bits_per_pixel = 8;
 568		var->red.length     = 8;
 569		var->green.length   = 8;
 570		var->blue.length    = 8;
 571	} else {
 572		var->bits_per_pixel = 1;
 573		var->red.length     = 1;
 574		var->green.length   = 1;
 575		var->blue.length    = 1;
 576	}
 577	return 0;
 578}
 579
 580static int picolcd_set_par(struct fb_info *info)
 581{
 582	struct picolcd_data *data = info->par;
 583	u8 *tmp_fb, *o_fb;
 584	if (!data)
 585		return -ENODEV;
 586	if (info->var.bits_per_pixel == data->fb_bpp)
 587		return 0;
 588	/* switch between 1/8 bit depths */
 589	if (info->var.bits_per_pixel != 1 && info->var.bits_per_pixel != 8)
 590		return -EINVAL;
 591
 592	o_fb   = data->fb_bitmap;
 593	tmp_fb = kmalloc(PICOLCDFB_SIZE*info->var.bits_per_pixel, GFP_KERNEL);
 594	if (!tmp_fb)
 595		return -ENOMEM;
 596
 597	/* translate FB content to new bits-per-pixel */
 598	if (info->var.bits_per_pixel == 1) {
 599		int i, b;
 600		for (i = 0; i < PICOLCDFB_SIZE; i++) {
 601			u8 p = 0;
 602			for (b = 0; b < 8; b++) {
 603				p <<= 1;
 604				p |= o_fb[i*8+b] ? 0x01 : 0x00;
 605			}
 606			tmp_fb[i] = p;
 607		}
 608		memcpy(o_fb, tmp_fb, PICOLCDFB_SIZE);
 609		info->fix.visual = FB_VISUAL_MONO01;
 610		info->fix.line_length = PICOLCDFB_WIDTH / 8;
 611	} else {
 612		int i;
 613		memcpy(tmp_fb, o_fb, PICOLCDFB_SIZE);
 614		for (i = 0; i < PICOLCDFB_SIZE * 8; i++)
 615			o_fb[i] = tmp_fb[i/8] & (0x01 << (7 - i % 8)) ? 0xff : 0x00;
 616		info->fix.visual = FB_VISUAL_DIRECTCOLOR;
 617		info->fix.line_length = PICOLCDFB_WIDTH;
 618	}
 619
 620	kfree(tmp_fb);
 621	data->fb_bpp      = info->var.bits_per_pixel;
 622	return 0;
 623}
 624
 625/* Do refcounting on our FB and cleanup per worker if FB is
 626 * closed after unplug of our device
 627 * (fb_release holds info->lock and still touches info after
 628 *  we return so we can't release it immediately.
 629 */
 630struct picolcd_fb_cleanup_item {
 631	struct fb_info *info;
 632	struct picolcd_fb_cleanup_item *next;
 633};
 634static struct picolcd_fb_cleanup_item *fb_pending;
 635DEFINE_SPINLOCK(fb_pending_lock);
 636
 637static void picolcd_fb_do_cleanup(struct work_struct *data)
 638{
 639	struct picolcd_fb_cleanup_item *item;
 640	unsigned long flags;
 641
 642	do {
 643		spin_lock_irqsave(&fb_pending_lock, flags);
 644		item = fb_pending;
 645		fb_pending = item ? item->next : NULL;
 646		spin_unlock_irqrestore(&fb_pending_lock, flags);
 647
 648		if (item) {
 649			u8 *fb = (u8 *)item->info->fix.smem_start;
 650			/* make sure we do not race against fb core when
 651			 * releasing */
 652			mutex_lock(&item->info->lock);
 653			mutex_unlock(&item->info->lock);
 654			framebuffer_release(item->info);
 655			vfree(fb);
 656		}
 657	} while (item);
 658}
 659
 660DECLARE_WORK(picolcd_fb_cleanup, picolcd_fb_do_cleanup);
 661
 662static int picolcd_fb_open(struct fb_info *info, int u)
 663{
 664	u32 *ref_cnt = info->pseudo_palette;
 665	ref_cnt--;
 666
 667	(*ref_cnt)++;
 668	return 0;
 669}
 670
 671static int picolcd_fb_release(struct fb_info *info, int u)
 672{
 673	u32 *ref_cnt = info->pseudo_palette;
 674	ref_cnt--;
 675
 676	(*ref_cnt)++;
 677	if (!*ref_cnt) {
 678		unsigned long flags;
 679		struct picolcd_fb_cleanup_item *item = (struct picolcd_fb_cleanup_item *)ref_cnt;
 680		item--;
 681		spin_lock_irqsave(&fb_pending_lock, flags);
 682		item->next = fb_pending;
 683		fb_pending = item;
 684		spin_unlock_irqrestore(&fb_pending_lock, flags);
 685		schedule_work(&picolcd_fb_cleanup);
 686	}
 687	return 0;
 688}
 689
 690/* Note this can't be const because of struct fb_info definition */
 691static struct fb_ops picolcdfb_ops = {
 692	.owner        = THIS_MODULE,
 693	.fb_destroy   = picolcd_fb_destroy,
 694	.fb_open      = picolcd_fb_open,
 695	.fb_release   = picolcd_fb_release,
 696	.fb_read      = fb_sys_read,
 697	.fb_write     = picolcd_fb_write,
 698	.fb_blank     = picolcd_fb_blank,
 699	.fb_fillrect  = picolcd_fb_fillrect,
 700	.fb_copyarea  = picolcd_fb_copyarea,
 701	.fb_imageblit = picolcd_fb_imageblit,
 702	.fb_check_var = picolcd_fb_check_var,
 703	.fb_set_par   = picolcd_set_par,
 704};
 705
 706
 707/* Callback from deferred IO workqueue */
 708static void picolcd_fb_deferred_io(struct fb_info *info, struct list_head *pagelist)
 709{
 710	picolcd_fb_update(info->par);
 711}
 712
 713static const struct fb_deferred_io picolcd_fb_defio = {
 714	.delay = HZ / PICOLCDFB_UPDATE_RATE_DEFAULT,
 715	.deferred_io = picolcd_fb_deferred_io,
 716};
 717
 718
 719/*
 720 * The "fb_update_rate" sysfs attribute
 721 */
 722static ssize_t picolcd_fb_update_rate_show(struct device *dev,
 723		struct device_attribute *attr, char *buf)
 724{
 725	struct picolcd_data *data = dev_get_drvdata(dev);
 726	unsigned i, fb_update_rate = data->fb_update_rate;
 727	size_t ret = 0;
 728
 729	for (i = 1; i <= PICOLCDFB_UPDATE_RATE_LIMIT; i++)
 730		if (ret >= PAGE_SIZE)
 731			break;
 732		else if (i == fb_update_rate)
 733			ret += snprintf(buf+ret, PAGE_SIZE-ret, "[%u] ", i);
 734		else
 735			ret += snprintf(buf+ret, PAGE_SIZE-ret, "%u ", i);
 736	if (ret > 0)
 737		buf[min(ret, (size_t)PAGE_SIZE)-1] = '\n';
 738	return ret;
 739}
 740
 741static ssize_t picolcd_fb_update_rate_store(struct device *dev,
 742		struct device_attribute *attr, const char *buf, size_t count)
 743{
 744	struct picolcd_data *data = dev_get_drvdata(dev);
 745	int i;
 746	unsigned u;
 747
 748	if (count < 1 || count > 10)
 749		return -EINVAL;
 750
 751	i = sscanf(buf, "%u", &u);
 752	if (i != 1)
 753		return -EINVAL;
 754
 755	if (u > PICOLCDFB_UPDATE_RATE_LIMIT)
 756		return -ERANGE;
 757	else if (u == 0)
 758		u = PICOLCDFB_UPDATE_RATE_DEFAULT;
 759
 760	data->fb_update_rate = u;
 761	data->fb_defio.delay = HZ / data->fb_update_rate;
 762	return count;
 763}
 764
 765static DEVICE_ATTR(fb_update_rate, 0666, picolcd_fb_update_rate_show,
 766		picolcd_fb_update_rate_store);
 767
 768/* initialize Framebuffer device */
 769static int picolcd_init_framebuffer(struct picolcd_data *data)
 770{
 771	struct device *dev = &data->hdev->dev;
 772	struct fb_info *info = NULL;
 773	int i, error = -ENOMEM;
 774	u8 *fb_vbitmap = NULL;
 775	u8 *fb_bitmap  = NULL;
 776	u32 *palette;
 777
 778	fb_bitmap = vmalloc(PICOLCDFB_SIZE*8);
 779	if (fb_bitmap == NULL) {
 780		dev_err(dev, "can't get a free page for framebuffer\n");
 781		goto err_nomem;
 782	}
 783
 784	fb_vbitmap = kmalloc(PICOLCDFB_SIZE, GFP_KERNEL);
 785	if (fb_vbitmap == NULL) {
 786		dev_err(dev, "can't alloc vbitmap image buffer\n");
 787		goto err_nomem;
 788	}
 789
 790	data->fb_update_rate = PICOLCDFB_UPDATE_RATE_DEFAULT;
 791	data->fb_defio = picolcd_fb_defio;
 792	/* The extra memory is:
 793	 * - struct picolcd_fb_cleanup_item
 794	 * - u32 for ref_count
 795	 * - 256*u32 for pseudo_palette
 796	 */
 797	info = framebuffer_alloc(257 * sizeof(u32) + sizeof(struct picolcd_fb_cleanup_item), dev);
 798	if (info == NULL) {
 799		dev_err(dev, "failed to allocate a framebuffer\n");
 800		goto err_nomem;
 801	}
 802
 803	palette  = info->par + sizeof(struct picolcd_fb_cleanup_item);
 804	*palette = 1;
 805	palette++;
 806	for (i = 0; i < 256; i++)
 807		palette[i] = i > 0 && i < 16 ? 0xff : 0;
 808	info->pseudo_palette = palette;
 809	info->fbdefio = &data->fb_defio;
 810	info->screen_base = (char __force __iomem *)fb_bitmap;
 811	info->fbops = &picolcdfb_ops;
 812	info->var = picolcdfb_var;
 813	info->fix = picolcdfb_fix;
 814	info->fix.smem_len   = PICOLCDFB_SIZE*8;
 815	info->fix.smem_start = (unsigned long)fb_bitmap;
 816	info->par = data;
 817	info->flags = FBINFO_FLAG_DEFAULT;
 818
 819	data->fb_vbitmap = fb_vbitmap;
 820	data->fb_bitmap  = fb_bitmap;
 821	data->fb_bpp     = picolcdfb_var.bits_per_pixel;
 822	error = picolcd_fb_reset(data, 1);
 823	if (error) {
 824		dev_err(dev, "failed to configure display\n");
 825		goto err_cleanup;
 826	}
 827	error = device_create_file(dev, &dev_attr_fb_update_rate);
 828	if (error) {
 829		dev_err(dev, "failed to create sysfs attributes\n");
 830		goto err_cleanup;
 831	}
 832	fb_deferred_io_init(info);
 833	data->fb_info    = info;
 834	error = register_framebuffer(info);
 835	if (error) {
 836		dev_err(dev, "failed to register framebuffer\n");
 837		goto err_sysfs;
 838	}
 839	/* schedule first output of framebuffer */
 840	data->fb_force = 1;
 841	schedule_delayed_work(&info->deferred_work, 0);
 842	return 0;
 843
 844err_sysfs:
 845	fb_deferred_io_cleanup(info);
 846	device_remove_file(dev, &dev_attr_fb_update_rate);
 847err_cleanup:
 848	data->fb_vbitmap = NULL;
 849	data->fb_bitmap  = NULL;
 850	data->fb_bpp     = 0;
 851	data->fb_info    = NULL;
 852
 853err_nomem:
 854	framebuffer_release(info);
 855	vfree(fb_bitmap);
 856	kfree(fb_vbitmap);
 857	return error;
 858}
 859
 860static void picolcd_exit_framebuffer(struct picolcd_data *data)
 861{
 862	struct fb_info *info = data->fb_info;
 863	u8 *fb_vbitmap = data->fb_vbitmap;
 864
 865	if (!info)
 866		return;
 867
 868	info->par = NULL;
 869	device_remove_file(&data->hdev->dev, &dev_attr_fb_update_rate);
 870	unregister_framebuffer(info);
 871	data->fb_vbitmap = NULL;
 872	data->fb_bitmap  = NULL;
 873	data->fb_bpp     = 0;
 874	data->fb_info    = NULL;
 875	kfree(fb_vbitmap);
 876}
 877
 878#define picolcd_fbinfo(d) ((d)->fb_info)
 879#else
 880static inline int picolcd_fb_reset(struct picolcd_data *data, int clear)
 881{
 882	return 0;
 883}
 884static inline int picolcd_init_framebuffer(struct picolcd_data *data)
 885{
 886	return 0;
 887}
 888static inline void picolcd_exit_framebuffer(struct picolcd_data *data)
 889{
 890}
 891#define picolcd_fbinfo(d) NULL
 892#endif /* CONFIG_HID_PICOLCD_FB */
 893
 894#ifdef CONFIG_HID_PICOLCD_BACKLIGHT
 895/*
 896 * backlight class device
 897 */
 898static int picolcd_get_brightness(struct backlight_device *bdev)
 899{
 900	struct picolcd_data *data = bl_get_data(bdev);
 901	return data->lcd_brightness;
 902}
 903
 904static int picolcd_set_brightness(struct backlight_device *bdev)
 905{
 906	struct picolcd_data *data = bl_get_data(bdev);
 907	struct hid_report *report = picolcd_out_report(REPORT_BRIGHTNESS, data->hdev);
 908	unsigned long flags;
 909
 910	if (!report || report->maxfield != 1 || report->field[0]->report_count != 1)
 911		return -ENODEV;
 912
 913	data->lcd_brightness = bdev->props.brightness & 0x0ff;
 914	data->lcd_power      = bdev->props.power;
 915	spin_lock_irqsave(&data->lock, flags);
 916	hid_set_field(report->field[0], 0, data->lcd_power == FB_BLANK_UNBLANK ? data->lcd_brightness : 0);
 917	usbhid_submit_report(data->hdev, report, USB_DIR_OUT);
 918	spin_unlock_irqrestore(&data->lock, flags);
 919	return 0;
 920}
 921
 922static int picolcd_check_bl_fb(struct backlight_device *bdev, struct fb_info *fb)
 923{
 924	return fb && fb == picolcd_fbinfo((struct picolcd_data *)bl_get_data(bdev));
 925}
 926
 927static const struct backlight_ops picolcd_blops = {
 928	.update_status  = picolcd_set_brightness,
 929	.get_brightness = picolcd_get_brightness,
 930	.check_fb       = picolcd_check_bl_fb,
 931};
 932
 933static int picolcd_init_backlight(struct picolcd_data *data, struct hid_report *report)
 934{
 935	struct device *dev = &data->hdev->dev;
 936	struct backlight_device *bdev;
 937	struct backlight_properties props;
 938	if (!report)
 939		return -ENODEV;
 940	if (report->maxfield != 1 || report->field[0]->report_count != 1 ||
 941			report->field[0]->report_size != 8) {
 942		dev_err(dev, "unsupported BRIGHTNESS report");
 943		return -EINVAL;
 944	}
 945
 946	memset(&props, 0, sizeof(props));
 947	props.type = BACKLIGHT_RAW;
 948	props.max_brightness = 0xff;
 949	bdev = backlight_device_register(dev_name(dev), dev, data,
 950			&picolcd_blops, &props);
 951	if (IS_ERR(bdev)) {
 952		dev_err(dev, "failed to register backlight\n");
 953		return PTR_ERR(bdev);
 954	}
 955	bdev->props.brightness     = 0xff;
 956	data->lcd_brightness       = 0xff;
 957	data->backlight            = bdev;
 958	picolcd_set_brightness(bdev);
 959	return 0;
 960}
 961
 962static void picolcd_exit_backlight(struct picolcd_data *data)
 963{
 964	struct backlight_device *bdev = data->backlight;
 965
 966	data->backlight = NULL;
 967	if (bdev)
 968		backlight_device_unregister(bdev);
 969}
 970
 971static inline int picolcd_resume_backlight(struct picolcd_data *data)
 972{
 973	if (!data->backlight)
 974		return 0;
 975	return picolcd_set_brightness(data->backlight);
 976}
 977
 978#ifdef CONFIG_PM
 979static void picolcd_suspend_backlight(struct picolcd_data *data)
 980{
 981	int bl_power = data->lcd_power;
 982	if (!data->backlight)
 983		return;
 984
 985	data->backlight->props.power = FB_BLANK_POWERDOWN;
 986	picolcd_set_brightness(data->backlight);
 987	data->lcd_power = data->backlight->props.power = bl_power;
 988}
 989#endif /* CONFIG_PM */
 990#else
 991static inline int picolcd_init_backlight(struct picolcd_data *data,
 992		struct hid_report *report)
 993{
 994	return 0;
 995}
 996static inline void picolcd_exit_backlight(struct picolcd_data *data)
 997{
 998}
 999static inline int picolcd_resume_backlight(struct picolcd_data *data)
1000{
1001	return 0;
1002}
1003static inline void picolcd_suspend_backlight(struct picolcd_data *data)
1004{
1005}
1006#endif /* CONFIG_HID_PICOLCD_BACKLIGHT */
1007
1008#ifdef CONFIG_HID_PICOLCD_LCD
1009/*
1010 * lcd class device
1011 */
1012static int picolcd_get_contrast(struct lcd_device *ldev)
1013{
1014	struct picolcd_data *data = lcd_get_data(ldev);
1015	return data->lcd_contrast;
1016}
1017
1018static int picolcd_set_contrast(struct lcd_device *ldev, int contrast)
1019{
1020	struct picolcd_data *data = lcd_get_data(ldev);
1021	struct hid_report *report = picolcd_out_report(REPORT_CONTRAST, data->hdev);
1022	unsigned long flags;
1023
1024	if (!report || report->maxfield != 1 || report->field[0]->report_count != 1)
1025		return -ENODEV;
1026
1027	data->lcd_contrast = contrast & 0x0ff;
1028	spin_lock_irqsave(&data->lock, flags);
1029	hid_set_field(report->field[0], 0, data->lcd_contrast);
1030	usbhid_submit_report(data->hdev, report, USB_DIR_OUT);
1031	spin_unlock_irqrestore(&data->lock, flags);
1032	return 0;
1033}
1034
1035static int picolcd_check_lcd_fb(struct lcd_device *ldev, struct fb_info *fb)
1036{
1037	return fb && fb == picolcd_fbinfo((struct picolcd_data *)lcd_get_data(ldev));
1038}
1039
1040static struct lcd_ops picolcd_lcdops = {
1041	.get_contrast   = picolcd_get_contrast,
1042	.set_contrast   = picolcd_set_contrast,
1043	.check_fb       = picolcd_check_lcd_fb,
1044};
1045
1046static int picolcd_init_lcd(struct picolcd_data *data, struct hid_report *report)
1047{
1048	struct device *dev = &data->hdev->dev;
1049	struct lcd_device *ldev;
1050
1051	if (!report)
1052		return -ENODEV;
1053	if (report->maxfield != 1 || report->field[0]->report_count != 1 ||
1054			report->field[0]->report_size != 8) {
1055		dev_err(dev, "unsupported CONTRAST report");
1056		return -EINVAL;
1057	}
1058
1059	ldev = lcd_device_register(dev_name(dev), dev, data, &picolcd_lcdops);
1060	if (IS_ERR(ldev)) {
1061		dev_err(dev, "failed to register LCD\n");
1062		return PTR_ERR(ldev);
1063	}
1064	ldev->props.max_contrast = 0x0ff;
1065	data->lcd_contrast = 0xe5;
1066	data->lcd = ldev;
1067	picolcd_set_contrast(ldev, 0xe5);
1068	return 0;
1069}
1070
1071static void picolcd_exit_lcd(struct picolcd_data *data)
1072{
1073	struct lcd_device *ldev = data->lcd;
1074
1075	data->lcd = NULL;
1076	if (ldev)
1077		lcd_device_unregister(ldev);
1078}
1079
1080static inline int picolcd_resume_lcd(struct picolcd_data *data)
1081{
1082	if (!data->lcd)
1083		return 0;
1084	return picolcd_set_contrast(data->lcd, data->lcd_contrast);
1085}
1086#else
1087static inline int picolcd_init_lcd(struct picolcd_data *data,
1088		struct hid_report *report)
1089{
1090	return 0;
1091}
1092static inline void picolcd_exit_lcd(struct picolcd_data *data)
1093{
1094}
1095static inline int picolcd_resume_lcd(struct picolcd_data *data)
1096{
1097	return 0;
1098}
1099#endif /* CONFIG_HID_PICOLCD_LCD */
1100
1101#ifdef CONFIG_HID_PICOLCD_LEDS
1102/**
1103 * LED class device
1104 */
1105static void picolcd_leds_set(struct picolcd_data *data)
1106{
1107	struct hid_report *report;
1108	unsigned long flags;
1109
1110	if (!data->led[0])
1111		return;
1112	report = picolcd_out_report(REPORT_LED_STATE, data->hdev);
1113	if (!report || report->maxfield != 1 || report->field[0]->report_count != 1)
1114		return;
1115
1116	spin_lock_irqsave(&data->lock, flags);
1117	hid_set_field(report->field[0], 0, data->led_state);
1118	usbhid_submit_report(data->hdev, report, USB_DIR_OUT);
1119	spin_unlock_irqrestore(&data->lock, flags);
1120}
1121
1122static void picolcd_led_set_brightness(struct led_classdev *led_cdev,
1123			enum led_brightness value)
1124{
1125	struct device *dev;
1126	struct hid_device *hdev;
1127	struct picolcd_data *data;
1128	int i, state = 0;
1129
1130	dev  = led_cdev->dev->parent;
1131	hdev = container_of(dev, struct hid_device, dev);
1132	data = hid_get_drvdata(hdev);
1133	for (i = 0; i < 8; i++) {
1134		if (led_cdev != data->led[i])
1135			continue;
1136		state = (data->led_state >> i) & 1;
1137		if (value == LED_OFF && state) {
1138			data->led_state &= ~(1 << i);
1139			picolcd_leds_set(data);
1140		} else if (value != LED_OFF && !state) {
1141			data->led_state |= 1 << i;
1142			picolcd_leds_set(data);
1143		}
1144		break;
1145	}
1146}
1147
1148static enum led_brightness picolcd_led_get_brightness(struct led_classdev *led_cdev)
1149{
1150	struct device *dev;
1151	struct hid_device *hdev;
1152	struct picolcd_data *data;
1153	int i, value = 0;
1154
1155	dev  = led_cdev->dev->parent;
1156	hdev = container_of(dev, struct hid_device, dev);
1157	data = hid_get_drvdata(hdev);
1158	for (i = 0; i < 8; i++)
1159		if (led_cdev == data->led[i]) {
1160			value = (data->led_state >> i) & 1;
1161			break;
1162		}
1163	return value ? LED_FULL : LED_OFF;
1164}
1165
1166static int picolcd_init_leds(struct picolcd_data *data, struct hid_report *report)
1167{
1168	struct device *dev = &data->hdev->dev;
1169	struct led_classdev *led;
1170	size_t name_sz = strlen(dev_name(dev)) + 8;
1171	char *name;
1172	int i, ret = 0;
1173
1174	if (!report)
1175		return -ENODEV;
1176	if (report->maxfield != 1 || report->field[0]->report_count != 1 ||
1177			report->field[0]->report_size != 8) {
1178		dev_err(dev, "unsupported LED_STATE report");
1179		return -EINVAL;
1180	}
1181
1182	for (i = 0; i < 8; i++) {
1183		led = kzalloc(sizeof(struct led_classdev)+name_sz, GFP_KERNEL);
1184		if (!led) {
1185			dev_err(dev, "can't allocate memory for LED %d\n", i);
1186			ret = -ENOMEM;
1187			goto err;
1188		}
1189		name = (void *)(&led[1]);
1190		snprintf(name, name_sz, "%s::GPO%d", dev_name(dev), i);
1191		led->name = name;
1192		led->brightness = 0;
1193		led->max_brightness = 1;
1194		led->brightness_get = picolcd_led_get_brightness;
1195		led->brightness_set = picolcd_led_set_brightness;
1196
1197		data->led[i] = led;
1198		ret = led_classdev_register(dev, data->led[i]);
1199		if (ret) {
1200			data->led[i] = NULL;
1201			kfree(led);
1202			dev_err(dev, "can't register LED %d\n", i);
1203			goto err;
1204		}
1205	}
1206	return 0;
1207err:
1208	for (i = 0; i < 8; i++)
1209		if (data->led[i]) {
1210			led = data->led[i];
1211			data->led[i] = NULL;
1212			led_classdev_unregister(led);
1213			kfree(led);
1214		}
1215	return ret;
1216}
1217
1218static void picolcd_exit_leds(struct picolcd_data *data)
1219{
1220	struct led_classdev *led;
1221	int i;
1222
1223	for (i = 0; i < 8; i++) {
1224		led = data->led[i];
1225		data->led[i] = NULL;
1226		if (!led)
1227			continue;
1228		led_classdev_unregister(led);
1229		kfree(led);
1230	}
1231}
1232
1233#else
1234static inline int picolcd_init_leds(struct picolcd_data *data,
1235		struct hid_report *report)
1236{
1237	return 0;
1238}
1239static inline void picolcd_exit_leds(struct picolcd_data *data)
1240{
1241}
1242static inline int picolcd_leds_set(struct picolcd_data *data)
1243{
1244	return 0;
1245}
1246#endif /* CONFIG_HID_PICOLCD_LEDS */
1247
1248/*
1249 * input class device
1250 */
1251static int picolcd_raw_keypad(struct picolcd_data *data,
1252		struct hid_report *report, u8 *raw_data, int size)
1253{
1254	/*
1255	 * Keypad event
1256	 * First and second data bytes list currently pressed keys,
1257	 * 0x00 means no key and at most 2 keys may be pressed at same time
1258	 */
1259	int i, j;
1260
1261	/* determine newly pressed keys */
1262	for (i = 0; i < size; i++) {
1263		unsigned int key_code;
1264		if (raw_data[i] == 0)
1265			continue;
1266		for (j = 0; j < sizeof(data->pressed_keys); j++)
1267			if (data->pressed_keys[j] == raw_data[i])
1268				goto key_already_down;
1269		for (j = 0; j < sizeof(data->pressed_keys); j++)
1270			if (data->pressed_keys[j] == 0) {
1271				data->pressed_keys[j] = raw_data[i];
1272				break;
1273			}
1274		input_event(data->input_keys, EV_MSC, MSC_SCAN, raw_data[i]);
1275		if (raw_data[i] < PICOLCD_KEYS)
1276			key_code = data->keycode[raw_data[i]];
1277		else
1278			key_code = KEY_UNKNOWN;
1279		if (key_code != KEY_UNKNOWN) {
1280			dbg_hid(PICOLCD_NAME " got key press for %u:%d",
1281					raw_data[i], key_code);
1282			input_report_key(data->input_keys, key_code, 1);
1283		}
1284		input_sync(data->input_keys);
1285key_already_down:
1286		continue;
1287	}
1288
1289	/* determine newly released keys */
1290	for (j = 0; j < sizeof(data->pressed_keys); j++) {
1291		unsigned int key_code;
1292		if (data->pressed_keys[j] == 0)
1293			continue;
1294		for (i = 0; i < size; i++)
1295			if (data->pressed_keys[j] == raw_data[i])
1296				goto key_still_down;
1297		input_event(data->input_keys, EV_MSC, MSC_SCAN, data->pressed_keys[j]);
1298		if (data->pressed_keys[j] < PICOLCD_KEYS)
1299			key_code = data->keycode[data->pressed_keys[j]];
1300		else
1301			key_code = KEY_UNKNOWN;
1302		if (key_code != KEY_UNKNOWN) {
1303			dbg_hid(PICOLCD_NAME " got key release for %u:%d",
1304					data->pressed_keys[j], key_code);
1305			input_report_key(data->input_keys, key_code, 0);
1306		}
1307		input_sync(data->input_keys);
1308		data->pressed_keys[j] = 0;
1309key_still_down:
1310		continue;
1311	}
1312	return 1;
1313}
1314
1315static int picolcd_raw_cir(struct picolcd_data *data,
1316		struct hid_report *report, u8 *raw_data, int size)
1317{
1318	/* Need understanding of CIR data format to implement ... */
1319	return 1;
1320}
1321
1322static int picolcd_check_version(struct hid_device *hdev)
1323{
1324	struct picolcd_data *data = hid_get_drvdata(hdev);
1325	struct picolcd_pending *verinfo;
1326	int ret = 0;
1327
1328	if (!data)
1329		return -ENODEV;
1330
1331	verinfo = picolcd_send_and_wait(hdev, REPORT_VERSION, NULL, 0);
1332	if (!verinfo) {
1333		hid_err(hdev, "no version response from PicoLCD\n");
1334		return -ENODEV;
1335	}
1336
1337	if (verinfo->raw_size == 2) {
1338		data->version[0] = verinfo->raw_data[1];
1339		data->version[1] = verinfo->raw_data[0];
1340		if (data->status & PICOLCD_BOOTLOADER) {
1341			hid_info(hdev, "PicoLCD, bootloader version %d.%d\n",
1342				 verinfo->raw_data[1], verinfo->raw_data[0]);
1343		} else {
1344			hid_info(hdev, "PicoLCD, firmware version %d.%d\n",
1345				 verinfo->raw_data[1], verinfo->raw_data[0]);
1346		}
1347	} else {
1348		hid_err(hdev, "confused, got unexpected version response from PicoLCD\n");
1349		ret = -EINVAL;
1350	}
1351	kfree(verinfo);
1352	return ret;
1353}
1354
1355/*
1356 * Reset our device and wait for answer to VERSION request
1357 */
1358static int picolcd_reset(struct hid_device *hdev)
1359{
1360	struct picolcd_data *data = hid_get_drvdata(hdev);
1361	struct hid_report *report = picolcd_out_report(REPORT_RESET, hdev);
1362	unsigned long flags;
1363	int error;
1364
1365	if (!data || !report || report->maxfield != 1)
1366		return -ENODEV;
1367
1368	spin_lock_irqsave(&data->lock, flags);
1369	if (hdev->product == USB_DEVICE_ID_PICOLCD_BOOTLOADER)
1370		data->status |= PICOLCD_BOOTLOADER;
1371
1372	/* perform the reset */
1373	hid_set_field(report->field[0], 0, 1);
1374	usbhid_submit_report(hdev, report, USB_DIR_OUT);
1375	spin_unlock_irqrestore(&data->lock, flags);
1376
1377	error = picolcd_check_version(hdev);
1378	if (error)
1379		return error;
1380
1381	picolcd_resume_lcd(data);
1382	picolcd_resume_backlight(data);
1383#ifdef CONFIG_HID_PICOLCD_FB
1384	if (data->fb_info)
1385		schedule_delayed_work(&data->fb_info->deferred_work, 0);
1386#endif /* CONFIG_HID_PICOLCD_FB */
1387
1388	picolcd_leds_set(data);
1389	return 0;
1390}
1391
1392/*
1393 * The "operation_mode" sysfs attribute
1394 */
1395static ssize_t picolcd_operation_mode_show(struct device *dev,
1396		struct device_attribute *attr, char *buf)
1397{
1398	struct picolcd_data *data = dev_get_drvdata(dev);
1399
1400	if (data->status & PICOLCD_BOOTLOADER)
1401		return snprintf(buf, PAGE_SIZE, "[bootloader] lcd\n");
1402	else
1403		return snprintf(buf, PAGE_SIZE, "bootloader [lcd]\n");
1404}
1405
1406static ssize_t picolcd_operation_mode_store(struct device *dev,
1407		struct device_attribute *attr, const char *buf, size_t count)
1408{
1409	struct picolcd_data *data = dev_get_drvdata(dev);
1410	struct hid_report *report = NULL;
1411	size_t cnt = count;
1412	int timeout = data->opmode_delay;
1413	unsigned long flags;
1414
1415	if (cnt >= 3 && strncmp("lcd", buf, 3) == 0) {
1416		if (data->status & PICOLCD_BOOTLOADER)
1417			report = picolcd_out_report(REPORT_EXIT_FLASHER, data->hdev);
1418		buf += 3;
1419		cnt -= 3;
1420	} else if (cnt >= 10 && strncmp("bootloader", buf, 10) == 0) {
1421		if (!(data->status & PICOLCD_BOOTLOADER))
1422			report = picolcd_out_report(REPORT_EXIT_KEYBOARD, data->hdev);
1423		buf += 10;
1424		cnt -= 10;
1425	}
1426	if (!report)
1427		return -EINVAL;
1428
1429	while (cnt > 0 && (buf[cnt-1] == '\n' || buf[cnt-1] == '\r'))
1430		cnt--;
1431	if (cnt != 0)
1432		return -EINVAL;
1433
1434	spin_lock_irqsave(&data->lock, flags);
1435	hid_set_field(report->field[0], 0, timeout & 0xff);
1436	hid_set_field(report->field[0], 1, (timeout >> 8) & 0xff);
1437	usbhid_submit_report(data->hdev, report, USB_DIR_OUT);
1438	spin_unlock_irqrestore(&data->lock, flags);
1439	return count;
1440}
1441
1442static DEVICE_ATTR(operation_mode, 0644, picolcd_operation_mode_show,
1443		picolcd_operation_mode_store);
1444
1445/*
1446 * The "operation_mode_delay" sysfs attribute
1447 */
1448static ssize_t picolcd_operation_mode_delay_show(struct device *dev,
1449		struct device_attribute *attr, char *buf)
1450{
1451	struct picolcd_data *data = dev_get_drvdata(dev);
1452
1453	return snprintf(buf, PAGE_SIZE, "%hu\n", data->opmode_delay);
1454}
1455
1456static ssize_t picolcd_operation_mode_delay_store(struct device *dev,
1457		struct device_attribute *attr, const char *buf, size_t count)
1458{
1459	struct picolcd_data *data = dev_get_drvdata(dev);
1460	unsigned u;
1461	if (sscanf(buf, "%u", &u) != 1)
1462		return -EINVAL;
1463	if (u > 30000)
1464		return -EINVAL;
1465	else
1466		data->opmode_delay = u;
1467	return count;
1468}
1469
1470static DEVICE_ATTR(operation_mode_delay, 0644, picolcd_operation_mode_delay_show,
1471		picolcd_operation_mode_delay_store);
1472
1473
1474#ifdef CONFIG_DEBUG_FS
1475/*
1476 * The "reset" file
1477 */
1478static int picolcd_debug_reset_show(struct seq_file *f, void *p)
1479{
1480	if (picolcd_fbinfo((struct picolcd_data *)f->private))
1481		seq_printf(f, "all fb\n");
1482	else
1483		seq_printf(f, "all\n");
1484	return 0;
1485}
1486
1487static int picolcd_debug_reset_open(struct inode *inode, struct file *f)
1488{
1489	return single_open(f, picolcd_debug_reset_show, inode->i_private);
1490}
1491
1492static ssize_t picolcd_debug_reset_write(struct file *f, const char __user *user_buf,
1493		size_t count, loff_t *ppos)
1494{
1495	struct picolcd_data *data = ((struct seq_file *)f->private_data)->private;
1496	char buf[32];
1497	size_t cnt = min(count, sizeof(buf)-1);
1498	if (copy_from_user(buf, user_buf, cnt))
1499		return -EFAULT;
1500
1501	while (cnt > 0 && (buf[cnt-1] == ' ' || buf[cnt-1] == '\n'))
1502		cnt--;
1503	buf[cnt] = '\0';
1504	if (strcmp(buf, "all") == 0) {
1505		picolcd_reset(data->hdev);
1506		picolcd_fb_reset(data, 1);
1507	} else if (strcmp(buf, "fb") == 0) {
1508		picolcd_fb_reset(data, 1);
1509	} else {
1510		return -EINVAL;
1511	}
1512	return count;
1513}
1514
1515static const struct file_operations picolcd_debug_reset_fops = {
1516	.owner    = THIS_MODULE,
1517	.open     = picolcd_debug_reset_open,
1518	.read     = seq_read,
1519	.llseek   = seq_lseek,
1520	.write    = picolcd_debug_reset_write,
1521	.release  = single_release,
1522};
1523
1524/*
1525 * The "eeprom" file
1526 */
1527static int picolcd_debug_eeprom_open(struct inode *i, struct file *f)
1528{
1529	f->private_data = i->i_private;
1530	return 0;
1531}
1532
1533static ssize_t picolcd_debug_eeprom_read(struct file *f, char __user *u,
1534		size_t s, loff_t *off)
1535{
1536	struct picolcd_data *data = f->private_data;
1537	struct picolcd_pending *resp;
1538	u8 raw_data[3];
1539	ssize_t ret = -EIO;
1540
1541	if (s == 0)
1542		return -EINVAL;
1543	if (*off > 0x0ff)
1544		return 0;
1545
1546	/* prepare buffer with info about what we want to read (addr & len) */
1547	raw_data[0] = *off & 0xff;
1548	raw_data[1] = (*off >> 8) & 0xff;
1549	raw_data[2] = s < 20 ? s : 20;
1550	if (*off + raw_data[2] > 0xff)
1551		raw_data[2] = 0x100 - *off;
1552	resp = picolcd_send_and_wait(data->hdev, REPORT_EE_READ, raw_data,
1553			sizeof(raw_data));
1554	if (!resp)
1555		return -EIO;
1556
1557	if (resp->in_report && resp->in_report->id == REPORT_EE_DATA) {
1558		/* successful read :) */
1559		ret = resp->raw_data[2];
1560		if (ret > s)
1561			ret = s;
1562		if (copy_to_user(u, resp->raw_data+3, ret))
1563			ret = -EFAULT;
1564		else
1565			*off += ret;
1566	} /* anything else is some kind of IO error */
1567
1568	kfree(resp);
1569	return ret;
1570}
1571
1572static ssize_t picolcd_debug_eeprom_write(struct file *f, const char __user *u,
1573		size_t s, loff_t *off)
1574{
1575	struct picolcd_data *data = f->private_data;
1576	struct picolcd_pending *resp;
1577	ssize_t ret = -EIO;
1578	u8 raw_data[23];
1579
1580	if (s == 0)
1581		return -EINVAL;
1582	if (*off > 0x0ff)
1583		return -ENOSPC;
1584
1585	memset(raw_data, 0, sizeof(raw_data));
1586	raw_data[0] = *off & 0xff;
1587	raw_data[1] = (*off >> 8) & 0xff;
1588	raw_data[2] = min((size_t)20, s);
1589	if (*off + raw_data[2] > 0xff)
1590		raw_data[2] = 0x100 - *off;
1591
1592	if (copy_from_user(raw_data+3, u, min((u8)20, raw_data[2])))
1593		return -EFAULT;
1594	resp = picolcd_send_and_wait(data->hdev, REPORT_EE_WRITE, raw_data,
1595			sizeof(raw_data));
1596
1597	if (!resp)
1598		return -EIO;
1599
1600	if (resp->in_report && resp->in_report->id == REPORT_EE_DATA) {
1601		/* check if written data matches */
1602		if (memcmp(raw_data, resp->raw_data, 3+raw_data[2]) == 0) {
1603			*off += raw_data[2];
1604			ret = raw_data[2];
1605		}
1606	}
1607	kfree(resp);
1608	return ret;
1609}
1610
1611/*
1612 * Notes:
1613 * - read/write happens in chunks of at most 20 bytes, it's up to userspace
1614 *   to loop in order to get more data.
1615 * - on write errors on otherwise correct write request the bytes
1616 *   that should have been written are in undefined state.
1617 */
1618static const struct file_operations picolcd_debug_eeprom_fops = {
1619	.owner    = THIS_MODULE,
1620	.open     = picolcd_debug_eeprom_open,
1621	.read     = picolcd_debug_eeprom_read,
1622	.write    = picolcd_debug_eeprom_write,
1623	.llseek   = generic_file_llseek,
1624};
1625
1626/*
1627 * The "flash" file
1628 */
1629static int picolcd_debug_flash_open(struct inode *i, struct file *f)
1630{
1631	f->private_data = i->i_private;
1632	return 0;
1633}
1634
1635/* record a flash address to buf (bounds check to be done by caller) */
1636static int _picolcd_flash_setaddr(struct picolcd_data *data, u8 *buf, long off)
1637{
1638	buf[0] = off & 0xff;
1639	buf[1] = (off >> 8) & 0xff;
1640	if (data->addr_sz == 3)
1641		buf[2] = (off >> 16) & 0xff;
1642	return data->addr_sz == 2 ? 2 : 3;
1643}
1644
1645/* read a given size of data (bounds check to be done by caller) */
1646static ssize_t _picolcd_flash_read(struct picolcd_data *data, int report_id,
1647		char __user *u, size_t s, loff_t *off)
1648{
1649	struct picolcd_pending *resp;
1650	u8 raw_data[4];
1651	ssize_t ret = 0;
1652	int len_off, err = -EIO;
1653
1654	while (s > 0) {
1655		err = -EIO;
1656		len_off = _picolcd_flash_setaddr(data, raw_data, *off);
1657		raw_data[len_off] = s > 32 ? 32 : s;
1658		resp = picolcd_send_and_wait(data->hdev, report_id, raw_data, len_off+1);
1659		if (!resp || !resp->in_report)
1660			goto skip;
1661		if (resp->in_report->id == REPORT_MEMORY ||
1662			resp->in_report->id == REPORT_BL_READ_MEMORY) {
1663			if (memcmp(raw_data, resp->raw_data, len_off+1) != 0)
1664				goto skip;
1665			if (copy_to_user(u+ret, resp->raw_data+len_off+1, raw_data[len_off])) {
1666				err = -EFAULT;
1667				goto skip;
1668			}
1669			*off += raw_data[len_off];
1670			s    -= raw_data[len_off];
1671			ret  += raw_data[len_off];
1672			err   = 0;
1673		}
1674skip:
1675		kfree(resp);
1676		if (err)
1677			return ret > 0 ? ret : err;
1678	}
1679	return ret;
1680}
1681
1682static ssize_t picolcd_debug_flash_read(struct file *f, char __user *u,
1683		size_t s, loff_t *off)
1684{
1685	struct picolcd_data *data = f->private_data;
1686
1687	if (s == 0)
1688		return -EINVAL;
1689	if (*off > 0x05fff)
1690		return 0;
1691	if (*off + s > 0x05fff)
1692		s = 0x06000 - *off;
1693
1694	if (data->status & PICOLCD_BOOTLOADER)
1695		return _picolcd_flash_read(data, REPORT_BL_READ_MEMORY, u, s, off);
1696	else
1697		return _picolcd_flash_read(data, REPORT_READ_MEMORY, u, s, off);
1698}
1699
1700/* erase block aligned to 64bytes boundary */
1701static ssize_t _picolcd_flash_erase64(struct picolcd_data *data, int report_id,
1702		loff_t *off)
1703{
1704	struct picolcd_pending *resp;
1705	u8 raw_data[3];
1706	int len_off;
1707	ssize_t ret = -EIO;
1708
1709	if (*off & 0x3f)
1710		return -EINVAL;
1711
1712	len_off = _picolcd_flash_setaddr(data, raw_data, *off);
1713	resp = picolcd_send_and_wait(data->hdev, report_id, raw_data, len_off);
1714	if (!resp || !resp->in_report)
1715		goto skip;
1716	if (resp->in_report->id == REPORT_MEMORY ||
1717		resp->in_report->id == REPORT_BL_ERASE_MEMORY) {
1718		if (memcmp(raw_data, resp->raw_data, len_off) != 0)
1719			goto skip;
1720		ret = 0;
1721	}
1722skip:
1723	kfree(resp);
1724	return ret;
1725}
1726
1727/* write a given size of data (bounds check to be done by caller) */
1728static ssize_t _picolcd_flash_write(struct picolcd_data *data, int report_id,
1729		const char __user *u, size_t s, loff_t *off)
1730{
1731	struct picolcd_pending *resp;
1732	u8 raw_data[36];
1733	ssize_t ret = 0;
1734	int len_off, err = -EIO;
1735
1736	while (s > 0) {
1737		err = -EIO;
1738		len_off = _picolcd_flash_setaddr(data, raw_data, *off);
1739		raw_data[len_off] = s > 32 ? 32 : s;
1740		if (copy_from_user(raw_data+len_off+1, u, raw_data[len_off])) {
1741			err = -EFAULT;
1742			break;
1743		}
1744		resp = picolcd_send_and_wait(data->hdev, report_id, raw_data,
1745				len_off+1+raw_data[len_off]);
1746		if (!resp || !resp->in_report)
1747			goto skip;
1748		if (resp->in_report->id == REPORT_MEMORY ||
1749			resp->in_report->id == REPORT_BL_WRITE_MEMORY) {
1750			if (memcmp(raw_data, resp->raw_data, len_off+1+raw_data[len_off]) != 0)
1751				goto skip;
1752			*off += raw_data[len_off];
1753			s    -= raw_data[len_off];
1754			ret  += raw_data[len_off];
1755			err   = 0;
1756		}
1757skip:
1758		kfree(resp);
1759		if (err)
1760			break;
1761	}
1762	return ret > 0 ? ret : err;
1763}
1764
1765static ssize_t picolcd_debug_flash_write(struct file *f, const char __user *u,
1766		size_t s, loff_t *off)
1767{
1768	struct picolcd_data *data = f->private_data;
1769	ssize_t err, ret = 0;
1770	int report_erase, report_write;
1771
1772	if (s == 0)
1773		return -EINVAL;
1774	if (*off > 0x5fff)
1775		return -ENOSPC;
1776	if (s & 0x3f)
1777		return -EINVAL;
1778	if (*off & 0x3f)
1779		return -EINVAL;
1780
1781	if (data->status & PICOLCD_BOOTLOADER) {
1782		report_erase = REPORT_BL_ERASE_MEMORY;
1783		report_write = REPORT_BL_WRITE_MEMORY;
1784	} else {
1785		report_erase = REPORT_ERASE_MEMORY;
1786		report_write = REPORT_WRITE_MEMORY;
1787	}
1788	mutex_lock(&data->mutex_flash);
1789	while (s > 0) {
1790		err = _picolcd_flash_erase64(data, report_erase, off);
1791		if (err)
1792			break;
1793		err = _picolcd_flash_write(data, report_write, u, 64, off);
1794		if (err < 0)
1795			break;
1796		ret += err;
1797		*off += err;
1798		s -= err;
1799		if (err != 64)
1800			break;
1801	}
1802	mutex_unlock(&data->mutex_flash);
1803	return ret > 0 ? ret : err;
1804}
1805
1806/*
1807 * Notes:
1808 * - concurrent writing is prevented by mutex and all writes must be
1809 *   n*64 bytes and 64-byte aligned, each write being preceded by an
1810 *   ERASE which erases a 64byte block.
1811 *   If less than requested was written or an error is returned for an
1812 *   otherwise correct write request the next 64-byte block which should
1813 *   have been written is in undefined state (mostly: original, erased,
1814 *   (half-)written with write error)
1815 * - reading can happen without special restriction
1816 */
1817static const struct file_operations picolcd_debug_flash_fops = {
1818	.owner    = THIS_MODULE,
1819	.open     = picolcd_debug_flash_open,
1820	.read     = picolcd_debug_flash_read,
1821	.write    = picolcd_debug_flash_write,
1822	.llseek   = generic_file_llseek,
1823};
1824
1825
1826/*
1827 * Helper code for HID report level dumping/debugging
1828 */
1829static const char *error_codes[] = {
1830	"success", "parameter missing", "data_missing", "block readonly",
1831	"block not erasable", "block too big", "section overflow",
1832	"invalid command length", "invalid data length",
1833};
1834
1835static void dump_buff_as_hex(char *dst, size_t dst_sz, const u8 *data,
1836		const size_t data_len)
1837{
1838	int i, j;
1839	for (i = j = 0; i < data_len && j + 3 < dst_sz; i++) {
1840		dst[j++] = hex_asc[(data[i] >> 4) & 0x0f];
1841		dst[j++] = hex_asc[data[i] & 0x0f];
1842		dst[j++] = ' ';
1843	}
1844	if (j < dst_sz) {
1845		dst[j--] = '\0';
1846		dst[j] = '\n';
1847	} else
1848		dst[j] = '\0';
1849}
1850
1851static void picolcd_debug_out_report(struct picolcd_data *data,
1852		struct hid_device *hdev, struct hid_report *report)
1853{
1854	u8 raw_data[70];
1855	int raw_size = (report->size >> 3) + 1;
1856	char *buff;
1857#define BUFF_SZ 256
1858
1859	/* Avoid unnecessary overhead if debugfs is disabled */
1860	if (!hdev->debug_events)
1861		return;
1862
1863	buff = kmalloc(BUFF_SZ, GFP_ATOMIC);
1864	if (!buff)
1865		return;
1866
1867	snprintf(buff, BUFF_SZ, "\nout report %d (size %d) =  ",
1868			report->id, raw_size);
1869	hid_debug_event(hdev, buff);
1870	if (raw_size + 5 > sizeof(raw_data)) {
1871		kfree(buff);
1872		hid_debug_event(hdev, " TOO BIG\n");
1873		return;
1874	} else {
1875		raw_data[0] = report->id;
1876		hid_output_report(report, raw_data);
1877		dump_buff_as_hex(buff, BUFF_SZ, raw_data, raw_size);
1878		hid_debug_event(hdev, buff);
1879	}
1880
1881	switch (report->id) {
1882	case REPORT_LED_STATE:
1883		/* 1 data byte with GPO state */
1884		snprintf(buff, BUFF_SZ, "out report %s (%d, size=%d)\n",
1885			"REPORT_LED_STATE", report->id, raw_size-1);
1886		hid_debug_event(hdev, buff);
1887		snprintf(buff, BUFF_SZ, "\tGPO state: 0x%02x\n", raw_data[1]);
1888		hid_debug_event(hdev, buff);
1889		break;
1890	case REPORT_BRIGHTNESS:
1891		/* 1 data byte with brightness */
1892		snprintf(buff, BUFF_SZ, "out report %s (%d, size=%d)\n",
1893			"REPORT_BRIGHTNESS", report->id, raw_size-1);
1894		hid_debug_event(hdev, buff);
1895		snprintf(buff, BUFF_SZ, "\tBrightness: 0x%02x\n", raw_data[1]);
1896		hid_debug_event(hdev, buff);
1897		break;
1898	case REPORT_CONTRAST:
1899		/* 1 data byte with contrast */
1900		snprintf(buff, BUFF_SZ, "out report %s (%d, size=%d)\n",
1901			"REPORT_CONTRAST", report->id, raw_size-1);
1902		hid_debug_event(hdev, buff);
1903		snprintf(buff, BUFF_SZ, "\tContrast: 0x%02x\n", raw_data[1]);
1904		hid_debug_event(hdev, buff);
1905		break;
1906	case REPORT_RESET:
1907		/* 2 data bytes with reset duration in ms */
1908		snprintf(buff, BUFF_SZ, "out report %s (%d, size=%d)\n",
1909			"REPORT_RESET", report->id, raw_size-1);
1910		hid_debug_event(hdev, buff);
1911		snprintf(buff, BUFF_SZ, "\tDuration: 0x%02x%02x (%dms)\n",
1912				raw_data[2], raw_data[1], raw_data[2] << 8 | raw_data[1]);
1913		hid_debug_event(hdev, buff);
1914		break;
1915	case REPORT_LCD_CMD:
1916		/* 63 data bytes with LCD commands */
1917		snprintf(buff, BUFF_SZ, "out report %s (%d, size=%d)\n",
1918			"REPORT_LCD_CMD", report->id, raw_size-1);
1919		hid_debug_event(hdev, buff);
1920		/* TODO: format decoding */
1921		break;
1922	case REPORT_LCD_DATA:
1923		/* 63 data bytes with LCD data */
1924		snprintf(buff, BUFF_SZ, "out report %s (%d, size=%d)\n",
1925			"REPORT_LCD_CMD", report->id, raw_size-1);
1926		/* TODO: format decoding */
1927		hid_debug_event(hdev, buff);
1928		break;
1929	case REPORT_LCD_CMD_DATA:
1930		/* 63 data bytes with LCD commands and data */
1931		snprintf(buff, BUFF_SZ, "out report %s (%d, size=%d)\n",
1932			"REPORT_LCD_CMD", report->id, raw_size-1);
1933		/* TODO: format decoding */
1934		hid_debug_event(hdev, buff);
1935		break;
1936	case REPORT_EE_READ:
1937		/* 3 data bytes with read area description */
1938		snprintf(buff, BUFF_SZ, "out report %s (%d, size=%d)\n",
1939			"REPORT_EE_READ", report->id, raw_size-1);
1940		hid_debug_event(hdev, buff);
1941		snprintf(buff, BUFF_SZ, "\tData address: 0x%02x%02x\n",
1942				raw_data[2], raw_data[1]);
1943		hid_debug_event(hdev, buff);
1944		snprintf(buff, BUFF_SZ, "\tData length: %d\n", raw_data[3]);
1945		hid_debug_event(hdev, buff);
1946		break;
1947	case REPORT_EE_WRITE:
1948		/* 3+1..20 data bytes with write area description */
1949		snprintf(buff, BUFF_SZ, "out report %s (%d, size=%d)\n",
1950			"REPORT_EE_WRITE", report->id, raw_size-1);
1951		hid_debug_event(hdev, buff);
1952		snprintf(buff, BUFF_SZ, "\tData address: 0x%02x%02x\n",
1953				raw_data[2], raw_data[1]);
1954		hid_debug_event(hdev, buff);
1955		snprintf(buff, BUFF_SZ, "\tData length: %d\n", raw_data[3]);
1956		hid_debug_event(hdev, buff);
1957		if (raw_data[3] == 0) {
1958			snprintf(buff, BUFF_SZ, "\tNo data\n");
1959		} else if (raw_data[3] + 4 <= raw_size) {
1960			snprintf(buff, BUFF_SZ, "\tData: ");
1961			hid_debug_event(hdev, buff);
1962			dump_buff_as_hex(buff, BUFF_SZ, raw_data+4, raw_data[3]);
1963		} else {
1964			snprintf(buff, BUFF_SZ, "\tData overflowed\n");
1965		}
1966		hid_debug_event(hdev, buff);
1967		break;
1968	case REPORT_ERASE_MEMORY:
1969	case REPORT_BL_ERASE_MEMORY:
1970		/* 3 data bytes with pointer inside erase block */
1971		snprintf(buff, BUFF_SZ, "out report %s (%d, size=%d)\n",
1972			"REPORT_ERASE_MEMORY", report->id, raw_size-1);
1973		hid_debug_event(hdev, buff);
1974		switch (data->addr_sz) {
1975		case 2:
1976			snprintf(buff, BUFF_SZ, "\tAddress inside 64 byte block: 0x%02x%02x\n",
1977					raw_data[2], raw_data[1]);
1978			break;
1979		case 3:
1980			snprintf(buff, BUFF_SZ, "\tAddress inside 64 byte block: 0x%02x%02x%02x\n",
1981					raw_data[3], raw_data[2], raw_data[1]);
1982			break;
1983		default:
1984			snprintf(buff, BUFF_SZ, "\tNot supported\n");
1985		}
1986		hid_debug_event(hdev, buff);
1987		break;
1988	case REPORT_READ_MEMORY:
1989	case REPORT_BL_READ_MEMORY:
1990		/* 4 data bytes with read area description */
1991		snprintf(buff, BUFF_SZ, "out report %s (%d, size=%d)\n",
1992			"REPORT_READ_MEMORY", report->id, raw_size-1);
1993		hid_debug_event(hdev, buff);
1994		switch (data->addr_sz) {
1995		case 2:
1996			snprintf(buff, BUFF_SZ, "\tData address: 0x%02x%02x\n",
1997					raw_data[2], raw_data[1]);
1998			hid_debug_event(hdev, buff);
1999			snprintf(buff, BUFF_SZ, "\tData length: %d\n", raw_data[3]);
2000			break;
2001		case 3:
2002			snprintf(buff, BUFF_SZ, "\tData address: 0x%02x%02x%02x\n",
2003					raw_data[3], raw_data[2], raw_data[1]);
2004			hid_debug_event(hdev, buff);
2005			snprintf(buff, BUFF_SZ, "\tData length: %d\n", raw_data[4]);
2006			break;
2007		default:
2008			snprintf(buff, BUFF_SZ, "\tNot supported\n");
2009		}
2010		hid_debug_event(hdev, buff);
2011		break;
2012	case REPORT_WRITE_MEMORY:
2013	case REPORT_BL_WRITE_MEMORY:
2014		/* 4+1..32 data bytes with write adrea description */
2015		snprintf(buff, BUFF_SZ, "out report %s (%d, size=%d)\n",
2016			"REPORT_WRITE_MEMORY", report->id, raw_size-1);
2017		hid_debug_event(hdev, buff);
2018		switch (data->addr_sz) {
2019		case 2:
2020			snprintf(buff, BUFF_SZ, "\tData address: 0x%02x%02x\n",
2021					raw_data[2], raw_data[1]);
2022			hid_debug_event(hdev, buff);
2023			snprintf(buff, BUFF_SZ, "\tData length: %d\n", raw_data[3]);
2024			hid_debug_event(hdev, buff);
2025			if (raw_data[3] == 0) {
2026				snprintf(buff, BUFF_SZ, "\tNo data\n");
2027			} else if (raw_data[3] + 4 <= raw_size) {
2028				snprintf(buff, BUFF_SZ, "\tData: ");
2029				hid_debug_event(hdev, buff);
2030				dump_buff_as_hex(buff, BUFF_SZ, raw_data+4, raw_data[3]);
2031			} else {
2032				snprintf(buff, BUFF_SZ, "\tData overflowed\n");
2033			}
2034			break;
2035		case 3:
2036			snprintf(buff, BUFF_SZ, "\tData address: 0x%02x%02x%02x\n",
2037					raw_data[3], raw_data[2], raw_data[1]);
2038			hid_debug_event(hdev, buff);
2039			snprintf(buff, BUFF_SZ, "\tData length: %d\n", raw_data[4]);
2040			hid_debug_event(hdev, buff);
2041			if (raw_data[4] == 0) {
2042				snprintf(buff, BUFF_SZ, "\tNo data\n");
2043			} else if (raw_data[4] + 5 <= raw_size) {
2044				snprintf(buff, BUFF_SZ, "\tData: ");
2045				hid_debug_event(hdev, buff);
2046				dump_buff_as_hex(buff, BUFF_SZ, raw_data+5, raw_data[4]);
2047			} else {
2048				snprintf(buff, BUFF_SZ, "\tData overflowed\n");
2049			}
2050			break;
2051		default:
2052			snprintf(buff, BUFF_SZ, "\tNot supported\n");
2053		}
2054		hid_debug_event(hdev, buff);
2055		break;
2056	case REPORT_SPLASH_RESTART:
2057		/* TODO */
2058		break;
2059	case REPORT_EXIT_KEYBOARD:
2060		snprintf(buff, BUFF_SZ, "out report %s (%d, size=%d)\n",
2061			"REPORT_EXIT_KEYBOARD", report->id, raw_size-1);
2062		hid_debug_event(hdev, buff);
2063		snprintf(buff, BUFF_SZ, "\tRestart delay: %dms (0x%02x%02x)\n",
2064				raw_data[1] | (raw_data[2] << 8),
2065				raw_data[2], raw_data[1]);
2066		hid_debug_event(hdev, buff);
2067		break;
2068	case REPORT_VERSION:
2069		snprintf(buff, BUFF_SZ, "out report %s (%d, size=%d)\n",
2070			"REPORT_VERSION", report->id, raw_size-1);
2071		hid_debug_event(hdev, buff);
2072		break;
2073	case REPORT_DEVID:
2074		snprintf(buff, BUFF_SZ, "out report %s (%d, size=%d)\n",
2075			"REPORT_DEVID", report->id, raw_size-1);
2076		hid_debug_event(hdev, buff);
2077		break;
2078	case REPORT_SPLASH_SIZE:
2079		snprintf(buff, BUFF_SZ, "out report %s (%d, size=%d)\n",
2080			"REPORT_SPLASH_SIZE", report->id, raw_size-1);
2081		hid_debug_event(hdev, buff);
2082		break;
2083	case REPORT_HOOK_VERSION:
2084		snprintf(buff, BUFF_SZ, "out report %s (%d, size=%d)\n",
2085			"REPORT_HOOK_VERSION", report->id, raw_size-1);
2086		hid_debug_event(hdev, buff);
2087		break;
2088	case REPORT_EXIT_FLASHER:
2089		snprintf(buff, BUFF_SZ, "out report %s (%d, size=%d)\n",
2090			"REPORT_VERSION", report->id, raw_size-1);
2091		hid_debug_event(hdev, buff);
2092		snprintf(buff, BUFF_SZ, "\tRestart delay: %dms (0x%02x%02x)\n",
2093				raw_data[1] | (raw_data[2] << 8),
2094				raw_data[2], raw_data[1]);
2095		hid_debug_event(hdev, buff);
2096		break;
2097	default:
2098		snprintf(buff, BUFF_SZ, "out report %s (%d, size=%d)\n",
2099			"<unknown>", report->id, raw_size-1);
2100		hid_debug_event(hdev, buff);
2101		break;
2102	}
2103	wake_up_interruptible(&hdev->debug_wait);
2104	kfree(buff);
2105}
2106
2107static void picolcd_debug_raw_event(struct picolcd_data *data,
2108		struct hid_device *hdev, struct hid_report *report,
2109		u8 *raw_data, int size)
2110{
2111	char *buff;
2112
2113#define BUFF_SZ 256
2114	/* Avoid unnecessary overhead if debugfs is disabled */
2115	if (!hdev->debug_events)
2116		return;
2117
2118	buff = kmalloc(BUFF_SZ, GFP_ATOMIC);
2119	if (!buff)
2120		return;
2121
2122	switch (report->id) {
2123	case REPORT_ERROR_CODE:
2124		/* 2 data bytes with affected report and error code */
2125		snprintf(buff, BUFF_SZ, "report %s (%d, size=%d)\n",
2126			"REPORT_ERROR_CODE", report->id, size-1);
2127		hid_debug_event(hdev, buff);
2128		if (raw_data[2] < ARRAY_SIZE(error_codes))
2129			snprintf(buff, BUFF_SZ, "\tError code 0x%02x (%s) in reply to report 0x%02x\n",
2130					raw_data[2], error_codes[raw_data[2]], raw_data[1]);
2131		else
2132			snprintf(buff, BUFF_SZ, "\tError code 0x%02x in reply to report 0x%02x\n",
2133					raw_data[2], raw_data[1]);
2134		hid_debug_event(hdev, buff);
2135		break;
2136	case REPORT_KEY_STATE:
2137		/* 2 data bytes with key state */
2138		snprintf(buff, BUFF_SZ, "report %s (%d, size=%d)\n",
2139			"REPORT_KEY_STATE", report->id, size-1);
2140		hid_debug_event(hdev, buff);
2141		if (raw_data[1] == 0)
2142			snprintf(buff, BUFF_SZ, "\tNo key pressed\n");
2143		else if (raw_data[2] == 0)
2144			snprintf(buff, BUFF_SZ, "\tOne key pressed: 0x%02x (%d)\n",
2145					raw_data[1], raw_data[1]);
2146		else
2147			snprintf(buff, BUFF_SZ, "\tTwo keys pressed: 0x%02x (%d), 0x%02x (%d)\n",
2148					raw_data[1], raw_data[1], raw_data[2], raw_data[2]);
2149		hid_debug_event(hdev, buff);
2150		break;
2151	case REPORT_IR_DATA:
2152		/* Up to 20 byes of IR scancode data */
2153		snprintf(buff, BUFF_SZ, "report %s (%d, size=%d)\n",
2154			"REPORT_IR_DATA", report->id, size-1);
2155		hid_debug_event(hdev, buff);
2156		if (raw_data[1] == 0) {
2157			snprintf(buff, BUFF_SZ, "\tUnexpectedly 0 data length\n");
2158			hid_debug_event(hdev, buff);
2159		} else if (raw_data[1] + 1 <= size) {
2160			snprintf(buff, BUFF_SZ, "\tData length: %d\n\tIR Data: ",
2161					raw_data[1]-1);
2162			hid_debug_event(hdev, buff);
2163			dump_buff_as_hex(buff, BUFF_SZ, raw_data+2, raw_data[1]-1);
2164			hid_debug_event(hdev, buff);
2165		} else {
2166			snprintf(buff, BUFF_SZ, "\tOverflowing data length: %d\n",
2167					raw_data[1]-1);
2168			hid_debug_event(hdev, buff);
2169		}
2170		break;
2171	case REPORT_EE_DATA:
2172		/* Data buffer in response to REPORT_EE_READ or REPORT_EE_WRITE */
2173		snprintf(buff, BUFF_SZ, "report %s (%d, size=%d)\n",
2174			"REPORT_EE_DATA", report->id, size-1);
2175		hid_debug_event(hdev, buff);
2176		snprintf(buff, BUFF_SZ, "\tData address: 0x%02x%02x\n",
2177				raw_data[2], raw_data[1]);
2178		hid_debug_event(hdev, buff);
2179		snprintf(buff, BUFF_SZ, "\tData length: %d\n", raw_data[3]);
2180		hid_debug_event(hdev, buff);
2181		if (raw_data[3] == 0) {
2182			snprintf(buff, BUFF_SZ, "\tNo data\n");
2183			hid_debug_event(hdev, buff);
2184		} else if (raw_data[3] + 4 <= size) {
2185			snprintf(buff, BUFF_SZ, "\tData: ");
2186			hid_debug_event(hdev, buff);
2187			dump_buff_as_hex(buff, BUFF_SZ, raw_data+4, raw_data[3]);
2188			hid_debug_event(hdev, buff);
2189		} else {
2190			snprintf(buff, BUFF_SZ, "\tData overflowed\n");
2191			hid_debug_event(hdev, buff);
2192		}
2193		break;
2194	case REPORT_MEMORY:
2195		/* Data buffer in response to REPORT_READ_MEMORY or REPORT_WRTIE_MEMORY */
2196		snprintf(buff, BUFF_SZ, "report %s (%d, size=%d)\n",
2197			"REPORT_MEMORY", report->id, size-1);
2198		hid_debug_event(hdev, buff);
2199		switch (data->addr_sz) {
2200		case 2:
2201			snprintf(buff, BUFF_SZ, "\tData address: 0x%02x%02x\n",
2202					raw_data[2], raw_data[1]);
2203			hid_debug_event(hdev, buff);
2204			snprintf(buff, BUFF_SZ, "\tData length: %d\n", raw_data[3]);
2205			hid_debug_event(hdev, buff);
2206			if (raw_data[3] == 0) {
2207				snprintf(buff, BUFF_SZ, "\tNo data\n");
2208			} else if (raw_data[3] + 4 <= size) {
2209				snprintf(buff, BUFF_SZ, "\tData: ");
2210				hid_debug_event(hdev, buff);
2211				dump_buff_as_hex(buff, BUFF_SZ, raw_data+4, raw_data[3]);
2212			} else {
2213				snprintf(buff, BUFF_SZ, "\tData overflowed\n");
2214			}
2215			break;
2216		case 3:
2217			snprintf(buff, BUFF_SZ, "\tData address: 0x%02x%02x%02x\n",
2218					raw_data[3], raw_data[2], raw_data[1]);
2219			hid_debug_event(hdev, buff);
2220			snprintf(buff, BUFF_SZ, "\tData length: %d\n", raw_data[4]);
2221			hid_debug_event(hdev, buff);
2222			if (raw_data[4] == 0) {
2223				snprintf(buff, BUFF_SZ, "\tNo data\n");
2224			} else if (raw_data[4] + 5 <= size) {
2225				snprintf(buff, BUFF_SZ, "\tData: ");
2226				hid_debug_event(hdev, buff);
2227				dump_buff_as_hex(buff, BUFF_SZ, raw_data+5, raw_data[4]);
2228			} else {
2229				snprintf(buff, BUFF_SZ, "\tData overflowed\n");
2230			}
2231			break;
2232		default:
2233			snprintf(buff, BUFF_SZ, "\tNot supported\n");
2234		}
2235		hid_debug_event(hdev, buff);
2236		break;
2237	case REPORT_VERSION:
2238		snprintf(buff, BUFF_SZ, "report %s (%d, size=%d)\n",
2239			"REPORT_VERSION", report->id, size-1);
2240		hid_debug_event(hdev, buff);
2241		snprintf(buff, BUFF_SZ, "\tFirmware version: %d.%d\n",
2242				raw_data[2], raw_data[1]);
2243		hid_debug_event(hdev, buff);
2244		break;
2245	case REPORT_BL_ERASE_MEMORY:
2246		snprintf(buff, BUFF_SZ, "report %s (%d, size=%d)\n",
2247			"REPORT_BL_ERASE_MEMORY", report->id, size-1);
2248		hid_debug_event(hdev, buff);
2249		/* TODO */
2250		break;
2251	case REPORT_BL_READ_MEMORY:
2252		snprintf(buff, BUFF_SZ, "report %s (%d, size=%d)\n",
2253			"REPORT_BL_READ_MEMORY", report->id, size-1);
2254		hid_debug_event(hdev, buff);
2255		/* TODO */
2256		break;
2257	case REPORT_BL_WRITE_MEMORY:
2258		snprintf(buff, BUFF_SZ, "report %s (%d, size=%d)\n",
2259			"REPORT_BL_WRITE_MEMORY", report->id, size-1);
2260		hid_debug_event(hdev, buff);
2261		/* TODO */
2262		break;
2263	case REPORT_DEVID:
2264		snprintf(buff, BUFF_SZ, "report %s (%d, size=%d)\n",
2265			"REPORT_DEVID", report->id, size-1);
2266		hid_debug_event(hdev, buff);
2267		snprintf(buff, BUFF_SZ, "\tSerial: 0x%02x%02x%02x%02x\n",
2268				raw_data[1], raw_data[2], raw_data[3], raw_data[4]);
2269		hid_debug_event(hdev, buff);
2270		snprintf(buff, BUFF_SZ, "\tType: 0x%02x\n",
2271				raw_data[5]);
2272		hid_debug_event(hdev, buff);
2273		break;
2274	case REPORT_SPLASH_SIZE:
2275		snprintf(buff, BUFF_SZ, "report %s (%d, size=%d)\n",
2276			"REPORT_SPLASH_SIZE", report->id, size-1);
2277		hid_debug_event(hdev, buff);
2278		snprintf(buff, BUFF_SZ, "\tTotal splash space: %d\n",
2279				(raw_data[2] << 8) | raw_data[1]);
2280		hid_debug_event(hdev, buff);
2281		snprintf(buff, BUFF_SZ, "\tUsed splash space: %d\n",
2282				(raw_data[4] << 8) | raw_data[3]);
2283		hid_debug_event(hdev, buff);
2284		break;
2285	case REPORT_HOOK_VERSION:
2286		snprintf(buff, BUFF_SZ, "report %s (%d, size=%d)\n",
2287			"REPORT_HOOK_VERSION", report->id, size-1);
2288		hid_debug_event(hdev, buff);
2289		snprintf(buff, BUFF_SZ, "\tFirmware version: %d.%d\n",
2290				raw_data[1], raw_data[2]);
2291		hid_debug_event(hdev, buff);
2292		break;
2293	default:
2294		snprintf(buff, BUFF_SZ, "report %s (%d, size=%d)\n",
2295			"<unknown>", report->id, size-1);
2296		hid_debug_event(hdev, buff);
2297		break;
2298	}
2299	wake_up_interruptible(&hdev->debug_wait);
2300	kfree(buff);
2301}
2302
2303static void picolcd_init_devfs(struct picolcd_data *data,
2304		struct hid_report *eeprom_r, struct hid_report *eeprom_w,
2305		struct hid_report *flash_r, struct hid_report *flash_w,
2306		struct hid_report *reset)
2307{
2308	struct hid_device *hdev = data->hdev;
2309
2310	mutex_init(&data->mutex_flash);
2311
2312	/* reset */
2313	if (reset)
2314		data->debug_reset = debugfs_create_file("reset", 0600,
2315				hdev->debug_dir, data, &picolcd_debug_reset_fops);
2316
2317	/* eeprom */
2318	if (eeprom_r || eeprom_w)
2319		data->debug_eeprom = debugfs_create_file("eeprom",
2320			(eeprom_w ? S_IWUSR : 0) | (eeprom_r ? S_IRUSR : 0),
2321			hdev->debug_dir, data, &picolcd_debug_eeprom_fops);
2322
2323	/* flash */
2324	if (flash_r && flash_r->maxfield == 1 && flash_r->field[0]->report_size == 8)
2325		data->addr_sz = flash_r->field[0]->report_count - 1;
2326	else
2327		data->addr_sz = -1;
2328	if (data->addr_sz == 2 || data->addr_sz == 3) {
2329		data->debug_flash = debugfs_create_file("flash",
2330			(flash_w ? S_IWUSR : 0) | (flash_r ? S_IRUSR : 0),
2331			hdev->debug_dir, data, &picolcd_debug_flash_fops);
2332	} else if (flash_r || flash_w)
2333		hid_warn(hdev, "Unexpected FLASH access reports, please submit rdesc for review\n");
2334}
2335
2336static void picolcd_exit_devfs(struct picolcd_data *data)
2337{
2338	struct dentry *dent;
2339
2340	dent = data->debug_reset;
2341	data->debug_reset = NULL;
2342	if (dent)
2343		debugfs_remove(dent);
2344	dent = data->debug_eeprom;
2345	data->debug_eeprom = NULL;
2346	if (dent)
2347		debugfs_remove(dent);
2348	dent = data->debug_flash;
2349	data->debug_flash = NULL;
2350	if (dent)
2351		debugfs_remove(dent);
2352	mutex_destroy(&data->mutex_flash);
2353}
2354#else
2355static inline void picolcd_debug_raw_event(struct picolcd_data *data,
2356		struct hid_device *hdev, struct hid_report *report,
2357		u8 *raw_data, int size)
2358{
2359}
2360static inline void picolcd_init_devfs(struct picolcd_data *data,
2361		struct hid_report *eeprom_r, struct hid_report *eeprom_w,
2362		struct hid_report *flash_r, struct hid_report *flash_w,
2363		struct hid_report *reset)
2364{
2365}
2366static inline void picolcd_exit_devfs(struct picolcd_data *data)
2367{
2368}
2369#endif /* CONFIG_DEBUG_FS */
2370
2371/*
2372 * Handle raw report as sent by device
2373 */
2374static int picolcd_raw_event(struct hid_device *hdev,
2375		struct hid_report *report, u8 *raw_data, int size)
2376{
2377	struct picolcd_data *data = hid_get_drvdata(hdev);
2378	unsigned long flags;
2379	int ret = 0;
2380
2381	if (!data)
2382		return 1;
2383
2384	if (report->id == REPORT_KEY_STATE) {
2385		if (data->input_keys)
2386			ret = picolcd_raw_keypad(data, report, raw_data+1, size-1);
2387	} else if (report->id == REPORT_IR_DATA) {
2388		if (data->input_cir)
2389			ret = picolcd_raw_cir(data, report, raw_data+1, size-1);
2390	} else {
2391		spin_lock_irqsave(&data->lock, flags);
2392		/*
2393		 * We let the caller of picolcd_send_and_wait() check if the
2394		 * report we got is one of the expected ones or not.
2395		 */
2396		if (data->pending) {
2397			memcpy(data->pending->raw_data, raw_data+1, size-1);
2398			data->pending->raw_size  = size-1;
2399			data->pending->in_report = report;
2400			complete(&data->pending->ready);
2401		}
2402		spin_unlock_irqrestore(&data->lock, flags);
2403	}
2404
2405	picolcd_debug_raw_event(data, hdev, report, raw_data, size);
2406	return 1;
2407}
2408
2409#ifdef CONFIG_PM
2410static int picolcd_suspend(struct hid_device *hdev, pm_message_t message)
2411{
2412	if (message.event & PM_EVENT_AUTO)
2413		return 0;
2414
2415	picolcd_suspend_backlight(hid_get_drvdata(hdev));
2416	dbg_hid(PICOLCD_NAME " device ready for suspend\n");
2417	return 0;
2418}
2419
2420static int picolcd_resume(struct hid_device *hdev)
2421{
2422	int ret;
2423	ret = picolcd_resume_backlight(hid_get_drvdata(hdev));
2424	if (ret)
2425		dbg_hid(PICOLCD_NAME " restoring backlight failed: %d\n", ret);
2426	return 0;
2427}
2428
2429static int picolcd_reset_resume(struct hid_device *hdev)
2430{
2431	int ret;
2432	ret = picolcd_reset(hdev);
2433	if (ret)
2434		dbg_hid(PICOLCD_NAME " resetting our device failed: %d\n", ret);
2435	ret = picolcd_fb_reset(hid_get_drvdata(hdev), 0);
2436	if (ret)
2437		dbg_hid(PICOLCD_NAME " restoring framebuffer content failed: %d\n", ret);
2438	ret = picolcd_resume_lcd(hid_get_drvdata(hdev));
2439	if (ret)
2440		dbg_hid(PICOLCD_NAME " restoring lcd failed: %d\n", ret);
2441	ret = picolcd_resume_backlight(hid_get_drvdata(hdev));
2442	if (ret)
2443		dbg_hid(PICOLCD_NAME " restoring backlight failed: %d\n", ret);
2444	picolcd_leds_set(hid_get_drvdata(hdev));
2445	return 0;
2446}
2447#endif
2448
2449/* initialize keypad input device */
2450static int picolcd_init_keys(struct picolcd_data *data,
2451		struct hid_report *report)
2452{
2453	struct hid_device *hdev = data->hdev;
2454	struct input_dev *idev;
2455	int error, i;
2456
2457	if (!report)
2458		return -ENODEV;
2459	if (report->maxfield != 1 || report->field[0]->report_count != 2 ||
2460			report->field[0]->report_size != 8) {
2461		hid_err(hdev, "unsupported KEY_STATE report\n");
2462		return -EINVAL;
2463	}
2464
2465	idev = input_allocate_device();
2466	if (idev == NULL) {
2467		hid_err(hdev, "failed to allocate input device\n");
2468		return -ENOMEM;
2469	}
2470	input_set_drvdata(idev, hdev);
2471	memcpy(data->keycode, def_keymap, sizeof(def_keymap));
2472	idev->name = hdev->name;
2473	idev->phys = hdev->phys;
2474	idev->uniq = hdev->uniq;
2475	idev->id.bustype = hdev->bus;
2476	idev->id.vendor  = hdev->vendor;
2477	idev->id.product = hdev->product;
2478	idev->id.version = hdev->version;
2479	idev->dev.parent = hdev->dev.parent;
2480	idev->keycode     = &data->keycode;
2481	idev->keycodemax  = PICOLCD_KEYS;
2482	idev->keycodesize = sizeof(data->keycode[0]);
2483	input_set_capability(idev, EV_MSC, MSC_SCAN);
2484	set_bit(EV_REP, idev->evbit);
2485	for (i = 0; i < PICOLCD_KEYS; i++)
2486		input_set_capability(idev, EV_KEY, data->keycode[i]);
2487	error = input_register_device(idev);
2488	if (error) {
2489		hid_err(hdev, "error registering the input device\n");
2490		input_free_device(idev);
2491		return error;
2492	}
2493	data->input_keys = idev;
2494	return 0;
2495}
2496
2497static void picolcd_exit_keys(struct picolcd_data *data)
2498{
2499	struct input_dev *idev = data->input_keys;
2500
2501	data->input_keys = NULL;
2502	if (idev)
2503		input_unregister_device(idev);
2504}
2505
2506/* initialize CIR input device */
2507static inline int picolcd_init_cir(struct picolcd_data *data, struct hid_report *report)
2508{
2509	/* support not implemented yet */
2510	return 0;
2511}
2512
2513static inline void picolcd_exit_cir(struct picolcd_data *data)
2514{
2515}
2516
2517static int picolcd_probe_lcd(struct hid_device *hdev, struct picolcd_data *data)
2518{
2519	int error;
2520
2521	error = picolcd_check_version(hdev);
2522	if (error)
2523		return error;
2524
2525	if (data->version[0] != 0 && data->version[1] != 3)
2526		hid_info(hdev, "Device with untested firmware revision, please submit /sys/kernel/debug/hid/%s/rdesc for this device.\n",
2527			 dev_name(&hdev->dev));
2528
2529	/* Setup keypad input device */
2530	error = picolcd_init_keys(data, picolcd_in_report(REPORT_KEY_STATE, hdev));
2531	if (error)
2532		goto err;
2533
2534	/* Setup CIR input device */
2535	error = picolcd_init_cir(data, picolcd_in_report(REPORT_IR_DATA, hdev));
2536	if (error)
2537		goto err;
2538
2539	/* Set up the framebuffer device */
2540	error = picolcd_init_framebuffer(data);
2541	if (error)
2542		goto err;
2543
2544	/* Setup lcd class device */
2545	error = picolcd_init_lcd(data, picolcd_out_report(REPORT_CONTRAST, hdev));
2546	if (error)
2547		goto err;
2548
2549	/* Setup backlight class device */
2550	error = picolcd_init_backlight(data, picolcd_out_report(REPORT_BRIGHTNESS, hdev));
2551	if (error)
2552		goto err;
2553
2554	/* Setup the LED class devices */
2555	error = picolcd_init_leds(data, picolcd_out_report(REPORT_LED_STATE, hdev));
2556	if (error)
2557		goto err;
2558
2559	picolcd_init_devfs(data, picolcd_out_report(REPORT_EE_READ, hdev),
2560			picolcd_out_report(REPORT_EE_WRITE, hdev),
2561			picolcd_out_report(REPORT_READ_MEMORY, hdev),
2562			picolcd_out_report(REPORT_WRITE_MEMORY, hdev),
2563			picolcd_out_report(REPORT_RESET, hdev));
2564	return 0;
2565err:
2566	picolcd_exit_leds(data);
2567	picolcd_exit_backlight(data);
2568	picolcd_exit_lcd(data);
2569	picolcd_exit_framebuffer(data);
2570	picolcd_exit_cir(data);
2571	picolcd_exit_keys(data);
2572	return error;
2573}
2574
2575static int picolcd_probe_bootloader(struct hid_device *hdev, struct picolcd_data *data)
2576{
2577	int error;
2578
2579	error = picolcd_check_version(hdev);
2580	if (error)
2581		return error;
2582
2583	if (data->version[0] != 1 && data->version[1] != 0)
2584		hid_info(hdev, "Device with untested bootloader revision, please submit /sys/kernel/debug/hid/%s/rdesc for this device.\n",
2585			 dev_name(&hdev->dev));
2586
2587	picolcd_init_devfs(data, NULL, NULL,
2588			picolcd_out_report(REPORT_BL_READ_MEMORY, hdev),
2589			picolcd_out_report(REPORT_BL_WRITE_MEMORY, hdev), NULL);
2590	return 0;
2591}
2592
2593static int picolcd_probe(struct hid_device *hdev,
2594		     const struct hid_device_id *id)
2595{
2596	struct picolcd_data *data;
2597	int error = -ENOMEM;
2598
2599	dbg_hid(PICOLCD_NAME " hardware probe...\n");
2600
2601	/*
2602	 * Let's allocate the picolcd data structure, set some reasonable
2603	 * defaults, and associate it with the device
2604	 */
2605	data = kzalloc(sizeof(struct picolcd_data), GFP_KERNEL);
2606	if (data == NULL) {
2607		hid_err(hdev, "can't allocate space for Minibox PicoLCD device data\n");
2608		error = -ENOMEM;
2609		goto err_no_cleanup;
2610	}
2611
2612	spin_lock_init(&data->lock);
2613	mutex_init(&data->mutex);
2614	data->hdev = hdev;
2615	data->opmode_delay = 5000;
2616	if (hdev->product == USB_DEVICE_ID_PICOLCD_BOOTLOADER)
2617		data->status |= PICOLCD_BOOTLOADER;
2618	hid_set_drvdata(hdev, data);
2619
2620	/* Parse the device reports and start it up */
2621	error = hid_parse(hdev);
2622	if (error) {
2623		hid_err(hdev, "device report parse failed\n");
2624		goto err_cleanup_data;
2625	}
2626
2627	/* We don't use hidinput but hid_hw_start() fails if nothing is
2628	 * claimed. So spoof claimed input. */
2629	hdev->claimed = HID_CLAIMED_INPUT;
2630	error = hid_hw_start(hdev, 0);
2631	hdev->claimed = 0;
2632	if (error) {
2633		hid_err(hdev, "hardware start failed\n");
2634		goto err_cleanup_data;
2635	}
2636
2637	error = hid_hw_open(hdev);
2638	if (error) {
2639		hid_err(hdev, "failed to open input interrupt pipe for key and IR events\n");
2640		goto err_cleanup_hid_hw;
2641	}
2642
2643	error = device_create_file(&hdev->dev, &dev_attr_operation_mode_delay);
2644	if (error) {
2645		hid_err(hdev, "failed to create sysfs attributes\n");
2646		goto err_cleanup_hid_ll;
2647	}
2648
2649	error = device_create_file(&hdev->dev, &dev_attr_operation_mode);
2650	if (error) {
2651		hid_err(hdev, "failed to create sysfs attributes\n");
2652		goto err_cleanup_sysfs1;
2653	}
2654
2655	if (data->status & PICOLCD_BOOTLOADER)
2656		error = picolcd_probe_bootloader(hdev, data);
2657	else
2658		error = picolcd_probe_lcd(hdev, data);
2659	if (error)
2660		goto err_cleanup_sysfs2;
2661
2662	dbg_hid(PICOLCD_NAME " activated and initialized\n");
2663	return 0;
2664
2665err_cleanup_sysfs2:
2666	device_remove_file(&hdev->dev, &dev_attr_operation_mode);
2667err_cleanup_sysfs1:
2668	device_remove_file(&hdev->dev, &dev_attr_operation_mode_delay);
2669err_cleanup_hid_ll:
2670	hid_hw_close(hdev);
2671err_cleanup_hid_hw:
2672	hid_hw_stop(hdev);
2673err_cleanup_data:
2674	kfree(data);
2675err_no_cleanup:
2676	hid_set_drvdata(hdev, NULL);
2677
2678	return error;
2679}
2680
2681static void picolcd_remove(struct hid_device *hdev)
2682{
2683	struct picolcd_data *data = hid_get_drvdata(hdev);
2684	unsigned long flags;
2685
2686	dbg_hid(PICOLCD_NAME " hardware remove...\n");
2687	spin_lock_irqsave(&data->lock, flags);
2688	data->status |= PICOLCD_FAILED;
2689	spin_unlock_irqrestore(&data->lock, flags);
2690#ifdef CONFIG_HID_PICOLCD_FB
2691	/* short-circuit FB as early as possible in order to
2692	 * avoid long delays if we host console.
2693	 */
2694	if (data->fb_info)
2695		data->fb_info->par = NULL;
2696#endif
2697
2698	picolcd_exit_devfs(data);
2699	device_remove_file(&hdev->dev, &dev_attr_operation_mode);
2700	device_remove_file(&hdev->dev, &dev_attr_operation_mode_delay);
2701	hid_hw_close(hdev);
2702	hid_hw_stop(hdev);
2703	hid_set_drvdata(hdev, NULL);
2704
2705	/* Shortcut potential pending reply that will never arrive */
2706	spin_lock_irqsave(&data->lock, flags);
2707	if (data->pending)
2708		complete(&data->pending->ready);
2709	spin_unlock_irqrestore(&data->lock, flags);
2710
2711	/* Cleanup LED */
2712	picolcd_exit_leds(data);
2713	/* Clean up the framebuffer */
2714	picolcd_exit_backlight(data);
2715	picolcd_exit_lcd(data);
2716	picolcd_exit_framebuffer(data);
2717	/* Cleanup input */
2718	picolcd_exit_cir(data);
2719	picolcd_exit_keys(data);
2720
2721	mutex_destroy(&data->mutex);
2722	/* Finally, clean up the picolcd data itself */
2723	kfree(data);
2724}
2725
2726static const struct hid_device_id picolcd_devices[] = {
2727	{ HID_USB_DEVICE(USB_VENDOR_ID_MICROCHIP, USB_DEVICE_ID_PICOLCD) },
2728	{ HID_USB_DEVICE(USB_VENDOR_ID_MICROCHIP, USB_DEVICE_ID_PICOLCD_BOOTLOADER) },
2729	{ }
2730};
2731MODULE_DEVICE_TABLE(hid, picolcd_devices);
2732
2733static struct hid_driver picolcd_driver = {
2734	.name =          "hid-picolcd",
2735	.id_table =      picolcd_devices,
2736	.probe =         picolcd_probe,
2737	.remove =        picolcd_remove,
2738	.raw_event =     picolcd_raw_event,
2739#ifdef CONFIG_PM
2740	.suspend =       picolcd_suspend,
2741	.resume =        picolcd_resume,
2742	.reset_resume =  picolcd_reset_resume,
2743#endif
2744};
2745
2746static int __init picolcd_init(void)
2747{
2748	return hid_register_driver(&picolcd_driver);
2749}
2750
2751static void __exit picolcd_exit(void)
2752{
2753	hid_unregister_driver(&picolcd_driver);
2754#ifdef CONFIG_HID_PICOLCD_FB
2755	flush_work_sync(&picolcd_fb_cleanup);
2756	WARN_ON(fb_pending);
2757#endif
2758}
2759
2760module_init(picolcd_init);
2761module_exit(picolcd_exit);
2762MODULE_DESCRIPTION("Minibox graphics PicoLCD Driver");
2763MODULE_LICENSE("GPL v2");