2 * Provide kernel console on headphone jack
4 * Copyright (C) 2011 Michael Gernoth <michael@gernoth.net>
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
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>
18 #include <plat/board.h>
19 #include <plat/control.h>
20 #include <asm/mach/serial_omap.h>
23 #include "prm-regbits-34xx.h"
28 static int hs_switch
= -1;
33 * int add_preferred_console(char *name, int idx, char *options)
34 * c006bec0 T add_preferred_console
37 static int (*add_preferred_console
)(char *, int, char*) = (int (*)(char*, int, char*))0xc006bec0;
40 void my_omap_serial_init(int wake_gpio_strobe
, unsigned int wake_strobe_enable_mask
);
41 int my_omap_hs_init(void);
42 void activate_emu_uart(void);
44 #define MAPPHONE_BPWAKE_STROBE_GPIO 157
46 static int find_ms2_dev(struct device
*dev
, void *data
)
48 if (!strncmp((char*)data
, dev_name(dev
), strlen((char*)data
))) {
49 printk(KERN_INFO
"Found it\n");
55 #define OMAP_CTRL_REGADDR(reg) (OMAP2_L4_IO_ADDRESS(OMAP343X_CTRL_BASE) + (reg))
57 u32
omap_ctrl_readl(u16 offset
)
59 return __raw_readl(OMAP_CTRL_REGADDR(offset
));
62 static int __init
headphone_cons_init(void)
64 int bpwake_strobe_gpio
;
65 struct device
*uart3
= NULL
;
67 printk("CONTROL_STATUS: 0x%08x\n", omap_ctrl_readl(OMAP343X_CONTROL_STATUS
));
68 //<4>[81323.057830] CONTROL_STATUS: 0x00000205
70 // DEVICETYPE[10:8]: 010 -> Reserved (High Security)
71 // SYSBOOT[5:0]: 000101 -> MMC2 USB
73 /* Remove old uart3 device which was disabled... */
74 printk(KERN_INFO
"Searching for omap-uart.3...\n");
76 uart3
= device_find_child(&platform_bus
, "omap-uart.3", find_ms2_dev
);
80 printk(KERN_INFO
"Deleting old device...\n");
84 /* Get the headset switch gpio number from devtree */
85 hs_switch
= get_gpio_by_name("headset_uart_switch");
89 printk(KERN_INFO
"headset_uart_switch: %d, value: %d\n", hs_switch
, gpio_get_value(hs_switch
));
91 if (!gpio_get_value(hs_switch
))
95 printk(KERN_INFO
"Enabling UART3...\n");
96 bpwake_strobe_gpio
= get_gpio_by_name("ipc_bpwake_strobe");
97 if (bpwake_strobe_gpio
< 0)
98 bpwake_strobe_gpio
= MAPPHONE_BPWAKE_STROBE_GPIO
;
99 printk("Serial init with strobe pin %d\n", bpwake_strobe_gpio
);
100 my_omap_serial_init(bpwake_strobe_gpio
, 0x01);
104 printk(KERN_INFO
"Activating emu_uart on mini-usb port\n");
107 /* route kernel uart out headset jack */
108 gpio_set_value(hs_switch
, 0);
109 printk(KERN_INFO
"headset_uart_switch: %d, value: %d\n", hs_switch
, gpio_get_value(hs_switch
));
113 add_preferred_console("ttyS", 2, "115200");
119 static void __exit
headphone_cons_exit(void)
124 printk(KERN_INFO
"value: %d\n", gpio_get_value(hs_switch
));
125 gpio_direction_output(hs_switch
, 1);
126 printk(KERN_INFO
"value: %d\n", gpio_get_value(hs_switch
));
131 module_init(headphone_cons_init
);
133 module_exit(headphone_cons_exit
);
136 MODULE_LICENSE("GPL");
137 MODULE_AUTHOR("Michael Gernoth <michael@gernoth.net>");