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