diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/i2c/busses/i2c-pxa.c | 45 | ||||
-rw-r--r-- | drivers/input/keyboard/pxa27x_keyboard.c | 25 | ||||
-rw-r--r-- | drivers/leds/Kconfig | 6 | ||||
-rw-r--r-- | drivers/leds/Makefile | 1 | ||||
-rw-r--r-- | drivers/leds/leds-cm-x270.c | 122 | ||||
-rw-r--r-- | drivers/mmc/host/pxamci.c | 43 | ||||
-rw-r--r-- | drivers/mmc/host/pxamci.h | 14 | ||||
-rw-r--r-- | drivers/net/irda/pxaficp_ir.c | 51 | ||||
-rw-r--r-- | drivers/net/smc91x.c | 55 | ||||
-rw-r--r-- | drivers/net/smc91x.h | 64 | ||||
-rw-r--r-- | drivers/pcmcia/Makefile | 1 | ||||
-rw-r--r-- | drivers/pcmcia/pxa2xx_cm_x270.c | 175 | ||||
-rw-r--r-- | drivers/pcmcia/pxa2xx_lubbock.c | 31 | ||||
-rw-r--r-- | drivers/pcmcia/pxa2xx_mainstone.c | 18 | ||||
-rw-r--r-- | drivers/serial/pxa.c | 163 | ||||
-rw-r--r-- | drivers/serial/serial_core.c | 18 | ||||
-rw-r--r-- | drivers/usb/gadget/pxa2xx_udc.c | 68 | ||||
-rw-r--r-- | drivers/usb/gadget/pxa2xx_udc.h | 1 | ||||
-rw-r--r-- | drivers/video/pxafb.c | 36 | ||||
-rw-r--r-- | drivers/video/pxafb.h | 1 |
20 files changed, 651 insertions, 287 deletions
diff --git a/drivers/i2c/busses/i2c-pxa.c b/drivers/i2c/busses/i2c-pxa.c index bb5466b27b59..00fad11733ad 100644 --- a/drivers/i2c/busses/i2c-pxa.c +++ b/drivers/i2c/busses/i2c-pxa.c | |||
@@ -31,6 +31,8 @@ | |||
31 | #include <linux/interrupt.h> | 31 | #include <linux/interrupt.h> |
32 | #include <linux/i2c-pxa.h> | 32 | #include <linux/i2c-pxa.h> |
33 | #include <linux/platform_device.h> | 33 | #include <linux/platform_device.h> |
34 | #include <linux/err.h> | ||
35 | #include <linux/clk.h> | ||
34 | 36 | ||
35 | #include <asm/hardware.h> | 37 | #include <asm/hardware.h> |
36 | #include <asm/irq.h> | 38 | #include <asm/irq.h> |
@@ -48,6 +50,7 @@ struct pxa_i2c { | |||
48 | unsigned int slave_addr; | 50 | unsigned int slave_addr; |
49 | 51 | ||
50 | struct i2c_adapter adap; | 52 | struct i2c_adapter adap; |
53 | struct clk *clk; | ||
51 | #ifdef CONFIG_I2C_PXA_SLAVE | 54 | #ifdef CONFIG_I2C_PXA_SLAVE |
52 | struct i2c_slave_client *slave; | 55 | struct i2c_slave_client *slave; |
53 | #endif | 56 | #endif |
@@ -869,6 +872,12 @@ static int i2c_pxa_probe(struct platform_device *dev) | |||
869 | 872 | ||
870 | sprintf(i2c->adap.name, "pxa_i2c-i2c.%u", dev->id); | 873 | sprintf(i2c->adap.name, "pxa_i2c-i2c.%u", dev->id); |
871 | 874 | ||
875 | i2c->clk = clk_get(&dev->dev, "I2CCLK"); | ||
876 | if (IS_ERR(i2c->clk)) { | ||
877 | ret = PTR_ERR(i2c->clk); | ||
878 | goto eclk; | ||
879 | } | ||
880 | |||
872 | i2c->reg_base = ioremap(res->start, res_len(res)); | 881 | i2c->reg_base = ioremap(res->start, res_len(res)); |
873 | if (!i2c->reg_base) { | 882 | if (!i2c->reg_base) { |
874 | ret = -EIO; | 883 | ret = -EIO; |
@@ -889,22 +898,19 @@ static int i2c_pxa_probe(struct platform_device *dev) | |||
889 | } | 898 | } |
890 | #endif | 899 | #endif |
891 | 900 | ||
901 | clk_enable(i2c->clk); | ||
902 | #ifdef CONFIG_PXA27x | ||
892 | switch (dev->id) { | 903 | switch (dev->id) { |
893 | case 0: | 904 | case 0: |
894 | #ifdef CONFIG_PXA27x | ||
895 | pxa_gpio_mode(GPIO117_I2CSCL_MD); | 905 | pxa_gpio_mode(GPIO117_I2CSCL_MD); |
896 | pxa_gpio_mode(GPIO118_I2CSDA_MD); | 906 | pxa_gpio_mode(GPIO118_I2CSDA_MD); |
897 | #endif | ||
898 | pxa_set_cken(CKEN_I2C, 1); | ||
899 | break; | 907 | break; |
900 | #ifdef CONFIG_PXA27x | ||
901 | case 1: | 908 | case 1: |
902 | local_irq_disable(); | 909 | local_irq_disable(); |
903 | PCFR |= PCFR_PI2CEN; | 910 | PCFR |= PCFR_PI2CEN; |
904 | local_irq_enable(); | 911 | local_irq_enable(); |
905 | pxa_set_cken(CKEN_PWRI2C, 1); | ||
906 | #endif | ||
907 | } | 912 | } |
913 | #endif | ||
908 | 914 | ||
909 | ret = request_irq(irq, i2c_pxa_handler, IRQF_DISABLED, | 915 | ret = request_irq(irq, i2c_pxa_handler, IRQF_DISABLED, |
910 | i2c->adap.name, i2c); | 916 | i2c->adap.name, i2c); |
@@ -948,19 +954,18 @@ static int i2c_pxa_probe(struct platform_device *dev) | |||
948 | eadapt: | 954 | eadapt: |
949 | free_irq(irq, i2c); | 955 | free_irq(irq, i2c); |
950 | ereqirq: | 956 | ereqirq: |
951 | switch (dev->id) { | 957 | clk_disable(i2c->clk); |
952 | case 0: | 958 | |
953 | pxa_set_cken(CKEN_I2C, 0); | ||
954 | break; | ||
955 | #ifdef CONFIG_PXA27x | 959 | #ifdef CONFIG_PXA27x |
956 | case 1: | 960 | if (dev->id == 1) { |
957 | pxa_set_cken(CKEN_PWRI2C, 0); | ||
958 | local_irq_disable(); | 961 | local_irq_disable(); |
959 | PCFR &= ~PCFR_PI2CEN; | 962 | PCFR &= ~PCFR_PI2CEN; |
960 | local_irq_enable(); | 963 | local_irq_enable(); |
961 | #endif | ||
962 | } | 964 | } |
965 | #endif | ||
963 | eremap: | 966 | eremap: |
967 | clk_put(i2c->clk); | ||
968 | eclk: | ||
964 | kfree(i2c); | 969 | kfree(i2c); |
965 | emalloc: | 970 | emalloc: |
966 | release_mem_region(res->start, res_len(res)); | 971 | release_mem_region(res->start, res_len(res)); |
@@ -975,18 +980,18 @@ static int i2c_pxa_remove(struct platform_device *dev) | |||
975 | 980 | ||
976 | i2c_del_adapter(&i2c->adap); | 981 | i2c_del_adapter(&i2c->adap); |
977 | free_irq(i2c->irq, i2c); | 982 | free_irq(i2c->irq, i2c); |
978 | switch (dev->id) { | 983 | |
979 | case 0: | 984 | clk_disable(i2c->clk); |
980 | pxa_set_cken(CKEN_I2C, 0); | 985 | clk_put(i2c->clk); |
981 | break; | 986 | |
982 | #ifdef CONFIG_PXA27x | 987 | #ifdef CONFIG_PXA27x |
983 | case 1: | 988 | if (dev->id == 1) { |
984 | pxa_set_cken(CKEN_PWRI2C, 0); | ||
985 | local_irq_disable(); | 989 | local_irq_disable(); |
986 | PCFR &= ~PCFR_PI2CEN; | 990 | PCFR &= ~PCFR_PI2CEN; |
987 | local_irq_enable(); | 991 | local_irq_enable(); |
988 | #endif | ||
989 | } | 992 | } |
993 | #endif | ||
994 | |||
990 | release_mem_region(i2c->iobase, i2c->iosize); | 995 | release_mem_region(i2c->iobase, i2c->iosize); |
991 | kfree(i2c); | 996 | kfree(i2c); |
992 | 997 | ||
diff --git a/drivers/input/keyboard/pxa27x_keyboard.c b/drivers/input/keyboard/pxa27x_keyboard.c index ebe5eacf2990..b7061aa38816 100644 --- a/drivers/input/keyboard/pxa27x_keyboard.c +++ b/drivers/input/keyboard/pxa27x_keyboard.c | |||
@@ -23,6 +23,8 @@ | |||
23 | #include <linux/input.h> | 23 | #include <linux/input.h> |
24 | #include <linux/device.h> | 24 | #include <linux/device.h> |
25 | #include <linux/platform_device.h> | 25 | #include <linux/platform_device.h> |
26 | #include <linux/clk.h> | ||
27 | #include <linux/err.h> | ||
26 | 28 | ||
27 | #include <asm/mach-types.h> | 29 | #include <asm/mach-types.h> |
28 | #include <asm/mach/arch.h> | 30 | #include <asm/mach/arch.h> |
@@ -40,6 +42,8 @@ | |||
40 | col/2 == 2 ? KPASMKP2 : KPASMKP3) | 42 | col/2 == 2 ? KPASMKP2 : KPASMKP3) |
41 | #define KPASMKPx_MKC(row, col) (1 << (row + 16 * (col % 2))) | 43 | #define KPASMKPx_MKC(row, col) (1 << (row + 16 * (col % 2))) |
42 | 44 | ||
45 | static struct clk *pxakbd_clk; | ||
46 | |||
43 | static irqreturn_t pxakbd_irq_handler(int irq, void *dev_id) | 47 | static irqreturn_t pxakbd_irq_handler(int irq, void *dev_id) |
44 | { | 48 | { |
45 | struct platform_device *pdev = dev_id; | 49 | struct platform_device *pdev = dev_id; |
@@ -104,7 +108,7 @@ static int pxakbd_open(struct input_dev *dev) | |||
104 | KPREC = 0x7F; | 108 | KPREC = 0x7F; |
105 | 109 | ||
106 | /* Enable unit clock */ | 110 | /* Enable unit clock */ |
107 | pxa_set_cken(CKEN_KEYPAD, 1); | 111 | clk_enable(pxakbd_clk); |
108 | 112 | ||
109 | return 0; | 113 | return 0; |
110 | } | 114 | } |
@@ -112,7 +116,7 @@ static int pxakbd_open(struct input_dev *dev) | |||
112 | static void pxakbd_close(struct input_dev *dev) | 116 | static void pxakbd_close(struct input_dev *dev) |
113 | { | 117 | { |
114 | /* Disable clock unit */ | 118 | /* Disable clock unit */ |
115 | pxa_set_cken(CKEN_KEYPAD, 0); | 119 | clk_disable(pxakbd_clk); |
116 | } | 120 | } |
117 | 121 | ||
118 | #ifdef CONFIG_PM | 122 | #ifdef CONFIG_PM |
@@ -140,7 +144,8 @@ static int pxakbd_resume(struct platform_device *pdev) | |||
140 | KPREC = pdata->reg_kprec; | 144 | KPREC = pdata->reg_kprec; |
141 | 145 | ||
142 | /* Enable unit clock */ | 146 | /* Enable unit clock */ |
143 | pxa_set_cken(CKEN_KEYPAD, 1); | 147 | clk_disable(pxakbd_clk); |
148 | clk_enable(pxakbd_clk); | ||
144 | } | 149 | } |
145 | 150 | ||
146 | mutex_unlock(&input_dev->mutex); | 151 | mutex_unlock(&input_dev->mutex); |
@@ -158,11 +163,18 @@ static int __devinit pxakbd_probe(struct platform_device *pdev) | |||
158 | struct input_dev *input_dev; | 163 | struct input_dev *input_dev; |
159 | int i, row, col, error; | 164 | int i, row, col, error; |
160 | 165 | ||
166 | pxakbd_clk = clk_get(&pdev->dev, "KBDCLK"); | ||
167 | if (IS_ERR(pxakbd_clk)) { | ||
168 | error = PTR_ERR(pxakbd_clk); | ||
169 | goto err_clk; | ||
170 | } | ||
171 | |||
161 | /* Create and register the input driver. */ | 172 | /* Create and register the input driver. */ |
162 | input_dev = input_allocate_device(); | 173 | input_dev = input_allocate_device(); |
163 | if (!input_dev) { | 174 | if (!input_dev) { |
164 | printk(KERN_ERR "Cannot request keypad device\n"); | 175 | printk(KERN_ERR "Cannot request keypad device\n"); |
165 | return -ENOMEM; | 176 | error = -ENOMEM; |
177 | goto err_alloc; | ||
166 | } | 178 | } |
167 | 179 | ||
168 | input_dev->name = DRIVER_NAME; | 180 | input_dev->name = DRIVER_NAME; |
@@ -185,7 +197,6 @@ static int __devinit pxakbd_probe(struct platform_device *pdev) | |||
185 | DRIVER_NAME, pdev); | 197 | DRIVER_NAME, pdev); |
186 | if (error) { | 198 | if (error) { |
187 | printk(KERN_ERR "Cannot request keypad IRQ\n"); | 199 | printk(KERN_ERR "Cannot request keypad IRQ\n"); |
188 | pxa_set_cken(CKEN_KEYPAD, 0); | ||
189 | goto err_free_dev; | 200 | goto err_free_dev; |
190 | } | 201 | } |
191 | 202 | ||
@@ -217,6 +228,9 @@ static int __devinit pxakbd_probe(struct platform_device *pdev) | |||
217 | free_irq(IRQ_KEYPAD, pdev); | 228 | free_irq(IRQ_KEYPAD, pdev); |
218 | err_free_dev: | 229 | err_free_dev: |
219 | input_free_device(input_dev); | 230 | input_free_device(input_dev); |
231 | err_alloc: | ||
232 | clk_put(pxakbd_clk); | ||
233 | err_clk: | ||
220 | return error; | 234 | return error; |
221 | } | 235 | } |
222 | 236 | ||
@@ -226,6 +240,7 @@ static int __devexit pxakbd_remove(struct platform_device *pdev) | |||
226 | 240 | ||
227 | input_unregister_device(input_dev); | 241 | input_unregister_device(input_dev); |
228 | free_irq(IRQ_KEYPAD, pdev); | 242 | free_irq(IRQ_KEYPAD, pdev); |
243 | clk_put(pxakbd_clk); | ||
229 | platform_set_drvdata(pdev, NULL); | 244 | platform_set_drvdata(pdev, NULL); |
230 | 245 | ||
231 | return 0; | 246 | return 0; |
diff --git a/drivers/leds/Kconfig b/drivers/leds/Kconfig index 3cb23210b912..257b44094e4c 100644 --- a/drivers/leds/Kconfig +++ b/drivers/leds/Kconfig | |||
@@ -108,6 +108,12 @@ config LEDS_GPIO | |||
108 | outputs. To be useful the particular board must have LEDs | 108 | outputs. To be useful the particular board must have LEDs |
109 | and they must be connected to the GPIO lines. | 109 | and they must be connected to the GPIO lines. |
110 | 110 | ||
111 | config LEDS_CM_X270 | ||
112 | tristate "LED Support for the CM-X270 LEDs" | ||
113 | depends on LEDS_CLASS && MACH_ARMCORE | ||
114 | help | ||
115 | This option enables support for the CM-X270 LEDs. | ||
116 | |||
111 | comment "LED Triggers" | 117 | comment "LED Triggers" |
112 | 118 | ||
113 | config LEDS_TRIGGERS | 119 | config LEDS_TRIGGERS |
diff --git a/drivers/leds/Makefile b/drivers/leds/Makefile index d2ca1abbc3d2..a60de1b46c2c 100644 --- a/drivers/leds/Makefile +++ b/drivers/leds/Makefile | |||
@@ -18,6 +18,7 @@ obj-$(CONFIG_LEDS_H1940) += leds-h1940.o | |||
18 | obj-$(CONFIG_LEDS_COBALT_QUBE) += leds-cobalt-qube.o | 18 | obj-$(CONFIG_LEDS_COBALT_QUBE) += leds-cobalt-qube.o |
19 | obj-$(CONFIG_LEDS_COBALT_RAQ) += leds-cobalt-raq.o | 19 | obj-$(CONFIG_LEDS_COBALT_RAQ) += leds-cobalt-raq.o |
20 | obj-$(CONFIG_LEDS_GPIO) += leds-gpio.o | 20 | obj-$(CONFIG_LEDS_GPIO) += leds-gpio.o |
21 | obj-$(CONFIG_LEDS_CM_X270) += leds-cm-x270.o | ||
21 | 22 | ||
22 | # LED Triggers | 23 | # LED Triggers |
23 | obj-$(CONFIG_LEDS_TRIGGER_TIMER) += ledtrig-timer.o | 24 | obj-$(CONFIG_LEDS_TRIGGER_TIMER) += ledtrig-timer.o |
diff --git a/drivers/leds/leds-cm-x270.c b/drivers/leds/leds-cm-x270.c new file mode 100644 index 000000000000..9aebef02a974 --- /dev/null +++ b/drivers/leds/leds-cm-x270.c | |||
@@ -0,0 +1,122 @@ | |||
1 | /* | ||
2 | * drivers/leds/leds-cm-x270.c | ||
3 | * | ||
4 | * Copyright 2007 CompuLab Ltd. | ||
5 | * Author: Mike Rapoport <mike@compulab.co.il> | ||
6 | * | ||
7 | * Based on leds-corgi.c | ||
8 | * Author: Richard Purdie <rpurdie@openedhand.com> | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License version 2 as | ||
12 | * published by the Free Software Foundation. | ||
13 | * | ||
14 | */ | ||
15 | |||
16 | #include <linux/kernel.h> | ||
17 | #include <linux/init.h> | ||
18 | #include <linux/platform_device.h> | ||
19 | #include <linux/leds.h> | ||
20 | |||
21 | #include <asm/arch/hardware.h> | ||
22 | #include <asm/arch/pxa-regs.h> | ||
23 | |||
24 | #define GPIO_RED_LED (93) | ||
25 | #define GPIO_GREEN_LED (94) | ||
26 | |||
27 | static void cmx270_red_set(struct led_classdev *led_cdev, | ||
28 | enum led_brightness value) | ||
29 | { | ||
30 | if (value) | ||
31 | GPCR(GPIO_RED_LED) = GPIO_bit(GPIO_RED_LED); | ||
32 | else | ||
33 | GPSR(GPIO_RED_LED) = GPIO_bit(GPIO_RED_LED); | ||
34 | } | ||
35 | |||
36 | static void cmx270_green_set(struct led_classdev *led_cdev, | ||
37 | enum led_brightness value) | ||
38 | { | ||
39 | if (value) | ||
40 | GPCR(GPIO_GREEN_LED) = GPIO_bit(GPIO_GREEN_LED); | ||
41 | else | ||
42 | GPSR(GPIO_GREEN_LED) = GPIO_bit(GPIO_GREEN_LED); | ||
43 | } | ||
44 | |||
45 | static struct led_classdev cmx270_red_led = { | ||
46 | .name = "cm-x270:red", | ||
47 | .default_trigger = "nand-disk", | ||
48 | .brightness_set = cmx270_red_set, | ||
49 | }; | ||
50 | |||
51 | static struct led_classdev cmx270_green_led = { | ||
52 | .name = "cm-x270:green", | ||
53 | .default_trigger = "heartbeat", | ||
54 | .brightness_set = cmx270_green_set, | ||
55 | }; | ||
56 | |||
57 | #ifdef CONFIG_PM | ||
58 | static int cmx270led_suspend(struct platform_device *dev, pm_message_t state) | ||
59 | { | ||
60 | led_classdev_suspend(&cmx270_red_led); | ||
61 | led_classdev_suspend(&cmx270_green_led); | ||
62 | return 0; | ||
63 | } | ||
64 | |||
65 | static int cmx270led_resume(struct platform_device *dev) | ||
66 | { | ||
67 | led_classdev_resume(&cmx270_red_led); | ||
68 | led_classdev_resume(&cmx270_green_led); | ||
69 | return 0; | ||
70 | } | ||
71 | #endif | ||
72 | |||
73 | static int cmx270led_probe(struct platform_device *pdev) | ||
74 | { | ||
75 | int ret; | ||
76 | |||
77 | ret = led_classdev_register(&pdev->dev, &cmx270_red_led); | ||
78 | if (ret < 0) | ||
79 | return ret; | ||
80 | |||
81 | ret = led_classdev_register(&pdev->dev, &cmx270_green_led); | ||
82 | if (ret < 0) | ||
83 | led_classdev_unregister(&cmx270_red_led); | ||
84 | |||
85 | return ret; | ||
86 | } | ||
87 | |||
88 | static int cmx270led_remove(struct platform_device *pdev) | ||
89 | { | ||
90 | led_classdev_unregister(&cmx270_red_led); | ||
91 | led_classdev_unregister(&cmx270_green_led); | ||
92 | return 0; | ||
93 | } | ||
94 | |||
95 | static struct platform_driver cmx270led_driver = { | ||
96 | .probe = cmx270led_probe, | ||
97 | .remove = cmx270led_remove, | ||
98 | #ifdef CONFIG_PM | ||
99 | .suspend = cmx270led_suspend, | ||
100 | .resume = cmx270led_resume, | ||
101 | #endif | ||
102 | .driver = { | ||
103 | .name = "cm-x270-led", | ||
104 | }, | ||
105 | }; | ||
106 | |||
107 | static int __init cmx270led_init(void) | ||
108 | { | ||
109 | return platform_driver_register(&cmx270led_driver); | ||
110 | } | ||
111 | |||
112 | static void __exit cmx270led_exit(void) | ||
113 | { | ||
114 | platform_driver_unregister(&cmx270led_driver); | ||
115 | } | ||
116 | |||
117 | module_init(cmx270led_init); | ||
118 | module_exit(cmx270led_exit); | ||
119 | |||
120 | MODULE_AUTHOR("Mike Rapoport <mike@compulab.co.il>"); | ||
121 | MODULE_DESCRIPTION("CM-x270 LED driver"); | ||
122 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/mmc/host/pxamci.c b/drivers/mmc/host/pxamci.c index 657901eecfce..0601e01aa2c2 100644 --- a/drivers/mmc/host/pxamci.c +++ b/drivers/mmc/host/pxamci.c | |||
@@ -23,6 +23,8 @@ | |||
23 | #include <linux/delay.h> | 23 | #include <linux/delay.h> |
24 | #include <linux/interrupt.h> | 24 | #include <linux/interrupt.h> |
25 | #include <linux/dma-mapping.h> | 25 | #include <linux/dma-mapping.h> |
26 | #include <linux/clk.h> | ||
27 | #include <linux/err.h> | ||
26 | #include <linux/mmc/host.h> | 28 | #include <linux/mmc/host.h> |
27 | 29 | ||
28 | #include <asm/dma.h> | 30 | #include <asm/dma.h> |
@@ -44,6 +46,8 @@ struct pxamci_host { | |||
44 | spinlock_t lock; | 46 | spinlock_t lock; |
45 | struct resource *res; | 47 | struct resource *res; |
46 | void __iomem *base; | 48 | void __iomem *base; |
49 | struct clk *clk; | ||
50 | unsigned long clkrate; | ||
47 | int irq; | 51 | int irq; |
48 | int dma; | 52 | int dma; |
49 | unsigned int clkrt; | 53 | unsigned int clkrt; |
@@ -119,7 +123,7 @@ static void pxamci_setup_data(struct pxamci_host *host, struct mmc_data *data) | |||
119 | writel(nob, host->base + MMC_NOB); | 123 | writel(nob, host->base + MMC_NOB); |
120 | writel(data->blksz, host->base + MMC_BLKLEN); | 124 | writel(data->blksz, host->base + MMC_BLKLEN); |
121 | 125 | ||
122 | clks = (unsigned long long)data->timeout_ns * CLOCKRATE; | 126 | clks = (unsigned long long)data->timeout_ns * host->clkrate; |
123 | do_div(clks, 1000000000UL); | 127 | do_div(clks, 1000000000UL); |
124 | timeout = (unsigned int)clks + (data->timeout_clks << host->clkrt); | 128 | timeout = (unsigned int)clks + (data->timeout_clks << host->clkrt); |
125 | writel((timeout + 255) / 256, host->base + MMC_RDTO); | 129 | writel((timeout + 255) / 256, host->base + MMC_RDTO); |
@@ -365,18 +369,25 @@ static void pxamci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) | |||
365 | struct pxamci_host *host = mmc_priv(mmc); | 369 | struct pxamci_host *host = mmc_priv(mmc); |
366 | 370 | ||
367 | if (ios->clock) { | 371 | if (ios->clock) { |
368 | unsigned int clk = CLOCKRATE / ios->clock; | 372 | unsigned long rate = host->clkrate; |
369 | if (CLOCKRATE / clk > ios->clock) | 373 | unsigned int clk = rate / ios->clock; |
374 | |||
375 | /* | ||
376 | * clk might result in a lower divisor than we | ||
377 | * desire. check for that condition and adjust | ||
378 | * as appropriate. | ||
379 | */ | ||
380 | if (rate / clk > ios->clock) | ||
370 | clk <<= 1; | 381 | clk <<= 1; |
371 | host->clkrt = fls(clk) - 1; | 382 | host->clkrt = fls(clk) - 1; |
372 | pxa_set_cken(CKEN_MMC, 1); | 383 | clk_enable(host->clk); |
373 | 384 | ||
374 | /* | 385 | /* |
375 | * we write clkrt on the next command | 386 | * we write clkrt on the next command |
376 | */ | 387 | */ |
377 | } else { | 388 | } else { |
378 | pxamci_stop_clock(host); | 389 | pxamci_stop_clock(host); |
379 | pxa_set_cken(CKEN_MMC, 0); | 390 | clk_disable(host->clk); |
380 | } | 391 | } |
381 | 392 | ||
382 | if (host->power_mode != ios->power_mode) { | 393 | if (host->power_mode != ios->power_mode) { |
@@ -462,8 +473,6 @@ static int pxamci_probe(struct platform_device *pdev) | |||
462 | } | 473 | } |
463 | 474 | ||
464 | mmc->ops = &pxamci_ops; | 475 | mmc->ops = &pxamci_ops; |
465 | mmc->f_min = CLOCKRATE_MIN; | ||
466 | mmc->f_max = CLOCKRATE_MAX; | ||
467 | 476 | ||
468 | /* | 477 | /* |
469 | * We can do SG-DMA, but we don't because we never know how much | 478 | * We can do SG-DMA, but we don't because we never know how much |
@@ -490,6 +499,22 @@ static int pxamci_probe(struct platform_device *pdev) | |||
490 | host->mmc = mmc; | 499 | host->mmc = mmc; |
491 | host->dma = -1; | 500 | host->dma = -1; |
492 | host->pdata = pdev->dev.platform_data; | 501 | host->pdata = pdev->dev.platform_data; |
502 | |||
503 | host->clk = clk_get(&pdev->dev, "MMCCLK"); | ||
504 | if (IS_ERR(host->clk)) { | ||
505 | ret = PTR_ERR(host->clk); | ||
506 | host->clk = NULL; | ||
507 | goto out; | ||
508 | } | ||
509 | |||
510 | host->clkrate = clk_get_rate(host->clk); | ||
511 | |||
512 | /* | ||
513 | * Calculate minimum clock rate, rounding up. | ||
514 | */ | ||
515 | mmc->f_min = (host->clkrate + 63) / 64; | ||
516 | mmc->f_max = host->clkrate; | ||
517 | |||
493 | mmc->ocr_avail = host->pdata ? | 518 | mmc->ocr_avail = host->pdata ? |
494 | host->pdata->ocr_mask : | 519 | host->pdata->ocr_mask : |
495 | MMC_VDD_32_33|MMC_VDD_33_34; | 520 | MMC_VDD_32_33|MMC_VDD_33_34; |
@@ -554,6 +579,8 @@ static int pxamci_probe(struct platform_device *pdev) | |||
554 | iounmap(host->base); | 579 | iounmap(host->base); |
555 | if (host->sg_cpu) | 580 | if (host->sg_cpu) |
556 | dma_free_coherent(&pdev->dev, PAGE_SIZE, host->sg_cpu, host->sg_dma); | 581 | dma_free_coherent(&pdev->dev, PAGE_SIZE, host->sg_cpu, host->sg_dma); |
582 | if (host->clk) | ||
583 | clk_put(host->clk); | ||
557 | } | 584 | } |
558 | if (mmc) | 585 | if (mmc) |
559 | mmc_free_host(mmc); | 586 | mmc_free_host(mmc); |
@@ -588,6 +615,8 @@ static int pxamci_remove(struct platform_device *pdev) | |||
588 | iounmap(host->base); | 615 | iounmap(host->base); |
589 | dma_free_coherent(&pdev->dev, PAGE_SIZE, host->sg_cpu, host->sg_dma); | 616 | dma_free_coherent(&pdev->dev, PAGE_SIZE, host->sg_cpu, host->sg_dma); |
590 | 617 | ||
618 | clk_put(host->clk); | ||
619 | |||
591 | release_resource(host->res); | 620 | release_resource(host->res); |
592 | 621 | ||
593 | mmc_free_host(mmc); | 622 | mmc_free_host(mmc); |
diff --git a/drivers/mmc/host/pxamci.h b/drivers/mmc/host/pxamci.h index 3153e779d46a..748c7706f237 100644 --- a/drivers/mmc/host/pxamci.h +++ b/drivers/mmc/host/pxamci.h | |||
@@ -88,17 +88,3 @@ | |||
88 | #define MMC_RXFIFO 0x0040 /* 8 bit */ | 88 | #define MMC_RXFIFO 0x0040 /* 8 bit */ |
89 | 89 | ||
90 | #define MMC_TXFIFO 0x0044 /* 8 bit */ | 90 | #define MMC_TXFIFO 0x0044 /* 8 bit */ |
91 | |||
92 | /* | ||
93 | * The base MMC clock rate | ||
94 | */ | ||
95 | #ifdef CONFIG_PXA27x | ||
96 | #define CLOCKRATE_MIN 304688 | ||
97 | #define CLOCKRATE_MAX 19500000 | ||
98 | #else | ||
99 | #define CLOCKRATE_MIN 312500 | ||
100 | #define CLOCKRATE_MAX 20000000 | ||
101 | #endif | ||
102 | |||
103 | #define CLOCKRATE CLOCKRATE_MAX | ||
104 | |||
diff --git a/drivers/net/irda/pxaficp_ir.c b/drivers/net/irda/pxaficp_ir.c index 55ff0fbe525a..8c09344f58dc 100644 --- a/drivers/net/irda/pxaficp_ir.c +++ b/drivers/net/irda/pxaficp_ir.c | |||
@@ -23,6 +23,7 @@ | |||
23 | #include <linux/dma-mapping.h> | 23 | #include <linux/dma-mapping.h> |
24 | #include <linux/platform_device.h> | 24 | #include <linux/platform_device.h> |
25 | #include <linux/pm.h> | 25 | #include <linux/pm.h> |
26 | #include <linux/clk.h> | ||
26 | 27 | ||
27 | #include <net/irda/irda.h> | 28 | #include <net/irda/irda.h> |
28 | #include <net/irda/irmod.h> | 29 | #include <net/irda/irmod.h> |
@@ -87,8 +88,30 @@ struct pxa_irda { | |||
87 | 88 | ||
88 | struct device *dev; | 89 | struct device *dev; |
89 | struct pxaficp_platform_data *pdata; | 90 | struct pxaficp_platform_data *pdata; |
91 | struct clk *fir_clk; | ||
92 | struct clk *sir_clk; | ||
93 | struct clk *cur_clk; | ||
90 | }; | 94 | }; |
91 | 95 | ||
96 | static inline void pxa_irda_disable_clk(struct pxa_irda *si) | ||
97 | { | ||
98 | if (si->cur_clk) | ||
99 | clk_disable(si->cur_clk); | ||
100 | si->cur_clk = NULL; | ||
101 | } | ||
102 | |||
103 | static inline void pxa_irda_enable_firclk(struct pxa_irda *si) | ||
104 | { | ||
105 | si->cur_clk = si->fir_clk; | ||
106 | clk_enable(si->fir_clk); | ||
107 | } | ||
108 | |||
109 | static inline void pxa_irda_enable_sirclk(struct pxa_irda *si) | ||
110 | { | ||
111 | si->cur_clk = si->sir_clk; | ||
112 | clk_enable(si->sir_clk); | ||
113 | } | ||
114 | |||
92 | 115 | ||
93 | #define IS_FIR(si) ((si)->speed >= 4000000) | 116 | #define IS_FIR(si) ((si)->speed >= 4000000) |
94 | #define IRDA_FRAME_SIZE_LIMIT 2047 | 117 | #define IRDA_FRAME_SIZE_LIMIT 2047 |
@@ -134,7 +157,7 @@ static int pxa_irda_set_speed(struct pxa_irda *si, int speed) | |||
134 | DCSR(si->rxdma) &= ~DCSR_RUN; | 157 | DCSR(si->rxdma) &= ~DCSR_RUN; |
135 | /* disable FICP */ | 158 | /* disable FICP */ |
136 | ICCR0 = 0; | 159 | ICCR0 = 0; |
137 | pxa_set_cken(CKEN_FICP, 0); | 160 | pxa_irda_disable_clk(si); |
138 | 161 | ||
139 | /* set board transceiver to SIR mode */ | 162 | /* set board transceiver to SIR mode */ |
140 | si->pdata->transceiver_mode(si->dev, IR_SIRMODE); | 163 | si->pdata->transceiver_mode(si->dev, IR_SIRMODE); |
@@ -144,7 +167,7 @@ static int pxa_irda_set_speed(struct pxa_irda *si, int speed) | |||
144 | pxa_gpio_mode(GPIO47_STTXD_MD); | 167 | pxa_gpio_mode(GPIO47_STTXD_MD); |
145 | 168 | ||
146 | /* enable the STUART clock */ | 169 | /* enable the STUART clock */ |
147 | pxa_set_cken(CKEN_STUART, 1); | 170 | pxa_irda_enable_sirclk(si); |
148 | } | 171 | } |
149 | 172 | ||
150 | /* disable STUART first */ | 173 | /* disable STUART first */ |
@@ -169,7 +192,7 @@ static int pxa_irda_set_speed(struct pxa_irda *si, int speed) | |||
169 | /* disable STUART */ | 192 | /* disable STUART */ |
170 | STIER = 0; | 193 | STIER = 0; |
171 | STISR = 0; | 194 | STISR = 0; |
172 | pxa_set_cken(CKEN_STUART, 0); | 195 | pxa_irda_disable_clk(si); |
173 | 196 | ||
174 | /* disable FICP first */ | 197 | /* disable FICP first */ |
175 | ICCR0 = 0; | 198 | ICCR0 = 0; |
@@ -182,7 +205,7 @@ static int pxa_irda_set_speed(struct pxa_irda *si, int speed) | |||
182 | pxa_gpio_mode(GPIO47_ICPTXD_MD); | 205 | pxa_gpio_mode(GPIO47_ICPTXD_MD); |
183 | 206 | ||
184 | /* enable the FICP clock */ | 207 | /* enable the FICP clock */ |
185 | pxa_set_cken(CKEN_FICP, 1); | 208 | pxa_irda_enable_firclk(si); |
186 | 209 | ||
187 | si->speed = speed; | 210 | si->speed = speed; |
188 | pxa_irda_fir_dma_rx_start(si); | 211 | pxa_irda_fir_dma_rx_start(si); |
@@ -592,16 +615,15 @@ static void pxa_irda_shutdown(struct pxa_irda *si) | |||
592 | STIER = 0; | 615 | STIER = 0; |
593 | /* disable STUART SIR mode */ | 616 | /* disable STUART SIR mode */ |
594 | STISR = 0; | 617 | STISR = 0; |
595 | /* disable the STUART clock */ | ||
596 | pxa_set_cken(CKEN_STUART, 0); | ||
597 | 618 | ||
598 | /* disable DMA */ | 619 | /* disable DMA */ |
599 | DCSR(si->txdma) &= ~DCSR_RUN; | 620 | DCSR(si->txdma) &= ~DCSR_RUN; |
600 | DCSR(si->rxdma) &= ~DCSR_RUN; | 621 | DCSR(si->rxdma) &= ~DCSR_RUN; |
601 | /* disable FICP */ | 622 | /* disable FICP */ |
602 | ICCR0 = 0; | 623 | ICCR0 = 0; |
603 | /* disable the FICP clock */ | 624 | |
604 | pxa_set_cken(CKEN_FICP, 0); | 625 | /* disable the STUART or FICP clocks */ |
626 | pxa_irda_disable_clk(si); | ||
605 | 627 | ||
606 | DRCMR17 = 0; | 628 | DRCMR17 = 0; |
607 | DRCMR18 = 0; | 629 | DRCMR18 = 0; |
@@ -792,6 +814,13 @@ static int pxa_irda_probe(struct platform_device *pdev) | |||
792 | si->dev = &pdev->dev; | 814 | si->dev = &pdev->dev; |
793 | si->pdata = pdev->dev.platform_data; | 815 | si->pdata = pdev->dev.platform_data; |
794 | 816 | ||
817 | si->sir_clk = clk_get(&pdev->dev, "UARTCLK"); | ||
818 | si->fir_clk = clk_get(&pdev->dev, "FICPCLK"); | ||
819 | if (IS_ERR(si->sir_clk) || IS_ERR(si->fir_clk)) { | ||
820 | err = PTR_ERR(IS_ERR(si->sir_clk) ? si->sir_clk : si->fir_clk); | ||
821 | goto err_mem_4; | ||
822 | } | ||
823 | |||
795 | /* | 824 | /* |
796 | * Initialise the SIR buffers | 825 | * Initialise the SIR buffers |
797 | */ | 826 | */ |
@@ -831,6 +860,10 @@ static int pxa_irda_probe(struct platform_device *pdev) | |||
831 | err_mem_5: | 860 | err_mem_5: |
832 | kfree(si->rx_buff.head); | 861 | kfree(si->rx_buff.head); |
833 | err_mem_4: | 862 | err_mem_4: |
863 | if (si->sir_clk && !IS_ERR(si->sir_clk)) | ||
864 | clk_put(si->sir_clk); | ||
865 | if (si->fir_clk && !IS_ERR(si->fir_clk)) | ||
866 | clk_put(si->fir_clk); | ||
834 | free_netdev(dev); | 867 | free_netdev(dev); |
835 | err_mem_3: | 868 | err_mem_3: |
836 | release_mem_region(__PREG(FICP), 0x1c); | 869 | release_mem_region(__PREG(FICP), 0x1c); |
@@ -850,6 +883,8 @@ static int pxa_irda_remove(struct platform_device *_dev) | |||
850 | unregister_netdev(dev); | 883 | unregister_netdev(dev); |
851 | kfree(si->tx_buff.head); | 884 | kfree(si->tx_buff.head); |
852 | kfree(si->rx_buff.head); | 885 | kfree(si->rx_buff.head); |
886 | clk_put(si->fir_clk); | ||
887 | clk_put(si->sir_clk); | ||
853 | free_netdev(dev); | 888 | free_netdev(dev); |
854 | } | 889 | } |
855 | 890 | ||
diff --git a/drivers/net/smc91x.c b/drivers/net/smc91x.c index 24e610e711e8..7da7589d45dd 100644 --- a/drivers/net/smc91x.c +++ b/drivers/net/smc91x.c | |||
@@ -173,49 +173,6 @@ MODULE_LICENSE("GPL"); | |||
173 | */ | 173 | */ |
174 | #define MII_DELAY 1 | 174 | #define MII_DELAY 1 |
175 | 175 | ||
176 | /* store this information for the driver.. */ | ||
177 | struct smc_local { | ||
178 | /* | ||
179 | * If I have to wait until memory is available to send a | ||
180 | * packet, I will store the skbuff here, until I get the | ||
181 | * desired memory. Then, I'll send it out and free it. | ||
182 | */ | ||
183 | struct sk_buff *pending_tx_skb; | ||
184 | struct tasklet_struct tx_task; | ||
185 | |||
186 | /* version/revision of the SMC91x chip */ | ||
187 | int version; | ||
188 | |||
189 | /* Contains the current active transmission mode */ | ||
190 | int tcr_cur_mode; | ||
191 | |||
192 | /* Contains the current active receive mode */ | ||
193 | int rcr_cur_mode; | ||
194 | |||
195 | /* Contains the current active receive/phy mode */ | ||
196 | int rpc_cur_mode; | ||
197 | int ctl_rfduplx; | ||
198 | int ctl_rspeed; | ||
199 | |||
200 | u32 msg_enable; | ||
201 | u32 phy_type; | ||
202 | struct mii_if_info mii; | ||
203 | |||
204 | /* work queue */ | ||
205 | struct work_struct phy_configure; | ||
206 | struct net_device *dev; | ||
207 | int work_pending; | ||
208 | |||
209 | spinlock_t lock; | ||
210 | |||
211 | #ifdef SMC_USE_PXA_DMA | ||
212 | /* DMA needs the physical address of the chip */ | ||
213 | u_long physaddr; | ||
214 | #endif | ||
215 | void __iomem *base; | ||
216 | void __iomem *datacs; | ||
217 | }; | ||
218 | |||
219 | #if SMC_DEBUG > 0 | 176 | #if SMC_DEBUG > 0 |
220 | #define DBG(n, args...) \ | 177 | #define DBG(n, args...) \ |
221 | do { \ | 178 | do { \ |
@@ -2215,17 +2172,19 @@ static int smc_drv_probe(struct platform_device *pdev) | |||
2215 | goto out_release_attrib; | 2172 | goto out_release_attrib; |
2216 | } | 2173 | } |
2217 | 2174 | ||
2218 | platform_set_drvdata(pdev, ndev); | ||
2219 | ret = smc_probe(ndev, addr); | ||
2220 | if (ret != 0) | ||
2221 | goto out_iounmap; | ||
2222 | #ifdef SMC_USE_PXA_DMA | 2175 | #ifdef SMC_USE_PXA_DMA |
2223 | else { | 2176 | { |
2224 | struct smc_local *lp = netdev_priv(ndev); | 2177 | struct smc_local *lp = netdev_priv(ndev); |
2178 | lp->device = &pdev->dev; | ||
2225 | lp->physaddr = res->start; | 2179 | lp->physaddr = res->start; |
2226 | } | 2180 | } |
2227 | #endif | 2181 | #endif |
2228 | 2182 | ||
2183 | platform_set_drvdata(pdev, ndev); | ||
2184 | ret = smc_probe(ndev, addr); | ||
2185 | if (ret != 0) | ||
2186 | goto out_iounmap; | ||
2187 | |||
2229 | smc_request_datacs(pdev, ndev); | 2188 | smc_request_datacs(pdev, ndev); |
2230 | 2189 | ||
2231 | return 0; | 2190 | return 0; |
diff --git a/drivers/net/smc91x.h b/drivers/net/smc91x.h index af9e6bf59552..729fd28c08b5 100644 --- a/drivers/net/smc91x.h +++ b/drivers/net/smc91x.h | |||
@@ -462,6 +462,52 @@ static inline void LPD7_SMC_outsw (unsigned char* a, int r, | |||
462 | 462 | ||
463 | #endif | 463 | #endif |
464 | 464 | ||
465 | |||
466 | /* store this information for the driver.. */ | ||
467 | struct smc_local { | ||
468 | /* | ||
469 | * If I have to wait until memory is available to send a | ||
470 | * packet, I will store the skbuff here, until I get the | ||
471 | * desired memory. Then, I'll send it out and free it. | ||
472 | */ | ||
473 | struct sk_buff *pending_tx_skb; | ||
474 | struct tasklet_struct tx_task; | ||
475 | |||
476 | /* version/revision of the SMC91x chip */ | ||
477 | int version; | ||
478 | |||
479 | /* Contains the current active transmission mode */ | ||
480 | int tcr_cur_mode; | ||
481 | |||
482 | /* Contains the current active receive mode */ | ||
483 | int rcr_cur_mode; | ||
484 | |||
485 | /* Contains the current active receive/phy mode */ | ||
486 | int rpc_cur_mode; | ||
487 | int ctl_rfduplx; | ||
488 | int ctl_rspeed; | ||
489 | |||
490 | u32 msg_enable; | ||
491 | u32 phy_type; | ||
492 | struct mii_if_info mii; | ||
493 | |||
494 | /* work queue */ | ||
495 | struct work_struct phy_configure; | ||
496 | struct net_device *dev; | ||
497 | int work_pending; | ||
498 | |||
499 | spinlock_t lock; | ||
500 | |||
501 | #ifdef SMC_USE_PXA_DMA | ||
502 | /* DMA needs the physical address of the chip */ | ||
503 | u_long physaddr; | ||
504 | struct device *device; | ||
505 | #endif | ||
506 | void __iomem *base; | ||
507 | void __iomem *datacs; | ||
508 | }; | ||
509 | |||
510 | |||
465 | #ifdef SMC_USE_PXA_DMA | 511 | #ifdef SMC_USE_PXA_DMA |
466 | /* | 512 | /* |
467 | * Let's use the DMA engine on the XScale PXA2xx for RX packets. This is | 513 | * Let's use the DMA engine on the XScale PXA2xx for RX packets. This is |
@@ -476,11 +522,12 @@ static inline void LPD7_SMC_outsw (unsigned char* a, int r, | |||
476 | #ifdef SMC_insl | 522 | #ifdef SMC_insl |
477 | #undef SMC_insl | 523 | #undef SMC_insl |
478 | #define SMC_insl(a, r, p, l) \ | 524 | #define SMC_insl(a, r, p, l) \ |
479 | smc_pxa_dma_insl(a, lp->physaddr, r, dev->dma, p, l) | 525 | smc_pxa_dma_insl(a, lp, r, dev->dma, p, l) |
480 | static inline void | 526 | static inline void |
481 | smc_pxa_dma_insl(void __iomem *ioaddr, u_long physaddr, int reg, int dma, | 527 | smc_pxa_dma_insl(void __iomem *ioaddr, struct smc_local *lp, int reg, int dma, |
482 | u_char *buf, int len) | 528 | u_char *buf, int len) |
483 | { | 529 | { |
530 | u_long physaddr = lp->physaddr; | ||
484 | dma_addr_t dmabuf; | 531 | dma_addr_t dmabuf; |
485 | 532 | ||
486 | /* fallback if no DMA available */ | 533 | /* fallback if no DMA available */ |
@@ -497,7 +544,7 @@ smc_pxa_dma_insl(void __iomem *ioaddr, u_long physaddr, int reg, int dma, | |||
497 | } | 544 | } |
498 | 545 | ||
499 | len *= 4; | 546 | len *= 4; |
500 | dmabuf = dma_map_single(NULL, buf, len, DMA_FROM_DEVICE); | 547 | dmabuf = dma_map_single(lp->device, buf, len, DMA_FROM_DEVICE); |
501 | DCSR(dma) = DCSR_NODESC; | 548 | DCSR(dma) = DCSR_NODESC; |
502 | DTADR(dma) = dmabuf; | 549 | DTADR(dma) = dmabuf; |
503 | DSADR(dma) = physaddr + reg; | 550 | DSADR(dma) = physaddr + reg; |
@@ -507,18 +554,19 @@ smc_pxa_dma_insl(void __iomem *ioaddr, u_long physaddr, int reg, int dma, | |||
507 | while (!(DCSR(dma) & DCSR_STOPSTATE)) | 554 | while (!(DCSR(dma) & DCSR_STOPSTATE)) |
508 | cpu_relax(); | 555 | cpu_relax(); |
509 | DCSR(dma) = 0; | 556 | DCSR(dma) = 0; |
510 | dma_unmap_single(NULL, dmabuf, len, DMA_FROM_DEVICE); | 557 | dma_unmap_single(lp->device, dmabuf, len, DMA_FROM_DEVICE); |
511 | } | 558 | } |
512 | #endif | 559 | #endif |
513 | 560 | ||
514 | #ifdef SMC_insw | 561 | #ifdef SMC_insw |
515 | #undef SMC_insw | 562 | #undef SMC_insw |
516 | #define SMC_insw(a, r, p, l) \ | 563 | #define SMC_insw(a, r, p, l) \ |
517 | smc_pxa_dma_insw(a, lp->physaddr, r, dev->dma, p, l) | 564 | smc_pxa_dma_insw(a, lp, r, dev->dma, p, l) |
518 | static inline void | 565 | static inline void |
519 | smc_pxa_dma_insw(void __iomem *ioaddr, u_long physaddr, int reg, int dma, | 566 | smc_pxa_dma_insw(void __iomem *ioaddr, struct smc_local *lp, int reg, int dma, |
520 | u_char *buf, int len) | 567 | u_char *buf, int len) |
521 | { | 568 | { |
569 | u_long physaddr = lp->physaddr; | ||
522 | dma_addr_t dmabuf; | 570 | dma_addr_t dmabuf; |
523 | 571 | ||
524 | /* fallback if no DMA available */ | 572 | /* fallback if no DMA available */ |
@@ -535,7 +583,7 @@ smc_pxa_dma_insw(void __iomem *ioaddr, u_long physaddr, int reg, int dma, | |||
535 | } | 583 | } |
536 | 584 | ||
537 | len *= 2; | 585 | len *= 2; |
538 | dmabuf = dma_map_single(NULL, buf, len, DMA_FROM_DEVICE); | 586 | dmabuf = dma_map_single(lp->device, buf, len, DMA_FROM_DEVICE); |
539 | DCSR(dma) = DCSR_NODESC; | 587 | DCSR(dma) = DCSR_NODESC; |
540 | DTADR(dma) = dmabuf; | 588 | DTADR(dma) = dmabuf; |
541 | DSADR(dma) = physaddr + reg; | 589 | DSADR(dma) = physaddr + reg; |
@@ -545,7 +593,7 @@ smc_pxa_dma_insw(void __iomem *ioaddr, u_long physaddr, int reg, int dma, | |||
545 | while (!(DCSR(dma) & DCSR_STOPSTATE)) | 593 | while (!(DCSR(dma) & DCSR_STOPSTATE)) |
546 | cpu_relax(); | 594 | cpu_relax(); |
547 | DCSR(dma) = 0; | 595 | DCSR(dma) = 0; |
548 | dma_unmap_single(NULL, dmabuf, len, DMA_FROM_DEVICE); | 596 | dma_unmap_single(lp->device, dmabuf, len, DMA_FROM_DEVICE); |
549 | } | 597 | } |
550 | #endif | 598 | #endif |
551 | 599 | ||
diff --git a/drivers/pcmcia/Makefile b/drivers/pcmcia/Makefile index 4276965517f2..dc7a4cb5d270 100644 --- a/drivers/pcmcia/Makefile +++ b/drivers/pcmcia/Makefile | |||
@@ -69,4 +69,5 @@ sa1100_cs-$(CONFIG_SA1100_SIMPAD) += sa1100_simpad.o | |||
69 | pxa2xx_cs-$(CONFIG_ARCH_LUBBOCK) += pxa2xx_lubbock.o sa1111_generic.o | 69 | pxa2xx_cs-$(CONFIG_ARCH_LUBBOCK) += pxa2xx_lubbock.o sa1111_generic.o |
70 | pxa2xx_cs-$(CONFIG_MACH_MAINSTONE) += pxa2xx_mainstone.o | 70 | pxa2xx_cs-$(CONFIG_MACH_MAINSTONE) += pxa2xx_mainstone.o |
71 | pxa2xx_cs-$(CONFIG_PXA_SHARPSL) += pxa2xx_sharpsl.o | 71 | pxa2xx_cs-$(CONFIG_PXA_SHARPSL) += pxa2xx_sharpsl.o |
72 | pxa2xx_cs-$(CONFIG_MACH_ARMCORE) += pxa2xx_cm_x270.o | ||
72 | 73 | ||
diff --git a/drivers/pcmcia/pxa2xx_cm_x270.c b/drivers/pcmcia/pxa2xx_cm_x270.c new file mode 100644 index 000000000000..fbf2f3a6984c --- /dev/null +++ b/drivers/pcmcia/pxa2xx_cm_x270.c | |||
@@ -0,0 +1,175 @@ | |||
1 | /* | ||
2 | * linux/drivers/pcmcia/pxa/pxa_cm_x270.c | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify | ||
5 | * it under the terms of the GNU General Public License version 2 as | ||
6 | * published by the Free Software Foundation. | ||
7 | * | ||
8 | * Compulab Ltd., 2003, 2007 | ||
9 | * Mike Rapoport <mike@compulab.co.il> | ||
10 | * | ||
11 | */ | ||
12 | |||
13 | #include <linux/kernel.h> | ||
14 | #include <linux/sched.h> | ||
15 | #include <linux/platform_device.h> | ||
16 | #include <linux/irq.h> | ||
17 | #include <linux/delay.h> | ||
18 | |||
19 | #include <pcmcia/ss.h> | ||
20 | #include <asm/hardware.h> | ||
21 | |||
22 | #include <asm/arch/pxa-regs.h> | ||
23 | #include <asm/arch/cm-x270.h> | ||
24 | |||
25 | #include "soc_common.h" | ||
26 | |||
27 | static struct pcmcia_irqs irqs[] = { | ||
28 | { 0, PCMCIA_S0_CD_VALID, "PCMCIA0 CD" }, | ||
29 | { 1, PCMCIA_S1_CD_VALID, "PCMCIA1 CD" }, | ||
30 | }; | ||
31 | |||
32 | static int cmx270_pcmcia_hw_init(struct soc_pcmcia_socket *skt) | ||
33 | { | ||
34 | GPSR(GPIO48_nPOE) = GPIO_bit(GPIO48_nPOE) | | ||
35 | GPIO_bit(GPIO49_nPWE) | | ||
36 | GPIO_bit(GPIO50_nPIOR) | | ||
37 | GPIO_bit(GPIO51_nPIOW) | | ||
38 | GPIO_bit(GPIO85_nPCE_1) | | ||
39 | GPIO_bit(GPIO54_nPCE_2); | ||
40 | |||
41 | pxa_gpio_mode(GPIO48_nPOE_MD); | ||
42 | pxa_gpio_mode(GPIO49_nPWE_MD); | ||
43 | pxa_gpio_mode(GPIO50_nPIOR_MD); | ||
44 | pxa_gpio_mode(GPIO51_nPIOW_MD); | ||
45 | pxa_gpio_mode(GPIO85_nPCE_1_MD); | ||
46 | pxa_gpio_mode(GPIO54_nPCE_2_MD); | ||
47 | pxa_gpio_mode(GPIO55_nPREG_MD); | ||
48 | pxa_gpio_mode(GPIO56_nPWAIT_MD); | ||
49 | pxa_gpio_mode(GPIO57_nIOIS16_MD); | ||
50 | |||
51 | /* Reset signal */ | ||
52 | pxa_gpio_mode(GPIO53_nPCE_2 | GPIO_OUT); | ||
53 | GPCR(GPIO53_nPCE_2) = GPIO_bit(GPIO53_nPCE_2); | ||
54 | |||
55 | set_irq_type(PCMCIA_S0_CD_VALID, IRQ_TYPE_EDGE_BOTH); | ||
56 | set_irq_type(PCMCIA_S1_CD_VALID, IRQ_TYPE_EDGE_BOTH); | ||
57 | |||
58 | /* irq's for slots: */ | ||
59 | set_irq_type(PCMCIA_S0_RDYINT, IRQ_TYPE_EDGE_FALLING); | ||
60 | set_irq_type(PCMCIA_S1_RDYINT, IRQ_TYPE_EDGE_FALLING); | ||
61 | |||
62 | skt->irq = (skt->nr == 0) ? PCMCIA_S0_RDYINT : PCMCIA_S1_RDYINT; | ||
63 | return soc_pcmcia_request_irqs(skt, irqs, ARRAY_SIZE(irqs)); | ||
64 | } | ||
65 | |||
66 | static void cmx270_pcmcia_shutdown(struct soc_pcmcia_socket *skt) | ||
67 | { | ||
68 | soc_pcmcia_free_irqs(skt, irqs, ARRAY_SIZE(irqs)); | ||
69 | |||
70 | set_irq_type(IRQ_TO_GPIO(PCMCIA_S0_CD_VALID), IRQ_TYPE_NONE); | ||
71 | set_irq_type(IRQ_TO_GPIO(PCMCIA_S1_CD_VALID), IRQ_TYPE_NONE); | ||
72 | |||
73 | set_irq_type(IRQ_TO_GPIO(PCMCIA_S0_RDYINT), IRQ_TYPE_NONE); | ||
74 | set_irq_type(IRQ_TO_GPIO(PCMCIA_S1_RDYINT), IRQ_TYPE_NONE); | ||
75 | } | ||
76 | |||
77 | |||
78 | static void cmx270_pcmcia_socket_state(struct soc_pcmcia_socket *skt, | ||
79 | struct pcmcia_state *state) | ||
80 | { | ||
81 | state->detect = (PCC_DETECT(skt->nr) == 0) ? 1 : 0; | ||
82 | state->ready = (PCC_READY(skt->nr) == 0) ? 0 : 1; | ||
83 | state->bvd1 = 1; | ||
84 | state->bvd2 = 1; | ||
85 | state->vs_3v = 0; | ||
86 | state->vs_Xv = 0; | ||
87 | state->wrprot = 0; /* not available */ | ||
88 | } | ||
89 | |||
90 | |||
91 | static int cmx270_pcmcia_configure_socket(struct soc_pcmcia_socket *skt, | ||
92 | const socket_state_t *state) | ||
93 | { | ||
94 | GPSR(GPIO49_nPWE) = GPIO_bit(GPIO49_nPWE); | ||
95 | pxa_gpio_mode(GPIO49_nPWE | GPIO_OUT); | ||
96 | |||
97 | switch (skt->nr) { | ||
98 | case 0: | ||
99 | if (state->flags & SS_RESET) { | ||
100 | GPCR(GPIO49_nPWE) = GPIO_bit(GPIO49_nPWE); | ||
101 | GPSR(GPIO53_nPCE_2) = GPIO_bit(GPIO53_nPCE_2); | ||
102 | udelay(10); | ||
103 | GPCR(GPIO53_nPCE_2) = GPIO_bit(GPIO53_nPCE_2); | ||
104 | GPSR(GPIO49_nPWE) = GPIO_bit(GPIO49_nPWE); | ||
105 | } | ||
106 | break; | ||
107 | case 1: | ||
108 | if (state->flags & SS_RESET) { | ||
109 | GPCR(GPIO49_nPWE) = GPIO_bit(GPIO49_nPWE); | ||
110 | GPSR(GPIO53_nPCE_2) = GPIO_bit(GPIO53_nPCE_2); | ||
111 | udelay(10); | ||
112 | GPCR(GPIO53_nPCE_2) = GPIO_bit(GPIO53_nPCE_2); | ||
113 | GPSR(GPIO49_nPWE) = GPIO_bit(GPIO49_nPWE); | ||
114 | } | ||
115 | break; | ||
116 | } | ||
117 | |||
118 | pxa_gpio_mode(GPIO49_nPWE_MD); | ||
119 | |||
120 | return 0; | ||
121 | } | ||
122 | |||
123 | static void cmx270_pcmcia_socket_init(struct soc_pcmcia_socket *skt) | ||
124 | { | ||
125 | } | ||
126 | |||
127 | static void cmx270_pcmcia_socket_suspend(struct soc_pcmcia_socket *skt) | ||
128 | { | ||
129 | } | ||
130 | |||
131 | |||
132 | static struct pcmcia_low_level cmx270_pcmcia_ops = { | ||
133 | .owner = THIS_MODULE, | ||
134 | .hw_init = cmx270_pcmcia_hw_init, | ||
135 | .hw_shutdown = cmx270_pcmcia_shutdown, | ||
136 | .socket_state = cmx270_pcmcia_socket_state, | ||
137 | .configure_socket = cmx270_pcmcia_configure_socket, | ||
138 | .socket_init = cmx270_pcmcia_socket_init, | ||
139 | .socket_suspend = cmx270_pcmcia_socket_suspend, | ||
140 | .nr = 2, | ||
141 | }; | ||
142 | |||
143 | static struct platform_device *cmx270_pcmcia_device; | ||
144 | |||
145 | static int __init cmx270_pcmcia_init(void) | ||
146 | { | ||
147 | int ret; | ||
148 | |||
149 | cmx270_pcmcia_device = platform_device_alloc("pxa2xx-pcmcia", -1); | ||
150 | |||
151 | if (!cmx270_pcmcia_device) | ||
152 | return -ENOMEM; | ||
153 | |||
154 | cmx270_pcmcia_device->dev.platform_data = &cmx270_pcmcia_ops; | ||
155 | |||
156 | printk(KERN_INFO "Registering cm-x270 PCMCIA interface.\n"); | ||
157 | ret = platform_device_add(cmx270_pcmcia_device); | ||
158 | |||
159 | if (ret) | ||
160 | platform_device_put(cmx270_pcmcia_device); | ||
161 | |||
162 | return ret; | ||
163 | } | ||
164 | |||
165 | static void __exit cmx270_pcmcia_exit(void) | ||
166 | { | ||
167 | platform_device_unregister(cmx270_pcmcia_device); | ||
168 | } | ||
169 | |||
170 | module_init(cmx270_pcmcia_init); | ||
171 | module_exit(cmx270_pcmcia_exit); | ||
172 | |||
173 | MODULE_LICENSE("GPL"); | ||
174 | MODULE_AUTHOR("Mike Rapoport <mike@compulab.co.il>"); | ||
175 | MODULE_DESCRIPTION("CM-x270 PCMCIA driver"); | ||
diff --git a/drivers/pcmcia/pxa2xx_lubbock.c b/drivers/pcmcia/pxa2xx_lubbock.c index 5e9b9a3fd027..1510d6cde3e2 100644 --- a/drivers/pcmcia/pxa2xx_lubbock.c +++ b/drivers/pcmcia/pxa2xx_lubbock.c | |||
@@ -30,35 +30,6 @@ | |||
30 | #include "sa1111_generic.h" | 30 | #include "sa1111_generic.h" |
31 | 31 | ||
32 | static int | 32 | static int |
33 | lubbock_pcmcia_hw_init(struct soc_pcmcia_socket *skt) | ||
34 | { | ||
35 | /* | ||
36 | * Setup default state of GPIO outputs | ||
37 | * before we enable them as outputs. | ||
38 | */ | ||
39 | GPSR(GPIO48_nPOE) = | ||
40 | GPIO_bit(GPIO48_nPOE) | | ||
41 | GPIO_bit(GPIO49_nPWE) | | ||
42 | GPIO_bit(GPIO50_nPIOR) | | ||
43 | GPIO_bit(GPIO51_nPIOW) | | ||
44 | GPIO_bit(GPIO52_nPCE_1) | | ||
45 | GPIO_bit(GPIO53_nPCE_2); | ||
46 | |||
47 | pxa_gpio_mode(GPIO48_nPOE_MD); | ||
48 | pxa_gpio_mode(GPIO49_nPWE_MD); | ||
49 | pxa_gpio_mode(GPIO50_nPIOR_MD); | ||
50 | pxa_gpio_mode(GPIO51_nPIOW_MD); | ||
51 | pxa_gpio_mode(GPIO52_nPCE_1_MD); | ||
52 | pxa_gpio_mode(GPIO53_nPCE_2_MD); | ||
53 | pxa_gpio_mode(GPIO54_pSKTSEL_MD); | ||
54 | pxa_gpio_mode(GPIO55_nPREG_MD); | ||
55 | pxa_gpio_mode(GPIO56_nPWAIT_MD); | ||
56 | pxa_gpio_mode(GPIO57_nIOIS16_MD); | ||
57 | |||
58 | return sa1111_pcmcia_hw_init(skt); | ||
59 | } | ||
60 | |||
61 | static int | ||
62 | lubbock_pcmcia_configure_socket(struct soc_pcmcia_socket *skt, | 33 | lubbock_pcmcia_configure_socket(struct soc_pcmcia_socket *skt, |
63 | const socket_state_t *state) | 34 | const socket_state_t *state) |
64 | { | 35 | { |
@@ -230,7 +201,7 @@ lubbock_pcmcia_configure_socket(struct soc_pcmcia_socket *skt, | |||
230 | 201 | ||
231 | static struct pcmcia_low_level lubbock_pcmcia_ops = { | 202 | static struct pcmcia_low_level lubbock_pcmcia_ops = { |
232 | .owner = THIS_MODULE, | 203 | .owner = THIS_MODULE, |
233 | .hw_init = lubbock_pcmcia_hw_init, | 204 | .hw_init = sa1111_pcmcia_hw_init, |
234 | .hw_shutdown = sa1111_pcmcia_hw_shutdown, | 205 | .hw_shutdown = sa1111_pcmcia_hw_shutdown, |
235 | .socket_state = sa1111_pcmcia_socket_state, | 206 | .socket_state = sa1111_pcmcia_socket_state, |
236 | .configure_socket = lubbock_pcmcia_configure_socket, | 207 | .configure_socket = lubbock_pcmcia_configure_socket, |
diff --git a/drivers/pcmcia/pxa2xx_mainstone.c b/drivers/pcmcia/pxa2xx_mainstone.c index f6722ba0dd1e..6fa5eaaab8af 100644 --- a/drivers/pcmcia/pxa2xx_mainstone.c +++ b/drivers/pcmcia/pxa2xx_mainstone.c | |||
@@ -43,24 +43,6 @@ static int mst_pcmcia_hw_init(struct soc_pcmcia_socket *skt) | |||
43 | * Setup default state of GPIO outputs | 43 | * Setup default state of GPIO outputs |
44 | * before we enable them as outputs. | 44 | * before we enable them as outputs. |
45 | */ | 45 | */ |
46 | GPSR(GPIO48_nPOE) = | ||
47 | GPIO_bit(GPIO48_nPOE) | | ||
48 | GPIO_bit(GPIO49_nPWE) | | ||
49 | GPIO_bit(GPIO50_nPIOR) | | ||
50 | GPIO_bit(GPIO51_nPIOW) | | ||
51 | GPIO_bit(GPIO85_nPCE_1) | | ||
52 | GPIO_bit(GPIO54_nPCE_2); | ||
53 | |||
54 | pxa_gpio_mode(GPIO48_nPOE_MD); | ||
55 | pxa_gpio_mode(GPIO49_nPWE_MD); | ||
56 | pxa_gpio_mode(GPIO50_nPIOR_MD); | ||
57 | pxa_gpio_mode(GPIO51_nPIOW_MD); | ||
58 | pxa_gpio_mode(GPIO85_nPCE_1_MD); | ||
59 | pxa_gpio_mode(GPIO54_nPCE_2_MD); | ||
60 | pxa_gpio_mode(GPIO79_pSKTSEL_MD); | ||
61 | pxa_gpio_mode(GPIO55_nPREG_MD); | ||
62 | pxa_gpio_mode(GPIO56_nPWAIT_MD); | ||
63 | pxa_gpio_mode(GPIO57_nIOIS16_MD); | ||
64 | 46 | ||
65 | skt->irq = (skt->nr == 0) ? MAINSTONE_S0_IRQ : MAINSTONE_S1_IRQ; | 47 | skt->irq = (skt->nr == 0) ? MAINSTONE_S0_IRQ : MAINSTONE_S1_IRQ; |
66 | return soc_pcmcia_request_irqs(skt, irqs, ARRAY_SIZE(irqs)); | 48 | return soc_pcmcia_request_irqs(skt, irqs, ARRAY_SIZE(irqs)); |
diff --git a/drivers/serial/pxa.c b/drivers/serial/pxa.c index e9c6cb391a23..af3a011b2b24 100644 --- a/drivers/serial/pxa.c +++ b/drivers/serial/pxa.c | |||
@@ -42,6 +42,7 @@ | |||
42 | #include <linux/tty.h> | 42 | #include <linux/tty.h> |
43 | #include <linux/tty_flip.h> | 43 | #include <linux/tty_flip.h> |
44 | #include <linux/serial_core.h> | 44 | #include <linux/serial_core.h> |
45 | #include <linux/clk.h> | ||
45 | 46 | ||
46 | #include <asm/io.h> | 47 | #include <asm/io.h> |
47 | #include <asm/hardware.h> | 48 | #include <asm/hardware.h> |
@@ -55,7 +56,7 @@ struct uart_pxa_port { | |||
55 | unsigned char lcr; | 56 | unsigned char lcr; |
56 | unsigned char mcr; | 57 | unsigned char mcr; |
57 | unsigned int lsr_break_flag; | 58 | unsigned int lsr_break_flag; |
58 | unsigned int cken; | 59 | struct clk *clk; |
59 | char *name; | 60 | char *name; |
60 | }; | 61 | }; |
61 | 62 | ||
@@ -351,6 +352,8 @@ static int serial_pxa_startup(struct uart_port *port) | |||
351 | else | 352 | else |
352 | up->mcr = 0; | 353 | up->mcr = 0; |
353 | 354 | ||
355 | up->port.uartclk = clk_get_rate(up->clk); | ||
356 | |||
354 | /* | 357 | /* |
355 | * Allocate the IRQ | 358 | * Allocate the IRQ |
356 | */ | 359 | */ |
@@ -546,9 +549,11 @@ serial_pxa_pm(struct uart_port *port, unsigned int state, | |||
546 | unsigned int oldstate) | 549 | unsigned int oldstate) |
547 | { | 550 | { |
548 | struct uart_pxa_port *up = (struct uart_pxa_port *)port; | 551 | struct uart_pxa_port *up = (struct uart_pxa_port *)port; |
549 | pxa_set_cken(up->cken, !state); | 552 | |
550 | if (!state) | 553 | if (!state) |
551 | udelay(1); | 554 | clk_enable(up->clk); |
555 | else | ||
556 | clk_disable(up->clk); | ||
552 | } | 557 | } |
553 | 558 | ||
554 | static void serial_pxa_release_port(struct uart_port *port) | 559 | static void serial_pxa_release_port(struct uart_port *port) |
@@ -582,7 +587,7 @@ serial_pxa_type(struct uart_port *port) | |||
582 | 587 | ||
583 | #ifdef CONFIG_SERIAL_PXA_CONSOLE | 588 | #ifdef CONFIG_SERIAL_PXA_CONSOLE |
584 | 589 | ||
585 | static struct uart_pxa_port serial_pxa_ports[]; | 590 | static struct uart_pxa_port *serial_pxa_ports[4]; |
586 | static struct uart_driver serial_pxa_reg; | 591 | static struct uart_driver serial_pxa_reg; |
587 | 592 | ||
588 | #define BOTH_EMPTY (UART_LSR_TEMT | UART_LSR_THRE) | 593 | #define BOTH_EMPTY (UART_LSR_TEMT | UART_LSR_THRE) |
@@ -632,9 +637,11 @@ static void serial_pxa_console_putchar(struct uart_port *port, int ch) | |||
632 | static void | 637 | static void |
633 | serial_pxa_console_write(struct console *co, const char *s, unsigned int count) | 638 | serial_pxa_console_write(struct console *co, const char *s, unsigned int count) |
634 | { | 639 | { |
635 | struct uart_pxa_port *up = &serial_pxa_ports[co->index]; | 640 | struct uart_pxa_port *up = serial_pxa_ports[co->index]; |
636 | unsigned int ier; | 641 | unsigned int ier; |
637 | 642 | ||
643 | clk_enable(up->clk); | ||
644 | |||
638 | /* | 645 | /* |
639 | * First save the IER then disable the interrupts | 646 | * First save the IER then disable the interrupts |
640 | */ | 647 | */ |
@@ -649,6 +656,8 @@ serial_pxa_console_write(struct console *co, const char *s, unsigned int count) | |||
649 | */ | 656 | */ |
650 | wait_for_xmitr(up); | 657 | wait_for_xmitr(up); |
651 | serial_out(up, UART_IER, ier); | 658 | serial_out(up, UART_IER, ier); |
659 | |||
660 | clk_disable(up->clk); | ||
652 | } | 661 | } |
653 | 662 | ||
654 | static int __init | 663 | static int __init |
@@ -662,7 +671,9 @@ serial_pxa_console_setup(struct console *co, char *options) | |||
662 | 671 | ||
663 | if (co->index == -1 || co->index >= serial_pxa_reg.nr) | 672 | if (co->index == -1 || co->index >= serial_pxa_reg.nr) |
664 | co->index = 0; | 673 | co->index = 0; |
665 | up = &serial_pxa_ports[co->index]; | 674 | up = serial_pxa_ports[co->index]; |
675 | if (!up) | ||
676 | return -ENODEV; | ||
666 | 677 | ||
667 | if (options) | 678 | if (options) |
668 | uart_parse_options(options, &baud, &parity, &bits, &flow); | 679 | uart_parse_options(options, &baud, &parity, &bits, &flow); |
@@ -680,15 +691,6 @@ static struct console serial_pxa_console = { | |||
680 | .data = &serial_pxa_reg, | 691 | .data = &serial_pxa_reg, |
681 | }; | 692 | }; |
682 | 693 | ||
683 | static int __init | ||
684 | serial_pxa_console_init(void) | ||
685 | { | ||
686 | register_console(&serial_pxa_console); | ||
687 | return 0; | ||
688 | } | ||
689 | |||
690 | console_initcall(serial_pxa_console_init); | ||
691 | |||
692 | #define PXA_CONSOLE &serial_pxa_console | 694 | #define PXA_CONSOLE &serial_pxa_console |
693 | #else | 695 | #else |
694 | #define PXA_CONSOLE NULL | 696 | #define PXA_CONSOLE NULL |
@@ -714,73 +716,13 @@ struct uart_ops serial_pxa_pops = { | |||
714 | .verify_port = serial_pxa_verify_port, | 716 | .verify_port = serial_pxa_verify_port, |
715 | }; | 717 | }; |
716 | 718 | ||
717 | static struct uart_pxa_port serial_pxa_ports[] = { | ||
718 | { /* FFUART */ | ||
719 | .name = "FFUART", | ||
720 | .cken = CKEN_FFUART, | ||
721 | .port = { | ||
722 | .type = PORT_PXA, | ||
723 | .iotype = UPIO_MEM, | ||
724 | .membase = (void *)&FFUART, | ||
725 | .mapbase = __PREG(FFUART), | ||
726 | .irq = IRQ_FFUART, | ||
727 | .uartclk = 921600 * 16, | ||
728 | .fifosize = 64, | ||
729 | .ops = &serial_pxa_pops, | ||
730 | .line = 0, | ||
731 | }, | ||
732 | }, { /* BTUART */ | ||
733 | .name = "BTUART", | ||
734 | .cken = CKEN_BTUART, | ||
735 | .port = { | ||
736 | .type = PORT_PXA, | ||
737 | .iotype = UPIO_MEM, | ||
738 | .membase = (void *)&BTUART, | ||
739 | .mapbase = __PREG(BTUART), | ||
740 | .irq = IRQ_BTUART, | ||
741 | .uartclk = 921600 * 16, | ||
742 | .fifosize = 64, | ||
743 | .ops = &serial_pxa_pops, | ||
744 | .line = 1, | ||
745 | }, | ||
746 | }, { /* STUART */ | ||
747 | .name = "STUART", | ||
748 | .cken = CKEN_STUART, | ||
749 | .port = { | ||
750 | .type = PORT_PXA, | ||
751 | .iotype = UPIO_MEM, | ||
752 | .membase = (void *)&STUART, | ||
753 | .mapbase = __PREG(STUART), | ||
754 | .irq = IRQ_STUART, | ||
755 | .uartclk = 921600 * 16, | ||
756 | .fifosize = 64, | ||
757 | .ops = &serial_pxa_pops, | ||
758 | .line = 2, | ||
759 | }, | ||
760 | }, { /* HWUART */ | ||
761 | .name = "HWUART", | ||
762 | .cken = CKEN_HWUART, | ||
763 | .port = { | ||
764 | .type = PORT_PXA, | ||
765 | .iotype = UPIO_MEM, | ||
766 | .membase = (void *)&HWUART, | ||
767 | .mapbase = __PREG(HWUART), | ||
768 | .irq = IRQ_HWUART, | ||
769 | .uartclk = 921600 * 16, | ||
770 | .fifosize = 64, | ||
771 | .ops = &serial_pxa_pops, | ||
772 | .line = 3, | ||
773 | }, | ||
774 | } | ||
775 | }; | ||
776 | |||
777 | static struct uart_driver serial_pxa_reg = { | 719 | static struct uart_driver serial_pxa_reg = { |
778 | .owner = THIS_MODULE, | 720 | .owner = THIS_MODULE, |
779 | .driver_name = "PXA serial", | 721 | .driver_name = "PXA serial", |
780 | .dev_name = "ttyS", | 722 | .dev_name = "ttyS", |
781 | .major = TTY_MAJOR, | 723 | .major = TTY_MAJOR, |
782 | .minor = 64, | 724 | .minor = 64, |
783 | .nr = ARRAY_SIZE(serial_pxa_ports), | 725 | .nr = 4, |
784 | .cons = PXA_CONSOLE, | 726 | .cons = PXA_CONSOLE, |
785 | }; | 727 | }; |
786 | 728 | ||
@@ -806,10 +748,68 @@ static int serial_pxa_resume(struct platform_device *dev) | |||
806 | 748 | ||
807 | static int serial_pxa_probe(struct platform_device *dev) | 749 | static int serial_pxa_probe(struct platform_device *dev) |
808 | { | 750 | { |
809 | serial_pxa_ports[dev->id].port.dev = &dev->dev; | 751 | struct uart_pxa_port *sport; |
810 | uart_add_one_port(&serial_pxa_reg, &serial_pxa_ports[dev->id].port); | 752 | struct resource *mmres, *irqres; |
811 | platform_set_drvdata(dev, &serial_pxa_ports[dev->id]); | 753 | int ret; |
754 | |||
755 | mmres = platform_get_resource(dev, IORESOURCE_MEM, 0); | ||
756 | irqres = platform_get_resource(dev, IORESOURCE_IRQ, 0); | ||
757 | if (!mmres || !irqres) | ||
758 | return -ENODEV; | ||
759 | |||
760 | sport = kzalloc(sizeof(struct uart_pxa_port), GFP_KERNEL); | ||
761 | if (!sport) | ||
762 | return -ENOMEM; | ||
763 | |||
764 | sport->clk = clk_get(&dev->dev, "UARTCLK"); | ||
765 | if (IS_ERR(sport->clk)) { | ||
766 | ret = PTR_ERR(sport->clk); | ||
767 | goto err_free; | ||
768 | } | ||
769 | |||
770 | sport->port.type = PORT_PXA; | ||
771 | sport->port.iotype = UPIO_MEM; | ||
772 | sport->port.mapbase = mmres->start; | ||
773 | sport->port.irq = irqres->start; | ||
774 | sport->port.fifosize = 64; | ||
775 | sport->port.ops = &serial_pxa_pops; | ||
776 | sport->port.line = dev->id; | ||
777 | sport->port.dev = &dev->dev; | ||
778 | sport->port.flags = UPF_IOREMAP | UPF_BOOT_AUTOCONF; | ||
779 | sport->port.uartclk = clk_get_rate(sport->clk); | ||
780 | |||
781 | /* | ||
782 | * Is it worth keeping this? | ||
783 | */ | ||
784 | if (mmres->start == __PREG(FFUART)) | ||
785 | sport->name = "FFUART"; | ||
786 | else if (mmres->start == __PREG(BTUART)) | ||
787 | sport->name = "BTUART"; | ||
788 | else if (mmres->start == __PREG(STUART)) | ||
789 | sport->name = "STUART"; | ||
790 | else if (mmres->start == __PREG(HWUART)) | ||
791 | sport->name = "HWUART"; | ||
792 | else | ||
793 | sport->name = "???"; | ||
794 | |||
795 | sport->port.membase = ioremap(mmres->start, mmres->end - mmres->start + 1); | ||
796 | if (!sport->port.membase) { | ||
797 | ret = -ENOMEM; | ||
798 | goto err_clk; | ||
799 | } | ||
800 | |||
801 | serial_pxa_ports[dev->id] = sport; | ||
802 | |||
803 | uart_add_one_port(&serial_pxa_reg, &sport->port); | ||
804 | platform_set_drvdata(dev, sport); | ||
805 | |||
812 | return 0; | 806 | return 0; |
807 | |||
808 | err_clk: | ||
809 | clk_put(sport->clk); | ||
810 | err_free: | ||
811 | kfree(sport); | ||
812 | return ret; | ||
813 | } | 813 | } |
814 | 814 | ||
815 | static int serial_pxa_remove(struct platform_device *dev) | 815 | static int serial_pxa_remove(struct platform_device *dev) |
@@ -818,8 +818,9 @@ static int serial_pxa_remove(struct platform_device *dev) | |||
818 | 818 | ||
819 | platform_set_drvdata(dev, NULL); | 819 | platform_set_drvdata(dev, NULL); |
820 | 820 | ||
821 | if (sport) | 821 | uart_remove_one_port(&serial_pxa_reg, &sport->port); |
822 | uart_remove_one_port(&serial_pxa_reg, &sport->port); | 822 | clk_put(sport->clk); |
823 | kfree(sport); | ||
823 | 824 | ||
824 | return 0; | 825 | return 0; |
825 | } | 826 | } |
diff --git a/drivers/serial/serial_core.c b/drivers/serial/serial_core.c index a055f58f342f..a3bd3a3f41f3 100644 --- a/drivers/serial/serial_core.c +++ b/drivers/serial/serial_core.c | |||
@@ -2127,6 +2127,14 @@ uart_configure_port(struct uart_driver *drv, struct uart_state *state, | |||
2127 | spin_unlock_irqrestore(&port->lock, flags); | 2127 | spin_unlock_irqrestore(&port->lock, flags); |
2128 | 2128 | ||
2129 | /* | 2129 | /* |
2130 | * If this driver supports console, and it hasn't been | ||
2131 | * successfully registered yet, try to re-register it. | ||
2132 | * It may be that the port was not available. | ||
2133 | */ | ||
2134 | if (port->cons && !(port->cons->flags & CON_ENABLED)) | ||
2135 | register_console(port->cons); | ||
2136 | |||
2137 | /* | ||
2130 | * Power down all ports by default, except the | 2138 | * Power down all ports by default, except the |
2131 | * console if we have one. | 2139 | * console if we have one. |
2132 | */ | 2140 | */ |
@@ -2286,6 +2294,7 @@ int uart_add_one_port(struct uart_driver *drv, struct uart_port *port) | |||
2286 | } | 2294 | } |
2287 | 2295 | ||
2288 | state->port = port; | 2296 | state->port = port; |
2297 | state->pm_state = -1; | ||
2289 | 2298 | ||
2290 | port->cons = drv->cons; | 2299 | port->cons = drv->cons; |
2291 | port->info = state->info; | 2300 | port->info = state->info; |
@@ -2308,15 +2317,6 @@ int uart_add_one_port(struct uart_driver *drv, struct uart_port *port) | |||
2308 | tty_register_device(drv->tty_driver, port->line, port->dev); | 2317 | tty_register_device(drv->tty_driver, port->line, port->dev); |
2309 | 2318 | ||
2310 | /* | 2319 | /* |
2311 | * If this driver supports console, and it hasn't been | ||
2312 | * successfully registered yet, try to re-register it. | ||
2313 | * It may be that the port was not available. | ||
2314 | */ | ||
2315 | if (port->type != PORT_UNKNOWN && | ||
2316 | port->cons && !(port->cons->flags & CON_ENABLED)) | ||
2317 | register_console(port->cons); | ||
2318 | |||
2319 | /* | ||
2320 | * Ensure UPF_DEAD is not set. | 2320 | * Ensure UPF_DEAD is not set. |
2321 | */ | 2321 | */ |
2322 | port->flags &= ~UPF_DEAD; | 2322 | port->flags &= ~UPF_DEAD; |
diff --git a/drivers/usb/gadget/pxa2xx_udc.c b/drivers/usb/gadget/pxa2xx_udc.c index 3e715082de36..3173b39f0bfd 100644 --- a/drivers/usb/gadget/pxa2xx_udc.c +++ b/drivers/usb/gadget/pxa2xx_udc.c | |||
@@ -43,6 +43,8 @@ | |||
43 | #include <linux/platform_device.h> | 43 | #include <linux/platform_device.h> |
44 | #include <linux/dma-mapping.h> | 44 | #include <linux/dma-mapping.h> |
45 | #include <linux/irq.h> | 45 | #include <linux/irq.h> |
46 | #include <linux/clk.h> | ||
47 | #include <linux/err.h> | ||
46 | 48 | ||
47 | #include <asm/byteorder.h> | 49 | #include <asm/byteorder.h> |
48 | #include <asm/dma.h> | 50 | #include <asm/dma.h> |
@@ -1157,7 +1159,7 @@ static void udc_disable(struct pxa2xx_udc *dev) | |||
1157 | 1159 | ||
1158 | #ifdef CONFIG_ARCH_PXA | 1160 | #ifdef CONFIG_ARCH_PXA |
1159 | /* Disable clock for USB device */ | 1161 | /* Disable clock for USB device */ |
1160 | pxa_set_cken(CKEN_USB, 0); | 1162 | clk_disable(dev->clk); |
1161 | #endif | 1163 | #endif |
1162 | 1164 | ||
1163 | ep0_idle (dev); | 1165 | ep0_idle (dev); |
@@ -1202,8 +1204,7 @@ static void udc_enable (struct pxa2xx_udc *dev) | |||
1202 | 1204 | ||
1203 | #ifdef CONFIG_ARCH_PXA | 1205 | #ifdef CONFIG_ARCH_PXA |
1204 | /* Enable clock for USB device */ | 1206 | /* Enable clock for USB device */ |
1205 | pxa_set_cken(CKEN_USB, 1); | 1207 | clk_enable(dev->clk); |
1206 | udelay(5); | ||
1207 | #endif | 1208 | #endif |
1208 | 1209 | ||
1209 | /* try to clear these bits before we enable the udc */ | 1210 | /* try to clear these bits before we enable the udc */ |
@@ -2137,6 +2138,14 @@ static int __init pxa2xx_udc_probe(struct platform_device *pdev) | |||
2137 | if (irq < 0) | 2138 | if (irq < 0) |
2138 | return -ENODEV; | 2139 | return -ENODEV; |
2139 | 2140 | ||
2141 | #ifdef CONFIG_ARCH_PXA | ||
2142 | dev->clk = clk_get(&pdev->dev, "UDCCLK"); | ||
2143 | if (IS_ERR(dev->clk)) { | ||
2144 | retval = PTR_ERR(dev->clk); | ||
2145 | goto err_clk; | ||
2146 | } | ||
2147 | #endif | ||
2148 | |||
2140 | pr_debug("%s: IRQ %d%s%s\n", driver_name, irq, | 2149 | pr_debug("%s: IRQ %d%s%s\n", driver_name, irq, |
2141 | dev->has_cfr ? "" : " (!cfr)", | 2150 | dev->has_cfr ? "" : " (!cfr)", |
2142 | SIZE_STR "(pio)" | 2151 | SIZE_STR "(pio)" |
@@ -2152,11 +2161,10 @@ static int __init pxa2xx_udc_probe(struct platform_device *pdev) | |||
2152 | dev_dbg(&pdev->dev, | 2161 | dev_dbg(&pdev->dev, |
2153 | "can't get vbus gpio %d, err: %d\n", | 2162 | "can't get vbus gpio %d, err: %d\n", |
2154 | dev->mach->gpio_vbus, retval); | 2163 | dev->mach->gpio_vbus, retval); |
2155 | return -EBUSY; | 2164 | goto err_gpio_vbus; |
2156 | } | 2165 | } |
2157 | gpio_direction_input(dev->mach->gpio_vbus); | 2166 | gpio_direction_input(dev->mach->gpio_vbus); |
2158 | vbus_irq = gpio_to_irq(dev->mach->gpio_vbus); | 2167 | vbus_irq = gpio_to_irq(dev->mach->gpio_vbus); |
2159 | set_irq_type(vbus_irq, IRQT_BOTHEDGE); | ||
2160 | } else | 2168 | } else |
2161 | vbus_irq = 0; | 2169 | vbus_irq = 0; |
2162 | 2170 | ||
@@ -2166,9 +2174,7 @@ static int __init pxa2xx_udc_probe(struct platform_device *pdev) | |||
2166 | dev_dbg(&pdev->dev, | 2174 | dev_dbg(&pdev->dev, |
2167 | "can't get pullup gpio %d, err: %d\n", | 2175 | "can't get pullup gpio %d, err: %d\n", |
2168 | dev->mach->gpio_pullup, retval); | 2176 | dev->mach->gpio_pullup, retval); |
2169 | if (dev->mach->gpio_vbus) | 2177 | goto err_gpio_pullup; |
2170 | gpio_free(dev->mach->gpio_vbus); | ||
2171 | return -EBUSY; | ||
2172 | } | 2178 | } |
2173 | gpio_direction_output(dev->mach->gpio_pullup, 0); | 2179 | gpio_direction_output(dev->mach->gpio_pullup, 0); |
2174 | } | 2180 | } |
@@ -2195,11 +2201,7 @@ static int __init pxa2xx_udc_probe(struct platform_device *pdev) | |||
2195 | if (retval != 0) { | 2201 | if (retval != 0) { |
2196 | printk(KERN_ERR "%s: can't get irq %d, err %d\n", | 2202 | printk(KERN_ERR "%s: can't get irq %d, err %d\n", |
2197 | driver_name, irq, retval); | 2203 | driver_name, irq, retval); |
2198 | if (dev->mach->gpio_pullup) | 2204 | goto err_irq1; |
2199 | gpio_free(dev->mach->gpio_pullup); | ||
2200 | if (dev->mach->gpio_vbus) | ||
2201 | gpio_free(dev->mach->gpio_vbus); | ||
2202 | return -EBUSY; | ||
2203 | } | 2205 | } |
2204 | dev->got_irq = 1; | 2206 | dev->got_irq = 1; |
2205 | 2207 | ||
@@ -2213,12 +2215,7 @@ static int __init pxa2xx_udc_probe(struct platform_device *pdev) | |||
2213 | printk(KERN_ERR "%s: can't get irq %i, err %d\n", | 2215 | printk(KERN_ERR "%s: can't get irq %i, err %d\n", |
2214 | driver_name, LUBBOCK_USB_DISC_IRQ, retval); | 2216 | driver_name, LUBBOCK_USB_DISC_IRQ, retval); |
2215 | lubbock_fail0: | 2217 | lubbock_fail0: |
2216 | free_irq(irq, dev); | 2218 | goto err_irq_lub; |
2217 | if (dev->mach->gpio_pullup) | ||
2218 | gpio_free(dev->mach->gpio_pullup); | ||
2219 | if (dev->mach->gpio_vbus) | ||
2220 | gpio_free(dev->mach->gpio_vbus); | ||
2221 | return -EBUSY; | ||
2222 | } | 2219 | } |
2223 | retval = request_irq(LUBBOCK_USB_IRQ, | 2220 | retval = request_irq(LUBBOCK_USB_IRQ, |
2224 | lubbock_vbus_irq, | 2221 | lubbock_vbus_irq, |
@@ -2234,22 +2231,37 @@ lubbock_fail0: | |||
2234 | #endif | 2231 | #endif |
2235 | if (vbus_irq) { | 2232 | if (vbus_irq) { |
2236 | retval = request_irq(vbus_irq, udc_vbus_irq, | 2233 | retval = request_irq(vbus_irq, udc_vbus_irq, |
2237 | IRQF_DISABLED | IRQF_SAMPLE_RANDOM, | 2234 | IRQF_DISABLED | IRQF_SAMPLE_RANDOM | |
2235 | IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, | ||
2238 | driver_name, dev); | 2236 | driver_name, dev); |
2239 | if (retval != 0) { | 2237 | if (retval != 0) { |
2240 | printk(KERN_ERR "%s: can't get irq %i, err %d\n", | 2238 | printk(KERN_ERR "%s: can't get irq %i, err %d\n", |
2241 | driver_name, vbus_irq, retval); | 2239 | driver_name, vbus_irq, retval); |
2242 | free_irq(irq, dev); | 2240 | goto err_vbus_irq; |
2243 | if (dev->mach->gpio_pullup) | ||
2244 | gpio_free(dev->mach->gpio_pullup); | ||
2245 | if (dev->mach->gpio_vbus) | ||
2246 | gpio_free(dev->mach->gpio_vbus); | ||
2247 | return -EBUSY; | ||
2248 | } | 2241 | } |
2249 | } | 2242 | } |
2250 | create_proc_files(); | 2243 | create_proc_files(); |
2251 | 2244 | ||
2252 | return 0; | 2245 | return 0; |
2246 | |||
2247 | err_vbus_irq: | ||
2248 | #ifdef CONFIG_ARCH_LUBBOCK | ||
2249 | free_irq(LUBBOCK_USB_DISC_IRQ, dev); | ||
2250 | err_irq_lub: | ||
2251 | #endif | ||
2252 | free_irq(irq, dev); | ||
2253 | err_irq1: | ||
2254 | if (dev->mach->gpio_pullup) | ||
2255 | gpio_free(dev->mach->gpio_pullup); | ||
2256 | err_gpio_pullup: | ||
2257 | if (dev->mach->gpio_vbus) | ||
2258 | gpio_free(dev->mach->gpio_vbus); | ||
2259 | err_gpio_vbus: | ||
2260 | #ifdef CONFIG_ARCH_PXA | ||
2261 | clk_put(dev->clk); | ||
2262 | err_clk: | ||
2263 | #endif | ||
2264 | return retval; | ||
2253 | } | 2265 | } |
2254 | 2266 | ||
2255 | static void pxa2xx_udc_shutdown(struct platform_device *_dev) | 2267 | static void pxa2xx_udc_shutdown(struct platform_device *_dev) |
@@ -2284,6 +2296,10 @@ static int __exit pxa2xx_udc_remove(struct platform_device *pdev) | |||
2284 | if (dev->mach->gpio_pullup) | 2296 | if (dev->mach->gpio_pullup) |
2285 | gpio_free(dev->mach->gpio_pullup); | 2297 | gpio_free(dev->mach->gpio_pullup); |
2286 | 2298 | ||
2299 | #ifdef CONFIG_ARCH_PXA | ||
2300 | clk_put(dev->clk); | ||
2301 | #endif | ||
2302 | |||
2287 | platform_set_drvdata(pdev, NULL); | 2303 | platform_set_drvdata(pdev, NULL); |
2288 | the_controller = NULL; | 2304 | the_controller = NULL; |
2289 | return 0; | 2305 | return 0; |
diff --git a/drivers/usb/gadget/pxa2xx_udc.h b/drivers/usb/gadget/pxa2xx_udc.h index 0e5d0e6fb0e2..1db46d705777 100644 --- a/drivers/usb/gadget/pxa2xx_udc.h +++ b/drivers/usb/gadget/pxa2xx_udc.h | |||
@@ -125,6 +125,7 @@ struct pxa2xx_udc { | |||
125 | struct timer_list timer; | 125 | struct timer_list timer; |
126 | 126 | ||
127 | struct device *dev; | 127 | struct device *dev; |
128 | struct clk *clk; | ||
128 | struct pxa2xx_udc_mach_info *mach; | 129 | struct pxa2xx_udc_mach_info *mach; |
129 | u64 dma_mask; | 130 | u64 dma_mask; |
130 | struct pxa2xx_ep ep [PXA_UDC_NUM_ENDPOINTS]; | 131 | struct pxa2xx_ep ep [PXA_UDC_NUM_ENDPOINTS]; |
diff --git a/drivers/video/pxafb.c b/drivers/video/pxafb.c index a280a52f8efe..f9b12ab59642 100644 --- a/drivers/video/pxafb.c +++ b/drivers/video/pxafb.c | |||
@@ -37,6 +37,8 @@ | |||
37 | #include <linux/cpufreq.h> | 37 | #include <linux/cpufreq.h> |
38 | #include <linux/platform_device.h> | 38 | #include <linux/platform_device.h> |
39 | #include <linux/dma-mapping.h> | 39 | #include <linux/dma-mapping.h> |
40 | #include <linux/clk.h> | ||
41 | #include <linux/err.h> | ||
40 | 42 | ||
41 | #include <asm/hardware.h> | 43 | #include <asm/hardware.h> |
42 | #include <asm/io.h> | 44 | #include <asm/io.h> |
@@ -506,15 +508,15 @@ static struct fb_ops pxafb_ops = { | |||
506 | * | 508 | * |
507 | * Factoring the 10^4 and 10^-12 out gives 10^-8 == 1 / 100000000 as used below. | 509 | * Factoring the 10^4 and 10^-12 out gives 10^-8 == 1 / 100000000 as used below. |
508 | */ | 510 | */ |
509 | static inline unsigned int get_pcd(unsigned int pixclock) | 511 | static inline unsigned int get_pcd(struct pxafb_info *fbi, unsigned int pixclock) |
510 | { | 512 | { |
511 | unsigned long long pcd; | 513 | unsigned long long pcd; |
512 | 514 | ||
513 | /* FIXME: Need to take into account Double Pixel Clock mode | 515 | /* FIXME: Need to take into account Double Pixel Clock mode |
514 | * (DPC) bit? or perhaps set it based on the various clock | 516 | * (DPC) bit? or perhaps set it based on the various clock |
515 | * speeds */ | 517 | * speeds */ |
516 | 518 | pcd = (unsigned long long)(clk_get_rate(fbi->clk) / 10000); | |
517 | pcd = (unsigned long long)get_lcdclk_frequency_10khz() * pixclock; | 519 | pcd *= pixclock; |
518 | do_div(pcd, 100000000 * 2); | 520 | do_div(pcd, 100000000 * 2); |
519 | /* no need for this, since we should subtract 1 anyway. they cancel */ | 521 | /* no need for this, since we should subtract 1 anyway. they cancel */ |
520 | /* pcd += 1; */ /* make up for integer math truncations */ | 522 | /* pcd += 1; */ /* make up for integer math truncations */ |
@@ -523,19 +525,21 @@ static inline unsigned int get_pcd(unsigned int pixclock) | |||
523 | 525 | ||
524 | /* | 526 | /* |
525 | * Some touchscreens need hsync information from the video driver to | 527 | * Some touchscreens need hsync information from the video driver to |
526 | * function correctly. We export it here. | 528 | * function correctly. We export it here. Note that 'hsync_time' and |
529 | * the value returned from pxafb_get_hsync_time() is the *reciprocal* | ||
530 | * of the hsync period in seconds. | ||
527 | */ | 531 | */ |
528 | static inline void set_hsync_time(struct pxafb_info *fbi, unsigned int pcd) | 532 | static inline void set_hsync_time(struct pxafb_info *fbi, unsigned int pcd) |
529 | { | 533 | { |
530 | unsigned long long htime; | 534 | unsigned long htime; |
531 | 535 | ||
532 | if ((pcd == 0) || (fbi->fb.var.hsync_len == 0)) { | 536 | if ((pcd == 0) || (fbi->fb.var.hsync_len == 0)) { |
533 | fbi->hsync_time=0; | 537 | fbi->hsync_time=0; |
534 | return; | 538 | return; |
535 | } | 539 | } |
536 | 540 | ||
537 | htime = (unsigned long long)get_lcdclk_frequency_10khz() * 10000; | 541 | htime = clk_get_rate(fbi->clk) / (pcd * fbi->fb.var.hsync_len); |
538 | do_div(htime, pcd * fbi->fb.var.hsync_len); | 542 | |
539 | fbi->hsync_time = htime; | 543 | fbi->hsync_time = htime; |
540 | } | 544 | } |
541 | 545 | ||
@@ -560,7 +564,7 @@ static int pxafb_activate_var(struct fb_var_screeninfo *var, struct pxafb_info * | |||
560 | { | 564 | { |
561 | struct pxafb_lcd_reg new_regs; | 565 | struct pxafb_lcd_reg new_regs; |
562 | u_long flags; | 566 | u_long flags; |
563 | u_int lines_per_panel, pcd = get_pcd(var->pixclock); | 567 | u_int lines_per_panel, pcd = get_pcd(fbi, var->pixclock); |
564 | 568 | ||
565 | pr_debug("pxafb: Configuring PXA LCD\n"); | 569 | pr_debug("pxafb: Configuring PXA LCD\n"); |
566 | 570 | ||
@@ -803,7 +807,7 @@ static void pxafb_enable_controller(struct pxafb_info *fbi) | |||
803 | pr_debug("reg_lccr3 0x%08x\n", (unsigned int) fbi->reg_lccr3); | 807 | pr_debug("reg_lccr3 0x%08x\n", (unsigned int) fbi->reg_lccr3); |
804 | 808 | ||
805 | /* enable LCD controller clock */ | 809 | /* enable LCD controller clock */ |
806 | pxa_set_cken(CKEN_LCD, 1); | 810 | clk_enable(fbi->clk); |
807 | 811 | ||
808 | /* Sequence from 11.7.10 */ | 812 | /* Sequence from 11.7.10 */ |
809 | LCCR3 = fbi->reg_lccr3; | 813 | LCCR3 = fbi->reg_lccr3; |
@@ -840,7 +844,7 @@ static void pxafb_disable_controller(struct pxafb_info *fbi) | |||
840 | remove_wait_queue(&fbi->ctrlr_wait, &wait); | 844 | remove_wait_queue(&fbi->ctrlr_wait, &wait); |
841 | 845 | ||
842 | /* disable LCD controller clock */ | 846 | /* disable LCD controller clock */ |
843 | pxa_set_cken(CKEN_LCD, 0); | 847 | clk_disable(fbi->clk); |
844 | } | 848 | } |
845 | 849 | ||
846 | /* | 850 | /* |
@@ -994,7 +998,7 @@ pxafb_freq_transition(struct notifier_block *nb, unsigned long val, void *data) | |||
994 | break; | 998 | break; |
995 | 999 | ||
996 | case CPUFREQ_POSTCHANGE: | 1000 | case CPUFREQ_POSTCHANGE: |
997 | pcd = get_pcd(fbi->fb.var.pixclock); | 1001 | pcd = get_pcd(fbi, fbi->fb.var.pixclock); |
998 | set_hsync_time(fbi, pcd); | 1002 | set_hsync_time(fbi, pcd); |
999 | fbi->reg_lccr3 = (fbi->reg_lccr3 & ~0xff) | LCCR3_PixClkDiv(pcd); | 1003 | fbi->reg_lccr3 = (fbi->reg_lccr3 & ~0xff) | LCCR3_PixClkDiv(pcd); |
1000 | set_ctrlr_state(fbi, C_ENABLE_CLKCHANGE); | 1004 | set_ctrlr_state(fbi, C_ENABLE_CLKCHANGE); |
@@ -1119,6 +1123,12 @@ static struct pxafb_info * __init pxafb_init_fbinfo(struct device *dev) | |||
1119 | memset(fbi, 0, sizeof(struct pxafb_info)); | 1123 | memset(fbi, 0, sizeof(struct pxafb_info)); |
1120 | fbi->dev = dev; | 1124 | fbi->dev = dev; |
1121 | 1125 | ||
1126 | fbi->clk = clk_get(dev, "LCDCLK"); | ||
1127 | if (IS_ERR(fbi->clk)) { | ||
1128 | kfree(fbi); | ||
1129 | return NULL; | ||
1130 | } | ||
1131 | |||
1122 | strcpy(fbi->fb.fix.id, PXA_NAME); | 1132 | strcpy(fbi->fb.fix.id, PXA_NAME); |
1123 | 1133 | ||
1124 | fbi->fb.fix.type = FB_TYPE_PACKED_PIXELS; | 1134 | fbi->fb.fix.type = FB_TYPE_PACKED_PIXELS; |
diff --git a/drivers/video/pxafb.h b/drivers/video/pxafb.h index 7499a1c4bf79..f8605b807b0a 100644 --- a/drivers/video/pxafb.h +++ b/drivers/video/pxafb.h | |||
@@ -40,6 +40,7 @@ struct pxafb_dma_descriptor { | |||
40 | struct pxafb_info { | 40 | struct pxafb_info { |
41 | struct fb_info fb; | 41 | struct fb_info fb; |
42 | struct device *dev; | 42 | struct device *dev; |
43 | struct clk *clk; | ||
43 | 44 | ||
44 | /* | 45 | /* |
45 | * These are the addresses we mapped | 46 | * These are the addresses we mapped |