mark your calendars: this is the day one kernel supports both boards
[efikamx:linux-kernel.git] / arch / arm / mach-mx5 / mx51_efikamx_battery.c
1 /*
2  * Copyright 2009-2010 Pegatron Corporation. All Rights Reserved.
3  * Copyright 2009-2011 Genesi USA, Inc. All Rights Reserved.
4  */
5
6
7 #include <linux/init.h>
8 #include <linux/input.h>
9 #include <linux/irq.h>
10 #include <linux/interrupt.h>
11 #include <linux/platform_device.h>
12 #include <linux/i2c.h>
13 #include <linux/sbs.h>
14 #include <mach/gpio.h>
15 #include <asm/io.h>
16 #include <asm/mach-types.h>
17
18 #include "mx51_pins.h"
19 #include "iomux.h"
20
21 #include "mx51_efikamx.h"
22
23 #define EFIKASB_BATTERY_LOW     MX51_PIN_DI1_PIN11
24 #define EFIKASB_BATTERY_INSERT  MX51_PIN_DISPB2_SER_DIO
25 #define EFIKASB_AC_INSERT       MX51_PIN_DI1_D0_CS
26
27 static struct mxc_iomux_pin_cfg mx51_efikamx_battery_pins[] = {
28         { EFIKASB_BATTERY_INSERT, IOMUX_CONFIG_GPIO, },
29         { EFIKASB_BATTERY_LOW, IOMUX_CONFIG_GPIO | IOMUX_CONFIG_SION, },
30         { EFIKASB_AC_INSERT, IOMUX_CONFIG_GPIO | IOMUX_CONFIG_SION,
31 /*              IOMUXC_GPIO3_IPP_IND_G_3_SELECT_INPUT, INPUT_CTL_PATH1, */
32         },
33 };
34
35
36
37 enum power_resource_index {
38         MAINS_INSERTION_STATUS,
39         BATTERY_INSERTION_STATUS,
40         BATTERY_ALERT,
41 };
42
43 static struct resource mx51_efikamx_power_resources[] = {
44         [MAINS_INSERTION_STATUS] = {
45                 .start = IOMUX_TO_IRQ(EFIKASB_AC_INSERT),
46                 .end   = IOMUX_TO_IRQ(EFIKASB_AC_INSERT),
47                 .name  = "mains-insertion-status",
48                 .flags =  IORESOURCE_IRQ | IORESOURCE_IRQ_LOWEDGE | IORESOURCE_IRQ_HIGHEDGE,
49         },
50         [BATTERY_INSERTION_STATUS] = {
51                 .start = IOMUX_TO_IRQ(EFIKASB_BATTERY_INSERT),
52                 .end   = IOMUX_TO_IRQ(EFIKASB_BATTERY_INSERT),
53                 .name  = "battery-insertion-status",
54                 .flags =  IORESOURCE_IRQ | IORESOURCE_IRQ_LOWEDGE | IORESOURCE_IRQ_HIGHEDGE,
55         },
56         [BATTERY_ALERT] = {
57                 .start = IOMUX_TO_IRQ(EFIKASB_BATTERY_LOW),
58                 .end   = IOMUX_TO_IRQ(EFIKASB_BATTERY_LOW),
59                 .name  = "battery-alert",
60                 .flags =  IORESOURCE_IRQ | IORESOURCE_IRQ_LOWEDGE | IORESOURCE_IRQ_HIGHEDGE,
61         },
62 };
63
64 int mx51_efikamx_battery_status(void)
65 {
66         return !gpio_get_value(IOMUX_TO_GPIO(EFIKASB_BATTERY_INSERT));
67 }
68
69 int mx51_efikamx_battery_alarm(void)
70 {
71         return !gpio_get_value(IOMUX_TO_GPIO(EFIKASB_BATTERY_LOW));
72 }
73
74 int mx51_efikamx_ac_status(void)
75 {
76         return !gpio_get_value(IOMUX_TO_GPIO(EFIKASB_AC_INSERT));
77 }
78
79 static struct sbs_platform_data mx51_efikamx_sbs_platform_data = {
80         .mains_insertion_status   = mx51_efikamx_ac_status,
81         .battery_insertion_status = mx51_efikamx_battery_status,
82
83         .battery_alert            = &mx51_efikamx_power_resources[BATTERY_ALERT],
84
85         .mains_presence_changed   = &mx51_efikamx_power_resources[MAINS_INSERTION_STATUS],
86         .battery_presence_changed = &mx51_efikamx_power_resources[BATTERY_INSERTION_STATUS],
87 };
88
89 static struct i2c_board_info mx51_efikamx_i2c_battery __initdata = {
90         .type          = "smart-battery",
91         .addr          = 0x0b,
92         .platform_data = &mx51_efikamx_sbs_platform_data,
93 };
94
95 void __init mx51_efikamx_init_battery(void)
96 {
97         if (machine_is_mx51_efikasb()) {
98                 CONFIG_IOMUX(mx51_efikamx_battery_pins);
99
100                 gpio_request(IOMUX_TO_GPIO(EFIKASB_BATTERY_INSERT), "battery:insert");
101                 gpio_direction_input(IOMUX_TO_GPIO(EFIKASB_BATTERY_INSERT));
102
103                 gpio_request(IOMUX_TO_GPIO(EFIKASB_BATTERY_LOW), "battery:alarm");
104                 gpio_direction_input(IOMUX_TO_GPIO(EFIKASB_BATTERY_LOW));
105
106                 /* ron: IOMUXC_GPIO3_IPP_IND_G_IN_3_SELECT_INPUT: 1: Selecting Pad DI1_D0_CS for Mode:ALT4 */
107                 __raw_writel(0x01, IO_ADDRESS(IOMUXC_BASE_ADDR) + 0x980);
108                 gpio_request(IOMUX_TO_GPIO(EFIKASB_AC_INSERT), "battery:ac");
109                 gpio_direction_input(IOMUX_TO_GPIO(EFIKASB_AC_INSERT));
110
111                 i2c_register_board_info(1, &mx51_efikamx_i2c_battery, 1);
112         }
113 }