3 #include <linux/module.h>
5 #include <linux/platform_device.h>
6 #include <linux/module.h>
7 #include <linux/init.h>
8 #include <linux/interrupt.h>
9 #include <linux/platform_device.h>
10 #include <linux/input.h>
11 #include <linux/workqueue.h>
12 #include <linux/wakelock.h>
13 #include <linux/slab.h>
14 #include "rockchip_pwm_remotectl.h"
15 #include <linux/leds.h>
18 /*sys/module/rk_pwm_remotectl/parameters,
19 modify code_print to change the value*/
21 static int rk_remote_print_code;
22 static bool remote_suspend = false;
23 module_param_named(code_print, rk_remote_print_code, int, 0644);
24 #define DBG_CODE(args...) \
26 if (rk_remote_print_code) { \
31 static int rk_remote_pwm_dbg_level;
32 module_param_named(dbg_level, rk_remote_pwm_dbg_level, int, 0644);
33 #define DBG(args...) \
35 if (rk_remote_pwm_dbg_level) { \
40 #define BLINK_DELAY 50
41 DEFINE_LED_TRIGGER(ledtrig_ir_click);
42 static unsigned long ir_blink_delay = BLINK_DELAY;
44 bool get_state_remotectl(void)
46 return remote_suspend;
49 void ledtrig_ir_activity(void)
51 led_trigger_blink_oneshot(ledtrig_ir_click, &ir_blink_delay, &ir_blink_delay,1);
53 struct rkxx_remote_key_table {
58 struct rkxx_remotectl_button {
61 struct rkxx_remote_key_table key_table[MAX_NUM_KEYS];
64 struct rkxx_remotectl_drvdata {
82 unsigned long temp_period;
84 struct input_dev *input;
85 struct timer_list timer;
86 struct tasklet_struct remote_tasklet;
87 struct wake_lock remotectl_wake_lock;
90 static struct rkxx_remotectl_button *remotectl_button;
92 static int remotectl_keybd_num_lookup(struct rkxx_remotectl_drvdata *ddata)
97 num = ddata->maxkeybdnum;
98 for (i = 0; i < num; i++) {
99 if (remotectl_button[i].usercode == (ddata->scandata&0xFFFF)) {
108 static int remotectl_keycode_lookup(struct rkxx_remotectl_drvdata *ddata)
111 unsigned char keydata = (unsigned char)((ddata->scandata >> 8) & 0xff);
113 for (i = 0; i < remotectl_button[ddata->keynum].nbuttons; i++) {
114 if (remotectl_button[ddata->keynum].key_table[i].scancode ==
117 remotectl_button[ddata->keynum].key_table[i].keycode;
124 static int rk_remotectl_get_irkeybd_count(struct platform_device *pdev)
126 struct device_node *node = pdev->dev.of_node;
127 struct device_node *child_node;
132 for_each_child_of_node(node, child_node) {
133 if(of_property_read_u32(child_node, "rockchip,usercode",
135 DBG("get keybd num error.\n");
140 DBG("get keybd num = 0x%x.\n", boardnum);
145 static int rk_remotectl_parse_ir_keys(struct platform_device *pdev)
147 struct rkxx_remotectl_drvdata *ddata = platform_get_drvdata(pdev);
148 struct device_node *node = pdev->dev.of_node;
149 struct device_node *child_node;
156 for_each_child_of_node(node, child_node) {
157 if(of_property_read_u32(child_node, "rockchip,usercode",
158 &remotectl_button[boardnum].usercode)) {
159 dev_err(&pdev->dev, "Missing usercode property in the DTS.\n");
163 DBG("remotectl_button[0].usercode=0x%x\n",
164 remotectl_button[boardnum].usercode);
165 of_get_property(child_node, "rockchip,key_table", &len);
167 DBG("len=0x%x\n",len);
168 remotectl_button[boardnum].nbuttons = len/2;
169 if(of_property_read_u32_array(child_node, "rockchip,key_table",
170 (u32 *)remotectl_button[boardnum].key_table, len)) {
171 dev_err(&pdev->dev, "Missing key_table property in the DTS.\n");
175 for (loop=0; loop<(len/2); loop++) {
176 DBG("board[%d].scanCode[%d]=0x%x\n", boardnum, loop,
177 remotectl_button[boardnum].key_table[loop].scancode);
178 DBG("board[%d].keyCode[%d]=%d\n", boardnum, loop,
179 remotectl_button[boardnum].key_table[loop].keycode);
182 if (boardnum > ddata->maxkeybdnum)
185 DBG("keybdNum=0x%x\n",boardnum);
191 static void rk_pwm_remotectl_do_something(unsigned long data)
193 struct rkxx_remotectl_drvdata *ddata;
195 ddata = (struct rkxx_remotectl_drvdata *)data;
196 switch (ddata->state) {
202 mod_timer(&ddata->timer, jiffies + msecs_to_jiffies(140));
203 if ((RK_PWM_TIME_PRE_MIN < ddata->period) &&
204 (ddata->period < RK_PWM_TIME_PRE_MAX)) {
207 ddata->state = RMC_USERCODE;
209 ddata->state = RMC_PRELOAD;
214 if ((RK_PWM_TIME_BIT1_MIN < ddata->period) &&
215 (ddata->period < RK_PWM_TIME_BIT1_MAX))
216 ddata->scandata |= (0x01 << ddata->count);
218 if (ddata->count == 0x10) {
219 DBG_CODE("USERCODE=0x%x\n", ddata->scandata);
220 if (remotectl_keybd_num_lookup(ddata)) {
221 ddata->state = RMC_GETDATA;
225 if (rk_remote_print_code){
226 ddata->state = RMC_GETDATA;
230 ddata->state = RMC_PRELOAD;
236 if(!get_state_remotectl() && (ddata->keycode != KEY_POWER))
238 ledtrig_ir_activity();
240 if(ddata->keycode != KEY_POWER)
241 led_trigger_blink_oneshot(ledtrig_ir_click, &ir_blink_delay, &ir_blink_delay,1);
243 if ((RK_PWM_TIME_BIT1_MIN < ddata->period) &&
244 (ddata->period < RK_PWM_TIME_BIT1_MAX))
245 ddata->scandata |= (0x01<<ddata->count);
247 if (ddata->count < 0x10)
249 DBG_CODE("RMC_GETDATA=%x\n", (ddata->scandata>>8));
250 if ((ddata->scandata&0x0ff) ==
251 ((~ddata->scandata >> 8) & 0x0ff)) {
252 if (remotectl_keycode_lookup(ddata)) {
254 if(ddata->keycode== KEY_POWER && !get_state_remotectl()){
255 led_trigger_event(ledtrig_ir_click,LED_OFF);
257 input_event(ddata->input, EV_KEY,
259 input_sync(ddata->input);
260 ddata->state = RMC_SEQUENCE;
262 ddata->state = RMC_PRELOAD;
265 ddata->state = RMC_PRELOAD;
270 DBG("S=%ld\n", ddata->period);
271 if ((RK_PWM_TIME_RPT_MIN < ddata->period) &&
272 (ddata->period < RK_PWM_TIME_RPT_MAX)) {
274 mod_timer(&ddata->timer, jiffies
275 + msecs_to_jiffies(130));
276 } else if ((RK_PWM_TIME_SEQ1_MIN < ddata->period) &&
277 (ddata->period < RK_PWM_TIME_SEQ1_MAX)) {
279 mod_timer(&ddata->timer, jiffies
280 + msecs_to_jiffies(130));
281 } else if ((RK_PWM_TIME_SEQ2_MIN < ddata->period) &&
282 (ddata->period < RK_PWM_TIME_SEQ2_MAX)) {
284 mod_timer(&ddata->timer, jiffies
285 + msecs_to_jiffies(130));
288 input_event(ddata->input, EV_KEY,
290 input_sync(ddata->input);
291 ddata->state = RMC_PRELOAD;
301 static void rk_pwm_remotectl_timer(unsigned long _data)
303 struct rkxx_remotectl_drvdata *ddata;
305 ddata = (struct rkxx_remotectl_drvdata *)_data;
306 if (ddata->press != ddata->pre_press) {
307 ddata->pre_press = 0;
309 input_event(ddata->input, EV_KEY, ddata->keycode, 0);
310 input_sync(ddata->input);
312 ddata->state = RMC_PRELOAD;
316 static irqreturn_t rockchip_pwm_irq(int irq, void *dev_id)
318 struct rkxx_remotectl_drvdata *ddata = dev_id;
323 unsigned int id = ddata->remote_pwm_id;
327 val = readl_relaxed(ddata->base + PWM_REG_INTSTS(id));
328 if ((val & PWM_CH_INT(id)) == 0)
330 if ((val & PWM_CH_POL(id)) == 0) {
331 temp_hpr = readl_relaxed(ddata->base + PWM_REG_HPR);
332 DBG("hpr=%d\n", temp_hpr);
333 temp_lpr = readl_relaxed(ddata->base + PWM_REG_LPR);
334 DBG("lpr=%d\n", temp_lpr);
335 temp_period = ddata->pwm_freq_nstime * temp_lpr / 1000;
336 if (temp_period > RK_PWM_TIME_BIT0_MIN) {
337 ddata->period = ddata->temp_period
338 + ddata->pwm_freq_nstime * temp_hpr / 1000;
339 tasklet_hi_schedule(&ddata->remote_tasklet);
340 ddata->temp_period = 0;
341 DBG("period+ =%ld\n", ddata->period);
343 ddata->temp_period += ddata->pwm_freq_nstime
344 * (temp_hpr + temp_lpr) / 1000;
347 writel_relaxed(PWM_CH_INT(id), ddata->base + PWM_REG_INTSTS(id));
348 #if ! defined(CONFIG_RK_IR_NO_DEEP_SLEEP)
349 if (ddata->state == RMC_PRELOAD)
350 wake_lock_timeout(&ddata->remotectl_wake_lock, HZ);
357 static int rk_pwm_remotectl_hw_init(struct rkxx_remotectl_drvdata *ddata)
361 val = readl_relaxed(ddata->base + PWM_REG_CTRL);
362 val = (val & 0xFFFFFFFE) | PWM_DISABLE;
363 writel_relaxed(val, ddata->base + PWM_REG_CTRL);
364 val = readl_relaxed(ddata->base + PWM_REG_CTRL);
365 val = (val & 0xFFFFFFF9) | PWM_MODE_CAPTURE;
366 writel_relaxed(val, ddata->base + PWM_REG_CTRL);
367 val = readl_relaxed(ddata->base + PWM_REG_CTRL);
368 val = (val & 0xFF008DFF) | 0x0006000;
369 writel_relaxed(val, ddata->base + PWM_REG_CTRL);
370 switch (ddata->remote_pwm_id) {
372 val = readl_relaxed(ddata->base + PWM0_REG_INT_EN);
373 val = (val & 0xFFFFFFFE) | PWM_CH0_INT_ENABLE;
374 writel_relaxed(val, ddata->base + PWM0_REG_INT_EN);
378 val = readl_relaxed(ddata->base + PWM1_REG_INT_EN);
379 val = (val & 0xFFFFFFFD) | PWM_CH1_INT_ENABLE;
380 writel_relaxed(val, ddata->base + PWM1_REG_INT_EN);
384 val = readl_relaxed(ddata->base + PWM2_REG_INT_EN);
385 val = (val & 0xFFFFFFFB) | PWM_CH2_INT_ENABLE;
386 writel_relaxed(val, ddata->base + PWM2_REG_INT_EN);
390 val = readl_relaxed(ddata->base + PWM3_REG_INT_EN);
391 val = (val & 0xFFFFFFF7) | PWM_CH3_INT_ENABLE;
392 writel_relaxed(val, ddata->base + PWM3_REG_INT_EN);
398 val = readl_relaxed(ddata->base + PWM_REG_CTRL);
399 val = (val & 0xFFFFFFFE) | PWM_ENABLE;
400 writel_relaxed(val, ddata->base + PWM_REG_CTRL);
404 static int remotectl_fb_event_notify(struct notifier_block *self, unsigned long action, void *data)
406 struct fb_event *event = data;
408 if (action == FB_EARLY_EVENT_BLANK) {
409 switch (*((int *)event->data)) {
410 case FB_BLANK_UNBLANK:
413 led_trigger_event(ledtrig_ir_click,LED_OFF);
414 remote_suspend = true;
418 else if (action == FB_EVENT_BLANK) {
419 switch (*((int *)event->data)) {
420 case FB_BLANK_UNBLANK:
421 remote_suspend = false;
422 led_trigger_event(ledtrig_ir_click,LED_FULL);
430 static struct notifier_block remotectl_fb_notifier = {
431 .notifier_call = remotectl_fb_event_notify,
434 static int rk_pwm_probe(struct platform_device *pdev)
436 struct rkxx_remotectl_drvdata *ddata;
437 struct device_node *np = pdev->dev.of_node;
439 struct input_dev *input;
441 struct cpumask cpumask;
450 pr_err(".. rk pwm remotectl v1.1 init\n");
451 r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
453 dev_err(&pdev->dev, "no memory resources defined\n");
456 ddata = devm_kzalloc(&pdev->dev, sizeof(struct rkxx_remotectl_drvdata),
459 dev_err(&pdev->dev, "failed to allocate memory\n");
462 ddata->state = RMC_PRELOAD;
463 ddata->temp_period = 0;
464 ddata->base = devm_ioremap_resource(&pdev->dev, r);
465 if (IS_ERR(ddata->base))
466 return PTR_ERR(ddata->base);
467 clk = devm_clk_get(&pdev->dev, NULL);
470 platform_set_drvdata(pdev, ddata);
471 num = rk_remotectl_get_irkeybd_count(pdev);
473 pr_err("remotectl: no ir keyboard add in dts!!\n");
476 ddata->maxkeybdnum = num;
477 remotectl_button = kmalloc(
478 num*sizeof(struct rkxx_remotectl_button),
480 if (!remotectl_button) {
481 pr_err("failed to malloc remote button memory\n");
484 input = input_allocate_device();
485 input->name = pdev->name;
486 input->phys = "gpio-keys/remotectl";
487 input->dev.parent = &pdev->dev;
488 input->id.bustype = BUS_HOST;
489 input->id.vendor = 0x0001;
490 input->id.product = 0x0001;
491 input->id.version = 0x0100;
492 ddata->input = input;
493 ddata->input = input;
494 fb_register_client(&remotectl_fb_notifier);
495 wake_lock_init(&ddata->remotectl_wake_lock,
496 WAKE_LOCK_SUSPEND, "rk29_pwm_remote");
497 #if defined(CONFIG_RK_IR_NO_DEEP_SLEEP)
498 wake_lock(&ddata->remotectl_wake_lock);
500 ret = clk_prepare_enable(clk);
503 irq = platform_get_irq(pdev, 0);
505 dev_err(&pdev->dev, "cannot find IRQ\n");
510 of_property_read_u32(np, "remote_pwm_id", &pwm_id);
511 ddata->remote_pwm_id = pwm_id;
512 DBG("remotectl: remote pwm id=0x%x\n", pwm_id);
513 of_property_read_u32(np, "handle_cpu_id", &cpu_id);
514 ddata->handle_cpu_id = cpu_id;
515 DBG("remotectl: handle cpu id=0x%x\n", cpu_id);
516 rk_remotectl_parse_ir_keys(pdev);
517 tasklet_init(&ddata->remote_tasklet, rk_pwm_remotectl_do_something,
518 (unsigned long)ddata);
519 for (j = 0; j < num; j++) {
520 DBG("remotectl probe j = 0x%x\n", j);
521 for (i = 0; i < remotectl_button[j].nbuttons; i++) {
522 unsigned int type = EV_KEY;
524 input_set_capability(input, type, remotectl_button[j].
525 key_table[i].keycode);
528 ret = input_register_device(input);
530 pr_err("remotectl: register input device err, ret: %d\n", ret);
531 input_set_capability(input, EV_KEY, KEY_WAKEUP);
532 device_init_wakeup(&pdev->dev, 1);
533 enable_irq_wake(irq);
534 setup_timer(&ddata->timer, rk_pwm_remotectl_timer,
535 (unsigned long)ddata);
536 //mod_timer(&ddata->timer, jiffies + msecs_to_jiffies(1000));
537 cpumask_clear(&cpumask);
538 cpumask_set_cpu(cpu_id, &cpumask);
539 irq_set_affinity(irq, &cpumask);
540 ret = devm_request_irq(&pdev->dev, irq, rockchip_pwm_irq,
541 IRQF_NO_SUSPEND, "rk_pwm_irq", ddata);
543 dev_err(&pdev->dev, "cannot claim IRQ %d\n", irq);
546 rk_pwm_remotectl_hw_init(ddata);
547 pwm_freq = clk_get_rate(clk) / 64;
548 ddata->pwm_freq_nstime = 1000000000 / pwm_freq;
549 led_trigger_register_simple("ir-power-click", &ledtrig_ir_click);
554 static int rk_pwm_remove(struct platform_device *pdev)
556 #if defined(CONFIG_RK_IR_NO_DEEP_SLEEP)
557 struct rkxx_remotectl_drvdata *ddata = platform_get_drvdata(pdev);
559 led_trigger_unregister_simple(ledtrig_ir_click);
560 #if defined(CONFIG_RK_IR_NO_DEEP_SLEEP)
561 wake_unlock(&ddata->remotectl_wake_lock);
567 static int remotectl_suspend(struct device *dev)
570 struct cpumask cpumask;
571 struct platform_device *pdev = to_platform_device(dev);
572 struct rkxx_remotectl_drvdata *ddata = platform_get_drvdata(pdev);
574 cpumask_clear(&cpumask);
575 cpumask_set_cpu(cpu, &cpumask);
576 irq_set_affinity(ddata->irq, &cpumask);
581 static int remotectl_resume(struct device *dev)
583 struct cpumask cpumask;
584 struct platform_device *pdev = to_platform_device(dev);
585 struct rkxx_remotectl_drvdata *ddata = platform_get_drvdata(pdev);
587 led_trigger_event(ledtrig_ir_click,LED_FULL);
588 cpumask_clear(&cpumask);
589 cpumask_set_cpu(ddata->handle_cpu_id, &cpumask);
590 irq_set_affinity(ddata->irq, &cpumask);
594 static const struct dev_pm_ops remotectl_pm_ops = {
595 .suspend_late = remotectl_suspend,
596 .resume_early = remotectl_resume,
600 static const struct of_device_id rk_pwm_of_match[] = {
601 { .compatible = "rockchip,remotectl-pwm"},
605 MODULE_DEVICE_TABLE(of, rk_pwm_of_match);
607 static struct platform_driver rk_pwm_driver = {
609 .name = "remotectl-pwm",
610 .of_match_table = rk_pwm_of_match,
612 .pm = &remotectl_pm_ops,
615 .probe = rk_pwm_probe,
616 .remove = rk_pwm_remove,
619 module_platform_driver(rk_pwm_driver);
621 MODULE_LICENSE("GPL");