ene_ir.c 31.1 KB
Newer Older
1
/*
M
Maxim Levitsky 已提交
2
 * driver for ENE KB3926 B/C/D/E/F CIR (pnp id: ENE0XXX)
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
 *
 * Copyright (C) 2010 Maxim Levitsky <maximlevitsky@gmail.com>
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation; either version 2 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
 * USA
M
Maxim Levitsky 已提交
20 21 22 23 24 25 26 27 28 29 30
 *
 * Special thanks to:
 *   Sami R. <maesesami@gmail.com> for lot of help in debugging and therefore
 *    bringing to life support for transmission & learning mode.
 *
 *   Charlie Andrews <charliethepilot@googlemail.com> for lots of help in
 *   bringing up the support of new firmware buffer that is popular
 *   on latest notebooks
 *
 *   ENE for partial device documentation
 *
31 32
 */

33 34
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt

35 36 37 38 39 40
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/pnp.h>
#include <linux/io.h>
#include <linux/interrupt.h>
#include <linux/sched.h>
41
#include <linux/slab.h>
42
#include <media/rc-core.h>
43
#include "ene_ir.h"
44

M
Maxim Levitsky 已提交
45
static int sample_period;
46
static bool learning_mode_force;
47
static int debug;
M
Maxim Levitsky 已提交
48
static bool txsim;
49

M
Maxim Levitsky 已提交
50 51 52 53 54
static void ene_set_reg_addr(struct ene_device *dev, u16 reg)
{
	outb(reg >> 8, dev->hw_io + ENE_ADDR_HI);
	outb(reg & 0xFF, dev->hw_io + ENE_ADDR_LO);
}
55 56

/* read a hardware register */
M
Maxim Levitsky 已提交
57
static u8 ene_read_reg(struct ene_device *dev, u16 reg)
58 59
{
	u8 retval;
M
Maxim Levitsky 已提交
60
	ene_set_reg_addr(dev, reg);
61
	retval = inb(dev->hw_io + ENE_IO);
M
Maxim Levitsky 已提交
62
	dbg_regs("reg %04x == %02x", reg, retval);
63 64 65 66
	return retval;
}

/* write a hardware register */
M
Maxim Levitsky 已提交
67
static void ene_write_reg(struct ene_device *dev, u16 reg, u8 value)
68
{
M
Maxim Levitsky 已提交
69 70
	dbg_regs("reg %04x <- %02x", reg, value);
	ene_set_reg_addr(dev, reg);
71 72 73
	outb(value, dev->hw_io + ENE_IO);
}

M
Maxim Levitsky 已提交
74 75
/* Set bits in hardware register */
static void ene_set_reg_mask(struct ene_device *dev, u16 reg, u8 mask)
76
{
M
Maxim Levitsky 已提交
77 78 79 80
	dbg_regs("reg %04x |= %02x", reg, mask);
	ene_set_reg_addr(dev, reg);
	outb(inb(dev->hw_io + ENE_IO) | mask, dev->hw_io + ENE_IO);
}
81

M
Maxim Levitsky 已提交
82 83 84 85 86 87 88
/* Clear bits in hardware register */
static void ene_clear_reg_mask(struct ene_device *dev, u16 reg, u8 mask)
{
	dbg_regs("reg %04x &= ~%02x ", reg, mask);
	ene_set_reg_addr(dev, reg);
	outb(inb(dev->hw_io + ENE_IO) & ~mask, dev->hw_io + ENE_IO);
}
89

M
Maxim Levitsky 已提交
90 91 92 93 94 95 96 97
/* A helper to set/clear a bit in register according to boolean variable */
static void ene_set_clear_reg_mask(struct ene_device *dev, u16 reg, u8 mask,
								bool set)
{
	if (set)
		ene_set_reg_mask(dev, reg, mask);
	else
		ene_clear_reg_mask(dev, reg, mask);
98 99 100 101 102 103 104
}

/* detect hardware features */
static int ene_hw_detect(struct ene_device *dev)
{
	u8 chip_major, chip_minor;
	u8 hw_revision, old_ver;
M
Maxim Levitsky 已提交
105
	u8 fw_reg2, fw_reg1;
106

M
Maxim Levitsky 已提交
107 108 109 110
	ene_clear_reg_mask(dev, ENE_ECSTS, ENE_ECSTS_RSRVD);
	chip_major = ene_read_reg(dev, ENE_ECVER_MAJOR);
	chip_minor = ene_read_reg(dev, ENE_ECVER_MINOR);
	ene_set_reg_mask(dev, ENE_ECSTS, ENE_ECSTS_RSRVD);
111

M
Maxim Levitsky 已提交
112 113
	hw_revision = ene_read_reg(dev, ENE_ECHV);
	old_ver = ene_read_reg(dev, ENE_HW_VER_OLD);
114

M
Maxim Levitsky 已提交
115 116
	dev->pll_freq = (ene_read_reg(dev, ENE_PLLFRH) << 4) +
		(ene_read_reg(dev, ENE_PLLFRL) >> 4);
117

M
Maxim Levitsky 已提交
118 119 120
	if (sample_period != ENE_DEFAULT_SAMPLE_PERIOD)
		dev->rx_period_adjust =
			dev->pll_freq == ENE_DEFAULT_PLL_FREQ ? 2 : 4;
121

122
	if (hw_revision == 0xFF) {
123 124 125
		pr_warn("device seems to be disabled\n");
		pr_warn("send a mail to lirc-list@lists.sourceforge.net\n");
		pr_warn("please attach output of acpidump and dmidecode\n");
126 127 128
		return -ENODEV;
	}

129 130
	pr_notice("chip is 0x%02x%02x - kbver = 0x%02x, rev = 0x%02x\n",
		  chip_major, chip_minor, old_ver, hw_revision);
M
Maxim Levitsky 已提交
131

132
	pr_notice("PLL freq = %d\n", dev->pll_freq);
M
Maxim Levitsky 已提交
133

134
	if (chip_major == 0x33) {
135
		pr_warn("chips 0x33xx aren't supported\n");
136 137 138 139 140
		return -ENODEV;
	}

	if (chip_major == 0x39 && chip_minor == 0x26 && hw_revision == 0xC0) {
		dev->hw_revision = ENE_HW_C;
141
		pr_notice("KB3926C detected\n");
142 143
	} else if (old_ver == 0x24 && hw_revision == 0xC0) {
		dev->hw_revision = ENE_HW_B;
144
		pr_notice("KB3926B detected\n");
145 146
	} else {
		dev->hw_revision = ENE_HW_D;
147
		pr_notice("KB3926D or higher detected\n");
148 149 150 151 152 153
	}

	/* detect features hardware supports */
	if (dev->hw_revision < ENE_HW_C)
		return 0;

M
Maxim Levitsky 已提交
154 155
	fw_reg1 = ene_read_reg(dev, ENE_FW1);
	fw_reg2 = ene_read_reg(dev, ENE_FW2);
156

157
	pr_notice("Firmware regs: %02x %02x\n", fw_reg1, fw_reg2);
158

M
Maxim Levitsky 已提交
159 160 161 162 163 164
	dev->hw_use_gpio_0a = !!(fw_reg2 & ENE_FW2_GP0A);
	dev->hw_learning_and_tx_capable = !!(fw_reg2 & ENE_FW2_LEARNING);
	dev->hw_extra_buffer = !!(fw_reg1 & ENE_FW1_HAS_EXTRA_BUF);

	if (dev->hw_learning_and_tx_capable)
		dev->hw_fan_input = !!(fw_reg2 & ENE_FW2_FAN_INPUT);
165

166
	pr_notice("Hardware features:\n");
167 168

	if (dev->hw_learning_and_tx_capable) {
169 170 171 172 173 174
		pr_notice("* Supports transmitting & learning mode\n");
		pr_notice("   This feature is rare and therefore,\n");
		pr_notice("   you are welcome to test it,\n");
		pr_notice("   and/or contact the author via:\n");
		pr_notice("   lirc-list@lists.sourceforge.net\n");
		pr_notice("   or maximlevitsky@gmail.com\n");
M
Maxim Levitsky 已提交
175

176 177
		pr_notice("* Uses GPIO %s for IR raw input\n",
			  dev->hw_use_gpio_0a ? "40" : "0A");
M
Maxim Levitsky 已提交
178 179

		if (dev->hw_fan_input)
180
			pr_notice("* Uses unused fan feedback input as source of demodulated IR data\n");
181
	}
M
Maxim Levitsky 已提交
182 183

	if (!dev->hw_fan_input)
184 185
		pr_notice("* Uses GPIO %s for IR demodulated input\n",
			  dev->hw_use_gpio_0a ? "0A" : "40");
M
Maxim Levitsky 已提交
186 187

	if (dev->hw_extra_buffer)
188
		pr_notice("* Uses new style input buffer\n");
189 190 191
	return 0;
}

