aboutsummaryrefslogtreecommitdiff
path: root/arch/arm/mach-s3c6410/om-gta03-features.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/mach-s3c6410/om-gta03-features.c')
-rw-r--r--arch/arm/mach-s3c6410/om-gta03-features.c348
1 files changed, 0 insertions, 348 deletions
diff --git a/arch/arm/mach-s3c6410/om-gta03-features.c b/arch/arm/mach-s3c6410/om-gta03-features.c
deleted file mode 100644
index 71d734ac40d..00000000000
--- a/arch/arm/mach-s3c6410/om-gta03-features.c
+++ /dev/null
@@ -1,348 +0,0 @@
-/*
- * Support for features of Openmoko GTA03
- *
- * (C) 2008 by Openmoko Inc.
- * Author: Andy Green <andy@openmoko.com>
- * All rights reserved.
- *
- * Somewhat based on the GTA01 / 02 neo1973_pm_ stuff mainly by Harald Welte
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation
- *
- */
-
-#include <linux/module.h>
-#include <linux/init.h>
-#include <linux/kernel.h>
-#include <linux/delay.h>
-#include <linux/platform_device.h>
-
-#include <mach/hardware.h>
-#include <mach/om-gta03.h>
-#include <asm/mach-types.h>
-
-#include <linux/regulator/consumer.h>
-#include <linux/mfd/pcf50633/core.h>
-#include <linux/mfd/pcf50633/gpio.h>
-#include <linux/mmc/host.h>
-
-#include <plat/sdhci.h>
-#include <plat/devs.h>
-
-#include <plat/gpio-cfg.h>
-
-enum feature {
- OM_GTA03_GPS, /* power to GPS section and LNA */
- OM_GTA03_WLAN_BT, /* WLAN and BT Module */
- OM_GTA03_GSM, /* GSM module */
- OM_GTA03_USBHOST, /* USB Host power generation */
- OM_GTA03_VIB, /* Vibrator */
-
- OM_GTA03_FEATURE_COUNT /* always last */
-};
-
-
-struct om_gta03_feature_info {
- const char * name;
- int depower_on_suspend;
- int on;
-};
-
-static struct om_gta03_feature_info feature_info[OM_GTA03_FEATURE_COUNT] = {
- [OM_GTA03_GPS] = { "gps_power", 1, 0 },
- [OM_GTA03_WLAN_BT] = { "wlan_bt_power", 1, 0 },
- [OM_GTA03_GSM] = { "gsm_power", 0, 0 },
- [OM_GTA03_USBHOST] = { "usbhost_power", 1, 0 },
- [OM_GTA03_VIB] = { "vibrator_power", 1, 0 },
-};
-
-static struct regulator *gps_regulator;
-
-
-
-static void om_gta03_features_pwron_set_on(enum feature feature)
-{
- int gpio;
-
- switch (feature) {
- case OM_GTA03_GPS:
- regulator_enable(gps_regulator);
- /* enable LNA */
- gpio_direction_output(GTA03_GPIO_GPS_LNA_EN, 1);
- break;
- case OM_GTA03_WLAN_BT:
-
- for (gpio = S3C64XX_GPH(0); gpio < S3C64XX_GPH(6); gpio++) {
- s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2)); /* sdio */
- s3c_gpio_setpull(gpio, S3C_GPIO_PULL_UP);
- }
- /* assert reset */
- s3c_gpio_setpull(GTA03_GPIO_WLAN_RESET, S3C_GPIO_PULL_NONE);
- s3c_gpio_cfgpin(GTA03_GPIO_WLAN_RESET, S3C_GPIO_SFN(1));
- gpio_direction_output(GTA03_GPIO_WLAN_RESET, 0);
-
- /* "full power down (active low)" -- deassert it*/
- gpio_direction_output(GTA03_GPIO_WLAN_PWRDN, 1);
- s3c_gpio_setpull(GTA03_GPIO_WLAN_PWRDN, S3C_GPIO_PULL_NONE);
- s3c_gpio_cfgpin(GTA03_GPIO_WLAN_PWRDN, S3C_GPIO_SFN(1));
-
- /* enable P-Channel mosfet switch for power */
- gpio_direction_output(GTA03_GPIO_NWLAN_POWER, 0);
- s3c_gpio_setpull(GTA03_GPIO_NWLAN_POWER, S3C_GPIO_PULL_NONE);
- s3c_gpio_cfgpin(GTA03_GPIO_NWLAN_POWER, S3C_GPIO_SFN(1));
- msleep(50);
- /* deassert reset */
- gpio_direction_output(GTA03_GPIO_WLAN_RESET, 1);
- msleep(1500);
- sdhci_s3c_force_presence_change(&s3c_device_hsmmc1);
- break;
- case OM_GTA03_GSM:
- /* give power to GSM module */
- s3c_gpio_setpull(GTA03_GPIO_N_MODEM_RESET, S3C_GPIO_PULL_NONE);
- s3c_gpio_setpull(GTA03_GPIO_MODEM_ON, S3C_GPIO_PULL_NONE);
- s3c_gpio_cfgpin(GTA03_GPIO_N_MODEM_RESET, S3C_GPIO_SFN(1));
- s3c_gpio_cfgpin(GTA03_GPIO_MODEM_ON, S3C_GPIO_SFN(1));
- gpio_direction_output(GTA03_GPIO_N_MODEM_RESET, 0);
- gpio_direction_output(GTA03_GPIO_MODEM_ON, 1);
- msleep(10);
- gpio_direction_output(GTA03_GPIO_MODEM_ON, 0);
- msleep(150);
- gpio_direction_output(GTA03_GPIO_N_MODEM_RESET, 1);
- msleep(300);
- gpio_direction_output(GTA03_GPIO_MODEM_ON, 1);
- break;
- case OM_GTA03_USBHOST:
- pcf50633_gpio_set(om_gta03_pcf, PCF50633_GPO, 1);
- break;
- case OM_GTA03_VIB:
- gpio_direction_output(GTA03_GPIO_VIBRATOR_ON, 1);
- break;
- default:
- break;
- }
-}
-
-static void om_gta03_features_pwron_set_off(enum feature feature)
-{
- int gpio;
-
- switch (feature) {
- case OM_GTA03_GPS:
- /* disable LNA */
- gpio_direction_output(GTA03_GPIO_GPS_LNA_EN, 0);
- regulator_disable(gps_regulator);
- break;
- case OM_GTA03_WLAN_BT:
- gpio_direction_output(GTA03_GPIO_WLAN_RESET, 0);
- s3c_gpio_setpull(GTA03_GPIO_WLAN_RESET, S3C_GPIO_PULL_NONE);
- s3c_gpio_cfgpin(GTA03_GPIO_WLAN_RESET, S3C_GPIO_SFN(1));
-
- gpio_direction_output(GTA03_GPIO_WLAN_PWRDN, 0);
- s3c_gpio_setpull(GTA03_GPIO_WLAN_PWRDN, S3C_GPIO_PULL_NONE);
- s3c_gpio_cfgpin(GTA03_GPIO_WLAN_PWRDN, S3C_GPIO_SFN(1));
- msleep(500);
- /* remove power from WLAN / BT module */
- gpio_direction_output(GTA03_GPIO_NWLAN_POWER, 1);
- s3c_gpio_setpull(GTA03_GPIO_NWLAN_POWER, S3C_GPIO_PULL_NONE);
- s3c_gpio_cfgpin(GTA03_GPIO_NWLAN_POWER, S3C_GPIO_SFN(1));
-
- sdhci_s3c_force_presence_change(&s3c_device_hsmmc1);
- for (gpio = S3C64XX_GPH(0); gpio < S3C64XX_GPH(6); gpio++) {
- s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(0)); /* input */
- s3c_gpio_setpull(gpio, S3C_GPIO_PULL_DOWN);
- }
- break;
- case OM_GTA03_GSM:
- /* remove power from WLAN / BT module */
- s3c_gpio_cfgpin(GTA03_GPIO_MODEM_ON, S3C_GPIO_SFN(1));
- gpio_direction_output(GTA03_GPIO_MODEM_ON, 0);
- msleep(1100);
- gpio_direction_output(GTA03_GPIO_MODEM_ON, 1);
- break;
- case OM_GTA03_USBHOST:
- pcf50633_gpio_set(om_gta03_pcf, PCF50633_GPO, 0);
- break;
- case OM_GTA03_VIB:
- gpio_direction_output(GTA03_GPIO_VIBRATOR_ON, 0);
- break;
- default:
- break;
- }
-}
-
-static void om_gta03_features_pwron_set(enum feature feature, int on)
-{
- if ((on) && (!feature_info[feature].on))
- om_gta03_features_pwron_set_on(feature);
- else
- if ((!on) && (feature_info[feature].on))
- om_gta03_features_pwron_set_off(feature);
-}
-
-static ssize_t om_gta03_feature_read(struct device *dev,
- struct device_attribute *attr, char *buf)
-{
- int on;
- int feature = 0;
- int hit = 0;
-
- while (!hit && feature < OM_GTA03_FEATURE_COUNT) {
- if (!strcmp(attr->attr.name, feature_info[feature].name))
- hit = 1;
- else
- feature++;
- }
-
- if (!hit)
- return -EINVAL;
-
- switch (feature) {
- case OM_GTA03_GPS:
- on = regulator_is_enabled(gps_regulator);
- break;
- case OM_GTA03_USBHOST:
- on = pcf50633_gpio_get(om_gta03_pcf, PCF50633_GPO);
- break;
- default:
- on = feature_info[feature].on;
- }
-
- *buf++ = '0' + on;
- *buf++='\n';
- *buf = '\0';
-
- return 3;
-}
-
-static ssize_t om_gta03_feature_write(struct device *dev,
- struct device_attribute *attr,
- const char *buf, size_t count)
-{
- int on = !!simple_strtoul(buf, NULL, 10);
- int feature = 0;
- int hit = 0;
-
- while (!hit && feature < OM_GTA03_FEATURE_COUNT) {
- if (!strcmp(attr->attr.name, feature_info[feature].name))
- hit = 1;
- else
- feature++;
- }
-
- if (!hit)
- return -EINVAL;
-
- om_gta03_features_pwron_set(feature, on);
- feature_info[feature].on = on;
-
- return count;
-}
-
-
-static DEVICE_ATTR(gps_power, 0644, om_gta03_feature_read,
- om_gta03_feature_write);
-
-static DEVICE_ATTR(wlan_bt_power, 0644, om_gta03_feature_read,
- om_gta03_feature_write);
-
-static DEVICE_ATTR(gsm_power, 0644, om_gta03_feature_read,
- om_gta03_feature_write);
-
-static DEVICE_ATTR(usbhost_power, 0644, om_gta03_feature_read,
- om_gta03_feature_write);
-
-static DEVICE_ATTR(vibrator_power, 0644, om_gta03_feature_read,
- om_gta03_feature_write);
-
-
-static struct attribute *om_gta03_features_sysfs_entries[] = {
- &dev_attr_gps_power.attr,
- &dev_attr_wlan_bt_power.attr,
- &dev_attr_gsm_power.attr,
- &dev_attr_usbhost_power.attr,
- &dev_attr_vibrator_power.attr,
- NULL
-};
-
-
-static struct attribute_group om_gta03_features_attr_group = {
- .name = NULL,
- .attrs = om_gta03_features_sysfs_entries,
-};
-
-static int __init om_gta03_features_probe(struct platform_device *pdev)
-{
- gps_regulator = regulator_get(&pdev->dev, "RF_3V");
- dev_info(&pdev->dev, "starting\n");
-
- return sysfs_create_group(&pdev->dev.kobj,
- &om_gta03_features_attr_group);
-}
-
-static int om_gta03_features_remove(struct platform_device *pdev)
-{
-
- regulator_put(gps_regulator);
- sysfs_remove_group(&pdev->dev.kobj, &om_gta03_features_attr_group);
-
- return 0;
-}
-
-
-#ifdef CONFIG_PM
-static int om_gta03_features_suspend(struct platform_device *pdev,
- pm_message_t state)
-{
- int feature;
-
- for (feature = 0; feature < OM_GTA03_FEATURE_COUNT; feature++)
- if (feature_info[feature].depower_on_suspend)
- om_gta03_features_pwron_set_off(feature);
-
- return 0;
-}
-
-static int om_gta03_features_resume(struct platform_device *pdev)
-{
- int feature;
-
- for (feature = 0; feature < OM_GTA03_FEATURE_COUNT; feature++)
- if (feature_info[feature].depower_on_suspend)
- if (feature_info[feature].on)
- om_gta03_features_pwron_set_on(feature);
-
- return 0;
-}
-#else
-#define om_gta03_features_suspend NULL
-#define om_gta03_features_resume NULL
-#endif
-
-static struct platform_driver om_gta03_features_driver = {
- .probe = om_gta03_features_probe,
- .remove = om_gta03_features_remove,
- .suspend = om_gta03_features_suspend,
- .resume = om_gta03_features_resume,
- .driver = {
- .name = "om-gta03",
- },
-};
-
-static int __devinit om_gta03_features_init(void)
-{
- return platform_driver_register(&om_gta03_features_driver);
-}
-
-static void om_gta03_features_exit(void)
-{
- platform_driver_unregister(&om_gta03_features_driver);
-}
-
-module_init(om_gta03_features_init);
-module_exit(om_gta03_features_exit);
-
-MODULE_LICENSE("GPL");
-MODULE_AUTHOR("Andy Green <andy@openmoko.com>");
-MODULE_DESCRIPTION("Openmoko GTA03 Feature Driver");