• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* SPDX-License-Identifier: GPL-2.0 */
2 
3 #include <linux/clk.h>
4 #include <linux/io.h>
5 #include <linux/irq.h>
6 #include <linux/irqdesc.h>
7 #include <linux/irqdomain.h>
8 #include <linux/module.h>
9 #include <linux/of.h>
10 #include <linux/platform_device.h>
11 #include <linux/module.h>
12 #include <linux/init.h>
13 #include <linux/interrupt.h>
14 #include <linux/platform_device.h>
15 #include <linux/input.h>
16 #include <linux/workqueue.h>
17 #include <linux/wakelock.h>
18 #include <linux/slab.h>
19 #include <linux/rockchip/rockchip_sip.h>
20 #include "rockchip_pwm_remotectl.h"
21 
22 /*
23  * sys/module/rk_pwm_remotectl/parameters,
24  * modify code_print to change the value
25  */
26 
27 static int rk_remote_print_code;
28 module_param_named(code_print, rk_remote_print_code, int, 0644);
29 #define DBG_CODE(args...)                                                                                              \
30     do {                                                                                                               \
31         if (rk_remote_print_code) {                                                                                    \
32             pr_info(args);                                                                                             \
33         }                                                                                                              \
34     } while (0)
35 
36 static int rk_remote_pwm_dbg_level;
37 module_param_named(dbg_level, rk_remote_pwm_dbg_level, int, 0644);
38 #define DBG(args...)                                                                                                   \
39     do {                                                                                                               \
40         if (rk_remote_pwm_dbg_level) {                                                                                 \
41             pr_info(args);                                                                                             \
42         }                                                                                                              \
43     } while (0)
44 
45 struct rkxx_remote_key_table {
46     int scancode;
47     int keycode;
48 };
49 
50 struct rkxx_remotectl_button {
51     int usercode;
52     int nbuttons;
53     struct rkxx_remote_key_table key_table[MAX_NUM_KEYS];
54 };
55 
56 struct rkxx_remotectl_drvdata {
57     void __iomem *base;
58     int state;
59     int nbuttons;
60     int scandata;
61     int count;
62     int keynum;
63     int maxkeybdnum;
64     int keycode;
65     int press;
66     int pre_press;
67     int irq;
68     int remote_pwm_id;
69     int handle_cpu_id;
70     int wakeup;
71     int support_psci;
72     int pwm_pwrkey_capture;
73     unsigned long period;
74     unsigned long temp_period;
75     int pwm_freq_nstime;
76     int pwrkey_wakeup;
77     struct input_dev *input;
78     struct timer_list timer;
79     struct tasklet_struct remote_tasklet;
80     struct wake_lock remotectl_wake_lock;
81 };
82 
83 static struct rkxx_remotectl_button *remotectl_button;
84 
remotectl_keybd_num_lookup(struct rkxx_remotectl_drvdata * ddata)85 static int remotectl_keybd_num_lookup(struct rkxx_remotectl_drvdata *ddata)
86 {
87     int i;
88     int num;
89 
90     num = ddata->maxkeybdnum;
91     for (i = 0; i < num; i++) {
92         if (remotectl_button[i].usercode == (ddata->scandata & 0xFFFF)) {
93             ddata->keynum = i;
94             return 1;
95         }
96     }
97     return 0;
98 }
99 
remotectl_keycode_lookup(struct rkxx_remotectl_drvdata * ddata)100 static int remotectl_keycode_lookup(struct rkxx_remotectl_drvdata *ddata)
101 {
102     int i;
103     unsigned char keydata = (unsigned char)((ddata->scandata >> 8) & 0xff);
104 
105     for (i = 0; i < remotectl_button[ddata->keynum].nbuttons; i++) {
106         if (remotectl_button[ddata->keynum].key_table[i].scancode == keydata) {
107             ddata->keycode = remotectl_button[ddata->keynum].key_table[i].keycode;
108             return 1;
109         }
110     }
111     return 0;
112 }
113 
rk_remotectl_get_irkeybd_count(struct platform_device * pdev)114 static int rk_remotectl_get_irkeybd_count(struct platform_device *pdev)
115 {
116     struct device_node *node = pdev->dev.of_node;
117     struct device_node *child_node;
118     int boardnum;
119     int temp_usercode;
120 
121     boardnum = 0;
122     for_each_child_of_node(node, child_node)
123     {
124         if (of_property_read_u32(child_node, "rockchip,usercode", &temp_usercode)) {
125             DBG("get keybd num error.\n");
126         } else {
127             boardnum++;
128         }
129     }
130     DBG("get keybd num = 0x%x.\n", boardnum);
131     return boardnum;
132 }
133 
rk_remotectl_parse_ir_keys(struct platform_device * pdev)134 static int rk_remotectl_parse_ir_keys(struct platform_device *pdev)
135 {
136     struct rkxx_remotectl_drvdata *ddata = platform_get_drvdata(pdev);
137     struct device_node *node = pdev->dev.of_node;
138     struct device_node *child_node;
139     int loop;
140     int ret;
141     int len;
142     int boardnum;
143 
144     boardnum = 0;
145     for_each_child_of_node(node, child_node)
146     {
147         if (of_property_read_u32(child_node, "rockchip,usercode", &remotectl_button[boardnum].usercode)) {
148             dev_err(&pdev->dev, "Missing usercode in the DTS.\n");
149             ret = -1;
150             return ret;
151         }
152         DBG("remotectl_button[0].usercode=0x%x\n", remotectl_button[boardnum].usercode);
153         of_get_property(child_node, "rockchip,key_table", &len);
154         len /= sizeof(u32);
155         DBG("len=0x%x\n", len);
156         remotectl_button[boardnum].nbuttons = len / 0x2;
157         if (of_property_read_u32_array(child_node, "rockchip,key_table", (u32 *)remotectl_button[boardnum].key_table,
158                                        len)) {
159             dev_err(&pdev->dev, "Missing key_table in the DTS.\n");
160             ret = -1;
161             return ret;
162         }
163         for (loop = 0; loop < (len / 0x2); loop++) {
164             DBG("board[%d].scanCode[%d]=0x%x\n", boardnum, loop, remotectl_button[boardnum].key_table[loop].scancode);
165             DBG("board[%d].keyCode[%d]=%d\n", boardnum, loop, remotectl_button[boardnum].key_table[loop].keycode);
166         }
167         boardnum++;
168         if (boardnum > ddata->maxkeybdnum) {
169             break;
170         }
171     }
172     DBG("keybdNum=0x%x\n", boardnum);
173     return 0;
174 }
175 
rk_pwm_remotectl_do_something(unsigned long data)176 static void rk_pwm_remotectl_do_something(unsigned long data)
177 {
178     struct rkxx_remotectl_drvdata *ddata;
179 
180     ddata = (struct rkxx_remotectl_drvdata *)data;
181     switch (ddata->state) {
182         case RMC_IDLE: {
183             ;
184             break;
185         }
186         case RMC_PRELOAD: {
187             mod_timer(&ddata->timer, jiffies + msecs_to_jiffies(0x8C));
188             if ((ddata->period > RK_PWM_TIME_PRE_MIN) && (ddata->period < RK_PWM_TIME_PRE_MAX)) {
189                 ddata->scandata = 0;
190                 ddata->count = 0;
191                 ddata->state = RMC_USERCODE;
192             } else {
193                 ddata->state = RMC_PRELOAD;
194             }
195             break;
196         }
197         case RMC_USERCODE: {
198             if ((ddata->period > RK_PWM_TIME_BIT1_MIN) && (ddata->period < RK_PWM_TIME_BIT1_MAX)) {
199                 ddata->scandata |= (0x01 << ddata->count);
200             }
201             ddata->count++;
202             if (ddata->count == 0x10) {
203                 DBG_CODE("USERCODE=0x%x\n", ddata->scandata);
204                 if (remotectl_keybd_num_lookup(ddata)) {
205                     ddata->state = RMC_GETDATA;
206                     ddata->scandata = 0;
207                     ddata->count = 0;
208                 } else {
209                     if (rk_remote_print_code) {
210                         ddata->state = RMC_GETDATA;
211                         ddata->scandata = 0;
212                         ddata->count = 0;
213                     } else {
214                         ddata->state = RMC_PRELOAD;
215                     }
216                 }
217             }
218             break;
219         }
220         case RMC_GETDATA: {
221             if ((ddata->period > RK_PWM_TIME_BIT1_MIN) && (ddata->period < RK_PWM_TIME_BIT1_MAX)) {
222                 ddata->scandata |= (0x01 << ddata->count);
223             }
224             ddata->count++;
225             if (ddata->count < 0x10) {
226                 return;
227             }
228             DBG_CODE("RMC_GETDATA=%x\n", (ddata->scandata >> 8));
229             if ((ddata->scandata & 0x0ff) == ((~ddata->scandata >> 0x8) & 0x0ff)) {
230                 if (remotectl_keycode_lookup(ddata)) {
231                     ddata->press = 1;
232                     input_event(ddata->input, EV_KEY, ddata->keycode, 1);
233                     input_sync(ddata->input);
234                     ddata->state = RMC_SEQUENCE;
235                 } else {
236                     ddata->state = RMC_PRELOAD;
237                 }
238             } else {
239                 ddata->state = RMC_PRELOAD;
240             }
241             break;
242         }
243         case RMC_SEQUENCE: {
244             DBG("S=%ld\n", ddata->period);
245             if ((ddata->period > RK_PWM_TIME_RPT_MIN) && (ddata->period < RK_PWM_TIME_RPT_MAX)) {
246                 DBG("S1\n");
247                 mod_timer(&ddata->timer, jiffies + msecs_to_jiffies(0x82));
248             } else if ((ddata->period > RK_PWM_TIME_SEQ1_MIN) && (ddata->period < RK_PWM_TIME_SEQ1_MAX)) {
249                 DBG("S2\n");
250                 mod_timer(&ddata->timer, jiffies + msecs_to_jiffies(0x82));
251             } else if ((ddata->period > RK_PWM_TIME_SEQ2_MIN) && (ddata->period < RK_PWM_TIME_SEQ2_MAX)) {
252                 DBG("S3\n");
253                 mod_timer(&ddata->timer, jiffies + msecs_to_jiffies(0x82));
254             } else {
255                 DBG("S4\n");
256                 input_event(ddata->input, EV_KEY, ddata->keycode, 0);
257                 input_sync(ddata->input);
258                 ddata->state = RMC_PRELOAD;
259                 ddata->press = 0;
260             }
261             break;
262         }
263         default:
264             break;
265     }
266 }
267 
rk_pwm_remotectl_timer(struct timer_list * t)268 static void rk_pwm_remotectl_timer(struct timer_list *t)
269 {
270     struct rkxx_remotectl_drvdata *ddata = from_timer(ddata, t, timer);
271 
272     if (ddata->press != ddata->pre_press) {
273         ddata->pre_press = 0;
274         ddata->press = 0;
275         input_event(ddata->input, EV_KEY, ddata->keycode, 0);
276         input_sync(ddata->input);
277     }
278     ddata->state = RMC_PRELOAD;
279 }
280 
rockchip_pwm_pwrirq(int irq,void * dev_id)281 static irqreturn_t rockchip_pwm_pwrirq(int irq, void *dev_id)
282 {
283     struct rkxx_remotectl_drvdata *ddata = dev_id;
284     int val;
285     unsigned int id = ddata->remote_pwm_id;
286 
287     if (id > 0x3) {
288         return IRQ_NONE;
289     }
290 
291     val = readl_relaxed(ddata->base + PWM_REG_INTSTS(id));
292     if (val & PWM_PWR_KEY_INT) {
293         DBG("pwr=0x%x\n", readl_relaxed(ddata->base + PWM_PWRCAPTURE_VALUE(id)));
294         writel_relaxed(PWM_PWR_KEY_INT, ddata->base + PWM_REG_INTSTS(id));
295         ddata->pwrkey_wakeup = 1;
296         return IRQ_HANDLED;
297     }
298 
299     return IRQ_NONE;
300 }
301 
rockchip_pwm_irq(int irq,void * dev_id)302 static irqreturn_t rockchip_pwm_irq(int irq, void *dev_id)
303 {
304     struct rkxx_remotectl_drvdata *ddata = dev_id;
305     int val;
306     int temp_hpr;
307     int temp_lpr;
308     int temp_period;
309     unsigned int id = ddata->remote_pwm_id;
310 
311     if (id > 0x3) {
312         return IRQ_NONE;
313     }
314     val = readl_relaxed(ddata->base + PWM_REG_INTSTS(id));
315     if ((val & PWM_CH_INT(id)) == 0) {
316         return IRQ_NONE;
317     }
318     if ((val & PWM_CH_POL(id)) == 0) {
319         temp_hpr = readl_relaxed(ddata->base + PWM_REG_HPR);
320         DBG("hpr=%d\n", temp_hpr);
321         temp_lpr = readl_relaxed(ddata->base + PWM_REG_LPR);
322         DBG("lpr=%d\n", temp_lpr);
323         temp_period = ddata->pwm_freq_nstime * temp_lpr / 0x3E8;
324         if (temp_period > RK_PWM_TIME_BIT0_MIN) {
325             ddata->period = ddata->temp_period + ddata->pwm_freq_nstime * temp_hpr / 0x3E8;
326             tasklet_hi_schedule(&ddata->remote_tasklet);
327             ddata->temp_period = 0;
328             DBG("period+ =%ld\n", ddata->period);
329         } else {
330             ddata->temp_period += ddata->pwm_freq_nstime * (temp_hpr + temp_lpr) / 0x3E8;
331         }
332     }
333     writel_relaxed(PWM_CH_INT(id), ddata->base + PWM_REG_INTSTS(id));
334     if (ddata->state == RMC_PRELOAD) {
335         wake_lock_timeout(&ddata->remotectl_wake_lock, HZ);
336     }
337     return IRQ_HANDLED;
338 }
339 
rk_pwm_pwrkey_wakeup_init(struct platform_device * pdev)340 static int rk_pwm_pwrkey_wakeup_init(struct platform_device *pdev)
341 {
342     struct rkxx_remotectl_drvdata *ddata = platform_get_drvdata(pdev);
343     int val, min_temp, max_temp;
344     unsigned int pwm_id = ddata->remote_pwm_id;
345     int version;
346     int i, j;
347     int num = 0;
348     int ret = -1;
349     int pwr_irq;
350 
351     ddata->pwm_pwrkey_capture = 0;
352     version = readl_relaxed(ddata->base + RK_PWM_VERSION_ID(pwm_id));
353     dev_info(&pdev->dev, "pwm version is 0x%x\n", version & 0xffff0000);
354     if (((version >> 0x18) & 0xFF) < 0x2) {
355         dev_info(&pdev->dev, "pwm version is less v2.0\n");
356         goto end;
357     }
358     pwr_irq = platform_get_irq(pdev, 1);
359     if (pwr_irq < 0) {
360         dev_err(&pdev->dev, "cannot find PWR IRQ\n");
361         goto end;
362     }
363     ret = devm_request_irq(&pdev->dev, pwr_irq, rockchip_pwm_pwrirq, IRQF_NO_SUSPEND, "rk_pwm_pwr_irq", ddata);
364     if (ret) {
365         dev_err(&pdev->dev, "cannot claim PWR_IRQ!!!\n");
366         goto end;
367     }
368     val = readl_relaxed(ddata->base + PWM_REG_CTRL);
369     val = (val & 0xFFFFFFFE) | PWM_DISABLE;
370     writel_relaxed(val, ddata->base + PWM_REG_CTRL);
371 
372     // preloader low min:8000us, max:10000us
373     min_temp = RK_PWM_TIME_PRE_MIN_LOW * 0x3E8 / ddata->pwm_freq_nstime;
374     max_temp = RK_PWM_TIME_PRE_MAX_LOW * 0x3E8 / ddata->pwm_freq_nstime;
375     val = ((max_temp & 0xffff) << 0x10) | (min_temp & 0xffff);
376     writel_relaxed(val, ddata->base + PWM_REG_PWRMATCH_LPRE(pwm_id));
377 
378     // preloader higt min:4000us, max:5000us
379     min_temp = RK_PWM_TIME_PRE_MIN * 0x3E8 / ddata->pwm_freq_nstime;
380     max_temp = RK_PWM_TIME_PRE_MAX * 0x3E8 / ddata->pwm_freq_nstime;
381     val = ((max_temp & 0xffff) << 0x10) | (min_temp & 0xffff);
382     writel_relaxed(val, ddata->base + PWM_REG_PWRMATCH_HPRE(pwm_id));
383 
384     // logic 0/1 low min:480us, max 700us
385     min_temp = RK_PWM_TIME_BIT_MIN_LOW * 0x3E8 / ddata->pwm_freq_nstime;
386     max_temp = RK_PWM_TIME_BIT_MAX_LOW * 0x3E8 / ddata->pwm_freq_nstime;
387     val = ((max_temp & 0xffff) << 0x10) | (min_temp & 0xffff);
388     writel_relaxed(val, ddata->base + PWM_REG_PWRMATCH_LD(pwm_id));
389 
390     // logic 0 higt min:480us, max 700us
391     min_temp = RK_PWM_TIME_BIT0_MIN * 0x3E8 / ddata->pwm_freq_nstime;
392     max_temp = RK_PWM_TIME_BIT0_MAX * 0x3E8 / ddata->pwm_freq_nstime;
393     val = ((max_temp & 0xffff) << 0x10) | (min_temp & 0xffff);
394     writel_relaxed(val, ddata->base + PWM_REG_PWRMATCH_HD_ZERO(pwm_id));
395 
396     // logic 1 higt min:1300us, max 2000us
397     min_temp = RK_PWM_TIME_BIT1_MIN * 0x3E8 / ddata->pwm_freq_nstime;
398     max_temp = RK_PWM_TIME_BIT1_MAX * 0x3E8 / ddata->pwm_freq_nstime;
399     val = ((max_temp & 0xffff) << 0x10) | (min_temp & 0xffff);
400     writel_relaxed(val, ddata->base + PWM_REG_PWRMATCH_HD_ONE(pwm_id));
401 
402     for (j = 0; j < ddata->maxkeybdnum; j++) {
403         for (i = 0; i < remotectl_button[j].nbuttons; i++) {
404             int scancode, usercode, pwrkey;
405 
406             if (remotectl_button[j].key_table[i].keycode != KEY_POWER) {
407                 continue;
408             }
409             usercode = remotectl_button[j].usercode & 0xffff;
410             scancode = remotectl_button[j].key_table[i].scancode & 0xff;
411             DBG("usercode=%x, key=%x\n", usercode, scancode);
412             pwrkey = usercode;
413             pwrkey |= (scancode << 0x18) | ((~scancode & 0xff) << 0x10);
414             DBG("pwrkey = %x\n", pwrkey);
415             writel_relaxed(pwrkey, ddata->base + PWM_PWRMATCH_VALUE(pwm_id) + num * 0x4);
416             num++;
417             if (num >= PWM_PWR_KEY_CAPURURE_MAX) {
418                 break;
419             }
420         }
421     }
422 
423     val = readl_relaxed(ddata->base + PWM_REG_INT_EN(pwm_id));
424     val = (val & 0xFFFFFF7F) | PWM_PWR_INT_ENABLE;
425     writel_relaxed(val, ddata->base + PWM_REG_INT_EN(pwm_id));
426 
427     val = CH3_PWRKEY_ENABLE;
428     writel_relaxed(val, ddata->base + PWM_REG_PWRMATCH_CTRL(pwm_id));
429 
430     val = readl_relaxed(ddata->base + PWM_REG_CTRL);
431     val = (val & 0xFFFFFFFE) | PWM_ENABLE;
432     writel_relaxed(val, ddata->base + PWM_REG_CTRL);
433     ddata->pwm_pwrkey_capture = 1;
434 end:
435     return ret;
436 }
437 
rk_pwm_int_ctrl(void __iomem * pwm_base,uint pwm_id,int ctrl)438 static void rk_pwm_int_ctrl(void __iomem *pwm_base, uint pwm_id, int ctrl)
439 {
440     int val;
441 
442     if (pwm_id > 3) {
443         return;
444     }
445     val = readl_relaxed(pwm_base + PWM_REG_INT_EN(pwm_id));
446     if (ctrl) {
447         val |= PWM_CH_INT_ENABLE(pwm_id);
448         DBG("pwm int enabled, value is 0x%x\n", val);
449         writel_relaxed(val, pwm_base + PWM_REG_INT_EN(pwm_id));
450     } else {
451         val &= ~PWM_CH_INT_ENABLE(pwm_id);
452         DBG("pwm int disabled, value is 0x%x\n", val);
453     }
454     writel_relaxed(val, pwm_base + PWM_REG_INT_EN(pwm_id));
455 }
456 
rk_pwm_remotectl_hw_init(void __iomem * pwm_base,uint pwm_id)457 static int rk_pwm_remotectl_hw_init(void __iomem *pwm_base, uint pwm_id)
458 {
459     int val;
460 
461     if (pwm_id > 3) {
462         return -1;
463     }
464     // 1. disabled pwm
465     val = readl_relaxed(pwm_base + PWM_REG_CTRL);
466     val = (val & 0xFFFFFFFE) | PWM_DISABLE;
467     writel_relaxed(val, pwm_base + PWM_REG_CTRL);
468     // 2. capture mode
469     val = readl_relaxed(pwm_base + PWM_REG_CTRL);
470     val = (val & 0xFFFFFFF9) | PWM_MODE_CAPTURE;
471     writel_relaxed(val, pwm_base + PWM_REG_CTRL);
472     // set clk div, clk div to 64
473     val = readl_relaxed(pwm_base + PWM_REG_CTRL);
474     val = (val & 0xFF0001FF) | PWM_DIV64;
475     writel_relaxed(val, pwm_base + PWM_REG_CTRL);
476     // 4. enabled pwm int
477     rk_pwm_int_ctrl(pwm_base, pwm_id, PWM_INT_ENABLE);
478     // 5. enabled pwm
479     val = readl_relaxed(pwm_base + PWM_REG_CTRL);
480     val = (val & 0xFFFFFFFE) | PWM_ENABLE;
481     writel_relaxed(val, pwm_base + PWM_REG_CTRL);
482     return 0;
483 }
484 
rk_pwm_sip_wakeup_init(struct platform_device * pdev)485 static int rk_pwm_sip_wakeup_init(struct platform_device *pdev)
486 {
487     struct rkxx_remotectl_drvdata *ddata = platform_get_drvdata(pdev);
488     struct device_node *np = pdev->dev.of_node;
489     struct irq_desc *desc;
490     int support_psci = 0;
491     int irq;
492     int hwirq;
493     int i, j;
494     int num;
495     int pwm_id;
496     int ret = -1;
497 
498     if (of_property_read_u32(np, "remote_support_psci", &support_psci)) {
499         dev_info(&pdev->dev, "PWM Missing psci property in the DT.\n");
500         goto end;
501     }
502     DBG("support_psci=0x%x\n", support_psci);
503     if (!support_psci) {
504         goto end;
505     }
506     irq = ddata->irq;
507     desc = irq_to_desc(irq);
508     if (!desc || !desc->irq_data.domain) {
509         goto end;
510     }
511     hwirq = desc->irq_data.hwirq;
512     ret = sip_smc_remotectl_config(REMOTECTL_SET_IRQ, hwirq);
513     if (ret) {
514         dev_err(&pdev->dev, "set irq err, set support_psci to 0 !!\n");
515         /*
516          * if atf doesn't support, return probe success to abandon atf
517          * function and still use kernel pwm parse function
518          */
519         goto end;
520     }
521     pwm_id = ddata->remote_pwm_id;
522     num = ddata->maxkeybdnum;
523     sip_smc_remotectl_config(REMOTECTL_SET_PWM_CH, pwm_id);
524     for (j = 0; j < num; j++) {
525         for (i = 0; i < remotectl_button[j].nbuttons; i++) {
526             int scancode, pwrkey;
527 
528             if (remotectl_button[j].key_table[i].keycode != KEY_POWER) {
529                 continue;
530             }
531             scancode = remotectl_button[j].key_table[i].scancode;
532             DBG("usercode=%x, key=%x\n", remotectl_button[j].usercode, scancode);
533             pwrkey = (remotectl_button[j].usercode & 0xffff) << 0x10;
534             pwrkey |= (scancode & 0xff) << 0x8;
535             DBG("deliver: key=%x\n", pwrkey);
536             sip_smc_remotectl_config(REMOTECTL_SET_PWRKEY, pwrkey);
537         }
538     }
539     sip_smc_remotectl_config(REMOTECTL_ENABLE, 1);
540     ddata->support_psci = support_psci;
541     DBG("rk pwm sip init end!\n");
542     return 0;
543 end:
544     dev_info(&pdev->dev, "pwm sip wakeup config error!!\n");
545     ddata->support_psci = 0;
546     return ret;
547 }
548 
rk_pwm_wakeup(struct input_dev * input)549 static inline void rk_pwm_wakeup(struct input_dev *input)
550 {
551     input_event(input, EV_KEY, KEY_POWER, 1);
552     input_event(input, EV_KEY, KEY_POWER, 0);
553     input_sync(input);
554 }
555 
rk_pwm_probe(struct platform_device * pdev)556 static int rk_pwm_probe(struct platform_device *pdev)
557 {
558     struct rkxx_remotectl_drvdata *ddata;
559     struct device_node *np = pdev->dev.of_node;
560     struct resource *r;
561     struct input_dev *input;
562     struct clk *clk;
563     struct clk *p_clk;
564     struct cpumask cpumask;
565     int num;
566     int irq;
567     int ret;
568     int i, j;
569     int cpu_id;
570     int pwm_id;
571     int pwm_freq;
572     int count;
573 
574     pr_err(".. rk pwm remotectl v2.0 init\n");
575     r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
576     if (!r) {
577         dev_err(&pdev->dev, "no memory resources defined\n");
578         return -ENODEV;
579     }
580     ddata = devm_kzalloc(&pdev->dev, sizeof(struct rkxx_remotectl_drvdata), GFP_KERNEL);
581     if (!ddata) {
582         dev_err(&pdev->dev, "failed to allocate memory\n");
583         return -ENOMEM;
584     }
585     ddata->state = RMC_PRELOAD;
586     ddata->temp_period = 0;
587     ddata->base = devm_ioremap_resource(&pdev->dev, r);
588     if (IS_ERR(ddata->base)) {
589         return PTR_ERR(ddata->base);
590     }
591     count = of_property_count_strings(np, "clock-names");
592     if (count == 0x2) {
593         clk = devm_clk_get(&pdev->dev, "pwm");
594         p_clk = devm_clk_get(&pdev->dev, "pclk");
595     } else {
596         clk = devm_clk_get(&pdev->dev, NULL);
597         p_clk = clk;
598     }
599     if (IS_ERR(clk)) {
600         ret = PTR_ERR(clk);
601         if (ret != -EPROBE_DEFER) {
602             dev_err(&pdev->dev, "Can't get bus clk: %d\n", ret);
603         }
604         return ret;
605     }
606     if (IS_ERR(p_clk)) {
607         ret = PTR_ERR(p_clk);
608         if (ret != -EPROBE_DEFER) {
609             dev_err(&pdev->dev, "Can't get periph clk: %d\n", ret);
610         }
611         return ret;
612     }
613     ret = clk_prepare_enable(clk);
614     if (ret) {
615         dev_err(&pdev->dev, "Can't enable bus clk: %d\n", ret);
616         return ret;
617     }
618     ret = clk_prepare_enable(p_clk);
619     if (ret) {
620         dev_err(&pdev->dev, "Can't enable bus periph clk: %d\n", ret);
621         goto error_clk;
622     }
623     platform_set_drvdata(pdev, ddata);
624     num = rk_remotectl_get_irkeybd_count(pdev);
625     if (num == 0) {
626         pr_err("remotectl: no ir keyboard add in dts!!\n");
627         ret = -EINVAL;
628         goto error_pclk;
629     }
630     ddata->maxkeybdnum = num;
631     remotectl_button = devm_kzalloc(&pdev->dev, num * sizeof(struct rkxx_remotectl_button), GFP_KERNEL);
632     if (!remotectl_button) {
633         pr_err("failed to malloc remote button memory\n");
634         ret = -ENOMEM;
635         goto error_pclk;
636     }
637     input = devm_input_allocate_device(&pdev->dev);
638     if (!input) {
639         pr_err("failed to allocate input device\n");
640         ret = -ENOMEM;
641         goto error_pclk;
642     }
643     input->name = pdev->name;
644     input->phys = "gpio-keys/remotectl";
645     input->dev.parent = &pdev->dev;
646     input->id.bustype = BUS_HOST;
647     input->id.vendor = 0x524b;
648     input->id.product = 0x0006;
649     input->id.version = 0x0100;
650     ddata->input = input;
651     irq = platform_get_irq(pdev, 0);
652     if (irq < 0) {
653         dev_err(&pdev->dev, "cannot find IRQ\n");
654         goto error_pclk;
655     }
656     ddata->irq = irq;
657     ddata->wakeup = 1;
658     of_property_read_u32(np, "remote_pwm_id", &pwm_id);
659     pwm_id %= 0x4;
660     ddata->remote_pwm_id = pwm_id;
661     if (pwm_id > 0x3) {
662         dev_err(&pdev->dev, "pwm id error\n");
663         goto error_pclk;
664     }
665     DBG("remotectl: remote pwm id=0x%x\n", pwm_id);
666     of_property_read_u32(np, "handle_cpu_id", &cpu_id);
667     ddata->handle_cpu_id = cpu_id;
668     DBG("remotectl: handle cpu id=0x%x\n", cpu_id);
669     rk_remotectl_parse_ir_keys(pdev);
670     tasklet_init(&ddata->remote_tasklet, rk_pwm_remotectl_do_something, (unsigned long)ddata);
671     for (j = 0; j < num; j++) {
672         DBG("remotectl probe j = 0x%x\n", j);
673         for (i = 0; i < remotectl_button[j].nbuttons; i++) {
674             int keycode;
675 
676             keycode = remotectl_button[j].key_table[i].keycode;
677             input_set_capability(input, EV_KEY, keycode);
678         }
679     }
680     ret = input_register_device(input);
681     if (ret) {
682         dev_err(&pdev->dev, "register input device err, ret=%d\n", ret);
683     }
684     input_set_capability(input, EV_KEY, KEY_WAKEUP);
685     device_init_wakeup(&pdev->dev, 1);
686     enable_irq_wake(irq);
687     timer_setup(&ddata->timer, rk_pwm_remotectl_timer, 0);
688     wake_lock_init(&ddata->remotectl_wake_lock, WAKE_LOCK_SUSPEND, "rockchip_pwm_remote");
689     cpumask_clear(&cpumask);
690     cpumask_set_cpu(cpu_id, &cpumask);
691     irq_set_affinity_hint(irq, &cpumask);
692     ret = devm_request_irq(&pdev->dev, irq, rockchip_pwm_irq, IRQF_NO_SUSPEND, "rk_pwm_irq", ddata);
693     if (ret) {
694         dev_err(&pdev->dev, "cannot claim IRQ %d\n", irq);
695         goto error_irq;
696     }
697 
698     pwm_freq = clk_get_rate(clk) / 0x40;
699     ddata->pwm_freq_nstime = 0x3B9ACA00 / pwm_freq;
700     rk_pwm_remotectl_hw_init(ddata->base, pwm_id);
701 
702     ret = rk_pwm_pwrkey_wakeup_init(pdev);
703     if (!ret) {
704         dev_info(&pdev->dev, "Controller support pwrkey capture\n");
705         goto end;
706     }
707 
708     ret = rk_pwm_sip_wakeup_init(pdev);
709     if (ret) {
710         dev_info(&pdev->dev, "Donot support ATF Wakeup\n");
711     } else {
712         dev_info(&pdev->dev, "Support ATF Wakeup\n");
713     }
714 
715     DBG("rk pwm remotectl init end!\n");
716 end:
717     return 0;
718 error_irq:
719     wake_lock_destroy(&ddata->remotectl_wake_lock);
720 error_pclk:
721     clk_unprepare(p_clk);
722 error_clk:
723     clk_unprepare(clk);
724     return ret;
725 }
726 
rk_pwm_remove(struct platform_device * pdev)727 static int rk_pwm_remove(struct platform_device *pdev)
728 {
729     return 0;
730 }
731 
732 #ifdef CONFIG_PM
remotectl_suspend(struct device * dev)733 static int remotectl_suspend(struct device *dev)
734 {
735     int cpu = 0;
736     int pwm_id;
737     struct cpumask cpumask;
738     struct platform_device *pdev = to_platform_device(dev);
739     struct rkxx_remotectl_drvdata *ddata = platform_get_drvdata(pdev);
740 
741     if (ddata->pwm_pwrkey_capture) {
742         pwm_id = ddata->remote_pwm_id;
743         ddata->pwrkey_wakeup = 0;
744         rk_pwm_int_ctrl(ddata->base, pwm_id, PWM_INT_DISABLE);
745     }
746     cpumask_clear(&cpumask);
747     cpumask_set_cpu(cpu, &cpumask);
748     irq_set_affinity_hint(ddata->irq, &cpumask);
749     return 0;
750 }
751 
remotectl_resume(struct device * dev)752 static int remotectl_resume(struct device *dev)
753 {
754     struct cpumask cpumask;
755     int pwm_id;
756     struct platform_device *pdev = to_platform_device(dev);
757     struct rkxx_remotectl_drvdata *ddata = platform_get_drvdata(pdev);
758     int state;
759 
760     cpumask_clear(&cpumask);
761     cpumask_set_cpu(ddata->handle_cpu_id, &cpumask);
762     irq_set_affinity_hint(ddata->irq, &cpumask);
763     if (ddata->support_psci) {
764         /*
765          * loop wakeup state
766          */
767         state = sip_smc_remotectl_config(REMOTECTL_GET_WAKEUP_STATE, 0);
768         if (state == REMOTECTL_PWRKEY_WAKEUP) {
769             rk_pwm_wakeup(ddata->input);
770         }
771     } else if (ddata->pwm_pwrkey_capture) {
772         pwm_id = ddata->remote_pwm_id;
773         rk_pwm_int_ctrl(ddata->base, pwm_id, PWM_INT_ENABLE);
774         if (ddata->pwrkey_wakeup == 0) {
775             return 0;
776         }
777         ddata->pwrkey_wakeup = 0;
778         rk_pwm_wakeup(ddata->input);
779     }
780 
781     return 0;
782 }
783 
784 static const struct dev_pm_ops remotectl_pm_ops = {
785     .suspend_late = remotectl_suspend,
786     .resume_early = remotectl_resume,
787 };
788 #endif
789 
790 static const struct of_device_id rk_pwm_of_match[] = {{.compatible = "rockchip,remotectl-pwm"}, {}};
791 
792 MODULE_DEVICE_TABLE(of, rk_pwm_of_match);
793 
794 static struct platform_driver rk_pwm_driver = {
795     .driver =
796         {
797             .name = "remotectl-pwm",
798             .of_match_table = rk_pwm_of_match,
799 #ifdef CONFIG_PM
800             .pm = &remotectl_pm_ops,
801 #endif
802         },
803     .remove = rk_pwm_remove,
804 };
805 
806 module_platform_driver_probe(rk_pwm_driver, rk_pwm_probe);
807 
808 MODULE_LICENSE("GPL");
809