192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218
/* Read properities of hw sample buffer */
static void ene_rx_setup_hw_buffer(struct ene_device *dev)
{
	u16 tmp;

	ene_rx_read_hw_pointer(dev);
	dev->r_pointer = dev->w_pointer;

	if (!dev->hw_extra_buffer) {
		dev->buffer_len = ENE_FW_PACKET_SIZE * 2;
		return;
	}

	tmp = ene_read_reg(dev, ENE_FW_SAMPLE_BUFFER);
	tmp |= ene_read_reg(dev, ENE_FW_SAMPLE_BUFFER+1) << 8;
	dev->extra_buf1_address = tmp;

	dev->extra_buf1_len = ene_read_reg(dev, ENE_FW_SAMPLE_BUFFER + 2);

	tmp = ene_read_reg(dev, ENE_FW_SAMPLE_BUFFER + 3);
	tmp |= ene_read_reg(dev, ENE_FW_SAMPLE_BUFFER + 4) << 8;
	dev->extra_buf2_address = tmp;

	dev->extra_buf2_len = ene_read_reg(dev, ENE_FW_SAMPLE_BUFFER + 5);

	dev->buffer_len = dev->extra_buf1_len + dev->extra_buf2_len + 8;

219 220 221 222 223
	pr_notice("Hardware uses 2 extended buffers:\n");
	pr_notice("  0x%04x - len : %d\n",
		  dev->extra_buf1_address, dev->extra_buf1_len);
	pr_notice("  0x%04x - len : %d\n",
		  dev->extra_buf2_address, dev->extra_buf2_len);
224

225
	pr_notice("Total buffer len = %d\n", dev->buffer_len);
226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243

	if (dev->buffer_len > 64 || dev->buffer_len < 16)
		goto error;

	if (dev->extra_buf1_address > 0xFBFC ||
					dev->extra_buf1_address < 0xEC00)
		goto error;

	if (dev->extra_buf2_address > 0xFBFC ||
					dev->extra_buf2_address < 0xEC00)
		goto error;

	if (dev->r_pointer > dev->buffer_len)
		goto error;

	ene_set_reg_mask(dev, ENE_FW1, ENE_FW1_EXTRA_BUF_HND);
	return;
error:
244
	pr_warn("Error validating extra buffers, device probably won't work\n");
245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330
	dev->hw_extra_buffer = false;
	ene_clear_reg_mask(dev, ENE_FW1, ENE_FW1_EXTRA_BUF_HND);
}


/* Restore the pointers to extra buffers - to make module reload work*/
static void ene_rx_restore_hw_buffer(struct ene_device *dev)
{
	if (!dev->hw_extra_buffer)
		return;

	ene_write_reg(dev, ENE_FW_SAMPLE_BUFFER + 0,
				dev->extra_buf1_address & 0xFF);
	ene_write_reg(dev, ENE_FW_SAMPLE_BUFFER + 1,
				dev->extra_buf1_address >> 8);
	ene_write_reg(dev, ENE_FW_SAMPLE_BUFFER + 2, dev->extra_buf1_len);

	ene_write_reg(dev, ENE_FW_SAMPLE_BUFFER + 3,
				dev->extra_buf2_address & 0xFF);
	ene_write_reg(dev, ENE_FW_SAMPLE_BUFFER + 4,
				dev->extra_buf2_address >> 8);
	ene_write_reg(dev, ENE_FW_SAMPLE_BUFFER + 5,
				dev->extra_buf2_len);
	ene_clear_reg_mask(dev, ENE_FW1, ENE_FW1_EXTRA_BUF_HND);
}

/* Read hardware write pointer */
static void ene_rx_read_hw_pointer(struct ene_device *dev)
{
	if (dev->hw_extra_buffer)
		dev->w_pointer = ene_read_reg(dev, ENE_FW_RX_POINTER);
	else
		dev->w_pointer = ene_read_reg(dev, ENE_FW2)
			& ENE_FW2_BUF_WPTR ? 0 : ENE_FW_PACKET_SIZE;

	dbg_verbose("RB: HW write pointer: %02x, driver read pointer: %02x",
		dev->w_pointer, dev->r_pointer);
}

