diff options
Diffstat (limited to 'arch/arm/mach-exynos/sec-switch.c')
-rw-r--r-- | arch/arm/mach-exynos/sec-switch.c | 206 |
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); |