aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
Diffstat (limited to 'arch')
-rw-r--r--arch/arm/mach-pxa/mioa701.c142
1 files changed, 26 insertions, 116 deletions
diff --git a/arch/arm/mach-pxa/mioa701.c b/arch/arm/mach-pxa/mioa701.c
index 04a2cb38b075..9207f10dfd13 100644
--- a/arch/arm/mach-pxa/mioa701.c
+++ b/arch/arm/mach-pxa/mioa701.c
@@ -34,7 +34,7 @@
34#include <linux/irq.h> 34#include <linux/irq.h>
35#include <linux/pda_power.h> 35#include <linux/pda_power.h>
36#include <linux/power_supply.h> 36#include <linux/power_supply.h>
37#include <linux/wm97xx.h> 37#include <linux/wm97xx_batt.h>
38#include <linux/mtd/physmap.h> 38#include <linux/mtd/physmap.h>
39 39
40#include <asm/mach-types.h> 40#include <asm/mach-types.h>
@@ -680,13 +680,19 @@ static char *supplicants[] = {
680 "mioa701_battery" 680 "mioa701_battery"
681}; 681};
682 682
683static int is_ac_connected(void)
684{
685 return gpio_get_value(GPIO96_AC_DETECT);
686}
687
683static void mioa701_set_charge(int flags) 688static void mioa701_set_charge(int flags)
684{ 689{
685 gpio_set_value(GPIO9_CHARGE_EN, (flags == PDA_POWER_CHARGE_USB)); 690 gpio_set_value(GPIO9_CHARGE_EN, (flags == PDA_POWER_CHARGE_USB));
686} 691}
687 692
688static struct pda_power_pdata power_pdata = { 693static struct pda_power_pdata power_pdata = {
689 .is_ac_online = is_usb_connected, 694 .is_ac_online = is_ac_connected,
695 .is_usb_online = is_usb_connected,
690 .set_charge = mioa701_set_charge, 696 .set_charge = mioa701_set_charge,
691 .supplied_to = supplicants, 697 .supplied_to = supplicants,
692 .num_supplicants = ARRAY_SIZE(supplicants), 698 .num_supplicants = ARRAY_SIZE(supplicants),
@@ -695,6 +701,13 @@ static struct pda_power_pdata power_pdata = {
695static struct resource power_resources[] = { 701static struct resource power_resources[] = {
696 [0] = { 702 [0] = {
697 .name = "ac", 703 .name = "ac",
704 .start = gpio_to_irq(GPIO96_AC_DETECT),
705 .end = gpio_to_irq(GPIO96_AC_DETECT),
706 .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE |
707 IORESOURCE_IRQ_LOWEDGE,
708 },
709 [1] = {
710 .name = "usb",
698 .start = gpio_to_irq(GPIO13_nUSB_DETECT), 711 .start = gpio_to_irq(GPIO13_nUSB_DETECT),
699 .end = gpio_to_irq(GPIO13_nUSB_DETECT), 712 .end = gpio_to_irq(GPIO13_nUSB_DETECT),
700 .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE | 713 .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE |
@@ -712,121 +725,18 @@ static struct platform_device power_dev = {
712 }, 725 },
713}; 726};
714 727
715#if defined(CONFIG_PDA_POWER) && defined(CONFIG_TOUCHSCREEN_WM97XX) 728static struct wm97xx_batt_info mioa701_battery_data = {
716static struct wm97xx *battery_wm; 729 .batt_aux = WM97XX_AUX_ID1,
717 730 .temp_aux = -1,
718static enum power_supply_property battery_props[] = { 731 .charge_gpio = -1,
719 POWER_SUPPLY_PROP_STATUS, 732 .min_voltage = 0xc00,
720 POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN, 733 .max_voltage = 0xfc0,
721 POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN, 734 .batt_tech = POWER_SUPPLY_TECHNOLOGY_LION,
722 POWER_SUPPLY_PROP_VOLTAGE_NOW, 735 .batt_div = 1,
723 POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN, /* Necessary for apm */ 736 .batt_mult = 1,
724}; 737 .batt_name = "mioa701_battery",
725
726static int get_battery_voltage(void)
727{
728 int adc = -1;
729
730 if (battery_wm)
731 adc = wm97xx_read_aux_adc(battery_wm, WM97XX_AUX_ID1);
732 return adc;
733}
734
735static int get_battery_status(struct power_supply *b)
736{
737 int status;
738
739 if (is_usb_connected())
740 status = POWER_SUPPLY_STATUS_CHARGING;
741 else
742 status = POWER_SUPPLY_STATUS_DISCHARGING;
743
744 return status;
745}
746
747static int get_property(struct power_supply *b,
748 enum power_supply_property psp,
749 union power_supply_propval *val)
750{
751 int rc = 0;
752
753 switch (psp) {
754 case POWER_SUPPLY_PROP_STATUS:
755 val->intval = get_battery_status(b);
756 break;
757 case POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN:
758 val->intval = 0xfd0;
759 break;
760 case POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN:
761 val->intval = 0xc00;
762 break;
763 case POWER_SUPPLY_PROP_VOLTAGE_NOW:
764 val->intval = get_battery_voltage();
765 break;
766 case POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN:
767 val->intval = 100;
768 break;
769 default:
770 val->intval = -1;
771 rc = -1;
772 }
773
774 return rc;
775};
776
777static struct power_supply battery_ps = {
778 .name = "mioa701_battery",
779 .type = POWER_SUPPLY_TYPE_BATTERY,
780 .get_property = get_property,
781 .properties = battery_props,
782 .num_properties = ARRAY_SIZE(battery_props),
783}; 738};
784 739
785static int battery_probe(struct platform_device *pdev)
786{
787 struct wm97xx *wm = platform_get_drvdata(pdev);
788 int rc;
789
790 battery_wm = wm;
791
792 rc = power_supply_register(NULL, &battery_ps);
793 if (rc)
794 dev_err(&pdev->dev,
795 "Could not register mioa701 battery -> %d\n", rc);
796 return rc;
797}
798
799static int battery_remove(struct platform_device *pdev)
800{
801 battery_wm = NULL;
802 return 0;
803}
804
805static struct platform_driver mioa701_battery_driver = {
806 .driver = {
807 .name = "wm97xx-battery",
808 },
809 .probe = battery_probe,
810 .remove = battery_remove
811};
812
813static int __init mioa701_battery_init(void)
814{
815 int rc;
816
817 rc = platform_driver_register(&mioa701_battery_driver);
818 if (rc)
819 printk(KERN_ERR "Could not register mioa701 battery driver\n");
820 return rc;
821}
822
823#else
824static int __init mioa701_battery_init(void)
825{
826 return 0;
827}
828#endif
829
830/* 740/*
831 * Camera interface 741 * Camera interface
832 */ 742 */
@@ -926,12 +836,12 @@ static void __init mioa701_machine_init(void)
926 set_pxa_fb_info(&mioa701_pxafb_info); 836 set_pxa_fb_info(&mioa701_pxafb_info);
927 pxa_set_mci_info(&mioa701_mci_info); 837 pxa_set_mci_info(&mioa701_mci_info);
928 pxa_set_keypad_info(&mioa701_keypad_info); 838 pxa_set_keypad_info(&mioa701_keypad_info);
839 wm97xx_bat_set_pdata(&mioa701_battery_data);
929 udc_init(); 840 udc_init();
930 pm_power_off = mioa701_poweroff; 841 pm_power_off = mioa701_poweroff;
931 arm_pm_restart = mioa701_restart; 842 arm_pm_restart = mioa701_restart;
932 platform_add_devices(devices, ARRAY_SIZE(devices)); 843 platform_add_devices(devices, ARRAY_SIZE(devices));
933 gsm_init(); 844 gsm_init();
934 mioa701_battery_init();
935 845
936 pxa_set_i2c_info(&i2c_pdata); 846 pxa_set_i2c_info(&i2c_pdata);
937 pxa_set_camera_info(&mioa701_pxacamera_platform_data); 847 pxa_set_camera_info(&mioa701_pxacamera_platform_data);