/* Gets address of next sample from HW ring buffer */
static int ene_rx_get_sample_reg(struct ene_device *dev)
{
	int r_pointer;

	if (dev->r_pointer == dev->w_pointer) {
		dbg_verbose("RB: hit end, try update w_pointer");
		ene_rx_read_hw_pointer(dev);
	}

	if (dev->r_pointer == dev->w_pointer) {
		dbg_verbose("RB: end of data at %d", dev->r_pointer);
		return 0;
	}

	dbg_verbose("RB: reading at offset %d", dev->r_pointer);
	r_pointer = dev->r_pointer;

	dev->r_pointer++;
	if (dev->r_pointer == dev->buffer_len)
		dev->r_pointer = 0;

	dbg_verbose("RB: next read will be from offset %d", dev->r_pointer);

	if (r_pointer < 8) {
		dbg_verbose("RB: read at main buffer at %d", r_pointer);
		return ENE_FW_SAMPLE_BUFFER + r_pointer;
	}

	r_pointer -= 8;

	if (r_pointer < dev->extra_buf1_len) {
		dbg_verbose("RB: read at 1st extra buffer at %d", r_pointer);
		return dev->extra_buf1_address + r_pointer;
	}

	r_pointer -= dev->extra_buf1_len;

	if (r_pointer < dev->extra_buf2_len) {
		dbg_verbose("RB: read at 2nd extra buffer at %d", r_pointer);
		return dev->extra_buf2_address + r_pointer;
	}

	dbg("attempt to read beyong ring bufer end");
	return 0;
}

M
Maxim Levitsky 已提交
331 332
/* Sense current received carrier */
void ene_rx_sense_carrier(struct ene_device *dev)
333
{
334 335 336
	DEFINE_IR_RAW_EVENT(ev);

	int carrier, duty_cycle;
M
Maxim Levitsky 已提交
337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353
	int period = ene_read_reg(dev, ENE_CIRCAR_PRD);
	int hperiod = ene_read_reg(dev, ENE_CIRCAR_HPRD);

	if (!(period & ENE_CIRCAR_PRD_VALID))
		return;

	period &= ~ENE_CIRCAR_PRD_VALID;

	if (!period)
		return;

	dbg("RX: hardware carrier period = %02x", period);
	dbg("RX: hardware carrier pulse period = %02x", hperiod);

	carrier = 2000000 / period;
	duty_cycle = (hperiod * 100) / period;
	dbg("RX: sensed carrier = %d Hz, duty cycle %d%%",
354 355 356 357 358
						carrier, duty_cycle);
	if (dev->carrier_detect_enabled) {
		ev.carrier_report = true;
		ev.carrier = carrier;
		ev.duty_cycle = duty_cycle;
359
		ir_raw_event_store(dev->rdev, &ev);
360
	}
361 362
}

M
Maxim Levitsky 已提交
363
/* this enables/disables the CIR RX engine */
364
static void ene_rx_enable_cir_engine(struct ene_device *dev, bool enable)
365
{
M
Maxim Levitsky 已提交
366 367
	ene_set_clear_reg_mask(dev, ENE_CIRCFG,
			ENE_CIRCFG_RX_EN | ENE_CIRCFG_RX_IRQ, enable);
368 369
}

M
Maxim Levitsky 已提交
370
/* this selects input for CIR engine. Ether GPIO 0A or GPIO40*/
371
static void ene_rx_select_input(struct ene_device *dev, bool gpio_0a)
372
{
M
Maxim Levitsky 已提交
373
	ene_set_clear_reg_mask(dev, ENE_CIRCFG2, ENE_CIRCFG2_GPIO0A, gpio_0a);
374 375
}

M
Maxim Levitsky 已提交
376 377 378 379
/*
 * this enables alternative input via fan tachometer sensor and bypasses
 * the hw CIR engine
 */
380
static void ene_rx_enable_fan_input(struct ene_device *dev, bool enable)
381
{
M
Maxim Levitsky 已提交
382 383
	if (!dev->hw_fan_input)
		return;
384

M
Maxim Levitsky 已提交
385 386 387 388 389 390
	if (!enable)
		ene_write_reg(dev, ENE_FAN_AS_IN1, 0);
	else {
		ene_write_reg(dev, ENE_FAN_AS_IN1, ENE_FAN_AS_IN1_EN);
		ene_write_reg(dev, ENE_FAN_AS_IN2, ENE_FAN_AS_IN2_EN);
	}
391 392
}

M
Maxim Levitsky 已提交
393 394
/* setup the receiver for RX*/
static void ene_rx_setup(struct ene_device *dev)
395
{
396
	bool learning_mode = dev->learning_mode_enabled ||
M
Maxim Levitsky 已提交
397 398
					dev->carrier_detect_enabled;
	int sample_period_adjust = 0;
399

400 401 402
	dbg("RX: setup receiver, learning mode = %d", learning_mode);


M
Maxim Levitsky 已提交
403 404
	/* This selects RLC input and clears CFG2 settings */
	ene_write_reg(dev, ENE_CIRCFG2, 0x00);
405

M
Maxim Levitsky 已提交
406 407 408 409
	/* set sample period*/
	if (sample_period == ENE_DEFAULT_SAMPLE_PERIOD)
		sample_period_adjust =
			dev->pll_freq == ENE_DEFAULT_PLL_FREQ ? 1 : 2;
410

M
Maxim Levitsky 已提交
411 412 413 414 415 416
	ene_write_reg(dev, ENE_CIRRLC_CFG,
			(sample_period + sample_period_adjust) |
						ENE_CIRRLC_CFG_OVERFLOW);
	/* revB doesn't support inputs */
	if (dev->hw_revision < ENE_HW_C)
		goto select_timeout;
417

M
Maxim Levitsky 已提交
418 419 420
	if (learning_mode) {

		WARN_ON(!dev->hw_learning_and_tx_capable);
421

M
Maxim Levitsky 已提交
422 423 424 425 426
		/* Enable the opposite of the normal input
		That means that if GPIO40 is normally used, use GPIO0A
		and vice versa.
		This input will carry non demodulated
		signal, and we will tell the hw to demodulate it itself */
427
		ene_rx_select_input(dev, !dev->hw_use_gpio_0a);
M
Maxim Levitsky 已提交
428
		dev->rx_fan_input_inuse = false;
429

M
Maxim Levitsky 已提交
430 431
		/* Enable carrier demodulation */
		ene_set_reg_mask(dev, ENE_CIRCFG, ENE_CIRCFG_CARR_DEMOD);
432

M
Maxim Levitsky 已提交
433
		/* Enable carrier detection */
M
Maxim Levitsky 已提交
434
		ene_write_reg(dev, ENE_CIRCAR_PULS, 0x63);
M
Maxim Levitsky 已提交
435 436
		ene_set_clear_reg_mask(dev, ENE_CIRCFG2, ENE_CIRCFG2_CARR_DETECT,
			dev->carrier_detect_enabled || debug);
437
	} else {
M
Maxim Levitsky 已提交
438 439 440
		if (dev->hw_fan_input)
			dev->rx_fan_input_inuse = true;
		else
441
			ene_rx_select_input(dev, dev->hw_use_gpio_0a);
M
Maxim Levitsky 已提交
442 443 444 445

		/* Disable carrier detection & demodulation */
		ene_clear_reg_mask(dev, ENE_CIRCFG, ENE_CIRCFG_CARR_DEMOD);
		ene_clear_reg_mask(dev, ENE_CIRCFG2, ENE_CIRCFG2_CARR_DETECT);
446 447
	}

M
Maxim Levitsky 已提交
448
select_timeout:
449
	if (dev->rx_fan_input_inuse) {
450
		dev->rdev->rx_resolution = US_TO_NS(ENE_FW_SAMPLE_PERIOD_FAN);
451

M
Maxim Levitsky 已提交
452 453
		/* Fan input doesn't support timeouts, it just ends the
			input with a maximum sample */
454
		dev->rdev->min_timeout = dev->rdev->max_timeout =
455
			US_TO_NS(ENE_FW_SMPL_BUF_FAN_MSK *
M
Maxim Levitsky 已提交
456
				ENE_FW_SAMPLE_PERIOD_FAN);
457
	} else {
458
		dev->rdev->rx_resolution = US_TO_NS(sample_period);
M
Maxim Levitsky 已提交
459 460 461 462 463 464

		/* Theoreticly timeout is unlimited, but we cap it
		 * because it was seen that on one device, it
		 * would stop sending spaces after around 250 msec.
		 * Besides, this is close to 2^32 anyway and timeout is u32.
		 */
465 466
		dev->rdev->min_timeout = US_TO_NS(127 * sample_period);
		dev->rdev->max_timeout = US_TO_NS(200000);
467
	}
M
Maxim Levitsky 已提交
468 469

	if (dev->hw_learning_and_tx_capable)
470
		dev->rdev->tx_resolution = US_TO_NS(sample_period);
M
Maxim Levitsky 已提交
471

472 473 474 475
	if (dev->rdev->timeout > dev->rdev->max_timeout)
		dev->rdev->timeout = dev->rdev->max_timeout;
	if (dev->rdev->timeout < dev->rdev->min_timeout)
		dev->rdev->timeout = dev->rdev->min_timeout;
476 477 478 479 480 481 482
}

