diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/gpio/Kconfig | 7 | ||||
-rw-r--r-- | drivers/gpio/sch_gpio.c | 57 |
2 files changed, 44 insertions, 20 deletions
diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig index b46442d7d66e..d8d0cda2641d 100644 --- a/drivers/gpio/Kconfig +++ b/drivers/gpio/Kconfig | |||
@@ -100,18 +100,21 @@ config GPIO_VR41XX | |||
100 | Say yes here to support the NEC VR4100 series General-purpose I/O Uint | 100 | Say yes here to support the NEC VR4100 series General-purpose I/O Uint |
101 | 101 | ||
102 | config GPIO_SCH | 102 | config GPIO_SCH |
103 | tristate "Intel SCH GPIO" | 103 | tristate "Intel SCH/TunnelCreek GPIO" |
104 | depends on GPIOLIB && PCI && X86 | 104 | depends on GPIOLIB && PCI && X86 |
105 | select MFD_CORE | 105 | select MFD_CORE |
106 | select LPC_SCH | 106 | select LPC_SCH |
107 | help | 107 | help |
108 | Say yes here to support GPIO interface on Intel Poulsbo SCH. | 108 | Say yes here to support GPIO interface on Intel Poulsbo SCH |
109 | or Intel Tunnel Creek processor. | ||
109 | The Intel SCH contains a total of 14 GPIO pins. Ten GPIOs are | 110 | The Intel SCH contains a total of 14 GPIO pins. Ten GPIOs are |
110 | powered by the core power rail and are turned off during sleep | 111 | powered by the core power rail and are turned off during sleep |
111 | modes (S3 and higher). The remaining four GPIOs are powered by | 112 | modes (S3 and higher). The remaining four GPIOs are powered by |
112 | the Intel SCH suspend power supply. These GPIOs remain | 113 | the Intel SCH suspend power supply. These GPIOs remain |
113 | active during S3. The suspend powered GPIOs can be used to wake the | 114 | active during S3. The suspend powered GPIOs can be used to wake the |
114 | system from the Suspend-to-RAM state. | 115 | system from the Suspend-to-RAM state. |
116 | The Intel Tunnel Creek processor has 5 GPIOs powered by the | ||
117 | core power rail and 9 from suspend power supply. | ||
115 | 118 | ||
116 | This driver can also be built as a module. If so, the module | 119 | This driver can also be built as a module. If so, the module |
117 | will be called sch-gpio. | 120 | will be called sch-gpio. |
diff --git a/drivers/gpio/sch_gpio.c b/drivers/gpio/sch_gpio.c index 583521352c16..56060421cdff 100644 --- a/drivers/gpio/sch_gpio.c +++ b/drivers/gpio/sch_gpio.c | |||
@@ -25,6 +25,7 @@ | |||
25 | #include <linux/errno.h> | 25 | #include <linux/errno.h> |
26 | #include <linux/acpi.h> | 26 | #include <linux/acpi.h> |
27 | #include <linux/platform_device.h> | 27 | #include <linux/platform_device.h> |
28 | #include <linux/pci_ids.h> | ||
28 | 29 | ||
29 | #include <linux/gpio.h> | 30 | #include <linux/gpio.h> |
30 | 31 | ||
@@ -187,7 +188,11 @@ static struct gpio_chip sch_gpio_resume = { | |||
187 | static int __devinit sch_gpio_probe(struct platform_device *pdev) | 188 | static int __devinit sch_gpio_probe(struct platform_device *pdev) |
188 | { | 189 | { |
189 | struct resource *res; | 190 | struct resource *res; |
190 | int err; | 191 | int err, id; |
192 | |||
193 | id = pdev->id; | ||
194 | if (!id) | ||
195 | return -ENODEV; | ||
191 | 196 | ||
192 | res = platform_get_resource(pdev, IORESOURCE_IO, 0); | 197 | res = platform_get_resource(pdev, IORESOURCE_IO, 0); |
193 | if (!res) | 198 | if (!res) |
@@ -198,12 +203,40 @@ static int __devinit sch_gpio_probe(struct platform_device *pdev) | |||
198 | 203 | ||
199 | gpio_ba = res->start; | 204 | gpio_ba = res->start; |
200 | 205 | ||
201 | sch_gpio_core.base = 0; | 206 | switch (id) { |
202 | sch_gpio_core.ngpio = 10; | 207 | case PCI_DEVICE_ID_INTEL_SCH_LPC: |
203 | sch_gpio_core.dev = &pdev->dev; | 208 | sch_gpio_core.base = 0; |
209 | sch_gpio_core.ngpio = 10; | ||
210 | |||
211 | sch_gpio_resume.base = 10; | ||
212 | sch_gpio_resume.ngpio = 4; | ||
213 | |||
214 | /* | ||
215 | * GPIO[6:0] enabled by default | ||
216 | * GPIO7 is configured by the CMC as SLPIOVR | ||
217 | * Enable GPIO[9:8] core powered gpios explicitly | ||
218 | */ | ||
219 | outb(0x3, gpio_ba + CGEN + 1); | ||
220 | /* | ||
221 | * SUS_GPIO[2:0] enabled by default | ||
222 | * Enable SUS_GPIO3 resume powered gpio explicitly | ||
223 | */ | ||
224 | outb(0x8, gpio_ba + RGEN); | ||
225 | break; | ||
226 | |||
227 | case PCI_DEVICE_ID_INTEL_ITC_LPC: | ||
228 | sch_gpio_core.base = 0; | ||
229 | sch_gpio_core.ngpio = 5; | ||
230 | |||
231 | sch_gpio_resume.base = 5; | ||
232 | sch_gpio_resume.ngpio = 9; | ||
233 | break; | ||
234 | |||
235 | default: | ||
236 | return -ENODEV; | ||
237 | } | ||
204 | 238 | ||
205 | sch_gpio_resume.base = 10; | 239 | sch_gpio_core.dev = &pdev->dev; |
206 | sch_gpio_resume.ngpio = 4; | ||
207 | sch_gpio_resume.dev = &pdev->dev; | 240 | sch_gpio_resume.dev = &pdev->dev; |
208 | 241 | ||
209 | err = gpiochip_add(&sch_gpio_core); | 242 | err = gpiochip_add(&sch_gpio_core); |
@@ -214,18 +247,6 @@ static int __devinit sch_gpio_probe(struct platform_device *pdev) | |||
214 | if (err < 0) | 247 | if (err < 0) |
215 | goto err_sch_gpio_resume; | 248 | goto err_sch_gpio_resume; |
216 | 249 | ||
217 | /* | ||
218 | * GPIO[6:0] enabled by default | ||
219 | * GPIO7 is configured by the CMC as SLPIOVR | ||
220 | * Enable GPIO[9:8] core powered gpios explicitly | ||
221 | */ | ||
222 | outb(0x3, gpio_ba + CGEN + 1); | ||
223 | /* | ||
224 | * SUS_GPIO[2:0] enabled by default | ||
225 | * Enable SUS_GPIO3 resume powered gpio explicitly | ||
226 | */ | ||
227 | outb(0x8, gpio_ba + RGEN); | ||
228 | |||
229 | return 0; | 250 | return 0; |
230 | 251 | ||
231 | err_sch_gpio_resume: | 252 | err_sch_gpio_resume: |