]> git.zerfleddert.de Git - ms2-kexec/blob - hs_cons.c
2aecae998524c0d837bd7692f3c7c89078c2dc4e
[ms2-kexec] / hs_cons.c
1 /*
2 * Provide kernel console on headphone jack
3 *
4 * Copyright (C) 2011 Michael Gernoth <michael@gernoth.net>
5 *
6 * This file is subject to the terms and conditions of the GNU General Public
7 * License. See the file "COPYING" in the main directory of this archive
8 * for more details.
9 */
10
11 #include <linux/module.h>
12 #include <linux/gpio_mapping.h>
13 #include <linux/gpio.h>
14 #include <linux/platform_device.h>
15 #include <linux/serial_reg.h>
16 #include <linux/clk.h>
17
18 #include <plat/board.h>
19 #include <plat/control.h>
20 #include <asm/mach/serial_omap.h>
21
22 #include "prm.h"
23 #include "prm-regbits-34xx.h"
24
25 static int hs_switch = -1;
26
27 /*
28 * int add_preferred_console(char *name, int idx, char *options)
29 * c0069208 T add_preferred_console
30 */
31
32 static int (*add_preferred_console)(char *, int, char*) = (int (*)(char*, int, char*))0xc0069208;
33
34 void my_omap_serial_init(int wake_gpio_strobe, unsigned int wake_strobe_enable_mask);
35 int my_omap_hs_init(void);
36 void activate_emu_uart(void);
37
38 #define MAPPHONE_BPWAKE_STROBE_GPIO 157
39
40 static int find_ms2_dev(struct device *dev, void *data)
41 {
42 if (!strncmp((char*)data, dev_name(dev), strlen((char*)data))) {
43 printk(KERN_INFO "Found it\n");
44 return 1;
45 }
46 return 0;
47 }
48
49 static int __init headphone_cons_init(void)
50 {
51 int bpwake_strobe_gpio;
52 struct device *uart3 = NULL;
53
54 /* Remove old uart3 device which was disabled... */
55 printk(KERN_INFO "Searching for omap-uart.3...\n");
56
57 uart3 = device_find_child(&platform_bus, "omap-uart.3", find_ms2_dev);
58 if (uart3 == NULL)
59 return-ENODEV;
60
61 printk(KERN_INFO "Deleting old device...\n");
62 device_del(uart3);
63
64 /* Get the headset switch gpio number from devtree */
65 hs_switch = get_gpio_by_name("headset_uart_switch");
66 if (hs_switch < 0)
67 return -EINVAL;
68
69 printk(KERN_INFO "headset_uart_switch: %d, value: %d\n", hs_switch, gpio_get_value(hs_switch));
70
71 if (!gpio_get_value(hs_switch))
72 return -ENODEV;
73
74 printk(KERN_INFO "Activating emu_uart on mini-usb port\n");
75 activate_emu_uart();
76
77 printk(KERN_INFO "Enabling UART3...\n");
78 bpwake_strobe_gpio = get_gpio_by_name("ipc_bpwake_strobe");
79 if (bpwake_strobe_gpio < 0)
80 bpwake_strobe_gpio = MAPPHONE_BPWAKE_STROBE_GPIO;
81 printk("Serial init with strobe pin %d\n", bpwake_strobe_gpio);
82 my_omap_serial_init(bpwake_strobe_gpio, 0x01);
83 my_omap_hs_init();
84
85 /* route kernel uart out headset jack */
86 gpio_set_value(hs_switch, 0);
87 printk(KERN_INFO "headset_uart_switch: %d, value: %d\n", hs_switch, gpio_get_value(hs_switch));
88
89 add_preferred_console("ttyS", 2, "115200");
90 return 0;
91 }
92
93 #if 0
94 static void __exit headphone_cons_exit(void)
95 {
96 if (hs_switch < 0)
97 return;
98
99 printk(KERN_INFO "value: %d\n", gpio_get_value(hs_switch));
100 gpio_direction_output(hs_switch, 1);
101 printk(KERN_INFO "value: %d\n", gpio_get_value(hs_switch));
102 }
103 #endif
104
105
106 module_init(headphone_cons_init);
107 #if 0
108 module_exit(headphone_cons_exit);
109 #endif
110
111 MODULE_LICENSE("GPL");
112 MODULE_AUTHOR("Michael Gernoth <michael@gernoth.net>");
Impressum, Datenschutz