/* Enable the device for receive */
static void ene_rx_enable(struct ene_device *dev)
{
	u8 reg_value;

M
Maxim Levitsky 已提交
483
	/* Enable system interrupt */
484
	if (dev->hw_revision < ENE_HW_C) {
M
Maxim Levitsky 已提交
485 486
		ene_write_reg(dev, ENEB_IRQ, dev->irq << 1);
		ene_write_reg(dev, ENEB_IRQ_UNK1, 0x01);
487
	} else {
M
Maxim Levitsky 已提交
488 489 490 491 492
		reg_value = ene_read_reg(dev, ENE_IRQ) & 0xF0;
		reg_value |= ENE_IRQ_UNK_EN;
		reg_value &= ~ENE_IRQ_STATUS;
		reg_value |= (dev->irq & ENE_IRQ_MASK);
		ene_write_reg(dev, ENE_IRQ, reg_value);
493 494
	}

M
Maxim Levitsky 已提交
495
	/* Enable inputs */
496 497
	ene_rx_enable_fan_input(dev, dev->rx_fan_input_inuse);
	ene_rx_enable_cir_engine(dev, !dev->rx_fan_input_inuse);
498 499 500 501 502

	/* ack any pending irqs - just in case */
	ene_irq_status(dev);

	/* enable firmware bits */
M
Maxim Levitsky 已提交
503
	ene_set_reg_mask(dev, ENE_FW1, ENE_FW1_ENABLE | ENE_FW1_IRQ);
504 505

	/* enter idle mode */
506
	ir_raw_event_set_idle(dev->rdev, true);
M
Maxim Levitsky 已提交
507
	dev->rx_enabled = true;
508 509
}

510
/* Disable the device receiver */
511 512 513
static void ene_rx_disable(struct ene_device *dev)
{
	/* disable inputs */
514 515
	ene_rx_enable_cir_engine(dev, false);
	ene_rx_enable_fan_input(dev, false);
516 517

	/* disable hardware IRQ and firmware flag */
M
Maxim Levitsky 已提交
518
	ene_clear_reg_mask(dev, ENE_FW1, ENE_FW1_ENABLE | ENE_FW1_IRQ);
519

520
	ir_raw_event_set_idle(dev->rdev, true);
M
Maxim Levitsky 已提交
521
	dev->rx_enabled = false;
522 523
}

L
Lucas De Marchi 已提交
524
/* This resets the receiver. Useful to stop stream of spaces at end of
525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575
 * transmission
 */
static void ene_rx_reset(struct ene_device *dev)
{
	ene_clear_reg_mask(dev, ENE_CIRCFG, ENE_CIRCFG_RX_EN);
	ene_set_reg_mask(dev, ENE_CIRCFG, ENE_CIRCFG_RX_EN);
}

/* Set up the TX carrier frequency and duty cycle */
static void ene_tx_set_carrier(struct ene_device *dev)
{
	u8 tx_puls_width;
	unsigned long flags;

	spin_lock_irqsave(&dev->hw_lock, flags);

	ene_set_clear_reg_mask(dev, ENE_CIRCFG,
		ENE_CIRCFG_TX_CARR, dev->tx_period > 0);

	if (!dev->tx_period)
		goto unlock;

	BUG_ON(dev->tx_duty_cycle >= 100 || dev->tx_duty_cycle <= 0);

	tx_puls_width = dev->tx_period / (100 / dev->tx_duty_cycle);

	if (!tx_puls_width)
		tx_puls_width = 1;

	dbg("TX: pulse distance = %d * 500 ns", dev->tx_period);
	dbg("TX: pulse width = %d * 500 ns", tx_puls_width);

	ene_write_reg(dev, ENE_CIRMOD_PRD, dev->tx_period | ENE_CIRMOD_PRD_POL);
	ene_write_reg(dev, ENE_CIRMOD_HPRD, tx_puls_width);
unlock:
	spin_unlock_irqrestore(&dev->hw_lock, flags);
}

/* Enable/disable transmitters */
static void ene_tx_set_transmitters(struct ene_device *dev)
{
	unsigned long flags;

	spin_lock_irqsave(&dev->hw_lock, flags);
	ene_set_clear_reg_mask(dev, ENE_GPIOFS8, ENE_GPIOFS8_GPIO41,
					!!(dev->transmitter_mask & 0x01));
	ene_set_clear_reg_mask(dev, ENE_GPIOFS1, ENE_GPIOFS1_GPIO0D,
					!!(dev->transmitter_mask & 0x02));
	spin_unlock_irqrestore(&dev->hw_lock, flags);
}

