aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-exynos/sec-switch.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/mach-exynos/sec-switch.c')
-rw-r--r--arch/arm/mach-exynos/sec-switch.c206
1 files changed, 164 insertions, 42 deletions
diff --git a/arch/arm/mach-exynos/sec-switch.c b/arch/arm/mach-exynos/sec-switch.c
index 7b8726c..787a424 100644
--- a/arch/arm/mach-exynos/sec-switch.c
+++ b/arch/arm/mach-exynos/sec-switch.c
@@ -25,7 +25,9 @@
#include <linux/power_supply.h>
#include <linux/battery/samsung_battery.h>
+#ifdef CONFIG_SWITCH
#include <linux/switch.h>
+#endif
#include <linux/sii9234.h>
#ifdef CONFIG_USB_HOST_NOTIFY
@@ -46,9 +48,11 @@
#include <linux/platform_data/mms_ts.h>
#endif
+#ifdef CONFIG_SWITCH
static struct switch_dev switch_dock = {
.name = "dock",
};
+#endif
extern struct class *sec_class;
@@ -127,27 +131,98 @@ static ssize_t midas_switch_store_vbus(struct device *dev,
DEVICE_ATTR(disable_vbus, 0664, midas_switch_show_vbus,
midas_switch_store_vbus);
+#ifdef CONFIG_TARGET_LOCALE_KOR
+#include "../../../drivers/usb/gadget/s3c_udc.h"
+/* usb access control for SEC DM */
+struct device *usb_lock;
+static int is_usb_locked;
+
+static ssize_t midas_switch_show_usb_lock(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ if (is_usb_locked)
+ return snprintf(buf, PAGE_SIZE, "USB_LOCK");
+ else
+ return snprintf(buf, PAGE_SIZE, "USB_UNLOCK");
+}
+
+static ssize_t midas_switch_store_usb_lock(struct device *dev,
+ struct device_attribute *attr,
+ const char *buf, size_t count)
+{
+ int lock;
+ struct s3c_udc *udc = platform_get_drvdata(&s3c_device_usbgadget);
+
+ if (!strncmp(buf, "0", 1))
+ lock = 0;
+ else if (!strncmp(buf, "1", 1))
+ lock = 1;
+ else {
+ pr_warn("%s: Wrong command\n", __func__);
+ return count;
+ }
+
+ if (IS_ERR_OR_NULL(udc))
+ return count;
+
+ pr_info("%s: lock=%d\n", __func__, lock);
+
+ if (lock != is_usb_locked) {
+ is_usb_locked = lock;
+
+ if (lock) {
+ if (udc->udc_enabled)
+ usb_gadget_vbus_disconnect(&udc->gadget);
+ }
+ }
+
+ return count;
+}
+
+static DEVICE_ATTR(enable, 0664,
+ midas_switch_show_usb_lock, midas_switch_store_usb_lock);
+#endif
+
static int __init midas_sec_switch_init(void)
{
- int ret;
+ int ret = 0;
switch_dev = device_create(sec_class, NULL, 0, NULL, "switch");
- if (IS_ERR(switch_dev))
- pr_err("Failed to create device(switch)!\n");
+ if (IS_ERR(switch_dev)) {
+ pr_err("%s:%s= Failed to create device(switch)!\n",
+ __FILE__, __func__);
+ return -ENODEV;
+ }
ret = device_create_file(switch_dev, &dev_attr_disable_vbus);
- if (ret)
- pr_err("Failed to create device file(disable_vbus)!\n");
+ if (ret) {
+ pr_err("%s:%s= Failed to create device file(disable_vbus)!\n",
+ __FILE__, __func__);
+ return ret;
+ }
- return 0;
+#ifdef CONFIG_TARGET_LOCALE_KOR
+ usb_lock = device_create(sec_class, switch_dev,
+ MKDEV(0, 0), NULL, ".usb_lock");
+
+ if (IS_ERR(usb_lock))
+ pr_err("Failed to create device (usb_lock)!\n");
+
+ if (device_create_file(usb_lock, &dev_attr_enable) < 0)
+ pr_err("Failed to create device file(.usblock/enable)!\n");
+#endif
+
+ return ret;
};
int max77693_muic_charger_cb(enum cable_type_muic cable_type)
{
+#if !defined(USE_CHGIN_INTR)
#ifdef CONFIG_BATTERY_MAX77693_CHARGER
struct power_supply *psy = power_supply_get_by_name("max77693-charger");
union power_supply_propval value;
#endif
+#endif
pr_info("%s: %d\n", __func__, cable_type);
switch (cable_type) {
@@ -169,6 +244,7 @@ int max77693_muic_charger_cb(enum cable_type_muic cable_type)
case CABLE_TYPE_CARDOCK_MUIC:
case CABLE_TYPE_DESKDOCK_MUIC:
case CABLE_TYPE_SMARTDOCK_MUIC:
+ case CABLE_TYPE_AUDIODOCK_MUIC:
case CABLE_TYPE_JIG_UART_OFF_VB_MUIC:
is_cable_attached = true;
break;
@@ -177,8 +253,9 @@ int max77693_muic_charger_cb(enum cable_type_muic cable_type)
return -EINVAL;
}
+#if !defined(USE_CHGIN_INTR)
#ifdef CONFIG_BATTERY_MAX77693_CHARGER
- if (!psy) {
+ if (!psy || !psy->set_property) {
pr_err("%s: fail to get max77693-charger psy\n", __func__);
return 0;
}
@@ -186,12 +263,12 @@ int max77693_muic_charger_cb(enum cable_type_muic cable_type)
value.intval = cable_type;
psy->set_property(psy, POWER_SUPPLY_PROP_ONLINE, &value);
#endif
+#endif
-#if defined(CONFIG_MACH_SLP_NAPLES) || defined(CONFIG_MACH_MIDAS)
-#ifndef CONFIG_MACH_GC1
+#if defined(CONFIG_MACH_SLP_NAPLES) || defined(CONFIG_MACH_MIDAS) \
+ || defined(CONFIG_MACH_GC1) || defined(CONFIG_MACH_T0)
tsp_charger_infom(is_cable_attached);
#endif
-#endif
#ifdef CONFIG_JACK_MON
jack_event_handler("charger", is_cable_attached);
#endif
@@ -221,6 +298,13 @@ void max77693_muic_usb_cb(u8 usb_mode)
host_notifier_device.dev.platform_data;
#endif
+#ifdef CONFIG_TARGET_LOCALE_KOR
+ if (is_usb_locked) {
+ pr_info("%s: usb locked by mdm\n", __func__);
+ return;
+ }
+#endif
+
pr_info("MUIC usb_cb:%d\n", usb_mode);
if (gadget) {
switch (usb_mode) {
@@ -288,7 +372,8 @@ void max77693_muic_usb_cb(u8 usb_mode)
jack_event_handler("usb", usb_mode);
#endif
}
-
+EXPORT_SYMBOL(max77693_muic_usb_cb);
+#if !defined(CONFIG_MUIC_MAX77693_SEPARATE_MHL_PORT)
/*extern void MHL_On(bool on);*/
void max77693_muic_mhl_cb(int attached)
{
@@ -313,7 +398,9 @@ void max77693_muic_mhl_cb(int attached)
#endif
}
}
+#endif /* !CONFIG_MUIC_MAX77693_SEPARATE_MHL_PORT */
+#if !defined(CONFIG_MUIC_MAX77693_SEPARATE_MHL_PORT)
bool max77693_muic_is_mhl_attached(void)
{
int val;
@@ -336,42 +423,22 @@ bool max77693_muic_is_mhl_attached(void)
return !!val;
#endif
}
+#endif /* !CONFIG_MUIC_MAX77693_SEPARATE_MHL_PORT */
-void max77693_muic_deskdock_cb(bool attached)
-{
- pr_info("MUIC deskdock attached=%d\n", attached);
- if (attached) {
-#ifdef CONFIG_JACK_MON
- jack_event_handler("cradle", 1);
-#endif
- switch_set_state(&switch_dock, 1);
- } else {
-#ifdef CONFIG_JACK_MON
- jack_event_handler("cradle", 0);
-#endif
- switch_set_state(&switch_dock, 0);
- }
-}
-
-void max77693_muic_cardock_cb(bool attached)
+void max77693_muic_dock_cb(int type)
{
- pr_info("MUIC cardock attached=%d\n", attached);
- pr_info("##MUIC [ %s ]- func : %s !!\n", __FILE__, __func__);
- if (attached) {
+ pr_info("%s:%s= MUIC dock type=%d\n", "sec-switch.c", __func__, type);
#ifdef CONFIG_JACK_MON
- jack_event_handler("cradle", 2);
+ jack_event_handler("cradle", type);
#endif
- switch_set_state(&switch_dock, 2);
- } else {
-#ifdef CONFIG_JACK_MON
- jack_event_handler("cradle", 0);
+#ifdef CONFIG_SWITCH
+ switch_set_state(&switch_dock, type);
#endif
- switch_set_state(&switch_dock, 0);
- }
}
void max77693_muic_init_cb(void)
{
+#ifdef CONFIG_SWITCH
int ret;
/* for CarDock, DeskDock */
@@ -381,8 +448,11 @@ void max77693_muic_init_cb(void)
if (ret < 0)
pr_err("Failed to register dock switch. %d\n", ret);
+#endif
}
+#if !defined(CONFIG_MACH_GC1) && !defined(CONFIG_MACH_T0) && \
+!defined(CONFIG_MACH_M3) && !defined(CONFIG_MACH_SLP_T0_LTE)
int max77693_muic_cfg_uart_gpio(void)
{
int uart_val, path;
@@ -399,7 +469,10 @@ int max77693_muic_cfg_uart_gpio(void)
path);
return path;
}
+#endif
+#if !defined(CONFIG_MACH_GC1) && !defined(CONFIG_MACH_T0) && \
+!defined(CONFIG_MACH_M3) && !defined(CONFIG_MACH_SLP_T0_LTE)
void max77693_muic_jig_uart_cb(int path)
{
pr_info("func:%s : (path=%d\n", __func__, path);
@@ -424,6 +497,21 @@ void max77693_muic_jig_uart_cb(int path)
}
}
+#endif
+
+#if defined(CONFIG_MUIC_DET_JACK)
+extern void jack_status_change(int attached);
+extern void earkey_status_change(int pressed, int code);
+
+void max77693_muic_earjack_cb(int attached)
+{
+ jack_status_change(attached);
+}
+void max77693_muic_earjackkey_cb(int pressed, unsigned int code)
+{
+ earkey_status_change(pressed, code);
+}
+#endif
#ifdef CONFIG_USB_HOST_NOTIFY
int max77693_muic_host_notify_cb(int enable)
@@ -487,22 +575,29 @@ int max77693_muic_set_safeout(int path)
struct max77693_muic_data max77693_muic = {
.usb_cb = max77693_muic_usb_cb,
.charger_cb = max77693_muic_charger_cb,
+#if !defined(CONFIG_MUIC_MAX77693_SEPARATE_MHL_PORT)
.mhl_cb = max77693_muic_mhl_cb,
.is_mhl_attached = max77693_muic_is_mhl_attached,
+#endif
.set_safeout = max77693_muic_set_safeout,
.init_cb = max77693_muic_init_cb,
- .deskdock_cb = max77693_muic_deskdock_cb,
- .cardock_cb = max77693_muic_cardock_cb,
-#if !defined(CONFIG_MACH_GC1)
+ .dock_cb = max77693_muic_dock_cb,
+#if !defined(CONFIG_MACH_GC1) && !defined(CONFIG_MACH_T0) && \
+!defined(CONFIG_MACH_M3) && !defined(CONFIG_MACH_SLP_T0_LTE)
.cfg_uart_gpio = max77693_muic_cfg_uart_gpio,
.jig_uart_cb = max77693_muic_jig_uart_cb,
#endif /* CONFIG_MACH_GC1 */
+#if defined(CONFIG_MUIC_DET_JACK)
+ .earjack_cb = max77693_muic_earjack_cb,
+ .earjackkey_cb = max77693_muic_earjackkey_cb,
+#endif
#ifdef CONFIG_USB_HOST_NOTIFY
.host_notify_cb = max77693_muic_host_notify_cb,
#else
.host_notify_cb = NULL,
#endif
-#if !defined(CONFIG_MACH_GC1)
+#if !defined(CONFIG_MACH_GC1) && !defined(CONFIG_MACH_T0) && \
+!defined(CONFIG_MACH_M3) && !defined(CONFIG_MACH_SLP_T0_LTE)
.gpio_usb_sel = GPIO_USB_SEL,
#else
.gpio_usb_sel = -1,
@@ -510,4 +605,31 @@ struct max77693_muic_data max77693_muic = {
.jig_state = max77693_set_jig_state,
};
+#if defined(CONFIG_MACH_SLP_PQ) || defined(CONFIG_MACH_REDWOOD) || \
+defined(CONFIG_MACH_SLP_T0_LTE)
+static void otg_accessory_power(int enable)
+{
+ u8 on = (u8)!!enable;
+
+ /* max77693 otg power control */
+ otg_control(enable);
+
+ gpio_request(GPIO_OTG_EN, "USB_OTG_EN");
+ gpio_direction_output(GPIO_OTG_EN, on);
+ gpio_free(GPIO_OTG_EN);
+ pr_info("%s: otg accessory power = %d\n", __func__, on);
+}
+
+static struct host_notifier_platform_data host_notifier_pdata = {
+ .ndev.name = "usb_otg",
+ .booster = otg_accessory_power,
+ .thread_enable = 0,
+};
+
+struct platform_device host_notifier_device = {
+ .name = "host_notifier",
+ .dev.platform_data = &host_notifier_pdata,
+};
+#endif
+
device_initcall(midas_sec_switch_init);