576
/* prepare transmission */
577
static void ene_tx_enable(struct ene_device *dev)
578
{
M
Maxim Levitsky 已提交
579 580
	u8 conf1 = ene_read_reg(dev, ENE_CIRCFG);
	u8 fwreg2 = ene_read_reg(dev, ENE_FW2);
581 582 583

	dev->saved_conf1 = conf1;

M
Maxim Levitsky 已提交
584 585 586
	/* Show information about currently connected transmitter jacks */
	if (fwreg2 & ENE_FW2_EMMITER1_CONN)
		dbg("TX: Transmitter #1 is connected");
587

M
Maxim Levitsky 已提交
588 589
	if (fwreg2 & ENE_FW2_EMMITER2_CONN)
		dbg("TX: Transmitter #2 is connected");
590

M
Maxim Levitsky 已提交
591
	if (!(fwreg2 & (ENE_FW2_EMMITER1_CONN | ENE_FW2_EMMITER2_CONN)))
592
		pr_warn("TX: transmitter cable isn't connected!\n");
M
Maxim Levitsky 已提交
593 594 595 596

	/* disable receive on revc */
	if (dev->hw_revision == ENE_HW_C)
		conf1 &= ~ENE_CIRCFG_RX_EN;
597

M
Maxim Levitsky 已提交
598 599 600
	/* Enable TX engine */
	conf1 |= ENE_CIRCFG_TX_EN | ENE_CIRCFG_TX_IRQ;
	ene_write_reg(dev, ENE_CIRCFG, conf1);
601 602 603
}

/* end transmission */
604
static void ene_tx_disable(struct ene_device *dev)
605
{
M
Maxim Levitsky 已提交
606
	ene_write_reg(dev, ENE_CIRCFG, dev->saved_conf1);
607
	dev->tx_buffer = NULL;
608 609 610 611 612 613 614 615
}


/* TX one sample - must be called with dev->hw_lock*/
static void ene_tx_sample(struct ene_device *dev)
{
	u8 raw_tx;
	u32 sample;
M
Maxim Levitsky 已提交
616
	bool pulse = dev->tx_sample_pulse;
617

618
	if (!dev->tx_buffer) {
619
		pr_warn("TX: BUG: attempt to transmit NULL buffer\n");
620 621 622 623 624
		return;
	}

	/* Grab next TX sample */
	if (!dev->tx_sample) {
M
Maxim Levitsky 已提交
625 626

		if (dev->tx_pos == dev->tx_len) {
627
			if (!dev->tx_done) {
M
Maxim Levitsky 已提交
628 629
				dbg("TX: no more data to send");
				dev->tx_done = true;
630 631
				goto exit;
			} else {
M
Maxim Levitsky 已提交
632
				dbg("TX: last sample sent by hardware");
633
				ene_tx_disable(dev);
634 635 636 637 638 639 640 641
				complete(&dev->tx_complete);
				return;
			}
		}

		sample = dev->tx_buffer[dev->tx_pos++];
		dev->tx_sample_pulse = !dev->tx_sample_pulse;

M
Maxim Levitsky 已提交
642
		dev->tx_sample = DIV_ROUND_CLOSEST(sample, sample_period);
643 644

		if (!dev->tx_sample)
M
Maxim Levitsky 已提交
645
			dev->tx_sample = 1;
646 647
	}

M
Maxim Levitsky 已提交
648
	raw_tx = min(dev->tx_sample , (unsigned int)ENE_CIRRLC_OUT_MASK);
649 650
	dev->tx_sample -= raw_tx;

M
Maxim Levitsky 已提交
651 652 653 654 655 656 657
	dbg("TX: sample %8d (%s)", raw_tx * sample_period,
						pulse ? "pulse" : "space");
	if (pulse)
		raw_tx |= ENE_CIRRLC_OUT_PULSE;

	ene_write_reg(dev,
		dev->tx_reg ? ENE_CIRRLC_OUT1 : ENE_CIRRLC_OUT0, raw_tx);
658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684

	dev->tx_reg = !dev->tx_reg;
exit:
	/* simulate TX done interrupt */
	if (txsim)
		mod_timer(&dev->tx_sim_timer, jiffies + HZ / 500);
}

/* timer to simulate tx done interrupt */
static void ene_tx_irqsim(unsigned long data)
{
	struct ene_device *dev = (struct ene_device *)data;
	unsigned long flags;

	spin_lock_irqsave(&dev->hw_lock, flags);
	ene_tx_sample(dev);
	spin_unlock_irqrestore(&dev->hw_lock, flags);
}


/* read irq status and ack it */
static int ene_irq_status(struct ene_device *dev)
{
	u8 irq_status;
	u8 fw_flags1, fw_flags2;
	int retval = 0;

M
Maxim Levitsky 已提交
685
	fw_flags2 = ene_read_reg(dev, ENE_FW2);
686 687

	if (dev->hw_revision < ENE_HW_C) {
M
Maxim Levitsky 已提交
688
		irq_status = ene_read_reg(dev, ENEB_IRQ_STATUS);
689 690 691 692

		if (!(irq_status & ENEB_IRQ_STATUS_IR))
			return 0;

M
Maxim Levitsky 已提交
693
		ene_clear_reg_mask(dev, ENEB_IRQ_STATUS, ENEB_IRQ_STATUS_IR);
694 695 696
		return ENE_IRQ_RX;
	}

M
Maxim Levitsky 已提交
697 698
	irq_status = ene_read_reg(dev, ENE_IRQ);
	if (!(irq_status & ENE_IRQ_STATUS))
699 700 701
		return 0;

	/* original driver does that twice - a workaround ? */
M
Maxim Levitsky 已提交
702 703
	ene_write_reg(dev, ENE_IRQ, irq_status & ~ENE_IRQ_STATUS);
	ene_write_reg(dev, ENE_IRQ, irq_status & ~ENE_IRQ_STATUS);
704

M
Maxim Levitsky 已提交
705 706 707 708 709
	/* check RX interrupt */
	if (fw_flags2 & ENE_FW2_RXIRQ) {
		retval |= ENE_IRQ_RX;
		ene_write_reg(dev, ENE_FW2, fw_flags2 & ~ENE_FW2_RXIRQ);
	}
710

M
Maxim Levitsky 已提交
711 712
	/* check TX interrupt */
	fw_flags1 = ene_read_reg(dev, ENE_FW1);
713
	if (fw_flags1 & ENE_FW1_TXIRQ) {
M
Maxim Levitsky 已提交
714
		ene_write_reg(dev, ENE_FW1, fw_flags1 & ~ENE_FW1_TXIRQ);
715 716 717
		retval |= ENE_IRQ_TX;
	}

M
Maxim Levitsky 已提交
718 719
	return retval;
}
720 721 722 723

/* interrupt handler */
static irqreturn_t ene_isr(int irq, void *data)
{
M
Maxim Levitsky 已提交
724 725 726
	u16 hw_value, reg;
	int hw_sample, irq_status;
	bool pulse;
727 728 729
	unsigned long flags;
	irqreturn_t retval = IRQ_NONE;
	struct ene_device *dev = (struct ene_device *)data;
730
	DEFINE_IR_RAW_EVENT(ev);
731 732

	spin_lock_irqsave(&dev->hw_lock, flags);
M
Maxim Levitsky 已提交
733 734

	dbg_verbose("ISR called");
735
	ene_rx_read_hw_pointer(dev);
736 737 738 739 740 741 742 743
	irq_status = ene_irq_status(dev);

	if (!irq_status)
		goto unlock;

	retval = IRQ_HANDLED;

	if (irq_status & ENE_IRQ_TX) {
M
Maxim Levitsky 已提交
744
		dbg_verbose("TX interrupt");
745
		if (!dev->hw_learning_and_tx_capable) {
M
Maxim Levitsky 已提交
746
			dbg("TX interrupt on unsupported device!");
747 748 749 750 751 752 753 754
			goto unlock;
		}
		ene_tx_sample(dev);
	}

	if (!(irq_status & ENE_IRQ_RX))
		goto unlock;

M
Maxim Levitsky 已提交
755
	dbg_verbose("RX interrupt");
756

757
	if (dev->hw_learning_and_tx_capable)
M
Maxim Levitsky 已提交
758 759 760 761 762 763 764 765
		ene_rx_sense_carrier(dev);

	/* On hardware that don't support extra buffer we need to trust
		the interrupt and not track the read pointer */
	if (!dev->hw_extra_buffer)
		dev->r_pointer = dev->w_pointer == 0 ? ENE_FW_PACKET_SIZE : 0;

	while (1) {
766

767
		reg = ene_rx_get_sample_reg(dev);
M
Maxim Levitsky 已提交
768 769 770 771 772 773

		dbg_verbose("next sample to read at: %04x", reg);
		if (!reg)
			break;

		hw_value = ene_read_reg(dev, reg);
774 775

		if (dev->rx_fan_input_inuse) {
M
Maxim Levitsky 已提交
776 777 778

			int offset = ENE_FW_SMPL_BUF_FAN - ENE_FW_SAMPLE_BUFFER;

779
			/* read high part of the sample */
M
Maxim Levitsky 已提交
780 781
			hw_value |= ene_read_reg(dev, reg + offset) << 8;
			pulse = hw_value & ENE_FW_SMPL_BUF_FAN_PLS;
782 783

			/* clear space bit, and other unused bits */
M
Maxim Levitsky 已提交
784 785
			hw_value &= ENE_FW_SMPL_BUF_FAN_MSK;
			hw_sample = hw_value * ENE_FW_SAMPLE_PERIOD_FAN;
786 787

		} else {
M
Maxim Levitsky 已提交
788 789
			pulse = !(hw_value & ENE_FW_SAMPLE_SPACE);
			hw_value &= ~ENE_FW_SAMPLE_SPACE;
790
			hw_sample = hw_value * sample_period;
791 792

			if (dev->rx_period_adjust) {
M
Maxim Levitsky 已提交
793 794
				hw_sample *= 100;
				hw_sample /= (100 + dev->rx_period_adjust);
795
			}
796 797
		}

M
Maxim Levitsky 已提交
798 799 800 801
		if (!dev->hw_extra_buffer && !hw_sample) {
			dev->r_pointer = dev->w_pointer;
			continue;
		}
802

M
Maxim Levitsky 已提交
803
		dbg("RX: %d (%s)", hw_sample, pulse ? "pulse" : "space");
804

805
		ev.duration = US_TO_NS(hw_sample);
806
		ev.pulse = pulse;
807
		ir_raw_event_store_with_filter(dev->rdev, &ev);
808
	}
809

810
	ir_raw_event_handle(dev->rdev);
811 812 813 814 815 816
unlock:
	spin_unlock_irqrestore(&dev->hw_lock, flags);
	return retval;
}

/* Initialize default settings */
817
static void ene_setup_default_settings(struct ene_device *dev)
818 819
{
	dev->tx_period = 32;
M
Maxim Levitsky 已提交
820 821
	dev->tx_duty_cycle = 50; /*%*/
	dev->transmitter_mask = 0x03;
822
	dev->learning_mode_enabled = learning_mode_force;
823

M
Maxim Levitsky 已提交
824
	/* Set reasonable default timeout */
825
	dev->rdev->timeout = US_TO_NS(150000);
826 827
}

828 829 830 831 832 833 834 835 836 837 838
/* Upload all hardware settings at once. Used at load and resume time */
static void ene_setup_hw_settings(struct ene_device *dev)
{
	if (dev->hw_learning_and_tx_capable) {
		ene_tx_set_carrier(dev);
		ene_tx_set_transmitters(dev);
	}

	ene_rx_setup(dev);
}

839
/* outside interface: called on first open*/
840
static int ene_open(struct rc_dev *rdev)
841
{
842
	struct ene_device *dev = rdev->priv;
843 844 845 846 847 848 849 850 851
	unsigned long flags;

	spin_lock_irqsave(&dev->hw_lock, flags);
	ene_rx_enable(dev);
	spin_unlock_irqrestore(&dev->hw_lock, flags);
	return 0;
}

/* outside interface: called on device close*/
852
static void ene_close(struct rc_dev *rdev)
853
{
854
	struct ene_device *dev = rdev->priv;
855 856 857 858 859 860 861
	unsigned long flags;
	spin_lock_irqsave(&dev->hw_lock, flags);

	ene_rx_disable(dev);
	spin_unlock_irqrestore(&dev->hw_lock, flags);
}

862
/* outside interface: set transmitter mask */
863
static int ene_set_tx_mask(struct rc_dev *rdev, u32 tx_mask)
864
{
865
	struct ene_device *dev = rdev->priv;
M
Maxim Levitsky 已提交
866
	dbg("TX: attempt to set transmitter mask %02x", tx_mask);
867 868

	/* invalid txmask */
M
Maxim Levitsky 已提交
869 870
	if (!tx_mask || tx_mask & ~0x03) {
		dbg("TX: invalid mask");
871 872
		/* return count of transmitters */
		return 2;
873 874
	}

875
	dev->transmitter_mask = tx_mask;
876
	ene_tx_set_transmitters(dev);
877 878
	return 0;
}
879

880
/* outside interface : set tx carrier */
881
static int ene_set_tx_carrier(struct rc_dev *rdev, u32 carrier)
882
{
883
	struct ene_device *dev = rdev->priv;
M
Maxim Levitsky 已提交
884
	u32 period = 2000000 / carrier;
885

M
Maxim Levitsky 已提交
886
	dbg("TX: attempt to set tx carrier to %d kHz", carrier);
887

M
Maxim Levitsky 已提交
888 889
	if (period && (period > ENE_CIRMOD_PRD_MAX ||
			period < ENE_CIRMOD_PRD_MIN)) {
890

M
Maxim Levitsky 已提交
891
		dbg("TX: out of range %d-%d kHz carrier",
892
			2000 / ENE_CIRMOD_PRD_MIN, 2000 / ENE_CIRMOD_PRD_MAX);
M
Maxim Levitsky 已提交
893
		return -1;
894 895
	}

896
	dev->tx_period = period;
897
	ene_tx_set_carrier(dev);
898
	return 0;
899 900
}

M
Maxim Levitsky 已提交
901
/*outside interface : set tx duty cycle */
902
static int ene_set_tx_duty_cycle(struct rc_dev *rdev, u32 duty_cycle)
M
Maxim Levitsky 已提交
903
{
904
	struct ene_device *dev = rdev->priv;
M
Maxim Levitsky 已提交
905 906
	dbg("TX: setting duty cycle to %d%%", duty_cycle);
	dev->tx_duty_cycle = duty_cycle;
907
	ene_tx_set_carrier(dev);
M
Maxim Levitsky 已提交
908 909
	return 0;
}
910 911

/* outside interface: enable learning mode */
912
static int ene_set_learning_mode(struct rc_dev *rdev, int enable)
913
{
914
	struct ene_device *dev = rdev->priv;
915
	unsigned long flags;
916
	if (enable == dev->learning_mode_enabled)
917
		return 0;
918

919
	spin_lock_irqsave(&dev->hw_lock, flags);
920
	dev->learning_mode_enabled = enable;
M
Maxim Levitsky 已提交
921 922 923
	ene_rx_disable(dev);
	ene_rx_setup(dev);
	ene_rx_enable(dev);
924 925 926
	spin_unlock_irqrestore(&dev->hw_lock, flags);
	return 0;
}
927

928
static int ene_set_carrier_report(struct rc_dev *rdev, int enable)
929
{
930
	struct ene_device *dev = rdev->priv;
931 932 933 934 935 936 937 938 939 940 941 942 943 944
	unsigned long flags;

	if (enable == dev->carrier_detect_enabled)
		return 0;

	spin_lock_irqsave(&dev->hw_lock, flags);
	dev->carrier_detect_enabled = enable;
	ene_rx_disable(dev);
	ene_rx_setup(dev);
	ene_rx_enable(dev);
	spin_unlock_irqrestore(&dev->hw_lock, flags);
	return 0;
}

945
/* outside interface: enable or disable idle mode */
946
static void ene_set_idle(struct rc_dev *rdev, bool idle)
947
{
948 949
	struct ene_device *dev = rdev->priv;

950
	if (idle) {
951
		ene_rx_reset(dev);
952 953
		dbg("RX: end of data");
	}
M
Maxim Levitsky 已提交
954
}
955

956
/* outside interface: transmit */
957
static int ene_transmit(struct rc_dev *rdev, unsigned *buf, unsigned n)
958
{
959
	struct ene_device *dev = rdev->priv;
960 961 962
	unsigned long flags;

	dev->tx_buffer = buf;
963
	dev->tx_len = n;
964 965 966 967 968 969
	dev->tx_pos = 0;
	dev->tx_reg = 0;
	dev->tx_done = 0;
	dev->tx_sample = 0;
	dev->tx_sample_pulse = 0;

M
Maxim Levitsky 已提交
970
	dbg("TX: %d samples", dev->tx_len);
971 972 973

	spin_lock_irqsave(&dev->hw_lock, flags);

974
	ene_tx_enable(dev);
975 976 977 978 979 980 981 982

	/* Transmit first two samples */
	ene_tx_sample(dev);
	ene_tx_sample(dev);

	spin_unlock_irqrestore(&dev->hw_lock, flags);

	if (wait_for_completion_timeout(&dev->tx_complete, 2 * HZ) == 0) {
M
Maxim Levitsky 已提交
983
		dbg("TX: timeout");
984
		spin_lock_irqsave(&dev->hw_lock, flags);
985
		ene_tx_disable(dev);
986 987
		spin_unlock_irqrestore(&dev->hw_lock, flags);
	} else
M
Maxim Levitsky 已提交
988
		dbg("TX: done");
989 990 991
	return n;
}

992 993
/* probe entry */
static int ene_probe(struct pnp_dev *pnp_dev, const struct pnp_device_id *id)
994 995
{
	int error = -ENOMEM;
996
	struct rc_dev *rdev;
997
	struct ene_device *dev;
998

999
	/* allocate memory */
1000
	dev = kzalloc(sizeof(struct ene_device), GFP_KERNEL);
1001 1002
	rdev = rc_allocate_device();
	if (!dev || !rdev)
1003
		goto error1;
1004 1005

	/* validate resources */
1006 1007
	error = -ENODEV;

1008 1009 1010 1011
	/* init these to -1, as 0 is valid for both */
	dev->hw_io = -1;
	dev->irq = -1;

1012
	if (!pnp_port_valid(pnp_dev, 0) ||
M
Maxim Levitsky 已提交
1013
	    pnp_port_len(pnp_dev, 0) < ENE_IO_SIZE)
1014
		goto error;
1015 1016

	if (!pnp_irq_valid(pnp_dev, 0))
1017
		goto error;
1018 1019 1020 1021 1022

	spin_lock_init(&dev->hw_lock);

	/* claim the resources */
	error = -EBUSY;
M
Maxim Levitsky 已提交
1023 1024 1025 1026
	dev->hw_io = pnp_port_start(pnp_dev, 0);
	if (!request_region(dev->hw_io, ENE_IO_SIZE, ENE_DRIVER_NAME)) {
		dev->hw_io = -1;
		dev->irq = -1;
1027
		goto error;
M
Maxim Levitsky 已提交
1028
	}
1029

M
Maxim Levitsky 已提交
1030
	dev->irq = pnp_irq(pnp_dev, 0);
1031
	if (request_irq(dev->irq, ene_isr,
M
Maxim Levitsky 已提交
1032 1033
			IRQF_SHARED, ENE_DRIVER_NAME, (void *)dev)) {
		dev->irq = -1;
1034
		goto error;
M
Maxim Levitsky 已提交
1035
	}
1036 1037 1038

	pnp_set_drvdata(pnp_dev, dev);
	dev->pnp_dev = pnp_dev;
1039

M
Maxim Levitsky 已提交
1040 1041 1042 1043
	/* don't allow too short/long sample periods */
	if (sample_period < 5 || sample_period > 0x7F)
		sample_period = ENE_DEFAULT_SAMPLE_PERIOD;

1044 1045 1046
	/* detect hardware version and features */
	error = ene_hw_detect(dev);
	if (error)
1047
		goto error;
1048 1049

	if (!dev->hw_learning_and_tx_capable && txsim) {
M
Maxim Levitsky 已提交
1050
		dev->hw_learning_and_tx_capable = true;
1051 1052
		setup_timer(&dev->tx_sim_timer, ene_tx_irqsim,
						(long unsigned int)dev);
1053
		pr_warn("Simulation of TX activated\n");
1054 1055
	}

M
Maxim Levitsky 已提交
1056
	if (!dev->hw_learning_and_tx_capable)
1057
		learning_mode_force = false;
M
Maxim Levitsky 已提交
1058

1059
	rdev->driver_type = RC_DRIVER_IR_RAW;
1060
	rdev->allowed_protos = RC_TYPE_ALL;
1061 1062 1063 1064 1065 1066 1067
	rdev->priv = dev;
	rdev->open = ene_open;
	rdev->close = ene_close;
	rdev->s_idle = ene_set_idle;
	rdev->driver_name = ENE_DRIVER_NAME;
	rdev->map_name = RC_MAP_RC6_MCE;
	rdev->input_name = "ENE eHome Infrared Remote Receiver";
1068

1069
	if (dev->hw_learning_and_tx_capable) {
1070
		rdev->s_learning_mode = ene_set_learning_mode;
1071
		init_completion(&dev->tx_complete);
1072 1073 1074 1075 1076 1077
		rdev->tx_ir = ene_transmit;
		rdev->s_tx_mask = ene_set_tx_mask;
		rdev->s_tx_carrier = ene_set_tx_carrier;
		rdev->s_tx_duty_cycle = ene_set_tx_duty_cycle;
		rdev->s_carrier_report = ene_set_carrier_report;
		rdev->input_name = "ENE eHome Infrared Remote Transceiver";
1078 1079
	}

1080 1081
	dev->rdev = rdev;

1082 1083 1084
	ene_rx_setup_hw_buffer(dev);
	ene_setup_default_settings(dev);
	ene_setup_hw_settings(dev);
1085

M
Maxim Levitsky 已提交
1086 1087
	device_set_wakeup_capable(&pnp_dev->dev, true);
	device_set_wakeup_enable(&pnp_dev->dev, true);
1088

1089 1090
	error = rc_register_device(rdev);
	if (error < 0)
1091 1092
		goto error;

1093
	pr_notice("driver has been successfully loaded\n");
1094
	return 0;
1095
error:
M
Maxim Levitsky 已提交
1096
	if (dev && dev->irq >= 0)
1097
		free_irq(dev->irq, dev);
M
Maxim Levitsky 已提交
1098 1099
	if (dev && dev->hw_io >= 0)
		release_region(dev->hw_io, ENE_IO_SIZE);
1100
error1:
1101
	rc_free_device(rdev);
1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113
	kfree(dev);
	return error;
}

/* main unload function */
static void ene_remove(struct pnp_dev *pnp_dev)
{
	struct ene_device *dev = pnp_get_drvdata(pnp_dev);
	unsigned long flags;

	spin_lock_irqsave(&dev->hw_lock, flags);
	ene_rx_disable(dev);
1114
	ene_rx_restore_hw_buffer(dev);
1115 1116 1117
	spin_unlock_irqrestore(&dev->hw_lock, flags);

	free_irq(dev->irq, dev);
M
Maxim Levitsky 已提交
1118
	release_region(dev->hw_io, ENE_IO_SIZE);
1119
	rc_unregister_device(dev->rdev);
1120 1121 1122 1123 1124 1125 1126
	kfree(dev);
}

/* enable wake on IR (wakes on specific button on original remote) */
static void ene_enable_wake(struct ene_device *dev, int enable)
{
	enable = enable && device_may_wakeup(&dev->pnp_dev->dev);
M
Maxim Levitsky 已提交
1127 1128
	dbg("wake on IR %s", enable ? "enabled" : "disabled");
	ene_set_clear_reg_mask(dev, ENE_FW1, ENE_FW1_WAKE, enable);
1129 1130 1131 1132 1133 1134
}

#ifdef CONFIG_PM
static int ene_suspend(struct pnp_dev *pnp_dev, pm_message_t state)
{
	struct ene_device *dev = pnp_get_drvdata(pnp_dev);
M
Maxim Levitsky 已提交
1135 1136 1137
	ene_enable_wake(dev, true);

	/* TODO: add support for wake pattern */
1138 1139 1140 1141 1142 1143
	return 0;
}

static int ene_resume(struct pnp_dev *pnp_dev)
{
	struct ene_device *dev = pnp_get_drvdata(pnp_dev);
1144 1145 1146
	ene_setup_hw_settings(dev);

	if (dev->rx_enabled)
1147
		ene_rx_enable(dev);
1148

M
Maxim Levitsky 已提交
1149
	ene_enable_wake(dev, false);
1150 1151 1152 1153 1154 1155 1156
	return 0;
}
#endif

static void ene_shutdown(struct pnp_dev *pnp_dev)
{
	struct ene_device *dev = pnp_get_drvdata(pnp_dev);
M
Maxim Levitsky 已提交
1157
	ene_enable_wake(dev, true);
1158 1159 1160 1161 1162 1163
}

static const struct pnp_device_id ene_ids[] = {
	{.id = "ENE0100",},
	{.id = "ENE0200",},
	{.id = "ENE0201",},
1164
	{.id = "ENE0202",},
1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194
	{},
};

static struct pnp_driver ene_driver = {
	.name = ENE_DRIVER_NAME,
	.id_table = ene_ids,
	.flags = PNP_DRIVER_RES_DO_NOT_CHANGE,

	.probe = ene_probe,
	.remove = __devexit_p(ene_remove),
#ifdef CONFIG_PM
	.suspend = ene_suspend,
	.resume = ene_resume,
#endif
	.shutdown = ene_shutdown,
};

static int __init ene_init(void)
{
	return pnp_register_driver(&ene_driver);
}

static void ene_exit(void)
{
	pnp_unregister_driver(&ene_driver);
}

module_param(sample_period, int, S_IRUGO);
MODULE_PARM_DESC(sample_period, "Hardware sample period (50 us default)");

1195 1196
module_param(learning_mode_force, bool, S_IRUGO);
MODULE_PARM_DESC(learning_mode_force, "Enable learning mode by default");
1197 1198

module_param(debug, int, S_IRUGO | S_IWUSR);
M
Maxim Levitsky 已提交
1199
MODULE_PARM_DESC(debug, "Debug level");
1200 1201 1202 1203 1204 1205 1206

module_param(txsim, bool, S_IRUGO);
MODULE_PARM_DESC(txsim,
	"Simulate TX features on unsupported hardware (dangerous)");

MODULE_DEVICE_TABLE(pnp, ene_ids);
MODULE_DESCRIPTION
M
Maxim Levitsky 已提交
1207 1208
	("Infrared input driver for KB3926B/C/D/E/F "
	"(aka ENE0100/ENE0200/ENE0201/ENE0202) CIR port");
1209 1210 1211 1212 1213 1214

MODULE_AUTHOR("Maxim Levitsky");
MODULE_LICENSE("GPL");

module_init(ene_init);
module_exit(ene_exit);