diff options
Diffstat (limited to 'drivers')
135 files changed, 5720 insertions, 606 deletions
diff --git a/drivers/ata/Kconfig b/drivers/ata/Kconfig index 9120717c0701..2aa1908e5ce0 100644 --- a/drivers/ata/Kconfig +++ b/drivers/ata/Kconfig | |||
@@ -535,6 +535,15 @@ config PATA_OPTIDMA | |||
535 | 535 | ||
536 | If unsure, say N. | 536 | If unsure, say N. |
537 | 537 | ||
538 | config PATA_PALMLD | ||
539 | tristate "Palm LifeDrive PATA support" | ||
540 | depends on MACH_PALMLD | ||
541 | help | ||
542 | This option enables support for Palm LifeDrive's internal ATA | ||
543 | port via the new ATA layer. | ||
544 | |||
545 | If unsure, say N. | ||
546 | |||
538 | config PATA_PCMCIA | 547 | config PATA_PCMCIA |
539 | tristate "PCMCIA PATA support" | 548 | tristate "PCMCIA PATA support" |
540 | depends on PCMCIA | 549 | depends on PCMCIA |
diff --git a/drivers/ata/Makefile b/drivers/ata/Makefile index 7f1ecf99528c..1558059874f0 100644 --- a/drivers/ata/Makefile +++ b/drivers/ata/Makefile | |||
@@ -50,6 +50,7 @@ obj-$(CONFIG_PATA_MPC52xx) += pata_mpc52xx.o | |||
50 | obj-$(CONFIG_PATA_MARVELL) += pata_marvell.o | 50 | obj-$(CONFIG_PATA_MARVELL) += pata_marvell.o |
51 | obj-$(CONFIG_PATA_MPIIX) += pata_mpiix.o | 51 | obj-$(CONFIG_PATA_MPIIX) += pata_mpiix.o |
52 | obj-$(CONFIG_PATA_OLDPIIX) += pata_oldpiix.o | 52 | obj-$(CONFIG_PATA_OLDPIIX) += pata_oldpiix.o |
53 | obj-$(CONFIG_PATA_PALMLD) += pata_palmld.o | ||
53 | obj-$(CONFIG_PATA_PCMCIA) += pata_pcmcia.o | 54 | obj-$(CONFIG_PATA_PCMCIA) += pata_pcmcia.o |
54 | obj-$(CONFIG_PATA_PDC2027X) += pata_pdc2027x.o | 55 | obj-$(CONFIG_PATA_PDC2027X) += pata_pdc2027x.o |
55 | obj-$(CONFIG_PATA_PDC_OLD) += pata_pdc202xx_old.o | 56 | obj-$(CONFIG_PATA_PDC_OLD) += pata_pdc202xx_old.o |
diff --git a/drivers/ata/libata-acpi.c b/drivers/ata/libata-acpi.c index 6273d98d00eb..ac176da1f94e 100644 --- a/drivers/ata/libata-acpi.c +++ b/drivers/ata/libata-acpi.c | |||
@@ -748,9 +748,9 @@ static int ata_acpi_run_tf(struct ata_device *dev, | |||
748 | /** | 748 | /** |
749 | * ata_acpi_exec_tfs - get then write drive taskfile settings | 749 | * ata_acpi_exec_tfs - get then write drive taskfile settings |
750 | * @dev: target ATA device | 750 | * @dev: target ATA device |
751 | * @nr_executed: out paramter for the number of executed commands | 751 | * @nr_executed: out parameter for the number of executed commands |
752 | * | 752 | * |
753 | * Evaluate _GTF and excute returned taskfiles. | 753 | * Evaluate _GTF and execute returned taskfiles. |
754 | * | 754 | * |
755 | * LOCKING: | 755 | * LOCKING: |
756 | * EH context. | 756 | * EH context. |
diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c index 94919ad03df1..fa22f94ca415 100644 --- a/drivers/ata/libata-eh.c +++ b/drivers/ata/libata-eh.c | |||
@@ -2864,7 +2864,7 @@ static int ata_eh_revalidate_and_attach(struct ata_link *link, | |||
2864 | /** | 2864 | /** |
2865 | * ata_set_mode - Program timings and issue SET FEATURES - XFER | 2865 | * ata_set_mode - Program timings and issue SET FEATURES - XFER |
2866 | * @link: link on which timings will be programmed | 2866 | * @link: link on which timings will be programmed |
2867 | * @r_failed_dev: out paramter for failed device | 2867 | * @r_failed_dev: out parameter for failed device |
2868 | * | 2868 | * |
2869 | * Set ATA device disk transfer mode (PIO3, UDMA6, etc.). If | 2869 | * Set ATA device disk transfer mode (PIO3, UDMA6, etc.). If |
2870 | * ata_set_mode() fails, pointer to the failing device is | 2870 | * ata_set_mode() fails, pointer to the failing device is |
diff --git a/drivers/ata/pata_palmld.c b/drivers/ata/pata_palmld.c new file mode 100644 index 000000000000..11fb4ccc74b4 --- /dev/null +++ b/drivers/ata/pata_palmld.c | |||
@@ -0,0 +1,150 @@ | |||
1 | /* | ||
2 | * drivers/ata/pata_palmld.c | ||
3 | * | ||
4 | * Driver for IDE channel in Palm LifeDrive | ||
5 | * | ||
6 | * Based on research of: | ||
7 | * Alex Osborne <ato@meshy.org> | ||
8 | * | ||
9 | * Rewrite for mainline: | ||
10 | * Marek Vasut <marek.vasut@gmail.com> | ||
11 | * | ||
12 | * Rewritten version based on pata_ixp4xx_cf.c: | ||
13 | * ixp4xx PATA/Compact Flash driver | ||
14 | * Copyright (C) 2006-07 Tower Technologies | ||
15 | * Author: Alessandro Zummo <a.zummo@towertech.it> | ||
16 | * | ||
17 | * This program is free software; you can redistribute it and/or modify | ||
18 | * it under the terms of the GNU General Public License version 2 as | ||
19 | * published by the Free Software Foundation. | ||
20 | * | ||
21 | */ | ||
22 | |||
23 | #include <linux/kernel.h> | ||
24 | #include <linux/module.h> | ||
25 | #include <linux/libata.h> | ||
26 | #include <linux/irq.h> | ||
27 | #include <linux/platform_device.h> | ||
28 | #include <linux/delay.h> | ||
29 | #include <linux/gpio.h> | ||
30 | |||
31 | #include <scsi/scsi_host.h> | ||
32 | #include <mach/palmld.h> | ||
33 | |||
34 | #define DRV_NAME "pata_palmld" | ||
35 | |||
36 | static struct scsi_host_template palmld_sht = { | ||
37 | ATA_PIO_SHT(DRV_NAME), | ||
38 | }; | ||
39 | |||
40 | static struct ata_port_operations palmld_port_ops = { | ||
41 | .inherits = &ata_sff_port_ops, | ||
42 | .sff_data_xfer = ata_sff_data_xfer_noirq, | ||
43 | .cable_detect = ata_cable_40wire, | ||
44 | }; | ||
45 | |||
46 | static __devinit int palmld_pata_probe(struct platform_device *pdev) | ||
47 | { | ||
48 | struct ata_host *host; | ||
49 | struct ata_port *ap; | ||
50 | void __iomem *mem; | ||
51 | int ret; | ||
52 | |||
53 | /* allocate host */ | ||
54 | host = ata_host_alloc(&pdev->dev, 1); | ||
55 | if (!host) | ||
56 | return -ENOMEM; | ||
57 | |||
58 | /* remap drive's physical memory address */ | ||
59 | mem = devm_ioremap(&pdev->dev, PALMLD_IDE_PHYS, 0x1000); | ||
60 | if (!mem) | ||
61 | return -ENOMEM; | ||
62 | |||
63 | /* request and activate power GPIO, IRQ GPIO */ | ||
64 | ret = gpio_request(GPIO_NR_PALMLD_IDE_PWEN, "HDD PWR"); | ||
65 | if (ret) | ||
66 | goto err1; | ||
67 | ret = gpio_direction_output(GPIO_NR_PALMLD_IDE_PWEN, 1); | ||
68 | if (ret) | ||
69 | goto err2; | ||
70 | |||
71 | ret = gpio_request(GPIO_NR_PALMLD_IDE_RESET, "HDD RST"); | ||
72 | if (ret) | ||
73 | goto err2; | ||
74 | ret = gpio_direction_output(GPIO_NR_PALMLD_IDE_RESET, 0); | ||
75 | if (ret) | ||
76 | goto err3; | ||
77 | |||
78 | /* reset the drive */ | ||
79 | gpio_set_value(GPIO_NR_PALMLD_IDE_RESET, 0); | ||
80 | msleep(30); | ||
81 | gpio_set_value(GPIO_NR_PALMLD_IDE_RESET, 1); | ||
82 | msleep(30); | ||
83 | |||
84 | /* setup the ata port */ | ||
85 | ap = host->ports[0]; | ||
86 | ap->ops = &palmld_port_ops; | ||
87 | ap->pio_mask = ATA_PIO4; | ||
88 | ap->flags |= ATA_FLAG_MMIO | ATA_FLAG_NO_LEGACY | ATA_FLAG_PIO_POLLING; | ||
89 | |||
90 | /* memory mapping voodoo */ | ||
91 | ap->ioaddr.cmd_addr = mem + 0x10; | ||
92 | ap->ioaddr.altstatus_addr = mem + 0xe; | ||
93 | ap->ioaddr.ctl_addr = mem + 0xe; | ||
94 | |||
95 | /* start the port */ | ||
96 | ata_sff_std_ports(&ap->ioaddr); | ||
97 | |||
98 | /* activate host */ | ||
99 | return ata_host_activate(host, 0, NULL, IRQF_TRIGGER_RISING, | ||
100 | &palmld_sht); | ||
101 | |||
102 | err3: | ||
103 | gpio_free(GPIO_NR_PALMLD_IDE_RESET); | ||
104 | err2: | ||
105 | gpio_free(GPIO_NR_PALMLD_IDE_PWEN); | ||
106 | err1: | ||
107 | return ret; | ||
108 | } | ||
109 | |||
110 | static __devexit int palmld_pata_remove(struct platform_device *dev) | ||
111 | { | ||
112 | struct ata_host *host = platform_get_drvdata(dev); | ||
113 | |||
114 | ata_host_detach(host); | ||
115 | |||
116 | /* power down the HDD */ | ||
117 | gpio_set_value(GPIO_NR_PALMLD_IDE_PWEN, 0); | ||
118 | |||
119 | gpio_free(GPIO_NR_PALMLD_IDE_RESET); | ||
120 | gpio_free(GPIO_NR_PALMLD_IDE_PWEN); | ||
121 | |||
122 | return 0; | ||
123 | } | ||
124 | |||
125 | static struct platform_driver palmld_pata_platform_driver = { | ||
126 | .driver = { | ||
127 | .name = DRV_NAME, | ||
128 | .owner = THIS_MODULE, | ||
129 | }, | ||
130 | .probe = palmld_pata_probe, | ||
131 | .remove = __devexit_p(palmld_pata_remove), | ||
132 | }; | ||
133 | |||
134 | static int __init palmld_pata_init(void) | ||
135 | { | ||
136 | return platform_driver_register(&palmld_pata_platform_driver); | ||
137 | } | ||
138 | |||
139 | static void __exit palmld_pata_exit(void) | ||
140 | { | ||
141 | platform_driver_unregister(&palmld_pata_platform_driver); | ||
142 | } | ||
143 | |||
144 | MODULE_AUTHOR("Marek Vasut <marek.vasut@gmail.com>"); | ||
145 | MODULE_DESCRIPTION("PalmLD PATA driver"); | ||
146 | MODULE_LICENSE("GPL"); | ||
147 | MODULE_ALIAS("platform:" DRV_NAME); | ||
148 | |||
149 | module_init(palmld_pata_init); | ||
150 | module_exit(palmld_pata_exit); | ||
diff --git a/drivers/base/bus.c b/drivers/base/bus.c index c6599618523e..4b04a15146d7 100644 --- a/drivers/base/bus.c +++ b/drivers/base/bus.c | |||
@@ -279,7 +279,7 @@ static struct device *next_device(struct klist_iter *i) | |||
279 | * | 279 | * |
280 | * NOTE: The device that returns a non-zero value is not retained | 280 | * NOTE: The device that returns a non-zero value is not retained |
281 | * in any way, nor is its refcount incremented. If the caller needs | 281 | * in any way, nor is its refcount incremented. If the caller needs |
282 | * to retain this data, it should do, and increment the reference | 282 | * to retain this data, it should do so, and increment the reference |
283 | * count in the supplied callback. | 283 | * count in the supplied callback. |
284 | */ | 284 | */ |
285 | int bus_for_each_dev(struct bus_type *bus, struct device *start, | 285 | int bus_for_each_dev(struct bus_type *bus, struct device *start, |
diff --git a/drivers/block/Kconfig b/drivers/block/Kconfig index ac5e05a98b2f..bb72ada9f074 100644 --- a/drivers/block/Kconfig +++ b/drivers/block/Kconfig | |||
@@ -112,7 +112,7 @@ config GDROM | |||
112 | with up to 1 GB of data. This drive will also read standard CD ROM | 112 | with up to 1 GB of data. This drive will also read standard CD ROM |
113 | disks. Select this option to access any disks in your GD ROM drive. | 113 | disks. Select this option to access any disks in your GD ROM drive. |
114 | Most users will want to say "Y" here. | 114 | Most users will want to say "Y" here. |
115 | You can also build this as a module which will be called gdrom.ko | 115 | You can also build this as a module which will be called gdrom. |
116 | 116 | ||
117 | source "drivers/block/paride/Kconfig" | 117 | source "drivers/block/paride/Kconfig" |
118 | 118 | ||
diff --git a/drivers/char/Kconfig b/drivers/char/Kconfig index b1e9652c0d9d..30bae6de6a0d 100644 --- a/drivers/char/Kconfig +++ b/drivers/char/Kconfig | |||
@@ -692,7 +692,7 @@ config HVCS | |||
692 | this driver. | 692 | this driver. |
693 | 693 | ||
694 | To compile this driver as a module, choose M here: the | 694 | To compile this driver as a module, choose M here: the |
695 | module will be called hvcs.ko. Additionally, this module | 695 | module will be called hvcs. Additionally, this module |
696 | will depend on arch specific APIs exported from hvcserver.ko | 696 | will depend on arch specific APIs exported from hvcserver.ko |
697 | which will also be compiled when this driver is built as a | 697 | which will also be compiled when this driver is built as a |
698 | module. | 698 | module. |
diff --git a/drivers/char/amiserial.c b/drivers/char/amiserial.c index fd3ebd1be570..72429b6b2fa8 100644 --- a/drivers/char/amiserial.c +++ b/drivers/char/amiserial.c | |||
@@ -779,7 +779,7 @@ static void change_speed(struct async_struct *info, | |||
779 | info->IER |= UART_IER_MSI; | 779 | info->IER |= UART_IER_MSI; |
780 | } | 780 | } |
781 | /* TBD: | 781 | /* TBD: |
782 | * Does clearing IER_MSI imply that we should disbale the VBL interrupt ? | 782 | * Does clearing IER_MSI imply that we should disable the VBL interrupt ? |
783 | */ | 783 | */ |
784 | 784 | ||
785 | /* | 785 | /* |
diff --git a/drivers/char/hw_random/Kconfig b/drivers/char/hw_random/Kconfig index 5fab6470f4b2..f4b3f7293feb 100644 --- a/drivers/char/hw_random/Kconfig +++ b/drivers/char/hw_random/Kconfig | |||
@@ -88,7 +88,7 @@ config HW_RANDOM_N2RNG | |||
88 | 88 | ||
89 | config HW_RANDOM_VIA | 89 | config HW_RANDOM_VIA |
90 | tristate "VIA HW Random Number Generator support" | 90 | tristate "VIA HW Random Number Generator support" |
91 | depends on HW_RANDOM && X86_32 | 91 | depends on HW_RANDOM && X86 |
92 | default HW_RANDOM | 92 | default HW_RANDOM |
93 | ---help--- | 93 | ---help--- |
94 | This driver provides kernel-side support for the Random Number | 94 | This driver provides kernel-side support for the Random Number |
@@ -148,3 +148,15 @@ config HW_RANDOM_VIRTIO | |||
148 | 148 | ||
149 | To compile this driver as a module, choose M here: the | 149 | To compile this driver as a module, choose M here: the |
150 | module will be called virtio-rng. If unsure, say N. | 150 | module will be called virtio-rng. If unsure, say N. |
151 | |||
152 | config HW_RANDOM_MXC_RNGA | ||
153 | tristate "Freescale i.MX RNGA Random Number Generator" | ||
154 | depends on HW_RANDOM && ARCH_HAS_RNGA | ||
155 | ---help--- | ||
156 | This driver provides kernel-side support for the Random Number | ||
157 | Generator hardware found on Freescale i.MX processors. | ||
158 | |||
159 | To compile this driver as a module, choose M here: the | ||
160 | module will be called mxc-rnga. | ||
161 | |||
162 | If unsure, say Y. | ||
diff --git a/drivers/char/hw_random/Makefile b/drivers/char/hw_random/Makefile index e81d21a5f28f..fd1ecd2f6731 100644 --- a/drivers/char/hw_random/Makefile +++ b/drivers/char/hw_random/Makefile | |||
@@ -15,3 +15,4 @@ obj-$(CONFIG_HW_RANDOM_IXP4XX) += ixp4xx-rng.o | |||
15 | obj-$(CONFIG_HW_RANDOM_OMAP) += omap-rng.o | 15 | obj-$(CONFIG_HW_RANDOM_OMAP) += omap-rng.o |
16 | obj-$(CONFIG_HW_RANDOM_PASEMI) += pasemi-rng.o | 16 | obj-$(CONFIG_HW_RANDOM_PASEMI) += pasemi-rng.o |
17 | obj-$(CONFIG_HW_RANDOM_VIRTIO) += virtio-rng.o | 17 | obj-$(CONFIG_HW_RANDOM_VIRTIO) += virtio-rng.o |
18 | obj-$(CONFIG_HW_RANDOM_MXC_RNGA) += mxc-rnga.o | ||
diff --git a/drivers/char/hw_random/mxc-rnga.c b/drivers/char/hw_random/mxc-rnga.c new file mode 100644 index 000000000000..187c6be80f43 --- /dev/null +++ b/drivers/char/hw_random/mxc-rnga.c | |||
@@ -0,0 +1,247 @@ | |||
1 | /* | ||
2 | * RNG driver for Freescale RNGA | ||
3 | * | ||
4 | * Copyright 2008-2009 Freescale Semiconductor, Inc. All Rights Reserved. | ||
5 | * Author: Alan Carvalho de Assis <acassis@gmail.com> | ||
6 | */ | ||
7 | |||
8 | /* | ||
9 | * The code contained herein is licensed under the GNU General Public | ||
10 | * License. You may obtain a copy of the GNU General Public License | ||
11 | * Version 2 or later at the following locations: | ||
12 | * | ||
13 | * http://www.opensource.org/licenses/gpl-license.html | ||
14 | * http://www.gnu.org/copyleft/gpl.html | ||
15 | * | ||
16 | * This driver is based on other RNG drivers. | ||
17 | */ | ||
18 | |||
19 | #include <linux/module.h> | ||
20 | #include <linux/init.h> | ||
21 | #include <linux/kernel.h> | ||
22 | #include <linux/clk.h> | ||
23 | #include <linux/err.h> | ||
24 | #include <linux/ioport.h> | ||
25 | #include <linux/platform_device.h> | ||
26 | #include <linux/hw_random.h> | ||
27 | #include <linux/io.h> | ||
28 | |||
29 | /* RNGA Registers */ | ||
30 | #define RNGA_CONTROL 0x00 | ||
31 | #define RNGA_STATUS 0x04 | ||
32 | #define RNGA_ENTROPY 0x08 | ||
33 | #define RNGA_OUTPUT_FIFO 0x0c | ||
34 | #define RNGA_MODE 0x10 | ||
35 | #define RNGA_VERIFICATION_CONTROL 0x14 | ||
36 | #define RNGA_OSC_CONTROL_COUNTER 0x18 | ||
37 | #define RNGA_OSC1_COUNTER 0x1c | ||
38 | #define RNGA_OSC2_COUNTER 0x20 | ||
39 | #define RNGA_OSC_COUNTER_STATUS 0x24 | ||
40 | |||
41 | /* RNGA Registers Range */ | ||
42 | #define RNG_ADDR_RANGE 0x28 | ||
43 | |||
44 | /* RNGA Control Register */ | ||
45 | #define RNGA_CONTROL_SLEEP 0x00000010 | ||
46 | #define RNGA_CONTROL_CLEAR_INT 0x00000008 | ||
47 | #define RNGA_CONTROL_MASK_INTS 0x00000004 | ||
48 | #define RNGA_CONTROL_HIGH_ASSURANCE 0x00000002 | ||
49 | #define RNGA_CONTROL_GO 0x00000001 | ||
50 | |||
51 | #define RNGA_STATUS_LEVEL_MASK 0x0000ff00 | ||
52 | |||
53 | /* RNGA Status Register */ | ||
54 | #define RNGA_STATUS_OSC_DEAD 0x80000000 | ||
55 | #define RNGA_STATUS_SLEEP 0x00000010 | ||
56 | #define RNGA_STATUS_ERROR_INT 0x00000008 | ||
57 | #define RNGA_STATUS_FIFO_UNDERFLOW 0x00000004 | ||
58 | #define RNGA_STATUS_LAST_READ_STATUS 0x00000002 | ||
59 | #define RNGA_STATUS_SECURITY_VIOLATION 0x00000001 | ||
60 | |||
61 | static struct platform_device *rng_dev; | ||
62 | |||
63 | static int mxc_rnga_data_present(struct hwrng *rng) | ||
64 | { | ||
65 | int level; | ||
66 | void __iomem *rng_base = (void __iomem *)rng->priv; | ||
67 | |||
68 | /* how many random numbers is in FIFO? [0-16] */ | ||
69 | level = ((__raw_readl(rng_base + RNGA_STATUS) & | ||
70 | RNGA_STATUS_LEVEL_MASK) >> 8); | ||
71 | |||
72 | return level > 0 ? 1 : 0; | ||
73 | } | ||
74 | |||
75 | static int mxc_rnga_data_read(struct hwrng *rng, u32 * data) | ||
76 | { | ||
77 | int err; | ||
78 | u32 ctrl; | ||
79 | void __iomem *rng_base = (void __iomem *)rng->priv; | ||
80 | |||
81 | /* retrieve a random number from FIFO */ | ||
82 | *data = __raw_readl(rng_base + RNGA_OUTPUT_FIFO); | ||
83 | |||
84 | /* some error while reading this random number? */ | ||
85 | err = __raw_readl(rng_base + RNGA_STATUS) & RNGA_STATUS_ERROR_INT; | ||
86 | |||
87 | /* if error: clear error interrupt, but doesn't return random number */ | ||
88 | if (err) { | ||
89 | dev_dbg(&rng_dev->dev, "Error while reading random number!\n"); | ||
90 | ctrl = __raw_readl(rng_base + RNGA_CONTROL); | ||
91 | __raw_writel(ctrl | RNGA_CONTROL_CLEAR_INT, | ||
92 | rng_base + RNGA_CONTROL); | ||
93 | return 0; | ||
94 | } else | ||
95 | return 4; | ||
96 | } | ||
97 | |||
98 | static int mxc_rnga_init(struct hwrng *rng) | ||
99 | { | ||
100 | u32 ctrl, osc; | ||
101 | void __iomem *rng_base = (void __iomem *)rng->priv; | ||
102 | |||
103 | /* wake up */ | ||
104 | ctrl = __raw_readl(rng_base + RNGA_CONTROL); | ||
105 | __raw_writel(ctrl & ~RNGA_CONTROL_SLEEP, rng_base + RNGA_CONTROL); | ||
106 | |||
107 | /* verify if oscillator is working */ | ||
108 | osc = __raw_readl(rng_base + RNGA_STATUS); | ||
109 | if (osc & RNGA_STATUS_OSC_DEAD) { | ||
110 | dev_err(&rng_dev->dev, "RNGA Oscillator is dead!\n"); | ||
111 | return -ENODEV; | ||
112 | } | ||
113 | |||
114 | /* go running */ | ||
115 | ctrl = __raw_readl(rng_base + RNGA_CONTROL); | ||
116 | __raw_writel(ctrl | RNGA_CONTROL_GO, rng_base + RNGA_CONTROL); | ||
117 | |||
118 | return 0; | ||
119 | } | ||
120 | |||
121 | static void mxc_rnga_cleanup(struct hwrng *rng) | ||
122 | { | ||
123 | u32 ctrl; | ||
124 | void __iomem *rng_base = (void __iomem *)rng->priv; | ||
125 | |||
126 | ctrl = __raw_readl(rng_base + RNGA_CONTROL); | ||
127 | |||
128 | /* stop rnga */ | ||
129 | __raw_writel(ctrl & ~RNGA_CONTROL_GO, rng_base + RNGA_CONTROL); | ||
130 | } | ||
131 | |||
132 | static struct hwrng mxc_rnga = { | ||
133 | .name = "mxc-rnga", | ||
134 | .init = mxc_rnga_init, | ||
135 | .cleanup = mxc_rnga_cleanup, | ||
136 | .data_present = mxc_rnga_data_present, | ||
137 | .data_read = mxc_rnga_data_read | ||
138 | }; | ||
139 | |||
140 | static int __init mxc_rnga_probe(struct platform_device *pdev) | ||
141 | { | ||
142 | int err = -ENODEV; | ||
143 | struct clk *clk; | ||
144 | struct resource *res, *mem; | ||
145 | void __iomem *rng_base = NULL; | ||
146 | |||
147 | if (rng_dev) | ||
148 | return -EBUSY; | ||
149 | |||
150 | clk = clk_get(&pdev->dev, "rng"); | ||
151 | if (IS_ERR(clk)) { | ||
152 | dev_err(&pdev->dev, "Could not get rng_clk!\n"); | ||
153 | err = PTR_ERR(clk); | ||
154 | goto out; | ||
155 | } | ||
156 | |||
157 | clk_enable(clk); | ||
158 | |||
159 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
160 | if (!res) { | ||
161 | err = -ENOENT; | ||
162 | goto err_region; | ||
163 | } | ||
164 | |||
165 | mem = request_mem_region(res->start, resource_size(res), pdev->name); | ||
166 | if (mem == NULL) { | ||
167 | err = -EBUSY; | ||
168 | goto err_region; | ||
169 | } | ||
170 | |||
171 | rng_base = ioremap(res->start, resource_size(res)); | ||
172 | if (!rng_base) { | ||
173 | err = -ENOMEM; | ||
174 | goto err_ioremap; | ||
175 | } | ||
176 | |||
177 | mxc_rnga.priv = (unsigned long)rng_base; | ||
178 | |||
179 | err = hwrng_register(&mxc_rnga); | ||
180 | if (err) { | ||
181 | dev_err(&pdev->dev, "MXC RNGA registering failed (%d)\n", err); | ||
182 | goto err_register; | ||
183 | } | ||
184 | |||
185 | rng_dev = pdev; | ||
186 | |||
187 | dev_info(&pdev->dev, "MXC RNGA Registered.\n"); | ||
188 | |||
189 | return 0; | ||
190 | |||
191 | err_register: | ||
192 | iounmap(rng_base); | ||
193 | rng_base = NULL; | ||
194 | |||
195 | err_ioremap: | ||
196 | release_mem_region(res->start, resource_size(res)); | ||
197 | |||
198 | err_region: | ||
199 | clk_disable(clk); | ||
200 | clk_put(clk); | ||
201 | |||
202 | out: | ||
203 | return err; | ||
204 | } | ||
205 | |||
206 | static int __exit mxc_rnga_remove(struct platform_device *pdev) | ||
207 | { | ||
208 | struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
209 | void __iomem *rng_base = (void __iomem *)mxc_rnga.priv; | ||
210 | struct clk *clk = clk_get(&pdev->dev, "rng"); | ||
211 | |||
212 | hwrng_unregister(&mxc_rnga); | ||
213 | |||
214 | iounmap(rng_base); | ||
215 | |||
216 | release_mem_region(res->start, resource_size(res)); | ||
217 | |||
218 | clk_disable(clk); | ||
219 | clk_put(clk); | ||
220 | |||
221 | return 0; | ||
222 | } | ||
223 | |||
224 | static struct platform_driver mxc_rnga_driver = { | ||
225 | .driver = { | ||
226 | .name = "mxc_rnga", | ||
227 | .owner = THIS_MODULE, | ||
228 | }, | ||
229 | .remove = __exit_p(mxc_rnga_remove), | ||
230 | }; | ||
231 | |||
232 | static int __init mod_init(void) | ||
233 | { | ||
234 | return platform_driver_probe(&mxc_rnga_driver, mxc_rnga_probe); | ||
235 | } | ||
236 | |||
237 | static void __exit mod_exit(void) | ||
238 | { | ||
239 | platform_driver_unregister(&mxc_rnga_driver); | ||
240 | } | ||
241 | |||
242 | module_init(mod_init); | ||
243 | module_exit(mod_exit); | ||
244 | |||
245 | MODULE_AUTHOR("Freescale Semiconductor, Inc."); | ||
246 | MODULE_DESCRIPTION("H/W RNGA driver for i.MX"); | ||
247 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/char/hw_random/omap-rng.c b/drivers/char/hw_random/omap-rng.c index 538313f9e7ac..00dd3de1be51 100644 --- a/drivers/char/hw_random/omap-rng.c +++ b/drivers/char/hw_random/omap-rng.c | |||
@@ -89,7 +89,7 @@ static struct hwrng omap_rng_ops = { | |||
89 | .data_read = omap_rng_data_read, | 89 | .data_read = omap_rng_data_read, |
90 | }; | 90 | }; |
91 | 91 | ||
92 | static int __init omap_rng_probe(struct platform_device *pdev) | 92 | static int __devinit omap_rng_probe(struct platform_device *pdev) |
93 | { | 93 | { |
94 | struct resource *res, *mem; | 94 | struct resource *res, *mem; |
95 | int ret; | 95 | int ret; |
diff --git a/drivers/char/hw_random/timeriomem-rng.c b/drivers/char/hw_random/timeriomem-rng.c index dcd352ad0e7f..a94e930575f2 100644 --- a/drivers/char/hw_random/timeriomem-rng.c +++ b/drivers/char/hw_random/timeriomem-rng.c | |||
@@ -88,9 +88,9 @@ static struct hwrng timeriomem_rng_ops = { | |||
88 | .priv = 0, | 88 | .priv = 0, |
89 | }; | 89 | }; |
90 | 90 | ||
91 | static int __init timeriomem_rng_probe(struct platform_device *pdev) | 91 | static int __devinit timeriomem_rng_probe(struct platform_device *pdev) |
92 | { | 92 | { |
93 | struct resource *res, *mem; | 93 | struct resource *res; |
94 | int ret; | 94 | int ret; |
95 | 95 | ||
96 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 96 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
@@ -98,21 +98,12 @@ static int __init timeriomem_rng_probe(struct platform_device *pdev) | |||
98 | if (!res) | 98 | if (!res) |
99 | return -ENOENT; | 99 | return -ENOENT; |
100 | 100 | ||
101 | mem = request_mem_region(res->start, res->end - res->start + 1, | ||
102 | pdev->name); | ||
103 | if (mem == NULL) | ||
104 | return -EBUSY; | ||
105 | |||
106 | dev_set_drvdata(&pdev->dev, mem); | ||
107 | |||
108 | timeriomem_rng_data = pdev->dev.platform_data; | 101 | timeriomem_rng_data = pdev->dev.platform_data; |
109 | 102 | ||
110 | timeriomem_rng_data->address = ioremap(res->start, | 103 | timeriomem_rng_data->address = ioremap(res->start, |
111 | res->end - res->start + 1); | 104 | res->end - res->start + 1); |
112 | if (!timeriomem_rng_data->address) { | 105 | if (!timeriomem_rng_data->address) |
113 | ret = -ENOMEM; | 106 | return -EIO; |
114 | goto err_ioremap; | ||
115 | } | ||
116 | 107 | ||
117 | if (timeriomem_rng_data->period != 0 | 108 | if (timeriomem_rng_data->period != 0 |
118 | && usecs_to_jiffies(timeriomem_rng_data->period) > 0) { | 109 | && usecs_to_jiffies(timeriomem_rng_data->period) > 0) { |
@@ -125,7 +116,7 @@ static int __init timeriomem_rng_probe(struct platform_device *pdev) | |||
125 | 116 | ||
126 | ret = hwrng_register(&timeriomem_rng_ops); | 117 | ret = hwrng_register(&timeriomem_rng_ops); |
127 | if (ret) | 118 | if (ret) |
128 | goto err_register; | 119 | goto failed; |
129 | 120 | ||
130 | dev_info(&pdev->dev, "32bits from 0x%p @ %dus\n", | 121 | dev_info(&pdev->dev, "32bits from 0x%p @ %dus\n", |
131 | timeriomem_rng_data->address, | 122 | timeriomem_rng_data->address, |
@@ -133,24 +124,19 @@ static int __init timeriomem_rng_probe(struct platform_device *pdev) | |||
133 | 124 | ||
134 | return 0; | 125 | return 0; |
135 | 126 | ||
136 | err_register: | 127 | failed: |
137 | dev_err(&pdev->dev, "problem registering\n"); | 128 | dev_err(&pdev->dev, "problem registering\n"); |
138 | iounmap(timeriomem_rng_data->address); | 129 | iounmap(timeriomem_rng_data->address); |
139 | err_ioremap: | ||
140 | release_resource(mem); | ||
141 | 130 | ||
142 | return ret; | 131 | return ret; |
143 | } | 132 | } |
144 | 133 | ||
145 | static int __devexit timeriomem_rng_remove(struct platform_device *pdev) | 134 | static int __devexit timeriomem_rng_remove(struct platform_device *pdev) |
146 | { | 135 | { |
147 | struct resource *mem = dev_get_drvdata(&pdev->dev); | ||
148 | |||
149 | del_timer_sync(&timeriomem_rng_timer); | 136 | del_timer_sync(&timeriomem_rng_timer); |
150 | hwrng_unregister(&timeriomem_rng_ops); | 137 | hwrng_unregister(&timeriomem_rng_ops); |
151 | 138 | ||
152 | iounmap(timeriomem_rng_data->address); | 139 | iounmap(timeriomem_rng_data->address); |
153 | release_resource(mem); | ||
154 | 140 | ||
155 | return 0; | 141 | return 0; |
156 | } | 142 | } |
diff --git a/drivers/char/hw_random/via-rng.c b/drivers/char/hw_random/via-rng.c index 4e9573c1d39e..794aacb715c1 100644 --- a/drivers/char/hw_random/via-rng.c +++ b/drivers/char/hw_random/via-rng.c | |||
@@ -132,6 +132,19 @@ static int via_rng_init(struct hwrng *rng) | |||
132 | struct cpuinfo_x86 *c = &cpu_data(0); | 132 | struct cpuinfo_x86 *c = &cpu_data(0); |
133 | u32 lo, hi, old_lo; | 133 | u32 lo, hi, old_lo; |
134 | 134 | ||
135 | /* VIA Nano CPUs don't have the MSR_VIA_RNG anymore. The RNG | ||
136 | * is always enabled if CPUID rng_en is set. There is no | ||
137 | * RNG configuration like it used to be the case in this | ||
138 | * register */ | ||
139 | if ((c->x86 == 6) && (c->x86_model >= 0x0f)) { | ||
140 | if (!cpu_has_xstore_enabled) { | ||
141 | printk(KERN_ERR PFX "can't enable hardware RNG " | ||
142 | "if XSTORE is not enabled\n"); | ||
143 | return -ENODEV; | ||
144 | } | ||
145 | return 0; | ||
146 | } | ||
147 | |||
135 | /* Control the RNG via MSR. Tread lightly and pay very close | 148 | /* Control the RNG via MSR. Tread lightly and pay very close |
136 | * close attention to values written, as the reserved fields | 149 | * close attention to values written, as the reserved fields |
137 | * are documented to be "undefined and unpredictable"; but it | 150 | * are documented to be "undefined and unpredictable"; but it |
@@ -205,5 +218,5 @@ static void __exit mod_exit(void) | |||
205 | module_init(mod_init); | 218 | module_init(mod_init); |
206 | module_exit(mod_exit); | 219 | module_exit(mod_exit); |
207 | 220 | ||
208 | MODULE_DESCRIPTION("H/W RNG driver for VIA chipsets"); | 221 | MODULE_DESCRIPTION("H/W RNG driver for VIA CPU with PadLock"); |
209 | MODULE_LICENSE("GPL"); | 222 | MODULE_LICENSE("GPL"); |
diff --git a/drivers/connector/Kconfig b/drivers/connector/Kconfig index 100bfd422066..6e6730f9dfd1 100644 --- a/drivers/connector/Kconfig +++ b/drivers/connector/Kconfig | |||
@@ -7,7 +7,7 @@ menuconfig CONNECTOR | |||
7 | of the netlink socket protocol. | 7 | of the netlink socket protocol. |
8 | 8 | ||
9 | Connector support can also be built as a module. If so, the module | 9 | Connector support can also be built as a module. If so, the module |
10 | will be called cn.ko. | 10 | will be called cn. |
11 | 11 | ||
12 | if CONNECTOR | 12 | if CONNECTOR |
13 | 13 | ||
diff --git a/drivers/crypto/Kconfig b/drivers/crypto/Kconfig index 01afd758072f..5b27692372bf 100644 --- a/drivers/crypto/Kconfig +++ b/drivers/crypto/Kconfig | |||
@@ -12,7 +12,7 @@ if CRYPTO_HW | |||
12 | 12 | ||
13 | config CRYPTO_DEV_PADLOCK | 13 | config CRYPTO_DEV_PADLOCK |
14 | tristate "Support for VIA PadLock ACE" | 14 | tristate "Support for VIA PadLock ACE" |
15 | depends on X86_32 && !UML | 15 | depends on X86 && !UML |
16 | select CRYPTO_ALGAPI | 16 | select CRYPTO_ALGAPI |
17 | help | 17 | help |
18 | Some VIA processors come with an integrated crypto engine | 18 | Some VIA processors come with an integrated crypto engine |
@@ -34,7 +34,7 @@ config CRYPTO_DEV_PADLOCK_AES | |||
34 | Available in VIA C3 and newer CPUs. | 34 | Available in VIA C3 and newer CPUs. |
35 | 35 | ||
36 | If unsure say M. The compiled module will be | 36 | If unsure say M. The compiled module will be |
37 | called padlock-aes.ko | 37 | called padlock-aes. |
38 | 38 | ||
39 | config CRYPTO_DEV_PADLOCK_SHA | 39 | config CRYPTO_DEV_PADLOCK_SHA |
40 | tristate "PadLock driver for SHA1 and SHA256 algorithms" | 40 | tristate "PadLock driver for SHA1 and SHA256 algorithms" |
@@ -47,7 +47,7 @@ config CRYPTO_DEV_PADLOCK_SHA | |||
47 | Available in VIA C7 and newer processors. | 47 | Available in VIA C7 and newer processors. |
48 | 48 | ||
49 | If unsure say M. The compiled module will be | 49 | If unsure say M. The compiled module will be |
50 | called padlock-sha.ko | 50 | called padlock-sha. |
51 | 51 | ||
52 | config CRYPTO_DEV_GEODE | 52 | config CRYPTO_DEV_GEODE |
53 | tristate "Support for the Geode LX AES engine" | 53 | tristate "Support for the Geode LX AES engine" |
@@ -79,7 +79,7 @@ config ZCRYPT_MONOLITHIC | |||
79 | bool "Monolithic zcrypt module" | 79 | bool "Monolithic zcrypt module" |
80 | depends on ZCRYPT="m" | 80 | depends on ZCRYPT="m" |
81 | help | 81 | help |
82 | Select this option if you want to have a single module z90crypt.ko | 82 | Select this option if you want to have a single module z90crypt, |
83 | that contains all parts of the crypto device driver (ap bus, | 83 | that contains all parts of the crypto device driver (ap bus, |
84 | request router and all the card drivers). | 84 | request router and all the card drivers). |
85 | 85 | ||
diff --git a/drivers/crypto/hifn_795x.c b/drivers/crypto/hifn_795x.c index 2bef086fb342..5f753fc08730 100644 --- a/drivers/crypto/hifn_795x.c +++ b/drivers/crypto/hifn_795x.c | |||
@@ -2564,7 +2564,7 @@ static void hifn_tasklet_callback(unsigned long data) | |||
2564 | hifn_process_queue(dev); | 2564 | hifn_process_queue(dev); |
2565 | } | 2565 | } |
2566 | 2566 | ||
2567 | static int hifn_probe(struct pci_dev *pdev, const struct pci_device_id *id) | 2567 | static int __devinit hifn_probe(struct pci_dev *pdev, const struct pci_device_id *id) |
2568 | { | 2568 | { |
2569 | int err, i; | 2569 | int err, i; |
2570 | struct hifn_device *dev; | 2570 | struct hifn_device *dev; |
@@ -2696,7 +2696,7 @@ err_out_disable_pci_device: | |||
2696 | return err; | 2696 | return err; |
2697 | } | 2697 | } |
2698 | 2698 | ||
2699 | static void hifn_remove(struct pci_dev *pdev) | 2699 | static void __devexit hifn_remove(struct pci_dev *pdev) |
2700 | { | 2700 | { |
2701 | int i; | 2701 | int i; |
2702 | struct hifn_device *dev; | 2702 | struct hifn_device *dev; |
@@ -2744,7 +2744,7 @@ static struct pci_driver hifn_pci_driver = { | |||
2744 | .remove = __devexit_p(hifn_remove), | 2744 | .remove = __devexit_p(hifn_remove), |
2745 | }; | 2745 | }; |
2746 | 2746 | ||
2747 | static int __devinit hifn_init(void) | 2747 | static int __init hifn_init(void) |
2748 | { | 2748 | { |
2749 | unsigned int freq; | 2749 | unsigned int freq; |
2750 | int err; | 2750 | int err; |
@@ -2789,7 +2789,7 @@ static int __devinit hifn_init(void) | |||
2789 | return 0; | 2789 | return 0; |
2790 | } | 2790 | } |
2791 | 2791 | ||
2792 | static void __devexit hifn_fini(void) | 2792 | static void __exit hifn_fini(void) |
2793 | { | 2793 | { |
2794 | pci_unregister_driver(&hifn_pci_driver); | 2794 | pci_unregister_driver(&hifn_pci_driver); |
2795 | 2795 | ||
diff --git a/drivers/crypto/padlock-aes.c b/drivers/crypto/padlock-aes.c index 856b3cc25583..87f92c39b5f0 100644 --- a/drivers/crypto/padlock-aes.c +++ b/drivers/crypto/padlock-aes.c | |||
@@ -154,7 +154,11 @@ static inline void padlock_reset_key(struct cword *cword) | |||
154 | int cpu = raw_smp_processor_id(); | 154 | int cpu = raw_smp_processor_id(); |
155 | 155 | ||
156 | if (cword != per_cpu(last_cword, cpu)) | 156 | if (cword != per_cpu(last_cword, cpu)) |
157 | #ifndef CONFIG_X86_64 | ||
157 | asm volatile ("pushfl; popfl"); | 158 | asm volatile ("pushfl; popfl"); |
159 | #else | ||
160 | asm volatile ("pushfq; popfq"); | ||
161 | #endif | ||
158 | } | 162 | } |
159 | 163 | ||
160 | static inline void padlock_store_cword(struct cword *cword) | 164 | static inline void padlock_store_cword(struct cword *cword) |
@@ -208,10 +212,19 @@ static inline void padlock_xcrypt_ecb(const u8 *input, u8 *output, void *key, | |||
208 | 212 | ||
209 | asm volatile ("test $1, %%cl;" | 213 | asm volatile ("test $1, %%cl;" |
210 | "je 1f;" | 214 | "je 1f;" |
215 | #ifndef CONFIG_X86_64 | ||
211 | "lea -1(%%ecx), %%eax;" | 216 | "lea -1(%%ecx), %%eax;" |
212 | "mov $1, %%ecx;" | 217 | "mov $1, %%ecx;" |
218 | #else | ||
219 | "lea -1(%%rcx), %%rax;" | ||
220 | "mov $1, %%rcx;" | ||
221 | #endif | ||
213 | ".byte 0xf3,0x0f,0xa7,0xc8;" /* rep xcryptecb */ | 222 | ".byte 0xf3,0x0f,0xa7,0xc8;" /* rep xcryptecb */ |
223 | #ifndef CONFIG_X86_64 | ||
214 | "mov %%eax, %%ecx;" | 224 | "mov %%eax, %%ecx;" |
225 | #else | ||
226 | "mov %%rax, %%rcx;" | ||
227 | #endif | ||
215 | "1:" | 228 | "1:" |
216 | ".byte 0xf3,0x0f,0xa7,0xc8" /* rep xcryptecb */ | 229 | ".byte 0xf3,0x0f,0xa7,0xc8" /* rep xcryptecb */ |
217 | : "+S"(input), "+D"(output) | 230 | : "+S"(input), "+D"(output) |
diff --git a/drivers/crypto/talitos.c b/drivers/crypto/talitos.c index a3918c16b3db..c70775fd3ce2 100644 --- a/drivers/crypto/talitos.c +++ b/drivers/crypto/talitos.c | |||
@@ -44,6 +44,8 @@ | |||
44 | #include <crypto/sha.h> | 44 | #include <crypto/sha.h> |
45 | #include <crypto/aead.h> | 45 | #include <crypto/aead.h> |
46 | #include <crypto/authenc.h> | 46 | #include <crypto/authenc.h> |
47 | #include <crypto/skcipher.h> | ||
48 | #include <crypto/scatterwalk.h> | ||
47 | 49 | ||
48 | #include "talitos.h" | 50 | #include "talitos.h" |
49 | 51 | ||
@@ -339,7 +341,8 @@ static void flush_channel(struct device *dev, int ch, int error, int reset_ch) | |||
339 | status = error; | 341 | status = error; |
340 | 342 | ||
341 | dma_unmap_single(dev, request->dma_desc, | 343 | dma_unmap_single(dev, request->dma_desc, |
342 | sizeof(struct talitos_desc), DMA_BIDIRECTIONAL); | 344 | sizeof(struct talitos_desc), |
345 | DMA_BIDIRECTIONAL); | ||
343 | 346 | ||
344 | /* copy entries so we can call callback outside lock */ | 347 | /* copy entries so we can call callback outside lock */ |
345 | saved_req.desc = request->desc; | 348 | saved_req.desc = request->desc; |
@@ -413,7 +416,8 @@ static struct talitos_desc *current_desc(struct device *dev, int ch) | |||
413 | /* | 416 | /* |
414 | * user diagnostics; report root cause of error based on execution unit status | 417 | * user diagnostics; report root cause of error based on execution unit status |
415 | */ | 418 | */ |
416 | static void report_eu_error(struct device *dev, int ch, struct talitos_desc *desc) | 419 | static void report_eu_error(struct device *dev, int ch, |
420 | struct talitos_desc *desc) | ||
417 | { | 421 | { |
418 | struct talitos_private *priv = dev_get_drvdata(dev); | 422 | struct talitos_private *priv = dev_get_drvdata(dev); |
419 | int i; | 423 | int i; |
@@ -684,8 +688,8 @@ struct talitos_ctx { | |||
684 | unsigned int authsize; | 688 | unsigned int authsize; |
685 | }; | 689 | }; |
686 | 690 | ||
687 | static int aead_authenc_setauthsize(struct crypto_aead *authenc, | 691 | static int aead_setauthsize(struct crypto_aead *authenc, |
688 | unsigned int authsize) | 692 | unsigned int authsize) |
689 | { | 693 | { |
690 | struct talitos_ctx *ctx = crypto_aead_ctx(authenc); | 694 | struct talitos_ctx *ctx = crypto_aead_ctx(authenc); |
691 | 695 | ||
@@ -694,8 +698,8 @@ static int aead_authenc_setauthsize(struct crypto_aead *authenc, | |||
694 | return 0; | 698 | return 0; |
695 | } | 699 | } |
696 | 700 | ||
697 | static int aead_authenc_setkey(struct crypto_aead *authenc, | 701 | static int aead_setkey(struct crypto_aead *authenc, |
698 | const u8 *key, unsigned int keylen) | 702 | const u8 *key, unsigned int keylen) |
699 | { | 703 | { |
700 | struct talitos_ctx *ctx = crypto_aead_ctx(authenc); | 704 | struct talitos_ctx *ctx = crypto_aead_ctx(authenc); |
701 | struct rtattr *rta = (void *)key; | 705 | struct rtattr *rta = (void *)key; |
@@ -740,7 +744,7 @@ badkey: | |||
740 | } | 744 | } |
741 | 745 | ||
742 | /* | 746 | /* |
743 | * ipsec_esp_edesc - s/w-extended ipsec_esp descriptor | 747 | * talitos_edesc - s/w-extended descriptor |
744 | * @src_nents: number of segments in input scatterlist | 748 | * @src_nents: number of segments in input scatterlist |
745 | * @dst_nents: number of segments in output scatterlist | 749 | * @dst_nents: number of segments in output scatterlist |
746 | * @dma_len: length of dma mapped link_tbl space | 750 | * @dma_len: length of dma mapped link_tbl space |
@@ -752,17 +756,67 @@ badkey: | |||
752 | * is greater than 1, an integrity check value is concatenated to the end | 756 | * is greater than 1, an integrity check value is concatenated to the end |
753 | * of link_tbl data | 757 | * of link_tbl data |
754 | */ | 758 | */ |
755 | struct ipsec_esp_edesc { | 759 | struct talitos_edesc { |
756 | int src_nents; | 760 | int src_nents; |
757 | int dst_nents; | 761 | int dst_nents; |
762 | int src_is_chained; | ||
763 | int dst_is_chained; | ||
758 | int dma_len; | 764 | int dma_len; |
759 | dma_addr_t dma_link_tbl; | 765 | dma_addr_t dma_link_tbl; |
760 | struct talitos_desc desc; | 766 | struct talitos_desc desc; |
761 | struct talitos_ptr link_tbl[0]; | 767 | struct talitos_ptr link_tbl[0]; |
762 | }; | 768 | }; |
763 | 769 | ||
770 | static int talitos_map_sg(struct device *dev, struct scatterlist *sg, | ||
771 | unsigned int nents, enum dma_data_direction dir, | ||
772 | int chained) | ||
773 | { | ||
774 | if (unlikely(chained)) | ||
775 | while (sg) { | ||
776 | dma_map_sg(dev, sg, 1, dir); | ||
777 | sg = scatterwalk_sg_next(sg); | ||
778 | } | ||
779 | else | ||
780 | dma_map_sg(dev, sg, nents, dir); | ||
781 | return nents; | ||
782 | } | ||
783 | |||
784 | static void talitos_unmap_sg_chain(struct device *dev, struct scatterlist *sg, | ||
785 | enum dma_data_direction dir) | ||
786 | { | ||
787 | while (sg) { | ||
788 | dma_unmap_sg(dev, sg, 1, dir); | ||
789 | sg = scatterwalk_sg_next(sg); | ||
790 | } | ||
791 | } | ||
792 | |||
793 | static void talitos_sg_unmap(struct device *dev, | ||
794 | struct talitos_edesc *edesc, | ||
795 | struct scatterlist *src, | ||
796 | struct scatterlist *dst) | ||
797 | { | ||
798 | unsigned int src_nents = edesc->src_nents ? : 1; | ||
799 | unsigned int dst_nents = edesc->dst_nents ? : 1; | ||
800 | |||
801 | if (src != dst) { | ||
802 | if (edesc->src_is_chained) | ||
803 | talitos_unmap_sg_chain(dev, src, DMA_TO_DEVICE); | ||
804 | else | ||
805 | dma_unmap_sg(dev, src, src_nents, DMA_TO_DEVICE); | ||
806 | |||
807 | if (edesc->dst_is_chained) | ||
808 | talitos_unmap_sg_chain(dev, dst, DMA_FROM_DEVICE); | ||
809 | else | ||
810 | dma_unmap_sg(dev, dst, dst_nents, DMA_FROM_DEVICE); | ||
811 | } else | ||
812 | if (edesc->src_is_chained) | ||
813 | talitos_unmap_sg_chain(dev, src, DMA_BIDIRECTIONAL); | ||
814 | else | ||
815 | dma_unmap_sg(dev, src, src_nents, DMA_BIDIRECTIONAL); | ||
816 | } | ||
817 | |||
764 | static void ipsec_esp_unmap(struct device *dev, | 818 | static void ipsec_esp_unmap(struct device *dev, |
765 | struct ipsec_esp_edesc *edesc, | 819 | struct talitos_edesc *edesc, |
766 | struct aead_request *areq) | 820 | struct aead_request *areq) |
767 | { | 821 | { |
768 | unmap_single_talitos_ptr(dev, &edesc->desc.ptr[6], DMA_FROM_DEVICE); | 822 | unmap_single_talitos_ptr(dev, &edesc->desc.ptr[6], DMA_FROM_DEVICE); |
@@ -772,15 +826,7 @@ static void ipsec_esp_unmap(struct device *dev, | |||
772 | 826 | ||
773 | dma_unmap_sg(dev, areq->assoc, 1, DMA_TO_DEVICE); | 827 | dma_unmap_sg(dev, areq->assoc, 1, DMA_TO_DEVICE); |
774 | 828 | ||
775 | if (areq->src != areq->dst) { | 829 | talitos_sg_unmap(dev, edesc, areq->src, areq->dst); |
776 | dma_unmap_sg(dev, areq->src, edesc->src_nents ? : 1, | ||
777 | DMA_TO_DEVICE); | ||
778 | dma_unmap_sg(dev, areq->dst, edesc->dst_nents ? : 1, | ||
779 | DMA_FROM_DEVICE); | ||
780 | } else { | ||
781 | dma_unmap_sg(dev, areq->src, edesc->src_nents ? : 1, | ||
782 | DMA_BIDIRECTIONAL); | ||
783 | } | ||
784 | 830 | ||
785 | if (edesc->dma_len) | 831 | if (edesc->dma_len) |
786 | dma_unmap_single(dev, edesc->dma_link_tbl, edesc->dma_len, | 832 | dma_unmap_single(dev, edesc->dma_link_tbl, edesc->dma_len, |
@@ -795,13 +841,14 @@ static void ipsec_esp_encrypt_done(struct device *dev, | |||
795 | int err) | 841 | int err) |
796 | { | 842 | { |
797 | struct aead_request *areq = context; | 843 | struct aead_request *areq = context; |
798 | struct ipsec_esp_edesc *edesc = | ||
799 | container_of(desc, struct ipsec_esp_edesc, desc); | ||
800 | struct crypto_aead *authenc = crypto_aead_reqtfm(areq); | 844 | struct crypto_aead *authenc = crypto_aead_reqtfm(areq); |
801 | struct talitos_ctx *ctx = crypto_aead_ctx(authenc); | 845 | struct talitos_ctx *ctx = crypto_aead_ctx(authenc); |
846 | struct talitos_edesc *edesc; | ||
802 | struct scatterlist *sg; | 847 | struct scatterlist *sg; |
803 | void *icvdata; | 848 | void *icvdata; |
804 | 849 | ||
850 | edesc = container_of(desc, struct talitos_edesc, desc); | ||
851 | |||
805 | ipsec_esp_unmap(dev, edesc, areq); | 852 | ipsec_esp_unmap(dev, edesc, areq); |
806 | 853 | ||
807 | /* copy the generated ICV to dst */ | 854 | /* copy the generated ICV to dst */ |
@@ -819,17 +866,18 @@ static void ipsec_esp_encrypt_done(struct device *dev, | |||
819 | } | 866 | } |
820 | 867 | ||
821 | static void ipsec_esp_decrypt_swauth_done(struct device *dev, | 868 | static void ipsec_esp_decrypt_swauth_done(struct device *dev, |
822 | struct talitos_desc *desc, void *context, | 869 | struct talitos_desc *desc, |
823 | int err) | 870 | void *context, int err) |
824 | { | 871 | { |
825 | struct aead_request *req = context; | 872 | struct aead_request *req = context; |
826 | struct ipsec_esp_edesc *edesc = | ||
827 | container_of(desc, struct ipsec_esp_edesc, desc); | ||
828 | struct crypto_aead *authenc = crypto_aead_reqtfm(req); | 873 | struct crypto_aead *authenc = crypto_aead_reqtfm(req); |
829 | struct talitos_ctx *ctx = crypto_aead_ctx(authenc); | 874 | struct talitos_ctx *ctx = crypto_aead_ctx(authenc); |
875 | struct talitos_edesc *edesc; | ||
830 | struct scatterlist *sg; | 876 | struct scatterlist *sg; |
831 | void *icvdata; | 877 | void *icvdata; |
832 | 878 | ||
879 | edesc = container_of(desc, struct talitos_edesc, desc); | ||
880 | |||
833 | ipsec_esp_unmap(dev, edesc, req); | 881 | ipsec_esp_unmap(dev, edesc, req); |
834 | 882 | ||
835 | if (!err) { | 883 | if (!err) { |
@@ -851,20 +899,20 @@ static void ipsec_esp_decrypt_swauth_done(struct device *dev, | |||
851 | } | 899 | } |
852 | 900 | ||
853 | static void ipsec_esp_decrypt_hwauth_done(struct device *dev, | 901 | static void ipsec_esp_decrypt_hwauth_done(struct device *dev, |
854 | struct talitos_desc *desc, void *context, | 902 | struct talitos_desc *desc, |
855 | int err) | 903 | void *context, int err) |
856 | { | 904 | { |
857 | struct aead_request *req = context; | 905 | struct aead_request *req = context; |
858 | struct ipsec_esp_edesc *edesc = | 906 | struct talitos_edesc *edesc; |
859 | container_of(desc, struct ipsec_esp_edesc, desc); | 907 | |
908 | edesc = container_of(desc, struct talitos_edesc, desc); | ||
860 | 909 | ||
861 | ipsec_esp_unmap(dev, edesc, req); | 910 | ipsec_esp_unmap(dev, edesc, req); |
862 | 911 | ||
863 | /* check ICV auth status */ | 912 | /* check ICV auth status */ |
864 | if (!err) | 913 | if (!err && ((desc->hdr_lo & DESC_HDR_LO_ICCR1_MASK) != |
865 | if ((desc->hdr_lo & DESC_HDR_LO_ICCR1_MASK) != | 914 | DESC_HDR_LO_ICCR1_PASS)) |
866 | DESC_HDR_LO_ICCR1_PASS) | 915 | err = -EBADMSG; |
867 | err = -EBADMSG; | ||
868 | 916 | ||
869 | kfree(edesc); | 917 | kfree(edesc); |
870 | 918 | ||
@@ -886,7 +934,7 @@ static int sg_to_link_tbl(struct scatterlist *sg, int sg_count, | |||
886 | link_tbl_ptr->j_extent = 0; | 934 | link_tbl_ptr->j_extent = 0; |
887 | link_tbl_ptr++; | 935 | link_tbl_ptr++; |
888 | cryptlen -= sg_dma_len(sg); | 936 | cryptlen -= sg_dma_len(sg); |
889 | sg = sg_next(sg); | 937 | sg = scatterwalk_sg_next(sg); |
890 | } | 938 | } |
891 | 939 | ||
892 | /* adjust (decrease) last one (or two) entry's len to cryptlen */ | 940 | /* adjust (decrease) last one (or two) entry's len to cryptlen */ |
@@ -910,7 +958,7 @@ static int sg_to_link_tbl(struct scatterlist *sg, int sg_count, | |||
910 | /* | 958 | /* |
911 | * fill in and submit ipsec_esp descriptor | 959 | * fill in and submit ipsec_esp descriptor |
912 | */ | 960 | */ |
913 | static int ipsec_esp(struct ipsec_esp_edesc *edesc, struct aead_request *areq, | 961 | static int ipsec_esp(struct talitos_edesc *edesc, struct aead_request *areq, |
914 | u8 *giv, u64 seq, | 962 | u8 *giv, u64 seq, |
915 | void (*callback) (struct device *dev, | 963 | void (*callback) (struct device *dev, |
916 | struct talitos_desc *desc, | 964 | struct talitos_desc *desc, |
@@ -952,32 +1000,31 @@ static int ipsec_esp(struct ipsec_esp_edesc *edesc, struct aead_request *areq, | |||
952 | desc->ptr[4].len = cpu_to_be16(cryptlen); | 1000 | desc->ptr[4].len = cpu_to_be16(cryptlen); |
953 | desc->ptr[4].j_extent = authsize; | 1001 | desc->ptr[4].j_extent = authsize; |
954 | 1002 | ||
955 | if (areq->src == areq->dst) | 1003 | sg_count = talitos_map_sg(dev, areq->src, edesc->src_nents ? : 1, |
956 | sg_count = dma_map_sg(dev, areq->src, edesc->src_nents ? : 1, | 1004 | (areq->src == areq->dst) ? DMA_BIDIRECTIONAL |
957 | DMA_BIDIRECTIONAL); | 1005 | : DMA_TO_DEVICE, |
958 | else | 1006 | edesc->src_is_chained); |
959 | sg_count = dma_map_sg(dev, areq->src, edesc->src_nents ? : 1, | ||
960 | DMA_TO_DEVICE); | ||
961 | 1007 | ||
962 | if (sg_count == 1) { | 1008 | if (sg_count == 1) { |
963 | desc->ptr[4].ptr = cpu_to_be32(sg_dma_address(areq->src)); | 1009 | desc->ptr[4].ptr = cpu_to_be32(sg_dma_address(areq->src)); |
964 | } else { | 1010 | } else { |
965 | sg_link_tbl_len = cryptlen; | 1011 | sg_link_tbl_len = cryptlen; |
966 | 1012 | ||
967 | if ((edesc->desc.hdr & DESC_HDR_MODE1_MDEU_CICV) && | 1013 | if (edesc->desc.hdr & DESC_HDR_MODE1_MDEU_CICV) |
968 | (edesc->desc.hdr & DESC_HDR_MODE0_ENCRYPT) == 0) { | ||
969 | sg_link_tbl_len = cryptlen + authsize; | 1014 | sg_link_tbl_len = cryptlen + authsize; |
970 | } | 1015 | |
971 | sg_count = sg_to_link_tbl(areq->src, sg_count, sg_link_tbl_len, | 1016 | sg_count = sg_to_link_tbl(areq->src, sg_count, sg_link_tbl_len, |
972 | &edesc->link_tbl[0]); | 1017 | &edesc->link_tbl[0]); |
973 | if (sg_count > 1) { | 1018 | if (sg_count > 1) { |
974 | desc->ptr[4].j_extent |= DESC_PTR_LNKTBL_JUMP; | 1019 | desc->ptr[4].j_extent |= DESC_PTR_LNKTBL_JUMP; |
975 | desc->ptr[4].ptr = cpu_to_be32(edesc->dma_link_tbl); | 1020 | desc->ptr[4].ptr = cpu_to_be32(edesc->dma_link_tbl); |
976 | dma_sync_single_for_device(ctx->dev, edesc->dma_link_tbl, | 1021 | dma_sync_single_for_device(dev, edesc->dma_link_tbl, |
977 | edesc->dma_len, DMA_BIDIRECTIONAL); | 1022 | edesc->dma_len, |
1023 | DMA_BIDIRECTIONAL); | ||
978 | } else { | 1024 | } else { |
979 | /* Only one segment now, so no link tbl needed */ | 1025 | /* Only one segment now, so no link tbl needed */ |
980 | desc->ptr[4].ptr = cpu_to_be32(sg_dma_address(areq->src)); | 1026 | desc->ptr[4].ptr = cpu_to_be32(sg_dma_address(areq-> |
1027 | src)); | ||
981 | } | 1028 | } |
982 | } | 1029 | } |
983 | 1030 | ||
@@ -985,10 +1032,11 @@ static int ipsec_esp(struct ipsec_esp_edesc *edesc, struct aead_request *areq, | |||
985 | desc->ptr[5].len = cpu_to_be16(cryptlen); | 1032 | desc->ptr[5].len = cpu_to_be16(cryptlen); |
986 | desc->ptr[5].j_extent = authsize; | 1033 | desc->ptr[5].j_extent = authsize; |
987 | 1034 | ||
988 | if (areq->src != areq->dst) { | 1035 | if (areq->src != areq->dst) |
989 | sg_count = dma_map_sg(dev, areq->dst, edesc->dst_nents ? : 1, | 1036 | sg_count = talitos_map_sg(dev, areq->dst, |
990 | DMA_FROM_DEVICE); | 1037 | edesc->dst_nents ? : 1, |
991 | } | 1038 | DMA_FROM_DEVICE, |
1039 | edesc->dst_is_chained); | ||
992 | 1040 | ||
993 | if (sg_count == 1) { | 1041 | if (sg_count == 1) { |
994 | desc->ptr[5].ptr = cpu_to_be32(sg_dma_address(areq->dst)); | 1042 | desc->ptr[5].ptr = cpu_to_be32(sg_dma_address(areq->dst)); |
@@ -1033,49 +1081,55 @@ static int ipsec_esp(struct ipsec_esp_edesc *edesc, struct aead_request *areq, | |||
1033 | return ret; | 1081 | return ret; |
1034 | } | 1082 | } |
1035 | 1083 | ||
1036 | |||
1037 | /* | 1084 | /* |
1038 | * derive number of elements in scatterlist | 1085 | * derive number of elements in scatterlist |
1039 | */ | 1086 | */ |
1040 | static int sg_count(struct scatterlist *sg_list, int nbytes) | 1087 | static int sg_count(struct scatterlist *sg_list, int nbytes, int *chained) |
1041 | { | 1088 | { |
1042 | struct scatterlist *sg = sg_list; | 1089 | struct scatterlist *sg = sg_list; |
1043 | int sg_nents = 0; | 1090 | int sg_nents = 0; |
1044 | 1091 | ||
1045 | while (nbytes) { | 1092 | *chained = 0; |
1093 | while (nbytes > 0) { | ||
1046 | sg_nents++; | 1094 | sg_nents++; |
1047 | nbytes -= sg->length; | 1095 | nbytes -= sg->length; |
1048 | sg = sg_next(sg); | 1096 | if (!sg_is_last(sg) && (sg + 1)->length == 0) |
1097 | *chained = 1; | ||
1098 | sg = scatterwalk_sg_next(sg); | ||
1049 | } | 1099 | } |
1050 | 1100 | ||
1051 | return sg_nents; | 1101 | return sg_nents; |
1052 | } | 1102 | } |
1053 | 1103 | ||
1054 | /* | 1104 | /* |
1055 | * allocate and map the ipsec_esp extended descriptor | 1105 | * allocate and map the extended descriptor |
1056 | */ | 1106 | */ |
1057 | static struct ipsec_esp_edesc *ipsec_esp_edesc_alloc(struct aead_request *areq, | 1107 | static struct talitos_edesc *talitos_edesc_alloc(struct device *dev, |
1058 | int icv_stashing) | 1108 | struct scatterlist *src, |
1109 | struct scatterlist *dst, | ||
1110 | unsigned int cryptlen, | ||
1111 | unsigned int authsize, | ||
1112 | int icv_stashing, | ||
1113 | u32 cryptoflags) | ||
1059 | { | 1114 | { |
1060 | struct crypto_aead *authenc = crypto_aead_reqtfm(areq); | 1115 | struct talitos_edesc *edesc; |
1061 | struct talitos_ctx *ctx = crypto_aead_ctx(authenc); | ||
1062 | struct ipsec_esp_edesc *edesc; | ||
1063 | int src_nents, dst_nents, alloc_len, dma_len; | 1116 | int src_nents, dst_nents, alloc_len, dma_len; |
1064 | gfp_t flags = areq->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP ? GFP_KERNEL : | 1117 | int src_chained, dst_chained = 0; |
1118 | gfp_t flags = cryptoflags & CRYPTO_TFM_REQ_MAY_SLEEP ? GFP_KERNEL : | ||
1065 | GFP_ATOMIC; | 1119 | GFP_ATOMIC; |
1066 | 1120 | ||
1067 | if (areq->cryptlen + ctx->authsize > TALITOS_MAX_DATA_LEN) { | 1121 | if (cryptlen + authsize > TALITOS_MAX_DATA_LEN) { |
1068 | dev_err(ctx->dev, "cryptlen exceeds h/w max limit\n"); | 1122 | dev_err(dev, "length exceeds h/w max limit\n"); |
1069 | return ERR_PTR(-EINVAL); | 1123 | return ERR_PTR(-EINVAL); |
1070 | } | 1124 | } |
1071 | 1125 | ||
1072 | src_nents = sg_count(areq->src, areq->cryptlen + ctx->authsize); | 1126 | src_nents = sg_count(src, cryptlen + authsize, &src_chained); |
1073 | src_nents = (src_nents == 1) ? 0 : src_nents; | 1127 | src_nents = (src_nents == 1) ? 0 : src_nents; |
1074 | 1128 | ||
1075 | if (areq->dst == areq->src) { | 1129 | if (dst == src) { |
1076 | dst_nents = src_nents; | 1130 | dst_nents = src_nents; |
1077 | } else { | 1131 | } else { |
1078 | dst_nents = sg_count(areq->dst, areq->cryptlen + ctx->authsize); | 1132 | dst_nents = sg_count(dst, cryptlen + authsize, &dst_chained); |
1079 | dst_nents = (dst_nents == 1) ? 0 : dst_nents; | 1133 | dst_nents = (dst_nents == 1) ? 0 : dst_nents; |
1080 | } | 1134 | } |
1081 | 1135 | ||
@@ -1084,39 +1138,52 @@ static struct ipsec_esp_edesc *ipsec_esp_edesc_alloc(struct aead_request *areq, | |||
1084 | * allowing for two separate entries for ICV and generated ICV (+ 2), | 1138 | * allowing for two separate entries for ICV and generated ICV (+ 2), |
1085 | * and the ICV data itself | 1139 | * and the ICV data itself |
1086 | */ | 1140 | */ |
1087 | alloc_len = sizeof(struct ipsec_esp_edesc); | 1141 | alloc_len = sizeof(struct talitos_edesc); |
1088 | if (src_nents || dst_nents) { | 1142 | if (src_nents || dst_nents) { |
1089 | dma_len = (src_nents + dst_nents + 2) * | 1143 | dma_len = (src_nents + dst_nents + 2) * |
1090 | sizeof(struct talitos_ptr) + ctx->authsize; | 1144 | sizeof(struct talitos_ptr) + authsize; |
1091 | alloc_len += dma_len; | 1145 | alloc_len += dma_len; |
1092 | } else { | 1146 | } else { |
1093 | dma_len = 0; | 1147 | dma_len = 0; |
1094 | alloc_len += icv_stashing ? ctx->authsize : 0; | 1148 | alloc_len += icv_stashing ? authsize : 0; |
1095 | } | 1149 | } |
1096 | 1150 | ||
1097 | edesc = kmalloc(alloc_len, GFP_DMA | flags); | 1151 | edesc = kmalloc(alloc_len, GFP_DMA | flags); |
1098 | if (!edesc) { | 1152 | if (!edesc) { |
1099 | dev_err(ctx->dev, "could not allocate edescriptor\n"); | 1153 | dev_err(dev, "could not allocate edescriptor\n"); |
1100 | return ERR_PTR(-ENOMEM); | 1154 | return ERR_PTR(-ENOMEM); |
1101 | } | 1155 | } |
1102 | 1156 | ||
1103 | edesc->src_nents = src_nents; | 1157 | edesc->src_nents = src_nents; |
1104 | edesc->dst_nents = dst_nents; | 1158 | edesc->dst_nents = dst_nents; |
1159 | edesc->src_is_chained = src_chained; | ||
1160 | edesc->dst_is_chained = dst_chained; | ||
1105 | edesc->dma_len = dma_len; | 1161 | edesc->dma_len = dma_len; |
1106 | edesc->dma_link_tbl = dma_map_single(ctx->dev, &edesc->link_tbl[0], | 1162 | edesc->dma_link_tbl = dma_map_single(dev, &edesc->link_tbl[0], |
1107 | edesc->dma_len, DMA_BIDIRECTIONAL); | 1163 | edesc->dma_len, DMA_BIDIRECTIONAL); |
1108 | 1164 | ||
1109 | return edesc; | 1165 | return edesc; |
1110 | } | 1166 | } |
1111 | 1167 | ||
1112 | static int aead_authenc_encrypt(struct aead_request *req) | 1168 | static struct talitos_edesc *aead_edesc_alloc(struct aead_request *areq, |
1169 | int icv_stashing) | ||
1170 | { | ||
1171 | struct crypto_aead *authenc = crypto_aead_reqtfm(areq); | ||
1172 | struct talitos_ctx *ctx = crypto_aead_ctx(authenc); | ||
1173 | |||
1174 | return talitos_edesc_alloc(ctx->dev, areq->src, areq->dst, | ||
1175 | areq->cryptlen, ctx->authsize, icv_stashing, | ||
1176 | areq->base.flags); | ||
1177 | } | ||
1178 | |||
1179 | static int aead_encrypt(struct aead_request *req) | ||
1113 | { | 1180 | { |
1114 | struct crypto_aead *authenc = crypto_aead_reqtfm(req); | 1181 | struct crypto_aead *authenc = crypto_aead_reqtfm(req); |
1115 | struct talitos_ctx *ctx = crypto_aead_ctx(authenc); | 1182 | struct talitos_ctx *ctx = crypto_aead_ctx(authenc); |
1116 | struct ipsec_esp_edesc *edesc; | 1183 | struct talitos_edesc *edesc; |
1117 | 1184 | ||
1118 | /* allocate extended descriptor */ | 1185 | /* allocate extended descriptor */ |
1119 | edesc = ipsec_esp_edesc_alloc(req, 0); | 1186 | edesc = aead_edesc_alloc(req, 0); |
1120 | if (IS_ERR(edesc)) | 1187 | if (IS_ERR(edesc)) |
1121 | return PTR_ERR(edesc); | 1188 | return PTR_ERR(edesc); |
1122 | 1189 | ||
@@ -1126,70 +1193,67 @@ static int aead_authenc_encrypt(struct aead_request *req) | |||
1126 | return ipsec_esp(edesc, req, NULL, 0, ipsec_esp_encrypt_done); | 1193 | return ipsec_esp(edesc, req, NULL, 0, ipsec_esp_encrypt_done); |
1127 | } | 1194 | } |
1128 | 1195 | ||
1129 | 1196 | static int aead_decrypt(struct aead_request *req) | |
1130 | |||
1131 | static int aead_authenc_decrypt(struct aead_request *req) | ||
1132 | { | 1197 | { |
1133 | struct crypto_aead *authenc = crypto_aead_reqtfm(req); | 1198 | struct crypto_aead *authenc = crypto_aead_reqtfm(req); |
1134 | struct talitos_ctx *ctx = crypto_aead_ctx(authenc); | 1199 | struct talitos_ctx *ctx = crypto_aead_ctx(authenc); |
1135 | unsigned int authsize = ctx->authsize; | 1200 | unsigned int authsize = ctx->authsize; |
1136 | struct talitos_private *priv = dev_get_drvdata(ctx->dev); | 1201 | struct talitos_private *priv = dev_get_drvdata(ctx->dev); |
1137 | struct ipsec_esp_edesc *edesc; | 1202 | struct talitos_edesc *edesc; |
1138 | struct scatterlist *sg; | 1203 | struct scatterlist *sg; |
1139 | void *icvdata; | 1204 | void *icvdata; |
1140 | 1205 | ||
1141 | req->cryptlen -= authsize; | 1206 | req->cryptlen -= authsize; |
1142 | 1207 | ||
1143 | /* allocate extended descriptor */ | 1208 | /* allocate extended descriptor */ |
1144 | edesc = ipsec_esp_edesc_alloc(req, 1); | 1209 | edesc = aead_edesc_alloc(req, 1); |
1145 | if (IS_ERR(edesc)) | 1210 | if (IS_ERR(edesc)) |
1146 | return PTR_ERR(edesc); | 1211 | return PTR_ERR(edesc); |
1147 | 1212 | ||
1148 | if ((priv->features & TALITOS_FTR_HW_AUTH_CHECK) && | 1213 | if ((priv->features & TALITOS_FTR_HW_AUTH_CHECK) && |
1149 | (((!edesc->src_nents && !edesc->dst_nents) || | 1214 | ((!edesc->src_nents && !edesc->dst_nents) || |
1150 | priv->features & TALITOS_FTR_SRC_LINK_TBL_LEN_INCLUDES_EXTENT))) { | 1215 | priv->features & TALITOS_FTR_SRC_LINK_TBL_LEN_INCLUDES_EXTENT)) { |
1151 | 1216 | ||
1152 | /* decrypt and check the ICV */ | 1217 | /* decrypt and check the ICV */ |
1153 | edesc->desc.hdr = ctx->desc_hdr_template | DESC_HDR_DIR_INBOUND | | 1218 | edesc->desc.hdr = ctx->desc_hdr_template | |
1219 | DESC_HDR_DIR_INBOUND | | ||
1154 | DESC_HDR_MODE1_MDEU_CICV; | 1220 | DESC_HDR_MODE1_MDEU_CICV; |
1155 | 1221 | ||
1156 | /* reset integrity check result bits */ | 1222 | /* reset integrity check result bits */ |
1157 | edesc->desc.hdr_lo = 0; | 1223 | edesc->desc.hdr_lo = 0; |
1158 | 1224 | ||
1159 | return ipsec_esp(edesc, req, NULL, 0, ipsec_esp_decrypt_hwauth_done); | 1225 | return ipsec_esp(edesc, req, NULL, 0, |
1226 | ipsec_esp_decrypt_hwauth_done); | ||
1160 | 1227 | ||
1161 | } else { | 1228 | } |
1162 | |||
1163 | /* Have to check the ICV with software */ | ||
1164 | 1229 | ||
1165 | edesc->desc.hdr = ctx->desc_hdr_template | DESC_HDR_DIR_INBOUND; | 1230 | /* Have to check the ICV with software */ |
1231 | edesc->desc.hdr = ctx->desc_hdr_template | DESC_HDR_DIR_INBOUND; | ||
1166 | 1232 | ||
1167 | /* stash incoming ICV for later cmp with ICV generated by the h/w */ | 1233 | /* stash incoming ICV for later cmp with ICV generated by the h/w */ |
1168 | if (edesc->dma_len) | 1234 | if (edesc->dma_len) |
1169 | icvdata = &edesc->link_tbl[edesc->src_nents + | 1235 | icvdata = &edesc->link_tbl[edesc->src_nents + |
1170 | edesc->dst_nents + 2]; | 1236 | edesc->dst_nents + 2]; |
1171 | else | 1237 | else |
1172 | icvdata = &edesc->link_tbl[0]; | 1238 | icvdata = &edesc->link_tbl[0]; |
1173 | 1239 | ||
1174 | sg = sg_last(req->src, edesc->src_nents ? : 1); | 1240 | sg = sg_last(req->src, edesc->src_nents ? : 1); |
1175 | 1241 | ||
1176 | memcpy(icvdata, (char *)sg_virt(sg) + sg->length - ctx->authsize, | 1242 | memcpy(icvdata, (char *)sg_virt(sg) + sg->length - ctx->authsize, |
1177 | ctx->authsize); | 1243 | ctx->authsize); |
1178 | 1244 | ||
1179 | return ipsec_esp(edesc, req, NULL, 0, ipsec_esp_decrypt_swauth_done); | 1245 | return ipsec_esp(edesc, req, NULL, 0, ipsec_esp_decrypt_swauth_done); |
1180 | } | ||
1181 | } | 1246 | } |
1182 | 1247 | ||
1183 | static int aead_authenc_givencrypt( | 1248 | static int aead_givencrypt(struct aead_givcrypt_request *req) |
1184 | struct aead_givcrypt_request *req) | ||
1185 | { | 1249 | { |
1186 | struct aead_request *areq = &req->areq; | 1250 | struct aead_request *areq = &req->areq; |
1187 | struct crypto_aead *authenc = crypto_aead_reqtfm(areq); | 1251 | struct crypto_aead *authenc = crypto_aead_reqtfm(areq); |
1188 | struct talitos_ctx *ctx = crypto_aead_ctx(authenc); | 1252 | struct talitos_ctx *ctx = crypto_aead_ctx(authenc); |
1189 | struct ipsec_esp_edesc *edesc; | 1253 | struct talitos_edesc *edesc; |
1190 | 1254 | ||
1191 | /* allocate extended descriptor */ | 1255 | /* allocate extended descriptor */ |
1192 | edesc = ipsec_esp_edesc_alloc(areq, 0); | 1256 | edesc = aead_edesc_alloc(areq, 0); |
1193 | if (IS_ERR(edesc)) | 1257 | if (IS_ERR(edesc)) |
1194 | return PTR_ERR(edesc); | 1258 | return PTR_ERR(edesc); |
1195 | 1259 | ||
@@ -1204,31 +1268,228 @@ static int aead_authenc_givencrypt( | |||
1204 | ipsec_esp_encrypt_done); | 1268 | ipsec_esp_encrypt_done); |
1205 | } | 1269 | } |
1206 | 1270 | ||
1271 | static int ablkcipher_setkey(struct crypto_ablkcipher *cipher, | ||
1272 | const u8 *key, unsigned int keylen) | ||
1273 | { | ||
1274 | struct talitos_ctx *ctx = crypto_ablkcipher_ctx(cipher); | ||
1275 | struct ablkcipher_alg *alg = crypto_ablkcipher_alg(cipher); | ||
1276 | |||
1277 | if (keylen > TALITOS_MAX_KEY_SIZE) | ||
1278 | goto badkey; | ||
1279 | |||
1280 | if (keylen < alg->min_keysize || keylen > alg->max_keysize) | ||
1281 | goto badkey; | ||
1282 | |||
1283 | memcpy(&ctx->key, key, keylen); | ||
1284 | ctx->keylen = keylen; | ||
1285 | |||
1286 | return 0; | ||
1287 | |||
1288 | badkey: | ||
1289 | crypto_ablkcipher_set_flags(cipher, CRYPTO_TFM_RES_BAD_KEY_LEN); | ||
1290 | return -EINVAL; | ||
1291 | } | ||
1292 | |||
1293 | static void common_nonsnoop_unmap(struct device *dev, | ||
1294 | struct talitos_edesc *edesc, | ||
1295 | struct ablkcipher_request *areq) | ||
1296 | { | ||
1297 | unmap_single_talitos_ptr(dev, &edesc->desc.ptr[5], DMA_FROM_DEVICE); | ||
1298 | unmap_single_talitos_ptr(dev, &edesc->desc.ptr[2], DMA_TO_DEVICE); | ||
1299 | unmap_single_talitos_ptr(dev, &edesc->desc.ptr[1], DMA_TO_DEVICE); | ||
1300 | |||
1301 | talitos_sg_unmap(dev, edesc, areq->src, areq->dst); | ||
1302 | |||
1303 | if (edesc->dma_len) | ||
1304 | dma_unmap_single(dev, edesc->dma_link_tbl, edesc->dma_len, | ||
1305 | DMA_BIDIRECTIONAL); | ||
1306 | } | ||
1307 | |||
1308 | static void ablkcipher_done(struct device *dev, | ||
1309 | struct talitos_desc *desc, void *context, | ||
1310 | int err) | ||
1311 | { | ||
1312 | struct ablkcipher_request *areq = context; | ||
1313 | struct talitos_edesc *edesc; | ||
1314 | |||
1315 | edesc = container_of(desc, struct talitos_edesc, desc); | ||
1316 | |||
1317 | common_nonsnoop_unmap(dev, edesc, areq); | ||
1318 | |||
1319 | kfree(edesc); | ||
1320 | |||
1321 | areq->base.complete(&areq->base, err); | ||
1322 | } | ||
1323 | |||
1324 | static int common_nonsnoop(struct talitos_edesc *edesc, | ||
1325 | struct ablkcipher_request *areq, | ||
1326 | u8 *giv, | ||
1327 | void (*callback) (struct device *dev, | ||
1328 | struct talitos_desc *desc, | ||
1329 | void *context, int error)) | ||
1330 | { | ||
1331 | struct crypto_ablkcipher *cipher = crypto_ablkcipher_reqtfm(areq); | ||
1332 | struct talitos_ctx *ctx = crypto_ablkcipher_ctx(cipher); | ||
1333 | struct device *dev = ctx->dev; | ||
1334 | struct talitos_desc *desc = &edesc->desc; | ||
1335 | unsigned int cryptlen = areq->nbytes; | ||
1336 | unsigned int ivsize; | ||
1337 | int sg_count, ret; | ||
1338 | |||
1339 | /* first DWORD empty */ | ||
1340 | desc->ptr[0].len = 0; | ||
1341 | desc->ptr[0].ptr = 0; | ||
1342 | desc->ptr[0].j_extent = 0; | ||
1343 | |||
1344 | /* cipher iv */ | ||
1345 | ivsize = crypto_ablkcipher_ivsize(cipher); | ||
1346 | map_single_talitos_ptr(dev, &desc->ptr[1], ivsize, giv ?: areq->info, 0, | ||
1347 | DMA_TO_DEVICE); | ||
1348 | |||
1349 | /* cipher key */ | ||
1350 | map_single_talitos_ptr(dev, &desc->ptr[2], ctx->keylen, | ||
1351 | (char *)&ctx->key, 0, DMA_TO_DEVICE); | ||
1352 | |||
1353 | /* | ||
1354 | * cipher in | ||
1355 | */ | ||
1356 | desc->ptr[3].len = cpu_to_be16(cryptlen); | ||
1357 | desc->ptr[3].j_extent = 0; | ||
1358 | |||
1359 | sg_count = talitos_map_sg(dev, areq->src, edesc->src_nents ? : 1, | ||
1360 | (areq->src == areq->dst) ? DMA_BIDIRECTIONAL | ||
1361 | : DMA_TO_DEVICE, | ||
1362 | edesc->src_is_chained); | ||
1363 | |||
1364 | if (sg_count == 1) { | ||
1365 | desc->ptr[3].ptr = cpu_to_be32(sg_dma_address(areq->src)); | ||
1366 | } else { | ||
1367 | sg_count = sg_to_link_tbl(areq->src, sg_count, cryptlen, | ||
1368 | &edesc->link_tbl[0]); | ||
1369 | if (sg_count > 1) { | ||
1370 | desc->ptr[3].j_extent |= DESC_PTR_LNKTBL_JUMP; | ||
1371 | desc->ptr[3].ptr = cpu_to_be32(edesc->dma_link_tbl); | ||
1372 | dma_sync_single_for_device(dev, edesc->dma_link_tbl, | ||
1373 | edesc->dma_len, | ||
1374 | DMA_BIDIRECTIONAL); | ||
1375 | } else { | ||
1376 | /* Only one segment now, so no link tbl needed */ | ||
1377 | desc->ptr[3].ptr = cpu_to_be32(sg_dma_address(areq-> | ||
1378 | src)); | ||
1379 | } | ||
1380 | } | ||
1381 | |||
1382 | /* cipher out */ | ||
1383 | desc->ptr[4].len = cpu_to_be16(cryptlen); | ||
1384 | desc->ptr[4].j_extent = 0; | ||
1385 | |||
1386 | if (areq->src != areq->dst) | ||
1387 | sg_count = talitos_map_sg(dev, areq->dst, | ||
1388 | edesc->dst_nents ? : 1, | ||
1389 | DMA_FROM_DEVICE, | ||
1390 | edesc->dst_is_chained); | ||
1391 | |||
1392 | if (sg_count == 1) { | ||
1393 | desc->ptr[4].ptr = cpu_to_be32(sg_dma_address(areq->dst)); | ||
1394 | } else { | ||
1395 | struct talitos_ptr *link_tbl_ptr = | ||
1396 | &edesc->link_tbl[edesc->src_nents + 1]; | ||
1397 | |||
1398 | desc->ptr[4].j_extent |= DESC_PTR_LNKTBL_JUMP; | ||
1399 | desc->ptr[4].ptr = cpu_to_be32((struct talitos_ptr *) | ||
1400 | edesc->dma_link_tbl + | ||
1401 | edesc->src_nents + 1); | ||
1402 | sg_count = sg_to_link_tbl(areq->dst, sg_count, cryptlen, | ||
1403 | link_tbl_ptr); | ||
1404 | dma_sync_single_for_device(ctx->dev, edesc->dma_link_tbl, | ||
1405 | edesc->dma_len, DMA_BIDIRECTIONAL); | ||
1406 | } | ||
1407 | |||
1408 | /* iv out */ | ||
1409 | map_single_talitos_ptr(dev, &desc->ptr[5], ivsize, ctx->iv, 0, | ||
1410 | DMA_FROM_DEVICE); | ||
1411 | |||
1412 | /* last DWORD empty */ | ||
1413 | desc->ptr[6].len = 0; | ||
1414 | desc->ptr[6].ptr = 0; | ||
1415 | desc->ptr[6].j_extent = 0; | ||
1416 | |||
1417 | ret = talitos_submit(dev, desc, callback, areq); | ||
1418 | if (ret != -EINPROGRESS) { | ||
1419 | common_nonsnoop_unmap(dev, edesc, areq); | ||
1420 | kfree(edesc); | ||
1421 | } | ||
1422 | return ret; | ||
1423 | } | ||
1424 | |||
1425 | static struct talitos_edesc *ablkcipher_edesc_alloc(struct ablkcipher_request * | ||
1426 | areq) | ||
1427 | { | ||
1428 | struct crypto_ablkcipher *cipher = crypto_ablkcipher_reqtfm(areq); | ||
1429 | struct talitos_ctx *ctx = crypto_ablkcipher_ctx(cipher); | ||
1430 | |||
1431 | return talitos_edesc_alloc(ctx->dev, areq->src, areq->dst, areq->nbytes, | ||
1432 | 0, 0, areq->base.flags); | ||
1433 | } | ||
1434 | |||
1435 | static int ablkcipher_encrypt(struct ablkcipher_request *areq) | ||
1436 | { | ||
1437 | struct crypto_ablkcipher *cipher = crypto_ablkcipher_reqtfm(areq); | ||
1438 | struct talitos_ctx *ctx = crypto_ablkcipher_ctx(cipher); | ||
1439 | struct talitos_edesc *edesc; | ||
1440 | |||
1441 | /* allocate extended descriptor */ | ||
1442 | edesc = ablkcipher_edesc_alloc(areq); | ||
1443 | if (IS_ERR(edesc)) | ||
1444 | return PTR_ERR(edesc); | ||
1445 | |||
1446 | /* set encrypt */ | ||
1447 | edesc->desc.hdr = ctx->desc_hdr_template | DESC_HDR_MODE0_ENCRYPT; | ||
1448 | |||
1449 | return common_nonsnoop(edesc, areq, NULL, ablkcipher_done); | ||
1450 | } | ||
1451 | |||
1452 | static int ablkcipher_decrypt(struct ablkcipher_request *areq) | ||
1453 | { | ||
1454 | struct crypto_ablkcipher *cipher = crypto_ablkcipher_reqtfm(areq); | ||
1455 | struct talitos_ctx *ctx = crypto_ablkcipher_ctx(cipher); | ||
1456 | struct talitos_edesc *edesc; | ||
1457 | |||
1458 | /* allocate extended descriptor */ | ||
1459 | edesc = ablkcipher_edesc_alloc(areq); | ||
1460 | if (IS_ERR(edesc)) | ||
1461 | return PTR_ERR(edesc); | ||
1462 | |||
1463 | edesc->desc.hdr = ctx->desc_hdr_template | DESC_HDR_DIR_INBOUND; | ||
1464 | |||
1465 | return common_nonsnoop(edesc, areq, NULL, ablkcipher_done); | ||
1466 | } | ||
1467 | |||
1207 | struct talitos_alg_template { | 1468 | struct talitos_alg_template { |
1208 | char name[CRYPTO_MAX_ALG_NAME]; | 1469 | struct crypto_alg alg; |
1209 | char driver_name[CRYPTO_MAX_ALG_NAME]; | ||
1210 | unsigned int blocksize; | ||
1211 | struct aead_alg aead; | ||
1212 | struct device *dev; | ||
1213 | __be32 desc_hdr_template; | 1470 | __be32 desc_hdr_template; |
1214 | }; | 1471 | }; |
1215 | 1472 | ||
1216 | static struct talitos_alg_template driver_algs[] = { | 1473 | static struct talitos_alg_template driver_algs[] = { |
1217 | /* single-pass ipsec_esp descriptor */ | 1474 | /* AEAD algorithms. These use a single-pass ipsec_esp descriptor */ |
1218 | { | 1475 | { |
1219 | .name = "authenc(hmac(sha1),cbc(aes))", | 1476 | .alg = { |
1220 | .driver_name = "authenc-hmac-sha1-cbc-aes-talitos", | 1477 | .cra_name = "authenc(hmac(sha1),cbc(aes))", |
1221 | .blocksize = AES_BLOCK_SIZE, | 1478 | .cra_driver_name = "authenc-hmac-sha1-cbc-aes-talitos", |
1222 | .aead = { | 1479 | .cra_blocksize = AES_BLOCK_SIZE, |
1223 | .setkey = aead_authenc_setkey, | 1480 | .cra_flags = CRYPTO_ALG_TYPE_AEAD | CRYPTO_ALG_ASYNC, |
1224 | .setauthsize = aead_authenc_setauthsize, | 1481 | .cra_type = &crypto_aead_type, |
1225 | .encrypt = aead_authenc_encrypt, | 1482 | .cra_aead = { |
1226 | .decrypt = aead_authenc_decrypt, | 1483 | .setkey = aead_setkey, |
1227 | .givencrypt = aead_authenc_givencrypt, | 1484 | .setauthsize = aead_setauthsize, |
1228 | .geniv = "<built-in>", | 1485 | .encrypt = aead_encrypt, |
1229 | .ivsize = AES_BLOCK_SIZE, | 1486 | .decrypt = aead_decrypt, |
1230 | .maxauthsize = SHA1_DIGEST_SIZE, | 1487 | .givencrypt = aead_givencrypt, |
1231 | }, | 1488 | .geniv = "<built-in>", |
1489 | .ivsize = AES_BLOCK_SIZE, | ||
1490 | .maxauthsize = SHA1_DIGEST_SIZE, | ||
1491 | } | ||
1492 | }, | ||
1232 | .desc_hdr_template = DESC_HDR_TYPE_IPSEC_ESP | | 1493 | .desc_hdr_template = DESC_HDR_TYPE_IPSEC_ESP | |
1233 | DESC_HDR_SEL0_AESU | | 1494 | DESC_HDR_SEL0_AESU | |
1234 | DESC_HDR_MODE0_AESU_CBC | | 1495 | DESC_HDR_MODE0_AESU_CBC | |
@@ -1238,19 +1499,23 @@ static struct talitos_alg_template driver_algs[] = { | |||
1238 | DESC_HDR_MODE1_MDEU_SHA1_HMAC, | 1499 | DESC_HDR_MODE1_MDEU_SHA1_HMAC, |
1239 | }, | 1500 | }, |
1240 | { | 1501 | { |
1241 | .name = "authenc(hmac(sha1),cbc(des3_ede))", | 1502 | .alg = { |
1242 | .driver_name = "authenc-hmac-sha1-cbc-3des-talitos", | 1503 | .cra_name = "authenc(hmac(sha1),cbc(des3_ede))", |
1243 | .blocksize = DES3_EDE_BLOCK_SIZE, | 1504 | .cra_driver_name = "authenc-hmac-sha1-cbc-3des-talitos", |
1244 | .aead = { | 1505 | .cra_blocksize = DES3_EDE_BLOCK_SIZE, |
1245 | .setkey = aead_authenc_setkey, | 1506 | .cra_flags = CRYPTO_ALG_TYPE_AEAD | CRYPTO_ALG_ASYNC, |
1246 | .setauthsize = aead_authenc_setauthsize, | 1507 | .cra_type = &crypto_aead_type, |
1247 | .encrypt = aead_authenc_encrypt, | 1508 | .cra_aead = { |
1248 | .decrypt = aead_authenc_decrypt, | 1509 | .setkey = aead_setkey, |
1249 | .givencrypt = aead_authenc_givencrypt, | 1510 | .setauthsize = aead_setauthsize, |
1250 | .geniv = "<built-in>", | 1511 | .encrypt = aead_encrypt, |
1251 | .ivsize = DES3_EDE_BLOCK_SIZE, | 1512 | .decrypt = aead_decrypt, |
1252 | .maxauthsize = SHA1_DIGEST_SIZE, | 1513 | .givencrypt = aead_givencrypt, |
1253 | }, | 1514 | .geniv = "<built-in>", |
1515 | .ivsize = DES3_EDE_BLOCK_SIZE, | ||
1516 | .maxauthsize = SHA1_DIGEST_SIZE, | ||
1517 | } | ||
1518 | }, | ||
1254 | .desc_hdr_template = DESC_HDR_TYPE_IPSEC_ESP | | 1519 | .desc_hdr_template = DESC_HDR_TYPE_IPSEC_ESP | |
1255 | DESC_HDR_SEL0_DEU | | 1520 | DESC_HDR_SEL0_DEU | |
1256 | DESC_HDR_MODE0_DEU_CBC | | 1521 | DESC_HDR_MODE0_DEU_CBC | |
@@ -1261,19 +1526,23 @@ static struct talitos_alg_template driver_algs[] = { | |||
1261 | DESC_HDR_MODE1_MDEU_SHA1_HMAC, | 1526 | DESC_HDR_MODE1_MDEU_SHA1_HMAC, |
1262 | }, | 1527 | }, |
1263 | { | 1528 | { |
1264 | .name = "authenc(hmac(sha256),cbc(aes))", | 1529 | .alg = { |
1265 | .driver_name = "authenc-hmac-sha256-cbc-aes-talitos", | 1530 | .cra_name = "authenc(hmac(sha256),cbc(aes))", |
1266 | .blocksize = AES_BLOCK_SIZE, | 1531 | .cra_driver_name = "authenc-hmac-sha256-cbc-aes-talitos", |
1267 | .aead = { | 1532 | .cra_blocksize = AES_BLOCK_SIZE, |
1268 | .setkey = aead_authenc_setkey, | 1533 | .cra_flags = CRYPTO_ALG_TYPE_AEAD | CRYPTO_ALG_ASYNC, |
1269 | .setauthsize = aead_authenc_setauthsize, | 1534 | .cra_type = &crypto_aead_type, |
1270 | .encrypt = aead_authenc_encrypt, | 1535 | .cra_aead = { |
1271 | .decrypt = aead_authenc_decrypt, | 1536 | .setkey = aead_setkey, |
1272 | .givencrypt = aead_authenc_givencrypt, | 1537 | .setauthsize = aead_setauthsize, |
1273 | .geniv = "<built-in>", | 1538 | .encrypt = aead_encrypt, |
1274 | .ivsize = AES_BLOCK_SIZE, | 1539 | .decrypt = aead_decrypt, |
1275 | .maxauthsize = SHA256_DIGEST_SIZE, | 1540 | .givencrypt = aead_givencrypt, |
1276 | }, | 1541 | .geniv = "<built-in>", |
1542 | .ivsize = AES_BLOCK_SIZE, | ||
1543 | .maxauthsize = SHA256_DIGEST_SIZE, | ||
1544 | } | ||
1545 | }, | ||
1277 | .desc_hdr_template = DESC_HDR_TYPE_IPSEC_ESP | | 1546 | .desc_hdr_template = DESC_HDR_TYPE_IPSEC_ESP | |
1278 | DESC_HDR_SEL0_AESU | | 1547 | DESC_HDR_SEL0_AESU | |
1279 | DESC_HDR_MODE0_AESU_CBC | | 1548 | DESC_HDR_MODE0_AESU_CBC | |
@@ -1283,19 +1552,23 @@ static struct talitos_alg_template driver_algs[] = { | |||
1283 | DESC_HDR_MODE1_MDEU_SHA256_HMAC, | 1552 | DESC_HDR_MODE1_MDEU_SHA256_HMAC, |
1284 | }, | 1553 | }, |
1285 | { | 1554 | { |
1286 | .name = "authenc(hmac(sha256),cbc(des3_ede))", | 1555 | .alg = { |
1287 | .driver_name = "authenc-hmac-sha256-cbc-3des-talitos", | 1556 | .cra_name = "authenc(hmac(sha256),cbc(des3_ede))", |
1288 | .blocksize = DES3_EDE_BLOCK_SIZE, | 1557 | .cra_driver_name = "authenc-hmac-sha256-cbc-3des-talitos", |
1289 | .aead = { | 1558 | .cra_blocksize = DES3_EDE_BLOCK_SIZE, |
1290 | .setkey = aead_authenc_setkey, | 1559 | .cra_flags = CRYPTO_ALG_TYPE_AEAD | CRYPTO_ALG_ASYNC, |
1291 | .setauthsize = aead_authenc_setauthsize, | 1560 | .cra_type = &crypto_aead_type, |
1292 | .encrypt = aead_authenc_encrypt, | 1561 | .cra_aead = { |
1293 | .decrypt = aead_authenc_decrypt, | 1562 | .setkey = aead_setkey, |
1294 | .givencrypt = aead_authenc_givencrypt, | 1563 | .setauthsize = aead_setauthsize, |
1295 | .geniv = "<built-in>", | 1564 | .encrypt = aead_encrypt, |
1296 | .ivsize = DES3_EDE_BLOCK_SIZE, | 1565 | .decrypt = aead_decrypt, |
1297 | .maxauthsize = SHA256_DIGEST_SIZE, | 1566 | .givencrypt = aead_givencrypt, |
1298 | }, | 1567 | .geniv = "<built-in>", |
1568 | .ivsize = DES3_EDE_BLOCK_SIZE, | ||
1569 | .maxauthsize = SHA256_DIGEST_SIZE, | ||
1570 | } | ||
1571 | }, | ||
1299 | .desc_hdr_template = DESC_HDR_TYPE_IPSEC_ESP | | 1572 | .desc_hdr_template = DESC_HDR_TYPE_IPSEC_ESP | |
1300 | DESC_HDR_SEL0_DEU | | 1573 | DESC_HDR_SEL0_DEU | |
1301 | DESC_HDR_MODE0_DEU_CBC | | 1574 | DESC_HDR_MODE0_DEU_CBC | |
@@ -1306,19 +1579,23 @@ static struct talitos_alg_template driver_algs[] = { | |||
1306 | DESC_HDR_MODE1_MDEU_SHA256_HMAC, | 1579 | DESC_HDR_MODE1_MDEU_SHA256_HMAC, |
1307 | }, | 1580 | }, |
1308 | { | 1581 | { |
1309 | .name = "authenc(hmac(md5),cbc(aes))", | 1582 | .alg = { |
1310 | .driver_name = "authenc-hmac-md5-cbc-aes-talitos", | 1583 | .cra_name = "authenc(hmac(md5),cbc(aes))", |
1311 | .blocksize = AES_BLOCK_SIZE, | 1584 | .cra_driver_name = "authenc-hmac-md5-cbc-aes-talitos", |
1312 | .aead = { | 1585 | .cra_blocksize = AES_BLOCK_SIZE, |
1313 | .setkey = aead_authenc_setkey, | 1586 | .cra_flags = CRYPTO_ALG_TYPE_AEAD | CRYPTO_ALG_ASYNC, |
1314 | .setauthsize = aead_authenc_setauthsize, | 1587 | .cra_type = &crypto_aead_type, |
1315 | .encrypt = aead_authenc_encrypt, | 1588 | .cra_aead = { |
1316 | .decrypt = aead_authenc_decrypt, | 1589 | .setkey = aead_setkey, |
1317 | .givencrypt = aead_authenc_givencrypt, | 1590 | .setauthsize = aead_setauthsize, |
1318 | .geniv = "<built-in>", | 1591 | .encrypt = aead_encrypt, |
1319 | .ivsize = AES_BLOCK_SIZE, | 1592 | .decrypt = aead_decrypt, |
1320 | .maxauthsize = MD5_DIGEST_SIZE, | 1593 | .givencrypt = aead_givencrypt, |
1321 | }, | 1594 | .geniv = "<built-in>", |
1595 | .ivsize = AES_BLOCK_SIZE, | ||
1596 | .maxauthsize = MD5_DIGEST_SIZE, | ||
1597 | } | ||
1598 | }, | ||
1322 | .desc_hdr_template = DESC_HDR_TYPE_IPSEC_ESP | | 1599 | .desc_hdr_template = DESC_HDR_TYPE_IPSEC_ESP | |
1323 | DESC_HDR_SEL0_AESU | | 1600 | DESC_HDR_SEL0_AESU | |
1324 | DESC_HDR_MODE0_AESU_CBC | | 1601 | DESC_HDR_MODE0_AESU_CBC | |
@@ -1328,19 +1605,23 @@ static struct talitos_alg_template driver_algs[] = { | |||
1328 | DESC_HDR_MODE1_MDEU_MD5_HMAC, | 1605 | DESC_HDR_MODE1_MDEU_MD5_HMAC, |
1329 | }, | 1606 | }, |
1330 | { | 1607 | { |
1331 | .name = "authenc(hmac(md5),cbc(des3_ede))", | 1608 | .alg = { |
1332 | .driver_name = "authenc-hmac-md5-cbc-3des-talitos", | 1609 | .cra_name = "authenc(hmac(md5),cbc(des3_ede))", |
1333 | .blocksize = DES3_EDE_BLOCK_SIZE, | 1610 | .cra_driver_name = "authenc-hmac-md5-cbc-3des-talitos", |
1334 | .aead = { | 1611 | .cra_blocksize = DES3_EDE_BLOCK_SIZE, |
1335 | .setkey = aead_authenc_setkey, | 1612 | .cra_flags = CRYPTO_ALG_TYPE_AEAD | CRYPTO_ALG_ASYNC, |
1336 | .setauthsize = aead_authenc_setauthsize, | 1613 | .cra_type = &crypto_aead_type, |
1337 | .encrypt = aead_authenc_encrypt, | 1614 | .cra_aead = { |
1338 | .decrypt = aead_authenc_decrypt, | 1615 | .setkey = aead_setkey, |
1339 | .givencrypt = aead_authenc_givencrypt, | 1616 | .setauthsize = aead_setauthsize, |
1340 | .geniv = "<built-in>", | 1617 | .encrypt = aead_encrypt, |
1341 | .ivsize = DES3_EDE_BLOCK_SIZE, | 1618 | .decrypt = aead_decrypt, |
1342 | .maxauthsize = MD5_DIGEST_SIZE, | 1619 | .givencrypt = aead_givencrypt, |
1343 | }, | 1620 | .geniv = "<built-in>", |
1621 | .ivsize = DES3_EDE_BLOCK_SIZE, | ||
1622 | .maxauthsize = MD5_DIGEST_SIZE, | ||
1623 | } | ||
1624 | }, | ||
1344 | .desc_hdr_template = DESC_HDR_TYPE_IPSEC_ESP | | 1625 | .desc_hdr_template = DESC_HDR_TYPE_IPSEC_ESP | |
1345 | DESC_HDR_SEL0_DEU | | 1626 | DESC_HDR_SEL0_DEU | |
1346 | DESC_HDR_MODE0_DEU_CBC | | 1627 | DESC_HDR_MODE0_DEU_CBC | |
@@ -1349,6 +1630,52 @@ static struct talitos_alg_template driver_algs[] = { | |||
1349 | DESC_HDR_MODE1_MDEU_INIT | | 1630 | DESC_HDR_MODE1_MDEU_INIT | |
1350 | DESC_HDR_MODE1_MDEU_PAD | | 1631 | DESC_HDR_MODE1_MDEU_PAD | |
1351 | DESC_HDR_MODE1_MDEU_MD5_HMAC, | 1632 | DESC_HDR_MODE1_MDEU_MD5_HMAC, |
1633 | }, | ||
1634 | /* ABLKCIPHER algorithms. */ | ||
1635 | { | ||
1636 | .alg = { | ||
1637 | .cra_name = "cbc(aes)", | ||
1638 | .cra_driver_name = "cbc-aes-talitos", | ||
1639 | .cra_blocksize = AES_BLOCK_SIZE, | ||
1640 | .cra_flags = CRYPTO_ALG_TYPE_ABLKCIPHER | | ||
1641 | CRYPTO_ALG_ASYNC, | ||
1642 | .cra_type = &crypto_ablkcipher_type, | ||
1643 | .cra_ablkcipher = { | ||
1644 | .setkey = ablkcipher_setkey, | ||
1645 | .encrypt = ablkcipher_encrypt, | ||
1646 | .decrypt = ablkcipher_decrypt, | ||
1647 | .geniv = "eseqiv", | ||
1648 | .min_keysize = AES_MIN_KEY_SIZE, | ||
1649 | .max_keysize = AES_MAX_KEY_SIZE, | ||
1650 | .ivsize = AES_BLOCK_SIZE, | ||
1651 | } | ||
1652 | }, | ||
1653 | .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | | ||
1654 | DESC_HDR_SEL0_AESU | | ||
1655 | DESC_HDR_MODE0_AESU_CBC, | ||
1656 | }, | ||
1657 | { | ||
1658 | .alg = { | ||
1659 | .cra_name = "cbc(des3_ede)", | ||
1660 | .cra_driver_name = "cbc-3des-talitos", | ||
1661 | .cra_blocksize = DES3_EDE_BLOCK_SIZE, | ||
1662 | .cra_flags = CRYPTO_ALG_TYPE_ABLKCIPHER | | ||
1663 | CRYPTO_ALG_ASYNC, | ||
1664 | .cra_type = &crypto_ablkcipher_type, | ||
1665 | .cra_ablkcipher = { | ||
1666 | .setkey = ablkcipher_setkey, | ||
1667 | .encrypt = ablkcipher_encrypt, | ||
1668 | .decrypt = ablkcipher_decrypt, | ||
1669 | .geniv = "eseqiv", | ||
1670 | .min_keysize = DES3_EDE_KEY_SIZE, | ||
1671 | .max_keysize = DES3_EDE_KEY_SIZE, | ||
1672 | .ivsize = DES3_EDE_BLOCK_SIZE, | ||
1673 | } | ||
1674 | }, | ||
1675 | .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | | ||
1676 | DESC_HDR_SEL0_DEU | | ||
1677 | DESC_HDR_MODE0_DEU_CBC | | ||
1678 | DESC_HDR_MODE0_DEU_3DES, | ||
1352 | } | 1679 | } |
1353 | }; | 1680 | }; |
1354 | 1681 | ||
@@ -1362,12 +1689,14 @@ struct talitos_crypto_alg { | |||
1362 | static int talitos_cra_init(struct crypto_tfm *tfm) | 1689 | static int talitos_cra_init(struct crypto_tfm *tfm) |
1363 | { | 1690 | { |
1364 | struct crypto_alg *alg = tfm->__crt_alg; | 1691 | struct crypto_alg *alg = tfm->__crt_alg; |
1365 | struct talitos_crypto_alg *talitos_alg = | 1692 | struct talitos_crypto_alg *talitos_alg; |
1366 | container_of(alg, struct talitos_crypto_alg, crypto_alg); | ||
1367 | struct talitos_ctx *ctx = crypto_tfm_ctx(tfm); | 1693 | struct talitos_ctx *ctx = crypto_tfm_ctx(tfm); |
1368 | 1694 | ||
1695 | talitos_alg = container_of(alg, struct talitos_crypto_alg, crypto_alg); | ||
1696 | |||
1369 | /* update context with ptr to dev */ | 1697 | /* update context with ptr to dev */ |
1370 | ctx->dev = talitos_alg->dev; | 1698 | ctx->dev = talitos_alg->dev; |
1699 | |||
1371 | /* copy descriptor header template value */ | 1700 | /* copy descriptor header template value */ |
1372 | ctx->desc_hdr_template = talitos_alg->desc_hdr_template; | 1701 | ctx->desc_hdr_template = talitos_alg->desc_hdr_template; |
1373 | 1702 | ||
@@ -1453,19 +1782,13 @@ static struct talitos_crypto_alg *talitos_alg_alloc(struct device *dev, | |||
1453 | return ERR_PTR(-ENOMEM); | 1782 | return ERR_PTR(-ENOMEM); |
1454 | 1783 | ||
1455 | alg = &t_alg->crypto_alg; | 1784 | alg = &t_alg->crypto_alg; |
1785 | *alg = template->alg; | ||
1456 | 1786 | ||
1457 | snprintf(alg->cra_name, CRYPTO_MAX_ALG_NAME, "%s", template->name); | ||
1458 | snprintf(alg->cra_driver_name, CRYPTO_MAX_ALG_NAME, "%s", | ||
1459 | template->driver_name); | ||
1460 | alg->cra_module = THIS_MODULE; | 1787 | alg->cra_module = THIS_MODULE; |
1461 | alg->cra_init = talitos_cra_init; | 1788 | alg->cra_init = talitos_cra_init; |
1462 | alg->cra_priority = TALITOS_CRA_PRIORITY; | 1789 | alg->cra_priority = TALITOS_CRA_PRIORITY; |
1463 | alg->cra_flags = CRYPTO_ALG_TYPE_AEAD | CRYPTO_ALG_ASYNC; | ||
1464 | alg->cra_blocksize = template->blocksize; | ||
1465 | alg->cra_alignmask = 0; | 1790 | alg->cra_alignmask = 0; |
1466 | alg->cra_type = &crypto_aead_type; | ||
1467 | alg->cra_ctxsize = sizeof(struct talitos_ctx); | 1791 | alg->cra_ctxsize = sizeof(struct talitos_ctx); |
1468 | alg->cra_u.aead = template->aead; | ||
1469 | 1792 | ||
1470 | t_alg->desc_hdr_template = template->desc_hdr_template; | 1793 | t_alg->desc_hdr_template = template->desc_hdr_template; |
1471 | t_alg->dev = dev; | 1794 | t_alg->dev = dev; |
diff --git a/drivers/edac/e752x_edac.c b/drivers/edac/e752x_edac.c index facfdb1fa71c..d205d493a68a 100644 --- a/drivers/edac/e752x_edac.c +++ b/drivers/edac/e752x_edac.c | |||
@@ -1084,7 +1084,7 @@ static void e752x_init_sysbus_parity_mask(struct e752x_pvt *pvt) | |||
1084 | struct pci_dev *dev = pvt->dev_d0f1; | 1084 | struct pci_dev *dev = pvt->dev_d0f1; |
1085 | int enable = 1; | 1085 | int enable = 1; |
1086 | 1086 | ||
1087 | /* Allow module paramter override, else see if CPU supports parity */ | 1087 | /* Allow module parameter override, else see if CPU supports parity */ |
1088 | if (sysbus_parity != -1) { | 1088 | if (sysbus_parity != -1) { |
1089 | enable = sysbus_parity; | 1089 | enable = sysbus_parity; |
1090 | } else if (cpu_id[0] && | 1090 | } else if (cpu_id[0] && |
diff --git a/drivers/hid/Kconfig b/drivers/hid/Kconfig index 7e67dcb3d4f6..7831a0318d3c 100644 --- a/drivers/hid/Kconfig +++ b/drivers/hid/Kconfig | |||
@@ -116,9 +116,16 @@ config HID_CYPRESS | |||
116 | ---help--- | 116 | ---help--- |
117 | Support for cypress mouse and barcode readers. | 117 | Support for cypress mouse and barcode readers. |
118 | 118 | ||
119 | config DRAGONRISE_FF | 119 | config HID_DRAGONRISE |
120 | tristate "DragonRise Inc. force feedback support" | 120 | tristate "DragonRise Inc. support" if EMBEDDED |
121 | depends on USB_HID | 121 | depends on USB_HID |
122 | default !EMBEDDED | ||
123 | ---help--- | ||
124 | Say Y here if you have DragonRise Inc.game controllers. | ||
125 | |||
126 | config DRAGONRISE_FF | ||
127 | bool "DragonRise Inc. force feedback support" | ||
128 | depends on HID_DRAGONRISE | ||
122 | select INPUT_FF_MEMLESS | 129 | select INPUT_FF_MEMLESS |
123 | ---help--- | 130 | ---help--- |
124 | Say Y here if you want to enable force feedback support for DragonRise Inc. | 131 | Say Y here if you want to enable force feedback support for DragonRise Inc. |
@@ -160,7 +167,7 @@ config HID_LOGITECH | |||
160 | Support for Logitech devices that are not fully compliant with HID standard. | 167 | Support for Logitech devices that are not fully compliant with HID standard. |
161 | 168 | ||
162 | config LOGITECH_FF | 169 | config LOGITECH_FF |
163 | bool "Logitech force feedback" | 170 | bool "Logitech force feedback support" |
164 | depends on HID_LOGITECH | 171 | depends on HID_LOGITECH |
165 | select INPUT_FF_MEMLESS | 172 | select INPUT_FF_MEMLESS |
166 | help | 173 | help |
@@ -176,7 +183,7 @@ config LOGITECH_FF | |||
176 | force feedback. | 183 | force feedback. |
177 | 184 | ||
178 | config LOGIRUMBLEPAD2_FF | 185 | config LOGIRUMBLEPAD2_FF |
179 | bool "Logitech Rumblepad 2 force feedback" | 186 | bool "Logitech Rumblepad 2 force feedback support" |
180 | depends on HID_LOGITECH | 187 | depends on HID_LOGITECH |
181 | select INPUT_FF_MEMLESS | 188 | select INPUT_FF_MEMLESS |
182 | help | 189 | help |
@@ -211,11 +218,19 @@ config HID_PANTHERLORD | |||
211 | ---help--- | 218 | ---help--- |
212 | Support for PantherLord/GreenAsia based device support. | 219 | Support for PantherLord/GreenAsia based device support. |
213 | 220 | ||
221 | config HID_PANTHERLORD | ||
222 | tristate "Pantherlord support" if EMBEDDED | ||
223 | depends on USB_HID | ||
224 | default !EMBEDDED | ||
225 | ---help--- | ||
226 | Say Y here if you have a PantherLord/GreenAsia based game controller | ||
227 | or adapter. | ||
228 | |||
214 | config PANTHERLORD_FF | 229 | config PANTHERLORD_FF |
215 | bool "Pantherlord force feedback support" | 230 | bool "Pantherlord force feedback support" |
216 | depends on HID_PANTHERLORD | 231 | depends on HID_PANTHERLORD |
217 | select INPUT_FF_MEMLESS | 232 | select INPUT_FF_MEMLESS |
218 | help | 233 | ---help--- |
219 | Say Y here if you have a PantherLord/GreenAsia based game controller | 234 | Say Y here if you have a PantherLord/GreenAsia based game controller |
220 | or adapter and want to enable force feedback support for it. | 235 | or adapter and want to enable force feedback support for it. |
221 | 236 | ||
@@ -247,15 +262,38 @@ config HID_SUNPLUS | |||
247 | ---help--- | 262 | ---help--- |
248 | Support for Sunplus wireless desktop. | 263 | Support for Sunplus wireless desktop. |
249 | 264 | ||
250 | config GREENASIA_FF | 265 | config HID_GREENASIA |
251 | tristate "GreenAsia (Product ID 0x12) force feedback support" | 266 | tristate "GreenAsia (Product ID 0x12) support" if EMBEDDED |
252 | depends on USB_HID | 267 | depends on USB_HID |
268 | default !EMBEDDED | ||
269 | ---help--- | ||
270 | Say Y here if you have a GreenAsia (Product ID 0x12) based game | ||
271 | controller or adapter. | ||
272 | |||
273 | config GREENASIA_FF | ||
274 | bool "GreenAsia (Product ID 0x12) force feedback support" | ||
275 | depends on HID_GREENASIA | ||
253 | select INPUT_FF_MEMLESS | 276 | select INPUT_FF_MEMLESS |
254 | ---help--- | 277 | ---help--- |
255 | Say Y here if you have a GreenAsia (Product ID 0x12) based game controller | 278 | Say Y here if you have a GreenAsia (Product ID 0x12) based game controller |
256 | (like MANTA Warrior MM816 and SpeedLink Strike2 SL-6635) or adapter | 279 | (like MANTA Warrior MM816 and SpeedLink Strike2 SL-6635) or adapter |
257 | and want to enable force feedback support for it. | 280 | and want to enable force feedback support for it. |
258 | 281 | ||
282 | config HID_SMARTJOYPLUS | ||
283 | tristate "SmartJoy PLUS PS2/USB adapter support" if EMBEDDED | ||
284 | depends on USB_HID | ||
285 | default !EMBEDDED | ||
286 | ---help--- | ||
287 | Support for SmartJoy PLUS PS2/USB adapter. | ||
288 | |||
289 | config SMARTJOYPLUS_FF | ||
290 | bool "SmartJoy PLUS PS2/USB adapter force feedback support" | ||
291 | depends on HID_SMARTJOYPLUS | ||
292 | select INPUT_FF_MEMLESS | ||
293 | ---help--- | ||
294 | Say Y here if you have a SmartJoy PLUS PS2/USB adapter and want to | ||
295 | enable force feedback support for it. | ||
296 | |||
259 | config HID_TOPSEED | 297 | config HID_TOPSEED |
260 | tristate "TopSeed Cyberlink remote control support" if EMBEDDED | 298 | tristate "TopSeed Cyberlink remote control support" if EMBEDDED |
261 | depends on USB_HID | 299 | depends on USB_HID |
@@ -263,21 +301,45 @@ config HID_TOPSEED | |||
263 | ---help--- | 301 | ---help--- |
264 | Say Y if you have a TopSeed Cyberlink remote control. | 302 | Say Y if you have a TopSeed Cyberlink remote control. |
265 | 303 | ||
266 | config THRUSTMASTER_FF | 304 | config HID_THRUSTMASTER |
267 | tristate "ThrustMaster devices support" | 305 | tristate "ThrustMaster devices support" if EMBEDDED |
268 | depends on USB_HID | 306 | depends on USB_HID |
307 | default !EMBEDDED | ||
308 | ---help--- | ||
309 | Say Y here if you have a THRUSTMASTER FireStore Dual Power 2 or | ||
310 | a THRUSTMASTER Ferrari GT Rumble Wheel. | ||
311 | |||
312 | config THRUSTMASTER_FF | ||
313 | bool "ThrustMaster devices force feedback support" | ||
314 | depends on HID_THRUSTMASTER | ||
269 | select INPUT_FF_MEMLESS | 315 | select INPUT_FF_MEMLESS |
270 | help | 316 | ---help--- |
271 | Say Y here if you have a THRUSTMASTER FireStore Dual Power 2 or | 317 | Say Y here if you have a THRUSTMASTER FireStore Dual Power 2 or |
272 | a THRUSTMASTER Ferrari GT Rumble Force or Force Feedback Wheel. | 318 | a THRUSTMASTER Ferrari GT Rumble Force or Force Feedback Wheel and |
319 | want to enable force feedback support for it. | ||
273 | 320 | ||
274 | config ZEROPLUS_FF | 321 | config HID_WACOM |
275 | tristate "Zeroplus based game controller support" | 322 | tristate "Wacom Bluetooth devices support" if EMBEDDED |
323 | depends on BT_HIDP | ||
324 | default !EMBEDDED | ||
325 | ---help--- | ||
326 | Support for Wacom Graphire Bluetooth tablet. | ||
327 | |||
328 | config HID_ZEROPLUS | ||
329 | tristate "Zeroplus based game controller support" if EMBEDDED | ||
276 | depends on USB_HID | 330 | depends on USB_HID |
277 | select INPUT_FF_MEMLESS | 331 | default !EMBEDDED |
278 | help | 332 | ---help--- |
279 | Say Y here if you have a Zeroplus based game controller. | 333 | Say Y here if you have a Zeroplus based game controller. |
280 | 334 | ||
335 | config ZEROPLUS_FF | ||
336 | bool "Zeroplus based game controller force feedback support" | ||
337 | depends on HID_ZEROPLUS | ||
338 | select INPUT_FF_MEMLESS | ||
339 | ---help--- | ||
340 | Say Y here if you have a Zeroplus based game controller and want | ||
341 | to have force feedback support for it. | ||
342 | |||
281 | endmenu | 343 | endmenu |
282 | 344 | ||
283 | endif # HID_SUPPORT | 345 | endif # HID_SUPPORT |
diff --git a/drivers/hid/Makefile b/drivers/hid/Makefile index 1f7cb0fd4505..db35151673b1 100644 --- a/drivers/hid/Makefile +++ b/drivers/hid/Makefile | |||
@@ -22,7 +22,7 @@ obj-$(CONFIG_HID_BELKIN) += hid-belkin.o | |||
22 | obj-$(CONFIG_HID_CHERRY) += hid-cherry.o | 22 | obj-$(CONFIG_HID_CHERRY) += hid-cherry.o |
23 | obj-$(CONFIG_HID_CHICONY) += hid-chicony.o | 23 | obj-$(CONFIG_HID_CHICONY) += hid-chicony.o |
24 | obj-$(CONFIG_HID_CYPRESS) += hid-cypress.o | 24 | obj-$(CONFIG_HID_CYPRESS) += hid-cypress.o |
25 | obj-$(CONFIG_DRAGONRISE_FF) += hid-drff.o | 25 | obj-$(CONFIG_HID_DRAGONRISE) += hid-drff.o |
26 | obj-$(CONFIG_HID_EZKEY) += hid-ezkey.o | 26 | obj-$(CONFIG_HID_EZKEY) += hid-ezkey.o |
27 | obj-$(CONFIG_HID_GYRATION) += hid-gyration.o | 27 | obj-$(CONFIG_HID_GYRATION) += hid-gyration.o |
28 | obj-$(CONFIG_HID_KENSINGTON) += hid-kensington.o | 28 | obj-$(CONFIG_HID_KENSINGTON) += hid-kensington.o |
@@ -34,12 +34,14 @@ obj-$(CONFIG_HID_NTRIG) += hid-ntrig.o | |||
34 | obj-$(CONFIG_HID_PANTHERLORD) += hid-pl.o | 34 | obj-$(CONFIG_HID_PANTHERLORD) += hid-pl.o |
35 | obj-$(CONFIG_HID_PETALYNX) += hid-petalynx.o | 35 | obj-$(CONFIG_HID_PETALYNX) += hid-petalynx.o |
36 | obj-$(CONFIG_HID_SAMSUNG) += hid-samsung.o | 36 | obj-$(CONFIG_HID_SAMSUNG) += hid-samsung.o |
37 | obj-$(CONFIG_HID_SMARTJOYPLUS) += hid-sjoy.o | ||
37 | obj-$(CONFIG_HID_SONY) += hid-sony.o | 38 | obj-$(CONFIG_HID_SONY) += hid-sony.o |
38 | obj-$(CONFIG_HID_SUNPLUS) += hid-sunplus.o | 39 | obj-$(CONFIG_HID_SUNPLUS) += hid-sunplus.o |
39 | obj-$(CONFIG_GREENASIA_FF) += hid-gaff.o | 40 | obj-$(CONFIG_HID_GREENASIA) += hid-gaff.o |
40 | obj-$(CONFIG_THRUSTMASTER_FF) += hid-tmff.o | 41 | obj-$(CONFIG_HID_THRUSTMASTER) += hid-tmff.o |
41 | obj-$(CONFIG_HID_TOPSEED) += hid-topseed.o | 42 | obj-$(CONFIG_HID_TOPSEED) += hid-topseed.o |
42 | obj-$(CONFIG_ZEROPLUS_FF) += hid-zpff.o | 43 | obj-$(CONFIG_HID_ZEROPLUS) += hid-zpff.o |
44 | obj-$(CONFIG_HID_WACOM) += hid-wacom.o | ||
43 | 45 | ||
44 | obj-$(CONFIG_USB_HID) += usbhid/ | 46 | obj-$(CONFIG_USB_HID) += usbhid/ |
45 | obj-$(CONFIG_USB_MOUSE) += usbhid/ | 47 | obj-$(CONFIG_USB_MOUSE) += usbhid/ |
diff --git a/drivers/hid/hid-apple.c b/drivers/hid/hid-apple.c index acbce5745b0c..303ccce05bb3 100644 --- a/drivers/hid/hid-apple.c +++ b/drivers/hid/hid-apple.c | |||
@@ -436,10 +436,6 @@ static const struct hid_device_id apple_devices[] = { | |||
436 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY), | 436 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY), |
437 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, | 437 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, |
438 | 438 | ||
439 | /* Apple wireless Mighty Mouse */ | ||
440 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, 0x030c), | ||
441 | .driver_data = APPLE_MIGHTYMOUSE | APPLE_INVERT_HWHEEL }, | ||
442 | |||
443 | { } | 439 | { } |
444 | }; | 440 | }; |
445 | MODULE_DEVICE_TABLE(hid, apple_devices); | 441 | MODULE_DEVICE_TABLE(hid, apple_devices); |
diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c index 8551693d645f..f2c21d5d24e8 100644 --- a/drivers/hid/hid-core.c +++ b/drivers/hid/hid-core.c | |||
@@ -1312,6 +1312,8 @@ static const struct hid_device_id hid_blacklist[] = { | |||
1312 | { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb651) }, | 1312 | { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb651) }, |
1313 | { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb654) }, | 1313 | { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb654) }, |
1314 | { HID_USB_DEVICE(USB_VENDOR_ID_TOPSEED, USB_DEVICE_ID_TOPSEED_CYBERLINK) }, | 1314 | { HID_USB_DEVICE(USB_VENDOR_ID_TOPSEED, USB_DEVICE_ID_TOPSEED_CYBERLINK) }, |
1315 | { HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_SMARTJOY_PLUS) }, | ||
1316 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_GRAPHIRE_BLUETOOTH) }, | ||
1315 | { HID_USB_DEVICE(USB_VENDOR_ID_ZEROPLUS, 0x0005) }, | 1317 | { HID_USB_DEVICE(USB_VENDOR_ID_ZEROPLUS, 0x0005) }, |
1316 | { HID_USB_DEVICE(USB_VENDOR_ID_ZEROPLUS, 0x0030) }, | 1318 | { HID_USB_DEVICE(USB_VENDOR_ID_ZEROPLUS, 0x0030) }, |
1317 | 1319 | ||
diff --git a/drivers/hid/hid-debug.c b/drivers/hid/hid-debug.c index 47ac1a7d66e1..04359ed64b87 100644 --- a/drivers/hid/hid-debug.c +++ b/drivers/hid/hid-debug.c | |||
@@ -137,6 +137,14 @@ static const struct hid_usage_entry hid_usage_table[] = { | |||
137 | {0, 0x44, "BarrelSwitch"}, | 137 | {0, 0x44, "BarrelSwitch"}, |
138 | {0, 0x45, "Eraser"}, | 138 | {0, 0x45, "Eraser"}, |
139 | {0, 0x46, "TabletPick"}, | 139 | {0, 0x46, "TabletPick"}, |
140 | {0, 0x47, "Confidence"}, | ||
141 | {0, 0x48, "Width"}, | ||
142 | {0, 0x49, "Height"}, | ||
143 | {0, 0x51, "ContactID"}, | ||
144 | {0, 0x52, "InputMode"}, | ||
145 | {0, 0x53, "DeviceIndex"}, | ||
146 | {0, 0x54, "ContactCount"}, | ||
147 | {0, 0x55, "ContactMaximumNumber"}, | ||
140 | { 15, 0, "PhysicalInterfaceDevice" }, | 148 | { 15, 0, "PhysicalInterfaceDevice" }, |
141 | {0, 0x00, "Undefined"}, | 149 | {0, 0x00, "Undefined"}, |
142 | {0, 0x01, "Physical_Interface_Device"}, | 150 | {0, 0x01, "Physical_Interface_Device"}, |
@@ -514,9 +522,11 @@ static const char *events[EV_MAX + 1] = { | |||
514 | [EV_FF_STATUS] = "ForceFeedbackStatus", | 522 | [EV_FF_STATUS] = "ForceFeedbackStatus", |
515 | }; | 523 | }; |
516 | 524 | ||
517 | static const char *syncs[2] = { | 525 | static const char *syncs[3] = { |
518 | [SYN_REPORT] = "Report", [SYN_CONFIG] = "Config", | 526 | [SYN_REPORT] = "Report", [SYN_CONFIG] = "Config", |
527 | [SYN_MT_REPORT] = "MT Report", | ||
519 | }; | 528 | }; |
529 | |||
520 | static const char *keys[KEY_MAX + 1] = { | 530 | static const char *keys[KEY_MAX + 1] = { |
521 | [KEY_RESERVED] = "Reserved", [KEY_ESC] = "Esc", | 531 | [KEY_RESERVED] = "Reserved", [KEY_ESC] = "Esc", |
522 | [KEY_1] = "1", [KEY_2] = "2", | 532 | [KEY_1] = "1", [KEY_2] = "2", |
@@ -734,8 +744,17 @@ static const char *absolutes[ABS_MAX + 1] = { | |||
734 | [ABS_HAT2Y] = "Hat2Y", [ABS_HAT3X] = "Hat3X", | 744 | [ABS_HAT2Y] = "Hat2Y", [ABS_HAT3X] = "Hat3X", |
735 | [ABS_HAT3Y] = "Hat 3Y", [ABS_PRESSURE] = "Pressure", | 745 | [ABS_HAT3Y] = "Hat 3Y", [ABS_PRESSURE] = "Pressure", |
736 | [ABS_DISTANCE] = "Distance", [ABS_TILT_X] = "XTilt", | 746 | [ABS_DISTANCE] = "Distance", [ABS_TILT_X] = "XTilt", |
737 | [ABS_TILT_Y] = "YTilt", [ABS_TOOL_WIDTH] = "Tool Width", | 747 | [ABS_TILT_Y] = "YTilt", [ABS_TOOL_WIDTH] = "ToolWidth", |
738 | [ABS_VOLUME] = "Volume", [ABS_MISC] = "Misc", | 748 | [ABS_VOLUME] = "Volume", [ABS_MISC] = "Misc", |
749 | [ABS_MT_TOUCH_MAJOR] = "MTMajor", | ||
750 | [ABS_MT_TOUCH_MINOR] = "MTMinor", | ||
751 | [ABS_MT_WIDTH_MAJOR] = "MTMajorW", | ||
752 | [ABS_MT_WIDTH_MINOR] = "MTMinorW", | ||
753 | [ABS_MT_ORIENTATION] = "MTOrientation", | ||
754 | [ABS_MT_POSITION_X] = "MTPositionX", | ||
755 | [ABS_MT_POSITION_Y] = "MTPositionY", | ||
756 | [ABS_MT_TOOL_TYPE] = "MTToolType", | ||
757 | [ABS_MT_BLOB_ID] = "MTBlobID", | ||
739 | }; | 758 | }; |
740 | 759 | ||
741 | static const char *misc[MSC_MAX + 1] = { | 760 | static const char *misc[MSC_MAX + 1] = { |
diff --git a/drivers/hid/hid-drff.c b/drivers/hid/hid-drff.c index 34f3eb65100b..a239d20ad7a5 100644 --- a/drivers/hid/hid-drff.c +++ b/drivers/hid/hid-drff.c | |||
@@ -32,6 +32,8 @@ | |||
32 | #include <linux/hid.h> | 32 | #include <linux/hid.h> |
33 | 33 | ||
34 | #include "hid-ids.h" | 34 | #include "hid-ids.h" |
35 | |||
36 | #ifdef CONFIG_DRAGONRISE_FF | ||
35 | #include "usbhid/usbhid.h" | 37 | #include "usbhid/usbhid.h" |
36 | 38 | ||
37 | struct drff_device { | 39 | struct drff_device { |
@@ -135,6 +137,12 @@ static int drff_init(struct hid_device *hid) | |||
135 | 137 | ||
136 | return 0; | 138 | return 0; |
137 | } | 139 | } |
140 | #else | ||
141 | static inline int drff_init(struct hid_device *hid) | ||
142 | { | ||
143 | return 0; | ||
144 | } | ||
145 | #endif | ||
138 | 146 | ||
139 | static int dr_probe(struct hid_device *hdev, const struct hid_device_id *id) | 147 | static int dr_probe(struct hid_device *hdev, const struct hid_device_id *id) |
140 | { | 148 | { |
diff --git a/drivers/hid/hid-gaff.c b/drivers/hid/hid-gaff.c index 510ad3ab8d33..8a11ccddaf2e 100644 --- a/drivers/hid/hid-gaff.c +++ b/drivers/hid/hid-gaff.c | |||
@@ -31,6 +31,8 @@ | |||
31 | #include <linux/usb.h> | 31 | #include <linux/usb.h> |
32 | #include <linux/hid.h> | 32 | #include <linux/hid.h> |
33 | #include "hid-ids.h" | 33 | #include "hid-ids.h" |
34 | |||
35 | #ifdef CONFIG_GREENASIA_FF | ||
34 | #include "usbhid/usbhid.h" | 36 | #include "usbhid/usbhid.h" |
35 | 37 | ||
36 | struct gaff_device { | 38 | struct gaff_device { |
@@ -130,6 +132,12 @@ static int gaff_init(struct hid_device *hid) | |||
130 | 132 | ||
131 | return 0; | 133 | return 0; |
132 | } | 134 | } |
135 | #else | ||
136 | static inline int gaff_init(struct hid_device *hdev) | ||
137 | { | ||
138 | return 0; | ||
139 | } | ||
140 | #endif | ||
133 | 141 | ||
134 | static int ga_probe(struct hid_device *hdev, const struct hid_device_id *id) | 142 | static int ga_probe(struct hid_device *hdev, const struct hid_device_id *id) |
135 | { | 143 | { |
diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h index 4d5ee2bbc62b..630101037921 100644 --- a/drivers/hid/hid-ids.h +++ b/drivers/hid/hid-ids.h | |||
@@ -414,8 +414,10 @@ | |||
414 | #define USB_DEVICE_ID_VERNIER_LCSPEC 0x0006 | 414 | #define USB_DEVICE_ID_VERNIER_LCSPEC 0x0006 |
415 | 415 | ||
416 | #define USB_VENDOR_ID_WACOM 0x056a | 416 | #define USB_VENDOR_ID_WACOM 0x056a |
417 | #define USB_DEVICE_ID_WACOM_GRAPHIRE_BLUETOOTH 0x81 | ||
417 | 418 | ||
418 | #define USB_VENDOR_ID_WISEGROUP 0x0925 | 419 | #define USB_VENDOR_ID_WISEGROUP 0x0925 |
420 | #define USB_DEVICE_ID_SMARTJOY_PLUS 0x0005 | ||
419 | #define USB_DEVICE_ID_1_PHIDGETSERVO_20 0x8101 | 421 | #define USB_DEVICE_ID_1_PHIDGETSERVO_20 0x8101 |
420 | #define USB_DEVICE_ID_4_PHIDGETSERVO_20 0x8104 | 422 | #define USB_DEVICE_ID_4_PHIDGETSERVO_20 0x8104 |
421 | #define USB_DEVICE_ID_8_8_4_IF_KIT 0x8201 | 423 | #define USB_DEVICE_ID_8_8_4_IF_KIT 0x8201 |
diff --git a/drivers/hid/hid-lgff.c b/drivers/hid/hid-lgff.c index 51aff08e10ce..56099709581c 100644 --- a/drivers/hid/hid-lgff.c +++ b/drivers/hid/hid-lgff.c | |||
@@ -50,6 +50,12 @@ static const signed short ff_joystick[] = { | |||
50 | -1 | 50 | -1 |
51 | }; | 51 | }; |
52 | 52 | ||
53 | static const signed short ff_joystick_ac[] = { | ||
54 | FF_CONSTANT, | ||
55 | FF_AUTOCENTER, | ||
56 | -1 | ||
57 | }; | ||
58 | |||
53 | static const signed short ff_wheel[] = { | 59 | static const signed short ff_wheel[] = { |
54 | FF_CONSTANT, | 60 | FF_CONSTANT, |
55 | FF_AUTOCENTER, | 61 | FF_AUTOCENTER, |
@@ -60,8 +66,8 @@ static const struct dev_type devices[] = { | |||
60 | { 0x046d, 0xc211, ff_rumble }, | 66 | { 0x046d, 0xc211, ff_rumble }, |
61 | { 0x046d, 0xc219, ff_rumble }, | 67 | { 0x046d, 0xc219, ff_rumble }, |
62 | { 0x046d, 0xc283, ff_joystick }, | 68 | { 0x046d, 0xc283, ff_joystick }, |
63 | { 0x046d, 0xc286, ff_joystick }, | 69 | { 0x046d, 0xc286, ff_joystick_ac }, |
64 | { 0x046d, 0xc294, ff_joystick }, | 70 | { 0x046d, 0xc294, ff_wheel }, |
65 | { 0x046d, 0xc295, ff_joystick }, | 71 | { 0x046d, 0xc295, ff_joystick }, |
66 | { 0x046d, 0xca03, ff_wheel }, | 72 | { 0x046d, 0xca03, ff_wheel }, |
67 | }; | 73 | }; |
diff --git a/drivers/hid/hid-ntrig.c b/drivers/hid/hid-ntrig.c index c5b252be9c21..75ed9d2c1a36 100644 --- a/drivers/hid/hid-ntrig.c +++ b/drivers/hid/hid-ntrig.c | |||
@@ -1,13 +1,8 @@ | |||
1 | /* | 1 | /* |
2 | * HID driver for some ntrig "special" devices | 2 | * HID driver for N-Trig touchscreens |
3 | * | 3 | * |
4 | * Copyright (c) 1999 Andreas Gal | ||
5 | * Copyright (c) 2000-2005 Vojtech Pavlik <vojtech@suse.cz> | ||
6 | * Copyright (c) 2005 Michael Haboustak <mike-@cinci.rr.com> for Concept2, Inc | ||
7 | * Copyright (c) 2006-2007 Jiri Kosina | ||
8 | * Copyright (c) 2007 Paul Walmsley | ||
9 | * Copyright (c) 2008 Jiri Slaby | ||
10 | * Copyright (c) 2008 Rafi Rubin | 4 | * Copyright (c) 2008 Rafi Rubin |
5 | * Copyright (c) 2009 Stephane Chatty | ||
11 | * | 6 | * |
12 | */ | 7 | */ |
13 | 8 | ||
@@ -29,15 +24,79 @@ | |||
29 | #define nt_map_key_clear(c) hid_map_usage_clear(hi, usage, bit, max, \ | 24 | #define nt_map_key_clear(c) hid_map_usage_clear(hi, usage, bit, max, \ |
30 | EV_KEY, (c)) | 25 | EV_KEY, (c)) |
31 | 26 | ||
27 | struct ntrig_data { | ||
28 | __s32 x, y, id, w, h; | ||
29 | char reading_a_point, found_contact_id; | ||
30 | }; | ||
31 | |||
32 | /* | ||
33 | * this driver is aimed at two firmware versions in circulation: | ||
34 | * - dual pen/finger single touch | ||
35 | * - finger multitouch, pen not working | ||
36 | */ | ||
37 | |||
32 | static int ntrig_input_mapping(struct hid_device *hdev, struct hid_input *hi, | 38 | static int ntrig_input_mapping(struct hid_device *hdev, struct hid_input *hi, |
33 | struct hid_field *field, struct hid_usage *usage, | 39 | struct hid_field *field, struct hid_usage *usage, |
34 | unsigned long **bit, int *max) | 40 | unsigned long **bit, int *max) |
35 | { | 41 | { |
36 | if ((usage->hid & HID_USAGE_PAGE) == HID_UP_DIGITIZER && | 42 | switch (usage->hid & HID_USAGE_PAGE) { |
37 | (usage->hid & 0xff) == 0x47) { | 43 | |
38 | nt_map_key_clear(BTN_TOOL_DOUBLETAP); | 44 | case HID_UP_GENDESK: |
39 | return 1; | 45 | switch (usage->hid) { |
46 | case HID_GD_X: | ||
47 | hid_map_usage(hi, usage, bit, max, | ||
48 | EV_ABS, ABS_MT_POSITION_X); | ||
49 | input_set_abs_params(hi->input, ABS_X, | ||
50 | field->logical_minimum, | ||
51 | field->logical_maximum, 0, 0); | ||
52 | return 1; | ||
53 | case HID_GD_Y: | ||
54 | hid_map_usage(hi, usage, bit, max, | ||
55 | EV_ABS, ABS_MT_POSITION_Y); | ||
56 | input_set_abs_params(hi->input, ABS_Y, | ||
57 | field->logical_minimum, | ||
58 | field->logical_maximum, 0, 0); | ||
59 | return 1; | ||
60 | } | ||
61 | return 0; | ||
62 | |||
63 | case HID_UP_DIGITIZER: | ||
64 | switch (usage->hid) { | ||
65 | /* we do not want to map these for now */ | ||
66 | case HID_DG_INVERT: /* value is always 0 */ | ||
67 | case HID_DG_ERASER: /* value is always 0 */ | ||
68 | case HID_DG_CONTACTID: /* value is useless */ | ||
69 | case HID_DG_BARRELSWITCH: /* doubtful */ | ||
70 | case HID_DG_INPUTMODE: | ||
71 | case HID_DG_DEVICEINDEX: | ||
72 | case HID_DG_CONTACTCOUNT: | ||
73 | case HID_DG_CONTACTMAX: | ||
74 | return -1; | ||
75 | |||
76 | /* original mapping by Rafi Rubin */ | ||
77 | case HID_DG_CONFIDENCE: | ||
78 | nt_map_key_clear(BTN_TOOL_DOUBLETAP); | ||
79 | return 1; | ||
80 | |||
81 | /* width/height mapped on TouchMajor/TouchMinor/Orientation */ | ||
82 | case HID_DG_WIDTH: | ||
83 | hid_map_usage(hi, usage, bit, max, | ||
84 | EV_ABS, ABS_MT_TOUCH_MAJOR); | ||
85 | return 1; | ||
86 | case HID_DG_HEIGHT: | ||
87 | hid_map_usage(hi, usage, bit, max, | ||
88 | EV_ABS, ABS_MT_TOUCH_MINOR); | ||
89 | input_set_abs_params(hi->input, ABS_MT_ORIENTATION, | ||
90 | 0, 1, 0, 0); | ||
91 | return 1; | ||
92 | } | ||
93 | return 0; | ||
94 | |||
95 | case 0xff000000: | ||
96 | /* we do not want to map these: no input-oriented meaning */ | ||
97 | return -1; | ||
40 | } | 98 | } |
99 | |||
41 | return 0; | 100 | return 0; |
42 | } | 101 | } |
43 | 102 | ||
@@ -51,6 +110,138 @@ static int ntrig_input_mapped(struct hid_device *hdev, struct hid_input *hi, | |||
51 | 110 | ||
52 | return 0; | 111 | return 0; |
53 | } | 112 | } |
113 | |||
114 | /* | ||
115 | * this function is called upon all reports | ||
116 | * so that we can filter contact point information, | ||
117 | * decide whether we are in multi or single touch mode | ||
118 | * and call input_mt_sync after each point if necessary | ||
119 | */ | ||
120 | static int ntrig_event (struct hid_device *hid, struct hid_field *field, | ||
121 | struct hid_usage *usage, __s32 value) | ||
122 | { | ||
123 | struct input_dev *input = field->hidinput->input; | ||
124 | struct ntrig_data *nd = hid_get_drvdata(hid); | ||
125 | |||
126 | if (hid->claimed & HID_CLAIMED_INPUT) { | ||
127 | switch (usage->hid) { | ||
128 | case HID_GD_X: | ||
129 | nd->x = value; | ||
130 | nd->reading_a_point = 1; | ||
131 | break; | ||
132 | case HID_GD_Y: | ||
133 | nd->y = value; | ||
134 | break; | ||
135 | case HID_DG_CONTACTID: | ||
136 | nd->id = value; | ||
137 | /* we receive this only when in multitouch mode */ | ||
138 | nd->found_contact_id = 1; | ||
139 | break; | ||
140 | case HID_DG_WIDTH: | ||
141 | nd->w = value; | ||
142 | break; | ||
143 | case HID_DG_HEIGHT: | ||
144 | nd->h = value; | ||
145 | /* | ||
146 | * when in single touch mode, this is the last | ||
147 | * report received in a finger event. We want | ||
148 | * to emit a normal (X, Y) position | ||
149 | */ | ||
150 | if (! nd->found_contact_id) { | ||
151 | input_event(input, EV_ABS, ABS_X, nd->x); | ||
152 | input_event(input, EV_ABS, ABS_Y, nd->y); | ||
153 | } | ||
154 | break; | ||
155 | case HID_DG_TIPPRESSURE: | ||
156 | /* | ||
157 | * when in single touch mode, this is the last | ||
158 | * report received in a pen event. We want | ||
159 | * to emit a normal (X, Y) position | ||
160 | */ | ||
161 | if (! nd->found_contact_id) { | ||
162 | input_event(input, EV_ABS, ABS_X, nd->x); | ||
163 | input_event(input, EV_ABS, ABS_Y, nd->y); | ||
164 | input_event(input, EV_ABS, ABS_PRESSURE, value); | ||
165 | } | ||
166 | break; | ||
167 | case 0xff000002: | ||
168 | /* | ||
169 | * we receive this when the device is in multitouch | ||
170 | * mode. The first of the three values tagged with | ||
171 | * this usage tells if the contact point is real | ||
172 | * or a placeholder | ||
173 | */ | ||
174 | if (!nd->reading_a_point || value != 1) | ||
175 | break; | ||
176 | /* emit a normal (X, Y) for the first point only */ | ||
177 | if (nd->id == 0) { | ||
178 | input_event(input, EV_ABS, ABS_X, nd->x); | ||
179 | input_event(input, EV_ABS, ABS_Y, nd->y); | ||
180 | } | ||
181 | input_event(input, EV_ABS, ABS_MT_POSITION_X, nd->x); | ||
182 | input_event(input, EV_ABS, ABS_MT_POSITION_Y, nd->y); | ||
183 | if (nd->w > nd->h) { | ||
184 | input_event(input, EV_ABS, | ||
185 | ABS_MT_ORIENTATION, 1); | ||
186 | input_event(input, EV_ABS, | ||
187 | ABS_MT_TOUCH_MAJOR, nd->w); | ||
188 | input_event(input, EV_ABS, | ||
189 | ABS_MT_TOUCH_MINOR, nd->h); | ||
190 | } else { | ||
191 | input_event(input, EV_ABS, | ||
192 | ABS_MT_ORIENTATION, 0); | ||
193 | input_event(input, EV_ABS, | ||
194 | ABS_MT_TOUCH_MAJOR, nd->h); | ||
195 | input_event(input, EV_ABS, | ||
196 | ABS_MT_TOUCH_MINOR, nd->w); | ||
197 | } | ||
198 | input_mt_sync(field->hidinput->input); | ||
199 | nd->reading_a_point = 0; | ||
200 | nd->found_contact_id = 0; | ||
201 | break; | ||
202 | |||
203 | default: | ||
204 | /* fallback to the generic hidinput handling */ | ||
205 | return 0; | ||
206 | } | ||
207 | } | ||
208 | |||
209 | /* we have handled the hidinput part, now remains hiddev */ | ||
210 | if (hid->claimed & HID_CLAIMED_HIDDEV && hid->hiddev_hid_event) | ||
211 | hid->hiddev_hid_event(hid, field, usage, value); | ||
212 | |||
213 | return 1; | ||
214 | } | ||
215 | |||
216 | static int ntrig_probe(struct hid_device *hdev, const struct hid_device_id *id) | ||
217 | { | ||
218 | int ret; | ||
219 | struct ntrig_data *nd; | ||
220 | |||
221 | nd = kmalloc(sizeof(struct ntrig_data), GFP_KERNEL); | ||
222 | if (!nd) { | ||
223 | dev_err(&hdev->dev, "cannot allocate N-Trig data\n"); | ||
224 | return -ENOMEM; | ||
225 | } | ||
226 | nd->reading_a_point = 0; | ||
227 | nd->found_contact_id = 0; | ||
228 | hid_set_drvdata(hdev, nd); | ||
229 | |||
230 | ret = hid_parse(hdev); | ||
231 | if (!ret) | ||
232 | ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT); | ||
233 | |||
234 | if (ret) | ||
235 | kfree (nd); | ||
236 | return ret; | ||
237 | } | ||
238 | |||
239 | static void ntrig_remove(struct hid_device *hdev) | ||
240 | { | ||
241 | hid_hw_stop(hdev); | ||
242 | kfree(hid_get_drvdata(hdev)); | ||
243 | } | ||
244 | |||
54 | static const struct hid_device_id ntrig_devices[] = { | 245 | static const struct hid_device_id ntrig_devices[] = { |
55 | { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN), | 246 | { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN), |
56 | .driver_data = NTRIG_DUPLICATE_USAGES }, | 247 | .driver_data = NTRIG_DUPLICATE_USAGES }, |
@@ -58,11 +249,20 @@ static const struct hid_device_id ntrig_devices[] = { | |||
58 | }; | 249 | }; |
59 | MODULE_DEVICE_TABLE(hid, ntrig_devices); | 250 | MODULE_DEVICE_TABLE(hid, ntrig_devices); |
60 | 251 | ||
252 | static const struct hid_usage_id ntrig_grabbed_usages[] = { | ||
253 | { HID_ANY_ID, HID_ANY_ID, HID_ANY_ID }, | ||
254 | { HID_ANY_ID - 1, HID_ANY_ID - 1, HID_ANY_ID - 1} | ||
255 | }; | ||
256 | |||
61 | static struct hid_driver ntrig_driver = { | 257 | static struct hid_driver ntrig_driver = { |
62 | .name = "ntrig", | 258 | .name = "ntrig", |
63 | .id_table = ntrig_devices, | 259 | .id_table = ntrig_devices, |
260 | .probe = ntrig_probe, | ||
261 | .remove = ntrig_remove, | ||
64 | .input_mapping = ntrig_input_mapping, | 262 | .input_mapping = ntrig_input_mapping, |
65 | .input_mapped = ntrig_input_mapped, | 263 | .input_mapped = ntrig_input_mapped, |
264 | .usage_table = ntrig_grabbed_usages, | ||
265 | .event = ntrig_event, | ||
66 | }; | 266 | }; |
67 | 267 | ||
68 | static int ntrig_init(void) | 268 | static int ntrig_init(void) |
diff --git a/drivers/hid/hid-sjoy.c b/drivers/hid/hid-sjoy.c new file mode 100644 index 000000000000..eab169e5c371 --- /dev/null +++ b/drivers/hid/hid-sjoy.c | |||
@@ -0,0 +1,180 @@ | |||
1 | /* | ||
2 | * Force feedback support for SmartJoy PLUS PS2->USB adapter | ||
3 | * | ||
4 | * Copyright (c) 2009 Jussi Kivilinna <jussi.kivilinna@mbnet.fi> | ||
5 | * | ||
6 | * Based of hid-pl.c and hid-gaff.c | ||
7 | * Copyright (c) 2007, 2009 Anssi Hannula <anssi.hannula@gmail.com> | ||
8 | * Copyright (c) 2008 Lukasz Lubojanski <lukasz@lubojanski.info> | ||
9 | */ | ||
10 | |||
11 | /* | ||
12 | * This program is free software; you can redistribute it and/or modify | ||
13 | * it under the terms of the GNU General Public License as published by | ||
14 | * the Free Software Foundation; either version 2 of the License, or | ||
15 | * (at your option) any later version. | ||
16 | * | ||
17 | * This program is distributed in the hope that it will be useful, | ||
18 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
19 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
20 | * GNU General Public License for more details. | ||
21 | * | ||
22 | * You should have received a copy of the GNU General Public License | ||
23 | * along with this program; if not, write to the Free Software | ||
24 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
25 | */ | ||
26 | |||
27 | /* #define DEBUG */ | ||
28 | |||
29 | #include <linux/input.h> | ||
30 | #include <linux/usb.h> | ||
31 | #include <linux/hid.h> | ||
32 | #include "hid-ids.h" | ||
33 | |||
34 | #ifdef CONFIG_SMARTJOYPLUS_FF | ||
35 | #include "usbhid/usbhid.h" | ||
36 | |||
37 | struct sjoyff_device { | ||
38 | struct hid_report *report; | ||
39 | }; | ||
40 | |||
41 | static int hid_sjoyff_play(struct input_dev *dev, void *data, | ||
42 | struct ff_effect *effect) | ||
43 | { | ||
44 | struct hid_device *hid = input_get_drvdata(dev); | ||
45 | struct sjoyff_device *sjoyff = data; | ||
46 | u32 left, right; | ||
47 | |||
48 | left = effect->u.rumble.strong_magnitude; | ||
49 | right = effect->u.rumble.weak_magnitude; | ||
50 | dev_dbg(&dev->dev, "called with 0x%08x 0x%08x\n", left, right); | ||
51 | |||
52 | left = left * 0xff / 0xffff; | ||
53 | right = (right != 0); /* on/off only */ | ||
54 | |||
55 | sjoyff->report->field[0]->value[1] = right; | ||
56 | sjoyff->report->field[0]->value[2] = left; | ||
57 | dev_dbg(&dev->dev, "running with 0x%02x 0x%02x\n", left, right); | ||
58 | usbhid_submit_report(hid, sjoyff->report, USB_DIR_OUT); | ||
59 | |||
60 | return 0; | ||
61 | } | ||
62 | |||
63 | static int sjoyff_init(struct hid_device *hid) | ||
64 | { | ||
65 | struct sjoyff_device *sjoyff; | ||
66 | struct hid_report *report; | ||
67 | struct hid_input *hidinput = list_entry(hid->inputs.next, | ||
68 | struct hid_input, list); | ||
69 | struct list_head *report_list = | ||
70 | &hid->report_enum[HID_OUTPUT_REPORT].report_list; | ||
71 | struct list_head *report_ptr = report_list; | ||
72 | struct input_dev *dev; | ||
73 | int error; | ||
74 | |||
75 | if (list_empty(report_list)) { | ||
76 | dev_err(&hid->dev, "no output reports found\n"); | ||
77 | return -ENODEV; | ||
78 | } | ||
79 | |||
80 | report_ptr = report_ptr->next; | ||
81 | |||
82 | if (report_ptr == report_list) { | ||
83 | dev_err(&hid->dev, "required output report is " | ||
84 | "missing\n"); | ||
85 | return -ENODEV; | ||
86 | } | ||
87 | |||
88 | report = list_entry(report_ptr, struct hid_report, list); | ||
89 | if (report->maxfield < 1) { | ||
90 | dev_err(&hid->dev, "no fields in the report\n"); | ||
91 | return -ENODEV; | ||
92 | } | ||
93 | |||
94 | if (report->field[0]->report_count < 3) { | ||
95 | dev_err(&hid->dev, "not enough values in the field\n"); | ||
96 | return -ENODEV; | ||
97 | } | ||
98 | |||
99 | sjoyff = kzalloc(sizeof(struct sjoyff_device), GFP_KERNEL); | ||
100 | if (!sjoyff) | ||
101 | return -ENOMEM; | ||
102 | |||
103 | dev = hidinput->input; | ||
104 | |||
105 | set_bit(FF_RUMBLE, dev->ffbit); | ||
106 | |||
107 | error = input_ff_create_memless(dev, sjoyff, hid_sjoyff_play); | ||
108 | if (error) { | ||
109 | kfree(sjoyff); | ||
110 | return error; | ||
111 | } | ||
112 | |||
113 | sjoyff->report = report; | ||
114 | sjoyff->report->field[0]->value[0] = 0x01; | ||
115 | sjoyff->report->field[0]->value[1] = 0x00; | ||
116 | sjoyff->report->field[0]->value[2] = 0x00; | ||
117 | usbhid_submit_report(hid, sjoyff->report, USB_DIR_OUT); | ||
118 | |||
119 | dev_info(&hid->dev, | ||
120 | "Force feedback for SmartJoy PLUS PS2/USB adapter\n"); | ||
121 | |||
122 | return 0; | ||
123 | } | ||
124 | #else | ||
125 | static inline int sjoyff_init(struct hid_device *hid) | ||
126 | { | ||
127 | return 0; | ||
128 | } | ||
129 | #endif | ||
130 | |||
131 | static int sjoy_probe(struct hid_device *hdev, const struct hid_device_id *id) | ||
132 | { | ||
133 | int ret; | ||
134 | |||
135 | ret = hid_parse(hdev); | ||
136 | if (ret) { | ||
137 | dev_err(&hdev->dev, "parse failed\n"); | ||
138 | goto err; | ||
139 | } | ||
140 | |||
141 | ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT & ~HID_CONNECT_FF); | ||
142 | if (ret) { | ||
143 | dev_err(&hdev->dev, "hw start failed\n"); | ||
144 | goto err; | ||
145 | } | ||
146 | |||
147 | sjoyff_init(hdev); | ||
148 | |||
149 | return 0; | ||
150 | err: | ||
151 | return ret; | ||
152 | } | ||
153 | |||
154 | static const struct hid_device_id sjoy_devices[] = { | ||
155 | { HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_SMARTJOY_PLUS) }, | ||
156 | { } | ||
157 | }; | ||
158 | MODULE_DEVICE_TABLE(hid, sjoy_devices); | ||
159 | |||
160 | static struct hid_driver sjoy_driver = { | ||
161 | .name = "smartjoyplus", | ||
162 | .id_table = sjoy_devices, | ||
163 | .probe = sjoy_probe, | ||
164 | }; | ||
165 | |||
166 | static int sjoy_init(void) | ||
167 | { | ||
168 | return hid_register_driver(&sjoy_driver); | ||
169 | } | ||
170 | |||
171 | static void sjoy_exit(void) | ||
172 | { | ||
173 | hid_unregister_driver(&sjoy_driver); | ||
174 | } | ||
175 | |||
176 | module_init(sjoy_init); | ||
177 | module_exit(sjoy_exit); | ||
178 | MODULE_LICENSE("GPL"); | ||
179 | MODULE_AUTHOR("Jussi Kivilinna"); | ||
180 | |||
diff --git a/drivers/hid/hid-tmff.c b/drivers/hid/hid-tmff.c index 7c1f7b50330c..fcd6ccd02fee 100644 --- a/drivers/hid/hid-tmff.c +++ b/drivers/hid/hid-tmff.c | |||
@@ -33,11 +33,6 @@ | |||
33 | 33 | ||
34 | #include "hid-ids.h" | 34 | #include "hid-ids.h" |
35 | 35 | ||
36 | #include "usbhid/usbhid.h" | ||
37 | |||
38 | /* Usages for thrustmaster devices I know about */ | ||
39 | #define THRUSTMASTER_USAGE_FF (HID_UP_GENDESK | 0xbb) | ||
40 | |||
41 | static const signed short ff_rumble[] = { | 36 | static const signed short ff_rumble[] = { |
42 | FF_RUMBLE, | 37 | FF_RUMBLE, |
43 | -1 | 38 | -1 |
@@ -48,6 +43,12 @@ static const signed short ff_joystick[] = { | |||
48 | -1 | 43 | -1 |
49 | }; | 44 | }; |
50 | 45 | ||
46 | #ifdef CONFIG_THRUSTMASTER_FF | ||
47 | #include "usbhid/usbhid.h" | ||
48 | |||
49 | /* Usages for thrustmaster devices I know about */ | ||
50 | #define THRUSTMASTER_USAGE_FF (HID_UP_GENDESK | 0xbb) | ||
51 | |||
51 | struct tmff_device { | 52 | struct tmff_device { |
52 | struct hid_report *report; | 53 | struct hid_report *report; |
53 | struct hid_field *ff_field; | 54 | struct hid_field *ff_field; |
@@ -209,6 +210,12 @@ fail: | |||
209 | kfree(tmff); | 210 | kfree(tmff); |
210 | return error; | 211 | return error; |
211 | } | 212 | } |
213 | #else | ||
214 | static inline int tmff_init(struct hid_device *hid, const signed short *ff_bits) | ||
215 | { | ||
216 | return 0; | ||
217 | } | ||
218 | #endif | ||
212 | 219 | ||
213 | static int tm_probe(struct hid_device *hdev, const struct hid_device_id *id) | 220 | static int tm_probe(struct hid_device *hdev, const struct hid_device_id *id) |
214 | { | 221 | { |
diff --git a/drivers/hid/hid-wacom.c b/drivers/hid/hid-wacom.c new file mode 100644 index 000000000000..1f9237f511e3 --- /dev/null +++ b/drivers/hid/hid-wacom.c | |||
@@ -0,0 +1,259 @@ | |||
1 | /* | ||
2 | * Bluetooth Wacom Tablet support | ||
3 | * | ||
4 | * Copyright (c) 1999 Andreas Gal | ||
5 | * Copyright (c) 2000-2005 Vojtech Pavlik <vojtech@suse.cz> | ||
6 | * Copyright (c) 2005 Michael Haboustak <mike-@cinci.rr.com> for Concept2, Inc | ||
7 | * Copyright (c) 2006-2007 Jiri Kosina | ||
8 | * Copyright (c) 2007 Paul Walmsley | ||
9 | * Copyright (c) 2008 Jiri Slaby <jirislaby@gmail.com> | ||
10 | * Copyright (c) 2006 Andrew Zabolotny <zap@homelink.ru> | ||
11 | * Copyright (c) 2009 Bastien Nocera <hadess@hadess.net> | ||
12 | */ | ||
13 | |||
14 | /* | ||
15 | * This program is free software; you can redistribute it and/or modify it | ||
16 | * under the terms of the GNU General Public License as published by the Free | ||
17 | * Software Foundation; either version 2 of the License, or (at your option) | ||
18 | * any later version. | ||
19 | */ | ||
20 | |||
21 | #include <linux/device.h> | ||
22 | #include <linux/hid.h> | ||
23 | #include <linux/module.h> | ||
24 | |||
25 | #include "hid-ids.h" | ||
26 | |||
27 | struct wacom_data { | ||
28 | __u16 tool; | ||
29 | unsigned char butstate; | ||
30 | }; | ||
31 | |||
32 | static int wacom_raw_event(struct hid_device *hdev, struct hid_report *report, | ||
33 | u8 *raw_data, int size) | ||
34 | { | ||
35 | struct wacom_data *wdata = hid_get_drvdata(hdev); | ||
36 | struct hid_input *hidinput; | ||
37 | struct input_dev *input; | ||
38 | unsigned char *data = (unsigned char *) raw_data; | ||
39 | int tool, x, y, rw; | ||
40 | |||
41 | if (!(hdev->claimed & HID_CLAIMED_INPUT)) | ||
42 | return 0; | ||
43 | |||
44 | tool = 0; | ||
45 | hidinput = list_entry(hdev->inputs.next, struct hid_input, list); | ||
46 | input = hidinput->input; | ||
47 | |||
48 | /* Check if this is a tablet report */ | ||
49 | if (data[0] != 0x03) | ||
50 | return 0; | ||
51 | |||
52 | /* Get X & Y positions */ | ||
53 | x = le16_to_cpu(*(__le16 *) &data[2]); | ||
54 | y = le16_to_cpu(*(__le16 *) &data[4]); | ||
55 | |||
56 | /* Get current tool identifier */ | ||
57 | if (data[1] & 0x90) { /* If pen is in the in/active area */ | ||
58 | switch ((data[1] >> 5) & 3) { | ||
59 | case 0: /* Pen */ | ||
60 | tool = BTN_TOOL_PEN; | ||
61 | break; | ||
62 | |||
63 | case 1: /* Rubber */ | ||
64 | tool = BTN_TOOL_RUBBER; | ||
65 | break; | ||
66 | |||
67 | case 2: /* Mouse with wheel */ | ||
68 | case 3: /* Mouse without wheel */ | ||
69 | tool = BTN_TOOL_MOUSE; | ||
70 | break; | ||
71 | } | ||
72 | |||
73 | /* Reset tool if out of active tablet area */ | ||
74 | if (!(data[1] & 0x10)) | ||
75 | tool = 0; | ||
76 | } | ||
77 | |||
78 | /* If tool changed, notify input subsystem */ | ||
79 | if (wdata->tool != tool) { | ||
80 | if (wdata->tool) { | ||
81 | /* Completely reset old tool state */ | ||
82 | if (wdata->tool == BTN_TOOL_MOUSE) { | ||
83 | input_report_key(input, BTN_LEFT, 0); | ||
84 | input_report_key(input, BTN_RIGHT, 0); | ||
85 | input_report_key(input, BTN_MIDDLE, 0); | ||
86 | input_report_abs(input, ABS_DISTANCE, | ||
87 | input->absmax[ABS_DISTANCE]); | ||
88 | } else { | ||
89 | input_report_key(input, BTN_TOUCH, 0); | ||
90 | input_report_key(input, BTN_STYLUS, 0); | ||
91 | input_report_key(input, BTN_STYLUS2, 0); | ||
92 | input_report_abs(input, ABS_PRESSURE, 0); | ||
93 | } | ||
94 | input_report_key(input, wdata->tool, 0); | ||
95 | input_sync(input); | ||
96 | } | ||
97 | wdata->tool = tool; | ||
98 | if (tool) | ||
99 | input_report_key(input, tool, 1); | ||
100 | } | ||
101 | |||
102 | if (tool) { | ||
103 | input_report_abs(input, ABS_X, x); | ||
104 | input_report_abs(input, ABS_Y, y); | ||
105 | |||
106 | switch ((data[1] >> 5) & 3) { | ||
107 | case 2: /* Mouse with wheel */ | ||
108 | input_report_key(input, BTN_MIDDLE, data[1] & 0x04); | ||
109 | rw = (data[6] & 0x01) ? -1 : | ||
110 | (data[6] & 0x02) ? 1 : 0; | ||
111 | input_report_rel(input, REL_WHEEL, rw); | ||
112 | /* fall through */ | ||
113 | |||
114 | case 3: /* Mouse without wheel */ | ||
115 | input_report_key(input, BTN_LEFT, data[1] & 0x01); | ||
116 | input_report_key(input, BTN_RIGHT, data[1] & 0x02); | ||
117 | /* Compute distance between mouse and tablet */ | ||
118 | rw = 44 - (data[6] >> 2); | ||
119 | if (rw < 0) | ||
120 | rw = 0; | ||
121 | else if (rw > 31) | ||
122 | rw = 31; | ||
123 | input_report_abs(input, ABS_DISTANCE, rw); | ||
124 | break; | ||
125 | |||
126 | default: | ||
127 | input_report_abs(input, ABS_PRESSURE, | ||
128 | data[6] | (((__u16) (data[1] & 0x08)) << 5)); | ||
129 | input_report_key(input, BTN_TOUCH, data[1] & 0x01); | ||
130 | input_report_key(input, BTN_STYLUS, data[1] & 0x02); | ||
131 | input_report_key(input, BTN_STYLUS2, (tool == BTN_TOOL_PEN) && data[1] & 0x04); | ||
132 | break; | ||
133 | } | ||
134 | |||
135 | input_sync(input); | ||
136 | } | ||
137 | |||
138 | /* Report the state of the two buttons at the top of the tablet | ||
139 | * as two extra fingerpad keys (buttons 4 & 5). */ | ||
140 | rw = data[7] & 0x03; | ||
141 | if (rw != wdata->butstate) { | ||
142 | wdata->butstate = rw; | ||
143 | input_report_key(input, BTN_0, rw & 0x02); | ||
144 | input_report_key(input, BTN_1, rw & 0x01); | ||
145 | input_event(input, EV_MSC, MSC_SERIAL, 0xf0); | ||
146 | input_sync(input); | ||
147 | } | ||
148 | |||
149 | return 1; | ||
150 | } | ||
151 | |||
152 | static int wacom_probe(struct hid_device *hdev, | ||
153 | const struct hid_device_id *id) | ||
154 | { | ||
155 | struct hid_input *hidinput; | ||
156 | struct input_dev *input; | ||
157 | struct wacom_data *wdata; | ||
158 | int ret; | ||
159 | |||
160 | wdata = kzalloc(sizeof(*wdata), GFP_KERNEL); | ||
161 | if (wdata == NULL) { | ||
162 | dev_err(&hdev->dev, "can't alloc wacom descriptor\n"); | ||
163 | return -ENOMEM; | ||
164 | } | ||
165 | |||
166 | hid_set_drvdata(hdev, wdata); | ||
167 | |||
168 | ret = hid_parse(hdev); | ||
169 | if (ret) { | ||
170 | dev_err(&hdev->dev, "parse failed\n"); | ||
171 | goto err_free; | ||
172 | } | ||
173 | |||
174 | ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT); | ||
175 | if (ret) { | ||
176 | dev_err(&hdev->dev, "hw start failed\n"); | ||
177 | goto err_free; | ||
178 | } | ||
179 | |||
180 | hidinput = list_entry(hdev->inputs.next, struct hid_input, list); | ||
181 | input = hidinput->input; | ||
182 | |||
183 | /* Basics */ | ||
184 | input->evbit[0] |= BIT(EV_KEY) | BIT(EV_ABS) | BIT(EV_REL); | ||
185 | input->absbit[0] |= BIT(ABS_X) | BIT(ABS_Y) | | ||
186 | BIT(ABS_PRESSURE) | BIT(ABS_DISTANCE); | ||
187 | input->relbit[0] |= BIT(REL_WHEEL); | ||
188 | set_bit(BTN_TOOL_PEN, input->keybit); | ||
189 | set_bit(BTN_TOUCH, input->keybit); | ||
190 | set_bit(BTN_STYLUS, input->keybit); | ||
191 | set_bit(BTN_STYLUS2, input->keybit); | ||
192 | set_bit(BTN_LEFT, input->keybit); | ||
193 | set_bit(BTN_RIGHT, input->keybit); | ||
194 | set_bit(BTN_MIDDLE, input->keybit); | ||
195 | |||
196 | /* Pad */ | ||
197 | input->evbit[0] |= BIT(EV_MSC); | ||
198 | input->mscbit[0] |= BIT(MSC_SERIAL); | ||
199 | |||
200 | /* Distance, rubber and mouse */ | ||
201 | input->absbit[0] |= BIT(ABS_DISTANCE); | ||
202 | set_bit(BTN_TOOL_RUBBER, input->keybit); | ||
203 | set_bit(BTN_TOOL_MOUSE, input->keybit); | ||
204 | |||
205 | input->absmax[ABS_PRESSURE] = 511; | ||
206 | input->absmax[ABS_DISTANCE] = 32; | ||
207 | |||
208 | input->absmax[ABS_X] = 16704; | ||
209 | input->absmax[ABS_Y] = 12064; | ||
210 | input->absfuzz[ABS_X] = 4; | ||
211 | input->absfuzz[ABS_Y] = 4; | ||
212 | |||
213 | return 0; | ||
214 | err_free: | ||
215 | kfree(wdata); | ||
216 | return ret; | ||
217 | } | ||
218 | |||
219 | static void wacom_remove(struct hid_device *hdev) | ||
220 | { | ||
221 | hid_hw_stop(hdev); | ||
222 | kfree(hid_get_drvdata(hdev)); | ||
223 | } | ||
224 | |||
225 | static const struct hid_device_id wacom_devices[] = { | ||
226 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_GRAPHIRE_BLUETOOTH) }, | ||
227 | |||
228 | { } | ||
229 | }; | ||
230 | MODULE_DEVICE_TABLE(hid, wacom_devices); | ||
231 | |||
232 | static struct hid_driver wacom_driver = { | ||
233 | .name = "wacom", | ||
234 | .id_table = wacom_devices, | ||
235 | .probe = wacom_probe, | ||
236 | .remove = wacom_remove, | ||
237 | .raw_event = wacom_raw_event, | ||
238 | }; | ||
239 | |||
240 | static int wacom_init(void) | ||
241 | { | ||
242 | int ret; | ||
243 | |||
244 | ret = hid_register_driver(&wacom_driver); | ||
245 | if (ret) | ||
246 | printk(KERN_ERR "can't register wacom driver\n"); | ||
247 | printk(KERN_ERR "wacom driver registered\n"); | ||
248 | return ret; | ||
249 | } | ||
250 | |||
251 | static void wacom_exit(void) | ||
252 | { | ||
253 | hid_unregister_driver(&wacom_driver); | ||
254 | } | ||
255 | |||
256 | module_init(wacom_init); | ||
257 | module_exit(wacom_exit); | ||
258 | MODULE_LICENSE("GPL"); | ||
259 | |||
diff --git a/drivers/hid/hid-zpff.c b/drivers/hid/hid-zpff.c index 85a198a18537..57f710757bf4 100644 --- a/drivers/hid/hid-zpff.c +++ b/drivers/hid/hid-zpff.c | |||
@@ -27,6 +27,7 @@ | |||
27 | 27 | ||
28 | #include "hid-ids.h" | 28 | #include "hid-ids.h" |
29 | 29 | ||
30 | #ifdef CONFIG_ZEROPLUS_FF | ||
30 | #include "usbhid/usbhid.h" | 31 | #include "usbhid/usbhid.h" |
31 | 32 | ||
32 | struct zpff_device { | 33 | struct zpff_device { |
@@ -108,6 +109,12 @@ static int zpff_init(struct hid_device *hid) | |||
108 | 109 | ||
109 | return 0; | 110 | return 0; |
110 | } | 111 | } |
112 | #else | ||
113 | static inline int zpff_init(struct hid_device *hid) | ||
114 | { | ||
115 | return 0; | ||
116 | } | ||
117 | #endif | ||
111 | 118 | ||
112 | static int zp_probe(struct hid_device *hdev, const struct hid_device_id *id) | 119 | static int zp_probe(struct hid_device *hdev, const struct hid_device_id *id) |
113 | { | 120 | { |
diff --git a/drivers/hid/hidraw.c b/drivers/hid/hidraw.c index 00ccf4b1985d..0c6639ea03dd 100644 --- a/drivers/hid/hidraw.c +++ b/drivers/hid/hidraw.c | |||
@@ -349,10 +349,7 @@ int hidraw_connect(struct hid_device *hid) | |||
349 | int minor, result; | 349 | int minor, result; |
350 | struct hidraw *dev; | 350 | struct hidraw *dev; |
351 | 351 | ||
352 | /* TODO currently we accept any HID device. This should later | 352 | /* we accept any HID device, no matter the applications */ |
353 | * probably be fixed to accept only those devices which provide | ||
354 | * non-input applications | ||
355 | */ | ||
356 | 353 | ||
357 | dev = kzalloc(sizeof(struct hidraw), GFP_KERNEL); | 354 | dev = kzalloc(sizeof(struct hidraw), GFP_KERNEL); |
358 | if (!dev) | 355 | if (!dev) |
diff --git a/drivers/hid/usbhid/hid-core.c b/drivers/hid/usbhid/hid-core.c index ac8049b5f1e9..76c4bbe9dccb 100644 --- a/drivers/hid/usbhid/hid-core.c +++ b/drivers/hid/usbhid/hid-core.c | |||
@@ -1234,12 +1234,11 @@ static int hid_post_reset(struct usb_interface *intf) | |||
1234 | struct hid_device *hid = usb_get_intfdata(intf); | 1234 | struct hid_device *hid = usb_get_intfdata(intf); |
1235 | struct usbhid_device *usbhid = hid->driver_data; | 1235 | struct usbhid_device *usbhid = hid->driver_data; |
1236 | int status; | 1236 | int status; |
1237 | 1237 | ||
1238 | spin_lock_irq(&usbhid->lock); | 1238 | spin_lock_irq(&usbhid->lock); |
1239 | clear_bit(HID_RESET_PENDING, &usbhid->iofl); | 1239 | clear_bit(HID_RESET_PENDING, &usbhid->iofl); |
1240 | spin_unlock_irq(&usbhid->lock); | 1240 | spin_unlock_irq(&usbhid->lock); |
1241 | hid_set_idle(dev, intf->cur_altsetting->desc.bInterfaceNumber, 0, 0); | 1241 | hid_set_idle(dev, intf->cur_altsetting->desc.bInterfaceNumber, 0, 0); |
1242 | /* FIXME: Any more reinitialization needed? */ | ||
1243 | status = hid_start_in(hid); | 1242 | status = hid_start_in(hid); |
1244 | if (status < 0) | 1243 | if (status < 0) |
1245 | hid_io_error(hid); | 1244 | hid_io_error(hid); |
@@ -1251,14 +1250,14 @@ static int hid_post_reset(struct usb_interface *intf) | |||
1251 | int usbhid_get_power(struct hid_device *hid) | 1250 | int usbhid_get_power(struct hid_device *hid) |
1252 | { | 1251 | { |
1253 | struct usbhid_device *usbhid = hid->driver_data; | 1252 | struct usbhid_device *usbhid = hid->driver_data; |
1254 | 1253 | ||
1255 | return usb_autopm_get_interface(usbhid->intf); | 1254 | return usb_autopm_get_interface(usbhid->intf); |
1256 | } | 1255 | } |
1257 | 1256 | ||
1258 | void usbhid_put_power(struct hid_device *hid) | 1257 | void usbhid_put_power(struct hid_device *hid) |
1259 | { | 1258 | { |
1260 | struct usbhid_device *usbhid = hid->driver_data; | 1259 | struct usbhid_device *usbhid = hid->driver_data; |
1261 | 1260 | ||
1262 | usb_autopm_put_interface(usbhid->intf); | 1261 | usb_autopm_put_interface(usbhid->intf); |
1263 | } | 1262 | } |
1264 | 1263 | ||
diff --git a/drivers/i2c/busses/Kconfig b/drivers/i2c/busses/Kconfig index f1c6ca7e2852..c8460fa9cfac 100644 --- a/drivers/i2c/busses/Kconfig +++ b/drivers/i2c/busses/Kconfig | |||
@@ -298,7 +298,7 @@ config I2C_BLACKFIN_TWI | |||
298 | config I2C_BLACKFIN_TWI_CLK_KHZ | 298 | config I2C_BLACKFIN_TWI_CLK_KHZ |
299 | int "Blackfin TWI I2C clock (kHz)" | 299 | int "Blackfin TWI I2C clock (kHz)" |
300 | depends on I2C_BLACKFIN_TWI | 300 | depends on I2C_BLACKFIN_TWI |
301 | range 10 400 | 301 | range 21 400 |
302 | default 50 | 302 | default 50 |
303 | help | 303 | help |
304 | The unit of the TWI clock is kHz. | 304 | The unit of the TWI clock is kHz. |
diff --git a/drivers/i2c/busses/i2c-bfin-twi.c b/drivers/i2c/busses/i2c-bfin-twi.c index fc548b3d002e..26d8987e69bf 100644 --- a/drivers/i2c/busses/i2c-bfin-twi.c +++ b/drivers/i2c/busses/i2c-bfin-twi.c | |||
@@ -104,9 +104,14 @@ static void bfin_twi_handle_interrupt(struct bfin_twi_iface *iface) | |||
104 | write_MASTER_CTL(iface, | 104 | write_MASTER_CTL(iface, |
105 | read_MASTER_CTL(iface) | STOP); | 105 | read_MASTER_CTL(iface) | STOP); |
106 | else if (iface->cur_mode == TWI_I2C_MODE_REPEAT && | 106 | else if (iface->cur_mode == TWI_I2C_MODE_REPEAT && |
107 | iface->cur_msg+1 < iface->msg_num) | 107 | iface->cur_msg + 1 < iface->msg_num) { |
108 | write_MASTER_CTL(iface, | 108 | if (iface->pmsg[iface->cur_msg + 1].flags & I2C_M_RD) |
109 | read_MASTER_CTL(iface) | RSTART); | 109 | write_MASTER_CTL(iface, |
110 | read_MASTER_CTL(iface) | RSTART | MDIR); | ||
111 | else | ||
112 | write_MASTER_CTL(iface, | ||
113 | (read_MASTER_CTL(iface) | RSTART) & ~MDIR); | ||
114 | } | ||
110 | SSYNC(); | 115 | SSYNC(); |
111 | /* Clear status */ | 116 | /* Clear status */ |
112 | write_INT_STAT(iface, XMTSERV); | 117 | write_INT_STAT(iface, XMTSERV); |
@@ -134,9 +139,13 @@ static void bfin_twi_handle_interrupt(struct bfin_twi_iface *iface) | |||
134 | read_MASTER_CTL(iface) | STOP); | 139 | read_MASTER_CTL(iface) | STOP); |
135 | SSYNC(); | 140 | SSYNC(); |
136 | } else if (iface->cur_mode == TWI_I2C_MODE_REPEAT && | 141 | } else if (iface->cur_mode == TWI_I2C_MODE_REPEAT && |
137 | iface->cur_msg+1 < iface->msg_num) { | 142 | iface->cur_msg + 1 < iface->msg_num) { |
138 | write_MASTER_CTL(iface, | 143 | if (iface->pmsg[iface->cur_msg + 1].flags & I2C_M_RD) |
139 | read_MASTER_CTL(iface) | RSTART); | 144 | write_MASTER_CTL(iface, |
145 | read_MASTER_CTL(iface) | RSTART | MDIR); | ||
146 | else | ||
147 | write_MASTER_CTL(iface, | ||
148 | (read_MASTER_CTL(iface) | RSTART) & ~MDIR); | ||
140 | SSYNC(); | 149 | SSYNC(); |
141 | } | 150 | } |
142 | /* Clear interrupt source */ | 151 | /* Clear interrupt source */ |
@@ -196,8 +205,6 @@ static void bfin_twi_handle_interrupt(struct bfin_twi_iface *iface) | |||
196 | /* remove restart bit and enable master receive */ | 205 | /* remove restart bit and enable master receive */ |
197 | write_MASTER_CTL(iface, | 206 | write_MASTER_CTL(iface, |
198 | read_MASTER_CTL(iface) & ~RSTART); | 207 | read_MASTER_CTL(iface) & ~RSTART); |
199 | write_MASTER_CTL(iface, | ||
200 | read_MASTER_CTL(iface) | MEN | MDIR); | ||
201 | SSYNC(); | 208 | SSYNC(); |
202 | } else if (iface->cur_mode == TWI_I2C_MODE_REPEAT && | 209 | } else if (iface->cur_mode == TWI_I2C_MODE_REPEAT && |
203 | iface->cur_msg+1 < iface->msg_num) { | 210 | iface->cur_msg+1 < iface->msg_num) { |
@@ -222,18 +229,19 @@ static void bfin_twi_handle_interrupt(struct bfin_twi_iface *iface) | |||
222 | } | 229 | } |
223 | 230 | ||
224 | if (iface->pmsg[iface->cur_msg].len <= 255) | 231 | if (iface->pmsg[iface->cur_msg].len <= 255) |
225 | write_MASTER_CTL(iface, | 232 | write_MASTER_CTL(iface, |
226 | iface->pmsg[iface->cur_msg].len << 6); | 233 | (read_MASTER_CTL(iface) & |
234 | (~(0xff << 6))) | | ||
235 | (iface->pmsg[iface->cur_msg].len << 6)); | ||
227 | else { | 236 | else { |
228 | write_MASTER_CTL(iface, 0xff << 6); | 237 | write_MASTER_CTL(iface, |
238 | (read_MASTER_CTL(iface) | | ||
239 | (0xff << 6))); | ||
229 | iface->manual_stop = 1; | 240 | iface->manual_stop = 1; |
230 | } | 241 | } |
231 | /* remove restart bit and enable master receive */ | 242 | /* remove restart bit and enable master receive */ |
232 | write_MASTER_CTL(iface, | 243 | write_MASTER_CTL(iface, |
233 | read_MASTER_CTL(iface) & ~RSTART); | 244 | read_MASTER_CTL(iface) & ~RSTART); |
234 | write_MASTER_CTL(iface, read_MASTER_CTL(iface) | | ||
235 | MEN | ((iface->read_write == I2C_SMBUS_READ) ? | ||
236 | MDIR : 0)); | ||
237 | SSYNC(); | 245 | SSYNC(); |
238 | } else { | 246 | } else { |
239 | iface->result = 1; | 247 | iface->result = 1; |
@@ -441,6 +449,16 @@ int bfin_twi_smbus_xfer(struct i2c_adapter *adap, u16 addr, | |||
441 | } | 449 | } |
442 | iface->transPtr = data->block; | 450 | iface->transPtr = data->block; |
443 | break; | 451 | break; |
452 | case I2C_SMBUS_I2C_BLOCK_DATA: | ||
453 | if (read_write == I2C_SMBUS_READ) { | ||
454 | iface->readNum = data->block[0]; | ||
455 | iface->cur_mode = TWI_I2C_MODE_COMBINED; | ||
456 | } else { | ||
457 | iface->writeNum = data->block[0]; | ||
458 | iface->cur_mode = TWI_I2C_MODE_STANDARDSUB; | ||
459 | } | ||
460 | iface->transPtr = (u8 *)&data->block[1]; | ||
461 | break; | ||
444 | default: | 462 | default: |
445 | return -1; | 463 | return -1; |
446 | } | 464 | } |
@@ -564,7 +582,7 @@ static u32 bfin_twi_functionality(struct i2c_adapter *adap) | |||
564 | return I2C_FUNC_SMBUS_QUICK | I2C_FUNC_SMBUS_BYTE | | 582 | return I2C_FUNC_SMBUS_QUICK | I2C_FUNC_SMBUS_BYTE | |
565 | I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA | | 583 | I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA | |
566 | I2C_FUNC_SMBUS_BLOCK_DATA | I2C_FUNC_SMBUS_PROC_CALL | | 584 | I2C_FUNC_SMBUS_BLOCK_DATA | I2C_FUNC_SMBUS_PROC_CALL | |
567 | I2C_FUNC_I2C; | 585 | I2C_FUNC_I2C | I2C_FUNC_SMBUS_I2C_BLOCK; |
568 | } | 586 | } |
569 | 587 | ||
570 | static struct i2c_algorithm bfin_twi_algorithm = { | 588 | static struct i2c_algorithm bfin_twi_algorithm = { |
@@ -614,6 +632,7 @@ static int i2c_bfin_twi_probe(struct platform_device *pdev) | |||
614 | struct i2c_adapter *p_adap; | 632 | struct i2c_adapter *p_adap; |
615 | struct resource *res; | 633 | struct resource *res; |
616 | int rc; | 634 | int rc; |
635 | unsigned int clkhilow; | ||
617 | 636 | ||
618 | iface = kzalloc(sizeof(struct bfin_twi_iface), GFP_KERNEL); | 637 | iface = kzalloc(sizeof(struct bfin_twi_iface), GFP_KERNEL); |
619 | if (!iface) { | 638 | if (!iface) { |
@@ -675,10 +694,14 @@ static int i2c_bfin_twi_probe(struct platform_device *pdev) | |||
675 | /* Set TWI internal clock as 10MHz */ | 694 | /* Set TWI internal clock as 10MHz */ |
676 | write_CONTROL(iface, ((get_sclk() / 1024 / 1024 + 5) / 10) & 0x7F); | 695 | write_CONTROL(iface, ((get_sclk() / 1024 / 1024 + 5) / 10) & 0x7F); |
677 | 696 | ||
697 | /* | ||
698 | * We will not end up with a CLKDIV=0 because no one will specify | ||
699 | * 20kHz SCL or less in Kconfig now. (5 * 1024 / 20 = 0x100) | ||
700 | */ | ||
701 | clkhilow = 5 * 1024 / CONFIG_I2C_BLACKFIN_TWI_CLK_KHZ; | ||
702 | |||
678 | /* Set Twi interface clock as specified */ | 703 | /* Set Twi interface clock as specified */ |
679 | write_CLKDIV(iface, ((5*1024 / CONFIG_I2C_BLACKFIN_TWI_CLK_KHZ) | 704 | write_CLKDIV(iface, (clkhilow << 8) | clkhilow); |
680 | << 8) | ((5*1024 / CONFIG_I2C_BLACKFIN_TWI_CLK_KHZ) | ||
681 | & 0xFF)); | ||
682 | 705 | ||
683 | /* Enable TWI */ | 706 | /* Enable TWI */ |
684 | write_CONTROL(iface, read_CONTROL(iface) | TWI_ENA); | 707 | write_CONTROL(iface, read_CONTROL(iface) | TWI_ENA); |
diff --git a/drivers/i2c/busses/i2c-ocores.c b/drivers/i2c/busses/i2c-ocores.c index e5193bf75483..3542c6ba98f1 100644 --- a/drivers/i2c/busses/i2c-ocores.c +++ b/drivers/i2c/busses/i2c-ocores.c | |||
@@ -216,6 +216,7 @@ static int __devinit ocores_i2c_probe(struct platform_device *pdev) | |||
216 | struct ocores_i2c_platform_data *pdata; | 216 | struct ocores_i2c_platform_data *pdata; |
217 | struct resource *res, *res2; | 217 | struct resource *res, *res2; |
218 | int ret; | 218 | int ret; |
219 | int i; | ||
219 | 220 | ||
220 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 221 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
221 | if (!res) | 222 | if (!res) |
@@ -271,6 +272,10 @@ static int __devinit ocores_i2c_probe(struct platform_device *pdev) | |||
271 | goto add_adapter_failed; | 272 | goto add_adapter_failed; |
272 | } | 273 | } |
273 | 274 | ||
275 | /* add in known devices to the bus */ | ||
276 | for (i = 0; i < pdata->num_devices; i++) | ||
277 | i2c_new_device(&i2c->adap, pdata->devices + i); | ||
278 | |||
274 | return 0; | 279 | return 0; |
275 | 280 | ||
276 | add_adapter_failed: | 281 | add_adapter_failed: |
diff --git a/drivers/i2c/busses/i2c-omap.c b/drivers/i2c/busses/i2c-omap.c index ece0125a1ee5..c73475dd0fba 100644 --- a/drivers/i2c/busses/i2c-omap.c +++ b/drivers/i2c/busses/i2c-omap.c | |||
@@ -333,8 +333,18 @@ static int omap_i2c_init(struct omap_i2c_dev *dev) | |||
333 | 333 | ||
334 | if (cpu_is_omap2430() || cpu_is_omap34xx()) { | 334 | if (cpu_is_omap2430() || cpu_is_omap34xx()) { |
335 | 335 | ||
336 | /* HSI2C controller internal clk rate should be 19.2 Mhz */ | 336 | /* |
337 | internal_clk = 19200; | 337 | * HSI2C controller internal clk rate should be 19.2 Mhz for |
338 | * HS and for all modes on 2430. On 34xx we can use lower rate | ||
339 | * to get longer filter period for better noise suppression. | ||
340 | * The filter is iclk (fclk for HS) period. | ||
341 | */ | ||
342 | if (dev->speed > 400 || cpu_is_omap_2430()) | ||
343 | internal_clk = 19200; | ||
344 | else if (dev->speed > 100) | ||
345 | internal_clk = 9600; | ||
346 | else | ||
347 | internal_clk = 4000; | ||
338 | fclk_rate = clk_get_rate(dev->fclk) / 1000; | 348 | fclk_rate = clk_get_rate(dev->fclk) / 1000; |
339 | 349 | ||
340 | /* Compute prescaler divisor */ | 350 | /* Compute prescaler divisor */ |
@@ -343,17 +353,28 @@ static int omap_i2c_init(struct omap_i2c_dev *dev) | |||
343 | 353 | ||
344 | /* If configured for High Speed */ | 354 | /* If configured for High Speed */ |
345 | if (dev->speed > 400) { | 355 | if (dev->speed > 400) { |
356 | unsigned long scl; | ||
357 | |||
346 | /* For first phase of HS mode */ | 358 | /* For first phase of HS mode */ |
347 | fsscll = internal_clk / (400 * 2) - 6; | 359 | scl = internal_clk / 400; |
348 | fssclh = internal_clk / (400 * 2) - 6; | 360 | fsscll = scl - (scl / 3) - 7; |
361 | fssclh = (scl / 3) - 5; | ||
349 | 362 | ||
350 | /* For second phase of HS mode */ | 363 | /* For second phase of HS mode */ |
351 | hsscll = fclk_rate / (dev->speed * 2) - 6; | 364 | scl = fclk_rate / dev->speed; |
352 | hssclh = fclk_rate / (dev->speed * 2) - 6; | 365 | hsscll = scl - (scl / 3) - 7; |
366 | hssclh = (scl / 3) - 5; | ||
367 | } else if (dev->speed > 100) { | ||
368 | unsigned long scl; | ||
369 | |||
370 | /* Fast mode */ | ||
371 | scl = internal_clk / dev->speed; | ||
372 | fsscll = scl - (scl / 3) - 7; | ||
373 | fssclh = (scl / 3) - 5; | ||
353 | } else { | 374 | } else { |
354 | /* To handle F/S modes */ | 375 | /* Standard mode */ |
355 | fsscll = internal_clk / (dev->speed * 2) - 6; | 376 | fsscll = internal_clk / (dev->speed * 2) - 7; |
356 | fssclh = internal_clk / (dev->speed * 2) - 6; | 377 | fssclh = internal_clk / (dev->speed * 2) - 5; |
357 | } | 378 | } |
358 | scll = (hsscll << OMAP_I2C_SCLL_HSSCLL) | fsscll; | 379 | scll = (hsscll << OMAP_I2C_SCLL_HSSCLL) | fsscll; |
359 | sclh = (hssclh << OMAP_I2C_SCLH_HSSCLH) | fssclh; | 380 | sclh = (hssclh << OMAP_I2C_SCLH_HSSCLH) | fssclh; |
diff --git a/drivers/i2c/busses/i2c-pxa.c b/drivers/i2c/busses/i2c-pxa.c index acc7143d9655..035a6c7e59df 100644 --- a/drivers/i2c/busses/i2c-pxa.c +++ b/drivers/i2c/busses/i2c-pxa.c | |||
@@ -34,10 +34,24 @@ | |||
34 | #include <linux/err.h> | 34 | #include <linux/err.h> |
35 | #include <linux/clk.h> | 35 | #include <linux/clk.h> |
36 | 36 | ||
37 | #include <mach/hardware.h> | ||
38 | #include <asm/irq.h> | 37 | #include <asm/irq.h> |
39 | #include <asm/io.h> | 38 | #include <asm/io.h> |
40 | #include <mach/i2c.h> | 39 | #include <plat/i2c.h> |
40 | |||
41 | /* | ||
42 | * I2C register offsets will be shifted 0 or 1 bit left, depending on | ||
43 | * different SoCs | ||
44 | */ | ||
45 | #define REG_SHIFT_0 (0 << 0) | ||
46 | #define REG_SHIFT_1 (1 << 0) | ||
47 | #define REG_SHIFT(d) ((d) & 0x1) | ||
48 | |||
49 | static const struct platform_device_id i2c_pxa_id_table[] = { | ||
50 | { "pxa2xx-i2c", REG_SHIFT_1 }, | ||
51 | { "pxa3xx-pwri2c", REG_SHIFT_0 }, | ||
52 | { }, | ||
53 | }; | ||
54 | MODULE_DEVICE_TABLE(platform, i2c_pxa_id_table); | ||
41 | 55 | ||
42 | /* | 56 | /* |
43 | * I2C registers and bit definitions | 57 | * I2C registers and bit definitions |
@@ -985,6 +999,7 @@ static int i2c_pxa_probe(struct platform_device *dev) | |||
985 | struct pxa_i2c *i2c; | 999 | struct pxa_i2c *i2c; |
986 | struct resource *res; | 1000 | struct resource *res; |
987 | struct i2c_pxa_platform_data *plat = dev->dev.platform_data; | 1001 | struct i2c_pxa_platform_data *plat = dev->dev.platform_data; |
1002 | struct platform_device_id *id = platform_get_device_id(dev); | ||
988 | int ret; | 1003 | int ret; |
989 | int irq; | 1004 | int irq; |
990 | 1005 | ||
@@ -1028,7 +1043,7 @@ static int i2c_pxa_probe(struct platform_device *dev) | |||
1028 | ret = -EIO; | 1043 | ret = -EIO; |
1029 | goto eremap; | 1044 | goto eremap; |
1030 | } | 1045 | } |
1031 | i2c->reg_shift = (cpu_is_pxa3xx() && (dev->id == 1)) ? 0 : 1; | 1046 | i2c->reg_shift = REG_SHIFT(id->driver_data); |
1032 | 1047 | ||
1033 | i2c->iobase = res->start; | 1048 | i2c->iobase = res->start; |
1034 | i2c->iosize = res_len(res); | 1049 | i2c->iosize = res_len(res); |
@@ -1150,6 +1165,7 @@ static struct platform_driver i2c_pxa_driver = { | |||
1150 | .name = "pxa2xx-i2c", | 1165 | .name = "pxa2xx-i2c", |
1151 | .owner = THIS_MODULE, | 1166 | .owner = THIS_MODULE, |
1152 | }, | 1167 | }, |
1168 | .id_table = i2c_pxa_id_table, | ||
1153 | }; | 1169 | }; |
1154 | 1170 | ||
1155 | static int __init i2c_adap_pxa_init(void) | 1171 | static int __init i2c_adap_pxa_init(void) |
diff --git a/drivers/i2c/busses/i2c-s3c2410.c b/drivers/i2c/busses/i2c-s3c2410.c index 1691ef0f1ee1..079a312d36fd 100644 --- a/drivers/i2c/busses/i2c-s3c2410.c +++ b/drivers/i2c/busses/i2c-s3c2410.c | |||
@@ -51,6 +51,11 @@ enum s3c24xx_i2c_state { | |||
51 | STATE_STOP | 51 | STATE_STOP |
52 | }; | 52 | }; |
53 | 53 | ||
54 | enum s3c24xx_i2c_type { | ||
55 | TYPE_S3C2410, | ||
56 | TYPE_S3C2440, | ||
57 | }; | ||
58 | |||
54 | struct s3c24xx_i2c { | 59 | struct s3c24xx_i2c { |
55 | spinlock_t lock; | 60 | spinlock_t lock; |
56 | wait_queue_head_t wait; | 61 | wait_queue_head_t wait; |
@@ -88,8 +93,10 @@ struct s3c24xx_i2c { | |||
88 | static inline int s3c24xx_i2c_is2440(struct s3c24xx_i2c *i2c) | 93 | static inline int s3c24xx_i2c_is2440(struct s3c24xx_i2c *i2c) |
89 | { | 94 | { |
90 | struct platform_device *pdev = to_platform_device(i2c->dev); | 95 | struct platform_device *pdev = to_platform_device(i2c->dev); |
96 | enum s3c24xx_i2c_type type; | ||
91 | 97 | ||
92 | return !strcmp(pdev->name, "s3c2440-i2c"); | 98 | type = platform_get_device_id(pdev)->driver_data; |
99 | return type == TYPE_S3C2440; | ||
93 | } | 100 | } |
94 | 101 | ||
95 | /* s3c24xx_i2c_master_complete | 102 | /* s3c24xx_i2c_master_complete |
@@ -969,52 +976,41 @@ static int s3c24xx_i2c_resume(struct platform_device *dev) | |||
969 | 976 | ||
970 | /* device driver for platform bus bits */ | 977 | /* device driver for platform bus bits */ |
971 | 978 | ||
972 | static struct platform_driver s3c2410_i2c_driver = { | 979 | static struct platform_device_id s3c24xx_driver_ids[] = { |
973 | .probe = s3c24xx_i2c_probe, | 980 | { |
974 | .remove = s3c24xx_i2c_remove, | 981 | .name = "s3c2410-i2c", |
975 | .suspend_late = s3c24xx_i2c_suspend_late, | 982 | .driver_data = TYPE_S3C2410, |
976 | .resume = s3c24xx_i2c_resume, | 983 | }, { |
977 | .driver = { | 984 | .name = "s3c2440-i2c", |
978 | .owner = THIS_MODULE, | 985 | .driver_data = TYPE_S3C2440, |
979 | .name = "s3c2410-i2c", | 986 | }, { }, |
980 | }, | ||
981 | }; | 987 | }; |
988 | MODULE_DEVICE_TABLE(platform, s3c24xx_driver_ids); | ||
982 | 989 | ||
983 | static struct platform_driver s3c2440_i2c_driver = { | 990 | static struct platform_driver s3c24xx_i2c_driver = { |
984 | .probe = s3c24xx_i2c_probe, | 991 | .probe = s3c24xx_i2c_probe, |
985 | .remove = s3c24xx_i2c_remove, | 992 | .remove = s3c24xx_i2c_remove, |
986 | .suspend_late = s3c24xx_i2c_suspend_late, | 993 | .suspend_late = s3c24xx_i2c_suspend_late, |
987 | .resume = s3c24xx_i2c_resume, | 994 | .resume = s3c24xx_i2c_resume, |
995 | .id_table = s3c24xx_driver_ids, | ||
988 | .driver = { | 996 | .driver = { |
989 | .owner = THIS_MODULE, | 997 | .owner = THIS_MODULE, |
990 | .name = "s3c2440-i2c", | 998 | .name = "s3c-i2c", |
991 | }, | 999 | }, |
992 | }; | 1000 | }; |
993 | 1001 | ||
994 | static int __init i2c_adap_s3c_init(void) | 1002 | static int __init i2c_adap_s3c_init(void) |
995 | { | 1003 | { |
996 | int ret; | 1004 | return platform_driver_register(&s3c24xx_i2c_driver); |
997 | |||
998 | ret = platform_driver_register(&s3c2410_i2c_driver); | ||
999 | if (ret == 0) { | ||
1000 | ret = platform_driver_register(&s3c2440_i2c_driver); | ||
1001 | if (ret) | ||
1002 | platform_driver_unregister(&s3c2410_i2c_driver); | ||
1003 | } | ||
1004 | |||
1005 | return ret; | ||
1006 | } | 1005 | } |
1007 | subsys_initcall(i2c_adap_s3c_init); | 1006 | subsys_initcall(i2c_adap_s3c_init); |
1008 | 1007 | ||
1009 | static void __exit i2c_adap_s3c_exit(void) | 1008 | static void __exit i2c_adap_s3c_exit(void) |
1010 | { | 1009 | { |
1011 | platform_driver_unregister(&s3c2410_i2c_driver); | 1010 | platform_driver_unregister(&s3c24xx_i2c_driver); |
1012 | platform_driver_unregister(&s3c2440_i2c_driver); | ||
1013 | } | 1011 | } |
1014 | module_exit(i2c_adap_s3c_exit); | 1012 | module_exit(i2c_adap_s3c_exit); |
1015 | 1013 | ||
1016 | MODULE_DESCRIPTION("S3C24XX I2C Bus driver"); | 1014 | MODULE_DESCRIPTION("S3C24XX I2C Bus driver"); |
1017 | MODULE_AUTHOR("Ben Dooks, <ben@simtec.co.uk>"); | 1015 | MODULE_AUTHOR("Ben Dooks, <ben@simtec.co.uk>"); |
1018 | MODULE_LICENSE("GPL"); | 1016 | MODULE_LICENSE("GPL"); |
1019 | MODULE_ALIAS("platform:s3c2410-i2c"); | ||
1020 | MODULE_ALIAS("platform:s3c2440-i2c"); | ||
diff --git a/drivers/ide/Kconfig b/drivers/ide/Kconfig index cf06494bb744..9a5d0aaac9d0 100644 --- a/drivers/ide/Kconfig +++ b/drivers/ide/Kconfig | |||
@@ -46,7 +46,7 @@ menuconfig IDE | |||
46 | SMART parameters from disk drives. | 46 | SMART parameters from disk drives. |
47 | 47 | ||
48 | To compile this driver as a module, choose M here: the | 48 | To compile this driver as a module, choose M here: the |
49 | module will be called ide-core.ko. | 49 | module will be called ide-core. |
50 | 50 | ||
51 | For further information, please read <file:Documentation/ide/ide.txt>. | 51 | For further information, please read <file:Documentation/ide/ide.txt>. |
52 | 52 | ||
diff --git a/drivers/ide/ide-atapi.c b/drivers/ide/ide-atapi.c index bbdd2547f12a..702ef64a0f12 100644 --- a/drivers/ide/ide-atapi.c +++ b/drivers/ide/ide-atapi.c | |||
@@ -577,7 +577,7 @@ static ide_startstop_t ide_transfer_pc(ide_drive_t *drive) | |||
577 | 577 | ||
578 | /* | 578 | /* |
579 | * If necessary schedule the packet transfer to occur 'timeout' | 579 | * If necessary schedule the packet transfer to occur 'timeout' |
580 | * miliseconds later in ide_delayed_transfer_pc() after the | 580 | * milliseconds later in ide_delayed_transfer_pc() after the |
581 | * device says it's ready for a packet. | 581 | * device says it's ready for a packet. |
582 | */ | 582 | */ |
583 | if (drive->atapi_flags & IDE_AFLAG_ZIP_DRIVE) { | 583 | if (drive->atapi_flags & IDE_AFLAG_ZIP_DRIVE) { |
diff --git a/drivers/input/misc/Kconfig b/drivers/input/misc/Kconfig index 5c0a631d1455..06f46fcc0772 100644 --- a/drivers/input/misc/Kconfig +++ b/drivers/input/misc/Kconfig | |||
@@ -232,7 +232,7 @@ config INPUT_GPIO_ROTARY_ENCODER | |||
232 | depends on GPIOLIB && GENERIC_GPIO | 232 | depends on GPIOLIB && GENERIC_GPIO |
233 | help | 233 | help |
234 | Say Y here to add support for rotary encoders connected to GPIO lines. | 234 | Say Y here to add support for rotary encoders connected to GPIO lines. |
235 | Check file:Documentation/incput/rotary_encoder.txt for more | 235 | Check file:Documentation/input/rotary-encoder.txt for more |
236 | information. | 236 | information. |
237 | 237 | ||
238 | To compile this driver as a module, choose M here: the | 238 | To compile this driver as a module, choose M here: the |
diff --git a/drivers/input/serio/ambakmi.c b/drivers/input/serio/ambakmi.c index a28c06d686e1..89b394183a75 100644 --- a/drivers/input/serio/ambakmi.c +++ b/drivers/input/serio/ambakmi.c | |||
@@ -135,7 +135,7 @@ static int amba_kmi_probe(struct amba_device *dev, struct amba_id *id) | |||
135 | io->dev.parent = &dev->dev; | 135 | io->dev.parent = &dev->dev; |
136 | 136 | ||
137 | kmi->io = io; | 137 | kmi->io = io; |
138 | kmi->base = ioremap(dev->res.start, KMI_SIZE); | 138 | kmi->base = ioremap(dev->res.start, resource_size(&dev->res)); |
139 | if (!kmi->base) { | 139 | if (!kmi->base) { |
140 | ret = -ENOMEM; | 140 | ret = -ENOMEM; |
141 | goto out; | 141 | goto out; |
diff --git a/drivers/isdn/divert/isdn_divert.c b/drivers/isdn/divert/isdn_divert.c index 7d97d54588d9..77e9fdda0597 100644 --- a/drivers/isdn/divert/isdn_divert.c +++ b/drivers/isdn/divert/isdn_divert.c | |||
@@ -183,7 +183,7 @@ int cf_command(int drvid, int mode, | |||
183 | (mode != 1) ? "" : " 0 ", | 183 | (mode != 1) ? "" : " 0 ", |
184 | (mode != 1) ? "" : fwd_nr); | 184 | (mode != 1) ? "" : fwd_nr); |
185 | 185 | ||
186 | retval = divert_if.ll_cmd(&cs->ics); /* excute command */ | 186 | retval = divert_if.ll_cmd(&cs->ics); /* execute command */ |
187 | 187 | ||
188 | if (!retval) | 188 | if (!retval) |
189 | { cs->prev = NULL; | 189 | { cs->prev = NULL; |
diff --git a/drivers/isdn/mISDN/dsp_core.c b/drivers/isdn/mISDN/dsp_core.c index 3083338716b2..47dbfe298b43 100644 --- a/drivers/isdn/mISDN/dsp_core.c +++ b/drivers/isdn/mISDN/dsp_core.c | |||
@@ -502,7 +502,7 @@ tone_off: | |||
502 | break; | 502 | break; |
503 | } | 503 | } |
504 | dsp->cmx_delay = (*((int *)data)) << 3; | 504 | dsp->cmx_delay = (*((int *)data)) << 3; |
505 | /* miliseconds to samples */ | 505 | /* milliseconds to samples */ |
506 | if (dsp->cmx_delay >= (CMX_BUFF_HALF>>1)) | 506 | if (dsp->cmx_delay >= (CMX_BUFF_HALF>>1)) |
507 | /* clip to half of maximum usable buffer | 507 | /* clip to half of maximum usable buffer |
508 | (half of half buffer) */ | 508 | (half of half buffer) */ |
diff --git a/drivers/leds/leds-h1940.c b/drivers/leds/leds-h1940.c index 1aa46a390a0d..173d104d9ff2 100644 --- a/drivers/leds/leds-h1940.c +++ b/drivers/leds/leds-h1940.c | |||
@@ -16,6 +16,8 @@ | |||
16 | #include <linux/string.h> | 16 | #include <linux/string.h> |
17 | #include <linux/ctype.h> | 17 | #include <linux/ctype.h> |
18 | #include <linux/leds.h> | 18 | #include <linux/leds.h> |
19 | #include <linux/gpio.h> | ||
20 | |||
19 | #include <mach/regs-gpio.h> | 21 | #include <mach/regs-gpio.h> |
20 | #include <mach/hardware.h> | 22 | #include <mach/hardware.h> |
21 | #include <mach/h1940-latch.h> | 23 | #include <mach/h1940-latch.h> |
diff --git a/drivers/leds/leds-s3c24xx.c b/drivers/leds/leds-s3c24xx.c index aa2e7ae0cdae..aa7acf3b9224 100644 --- a/drivers/leds/leds-s3c24xx.c +++ b/drivers/leds/leds-s3c24xx.c | |||
@@ -15,6 +15,7 @@ | |||
15 | #include <linux/init.h> | 15 | #include <linux/init.h> |
16 | #include <linux/platform_device.h> | 16 | #include <linux/platform_device.h> |
17 | #include <linux/leds.h> | 17 | #include <linux/leds.h> |
18 | #include <linux/gpio.h> | ||
18 | 19 | ||
19 | #include <mach/hardware.h> | 20 | #include <mach/hardware.h> |
20 | #include <mach/regs-gpio.h> | 21 | #include <mach/regs-gpio.h> |
diff --git a/drivers/media/dvb/dvb-usb/Kconfig b/drivers/media/dvb/dvb-usb/Kconfig index 60955a70d880..1bb66e1ed5a7 100644 --- a/drivers/media/dvb/dvb-usb/Kconfig +++ b/drivers/media/dvb/dvb-usb/Kconfig | |||
@@ -216,7 +216,7 @@ config DVB_USB_TTUSB2 | |||
216 | help | 216 | help |
217 | Say Y here to support the Pinnacle 400e DVB-S USB2.0 receiver. The | 217 | Say Y here to support the Pinnacle 400e DVB-S USB2.0 receiver. The |
218 | firmware protocol used by this module is similar to the one used by the | 218 | firmware protocol used by this module is similar to the one used by the |
219 | old ttusb-driver - that's why the module is called dvb-usb-ttusb2.ko. | 219 | old ttusb-driver - that's why the module is called dvb-usb-ttusb2. |
220 | 220 | ||
221 | config DVB_USB_DTT200U | 221 | config DVB_USB_DTT200U |
222 | tristate "WideView WT-200U and WT-220U (pen) DVB-T USB2.0 support (Yakumo/Hama/Typhoon/Yuan)" | 222 | tristate "WideView WT-200U and WT-220U (pen) DVB-T USB2.0 support (Yakumo/Hama/Typhoon/Yuan)" |
diff --git a/drivers/media/video/Kconfig b/drivers/media/video/Kconfig index 9d48da2fb013..57835f5715fc 100644 --- a/drivers/media/video/Kconfig +++ b/drivers/media/video/Kconfig | |||
@@ -758,10 +758,14 @@ config VIDEO_MX1 | |||
758 | ---help--- | 758 | ---help--- |
759 | This is a v4l2 driver for the i.MX1/i.MXL CMOS Sensor Interface | 759 | This is a v4l2 driver for the i.MX1/i.MXL CMOS Sensor Interface |
760 | 760 | ||
761 | config MX3_VIDEO | ||
762 | bool | ||
763 | |||
761 | config VIDEO_MX3 | 764 | config VIDEO_MX3 |
762 | tristate "i.MX3x Camera Sensor Interface driver" | 765 | tristate "i.MX3x Camera Sensor Interface driver" |
763 | depends on VIDEO_DEV && MX3_IPU && SOC_CAMERA | 766 | depends on VIDEO_DEV && MX3_IPU && SOC_CAMERA |
764 | select VIDEOBUF_DMA_CONTIG | 767 | select VIDEOBUF_DMA_CONTIG |
768 | select MX3_VIDEO | ||
765 | ---help--- | 769 | ---help--- |
766 | This is a v4l2 driver for the i.MX3x Camera Sensor Interface | 770 | This is a v4l2 driver for the i.MX3x Camera Sensor Interface |
767 | 771 | ||
diff --git a/drivers/media/video/hdpvr/hdpvr-video.c b/drivers/media/video/hdpvr/hdpvr-video.c index 3e6ffee8dfed..ccd47f57f42c 100644 --- a/drivers/media/video/hdpvr/hdpvr-video.c +++ b/drivers/media/video/hdpvr/hdpvr-video.c | |||
@@ -181,7 +181,7 @@ static int hdpvr_submit_buffers(struct hdpvr_device *dev) | |||
181 | buff_list); | 181 | buff_list); |
182 | if (buf->status != BUFSTAT_AVAILABLE) { | 182 | if (buf->status != BUFSTAT_AVAILABLE) { |
183 | v4l2_err(&dev->v4l2_dev, | 183 | v4l2_err(&dev->v4l2_dev, |
184 | "buffer not marked as availbale\n"); | 184 | "buffer not marked as available\n"); |
185 | ret = -EFAULT; | 185 | ret = -EFAULT; |
186 | goto err; | 186 | goto err; |
187 | } | 187 | } |
diff --git a/drivers/message/fusion/lsi/mpi_history.txt b/drivers/message/fusion/lsi/mpi_history.txt index 693e4b511354..fa9249b4971a 100644 --- a/drivers/message/fusion/lsi/mpi_history.txt +++ b/drivers/message/fusion/lsi/mpi_history.txt | |||
@@ -130,7 +130,7 @@ mpi_ioc.h | |||
130 | * 08-08-01 01.02.01 Original release for v1.2 work. | 130 | * 08-08-01 01.02.01 Original release for v1.2 work. |
131 | * New format for FWVersion and ProductId in | 131 | * New format for FWVersion and ProductId in |
132 | * MSG_IOC_FACTS_REPLY and MPI_FW_HEADER. | 132 | * MSG_IOC_FACTS_REPLY and MPI_FW_HEADER. |
133 | * 08-31-01 01.02.02 Addded event MPI_EVENT_SCSI_DEVICE_STATUS_CHANGE and | 133 | * 08-31-01 01.02.02 Added event MPI_EVENT_SCSI_DEVICE_STATUS_CHANGE and |
134 | * related structure and defines. | 134 | * related structure and defines. |
135 | * Added event MPI_EVENT_ON_BUS_TIMER_EXPIRED. | 135 | * Added event MPI_EVENT_ON_BUS_TIMER_EXPIRED. |
136 | * Added MPI_IOCINIT_FLAGS_DISCARD_FW_IMAGE. | 136 | * Added MPI_IOCINIT_FLAGS_DISCARD_FW_IMAGE. |
@@ -190,7 +190,7 @@ mpi_ioc.h | |||
190 | * 10-11-06 01.05.12 Added MPI_IOCFACTS_EXCEPT_METADATA_UNSUPPORTED. | 190 | * 10-11-06 01.05.12 Added MPI_IOCFACTS_EXCEPT_METADATA_UNSUPPORTED. |
191 | * Added MaxInitiators field to PortFacts reply. | 191 | * Added MaxInitiators field to PortFacts reply. |
192 | * Added SAS Device Status Change ReasonCode for | 192 | * Added SAS Device Status Change ReasonCode for |
193 | * asynchronous notificaiton. | 193 | * asynchronous notification. |
194 | * Added MPI_EVENT_SAS_EXPANDER_STATUS_CHANGE and event | 194 | * Added MPI_EVENT_SAS_EXPANDER_STATUS_CHANGE and event |
195 | * data structure. | 195 | * data structure. |
196 | * Added new ImageType values for FWDownload and FWUpload | 196 | * Added new ImageType values for FWDownload and FWUpload |
@@ -623,7 +623,7 @@ mpi_fc.h | |||
623 | * 11-02-00 01.01.01 Original release for post 1.0 work | 623 | * 11-02-00 01.01.01 Original release for post 1.0 work |
624 | * 12-04-00 01.01.02 Added messages for Common Transport Send and | 624 | * 12-04-00 01.01.02 Added messages for Common Transport Send and |
625 | * Primitive Send. | 625 | * Primitive Send. |
626 | * 01-09-01 01.01.03 Modifed some of the new flags to have an MPI prefix | 626 | * 01-09-01 01.01.03 Modified some of the new flags to have an MPI prefix |
627 | * and modified the FcPrimitiveSend flags. | 627 | * and modified the FcPrimitiveSend flags. |
628 | * 01-25-01 01.01.04 Move InitiatorIndex in LinkServiceRsp reply to a larger | 628 | * 01-25-01 01.01.04 Move InitiatorIndex in LinkServiceRsp reply to a larger |
629 | * field. | 629 | * field. |
diff --git a/drivers/mmc/host/Kconfig b/drivers/mmc/host/Kconfig index 660bda0c5a1e..40111a6d8d5b 100644 --- a/drivers/mmc/host/Kconfig +++ b/drivers/mmc/host/Kconfig | |||
@@ -166,7 +166,7 @@ config MMC_ATMELMCI_DMA | |||
166 | 166 | ||
167 | config MMC_IMX | 167 | config MMC_IMX |
168 | tristate "Motorola i.MX Multimedia Card Interface support" | 168 | tristate "Motorola i.MX Multimedia Card Interface support" |
169 | depends on ARCH_IMX | 169 | depends on ARCH_MX1 |
170 | help | 170 | help |
171 | This selects the Motorola i.MX Multimedia card Interface. | 171 | This selects the Motorola i.MX Multimedia card Interface. |
172 | If you have a i.MX platform with a Multimedia Card slot, | 172 | If you have a i.MX platform with a Multimedia Card slot, |
diff --git a/drivers/mmc/host/atmel-mci.c b/drivers/mmc/host/atmel-mci.c index cf6a100bb38f..7b603e4b41db 100644 --- a/drivers/mmc/host/atmel-mci.c +++ b/drivers/mmc/host/atmel-mci.c | |||
@@ -177,6 +177,7 @@ struct atmel_mci { | |||
177 | * available. | 177 | * available. |
178 | * @wp_pin: GPIO pin used for card write protect sending, or negative | 178 | * @wp_pin: GPIO pin used for card write protect sending, or negative |
179 | * if not available. | 179 | * if not available. |
180 | * @detect_is_active_high: The state of the detect pin when it is active. | ||
180 | * @detect_timer: Timer used for debouncing @detect_pin interrupts. | 181 | * @detect_timer: Timer used for debouncing @detect_pin interrupts. |
181 | */ | 182 | */ |
182 | struct atmel_mci_slot { | 183 | struct atmel_mci_slot { |
@@ -196,6 +197,7 @@ struct atmel_mci_slot { | |||
196 | 197 | ||
197 | int detect_pin; | 198 | int detect_pin; |
198 | int wp_pin; | 199 | int wp_pin; |
200 | bool detect_is_active_high; | ||
199 | 201 | ||
200 | struct timer_list detect_timer; | 202 | struct timer_list detect_timer; |
201 | }; | 203 | }; |
@@ -924,7 +926,8 @@ static int atmci_get_cd(struct mmc_host *mmc) | |||
924 | struct atmel_mci_slot *slot = mmc_priv(mmc); | 926 | struct atmel_mci_slot *slot = mmc_priv(mmc); |
925 | 927 | ||
926 | if (gpio_is_valid(slot->detect_pin)) { | 928 | if (gpio_is_valid(slot->detect_pin)) { |
927 | present = !gpio_get_value(slot->detect_pin); | 929 | present = !(gpio_get_value(slot->detect_pin) ^ |
930 | slot->detect_is_active_high); | ||
928 | dev_dbg(&mmc->class_dev, "card is %spresent\n", | 931 | dev_dbg(&mmc->class_dev, "card is %spresent\n", |
929 | present ? "" : "not "); | 932 | present ? "" : "not "); |
930 | } | 933 | } |
@@ -1028,7 +1031,8 @@ static void atmci_detect_change(unsigned long data) | |||
1028 | return; | 1031 | return; |
1029 | 1032 | ||
1030 | enable_irq(gpio_to_irq(slot->detect_pin)); | 1033 | enable_irq(gpio_to_irq(slot->detect_pin)); |
1031 | present = !gpio_get_value(slot->detect_pin); | 1034 | present = !(gpio_get_value(slot->detect_pin) ^ |
1035 | slot->detect_is_active_high); | ||
1032 | present_old = test_bit(ATMCI_CARD_PRESENT, &slot->flags); | 1036 | present_old = test_bit(ATMCI_CARD_PRESENT, &slot->flags); |
1033 | 1037 | ||
1034 | dev_vdbg(&slot->mmc->class_dev, "detect change: %d (was %d)\n", | 1038 | dev_vdbg(&slot->mmc->class_dev, "detect change: %d (was %d)\n", |
@@ -1456,6 +1460,7 @@ static int __init atmci_init_slot(struct atmel_mci *host, | |||
1456 | slot->host = host; | 1460 | slot->host = host; |
1457 | slot->detect_pin = slot_data->detect_pin; | 1461 | slot->detect_pin = slot_data->detect_pin; |
1458 | slot->wp_pin = slot_data->wp_pin; | 1462 | slot->wp_pin = slot_data->wp_pin; |
1463 | slot->detect_is_active_high = slot_data->detect_is_active_high; | ||
1459 | slot->sdc_reg = sdc_reg; | 1464 | slot->sdc_reg = sdc_reg; |
1460 | 1465 | ||
1461 | mmc->ops = &atmci_ops; | 1466 | mmc->ops = &atmci_ops; |
@@ -1477,7 +1482,8 @@ static int __init atmci_init_slot(struct atmel_mci *host, | |||
1477 | if (gpio_request(slot->detect_pin, "mmc_detect")) { | 1482 | if (gpio_request(slot->detect_pin, "mmc_detect")) { |
1478 | dev_dbg(&mmc->class_dev, "no detect pin available\n"); | 1483 | dev_dbg(&mmc->class_dev, "no detect pin available\n"); |
1479 | slot->detect_pin = -EBUSY; | 1484 | slot->detect_pin = -EBUSY; |
1480 | } else if (gpio_get_value(slot->detect_pin)) { | 1485 | } else if (gpio_get_value(slot->detect_pin) ^ |
1486 | slot->detect_is_active_high) { | ||
1481 | clear_bit(ATMCI_CARD_PRESENT, &slot->flags); | 1487 | clear_bit(ATMCI_CARD_PRESENT, &slot->flags); |
1482 | } | 1488 | } |
1483 | } | 1489 | } |
diff --git a/drivers/mmc/host/mmci.c b/drivers/mmc/host/mmci.c index 7d4febdab286..e1aa8471ab1c 100644 --- a/drivers/mmc/host/mmci.c +++ b/drivers/mmc/host/mmci.c | |||
@@ -546,7 +546,7 @@ static int __devinit mmci_probe(struct amba_device *dev, struct amba_id *id) | |||
546 | host->mclk = clk_get_rate(host->clk); | 546 | host->mclk = clk_get_rate(host->clk); |
547 | DBG(host, "eventual mclk rate: %u Hz\n", host->mclk); | 547 | DBG(host, "eventual mclk rate: %u Hz\n", host->mclk); |
548 | } | 548 | } |
549 | host->base = ioremap(dev->res.start, SZ_4K); | 549 | host->base = ioremap(dev->res.start, resource_size(&dev->res)); |
550 | if (!host->base) { | 550 | if (!host->base) { |
551 | ret = -ENOMEM; | 551 | ret = -ENOMEM; |
552 | goto clk_disable; | 552 | goto clk_disable; |
diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c index c40cb96255a2..1cf9cfb3b64f 100644 --- a/drivers/mmc/host/omap_hsmmc.c +++ b/drivers/mmc/host/omap_hsmmc.c | |||
@@ -1073,7 +1073,6 @@ static int __init omap_mmc_probe(struct platform_device *pdev) | |||
1073 | mmc->max_req_size = mmc->max_blk_size * mmc->max_blk_count; | 1073 | mmc->max_req_size = mmc->max_blk_size * mmc->max_blk_count; |
1074 | mmc->max_seg_size = mmc->max_req_size; | 1074 | mmc->max_seg_size = mmc->max_req_size; |
1075 | 1075 | ||
1076 | mmc->ocr_avail = mmc_slot(host).ocr_mask; | ||
1077 | mmc->caps |= MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED; | 1076 | mmc->caps |= MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED; |
1078 | 1077 | ||
1079 | if (pdata->slots[host->slot_id].wires >= 8) | 1078 | if (pdata->slots[host->slot_id].wires >= 8) |
@@ -1110,13 +1109,14 @@ static int __init omap_mmc_probe(struct platform_device *pdev) | |||
1110 | goto err_irq; | 1109 | goto err_irq; |
1111 | } | 1110 | } |
1112 | 1111 | ||
1112 | /* initialize power supplies, gpios, etc */ | ||
1113 | if (pdata->init != NULL) { | 1113 | if (pdata->init != NULL) { |
1114 | if (pdata->init(&pdev->dev) != 0) { | 1114 | if (pdata->init(&pdev->dev) != 0) { |
1115 | dev_dbg(mmc_dev(host->mmc), | 1115 | dev_dbg(mmc_dev(host->mmc), "late init error\n"); |
1116 | "Unable to configure MMC IRQs\n"); | ||
1117 | goto err_irq_cd_init; | 1116 | goto err_irq_cd_init; |
1118 | } | 1117 | } |
1119 | } | 1118 | } |
1119 | mmc->ocr_avail = mmc_slot(host).ocr_mask; | ||
1120 | 1120 | ||
1121 | /* Request IRQ for card detect */ | 1121 | /* Request IRQ for card detect */ |
1122 | if ((mmc_slot(host).card_detect_irq)) { | 1122 | if ((mmc_slot(host).card_detect_irq)) { |
diff --git a/drivers/mmc/host/s3cmci.c b/drivers/mmc/host/s3cmci.c index 2db166b7096f..4eb4f37544ab 100644 --- a/drivers/mmc/host/s3cmci.c +++ b/drivers/mmc/host/s3cmci.c | |||
@@ -17,6 +17,7 @@ | |||
17 | #include <linux/mmc/host.h> | 17 | #include <linux/mmc/host.h> |
18 | #include <linux/platform_device.h> | 18 | #include <linux/platform_device.h> |
19 | #include <linux/cpufreq.h> | 19 | #include <linux/cpufreq.h> |
20 | #include <linux/gpio.h> | ||
20 | #include <linux/irq.h> | 21 | #include <linux/irq.h> |
21 | #include <linux/io.h> | 22 | #include <linux/io.h> |
22 | 23 | ||
@@ -789,7 +790,7 @@ static void s3cmci_dma_setup(struct s3cmci_host *host, | |||
789 | 790 | ||
790 | last_source = source; | 791 | last_source = source; |
791 | 792 | ||
792 | s3c2410_dma_devconfig(host->dma, source, 3, | 793 | s3c2410_dma_devconfig(host->dma, source, |
793 | host->mem->start + host->sdidata); | 794 | host->mem->start + host->sdidata); |
794 | 795 | ||
795 | if (!setup_ok) { | 796 | if (!setup_ok) { |
@@ -1121,7 +1122,7 @@ static void s3cmci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) | |||
1121 | case MMC_POWER_OFF: | 1122 | case MMC_POWER_OFF: |
1122 | default: | 1123 | default: |
1123 | s3c2410_gpio_setpin(S3C2410_GPE5, 0); | 1124 | s3c2410_gpio_setpin(S3C2410_GPE5, 0); |
1124 | s3c2410_gpio_cfgpin(S3C2410_GPE5, S3C2410_GPE5_OUTP); | 1125 | s3c2410_gpio_cfgpin(S3C2410_GPE5, S3C2410_GPIO_OUTPUT); |
1125 | 1126 | ||
1126 | if (host->is2440) | 1127 | if (host->is2440) |
1127 | mci_con |= S3C2440_SDICON_SDRESET; | 1128 | mci_con |= S3C2440_SDICON_SDRESET; |
diff --git a/drivers/mtd/Kconfig b/drivers/mtd/Kconfig index 7d04fb9ddcaa..b8e35a0b4d72 100644 --- a/drivers/mtd/Kconfig +++ b/drivers/mtd/Kconfig | |||
@@ -154,7 +154,8 @@ config MTD_AFS_PARTS | |||
154 | 154 | ||
155 | You will still need the parsing functions to be called by the driver | 155 | You will still need the parsing functions to be called by the driver |
156 | for your particular device. It won't happen automatically. The | 156 | for your particular device. It won't happen automatically. The |
157 | 'armflash' map driver (CONFIG_MTD_ARMFLASH) does this, for example. | 157 | 'armflash' map driver (CONFIG_MTD_ARM_INTEGRATOR) does this, for |
158 | example. | ||
158 | 159 | ||
159 | config MTD_OF_PARTS | 160 | config MTD_OF_PARTS |
160 | tristate "Flash partition map based on OF description" | 161 | tristate "Flash partition map based on OF description" |
diff --git a/drivers/mtd/devices/Kconfig b/drivers/mtd/devices/Kconfig index 6fde0a2e3567..325fab92a62c 100644 --- a/drivers/mtd/devices/Kconfig +++ b/drivers/mtd/devices/Kconfig | |||
@@ -49,7 +49,7 @@ config MTD_MS02NV | |||
49 | If you want to compile this driver as a module ( = code which can be | 49 | If you want to compile this driver as a module ( = code which can be |
50 | inserted in and removed from the running kernel whenever you want), | 50 | inserted in and removed from the running kernel whenever you want), |
51 | say M here and read <file:Documentation/kbuild/modules.txt>. | 51 | say M here and read <file:Documentation/kbuild/modules.txt>. |
52 | The module will be called ms02-nv.ko. | 52 | The module will be called ms02-nv. |
53 | 53 | ||
54 | config MTD_DATAFLASH | 54 | config MTD_DATAFLASH |
55 | tristate "Support for AT45xxx DataFlash" | 55 | tristate "Support for AT45xxx DataFlash" |
diff --git a/drivers/mtd/nand/Kconfig b/drivers/mtd/nand/Kconfig index 890936d0275e..f3276897859e 100644 --- a/drivers/mtd/nand/Kconfig +++ b/drivers/mtd/nand/Kconfig | |||
@@ -260,7 +260,7 @@ config MTD_NAND_BASLER_EXCITE | |||
260 | help | 260 | help |
261 | This enables the driver for the NAND flash device found on the | 261 | This enables the driver for the NAND flash device found on the |
262 | Basler eXcite Smart Camera. If built as a module, the driver | 262 | Basler eXcite Smart Camera. If built as a module, the driver |
263 | will be named "excite_nandflash.ko". | 263 | will be named excite_nandflash. |
264 | 264 | ||
265 | config MTD_NAND_CAFE | 265 | config MTD_NAND_CAFE |
266 | tristate "NAND support for OLPC CAFÉ chip" | 266 | tristate "NAND support for OLPC CAFÉ chip" |
@@ -282,7 +282,7 @@ config MTD_NAND_CS553X | |||
282 | controller is enabled for NAND, and currently requires that | 282 | controller is enabled for NAND, and currently requires that |
283 | the controller be in MMIO mode. | 283 | the controller be in MMIO mode. |
284 | 284 | ||
285 | If you say "m", the module will be called "cs553x_nand.ko". | 285 | If you say "m", the module will be called cs553x_nand. |
286 | 286 | ||
287 | config MTD_NAND_ATMEL | 287 | config MTD_NAND_ATMEL |
288 | tristate "Support for NAND Flash / SmartMedia on AT91 and AVR32" | 288 | tristate "Support for NAND Flash / SmartMedia on AT91 and AVR32" |
diff --git a/drivers/mtd/onenand/omap2.c b/drivers/mtd/onenand/omap2.c index f2e9de1414df..6391e3dc8002 100644 --- a/drivers/mtd/onenand/omap2.c +++ b/drivers/mtd/onenand/omap2.c | |||
@@ -39,7 +39,6 @@ | |||
39 | #include <mach/gpmc.h> | 39 | #include <mach/gpmc.h> |
40 | #include <mach/onenand.h> | 40 | #include <mach/onenand.h> |
41 | #include <mach/gpio.h> | 41 | #include <mach/gpio.h> |
42 | #include <mach/pm.h> | ||
43 | 42 | ||
44 | #include <mach/dma.h> | 43 | #include <mach/dma.h> |
45 | 44 | ||
diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig index f3c4a3b910bb..3111b6c7cbc3 100644 --- a/drivers/net/Kconfig +++ b/drivers/net/Kconfig | |||
@@ -1880,7 +1880,7 @@ config FEC_MPC52xx | |||
1880 | ---help--- | 1880 | ---help--- |
1881 | This option enables support for the MPC5200's on-chip | 1881 | This option enables support for the MPC5200's on-chip |
1882 | Fast Ethernet Controller | 1882 | Fast Ethernet Controller |
1883 | If compiled as module, it will be called 'fec_mpc52xx.ko'. | 1883 | If compiled as module, it will be called fec_mpc52xx. |
1884 | 1884 | ||
1885 | config FEC_MPC52xx_MDIO | 1885 | config FEC_MPC52xx_MDIO |
1886 | bool "MPC52xx FEC MDIO bus driver" | 1886 | bool "MPC52xx FEC MDIO bus driver" |
@@ -1892,7 +1892,7 @@ config FEC_MPC52xx_MDIO | |||
1892 | (Motorola? industry standard). | 1892 | (Motorola? industry standard). |
1893 | If your board uses an external PHY connected to FEC, enable this. | 1893 | If your board uses an external PHY connected to FEC, enable this. |
1894 | If not sure, enable. | 1894 | If not sure, enable. |
1895 | If compiled as module, it will be called 'fec_mpc52xx_phy.ko'. | 1895 | If compiled as module, it will be called fec_mpc52xx_phy. |
1896 | 1896 | ||
1897 | config NE_H8300 | 1897 | config NE_H8300 |
1898 | tristate "NE2000 compatible support for H8/300" | 1898 | tristate "NE2000 compatible support for H8/300" |
diff --git a/drivers/net/appletalk/ltpc.c b/drivers/net/appletalk/ltpc.c index 78cc71469136..b642647170be 100644 --- a/drivers/net/appletalk/ltpc.c +++ b/drivers/net/appletalk/ltpc.c | |||
@@ -1220,7 +1220,7 @@ static int __init ltpc_setup(char *str) | |||
1220 | if (ints[0] > 2) { | 1220 | if (ints[0] > 2) { |
1221 | dma = ints[3]; | 1221 | dma = ints[3]; |
1222 | } | 1222 | } |
1223 | /* ignore any other paramters */ | 1223 | /* ignore any other parameters */ |
1224 | } | 1224 | } |
1225 | return 1; | 1225 | return 1; |
1226 | } | 1226 | } |
diff --git a/drivers/net/arm/ixp4xx_eth.c b/drivers/net/arm/ixp4xx_eth.c index a740053d3af3..b6d188115caf 100644 --- a/drivers/net/arm/ixp4xx_eth.c +++ b/drivers/net/arm/ixp4xx_eth.c | |||
@@ -456,7 +456,8 @@ static inline void queue_put_desc(unsigned int queue, u32 phys, | |||
456 | debug_desc(phys, desc); | 456 | debug_desc(phys, desc); |
457 | BUG_ON(phys & 0x1F); | 457 | BUG_ON(phys & 0x1F); |
458 | qmgr_put_entry(queue, phys); | 458 | qmgr_put_entry(queue, phys); |
459 | BUG_ON(qmgr_stat_overflow(queue)); | 459 | /* Don't check for queue overflow here, we've allocated sufficient |
460 | length and queues >= 32 don't support this check anyway. */ | ||
460 | } | 461 | } |
461 | 462 | ||
462 | 463 | ||
@@ -512,8 +513,8 @@ static int eth_poll(struct napi_struct *napi, int budget) | |||
512 | #endif | 513 | #endif |
513 | napi_complete(napi); | 514 | napi_complete(napi); |
514 | qmgr_enable_irq(rxq); | 515 | qmgr_enable_irq(rxq); |
515 | if (!qmgr_stat_empty(rxq) && | 516 | if (!qmgr_stat_below_low_watermark(rxq) && |
516 | napi_reschedule(napi)) { | 517 | napi_reschedule(napi)) { /* not empty again */ |
517 | #if DEBUG_RX | 518 | #if DEBUG_RX |
518 | printk(KERN_DEBUG "%s: eth_poll" | 519 | printk(KERN_DEBUG "%s: eth_poll" |
519 | " napi_reschedule successed\n", | 520 | " napi_reschedule successed\n", |
@@ -630,9 +631,9 @@ static void eth_txdone_irq(void *unused) | |||
630 | port->tx_buff_tab[n_desc] = NULL; | 631 | port->tx_buff_tab[n_desc] = NULL; |
631 | } | 632 | } |
632 | 633 | ||
633 | start = qmgr_stat_empty(port->plat->txreadyq); | 634 | start = qmgr_stat_below_low_watermark(port->plat->txreadyq); |
634 | queue_put_desc(port->plat->txreadyq, phys, desc); | 635 | queue_put_desc(port->plat->txreadyq, phys, desc); |
635 | if (start) { | 636 | if (start) { /* TX-ready queue was empty */ |
636 | #if DEBUG_TX | 637 | #if DEBUG_TX |
637 | printk(KERN_DEBUG "%s: eth_txdone_irq xmit ready\n", | 638 | printk(KERN_DEBUG "%s: eth_txdone_irq xmit ready\n", |
638 | port->netdev->name); | 639 | port->netdev->name); |
@@ -708,13 +709,14 @@ static int eth_xmit(struct sk_buff *skb, struct net_device *dev) | |||
708 | queue_put_desc(TX_QUEUE(port->id), tx_desc_phys(port, n), desc); | 709 | queue_put_desc(TX_QUEUE(port->id), tx_desc_phys(port, n), desc); |
709 | dev->trans_start = jiffies; | 710 | dev->trans_start = jiffies; |
710 | 711 | ||
711 | if (qmgr_stat_empty(txreadyq)) { | 712 | if (qmgr_stat_below_low_watermark(txreadyq)) { /* empty */ |
712 | #if DEBUG_TX | 713 | #if DEBUG_TX |
713 | printk(KERN_DEBUG "%s: eth_xmit queue full\n", dev->name); | 714 | printk(KERN_DEBUG "%s: eth_xmit queue full\n", dev->name); |
714 | #endif | 715 | #endif |
715 | netif_stop_queue(dev); | 716 | netif_stop_queue(dev); |
716 | /* we could miss TX ready interrupt */ | 717 | /* we could miss TX ready interrupt */ |
717 | if (!qmgr_stat_empty(txreadyq)) { | 718 | /* really empty in fact */ |
719 | if (!qmgr_stat_below_low_watermark(txreadyq)) { | ||
718 | #if DEBUG_TX | 720 | #if DEBUG_TX |
719 | printk(KERN_DEBUG "%s: eth_xmit ready again\n", | 721 | printk(KERN_DEBUG "%s: eth_xmit ready again\n", |
720 | dev->name); | 722 | dev->name); |
@@ -814,29 +816,29 @@ static int request_queues(struct port *port) | |||
814 | int err; | 816 | int err; |
815 | 817 | ||
816 | err = qmgr_request_queue(RXFREE_QUEUE(port->id), RX_DESCS, 0, 0, | 818 | err = qmgr_request_queue(RXFREE_QUEUE(port->id), RX_DESCS, 0, 0, |
817 | "%s:RX-free", port->netdev->name); | 819 | "%s:RX-free", port->netdev->name); |
818 | if (err) | 820 | if (err) |
819 | return err; | 821 | return err; |
820 | 822 | ||
821 | err = qmgr_request_queue(port->plat->rxq, RX_DESCS, 0, 0, | 823 | err = qmgr_request_queue(port->plat->rxq, RX_DESCS, 0, 0, |
822 | "%s:RX", port->netdev->name); | 824 | "%s:RX", port->netdev->name); |
823 | if (err) | 825 | if (err) |
824 | goto rel_rxfree; | 826 | goto rel_rxfree; |
825 | 827 | ||
826 | err = qmgr_request_queue(TX_QUEUE(port->id), TX_DESCS, 0, 0, | 828 | err = qmgr_request_queue(TX_QUEUE(port->id), TX_DESCS, 0, 0, |
827 | "%s:TX", port->netdev->name); | 829 | "%s:TX", port->netdev->name); |
828 | if (err) | 830 | if (err) |
829 | goto rel_rx; | 831 | goto rel_rx; |
830 | 832 | ||
831 | err = qmgr_request_queue(port->plat->txreadyq, TX_DESCS, 0, 0, | 833 | err = qmgr_request_queue(port->plat->txreadyq, TX_DESCS, 0, 0, |
832 | "%s:TX-ready", port->netdev->name); | 834 | "%s:TX-ready", port->netdev->name); |
833 | if (err) | 835 | if (err) |
834 | goto rel_tx; | 836 | goto rel_tx; |
835 | 837 | ||
836 | /* TX-done queue handles skbs sent out by the NPEs */ | 838 | /* TX-done queue handles skbs sent out by the NPEs */ |
837 | if (!ports_open) { | 839 | if (!ports_open) { |
838 | err = qmgr_request_queue(TXDONE_QUEUE, TXDONE_QUEUE_LEN, 0, 0, | 840 | err = qmgr_request_queue(TXDONE_QUEUE, TXDONE_QUEUE_LEN, 0, 0, |
839 | "%s:TX-done", DRV_NAME); | 841 | "%s:TX-done", DRV_NAME); |
840 | if (err) | 842 | if (err) |
841 | goto rel_txready; | 843 | goto rel_txready; |
842 | } | 844 | } |
diff --git a/drivers/net/b44.h b/drivers/net/b44.h index e678498de6db..d24158e7f309 100644 --- a/drivers/net/b44.h +++ b/drivers/net/b44.h | |||
@@ -97,7 +97,7 @@ | |||
97 | #define B44_DMARX_STAT 0x021CUL /* DMA RX Current Active Desc. + Status */ | 97 | #define B44_DMARX_STAT 0x021CUL /* DMA RX Current Active Desc. + Status */ |
98 | #define DMARX_STAT_CDMASK 0x00000fff /* Current Descriptor Mask */ | 98 | #define DMARX_STAT_CDMASK 0x00000fff /* Current Descriptor Mask */ |
99 | #define DMARX_STAT_SMASK 0x0000f000 /* State Mask */ | 99 | #define DMARX_STAT_SMASK 0x0000f000 /* State Mask */ |
100 | #define DMARX_STAT_SDISABLED 0x00000000 /* State Disbaled */ | 100 | #define DMARX_STAT_SDISABLED 0x00000000 /* State Disabled */ |
101 | #define DMARX_STAT_SACTIVE 0x00001000 /* State Active */ | 101 | #define DMARX_STAT_SACTIVE 0x00001000 /* State Active */ |
102 | #define DMARX_STAT_SIDLE 0x00002000 /* State Idle Wait */ | 102 | #define DMARX_STAT_SIDLE 0x00002000 /* State Idle Wait */ |
103 | #define DMARX_STAT_SSTOPPED 0x00003000 /* State Stopped */ | 103 | #define DMARX_STAT_SSTOPPED 0x00003000 /* State Stopped */ |
diff --git a/drivers/net/cnic.c b/drivers/net/cnic.c index 8d740376bbd2..44f77eb1180f 100644 --- a/drivers/net/cnic.c +++ b/drivers/net/cnic.c | |||
@@ -25,6 +25,8 @@ | |||
25 | #include <linux/delay.h> | 25 | #include <linux/delay.h> |
26 | #include <linux/ethtool.h> | 26 | #include <linux/ethtool.h> |
27 | #include <linux/if_vlan.h> | 27 | #include <linux/if_vlan.h> |
28 | #include <linux/module.h> | ||
29 | |||
28 | #if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE) | 30 | #if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE) |
29 | #define BCM_VLAN 1 | 31 | #define BCM_VLAN 1 |
30 | #endif | 32 | #endif |
@@ -1454,6 +1456,7 @@ static inline u16 cnic_get_vlan(struct net_device *dev, | |||
1454 | static int cnic_get_v4_route(struct sockaddr_in *dst_addr, | 1456 | static int cnic_get_v4_route(struct sockaddr_in *dst_addr, |
1455 | struct dst_entry **dst) | 1457 | struct dst_entry **dst) |
1456 | { | 1458 | { |
1459 | #if defined(CONFIG_INET) | ||
1457 | struct flowi fl; | 1460 | struct flowi fl; |
1458 | int err; | 1461 | int err; |
1459 | struct rtable *rt; | 1462 | struct rtable *rt; |
@@ -1465,12 +1468,15 @@ static int cnic_get_v4_route(struct sockaddr_in *dst_addr, | |||
1465 | if (!err) | 1468 | if (!err) |
1466 | *dst = &rt->u.dst; | 1469 | *dst = &rt->u.dst; |
1467 | return err; | 1470 | return err; |
1471 | #else | ||
1472 | return -ENETUNREACH; | ||
1473 | #endif | ||
1468 | } | 1474 | } |
1469 | 1475 | ||
1470 | static int cnic_get_v6_route(struct sockaddr_in6 *dst_addr, | 1476 | static int cnic_get_v6_route(struct sockaddr_in6 *dst_addr, |
1471 | struct dst_entry **dst) | 1477 | struct dst_entry **dst) |
1472 | { | 1478 | { |
1473 | #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) | 1479 | #if defined(CONFIG_IPV6) || (defined(CONFIG_IPV6_MODULE) && defined(MODULE)) |
1474 | struct flowi fl; | 1480 | struct flowi fl; |
1475 | 1481 | ||
1476 | memset(&fl, 0, sizeof(fl)); | 1482 | memset(&fl, 0, sizeof(fl)); |
@@ -1550,7 +1556,7 @@ static int cnic_get_route(struct cnic_sock *csk, struct cnic_sockaddr *saddr) | |||
1550 | clear_bit(SK_F_IPV6, &csk->flags); | 1556 | clear_bit(SK_F_IPV6, &csk->flags); |
1551 | 1557 | ||
1552 | if (is_v6) { | 1558 | if (is_v6) { |
1553 | #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) | 1559 | #if defined(CONFIG_IPV6) || (defined(CONFIG_IPV6_MODULE) && defined(MODULE)) |
1554 | set_bit(SK_F_IPV6, &csk->flags); | 1560 | set_bit(SK_F_IPV6, &csk->flags); |
1555 | err = cnic_get_v6_route(&saddr->remote.v6, &dst); | 1561 | err = cnic_get_v6_route(&saddr->remote.v6, &dst); |
1556 | if (err) | 1562 | if (err) |
diff --git a/drivers/net/e100.c b/drivers/net/e100.c index 0f9ee1348552..af5364f49550 100644 --- a/drivers/net/e100.c +++ b/drivers/net/e100.c | |||
@@ -2785,7 +2785,7 @@ static int e100_resume(struct pci_dev *pdev) | |||
2785 | /* ack any pending wake events, disable PME */ | 2785 | /* ack any pending wake events, disable PME */ |
2786 | pci_enable_wake(pdev, 0, 0); | 2786 | pci_enable_wake(pdev, 0, 0); |
2787 | 2787 | ||
2788 | /* disbale reverse auto-negotiation */ | 2788 | /* disable reverse auto-negotiation */ |
2789 | if (nic->phy == phy_82552_v) { | 2789 | if (nic->phy == phy_82552_v) { |
2790 | u16 smartspeed = mdio_read(netdev, nic->mii.phy_id, | 2790 | u16 smartspeed = mdio_read(netdev, nic->mii.phy_id, |
2791 | E100_82552_SMARTSPEED); | 2791 | E100_82552_SMARTSPEED); |
diff --git a/drivers/net/e1000e/e1000.h b/drivers/net/e1000e/e1000.h index f37360aa12a8..44f0bf23dafc 100644 --- a/drivers/net/e1000e/e1000.h +++ b/drivers/net/e1000e/e1000.h | |||
@@ -62,7 +62,7 @@ struct e1000_info; | |||
62 | e_printk(KERN_NOTICE, adapter, format, ## arg) | 62 | e_printk(KERN_NOTICE, adapter, format, ## arg) |
63 | 63 | ||
64 | 64 | ||
65 | /* Interrupt modes, as used by the IntMode paramter */ | 65 | /* Interrupt modes, as used by the IntMode parameter */ |
66 | #define E1000E_INT_MODE_LEGACY 0 | 66 | #define E1000E_INT_MODE_LEGACY 0 |
67 | #define E1000E_INT_MODE_MSI 1 | 67 | #define E1000E_INT_MODE_MSI 1 |
68 | #define E1000E_INT_MODE_MSIX 2 | 68 | #define E1000E_INT_MODE_MSIX 2 |
diff --git a/drivers/net/ehea/ehea.h b/drivers/net/ehea/ehea.h index 16a41389575a..78952f8324e2 100644 --- a/drivers/net/ehea/ehea.h +++ b/drivers/net/ehea/ehea.h | |||
@@ -268,7 +268,7 @@ struct ehea_qp_init_attr { | |||
268 | }; | 268 | }; |
269 | 269 | ||
270 | /* | 270 | /* |
271 | * Event Queue attributes, passed as paramter | 271 | * Event Queue attributes, passed as parameter |
272 | */ | 272 | */ |
273 | struct ehea_eq_attr { | 273 | struct ehea_eq_attr { |
274 | u32 type; | 274 | u32 type; |
diff --git a/drivers/net/igbvf/igbvf.h b/drivers/net/igbvf/igbvf.h index 4bff35e46871..d488733893a6 100644 --- a/drivers/net/igbvf/igbvf.h +++ b/drivers/net/igbvf/igbvf.h | |||
@@ -45,7 +45,7 @@ struct igbvf_adapter; | |||
45 | /* Interrupt defines */ | 45 | /* Interrupt defines */ |
46 | #define IGBVF_START_ITR 648 /* ~6000 ints/sec */ | 46 | #define IGBVF_START_ITR 648 /* ~6000 ints/sec */ |
47 | 47 | ||
48 | /* Interrupt modes, as used by the IntMode paramter */ | 48 | /* Interrupt modes, as used by the IntMode parameter */ |
49 | #define IGBVF_INT_MODE_LEGACY 0 | 49 | #define IGBVF_INT_MODE_LEGACY 0 |
50 | #define IGBVF_INT_MODE_MSI 1 | 50 | #define IGBVF_INT_MODE_MSI 1 |
51 | #define IGBVF_INT_MODE_MSIX 2 | 51 | #define IGBVF_INT_MODE_MSIX 2 |
diff --git a/drivers/net/ipg.h b/drivers/net/ipg.h index dd9318f19497..dfc2541bb556 100644 --- a/drivers/net/ipg.h +++ b/drivers/net/ipg.h | |||
@@ -514,7 +514,7 @@ enum ipg_regs { | |||
514 | #define IPG_DMALIST_ALIGN_PAD 0x07 | 514 | #define IPG_DMALIST_ALIGN_PAD 0x07 |
515 | #define IPG_MULTICAST_HASHTABLE_SIZE 0x40 | 515 | #define IPG_MULTICAST_HASHTABLE_SIZE 0x40 |
516 | 516 | ||
517 | /* Number of miliseconds to wait after issuing a software reset. | 517 | /* Number of milliseconds to wait after issuing a software reset. |
518 | * 0x05 <= IPG_AC_RESETWAIT to account for proper 10Mbps operation. | 518 | * 0x05 <= IPG_AC_RESETWAIT to account for proper 10Mbps operation. |
519 | */ | 519 | */ |
520 | #define IPG_AC_RESETWAIT 0x05 | 520 | #define IPG_AC_RESETWAIT 0x05 |
diff --git a/drivers/net/mlx4/en_netdev.c b/drivers/net/mlx4/en_netdev.c index 7bcc49de1637..e8eeef0c9c9a 100644 --- a/drivers/net/mlx4/en_netdev.c +++ b/drivers/net/mlx4/en_netdev.c | |||
@@ -371,7 +371,7 @@ static void mlx4_en_set_default_moderation(struct mlx4_en_priv *priv) | |||
371 | int i; | 371 | int i; |
372 | 372 | ||
373 | /* If we haven't received a specific coalescing setting | 373 | /* If we haven't received a specific coalescing setting |
374 | * (module param), we set the moderation paramters as follows: | 374 | * (module param), we set the moderation parameters as follows: |
375 | * - moder_cnt is set to the number of mtu sized packets to | 375 | * - moder_cnt is set to the number of mtu sized packets to |
376 | * satisfy our coelsing target. | 376 | * satisfy our coelsing target. |
377 | * - moder_time is set to a fixed value. | 377 | * - moder_time is set to a fixed value. |
diff --git a/drivers/net/niu.h b/drivers/net/niu.h index 8754e44cadae..3bd0b5933d59 100644 --- a/drivers/net/niu.h +++ b/drivers/net/niu.h | |||
@@ -3242,8 +3242,8 @@ struct niu { | |||
3242 | struct niu_parent *parent; | 3242 | struct niu_parent *parent; |
3243 | 3243 | ||
3244 | u32 flags; | 3244 | u32 flags; |
3245 | #define NIU_FLAGS_HOTPLUG_PHY_PRESENT 0x02000000 /* Removebale PHY detected*/ | 3245 | #define NIU_FLAGS_HOTPLUG_PHY_PRESENT 0x02000000 /* Removeable PHY detected*/ |
3246 | #define NIU_FLAGS_HOTPLUG_PHY 0x01000000 /* Removebale PHY */ | 3246 | #define NIU_FLAGS_HOTPLUG_PHY 0x01000000 /* Removeable PHY */ |
3247 | #define NIU_FLAGS_VPD_VALID 0x00800000 /* VPD has valid version */ | 3247 | #define NIU_FLAGS_VPD_VALID 0x00800000 /* VPD has valid version */ |
3248 | #define NIU_FLAGS_MSIX 0x00400000 /* MSI-X in use */ | 3248 | #define NIU_FLAGS_MSIX 0x00400000 /* MSI-X in use */ |
3249 | #define NIU_FLAGS_MCAST 0x00200000 /* multicast filter enabled */ | 3249 | #define NIU_FLAGS_MCAST 0x00200000 /* multicast filter enabled */ |
diff --git a/drivers/net/qlge/qlge_main.c b/drivers/net/qlge/qlge_main.c index c92ced247947..1fd5ecb24425 100644 --- a/drivers/net/qlge/qlge_main.c +++ b/drivers/net/qlge/qlge_main.c | |||
@@ -3174,7 +3174,7 @@ static int ql_adapter_reset(struct ql_adapter *qdev) | |||
3174 | 3174 | ||
3175 | if (value & RST_FO_FR) { | 3175 | if (value & RST_FO_FR) { |
3176 | QPRINTK(qdev, IFDOWN, ERR, | 3176 | QPRINTK(qdev, IFDOWN, ERR, |
3177 | "ETIMEOUT!!! errored out of resetting the chip!\n"); | 3177 | "ETIMEDOUT!!! errored out of resetting the chip!\n"); |
3178 | status = -ETIMEDOUT; | 3178 | status = -ETIMEDOUT; |
3179 | } | 3179 | } |
3180 | 3180 | ||
diff --git a/drivers/net/qlge/qlge_mpi.c b/drivers/net/qlge/qlge_mpi.c index 9f81b797f10b..ac9493f6c1a1 100644 --- a/drivers/net/qlge/qlge_mpi.c +++ b/drivers/net/qlge/qlge_mpi.c | |||
@@ -141,7 +141,7 @@ end: | |||
141 | /* We are being asked by firmware to accept | 141 | /* We are being asked by firmware to accept |
142 | * a change to the port. This is only | 142 | * a change to the port. This is only |
143 | * a change to max frame sizes (Tx/Rx), pause | 143 | * a change to max frame sizes (Tx/Rx), pause |
144 | * paramters, or loopback mode. We wake up a worker | 144 | * parameters, or loopback mode. We wake up a worker |
145 | * to handler processing this since a mailbox command | 145 | * to handler processing this since a mailbox command |
146 | * will need to be sent to ACK the request. | 146 | * will need to be sent to ACK the request. |
147 | */ | 147 | */ |
@@ -371,7 +371,7 @@ static int ql_mpi_handler(struct ql_adapter *qdev, struct mbox_params *mbcp) | |||
371 | /* We are being asked by firmware to accept | 371 | /* We are being asked by firmware to accept |
372 | * a change to the port. This is only | 372 | * a change to the port. This is only |
373 | * a change to max frame sizes (Tx/Rx), pause | 373 | * a change to max frame sizes (Tx/Rx), pause |
374 | * paramters, or loopback mode. | 374 | * parameters, or loopback mode. |
375 | */ | 375 | */ |
376 | case AEN_IDC_REQ: | 376 | case AEN_IDC_REQ: |
377 | status = ql_idc_req_aen(qdev); | 377 | status = ql_idc_req_aen(qdev); |
@@ -380,7 +380,7 @@ static int ql_mpi_handler(struct ql_adapter *qdev, struct mbox_params *mbcp) | |||
380 | /* Process and inbound IDC event. | 380 | /* Process and inbound IDC event. |
381 | * This will happen when we're trying to | 381 | * This will happen when we're trying to |
382 | * change tx/rx max frame size, change pause | 382 | * change tx/rx max frame size, change pause |
383 | * paramters or loopback mode. | 383 | * parameters or loopback mode. |
384 | */ | 384 | */ |
385 | case AEN_IDC_CMPLT: | 385 | case AEN_IDC_CMPLT: |
386 | case AEN_IDC_EXT: | 386 | case AEN_IDC_EXT: |
diff --git a/drivers/net/skfp/h/smt.h b/drivers/net/skfp/h/smt.h index 1ff589988d10..2976757a36fb 100644 --- a/drivers/net/skfp/h/smt.h +++ b/drivers/net/skfp/h/smt.h | |||
@@ -413,7 +413,7 @@ struct smt_p_reason { | |||
413 | #define SMT_RDF_SUCCESS 0x00000003 /* success (PMF) */ | 413 | #define SMT_RDF_SUCCESS 0x00000003 /* success (PMF) */ |
414 | #define SMT_RDF_BADSET 0x00000004 /* bad set count (PMF) */ | 414 | #define SMT_RDF_BADSET 0x00000004 /* bad set count (PMF) */ |
415 | #define SMT_RDF_ILLEGAL 0x00000005 /* read only (PMF) */ | 415 | #define SMT_RDF_ILLEGAL 0x00000005 /* read only (PMF) */ |
416 | #define SMT_RDF_NOPARAM 0x6 /* paramter not supported (PMF) */ | 416 | #define SMT_RDF_NOPARAM 0x6 /* parameter not supported (PMF) */ |
417 | #define SMT_RDF_RANGE 0x8 /* out of range */ | 417 | #define SMT_RDF_RANGE 0x8 /* out of range */ |
418 | #define SMT_RDF_AUTHOR 0x9 /* not autohorized */ | 418 | #define SMT_RDF_AUTHOR 0x9 /* not autohorized */ |
419 | #define SMT_RDF_LENGTH 0x0a /* length error */ | 419 | #define SMT_RDF_LENGTH 0x0a /* length error */ |
diff --git a/drivers/net/smc91x.h b/drivers/net/smc91x.h index 329f890e2903..f1f773b17fe1 100644 --- a/drivers/net/smc91x.h +++ b/drivers/net/smc91x.h | |||
@@ -45,7 +45,8 @@ | |||
45 | defined(CONFIG_MACH_ZYLONITE) ||\ | 45 | defined(CONFIG_MACH_ZYLONITE) ||\ |
46 | defined(CONFIG_MACH_LITTLETON) ||\ | 46 | defined(CONFIG_MACH_LITTLETON) ||\ |
47 | defined(CONFIG_MACH_ZYLONITE2) ||\ | 47 | defined(CONFIG_MACH_ZYLONITE2) ||\ |
48 | defined(CONFIG_ARCH_VIPER) | 48 | defined(CONFIG_ARCH_VIPER) ||\ |
49 | defined(CONFIG_MACH_STARGATE2) | ||
49 | 50 | ||
50 | #include <asm/mach-types.h> | 51 | #include <asm/mach-types.h> |
51 | 52 | ||
@@ -73,7 +74,7 @@ | |||
73 | /* We actually can't write halfwords properly if not word aligned */ | 74 | /* We actually can't write halfwords properly if not word aligned */ |
74 | static inline void SMC_outw(u16 val, void __iomem *ioaddr, int reg) | 75 | static inline void SMC_outw(u16 val, void __iomem *ioaddr, int reg) |
75 | { | 76 | { |
76 | if (machine_is_mainstone() && reg & 2) { | 77 | if ((machine_is_mainstone() || machine_is_stargate2()) && reg & 2) { |
77 | unsigned int v = val << 16; | 78 | unsigned int v = val << 16; |
78 | v |= readl(ioaddr + (reg & ~2)) & 0xffff; | 79 | v |= readl(ioaddr + (reg & ~2)) & 0xffff; |
79 | writel(v, ioaddr + (reg & ~2)); | 80 | writel(v, ioaddr + (reg & ~2)); |
diff --git a/drivers/net/tokenring/3c359.c b/drivers/net/tokenring/3c359.c index 534c0f38483c..0337b9d673f4 100644 --- a/drivers/net/tokenring/3c359.c +++ b/drivers/net/tokenring/3c359.c | |||
@@ -79,7 +79,7 @@ MODULE_AUTHOR("Mike Phillips <mikep@linuxtr.net>") ; | |||
79 | MODULE_DESCRIPTION("3Com 3C359 Velocity XL Token Ring Adapter Driver \n") ; | 79 | MODULE_DESCRIPTION("3Com 3C359 Velocity XL Token Ring Adapter Driver \n") ; |
80 | MODULE_FIRMWARE(FW_NAME); | 80 | MODULE_FIRMWARE(FW_NAME); |
81 | 81 | ||
82 | /* Module paramters */ | 82 | /* Module parameters */ |
83 | 83 | ||
84 | /* Ring Speed 0,4,16 | 84 | /* Ring Speed 0,4,16 |
85 | * 0 = Autosense | 85 | * 0 = Autosense |
diff --git a/drivers/net/tokenring/lanstreamer.c b/drivers/net/tokenring/lanstreamer.c index 2e70ee8f1459..46a2cc92d979 100644 --- a/drivers/net/tokenring/lanstreamer.c +++ b/drivers/net/tokenring/lanstreamer.c | |||
@@ -169,7 +169,7 @@ static char *open_min_error[] = { | |||
169 | "Monitor Contention failer for RPL", "FDX Protocol Error" | 169 | "Monitor Contention failer for RPL", "FDX Protocol Error" |
170 | }; | 170 | }; |
171 | 171 | ||
172 | /* Module paramters */ | 172 | /* Module parameters */ |
173 | 173 | ||
174 | /* Ring Speed 0,4,16 | 174 | /* Ring Speed 0,4,16 |
175 | * 0 = Autosense | 175 | * 0 = Autosense |
diff --git a/drivers/net/tokenring/olympic.c b/drivers/net/tokenring/olympic.c index d068a9d36883..2d819fc85589 100644 --- a/drivers/net/tokenring/olympic.c +++ b/drivers/net/tokenring/olympic.c | |||
@@ -132,7 +132,7 @@ static char *open_min_error[] = {"No error", "Function Failure", "Signal Lost", | |||
132 | "Reserved", "Reserved", "No Monitor Detected for RPL", | 132 | "Reserved", "Reserved", "No Monitor Detected for RPL", |
133 | "Monitor Contention failer for RPL", "FDX Protocol Error"}; | 133 | "Monitor Contention failer for RPL", "FDX Protocol Error"}; |
134 | 134 | ||
135 | /* Module paramters */ | 135 | /* Module parameters */ |
136 | 136 | ||
137 | MODULE_AUTHOR("Mike Phillips <mikep@linuxtr.net>") ; | 137 | MODULE_AUTHOR("Mike Phillips <mikep@linuxtr.net>") ; |
138 | MODULE_DESCRIPTION("Olympic PCI/Cardbus Chipset Driver") ; | 138 | MODULE_DESCRIPTION("Olympic PCI/Cardbus Chipset Driver") ; |
diff --git a/drivers/net/ucc_geth_ethtool.c b/drivers/net/ucc_geth_ethtool.c index 6fcb500257bc..61fe80dda3e3 100644 --- a/drivers/net/ucc_geth_ethtool.c +++ b/drivers/net/ucc_geth_ethtool.c | |||
@@ -7,7 +7,7 @@ | |||
7 | * | 7 | * |
8 | * Limitation: | 8 | * Limitation: |
9 | * Can only get/set setttings of the first queue. | 9 | * Can only get/set setttings of the first queue. |
10 | * Need to re-open the interface manually after changing some paramters. | 10 | * Need to re-open the interface manually after changing some parameters. |
11 | * | 11 | * |
12 | * This program is free software; you can redistribute it and/or modify it | 12 | * This program is free software; you can redistribute it and/or modify it |
13 | * under the terms of the GNU General Public License as published by the | 13 | * under the terms of the GNU General Public License as published by the |
diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c index f3a2fce6166c..47f68cfa7e21 100644 --- a/drivers/net/usb/usbnet.c +++ b/drivers/net/usb/usbnet.c | |||
@@ -398,7 +398,7 @@ static void rx_complete (struct urb *urb) | |||
398 | 398 | ||
399 | /* stalls need manual reset. this is rare ... except that | 399 | /* stalls need manual reset. this is rare ... except that |
400 | * when going through USB 2.0 TTs, unplug appears this way. | 400 | * when going through USB 2.0 TTs, unplug appears this way. |
401 | * we avoid the highspeed version of the ETIMEOUT/EILSEQ | 401 | * we avoid the highspeed version of the ETIMEDOUT/EILSEQ |
402 | * storm, recovering as needed. | 402 | * storm, recovering as needed. |
403 | */ | 403 | */ |
404 | case -EPIPE: | 404 | case -EPIPE: |
diff --git a/drivers/net/wan/ixp4xx_hss.c b/drivers/net/wan/ixp4xx_hss.c index 765a7f5d6aa4..a6dc317083d3 100644 --- a/drivers/net/wan/ixp4xx_hss.c +++ b/drivers/net/wan/ixp4xx_hss.c | |||
@@ -579,7 +579,8 @@ static inline void queue_put_desc(unsigned int queue, u32 phys, | |||
579 | debug_desc(phys, desc); | 579 | debug_desc(phys, desc); |
580 | BUG_ON(phys & 0x1F); | 580 | BUG_ON(phys & 0x1F); |
581 | qmgr_put_entry(queue, phys); | 581 | qmgr_put_entry(queue, phys); |
582 | BUG_ON(qmgr_stat_overflow(queue)); | 582 | /* Don't check for queue overflow here, we've allocated sufficient |
583 | length and queues >= 32 don't support this check anyway. */ | ||
583 | } | 584 | } |
584 | 585 | ||
585 | 586 | ||
@@ -789,10 +790,10 @@ static void hss_hdlc_txdone_irq(void *pdev) | |||
789 | free_buffer_irq(port->tx_buff_tab[n_desc]); | 790 | free_buffer_irq(port->tx_buff_tab[n_desc]); |
790 | port->tx_buff_tab[n_desc] = NULL; | 791 | port->tx_buff_tab[n_desc] = NULL; |
791 | 792 | ||
792 | start = qmgr_stat_empty(port->plat->txreadyq); | 793 | start = qmgr_stat_below_low_watermark(port->plat->txreadyq); |
793 | queue_put_desc(port->plat->txreadyq, | 794 | queue_put_desc(port->plat->txreadyq, |
794 | tx_desc_phys(port, n_desc), desc); | 795 | tx_desc_phys(port, n_desc), desc); |
795 | if (start) { | 796 | if (start) { /* TX-ready queue was empty */ |
796 | #if DEBUG_TX | 797 | #if DEBUG_TX |
797 | printk(KERN_DEBUG "%s: hss_hdlc_txdone_irq xmit" | 798 | printk(KERN_DEBUG "%s: hss_hdlc_txdone_irq xmit" |
798 | " ready\n", dev->name); | 799 | " ready\n", dev->name); |
@@ -867,13 +868,13 @@ static int hss_hdlc_xmit(struct sk_buff *skb, struct net_device *dev) | |||
867 | queue_put_desc(queue_ids[port->id].tx, tx_desc_phys(port, n), desc); | 868 | queue_put_desc(queue_ids[port->id].tx, tx_desc_phys(port, n), desc); |
868 | dev->trans_start = jiffies; | 869 | dev->trans_start = jiffies; |
869 | 870 | ||
870 | if (qmgr_stat_empty(txreadyq)) { | 871 | if (qmgr_stat_below_low_watermark(txreadyq)) { /* empty */ |
871 | #if DEBUG_TX | 872 | #if DEBUG_TX |
872 | printk(KERN_DEBUG "%s: hss_hdlc_xmit queue full\n", dev->name); | 873 | printk(KERN_DEBUG "%s: hss_hdlc_xmit queue full\n", dev->name); |
873 | #endif | 874 | #endif |
874 | netif_stop_queue(dev); | 875 | netif_stop_queue(dev); |
875 | /* we could miss TX ready interrupt */ | 876 | /* we could miss TX ready interrupt */ |
876 | if (!qmgr_stat_empty(txreadyq)) { | 877 | if (!qmgr_stat_below_low_watermark(txreadyq)) { |
877 | #if DEBUG_TX | 878 | #if DEBUG_TX |
878 | printk(KERN_DEBUG "%s: hss_hdlc_xmit ready again\n", | 879 | printk(KERN_DEBUG "%s: hss_hdlc_xmit ready again\n", |
879 | dev->name); | 880 | dev->name); |
diff --git a/drivers/net/wireless/Kconfig b/drivers/net/wireless/Kconfig index 3d94e7dfea69..3359497012aa 100644 --- a/drivers/net/wireless/Kconfig +++ b/drivers/net/wireless/Kconfig | |||
@@ -310,7 +310,7 @@ config PRISM54 | |||
310 | If you want to compile the driver as a module ( = code which can be | 310 | If you want to compile the driver as a module ( = code which can be |
311 | inserted in and removed from the running kernel whenever you want), | 311 | inserted in and removed from the running kernel whenever you want), |
312 | say M here and read <file:Documentation/kbuild/modules.txt>. | 312 | say M here and read <file:Documentation/kbuild/modules.txt>. |
313 | The module will be called prism54.ko. | 313 | The module will be called prism54. |
314 | 314 | ||
315 | config USB_ZD1201 | 315 | config USB_ZD1201 |
316 | tristate "USB ZD1201 based Wireless device support" | 316 | tristate "USB ZD1201 based Wireless device support" |
diff --git a/drivers/net/wireless/hostap/Kconfig b/drivers/net/wireless/hostap/Kconfig index 932d207bce23..c15db2293515 100644 --- a/drivers/net/wireless/hostap/Kconfig +++ b/drivers/net/wireless/hostap/Kconfig | |||
@@ -29,7 +29,7 @@ config HOSTAP | |||
29 | PLX/PCI/CS version of the driver to actually use the driver. | 29 | PLX/PCI/CS version of the driver to actually use the driver. |
30 | 30 | ||
31 | The driver can be compiled as a module and it will be called | 31 | The driver can be compiled as a module and it will be called |
32 | "hostap.ko". | 32 | hostap. |
33 | 33 | ||
34 | config HOSTAP_FIRMWARE | 34 | config HOSTAP_FIRMWARE |
35 | bool "Support downloading firmware images with Host AP driver" | 35 | bool "Support downloading firmware images with Host AP driver" |
@@ -68,7 +68,7 @@ config HOSTAP_PLX | |||
68 | driver. | 68 | driver. |
69 | 69 | ||
70 | The driver can be compiled as a module and will be named | 70 | The driver can be compiled as a module and will be named |
71 | "hostap_plx.ko". | 71 | hostap_plx. |
72 | 72 | ||
73 | config HOSTAP_PCI | 73 | config HOSTAP_PCI |
74 | tristate "Host AP driver for Prism2.5 PCI adaptors" | 74 | tristate "Host AP driver for Prism2.5 PCI adaptors" |
@@ -81,7 +81,7 @@ config HOSTAP_PCI | |||
81 | driver. | 81 | driver. |
82 | 82 | ||
83 | The driver can be compiled as a module and will be named | 83 | The driver can be compiled as a module and will be named |
84 | "hostap_pci.ko". | 84 | hostap_pci. |
85 | 85 | ||
86 | config HOSTAP_CS | 86 | config HOSTAP_CS |
87 | tristate "Host AP driver for Prism2/2.5/3 PC Cards" | 87 | tristate "Host AP driver for Prism2/2.5/3 PC Cards" |
@@ -94,4 +94,4 @@ config HOSTAP_CS | |||
94 | driver. | 94 | driver. |
95 | 95 | ||
96 | The driver can be compiled as a module and will be named | 96 | The driver can be compiled as a module and will be named |
97 | "hostap_cs.ko". | 97 | hostap_cs. |
diff --git a/drivers/net/wireless/iwlwifi/Kconfig b/drivers/net/wireless/iwlwifi/Kconfig index 8304f6406a17..736162324ba4 100644 --- a/drivers/net/wireless/iwlwifi/Kconfig +++ b/drivers/net/wireless/iwlwifi/Kconfig | |||
@@ -75,7 +75,7 @@ config IWLAGN | |||
75 | If you want to compile the driver as a module ( = code which can be | 75 | If you want to compile the driver as a module ( = code which can be |
76 | inserted in and removed from the running kernel whenever you want), | 76 | inserted in and removed from the running kernel whenever you want), |
77 | say M here and read <file:Documentation/kbuild/modules.txt>. The | 77 | say M here and read <file:Documentation/kbuild/modules.txt>. The |
78 | module will be called iwlagn.ko. | 78 | module will be called iwlagn. |
79 | 79 | ||
80 | 80 | ||
81 | config IWL4965 | 81 | config IWL4965 |
@@ -113,7 +113,7 @@ config IWL3945 | |||
113 | If you want to compile the driver as a module ( = code which can be | 113 | If you want to compile the driver as a module ( = code which can be |
114 | inserted in and removed from the running kernel whenever you want), | 114 | inserted in and removed from the running kernel whenever you want), |
115 | say M here and read <file:Documentation/kbuild/modules.txt>. The | 115 | say M here and read <file:Documentation/kbuild/modules.txt>. The |
116 | module will be called iwl3945.ko. | 116 | module will be called iwl3945. |
117 | 117 | ||
118 | config IWL3945_SPECTRUM_MEASUREMENT | 118 | config IWL3945_SPECTRUM_MEASUREMENT |
119 | bool "Enable Spectrum Measurement in iwl3945 driver" | 119 | bool "Enable Spectrum Measurement in iwl3945 driver" |
diff --git a/drivers/net/wireless/rndis_wlan.c b/drivers/net/wireless/rndis_wlan.c index bebf735cd4bd..ff0042ffe3e9 100644 --- a/drivers/net/wireless/rndis_wlan.c +++ b/drivers/net/wireless/rndis_wlan.c | |||
@@ -584,7 +584,7 @@ static int rndis_set_config_parameter(struct usbnet *dev, char *param, | |||
584 | ret = rndis_set_oid(dev, OID_GEN_RNDIS_CONFIG_PARAMETER, | 584 | ret = rndis_set_oid(dev, OID_GEN_RNDIS_CONFIG_PARAMETER, |
585 | infobuf, info_len); | 585 | infobuf, info_len); |
586 | if (ret != 0) | 586 | if (ret != 0) |
587 | devdbg(dev, "setting rndis config paramater failed, %d.", ret); | 587 | devdbg(dev, "setting rndis config parameter failed, %d.", ret); |
588 | 588 | ||
589 | kfree(infobuf); | 589 | kfree(infobuf); |
590 | return ret; | 590 | return ret; |
diff --git a/drivers/net/wireless/rt2x00/Kconfig b/drivers/net/wireless/rt2x00/Kconfig index bfc5d9cf716e..1ae11c7f17af 100644 --- a/drivers/net/wireless/rt2x00/Kconfig +++ b/drivers/net/wireless/rt2x00/Kconfig | |||
@@ -9,11 +9,11 @@ menuconfig RT2X00 | |||
9 | 9 | ||
10 | When building one of the individual drivers, the rt2x00 library | 10 | When building one of the individual drivers, the rt2x00 library |
11 | will also be created. That library (when the driver is built as | 11 | will also be created. That library (when the driver is built as |
12 | a module) will be called "rt2x00lib.ko". | 12 | a module) will be called rt2x00lib. |
13 | 13 | ||
14 | Additionally PCI and USB libraries will also be build depending | 14 | Additionally PCI and USB libraries will also be build depending |
15 | on the types of drivers being selected, these libraries will be | 15 | on the types of drivers being selected, these libraries will be |
16 | called "rt2x00pci.ko" and "rt2x00usb.ko". | 16 | called rt2x00pci and rt2x00usb. |
17 | 17 | ||
18 | if RT2X00 | 18 | if RT2X00 |
19 | 19 | ||
@@ -26,7 +26,7 @@ config RT2400PCI | |||
26 | This adds support for rt2400 wireless chipset family. | 26 | This adds support for rt2400 wireless chipset family. |
27 | Supported chips: RT2460. | 27 | Supported chips: RT2460. |
28 | 28 | ||
29 | When compiled as a module, this driver will be called "rt2400pci.ko". | 29 | When compiled as a module, this driver will be called rt2400pci. |
30 | 30 | ||
31 | config RT2500PCI | 31 | config RT2500PCI |
32 | tristate "Ralink rt2500 (PCI/PCMCIA) support" | 32 | tristate "Ralink rt2500 (PCI/PCMCIA) support" |
@@ -37,7 +37,7 @@ config RT2500PCI | |||
37 | This adds support for rt2500 wireless chipset family. | 37 | This adds support for rt2500 wireless chipset family. |
38 | Supported chips: RT2560. | 38 | Supported chips: RT2560. |
39 | 39 | ||
40 | When compiled as a module, this driver will be called "rt2500pci.ko". | 40 | When compiled as a module, this driver will be called rt2500pci. |
41 | 41 | ||
42 | config RT61PCI | 42 | config RT61PCI |
43 | tristate "Ralink rt2501/rt61 (PCI/PCMCIA) support" | 43 | tristate "Ralink rt2501/rt61 (PCI/PCMCIA) support" |
@@ -51,7 +51,7 @@ config RT61PCI | |||
51 | This adds support for rt2501 wireless chipset family. | 51 | This adds support for rt2501 wireless chipset family. |
52 | Supported chips: RT2561, RT2561S & RT2661. | 52 | Supported chips: RT2561, RT2561S & RT2661. |
53 | 53 | ||
54 | When compiled as a module, this driver will be called "rt61pci.ko". | 54 | When compiled as a module, this driver will be called rt61pci. |
55 | 55 | ||
56 | config RT2500USB | 56 | config RT2500USB |
57 | tristate "Ralink rt2500 (USB) support" | 57 | tristate "Ralink rt2500 (USB) support" |
@@ -62,7 +62,7 @@ config RT2500USB | |||
62 | This adds support for rt2500 wireless chipset family. | 62 | This adds support for rt2500 wireless chipset family. |
63 | Supported chips: RT2571 & RT2572. | 63 | Supported chips: RT2571 & RT2572. |
64 | 64 | ||
65 | When compiled as a module, this driver will be called "rt2500usb.ko". | 65 | When compiled as a module, this driver will be called rt2500usb. |
66 | 66 | ||
67 | config RT73USB | 67 | config RT73USB |
68 | tristate "Ralink rt2501/rt73 (USB) support" | 68 | tristate "Ralink rt2501/rt73 (USB) support" |
@@ -75,7 +75,7 @@ config RT73USB | |||
75 | This adds support for rt2501 wireless chipset family. | 75 | This adds support for rt2501 wireless chipset family. |
76 | Supported chips: RT2571W, RT2573 & RT2671. | 76 | Supported chips: RT2571W, RT2573 & RT2671. |
77 | 77 | ||
78 | When compiled as a module, this driver will be called "rt73usb.ko". | 78 | When compiled as a module, this driver will be called rt73usb. |
79 | 79 | ||
80 | config RT2X00_LIB_PCI | 80 | config RT2X00_LIB_PCI |
81 | tristate | 81 | tristate |
diff --git a/drivers/net/wireless/rt2x00/rt2x00lib.h b/drivers/net/wireless/rt2x00/rt2x00lib.h index a631613177d0..d83e3794d340 100644 --- a/drivers/net/wireless/rt2x00/rt2x00lib.h +++ b/drivers/net/wireless/rt2x00/rt2x00lib.h | |||
@@ -235,7 +235,7 @@ void rt2x00link_reset_tuner(struct rt2x00_dev *rt2x00dev, bool antenna); | |||
235 | * @rt2x00dev: Pointer to &struct rt2x00_dev. | 235 | * @rt2x00dev: Pointer to &struct rt2x00_dev. |
236 | * | 236 | * |
237 | * Initialize work structure and all link tuning related | 237 | * Initialize work structure and all link tuning related |
238 | * paramters. This will not start the link tuning process itself. | 238 | * parameters. This will not start the link tuning process itself. |
239 | */ | 239 | */ |
240 | void rt2x00link_register(struct rt2x00_dev *rt2x00dev); | 240 | void rt2x00link_register(struct rt2x00_dev *rt2x00dev); |
241 | 241 | ||
diff --git a/drivers/net/wireless/wavelan_cs.c b/drivers/net/wireless/wavelan_cs.c index e55b33961aeb..fa2821be44c2 100644 --- a/drivers/net/wireless/wavelan_cs.c +++ b/drivers/net/wireless/wavelan_cs.c | |||
@@ -138,7 +138,7 @@ psa_read(struct net_device * dev, | |||
138 | 138 | ||
139 | /*------------------------------------------------------------------*/ | 139 | /*------------------------------------------------------------------*/ |
140 | /* | 140 | /* |
141 | * Write the Paramter Storage Area to the WaveLAN card's memory | 141 | * Write the Parameter Storage Area to the WaveLAN card's memory |
142 | */ | 142 | */ |
143 | static void | 143 | static void |
144 | psa_write(struct net_device * dev, | 144 | psa_write(struct net_device * dev, |
diff --git a/drivers/pci/hotplug/sgi_hotplug.c b/drivers/pci/hotplug/sgi_hotplug.c index 3eee70928d45..2d6da78fddb6 100644 --- a/drivers/pci/hotplug/sgi_hotplug.c +++ b/drivers/pci/hotplug/sgi_hotplug.c | |||
@@ -679,7 +679,7 @@ alloc_err: | |||
679 | return rc; | 679 | return rc; |
680 | } | 680 | } |
681 | 681 | ||
682 | static int sn_pci_hotplug_init(void) | 682 | static int __init sn_pci_hotplug_init(void) |
683 | { | 683 | { |
684 | struct pci_bus *pci_bus = NULL; | 684 | struct pci_bus *pci_bus = NULL; |
685 | int rc; | 685 | int rc; |
@@ -716,7 +716,7 @@ static int sn_pci_hotplug_init(void) | |||
716 | return registered == 1 ? 0 : -ENODEV; | 716 | return registered == 1 ? 0 : -ENODEV; |
717 | } | 717 | } |
718 | 718 | ||
719 | static void sn_pci_hotplug_exit(void) | 719 | static void __exit sn_pci_hotplug_exit(void) |
720 | { | 720 | { |
721 | struct hotplug_slot *bss_hotplug_slot; | 721 | struct hotplug_slot *bss_hotplug_slot; |
722 | 722 | ||
diff --git a/drivers/pcmcia/Kconfig b/drivers/pcmcia/Kconfig index 276473543982..fbf965b31c14 100644 --- a/drivers/pcmcia/Kconfig +++ b/drivers/pcmcia/Kconfig | |||
@@ -217,7 +217,7 @@ config PCMCIA_PXA2XX | |||
217 | depends on ARM && ARCH_PXA && PCMCIA | 217 | depends on ARM && ARCH_PXA && PCMCIA |
218 | depends on (ARCH_LUBBOCK || MACH_MAINSTONE || PXA_SHARPSL \ | 218 | depends on (ARCH_LUBBOCK || MACH_MAINSTONE || PXA_SHARPSL \ |
219 | || MACH_ARMCORE || ARCH_PXA_PALM || TRIZEPS_PCMCIA \ | 219 | || MACH_ARMCORE || ARCH_PXA_PALM || TRIZEPS_PCMCIA \ |
220 | || ARCH_VIPER || ARCH_PXA_ESERIES) | 220 | || ARCH_VIPER || ARCH_PXA_ESERIES || MACH_STARGATE2) |
221 | help | 221 | help |
222 | Say Y here to include support for the PXA2xx PCMCIA controller | 222 | Say Y here to include support for the PXA2xx PCMCIA controller |
223 | 223 | ||
diff --git a/drivers/pcmcia/Makefile b/drivers/pcmcia/Makefile index bbac46327227..047394d98ac2 100644 --- a/drivers/pcmcia/Makefile +++ b/drivers/pcmcia/Makefile | |||
@@ -73,5 +73,6 @@ pxa2xx-obj-$(CONFIG_TRIZEPS_PCMCIA) += pxa2xx_trizeps4.o | |||
73 | pxa2xx-obj-$(CONFIG_MACH_PALMTX) += pxa2xx_palmtx.o | 73 | pxa2xx-obj-$(CONFIG_MACH_PALMTX) += pxa2xx_palmtx.o |
74 | pxa2xx-obj-$(CONFIG_MACH_PALMLD) += pxa2xx_palmld.o | 74 | pxa2xx-obj-$(CONFIG_MACH_PALMLD) += pxa2xx_palmld.o |
75 | pxa2xx-obj-$(CONFIG_MACH_E740) += pxa2xx_e740.o | 75 | pxa2xx-obj-$(CONFIG_MACH_E740) += pxa2xx_e740.o |
76 | pxa2xx-obj-$(CONFIG_MACH_STARGATE2) += pxa2xx_stargate2.o | ||
76 | 77 | ||
77 | obj-$(CONFIG_PCMCIA_PXA2XX) += pxa2xx_core.o $(pxa2xx-obj-y) | 78 | obj-$(CONFIG_PCMCIA_PXA2XX) += pxa2xx_core.o $(pxa2xx-obj-y) |
diff --git a/drivers/pcmcia/pxa2xx_stargate2.c b/drivers/pcmcia/pxa2xx_stargate2.c new file mode 100644 index 000000000000..490749ea677f --- /dev/null +++ b/drivers/pcmcia/pxa2xx_stargate2.c | |||
@@ -0,0 +1,174 @@ | |||
1 | /* | ||
2 | * linux/drivers/pcmcia/pxa2xx_stargate2.c | ||
3 | * | ||
4 | * Stargate 2 PCMCIA specific routines. | ||
5 | * | ||
6 | * Created: December 6, 2005 | ||
7 | * Author: Ed C. Epp | ||
8 | * Copyright: Intel Corp 2005 | ||
9 | * Jonathan Cameron <jic23@cam.ac.uk> 2009 | ||
10 | * | ||
11 | * This program is free software; you can redistribute it and/or modify | ||
12 | * it under the terms of the GNU General Public License version 2 as | ||
13 | * published by the Free Software Foundation. | ||
14 | */ | ||
15 | |||
16 | #include <linux/module.h> | ||
17 | #include <linux/init.h> | ||
18 | #include <linux/kernel.h> | ||
19 | #include <linux/interrupt.h> | ||
20 | #include <linux/delay.h> | ||
21 | #include <linux/platform_device.h> | ||
22 | #include <linux/gpio.h> | ||
23 | |||
24 | #include <pcmcia/ss.h> | ||
25 | |||
26 | #include <asm/irq.h> | ||
27 | #include <asm/mach-types.h> | ||
28 | |||
29 | #include "soc_common.h" | ||
30 | |||
31 | #define SG2_S0_BUFF_CTL 120 | ||
32 | #define SG2_S0_POWER_CTL 108 | ||
33 | #define SG2_S0_GPIO_RESET 82 | ||
34 | #define SG2_S0_GPIO_DETECT 53 | ||
35 | #define SG2_S0_GPIO_READY 81 | ||
36 | |||
37 | static struct pcmcia_irqs irqs[] = { | ||
38 | { 0, IRQ_GPIO(SG2_S0_GPIO_DETECT), "PCMCIA0 CD" }, | ||
39 | }; | ||
40 | |||
41 | static int sg2_pcmcia_hw_init(struct soc_pcmcia_socket *skt) | ||
42 | { | ||
43 | skt->irq = IRQ_GPIO(SG2_S0_GPIO_READY); | ||
44 | return soc_pcmcia_request_irqs(skt, irqs, ARRAY_SIZE(irqs)); | ||
45 | } | ||
46 | |||
47 | static void sg2_pcmcia_hw_shutdown(struct soc_pcmcia_socket *skt) | ||
48 | { | ||
49 | soc_pcmcia_free_irqs(skt, irqs, ARRAY_SIZE(irqs)); | ||
50 | } | ||
51 | |||
52 | static void sg2_pcmcia_socket_state(struct soc_pcmcia_socket *skt, | ||
53 | struct pcmcia_state *state) | ||
54 | { | ||
55 | state->detect = !gpio_get_value(SG2_S0_GPIO_DETECT); | ||
56 | state->ready = !!gpio_get_value(SG2_S0_GPIO_READY); | ||
57 | state->bvd1 = 0; /* not available - battery detect on card */ | ||
58 | state->bvd2 = 0; /* not available */ | ||
59 | state->vs_3v = 1; /* not available - voltage detect for card */ | ||
60 | state->vs_Xv = 0; /* not available */ | ||
61 | state->wrprot = 0; /* not available - write protect */ | ||
62 | } | ||
63 | |||
64 | static int sg2_pcmcia_configure_socket(struct soc_pcmcia_socket *skt, | ||
65 | const socket_state_t *state) | ||
66 | { | ||
67 | /* Enable card power */ | ||
68 | switch (state->Vcc) { | ||
69 | case 0: | ||
70 | /* sets power ctl register high */ | ||
71 | gpio_set_value(SG2_S0_POWER_CTL, 1); | ||
72 | break; | ||
73 | case 33: | ||
74 | case 50: | ||
75 | /* sets power control register low (clear) */ | ||
76 | gpio_set_value(SG2_S0_POWER_CTL, 0); | ||
77 | msleep(100); | ||
78 | break; | ||
79 | default: | ||
80 | pr_err("%s(): bad Vcc %u\n", | ||
81 | __func__, state->Vcc); | ||
82 | return -1; | ||
83 | } | ||
84 | |||
85 | /* reset */ | ||
86 | gpio_set_value(SG2_S0_GPIO_RESET, !!(state->flags & SS_RESET)); | ||
87 | |||
88 | return 0; | ||
89 | } | ||
90 | |||
91 | static void sg2_pcmcia_socket_init(struct soc_pcmcia_socket *skt) | ||
92 | { | ||
93 | soc_pcmcia_enable_irqs(skt, irqs, ARRAY_SIZE(irqs)); | ||
94 | } | ||
95 | |||
96 | static void sg2_pcmcia_socket_suspend(struct soc_pcmcia_socket *skt) | ||
97 | { | ||
98 | soc_pcmcia_disable_irqs(skt, irqs, ARRAY_SIZE(irqs)); | ||
99 | } | ||
100 | |||
101 | static struct pcmcia_low_level sg2_pcmcia_ops __initdata = { | ||
102 | .owner = THIS_MODULE, | ||
103 | .hw_init = sg2_pcmcia_hw_init, | ||
104 | .hw_shutdown = sg2_pcmcia_hw_shutdown, | ||
105 | .socket_state = sg2_pcmcia_socket_state, | ||
106 | .configure_socket = sg2_pcmcia_configure_socket, | ||
107 | .socket_init = sg2_pcmcia_socket_init, | ||
108 | .socket_suspend = sg2_pcmcia_socket_suspend, | ||
109 | .nr = 1, | ||
110 | }; | ||
111 | |||
112 | static struct platform_device *sg2_pcmcia_device; | ||
113 | |||
114 | static int __init sg2_pcmcia_init(void) | ||
115 | { | ||
116 | int ret; | ||
117 | |||
118 | if (!machine_is_stargate2()) | ||
119 | return -ENODEV; | ||
120 | |||
121 | sg2_pcmcia_device = platform_device_alloc("pxa2xx-pcmcia", -1); | ||
122 | if (!sg2_pcmcia_device) | ||
123 | return -ENOMEM; | ||
124 | |||
125 | ret = gpio_request(SG2_S0_BUFF_CTL, "SG2 CF buff ctl"); | ||
126 | if (ret) | ||
127 | goto error_put_platform_device; | ||
128 | ret = gpio_request(SG2_S0_POWER_CTL, "SG2 CF power ctl"); | ||
129 | if (ret) | ||
130 | goto error_free_gpio_buff_ctl; | ||
131 | ret = gpio_request(SG2_S0_GPIO_RESET, "SG2 CF reset"); | ||
132 | if (ret) | ||
133 | goto error_free_gpio_power_ctl; | ||
134 | /* Set gpio directions */ | ||
135 | gpio_direction_output(SG2_S0_BUFF_CTL, 0); | ||
136 | gpio_direction_output(SG2_S0_POWER_CTL, 1); | ||
137 | gpio_direction_output(SG2_S0_GPIO_RESET, 1); | ||
138 | |||
139 | ret = platform_device_add_data(sg2_pcmcia_device, | ||
140 | &sg2_pcmcia_ops, | ||
141 | sizeof(sg2_pcmcia_ops)); | ||
142 | if (ret) | ||
143 | goto error_free_gpio_reset; | ||
144 | |||
145 | ret = platform_device_add(sg2_pcmcia_device); | ||
146 | if (ret) | ||
147 | goto error_free_gpio_reset; | ||
148 | |||
149 | return 0; | ||
150 | error_free_gpio_reset: | ||
151 | gpio_free(SG2_S0_GPIO_RESET); | ||
152 | error_free_gpio_power_ctl: | ||
153 | gpio_free(SG2_S0_POWER_CTL); | ||
154 | error_free_gpio_buff_ctl: | ||
155 | gpio_free(SG2_S0_BUFF_CTL); | ||
156 | error_put_platform_device: | ||
157 | platform_device_put(sg2_pcmcia_device); | ||
158 | |||
159 | return ret; | ||
160 | } | ||
161 | |||
162 | static void __exit sg2_pcmcia_exit(void) | ||
163 | { | ||
164 | platform_device_unregister(sg2_pcmcia_device); | ||
165 | gpio_free(SG2_S0_BUFF_CTL); | ||
166 | gpio_free(SG2_S0_POWER_CTL); | ||
167 | gpio_free(SG2_S0_GPIO_RESET); | ||
168 | } | ||
169 | |||
170 | fs_initcall(sg2_pcmcia_init); | ||
171 | module_exit(sg2_pcmcia_exit); | ||
172 | |||
173 | MODULE_LICENSE("GPL"); | ||
174 | MODULE_ALIAS("platform:pxa2xx-pcmcia"); | ||
diff --git a/drivers/rtc/rtc-ep93xx.c b/drivers/rtc/rtc-ep93xx.c index f7a3283dd029..551332e4ed02 100644 --- a/drivers/rtc/rtc-ep93xx.c +++ b/drivers/rtc/rtc-ep93xx.c | |||
@@ -12,32 +12,56 @@ | |||
12 | #include <linux/module.h> | 12 | #include <linux/module.h> |
13 | #include <linux/rtc.h> | 13 | #include <linux/rtc.h> |
14 | #include <linux/platform_device.h> | 14 | #include <linux/platform_device.h> |
15 | #include <mach/hardware.h> | 15 | #include <linux/io.h> |
16 | |||
17 | #define EP93XX_RTC_DATA 0x000 | ||
18 | #define EP93XX_RTC_MATCH 0x004 | ||
19 | #define EP93XX_RTC_STATUS 0x008 | ||
20 | #define EP93XX_RTC_STATUS_INTR (1<<0) | ||
21 | #define EP93XX_RTC_LOAD 0x00C | ||
22 | #define EP93XX_RTC_CONTROL 0x010 | ||
23 | #define EP93XX_RTC_CONTROL_MIE (1<<0) | ||
24 | #define EP93XX_RTC_SWCOMP 0x108 | ||
25 | #define EP93XX_RTC_SWCOMP_DEL_MASK 0x001f0000 | ||
26 | #define EP93XX_RTC_SWCOMP_DEL_SHIFT 16 | ||
27 | #define EP93XX_RTC_SWCOMP_INT_MASK 0x0000ffff | ||
28 | #define EP93XX_RTC_SWCOMP_INT_SHIFT 0 | ||
29 | |||
30 | #define DRV_VERSION "0.3" | ||
16 | 31 | ||
17 | #define EP93XX_RTC_REG(x) (EP93XX_RTC_BASE + (x)) | 32 | /* |
18 | #define EP93XX_RTC_DATA EP93XX_RTC_REG(0x0000) | 33 | * struct device dev.platform_data is used to store our private data |
19 | #define EP93XX_RTC_LOAD EP93XX_RTC_REG(0x000C) | 34 | * because struct rtc_device does not have a variable to hold it. |
20 | #define EP93XX_RTC_SWCOMP EP93XX_RTC_REG(0x0108) | 35 | */ |
21 | 36 | struct ep93xx_rtc { | |
22 | #define DRV_VERSION "0.2" | 37 | void __iomem *mmio_base; |
38 | }; | ||
23 | 39 | ||
24 | static int ep93xx_get_swcomp(struct device *dev, unsigned short *preload, | 40 | static int ep93xx_rtc_get_swcomp(struct device *dev, unsigned short *preload, |
25 | unsigned short *delete) | 41 | unsigned short *delete) |
26 | { | 42 | { |
27 | unsigned short comp = __raw_readl(EP93XX_RTC_SWCOMP); | 43 | struct ep93xx_rtc *ep93xx_rtc = dev->platform_data; |
44 | unsigned long comp; | ||
45 | |||
46 | comp = __raw_readl(ep93xx_rtc->mmio_base + EP93XX_RTC_SWCOMP); | ||
28 | 47 | ||
29 | if (preload) | 48 | if (preload) |
30 | *preload = comp & 0xffff; | 49 | *preload = (comp & EP93XX_RTC_SWCOMP_INT_MASK) |
50 | >> EP93XX_RTC_SWCOMP_INT_SHIFT; | ||
31 | 51 | ||
32 | if (delete) | 52 | if (delete) |
33 | *delete = (comp >> 16) & 0x1f; | 53 | *delete = (comp & EP93XX_RTC_SWCOMP_DEL_MASK) |
54 | >> EP93XX_RTC_SWCOMP_DEL_SHIFT; | ||
34 | 55 | ||
35 | return 0; | 56 | return 0; |
36 | } | 57 | } |
37 | 58 | ||
38 | static int ep93xx_rtc_read_time(struct device *dev, struct rtc_time *tm) | 59 | static int ep93xx_rtc_read_time(struct device *dev, struct rtc_time *tm) |
39 | { | 60 | { |
40 | unsigned long time = __raw_readl(EP93XX_RTC_DATA); | 61 | struct ep93xx_rtc *ep93xx_rtc = dev->platform_data; |
62 | unsigned long time; | ||
63 | |||
64 | time = __raw_readl(ep93xx_rtc->mmio_base + EP93XX_RTC_DATA); | ||
41 | 65 | ||
42 | rtc_time_to_tm(time, tm); | 66 | rtc_time_to_tm(time, tm); |
43 | return 0; | 67 | return 0; |
@@ -45,7 +69,9 @@ static int ep93xx_rtc_read_time(struct device *dev, struct rtc_time *tm) | |||
45 | 69 | ||
46 | static int ep93xx_rtc_set_mmss(struct device *dev, unsigned long secs) | 70 | static int ep93xx_rtc_set_mmss(struct device *dev, unsigned long secs) |
47 | { | 71 | { |
48 | __raw_writel(secs + 1, EP93XX_RTC_LOAD); | 72 | struct ep93xx_rtc *ep93xx_rtc = dev->platform_data; |
73 | |||
74 | __raw_writel(secs + 1, ep93xx_rtc->mmio_base + EP93XX_RTC_LOAD); | ||
49 | return 0; | 75 | return 0; |
50 | } | 76 | } |
51 | 77 | ||
@@ -53,7 +79,7 @@ static int ep93xx_rtc_proc(struct device *dev, struct seq_file *seq) | |||
53 | { | 79 | { |
54 | unsigned short preload, delete; | 80 | unsigned short preload, delete; |
55 | 81 | ||
56 | ep93xx_get_swcomp(dev, &preload, &delete); | 82 | ep93xx_rtc_get_swcomp(dev, &preload, &delete); |
57 | 83 | ||
58 | seq_printf(seq, "preload\t\t: %d\n", preload); | 84 | seq_printf(seq, "preload\t\t: %d\n", preload); |
59 | seq_printf(seq, "delete\t\t: %d\n", delete); | 85 | seq_printf(seq, "delete\t\t: %d\n", delete); |
@@ -67,54 +93,104 @@ static const struct rtc_class_ops ep93xx_rtc_ops = { | |||
67 | .proc = ep93xx_rtc_proc, | 93 | .proc = ep93xx_rtc_proc, |
68 | }; | 94 | }; |
69 | 95 | ||
70 | static ssize_t ep93xx_sysfs_show_comp_preload(struct device *dev, | 96 | static ssize_t ep93xx_rtc_show_comp_preload(struct device *dev, |
71 | struct device_attribute *attr, char *buf) | 97 | struct device_attribute *attr, char *buf) |
72 | { | 98 | { |
73 | unsigned short preload; | 99 | unsigned short preload; |
74 | 100 | ||
75 | ep93xx_get_swcomp(dev, &preload, NULL); | 101 | ep93xx_rtc_get_swcomp(dev, &preload, NULL); |
76 | 102 | ||
77 | return sprintf(buf, "%d\n", preload); | 103 | return sprintf(buf, "%d\n", preload); |
78 | } | 104 | } |
79 | static DEVICE_ATTR(comp_preload, S_IRUGO, ep93xx_sysfs_show_comp_preload, NULL); | 105 | static DEVICE_ATTR(comp_preload, S_IRUGO, ep93xx_rtc_show_comp_preload, NULL); |
80 | 106 | ||
81 | static ssize_t ep93xx_sysfs_show_comp_delete(struct device *dev, | 107 | static ssize_t ep93xx_rtc_show_comp_delete(struct device *dev, |
82 | struct device_attribute *attr, char *buf) | 108 | struct device_attribute *attr, char *buf) |
83 | { | 109 | { |
84 | unsigned short delete; | 110 | unsigned short delete; |
85 | 111 | ||
86 | ep93xx_get_swcomp(dev, NULL, &delete); | 112 | ep93xx_rtc_get_swcomp(dev, NULL, &delete); |
87 | 113 | ||
88 | return sprintf(buf, "%d\n", delete); | 114 | return sprintf(buf, "%d\n", delete); |
89 | } | 115 | } |
90 | static DEVICE_ATTR(comp_delete, S_IRUGO, ep93xx_sysfs_show_comp_delete, NULL); | 116 | static DEVICE_ATTR(comp_delete, S_IRUGO, ep93xx_rtc_show_comp_delete, NULL); |
91 | 117 | ||
92 | 118 | ||
93 | static int __devinit ep93xx_rtc_probe(struct platform_device *dev) | 119 | static int __init ep93xx_rtc_probe(struct platform_device *pdev) |
94 | { | 120 | { |
95 | struct rtc_device *rtc = rtc_device_register("ep93xx", | 121 | struct ep93xx_rtc *ep93xx_rtc; |
96 | &dev->dev, &ep93xx_rtc_ops, THIS_MODULE); | 122 | struct resource *res; |
123 | struct rtc_device *rtc; | ||
124 | int err; | ||
125 | |||
126 | ep93xx_rtc = kzalloc(sizeof(struct ep93xx_rtc), GFP_KERNEL); | ||
127 | if (ep93xx_rtc == NULL) | ||
128 | return -ENOMEM; | ||
129 | |||
130 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
131 | if (res == NULL) | ||
132 | return -ENXIO; | ||
133 | |||
134 | res = request_mem_region(res->start, resource_size(res), pdev->name); | ||
135 | if (res == NULL) | ||
136 | return -EBUSY; | ||
137 | |||
138 | ep93xx_rtc->mmio_base = ioremap(res->start, resource_size(res)); | ||
139 | if (ep93xx_rtc->mmio_base == NULL) { | ||
140 | err = -ENXIO; | ||
141 | goto fail; | ||
142 | } | ||
97 | 143 | ||
144 | pdev->dev.platform_data = ep93xx_rtc; | ||
145 | |||
146 | rtc = rtc_device_register(pdev->name, | ||
147 | &pdev->dev, &ep93xx_rtc_ops, THIS_MODULE); | ||
98 | if (IS_ERR(rtc)) { | 148 | if (IS_ERR(rtc)) { |
99 | return PTR_ERR(rtc); | 149 | err = PTR_ERR(rtc); |
150 | goto fail; | ||
100 | } | 151 | } |
101 | 152 | ||
102 | platform_set_drvdata(dev, rtc); | 153 | platform_set_drvdata(pdev, rtc); |
103 | 154 | ||
104 | device_create_file(&dev->dev, &dev_attr_comp_preload); | 155 | err = device_create_file(&pdev->dev, &dev_attr_comp_preload); |
105 | device_create_file(&dev->dev, &dev_attr_comp_delete); | 156 | if (err) |
157 | goto fail; | ||
158 | err = device_create_file(&pdev->dev, &dev_attr_comp_delete); | ||
159 | if (err) { | ||
160 | device_remove_file(&pdev->dev, &dev_attr_comp_preload); | ||
161 | goto fail; | ||
162 | } | ||
106 | 163 | ||
107 | return 0; | 164 | return 0; |
165 | |||
166 | fail: | ||
167 | if (ep93xx_rtc->mmio_base) { | ||
168 | iounmap(ep93xx_rtc->mmio_base); | ||
169 | pdev->dev.platform_data = NULL; | ||
170 | } | ||
171 | release_mem_region(res->start, resource_size(res)); | ||
172 | return err; | ||
108 | } | 173 | } |
109 | 174 | ||
110 | static int __devexit ep93xx_rtc_remove(struct platform_device *dev) | 175 | static int __exit ep93xx_rtc_remove(struct platform_device *pdev) |
111 | { | 176 | { |
112 | struct rtc_device *rtc = platform_get_drvdata(dev); | 177 | struct rtc_device *rtc = platform_get_drvdata(pdev); |
178 | struct ep93xx_rtc *ep93xx_rtc = pdev->dev.platform_data; | ||
179 | struct resource *res; | ||
180 | |||
181 | /* cleanup sysfs */ | ||
182 | device_remove_file(&pdev->dev, &dev_attr_comp_delete); | ||
183 | device_remove_file(&pdev->dev, &dev_attr_comp_preload); | ||
184 | |||
185 | rtc_device_unregister(rtc); | ||
186 | |||
187 | iounmap(ep93xx_rtc->mmio_base); | ||
188 | pdev->dev.platform_data = NULL; | ||
113 | 189 | ||
114 | if (rtc) | 190 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
115 | rtc_device_unregister(rtc); | 191 | release_mem_region(res->start, resource_size(res)); |
116 | 192 | ||
117 | platform_set_drvdata(dev, NULL); | 193 | platform_set_drvdata(pdev, NULL); |
118 | 194 | ||
119 | return 0; | 195 | return 0; |
120 | } | 196 | } |
@@ -122,23 +198,22 @@ static int __devexit ep93xx_rtc_remove(struct platform_device *dev) | |||
122 | /* work with hotplug and coldplug */ | 198 | /* work with hotplug and coldplug */ |
123 | MODULE_ALIAS("platform:ep93xx-rtc"); | 199 | MODULE_ALIAS("platform:ep93xx-rtc"); |
124 | 200 | ||
125 | static struct platform_driver ep93xx_rtc_platform_driver = { | 201 | static struct platform_driver ep93xx_rtc_driver = { |
126 | .driver = { | 202 | .driver = { |
127 | .name = "ep93xx-rtc", | 203 | .name = "ep93xx-rtc", |
128 | .owner = THIS_MODULE, | 204 | .owner = THIS_MODULE, |
129 | }, | 205 | }, |
130 | .probe = ep93xx_rtc_probe, | 206 | .remove = __exit_p(ep93xx_rtc_remove), |
131 | .remove = __devexit_p(ep93xx_rtc_remove), | ||
132 | }; | 207 | }; |
133 | 208 | ||
134 | static int __init ep93xx_rtc_init(void) | 209 | static int __init ep93xx_rtc_init(void) |
135 | { | 210 | { |
136 | return platform_driver_register(&ep93xx_rtc_platform_driver); | 211 | return platform_driver_probe(&ep93xx_rtc_driver, ep93xx_rtc_probe); |
137 | } | 212 | } |
138 | 213 | ||
139 | static void __exit ep93xx_rtc_exit(void) | 214 | static void __exit ep93xx_rtc_exit(void) |
140 | { | 215 | { |
141 | platform_driver_unregister(&ep93xx_rtc_platform_driver); | 216 | platform_driver_unregister(&ep93xx_rtc_driver); |
142 | } | 217 | } |
143 | 218 | ||
144 | MODULE_AUTHOR("Alessandro Zummo <a.zummo@towertech.it>"); | 219 | MODULE_AUTHOR("Alessandro Zummo <a.zummo@towertech.it>"); |
diff --git a/drivers/rtc/rtc-pl030.c b/drivers/rtc/rtc-pl030.c index aaf1f75fa293..457231bb1029 100644 --- a/drivers/rtc/rtc-pl030.c +++ b/drivers/rtc/rtc-pl030.c | |||
@@ -117,7 +117,7 @@ static int pl030_probe(struct amba_device *dev, struct amba_id *id) | |||
117 | goto err_rtc; | 117 | goto err_rtc; |
118 | } | 118 | } |
119 | 119 | ||
120 | rtc->base = ioremap(dev->res.start, SZ_4K); | 120 | rtc->base = ioremap(dev->res.start, resource_size(&dev->res)); |
121 | if (!rtc->base) { | 121 | if (!rtc->base) { |
122 | ret = -ENOMEM; | 122 | ret = -ENOMEM; |
123 | goto err_map; | 123 | goto err_map; |
diff --git a/drivers/rtc/rtc-pl031.c b/drivers/rtc/rtc-pl031.c index 451fc13784d1..f41873f98f66 100644 --- a/drivers/rtc/rtc-pl031.c +++ b/drivers/rtc/rtc-pl031.c | |||
@@ -142,8 +142,7 @@ static int pl031_probe(struct amba_device *adev, struct amba_id *id) | |||
142 | goto out; | 142 | goto out; |
143 | } | 143 | } |
144 | 144 | ||
145 | ldata->base = ioremap(adev->res.start, | 145 | ldata->base = ioremap(adev->res.start, resource_size(&adev->res)); |
146 | adev->res.end - adev->res.start + 1); | ||
147 | if (!ldata->base) { | 146 | if (!ldata->base) { |
148 | ret = -ENOMEM; | 147 | ret = -ENOMEM; |
149 | goto out_no_remap; | 148 | goto out_no_remap; |
diff --git a/drivers/s390/net/Kconfig b/drivers/s390/net/Kconfig index a7745c82b4ae..cb909a5b5047 100644 --- a/drivers/s390/net/Kconfig +++ b/drivers/s390/net/Kconfig | |||
@@ -8,7 +8,7 @@ config LCS | |||
8 | Select this option if you want to use LCS networking on IBM System z. | 8 | Select this option if you want to use LCS networking on IBM System z. |
9 | This device driver supports Token Ring (IEEE 802.5), | 9 | This device driver supports Token Ring (IEEE 802.5), |
10 | FDDI (IEEE 802.7) and Ethernet. | 10 | FDDI (IEEE 802.7) and Ethernet. |
11 | To compile as a module, choose M. The module name is lcs.ko. | 11 | To compile as a module, choose M. The module name is lcs. |
12 | If you do not know what it is, it's safe to choose Y. | 12 | If you do not know what it is, it's safe to choose Y. |
13 | 13 | ||
14 | config CTCM | 14 | config CTCM |
@@ -21,7 +21,7 @@ config CTCM | |||
21 | It also supports virtual CTCs when running under VM. | 21 | It also supports virtual CTCs when running under VM. |
22 | This driver also supports channel-to-channel MPC SNA devices. | 22 | This driver also supports channel-to-channel MPC SNA devices. |
23 | MPC is an SNA protocol device used by Communication Server for Linux. | 23 | MPC is an SNA protocol device used by Communication Server for Linux. |
24 | To compile as a module, choose M. The module name is ctcm.ko. | 24 | To compile as a module, choose M. The module name is ctcm. |
25 | To compile into the kernel, choose Y. | 25 | To compile into the kernel, choose Y. |
26 | If you do not need any channel-to-channel connection, choose N. | 26 | If you do not need any channel-to-channel connection, choose N. |
27 | 27 | ||
@@ -34,7 +34,7 @@ config NETIUCV | |||
34 | link between VM guests. Using ifconfig a point-to-point connection | 34 | link between VM guests. Using ifconfig a point-to-point connection |
35 | can be established to the Linux on IBM System z | 35 | can be established to the Linux on IBM System z |
36 | running on the other VM guest. To compile as a module, choose M. | 36 | running on the other VM guest. To compile as a module, choose M. |
37 | The module name is netiucv.ko. If unsure, choose Y. | 37 | The module name is netiucv. If unsure, choose Y. |
38 | 38 | ||
39 | config SMSGIUCV | 39 | config SMSGIUCV |
40 | tristate "IUCV special message support (VM only)" | 40 | tristate "IUCV special message support (VM only)" |
@@ -50,7 +50,7 @@ config CLAW | |||
50 | This driver supports channel attached CLAW devices. | 50 | This driver supports channel attached CLAW devices. |
51 | CLAW is Common Link Access for Workstation. Common devices | 51 | CLAW is Common Link Access for Workstation. Common devices |
52 | that use CLAW are RS/6000s, Cisco Routers (CIP) and 3172 devices. | 52 | that use CLAW are RS/6000s, Cisco Routers (CIP) and 3172 devices. |
53 | To compile as a module, choose M. The module name is claw.ko. | 53 | To compile as a module, choose M. The module name is claw. |
54 | To compile into the kernel, choose Y. | 54 | To compile into the kernel, choose Y. |
55 | 55 | ||
56 | config QETH | 56 | config QETH |
@@ -65,14 +65,14 @@ config QETH | |||
65 | <http://www.ibm.com/developerworks/linux/linux390> | 65 | <http://www.ibm.com/developerworks/linux/linux390> |
66 | 66 | ||
67 | To compile this driver as a module, choose M. | 67 | To compile this driver as a module, choose M. |
68 | The module name is qeth.ko. | 68 | The module name is qeth. |
69 | 69 | ||
70 | config QETH_L2 | 70 | config QETH_L2 |
71 | tristate "qeth layer 2 device support" | 71 | tristate "qeth layer 2 device support" |
72 | depends on QETH | 72 | depends on QETH |
73 | help | 73 | help |
74 | Select this option to be able to run qeth devices in layer 2 mode. | 74 | Select this option to be able to run qeth devices in layer 2 mode. |
75 | To compile as a module, choose M. The module name is qeth_l2.ko. | 75 | To compile as a module, choose M. The module name is qeth_l2. |
76 | If unsure, choose y. | 76 | If unsure, choose y. |
77 | 77 | ||
78 | config QETH_L3 | 78 | config QETH_L3 |
@@ -80,7 +80,7 @@ config QETH_L3 | |||
80 | depends on QETH | 80 | depends on QETH |
81 | help | 81 | help |
82 | Select this option to be able to run qeth devices in layer 3 mode. | 82 | Select this option to be able to run qeth devices in layer 3 mode. |
83 | To compile as a module choose M. The module name is qeth_l3.ko. | 83 | To compile as a module choose M. The module name is qeth_l3. |
84 | If unsure, choose Y. | 84 | If unsure, choose Y. |
85 | 85 | ||
86 | config QETH_IPV6 | 86 | config QETH_IPV6 |
diff --git a/drivers/s390/scsi/zfcp_fc.c b/drivers/s390/scsi/zfcp_fc.c index bb2752b4130f..35493a82d2a8 100644 --- a/drivers/s390/scsi/zfcp_fc.c +++ b/drivers/s390/scsi/zfcp_fc.c | |||
@@ -116,7 +116,7 @@ static void zfcp_wka_port_put(struct zfcp_wka_port *wka_port) | |||
116 | { | 116 | { |
117 | if (atomic_dec_return(&wka_port->refcount) != 0) | 117 | if (atomic_dec_return(&wka_port->refcount) != 0) |
118 | return; | 118 | return; |
119 | /* wait 10 miliseconds, other reqs might pop in */ | 119 | /* wait 10 milliseconds, other reqs might pop in */ |
120 | schedule_delayed_work(&wka_port->work, HZ / 100); | 120 | schedule_delayed_work(&wka_port->work, HZ / 100); |
121 | } | 121 | } |
122 | 122 | ||
diff --git a/drivers/scsi/dpt/osd_util.h b/drivers/scsi/dpt/osd_util.h index 4b56c0436ba2..b2613c2eaac7 100644 --- a/drivers/scsi/dpt/osd_util.h +++ b/drivers/scsi/dpt/osd_util.h | |||
@@ -342,7 +342,7 @@ uLONG osdGetThreadID(void); | |||
342 | /* wakes up the specifed thread */ | 342 | /* wakes up the specifed thread */ |
343 | void osdWakeThread(uLONG); | 343 | void osdWakeThread(uLONG); |
344 | 344 | ||
345 | /* osd sleep for x miliseconds */ | 345 | /* osd sleep for x milliseconds */ |
346 | void osdSleep(uLONG); | 346 | void osdSleep(uLONG); |
347 | 347 | ||
348 | #define DPT_THREAD_PRIORITY_LOWEST 0x00 | 348 | #define DPT_THREAD_PRIORITY_LOWEST 0x00 |
diff --git a/drivers/scsi/lpfc/lpfc_scsi.c b/drivers/scsi/lpfc/lpfc_scsi.c index e9fa6762044a..7991ba1980ae 100644 --- a/drivers/scsi/lpfc/lpfc_scsi.c +++ b/drivers/scsi/lpfc/lpfc_scsi.c | |||
@@ -1174,8 +1174,8 @@ lpfc_cmd_blksize(struct scsi_cmnd *sc) | |||
1174 | * @reftag: out: ref tag (reference tag) | 1174 | * @reftag: out: ref tag (reference tag) |
1175 | * | 1175 | * |
1176 | * Description: | 1176 | * Description: |
1177 | * Extract DIF paramters from the command if possible. Otherwise, | 1177 | * Extract DIF parameters from the command if possible. Otherwise, |
1178 | * use default paratmers. | 1178 | * use default parameters. |
1179 | * | 1179 | * |
1180 | **/ | 1180 | **/ |
1181 | static inline void | 1181 | static inline void |
diff --git a/drivers/scsi/megaraid.h b/drivers/scsi/megaraid.h index 795201fa0b48..512c2cc1a33f 100644 --- a/drivers/scsi/megaraid.h +++ b/drivers/scsi/megaraid.h | |||
@@ -469,7 +469,7 @@ typedef struct { | |||
469 | u8 type; /* Type of the device */ | 469 | u8 type; /* Type of the device */ |
470 | u8 cur_status; /* current status of the device */ | 470 | u8 cur_status; /* current status of the device */ |
471 | u8 tag_depth; /* Level of tagging */ | 471 | u8 tag_depth; /* Level of tagging */ |
472 | u8 sync_neg; /* sync negotiation - ENABLE or DISBALE */ | 472 | u8 sync_neg; /* sync negotiation - ENABLE or DISABLE */ |
473 | u32 size; /* configurable size in terms of 512 byte | 473 | u32 size; /* configurable size in terms of 512 byte |
474 | blocks */ | 474 | blocks */ |
475 | }__attribute__ ((packed)) phys_drv; | 475 | }__attribute__ ((packed)) phys_drv; |
diff --git a/drivers/scsi/megaraid/mbox_defs.h b/drivers/scsi/megaraid/mbox_defs.h index 170399ef06f4..b25b74764ec3 100644 --- a/drivers/scsi/megaraid/mbox_defs.h +++ b/drivers/scsi/megaraid/mbox_defs.h | |||
@@ -686,7 +686,7 @@ typedef struct { | |||
686 | * @type : Type of the device | 686 | * @type : Type of the device |
687 | * @cur_status : current status of the device | 687 | * @cur_status : current status of the device |
688 | * @tag_depth : Level of tagging | 688 | * @tag_depth : Level of tagging |
689 | * @sync_neg : sync negotiation - ENABLE or DISBALE | 689 | * @sync_neg : sync negotiation - ENABLE or DISABLE |
690 | * @size : configurable size in terms of 512 byte | 690 | * @size : configurable size in terms of 512 byte |
691 | */ | 691 | */ |
692 | typedef struct { | 692 | typedef struct { |
diff --git a/drivers/serial/Kconfig b/drivers/serial/Kconfig index 641e800ed693..1132c5cae7ab 100644 --- a/drivers/serial/Kconfig +++ b/drivers/serial/Kconfig | |||
@@ -861,7 +861,7 @@ config SERIAL_UARTLITE | |||
861 | Say Y here if you want to use the Xilinx uartlite serial controller. | 861 | Say Y here if you want to use the Xilinx uartlite serial controller. |
862 | 862 | ||
863 | To compile this driver as a module, choose M here: the | 863 | To compile this driver as a module, choose M here: the |
864 | module will be called uartlite.ko. | 864 | module will be called uartlite. |
865 | 865 | ||
866 | config SERIAL_UARTLITE_CONSOLE | 866 | config SERIAL_UARTLITE_CONSOLE |
867 | bool "Support for console on Xilinx uartlite serial port" | 867 | bool "Support for console on Xilinx uartlite serial port" |
diff --git a/drivers/serial/amba-pl010.c b/drivers/serial/amba-pl010.c index cdc049d4350f..58a4879c7e48 100644 --- a/drivers/serial/amba-pl010.c +++ b/drivers/serial/amba-pl010.c | |||
@@ -686,7 +686,7 @@ static int pl010_probe(struct amba_device *dev, struct amba_id *id) | |||
686 | goto out; | 686 | goto out; |
687 | } | 687 | } |
688 | 688 | ||
689 | base = ioremap(dev->res.start, PAGE_SIZE); | 689 | base = ioremap(dev->res.start, resource_size(&dev->res)); |
690 | if (!base) { | 690 | if (!base) { |
691 | ret = -ENOMEM; | 691 | ret = -ENOMEM; |
692 | goto free; | 692 | goto free; |
diff --git a/drivers/serial/amba-pl011.c b/drivers/serial/amba-pl011.c index 88fdac51b6c5..bf82e28770a9 100644 --- a/drivers/serial/amba-pl011.c +++ b/drivers/serial/amba-pl011.c | |||
@@ -70,6 +70,23 @@ struct uart_amba_port { | |||
70 | struct clk *clk; | 70 | struct clk *clk; |
71 | unsigned int im; /* interrupt mask */ | 71 | unsigned int im; /* interrupt mask */ |
72 | unsigned int old_status; | 72 | unsigned int old_status; |
73 | unsigned int ifls; /* vendor-specific */ | ||
74 | }; | ||
75 | |||
76 | /* There is by now at least one vendor with differing details, so handle it */ | ||
77 | struct vendor_data { | ||
78 | unsigned int ifls; | ||
79 | unsigned int fifosize; | ||
80 | }; | ||
81 | |||
82 | static struct vendor_data vendor_arm = { | ||
83 | .ifls = UART011_IFLS_RX4_8|UART011_IFLS_TX4_8, | ||
84 | .fifosize = 16, | ||
85 | }; | ||
86 | |||
87 | static struct vendor_data vendor_st = { | ||
88 | .ifls = UART011_IFLS_RX_HALF|UART011_IFLS_TX_HALF, | ||
89 | .fifosize = 64, | ||
73 | }; | 90 | }; |
74 | 91 | ||
75 | static void pl011_stop_tx(struct uart_port *port) | 92 | static void pl011_stop_tx(struct uart_port *port) |
@@ -360,8 +377,7 @@ static int pl011_startup(struct uart_port *port) | |||
360 | if (retval) | 377 | if (retval) |
361 | goto clk_dis; | 378 | goto clk_dis; |
362 | 379 | ||
363 | writew(UART011_IFLS_RX4_8|UART011_IFLS_TX4_8, | 380 | writew(uap->ifls, uap->port.membase + UART011_IFLS); |
364 | uap->port.membase + UART011_IFLS); | ||
365 | 381 | ||
366 | /* | 382 | /* |
367 | * Provoke TX FIFO interrupt into asserting. | 383 | * Provoke TX FIFO interrupt into asserting. |
@@ -732,6 +748,7 @@ static struct uart_driver amba_reg = { | |||
732 | static int pl011_probe(struct amba_device *dev, struct amba_id *id) | 748 | static int pl011_probe(struct amba_device *dev, struct amba_id *id) |
733 | { | 749 | { |
734 | struct uart_amba_port *uap; | 750 | struct uart_amba_port *uap; |
751 | struct vendor_data *vendor = id->data; | ||
735 | void __iomem *base; | 752 | void __iomem *base; |
736 | int i, ret; | 753 | int i, ret; |
737 | 754 | ||
@@ -750,7 +767,7 @@ static int pl011_probe(struct amba_device *dev, struct amba_id *id) | |||
750 | goto out; | 767 | goto out; |
751 | } | 768 | } |
752 | 769 | ||
753 | base = ioremap(dev->res.start, PAGE_SIZE); | 770 | base = ioremap(dev->res.start, resource_size(&dev->res)); |
754 | if (!base) { | 771 | if (!base) { |
755 | ret = -ENOMEM; | 772 | ret = -ENOMEM; |
756 | goto free; | 773 | goto free; |
@@ -762,12 +779,13 @@ static int pl011_probe(struct amba_device *dev, struct amba_id *id) | |||
762 | goto unmap; | 779 | goto unmap; |
763 | } | 780 | } |
764 | 781 | ||
782 | uap->ifls = vendor->ifls; | ||
765 | uap->port.dev = &dev->dev; | 783 | uap->port.dev = &dev->dev; |
766 | uap->port.mapbase = dev->res.start; | 784 | uap->port.mapbase = dev->res.start; |
767 | uap->port.membase = base; | 785 | uap->port.membase = base; |
768 | uap->port.iotype = UPIO_MEM; | 786 | uap->port.iotype = UPIO_MEM; |
769 | uap->port.irq = dev->irq[0]; | 787 | uap->port.irq = dev->irq[0]; |
770 | uap->port.fifosize = 16; | 788 | uap->port.fifosize = vendor->fifosize; |
771 | uap->port.ops = &amba_pl011_pops; | 789 | uap->port.ops = &amba_pl011_pops; |
772 | uap->port.flags = UPF_BOOT_AUTOCONF; | 790 | uap->port.flags = UPF_BOOT_AUTOCONF; |
773 | uap->port.line = i; | 791 | uap->port.line = i; |
@@ -812,6 +830,12 @@ static struct amba_id pl011_ids[] __initdata = { | |||
812 | { | 830 | { |
813 | .id = 0x00041011, | 831 | .id = 0x00041011, |
814 | .mask = 0x000fffff, | 832 | .mask = 0x000fffff, |
833 | .data = &vendor_arm, | ||
834 | }, | ||
835 | { | ||
836 | .id = 0x00380802, | ||
837 | .mask = 0x00ffffff, | ||
838 | .data = &vendor_st, | ||
815 | }, | 839 | }, |
816 | { 0, 0 }, | 840 | { 0, 0 }, |
817 | }; | 841 | }; |
@@ -845,7 +869,11 @@ static void __exit pl011_exit(void) | |||
845 | uart_unregister_driver(&amba_reg); | 869 | uart_unregister_driver(&amba_reg); |
846 | } | 870 | } |
847 | 871 | ||
848 | module_init(pl011_init); | 872 | /* |
873 | * While this can be a module, if builtin it's most likely the console | ||
874 | * So let's leave module_exit but move module_init to an earlier place | ||
875 | */ | ||
876 | arch_initcall(pl011_init); | ||
849 | module_exit(pl011_exit); | 877 | module_exit(pl011_exit); |
850 | 878 | ||
851 | MODULE_AUTHOR("ARM Ltd/Deep Blue Solutions Ltd"); | 879 | MODULE_AUTHOR("ARM Ltd/Deep Blue Solutions Ltd"); |
diff --git a/drivers/serial/imx.c b/drivers/serial/imx.c index 7b5d1de9cfe3..285b414f3054 100644 --- a/drivers/serial/imx.c +++ b/drivers/serial/imx.c | |||
@@ -71,7 +71,7 @@ | |||
71 | #define ONEMS 0xb0 /* One Millisecond register */ | 71 | #define ONEMS 0xb0 /* One Millisecond register */ |
72 | #define UTS 0xb4 /* UART Test Register */ | 72 | #define UTS 0xb4 /* UART Test Register */ |
73 | #endif | 73 | #endif |
74 | #if defined(CONFIG_ARCH_IMX) || defined(CONFIG_ARCH_MX1) | 74 | #ifdef CONFIG_ARCH_MX1 |
75 | #define BIPR1 0xb0 /* Incremental Preset Register 1 */ | 75 | #define BIPR1 0xb0 /* Incremental Preset Register 1 */ |
76 | #define BIPR2 0xb4 /* Incremental Preset Register 2 */ | 76 | #define BIPR2 0xb4 /* Incremental Preset Register 2 */ |
77 | #define BIPR3 0xb8 /* Incremental Preset Register 3 */ | 77 | #define BIPR3 0xb8 /* Incremental Preset Register 3 */ |
@@ -101,7 +101,7 @@ | |||
101 | #define UCR1_RTSDEN (1<<5) /* RTS delta interrupt enable */ | 101 | #define UCR1_RTSDEN (1<<5) /* RTS delta interrupt enable */ |
102 | #define UCR1_SNDBRK (1<<4) /* Send break */ | 102 | #define UCR1_SNDBRK (1<<4) /* Send break */ |
103 | #define UCR1_TDMAEN (1<<3) /* Transmitter ready DMA enable */ | 103 | #define UCR1_TDMAEN (1<<3) /* Transmitter ready DMA enable */ |
104 | #if defined(CONFIG_ARCH_IMX) || defined(CONFIG_ARCH_MX1) | 104 | #ifdef CONFIG_ARCH_MX1 |
105 | #define UCR1_UARTCLKEN (1<<2) /* UART clock enabled */ | 105 | #define UCR1_UARTCLKEN (1<<2) /* UART clock enabled */ |
106 | #endif | 106 | #endif |
107 | #if defined CONFIG_ARCH_MX3 || defined CONFIG_ARCH_MX2 | 107 | #if defined CONFIG_ARCH_MX3 || defined CONFIG_ARCH_MX2 |
@@ -132,7 +132,7 @@ | |||
132 | #define UCR3_RXDSEN (1<<6) /* Receive status interrupt enable */ | 132 | #define UCR3_RXDSEN (1<<6) /* Receive status interrupt enable */ |
133 | #define UCR3_AIRINTEN (1<<5) /* Async IR wake interrupt enable */ | 133 | #define UCR3_AIRINTEN (1<<5) /* Async IR wake interrupt enable */ |
134 | #define UCR3_AWAKEN (1<<4) /* Async wake interrupt enable */ | 134 | #define UCR3_AWAKEN (1<<4) /* Async wake interrupt enable */ |
135 | #ifdef CONFIG_ARCH_IMX | 135 | #ifdef CONFIG_ARCH_MX1 |
136 | #define UCR3_REF25 (1<<3) /* Ref freq 25 MHz, only on mx1 */ | 136 | #define UCR3_REF25 (1<<3) /* Ref freq 25 MHz, only on mx1 */ |
137 | #define UCR3_REF30 (1<<2) /* Ref Freq 30 MHz, only on mx1 */ | 137 | #define UCR3_REF30 (1<<2) /* Ref Freq 30 MHz, only on mx1 */ |
138 | #endif | 138 | #endif |
@@ -186,13 +186,6 @@ | |||
186 | #define UTS_SOFTRST (1<<0) /* Software reset */ | 186 | #define UTS_SOFTRST (1<<0) /* Software reset */ |
187 | 187 | ||
188 | /* We've been assigned a range on the "Low-density serial ports" major */ | 188 | /* We've been assigned a range on the "Low-density serial ports" major */ |
189 | #ifdef CONFIG_ARCH_IMX | ||
190 | #define SERIAL_IMX_MAJOR 204 | ||
191 | #define MINOR_START 41 | ||
192 | #define DEV_NAME "ttySMX" | ||
193 | #define MAX_INTERNAL_IRQ IMX_IRQS | ||
194 | #endif | ||
195 | |||
196 | #ifdef CONFIG_ARCH_MXC | 189 | #ifdef CONFIG_ARCH_MXC |
197 | #define SERIAL_IMX_MAJOR 207 | 190 | #define SERIAL_IMX_MAJOR 207 |
198 | #define MINOR_START 16 | 191 | #define MINOR_START 16 |
diff --git a/drivers/spi/Kconfig b/drivers/spi/Kconfig index 957494775413..e8aae227b5e0 100644 --- a/drivers/spi/Kconfig +++ b/drivers/spi/Kconfig | |||
@@ -118,7 +118,7 @@ config SPI_GPIO | |||
118 | 118 | ||
119 | config SPI_IMX | 119 | config SPI_IMX |
120 | tristate "Freescale iMX SPI controller" | 120 | tristate "Freescale iMX SPI controller" |
121 | depends on ARCH_IMX && EXPERIMENTAL | 121 | depends on ARCH_MX1 && EXPERIMENTAL |
122 | help | 122 | help |
123 | This enables using the Freescale iMX SPI controller in master | 123 | This enables using the Freescale iMX SPI controller in master |
124 | mode. | 124 | mode. |
@@ -171,6 +171,15 @@ config SPI_ORION | |||
171 | help | 171 | help |
172 | This enables using the SPI master controller on the Orion chips. | 172 | This enables using the SPI master controller on the Orion chips. |
173 | 173 | ||
174 | config SPI_PL022 | ||
175 | tristate "ARM AMBA PL022 SSP controller (EXPERIMENTAL)" | ||
176 | depends on ARM_AMBA && EXPERIMENTAL | ||
177 | default y if MACH_U300 | ||
178 | help | ||
179 | This selects the ARM(R) AMBA(R) PrimeCell PL022 SSP | ||
180 | controller. If you have an embedded system with an AMBA(R) | ||
181 | bus and a PL022 controller, say Y or M here. | ||
182 | |||
174 | config SPI_PXA2XX | 183 | config SPI_PXA2XX |
175 | tristate "PXA2xx SSP SPI master" | 184 | tristate "PXA2xx SSP SPI master" |
176 | depends on ARCH_PXA && EXPERIMENTAL | 185 | depends on ARCH_PXA && EXPERIMENTAL |
diff --git a/drivers/spi/Makefile b/drivers/spi/Makefile index 5d0451936d86..ecfadb180482 100644 --- a/drivers/spi/Makefile +++ b/drivers/spi/Makefile | |||
@@ -23,6 +23,7 @@ obj-$(CONFIG_SPI_PXA2XX) += pxa2xx_spi.o | |||
23 | obj-$(CONFIG_SPI_OMAP_UWIRE) += omap_uwire.o | 23 | obj-$(CONFIG_SPI_OMAP_UWIRE) += omap_uwire.o |
24 | obj-$(CONFIG_SPI_OMAP24XX) += omap2_mcspi.o | 24 | obj-$(CONFIG_SPI_OMAP24XX) += omap2_mcspi.o |
25 | obj-$(CONFIG_SPI_ORION) += orion_spi.o | 25 | obj-$(CONFIG_SPI_ORION) += orion_spi.o |
26 | obj-$(CONFIG_SPI_PL022) += amba-pl022.o | ||
26 | obj-$(CONFIG_SPI_MPC52xx_PSC) += mpc52xx_psc_spi.o | 27 | obj-$(CONFIG_SPI_MPC52xx_PSC) += mpc52xx_psc_spi.o |
27 | obj-$(CONFIG_SPI_MPC83xx) += spi_mpc83xx.o | 28 | obj-$(CONFIG_SPI_MPC83xx) += spi_mpc83xx.o |
28 | obj-$(CONFIG_SPI_S3C24XX_GPIO) += spi_s3c24xx_gpio.o | 29 | obj-$(CONFIG_SPI_S3C24XX_GPIO) += spi_s3c24xx_gpio.o |
diff --git a/drivers/spi/amba-pl022.c b/drivers/spi/amba-pl022.c new file mode 100644 index 000000000000..da76797ce8b9 --- /dev/null +++ b/drivers/spi/amba-pl022.c | |||
@@ -0,0 +1,1866 @@ | |||
1 | /* | ||
2 | * drivers/spi/amba-pl022.c | ||
3 | * | ||
4 | * A driver for the ARM PL022 PrimeCell SSP/SPI bus master. | ||
5 | * | ||
6 | * Copyright (C) 2008-2009 ST-Ericsson AB | ||
7 | * Copyright (C) 2006 STMicroelectronics Pvt. Ltd. | ||
8 | * | ||
9 | * Author: Linus Walleij <linus.walleij@stericsson.com> | ||
10 | * | ||
11 | * Initial version inspired by: | ||
12 | * linux-2.6.17-rc3-mm1/drivers/spi/pxa2xx_spi.c | ||
13 | * Initial adoption to PL022 by: | ||
14 | * Sachin Verma <sachin.verma@st.com> | ||
15 | * | ||
16 | * This program is free software; you can redistribute it and/or modify | ||
17 | * it under the terms of the GNU General Public License as published by | ||
18 | * the Free Software Foundation; either version 2 of the License, or | ||
19 | * (at your option) any later version. | ||
20 | * | ||
21 | * This program is distributed in the hope that it will be useful, | ||
22 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
23 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
24 | * GNU General Public License for more details. | ||
25 | */ | ||
26 | |||
27 | /* | ||
28 | * TODO: | ||
29 | * - add timeout on polled transfers | ||
30 | * - add generic DMA framework support | ||
31 | */ | ||
32 | |||
33 | #include <linux/init.h> | ||
34 | #include <linux/module.h> | ||
35 | #include <linux/device.h> | ||
36 | #include <linux/ioport.h> | ||
37 | #include <linux/errno.h> | ||
38 | #include <linux/interrupt.h> | ||
39 | #include <linux/spi/spi.h> | ||
40 | #include <linux/workqueue.h> | ||
41 | #include <linux/errno.h> | ||
42 | #include <linux/delay.h> | ||
43 | #include <linux/clk.h> | ||
44 | #include <linux/err.h> | ||
45 | #include <linux/amba/bus.h> | ||
46 | #include <linux/amba/pl022.h> | ||
47 | #include <linux/io.h> | ||
48 | #include <linux/delay.h> | ||
49 | |||
50 | /* | ||
51 | * This macro is used to define some register default values. | ||
52 | * reg is masked with mask, the OR:ed with an (again masked) | ||
53 | * val shifted sb steps to the left. | ||
54 | */ | ||
55 | #define SSP_WRITE_BITS(reg, val, mask, sb) \ | ||
56 | ((reg) = (((reg) & ~(mask)) | (((val)<<(sb)) & (mask)))) | ||
57 | |||
58 | /* | ||
59 | * This macro is also used to define some default values. | ||
60 | * It will just shift val by sb steps to the left and mask | ||
61 | * the result with mask. | ||
62 | */ | ||
63 | #define GEN_MASK_BITS(val, mask, sb) \ | ||
64 | (((val)<<(sb)) & (mask)) | ||
65 | |||
66 | #define DRIVE_TX 0 | ||
67 | #define DO_NOT_DRIVE_TX 1 | ||
68 | |||
69 | #define DO_NOT_QUEUE_DMA 0 | ||
70 | #define QUEUE_DMA 1 | ||
71 | |||
72 | #define RX_TRANSFER 1 | ||
73 | #define TX_TRANSFER 2 | ||
74 | |||
75 | /* | ||
76 | * Macros to access SSP Registers with their offsets | ||
77 | */ | ||
78 | #define SSP_CR0(r) (r + 0x000) | ||
79 | #define SSP_CR1(r) (r + 0x004) | ||
80 | #define SSP_DR(r) (r + 0x008) | ||
81 | #define SSP_SR(r) (r + 0x00C) | ||
82 | #define SSP_CPSR(r) (r + 0x010) | ||
83 | #define SSP_IMSC(r) (r + 0x014) | ||
84 | #define SSP_RIS(r) (r + 0x018) | ||
85 | #define SSP_MIS(r) (r + 0x01C) | ||
86 | #define SSP_ICR(r) (r + 0x020) | ||
87 | #define SSP_DMACR(r) (r + 0x024) | ||
88 | #define SSP_ITCR(r) (r + 0x080) | ||
89 | #define SSP_ITIP(r) (r + 0x084) | ||
90 | #define SSP_ITOP(r) (r + 0x088) | ||
91 | #define SSP_TDR(r) (r + 0x08C) | ||
92 | |||
93 | #define SSP_PID0(r) (r + 0xFE0) | ||
94 | #define SSP_PID1(r) (r + 0xFE4) | ||
95 | #define SSP_PID2(r) (r + 0xFE8) | ||
96 | #define SSP_PID3(r) (r + 0xFEC) | ||
97 | |||
98 | #define SSP_CID0(r) (r + 0xFF0) | ||
99 | #define SSP_CID1(r) (r + 0xFF4) | ||
100 | #define SSP_CID2(r) (r + 0xFF8) | ||
101 | #define SSP_CID3(r) (r + 0xFFC) | ||
102 | |||
103 | /* | ||
104 | * SSP Control Register 0 - SSP_CR0 | ||
105 | */ | ||
106 | #define SSP_CR0_MASK_DSS (0x1FUL << 0) | ||
107 | #define SSP_CR0_MASK_HALFDUP (0x1UL << 5) | ||
108 | #define SSP_CR0_MASK_SPO (0x1UL << 6) | ||
109 | #define SSP_CR0_MASK_SPH (0x1UL << 7) | ||
110 | #define SSP_CR0_MASK_SCR (0xFFUL << 8) | ||
111 | #define SSP_CR0_MASK_CSS (0x1FUL << 16) | ||
112 | #define SSP_CR0_MASK_FRF (0x3UL << 21) | ||
113 | |||
114 | /* | ||
115 | * SSP Control Register 0 - SSP_CR1 | ||
116 | */ | ||
117 | #define SSP_CR1_MASK_LBM (0x1UL << 0) | ||
118 | #define SSP_CR1_MASK_SSE (0x1UL << 1) | ||
119 | #define SSP_CR1_MASK_MS (0x1UL << 2) | ||
120 | #define SSP_CR1_MASK_SOD (0x1UL << 3) | ||
121 | #define SSP_CR1_MASK_RENDN (0x1UL << 4) | ||
122 | #define SSP_CR1_MASK_TENDN (0x1UL << 5) | ||
123 | #define SSP_CR1_MASK_MWAIT (0x1UL << 6) | ||
124 | #define SSP_CR1_MASK_RXIFLSEL (0x7UL << 7) | ||
125 | #define SSP_CR1_MASK_TXIFLSEL (0x7UL << 10) | ||
126 | |||
127 | /* | ||
128 | * SSP Data Register - SSP_DR | ||
129 | */ | ||
130 | #define SSP_DR_MASK_DATA 0xFFFFFFFF | ||
131 | |||
132 | /* | ||
133 | * SSP Status Register - SSP_SR | ||
134 | */ | ||
135 | #define SSP_SR_MASK_TFE (0x1UL << 0) /* Transmit FIFO empty */ | ||
136 | #define SSP_SR_MASK_TNF (0x1UL << 1) /* Transmit FIFO not full */ | ||
137 | #define SSP_SR_MASK_RNE (0x1UL << 2) /* Receive FIFO not empty */ | ||
138 | #define SSP_SR_MASK_RFF (0x1UL << 3) /* Receive FIFO full */ | ||
139 | #define SSP_SR_MASK_BSY (0x1UL << 4) /* Busy Flag */ | ||
140 | |||
141 | /* | ||
142 | * SSP Clock Prescale Register - SSP_CPSR | ||
143 | */ | ||
144 | #define SSP_CPSR_MASK_CPSDVSR (0xFFUL << 0) | ||
145 | |||
146 | /* | ||
147 | * SSP Interrupt Mask Set/Clear Register - SSP_IMSC | ||
148 | */ | ||
149 | #define SSP_IMSC_MASK_RORIM (0x1UL << 0) /* Receive Overrun Interrupt mask */ | ||
150 | #define SSP_IMSC_MASK_RTIM (0x1UL << 1) /* Receive timeout Interrupt mask */ | ||
151 | #define SSP_IMSC_MASK_RXIM (0x1UL << 2) /* Receive FIFO Interrupt mask */ | ||
152 | #define SSP_IMSC_MASK_TXIM (0x1UL << 3) /* Transmit FIFO Interrupt mask */ | ||
153 | |||
154 | /* | ||
155 | * SSP Raw Interrupt Status Register - SSP_RIS | ||
156 | */ | ||
157 | /* Receive Overrun Raw Interrupt status */ | ||
158 | #define SSP_RIS_MASK_RORRIS (0x1UL << 0) | ||
159 | /* Receive Timeout Raw Interrupt status */ | ||
160 | #define SSP_RIS_MASK_RTRIS (0x1UL << 1) | ||
161 | /* Receive FIFO Raw Interrupt status */ | ||
162 | #define SSP_RIS_MASK_RXRIS (0x1UL << 2) | ||
163 | /* Transmit FIFO Raw Interrupt status */ | ||
164 | #define SSP_RIS_MASK_TXRIS (0x1UL << 3) | ||
165 | |||
166 | /* | ||
167 | * SSP Masked Interrupt Status Register - SSP_MIS | ||
168 | */ | ||
169 | /* Receive Overrun Masked Interrupt status */ | ||
170 | #define SSP_MIS_MASK_RORMIS (0x1UL << 0) | ||
171 | /* Receive Timeout Masked Interrupt status */ | ||
172 | #define SSP_MIS_MASK_RTMIS (0x1UL << 1) | ||
173 | /* Receive FIFO Masked Interrupt status */ | ||
174 | #define SSP_MIS_MASK_RXMIS (0x1UL << 2) | ||
175 | /* Transmit FIFO Masked Interrupt status */ | ||
176 | #define SSP_MIS_MASK_TXMIS (0x1UL << 3) | ||
177 | |||
178 | /* | ||
179 | * SSP Interrupt Clear Register - SSP_ICR | ||
180 | */ | ||
181 | /* Receive Overrun Raw Clear Interrupt bit */ | ||
182 | #define SSP_ICR_MASK_RORIC (0x1UL << 0) | ||
183 | /* Receive Timeout Clear Interrupt bit */ | ||
184 | #define SSP_ICR_MASK_RTIC (0x1UL << 1) | ||
185 | |||
186 | /* | ||
187 | * SSP DMA Control Register - SSP_DMACR | ||
188 | */ | ||
189 | /* Receive DMA Enable bit */ | ||
190 | #define SSP_DMACR_MASK_RXDMAE (0x1UL << 0) | ||
191 | /* Transmit DMA Enable bit */ | ||
192 | #define SSP_DMACR_MASK_TXDMAE (0x1UL << 1) | ||
193 | |||
194 | /* | ||
195 | * SSP Integration Test control Register - SSP_ITCR | ||
196 | */ | ||
197 | #define SSP_ITCR_MASK_ITEN (0x1UL << 0) | ||
198 | #define SSP_ITCR_MASK_TESTFIFO (0x1UL << 1) | ||
199 | |||
200 | /* | ||
201 | * SSP Integration Test Input Register - SSP_ITIP | ||
202 | */ | ||
203 | #define ITIP_MASK_SSPRXD (0x1UL << 0) | ||
204 | #define ITIP_MASK_SSPFSSIN (0x1UL << 1) | ||
205 | #define ITIP_MASK_SSPCLKIN (0x1UL << 2) | ||
206 | #define ITIP_MASK_RXDMAC (0x1UL << 3) | ||
207 | #define ITIP_MASK_TXDMAC (0x1UL << 4) | ||
208 | #define ITIP_MASK_SSPTXDIN (0x1UL << 5) | ||
209 | |||
210 | /* | ||
211 | * SSP Integration Test output Register - SSP_ITOP | ||
212 | */ | ||
213 | #define ITOP_MASK_SSPTXD (0x1UL << 0) | ||
214 | #define ITOP_MASK_SSPFSSOUT (0x1UL << 1) | ||
215 | #define ITOP_MASK_SSPCLKOUT (0x1UL << 2) | ||
216 | #define ITOP_MASK_SSPOEn (0x1UL << 3) | ||
217 | #define ITOP_MASK_SSPCTLOEn (0x1UL << 4) | ||
218 | #define ITOP_MASK_RORINTR (0x1UL << 5) | ||
219 | #define ITOP_MASK_RTINTR (0x1UL << 6) | ||
220 | #define ITOP_MASK_RXINTR (0x1UL << 7) | ||
221 | #define ITOP_MASK_TXINTR (0x1UL << 8) | ||
222 | #define ITOP_MASK_INTR (0x1UL << 9) | ||
223 | #define ITOP_MASK_RXDMABREQ (0x1UL << 10) | ||
224 | #define ITOP_MASK_RXDMASREQ (0x1UL << 11) | ||
225 | #define ITOP_MASK_TXDMABREQ (0x1UL << 12) | ||
226 | #define ITOP_MASK_TXDMASREQ (0x1UL << 13) | ||
227 | |||
228 | /* | ||
229 | * SSP Test Data Register - SSP_TDR | ||
230 | */ | ||
231 | #define TDR_MASK_TESTDATA (0xFFFFFFFF) | ||
232 | |||
233 | /* | ||
234 | * Message State | ||
235 | * we use the spi_message.state (void *) pointer to | ||
236 | * hold a single state value, that's why all this | ||
237 | * (void *) casting is done here. | ||
238 | */ | ||
239 | #define STATE_START ((void *) 0) | ||
240 | #define STATE_RUNNING ((void *) 1) | ||
241 | #define STATE_DONE ((void *) 2) | ||
242 | #define STATE_ERROR ((void *) -1) | ||
243 | |||
244 | /* | ||
245 | * Queue State | ||
246 | */ | ||
247 | #define QUEUE_RUNNING (0) | ||
248 | #define QUEUE_STOPPED (1) | ||
249 | /* | ||
250 | * SSP State - Whether Enabled or Disabled | ||
251 | */ | ||
252 | #define SSP_DISABLED (0) | ||
253 | #define SSP_ENABLED (1) | ||
254 | |||
255 | /* | ||
256 | * SSP DMA State - Whether DMA Enabled or Disabled | ||
257 | */ | ||
258 | #define SSP_DMA_DISABLED (0) | ||
259 | #define SSP_DMA_ENABLED (1) | ||
260 | |||
261 | /* | ||
262 | * SSP Clock Defaults | ||
263 | */ | ||
264 | #define NMDK_SSP_DEFAULT_CLKRATE 0x2 | ||
265 | #define NMDK_SSP_DEFAULT_PRESCALE 0x40 | ||
266 | |||
267 | /* | ||
268 | * SSP Clock Parameter ranges | ||
269 | */ | ||
270 | #define CPSDVR_MIN 0x02 | ||
271 | #define CPSDVR_MAX 0xFE | ||
272 | #define SCR_MIN 0x00 | ||
273 | #define SCR_MAX 0xFF | ||
274 | |||
275 | /* | ||
276 | * SSP Interrupt related Macros | ||
277 | */ | ||
278 | #define DEFAULT_SSP_REG_IMSC 0x0UL | ||
279 | #define DISABLE_ALL_INTERRUPTS DEFAULT_SSP_REG_IMSC | ||
280 | #define ENABLE_ALL_INTERRUPTS (~DEFAULT_SSP_REG_IMSC) | ||
281 | |||
282 | #define CLEAR_ALL_INTERRUPTS 0x3 | ||
283 | |||
284 | |||
285 | /* | ||
286 | * The type of reading going on on this chip | ||
287 | */ | ||
288 | enum ssp_reading { | ||
289 | READING_NULL, | ||
290 | READING_U8, | ||
291 | READING_U16, | ||
292 | READING_U32 | ||
293 | }; | ||
294 | |||
295 | /** | ||
296 | * The type of writing going on on this chip | ||
297 | */ | ||
298 | enum ssp_writing { | ||
299 | WRITING_NULL, | ||
300 | WRITING_U8, | ||
301 | WRITING_U16, | ||
302 | WRITING_U32 | ||
303 | }; | ||
304 | |||
305 | /** | ||
306 | * struct vendor_data - vendor-specific config parameters | ||
307 | * for PL022 derivates | ||
308 | * @fifodepth: depth of FIFOs (both) | ||
309 | * @max_bpw: maximum number of bits per word | ||
310 | * @unidir: supports unidirection transfers | ||
311 | */ | ||
312 | struct vendor_data { | ||
313 | int fifodepth; | ||
314 | int max_bpw; | ||
315 | bool unidir; | ||
316 | }; | ||
317 | |||
318 | /** | ||
319 | * struct pl022 - This is the private SSP driver data structure | ||
320 | * @adev: AMBA device model hookup | ||
321 | * @phybase: The physical memory where the SSP device resides | ||
322 | * @virtbase: The virtual memory where the SSP is mapped | ||
323 | * @master: SPI framework hookup | ||
324 | * @master_info: controller-specific data from machine setup | ||
325 | * @regs: SSP controller register's virtual address | ||
326 | * @pump_messages: Work struct for scheduling work to the workqueue | ||
327 | * @lock: spinlock to syncronise access to driver data | ||
328 | * @workqueue: a workqueue on which any spi_message request is queued | ||
329 | * @busy: workqueue is busy | ||
330 | * @run: workqueue is running | ||
331 | * @pump_transfers: Tasklet used in Interrupt Transfer mode | ||
332 | * @cur_msg: Pointer to current spi_message being processed | ||
333 | * @cur_transfer: Pointer to current spi_transfer | ||
334 | * @cur_chip: pointer to current clients chip(assigned from controller_state) | ||
335 | * @tx: current position in TX buffer to be read | ||
336 | * @tx_end: end position in TX buffer to be read | ||
337 | * @rx: current position in RX buffer to be written | ||
338 | * @rx_end: end position in RX buffer to be written | ||
339 | * @readingtype: the type of read currently going on | ||
340 | * @writingtype: the type or write currently going on | ||
341 | */ | ||
342 | struct pl022 { | ||
343 | struct amba_device *adev; | ||
344 | struct vendor_data *vendor; | ||
345 | resource_size_t phybase; | ||
346 | void __iomem *virtbase; | ||
347 | struct clk *clk; | ||
348 | struct spi_master *master; | ||
349 | struct pl022_ssp_controller *master_info; | ||
350 | /* Driver message queue */ | ||
351 | struct workqueue_struct *workqueue; | ||
352 | struct work_struct pump_messages; | ||
353 | spinlock_t queue_lock; | ||
354 | struct list_head queue; | ||
355 | int busy; | ||
356 | int run; | ||
357 | /* Message transfer pump */ | ||
358 | struct tasklet_struct pump_transfers; | ||
359 | struct spi_message *cur_msg; | ||
360 | struct spi_transfer *cur_transfer; | ||
361 | struct chip_data *cur_chip; | ||
362 | void *tx; | ||
363 | void *tx_end; | ||
364 | void *rx; | ||
365 | void *rx_end; | ||
366 | enum ssp_reading read; | ||
367 | enum ssp_writing write; | ||
368 | }; | ||
369 | |||
370 | /** | ||
371 | * struct chip_data - To maintain runtime state of SSP for each client chip | ||
372 | * @cr0: Value of control register CR0 of SSP | ||
373 | * @cr1: Value of control register CR1 of SSP | ||
374 | * @dmacr: Value of DMA control Register of SSP | ||
375 | * @cpsr: Value of Clock prescale register | ||
376 | * @n_bytes: how many bytes(power of 2) reqd for a given data width of client | ||
377 | * @enable_dma: Whether to enable DMA or not | ||
378 | * @write: function ptr to be used to write when doing xfer for this chip | ||
379 | * @read: function ptr to be used to read when doing xfer for this chip | ||
380 | * @cs_control: chip select callback provided by chip | ||
381 | * @xfer_type: polling/interrupt/DMA | ||
382 | * | ||
383 | * Runtime state of the SSP controller, maintained per chip, | ||
384 | * This would be set according to the current message that would be served | ||
385 | */ | ||
386 | struct chip_data { | ||
387 | u16 cr0; | ||
388 | u16 cr1; | ||
389 | u16 dmacr; | ||
390 | u16 cpsr; | ||
391 | u8 n_bytes; | ||
392 | u8 enable_dma:1; | ||
393 | enum ssp_reading read; | ||
394 | enum ssp_writing write; | ||
395 | void (*cs_control) (u32 command); | ||
396 | int xfer_type; | ||
397 | }; | ||
398 | |||
399 | /** | ||
400 | * null_cs_control - Dummy chip select function | ||
401 | * @command: select/delect the chip | ||
402 | * | ||
403 | * If no chip select function is provided by client this is used as dummy | ||
404 | * chip select | ||
405 | */ | ||
406 | static void null_cs_control(u32 command) | ||
407 | { | ||
408 | pr_debug("pl022: dummy chip select control, CS=0x%x\n", command); | ||
409 | } | ||
410 | |||
411 | /** | ||
412 | * giveback - current spi_message is over, schedule next message and call | ||
413 | * callback of this message. Assumes that caller already | ||
414 | * set message->status; dma and pio irqs are blocked | ||
415 | * @pl022: SSP driver private data structure | ||
416 | */ | ||
417 | static void giveback(struct pl022 *pl022) | ||
418 | { | ||
419 | struct spi_transfer *last_transfer; | ||
420 | unsigned long flags; | ||
421 | struct spi_message *msg; | ||
422 | void (*curr_cs_control) (u32 command); | ||
423 | |||
424 | /* | ||
425 | * This local reference to the chip select function | ||
426 | * is needed because we set curr_chip to NULL | ||
427 | * as a step toward termininating the message. | ||
428 | */ | ||
429 | curr_cs_control = pl022->cur_chip->cs_control; | ||
430 | spin_lock_irqsave(&pl022->queue_lock, flags); | ||
431 | msg = pl022->cur_msg; | ||
432 | pl022->cur_msg = NULL; | ||
433 | pl022->cur_transfer = NULL; | ||
434 | pl022->cur_chip = NULL; | ||
435 | queue_work(pl022->workqueue, &pl022->pump_messages); | ||
436 | spin_unlock_irqrestore(&pl022->queue_lock, flags); | ||
437 | |||
438 | last_transfer = list_entry(msg->transfers.prev, | ||
439 | struct spi_transfer, | ||
440 | transfer_list); | ||
441 | |||
442 | /* Delay if requested before any change in chip select */ | ||
443 | if (last_transfer->delay_usecs) | ||
444 | /* | ||
445 | * FIXME: This runs in interrupt context. | ||
446 | * Is this really smart? | ||
447 | */ | ||
448 | udelay(last_transfer->delay_usecs); | ||
449 | |||
450 | /* | ||
451 | * Drop chip select UNLESS cs_change is true or we are returning | ||
452 | * a message with an error, or next message is for another chip | ||
453 | */ | ||
454 | if (!last_transfer->cs_change) | ||
455 | curr_cs_control(SSP_CHIP_DESELECT); | ||
456 | else { | ||
457 | struct spi_message *next_msg; | ||
458 | |||
459 | /* Holding of cs was hinted, but we need to make sure | ||
460 | * the next message is for the same chip. Don't waste | ||
461 | * time with the following tests unless this was hinted. | ||
462 | * | ||
463 | * We cannot postpone this until pump_messages, because | ||
464 | * after calling msg->complete (below) the driver that | ||
465 | * sent the current message could be unloaded, which | ||
466 | * could invalidate the cs_control() callback... | ||
467 | */ | ||
468 | |||
469 | /* get a pointer to the next message, if any */ | ||
470 | spin_lock_irqsave(&pl022->queue_lock, flags); | ||
471 | if (list_empty(&pl022->queue)) | ||
472 | next_msg = NULL; | ||
473 | else | ||
474 | next_msg = list_entry(pl022->queue.next, | ||
475 | struct spi_message, queue); | ||
476 | spin_unlock_irqrestore(&pl022->queue_lock, flags); | ||
477 | |||
478 | /* see if the next and current messages point | ||
479 | * to the same chip | ||
480 | */ | ||
481 | if (next_msg && next_msg->spi != msg->spi) | ||
482 | next_msg = NULL; | ||
483 | if (!next_msg || msg->state == STATE_ERROR) | ||
484 | curr_cs_control(SSP_CHIP_DESELECT); | ||
485 | } | ||
486 | msg->state = NULL; | ||
487 | if (msg->complete) | ||
488 | msg->complete(msg->context); | ||
489 | /* This message is completed, so let's turn off the clock! */ | ||
490 | clk_disable(pl022->clk); | ||
491 | } | ||
492 | |||
493 | /** | ||
494 | * flush - flush the FIFO to reach a clean state | ||
495 | * @pl022: SSP driver private data structure | ||
496 | */ | ||
497 | static int flush(struct pl022 *pl022) | ||
498 | { | ||
499 | unsigned long limit = loops_per_jiffy << 1; | ||
500 | |||
501 | dev_dbg(&pl022->adev->dev, "flush\n"); | ||
502 | do { | ||
503 | while (readw(SSP_SR(pl022->virtbase)) & SSP_SR_MASK_RNE) | ||
504 | readw(SSP_DR(pl022->virtbase)); | ||
505 | } while ((readw(SSP_SR(pl022->virtbase)) & SSP_SR_MASK_BSY) && limit--); | ||
506 | return limit; | ||
507 | } | ||
508 | |||
509 | /** | ||
510 | * restore_state - Load configuration of current chip | ||
511 | * @pl022: SSP driver private data structure | ||
512 | */ | ||
513 | static void restore_state(struct pl022 *pl022) | ||
514 | { | ||
515 | struct chip_data *chip = pl022->cur_chip; | ||
516 | |||
517 | writew(chip->cr0, SSP_CR0(pl022->virtbase)); | ||
518 | writew(chip->cr1, SSP_CR1(pl022->virtbase)); | ||
519 | writew(chip->dmacr, SSP_DMACR(pl022->virtbase)); | ||
520 | writew(chip->cpsr, SSP_CPSR(pl022->virtbase)); | ||
521 | writew(DISABLE_ALL_INTERRUPTS, SSP_IMSC(pl022->virtbase)); | ||
522 | writew(CLEAR_ALL_INTERRUPTS, SSP_ICR(pl022->virtbase)); | ||
523 | } | ||
524 | |||
525 | /** | ||
526 | * load_ssp_default_config - Load default configuration for SSP | ||
527 | * @pl022: SSP driver private data structure | ||
528 | */ | ||
529 | |||
530 | /* | ||
531 | * Default SSP Register Values | ||
532 | */ | ||
533 | #define DEFAULT_SSP_REG_CR0 ( \ | ||
534 | GEN_MASK_BITS(SSP_DATA_BITS_12, SSP_CR0_MASK_DSS, 0) | \ | ||
535 | GEN_MASK_BITS(SSP_MICROWIRE_CHANNEL_FULL_DUPLEX, SSP_CR0_MASK_HALFDUP, 5) | \ | ||
536 | GEN_MASK_BITS(SSP_CLK_POL_IDLE_LOW, SSP_CR0_MASK_SPO, 6) | \ | ||
537 | GEN_MASK_BITS(SSP_CLK_FALLING_EDGE, SSP_CR0_MASK_SPH, 7) | \ | ||
538 | GEN_MASK_BITS(NMDK_SSP_DEFAULT_CLKRATE, SSP_CR0_MASK_SCR, 8) | \ | ||
539 | GEN_MASK_BITS(SSP_BITS_8, SSP_CR0_MASK_CSS, 16) | \ | ||
540 | GEN_MASK_BITS(SSP_INTERFACE_MOTOROLA_SPI, SSP_CR0_MASK_FRF, 21) \ | ||
541 | ) | ||
542 | |||
543 | #define DEFAULT_SSP_REG_CR1 ( \ | ||
544 | GEN_MASK_BITS(LOOPBACK_DISABLED, SSP_CR1_MASK_LBM, 0) | \ | ||
545 | GEN_MASK_BITS(SSP_DISABLED, SSP_CR1_MASK_SSE, 1) | \ | ||
546 | GEN_MASK_BITS(SSP_MASTER, SSP_CR1_MASK_MS, 2) | \ | ||
547 | GEN_MASK_BITS(DO_NOT_DRIVE_TX, SSP_CR1_MASK_SOD, 3) | \ | ||
548 | GEN_MASK_BITS(SSP_RX_MSB, SSP_CR1_MASK_RENDN, 4) | \ | ||
549 | GEN_MASK_BITS(SSP_TX_MSB, SSP_CR1_MASK_TENDN, 5) | \ | ||
550 | GEN_MASK_BITS(SSP_MWIRE_WAIT_ZERO, SSP_CR1_MASK_MWAIT, 6) |\ | ||
551 | GEN_MASK_BITS(SSP_RX_1_OR_MORE_ELEM, SSP_CR1_MASK_RXIFLSEL, 7) | \ | ||
552 | GEN_MASK_BITS(SSP_TX_1_OR_MORE_EMPTY_LOC, SSP_CR1_MASK_TXIFLSEL, 10) \ | ||
553 | ) | ||
554 | |||
555 | #define DEFAULT_SSP_REG_CPSR ( \ | ||
556 | GEN_MASK_BITS(NMDK_SSP_DEFAULT_PRESCALE, SSP_CPSR_MASK_CPSDVSR, 0) \ | ||
557 | ) | ||
558 | |||
559 | #define DEFAULT_SSP_REG_DMACR (\ | ||
560 | GEN_MASK_BITS(SSP_DMA_DISABLED, SSP_DMACR_MASK_RXDMAE, 0) | \ | ||
561 | GEN_MASK_BITS(SSP_DMA_DISABLED, SSP_DMACR_MASK_TXDMAE, 1) \ | ||
562 | ) | ||
563 | |||
564 | |||
565 | static void load_ssp_default_config(struct pl022 *pl022) | ||
566 | { | ||
567 | writew(DEFAULT_SSP_REG_CR0, SSP_CR0(pl022->virtbase)); | ||
568 | writew(DEFAULT_SSP_REG_CR1, SSP_CR1(pl022->virtbase)); | ||
569 | writew(DEFAULT_SSP_REG_DMACR, SSP_DMACR(pl022->virtbase)); | ||
570 | writew(DEFAULT_SSP_REG_CPSR, SSP_CPSR(pl022->virtbase)); | ||
571 | writew(DISABLE_ALL_INTERRUPTS, SSP_IMSC(pl022->virtbase)); | ||
572 | writew(CLEAR_ALL_INTERRUPTS, SSP_ICR(pl022->virtbase)); | ||
573 | } | ||
574 | |||
575 | /** | ||
576 | * This will write to TX and read from RX according to the parameters | ||
577 | * set in pl022. | ||
578 | */ | ||
579 | static void readwriter(struct pl022 *pl022) | ||
580 | { | ||
581 | |||
582 | /* | ||
583 | * The FIFO depth is different inbetween primecell variants. | ||
584 | * I believe filling in too much in the FIFO might cause | ||
585 | * errons in 8bit wide transfers on ARM variants (just 8 words | ||
586 | * FIFO, means only 8x8 = 64 bits in FIFO) at least. | ||
587 | * | ||
588 | * FIXME: currently we have no logic to account for this. | ||
589 | * perhaps there is even something broken in HW regarding | ||
590 | * 8bit transfers (it doesn't fail on 16bit) so this needs | ||
591 | * more investigation... | ||
592 | */ | ||
593 | dev_dbg(&pl022->adev->dev, | ||
594 | "%s, rx: %p, rxend: %p, tx: %p, txend: %p\n", | ||
595 | __func__, pl022->rx, pl022->rx_end, pl022->tx, pl022->tx_end); | ||
596 | |||
597 | /* Read as much as you can */ | ||
598 | while ((readw(SSP_SR(pl022->virtbase)) & SSP_SR_MASK_RNE) | ||
599 | && (pl022->rx < pl022->rx_end)) { | ||
600 | switch (pl022->read) { | ||
601 | case READING_NULL: | ||
602 | readw(SSP_DR(pl022->virtbase)); | ||
603 | break; | ||
604 | case READING_U8: | ||
605 | *(u8 *) (pl022->rx) = | ||
606 | readw(SSP_DR(pl022->virtbase)) & 0xFFU; | ||
607 | break; | ||
608 | case READING_U16: | ||
609 | *(u16 *) (pl022->rx) = | ||
610 | (u16) readw(SSP_DR(pl022->virtbase)); | ||
611 | break; | ||
612 | case READING_U32: | ||
613 | *(u32 *) (pl022->rx) = | ||
614 | readl(SSP_DR(pl022->virtbase)); | ||
615 | break; | ||
616 | } | ||
617 | pl022->rx += (pl022->cur_chip->n_bytes); | ||
618 | } | ||
619 | /* | ||
620 | * Write as much as you can, while keeping an eye on the RX FIFO! | ||
621 | */ | ||
622 | while ((readw(SSP_SR(pl022->virtbase)) & SSP_SR_MASK_TNF) | ||
623 | && (pl022->tx < pl022->tx_end)) { | ||
624 | switch (pl022->write) { | ||
625 | case WRITING_NULL: | ||
626 | writew(0x0, SSP_DR(pl022->virtbase)); | ||
627 | break; | ||
628 | case WRITING_U8: | ||
629 | writew(*(u8 *) (pl022->tx), SSP_DR(pl022->virtbase)); | ||
630 | break; | ||
631 | case WRITING_U16: | ||
632 | writew((*(u16 *) (pl022->tx)), SSP_DR(pl022->virtbase)); | ||
633 | break; | ||
634 | case WRITING_U32: | ||
635 | writel(*(u32 *) (pl022->tx), SSP_DR(pl022->virtbase)); | ||
636 | break; | ||
637 | } | ||
638 | pl022->tx += (pl022->cur_chip->n_bytes); | ||
639 | /* | ||
640 | * This inner reader takes care of things appearing in the RX | ||
641 | * FIFO as we're transmitting. This will happen a lot since the | ||
642 | * clock starts running when you put things into the TX FIFO, | ||
643 | * and then things are continously clocked into the RX FIFO. | ||
644 | */ | ||
645 | while ((readw(SSP_SR(pl022->virtbase)) & SSP_SR_MASK_RNE) | ||
646 | && (pl022->rx < pl022->rx_end)) { | ||
647 | switch (pl022->read) { | ||
648 | case READING_NULL: | ||
649 | readw(SSP_DR(pl022->virtbase)); | ||
650 | break; | ||
651 | case READING_U8: | ||
652 | *(u8 *) (pl022->rx) = | ||
653 | readw(SSP_DR(pl022->virtbase)) & 0xFFU; | ||
654 | break; | ||
655 | case READING_U16: | ||
656 | *(u16 *) (pl022->rx) = | ||
657 | (u16) readw(SSP_DR(pl022->virtbase)); | ||
658 | break; | ||
659 | case READING_U32: | ||
660 | *(u32 *) (pl022->rx) = | ||
661 | readl(SSP_DR(pl022->virtbase)); | ||
662 | break; | ||
663 | } | ||
664 | pl022->rx += (pl022->cur_chip->n_bytes); | ||
665 | } | ||
666 | } | ||
667 | /* | ||
668 | * When we exit here the TX FIFO should be full and the RX FIFO | ||
669 | * should be empty | ||
670 | */ | ||
671 | } | ||
672 | |||
673 | |||
674 | /** | ||
675 | * next_transfer - Move to the Next transfer in the current spi message | ||
676 | * @pl022: SSP driver private data structure | ||
677 | * | ||
678 | * This function moves though the linked list of spi transfers in the | ||
679 | * current spi message and returns with the state of current spi | ||
680 | * message i.e whether its last transfer is done(STATE_DONE) or | ||
681 | * Next transfer is ready(STATE_RUNNING) | ||
682 | */ | ||
683 | static void *next_transfer(struct pl022 *pl022) | ||
684 | { | ||
685 | struct spi_message *msg = pl022->cur_msg; | ||
686 | struct spi_transfer *trans = pl022->cur_transfer; | ||
687 | |||
688 | /* Move to next transfer */ | ||
689 | if (trans->transfer_list.next != &msg->transfers) { | ||
690 | pl022->cur_transfer = | ||
691 | list_entry(trans->transfer_list.next, | ||
692 | struct spi_transfer, transfer_list); | ||
693 | return STATE_RUNNING; | ||
694 | } | ||
695 | return STATE_DONE; | ||
696 | } | ||
697 | /** | ||
698 | * pl022_interrupt_handler - Interrupt handler for SSP controller | ||
699 | * | ||
700 | * This function handles interrupts generated for an interrupt based transfer. | ||
701 | * If a receive overrun (ROR) interrupt is there then we disable SSP, flag the | ||
702 | * current message's state as STATE_ERROR and schedule the tasklet | ||
703 | * pump_transfers which will do the postprocessing of the current message by | ||
704 | * calling giveback(). Otherwise it reads data from RX FIFO till there is no | ||
705 | * more data, and writes data in TX FIFO till it is not full. If we complete | ||
706 | * the transfer we move to the next transfer and schedule the tasklet. | ||
707 | */ | ||
708 | static irqreturn_t pl022_interrupt_handler(int irq, void *dev_id) | ||
709 | { | ||
710 | struct pl022 *pl022 = dev_id; | ||
711 | struct spi_message *msg = pl022->cur_msg; | ||
712 | u16 irq_status = 0; | ||
713 | u16 flag = 0; | ||
714 | |||
715 | if (unlikely(!msg)) { | ||
716 | dev_err(&pl022->adev->dev, | ||
717 | "bad message state in interrupt handler"); | ||
718 | /* Never fail */ | ||
719 | return IRQ_HANDLED; | ||
720 | } | ||
721 | |||
722 | /* Read the Interrupt Status Register */ | ||
723 | irq_status = readw(SSP_MIS(pl022->virtbase)); | ||
724 | |||
725 | if (unlikely(!irq_status)) | ||
726 | return IRQ_NONE; | ||
727 | |||
728 | /* This handles the error code interrupts */ | ||
729 | if (unlikely(irq_status & SSP_MIS_MASK_RORMIS)) { | ||
730 | /* | ||
731 | * Overrun interrupt - bail out since our Data has been | ||
732 | * corrupted | ||
733 | */ | ||
734 | dev_err(&pl022->adev->dev, | ||
735 | "FIFO overrun\n"); | ||
736 | if (readw(SSP_SR(pl022->virtbase)) & SSP_SR_MASK_RFF) | ||
737 | dev_err(&pl022->adev->dev, | ||
738 | "RXFIFO is full\n"); | ||
739 | if (readw(SSP_SR(pl022->virtbase)) & SSP_SR_MASK_TNF) | ||
740 | dev_err(&pl022->adev->dev, | ||
741 | "TXFIFO is full\n"); | ||
742 | |||
743 | /* | ||
744 | * Disable and clear interrupts, disable SSP, | ||
745 | * mark message with bad status so it can be | ||
746 | * retried. | ||
747 | */ | ||
748 | writew(DISABLE_ALL_INTERRUPTS, | ||
749 | SSP_IMSC(pl022->virtbase)); | ||
750 | writew(CLEAR_ALL_INTERRUPTS, SSP_ICR(pl022->virtbase)); | ||
751 | writew((readw(SSP_CR1(pl022->virtbase)) & | ||
752 | (~SSP_CR1_MASK_SSE)), SSP_CR1(pl022->virtbase)); | ||
753 | msg->state = STATE_ERROR; | ||
754 | |||
755 | /* Schedule message queue handler */ | ||
756 | tasklet_schedule(&pl022->pump_transfers); | ||
757 | return IRQ_HANDLED; | ||
758 | } | ||
759 | |||
760 | readwriter(pl022); | ||
761 | |||
762 | if ((pl022->tx == pl022->tx_end) && (flag == 0)) { | ||
763 | flag = 1; | ||
764 | /* Disable Transmit interrupt */ | ||
765 | writew(readw(SSP_IMSC(pl022->virtbase)) & | ||
766 | (~SSP_IMSC_MASK_TXIM), | ||
767 | SSP_IMSC(pl022->virtbase)); | ||
768 | } | ||
769 | |||
770 | /* | ||
771 | * Since all transactions must write as much as shall be read, | ||
772 | * we can conclude the entire transaction once RX is complete. | ||
773 | * At this point, all TX will always be finished. | ||
774 | */ | ||
775 | if (pl022->rx >= pl022->rx_end) { | ||
776 | writew(DISABLE_ALL_INTERRUPTS, | ||
777 | SSP_IMSC(pl022->virtbase)); | ||
778 | writew(CLEAR_ALL_INTERRUPTS, SSP_ICR(pl022->virtbase)); | ||
779 | if (unlikely(pl022->rx > pl022->rx_end)) { | ||
780 | dev_warn(&pl022->adev->dev, "read %u surplus " | ||
781 | "bytes (did you request an odd " | ||
782 | "number of bytes on a 16bit bus?)\n", | ||
783 | (u32) (pl022->rx - pl022->rx_end)); | ||
784 | } | ||
785 | /* Update total bytes transfered */ | ||
786 | msg->actual_length += pl022->cur_transfer->len; | ||
787 | if (pl022->cur_transfer->cs_change) | ||
788 | pl022->cur_chip-> | ||
789 | cs_control(SSP_CHIP_DESELECT); | ||
790 | /* Move to next transfer */ | ||
791 | msg->state = next_transfer(pl022); | ||
792 | tasklet_schedule(&pl022->pump_transfers); | ||
793 | return IRQ_HANDLED; | ||
794 | } | ||
795 | |||
796 | return IRQ_HANDLED; | ||
797 | } | ||
798 | |||
799 | /** | ||
800 | * This sets up the pointers to memory for the next message to | ||
801 | * send out on the SPI bus. | ||
802 | */ | ||
803 | static int set_up_next_transfer(struct pl022 *pl022, | ||
804 | struct spi_transfer *transfer) | ||
805 | { | ||
806 | int residue; | ||
807 | |||
808 | /* Sanity check the message for this bus width */ | ||
809 | residue = pl022->cur_transfer->len % pl022->cur_chip->n_bytes; | ||
810 | if (unlikely(residue != 0)) { | ||
811 | dev_err(&pl022->adev->dev, | ||
812 | "message of %u bytes to transmit but the current " | ||
813 | "chip bus has a data width of %u bytes!\n", | ||
814 | pl022->cur_transfer->len, | ||
815 | pl022->cur_chip->n_bytes); | ||
816 | dev_err(&pl022->adev->dev, "skipping this message\n"); | ||
817 | return -EIO; | ||
818 | } | ||
819 | pl022->tx = (void *)transfer->tx_buf; | ||
820 | pl022->tx_end = pl022->tx + pl022->cur_transfer->len; | ||
821 | pl022->rx = (void *)transfer->rx_buf; | ||
822 | pl022->rx_end = pl022->rx + pl022->cur_transfer->len; | ||
823 | pl022->write = | ||
824 | pl022->tx ? pl022->cur_chip->write : WRITING_NULL; | ||
825 | pl022->read = pl022->rx ? pl022->cur_chip->read : READING_NULL; | ||
826 | return 0; | ||
827 | } | ||
828 | |||
829 | /** | ||
830 | * pump_transfers - Tasklet function which schedules next interrupt transfer | ||
831 | * when running in interrupt transfer mode. | ||
832 | * @data: SSP driver private data structure | ||
833 | * | ||
834 | */ | ||
835 | static void pump_transfers(unsigned long data) | ||
836 | { | ||
837 | struct pl022 *pl022 = (struct pl022 *) data; | ||
838 | struct spi_message *message = NULL; | ||
839 | struct spi_transfer *transfer = NULL; | ||
840 | struct spi_transfer *previous = NULL; | ||
841 | |||
842 | /* Get current state information */ | ||
843 | message = pl022->cur_msg; | ||
844 | transfer = pl022->cur_transfer; | ||
845 | |||
846 | /* Handle for abort */ | ||
847 | if (message->state == STATE_ERROR) { | ||
848 | message->status = -EIO; | ||
849 | giveback(pl022); | ||
850 | return; | ||
851 | } | ||
852 | |||
853 | /* Handle end of message */ | ||
854 | if (message->state == STATE_DONE) { | ||
855 | message->status = 0; | ||
856 | giveback(pl022); | ||
857 | return; | ||
858 | } | ||
859 | |||
860 | /* Delay if requested at end of transfer before CS change */ | ||
861 | if (message->state == STATE_RUNNING) { | ||
862 | previous = list_entry(transfer->transfer_list.prev, | ||
863 | struct spi_transfer, | ||
864 | transfer_list); | ||
865 | if (previous->delay_usecs) | ||
866 | /* | ||
867 | * FIXME: This runs in interrupt context. | ||
868 | * Is this really smart? | ||
869 | */ | ||
870 | udelay(previous->delay_usecs); | ||
871 | |||
872 | /* Drop chip select only if cs_change is requested */ | ||
873 | if (previous->cs_change) | ||
874 | pl022->cur_chip->cs_control(SSP_CHIP_SELECT); | ||
875 | } else { | ||
876 | /* STATE_START */ | ||
877 | message->state = STATE_RUNNING; | ||
878 | } | ||
879 | |||
880 | if (set_up_next_transfer(pl022, transfer)) { | ||
881 | message->state = STATE_ERROR; | ||
882 | message->status = -EIO; | ||
883 | giveback(pl022); | ||
884 | return; | ||
885 | } | ||
886 | /* Flush the FIFOs and let's go! */ | ||
887 | flush(pl022); | ||
888 | writew(ENABLE_ALL_INTERRUPTS, SSP_IMSC(pl022->virtbase)); | ||
889 | } | ||
890 | |||
891 | /** | ||
892 | * NOT IMPLEMENTED | ||
893 | * configure_dma - It configures the DMA pipes for DMA transfers | ||
894 | * @data: SSP driver's private data structure | ||
895 | * | ||
896 | */ | ||
897 | static int configure_dma(void *data) | ||
898 | { | ||
899 | struct pl022 *pl022 = data; | ||
900 | dev_dbg(&pl022->adev->dev, "configure DMA\n"); | ||
901 | return -ENOTSUPP; | ||
902 | } | ||
903 | |||
904 | /** | ||
905 | * do_dma_transfer - It handles transfers of the current message | ||
906 | * if it is DMA xfer. | ||
907 | * NOT FULLY IMPLEMENTED | ||
908 | * @data: SSP driver's private data structure | ||
909 | */ | ||
910 | static void do_dma_transfer(void *data) | ||
911 | { | ||
912 | struct pl022 *pl022 = data; | ||
913 | |||
914 | if (configure_dma(data)) { | ||
915 | dev_dbg(&pl022->adev->dev, "configuration of DMA Failed!\n"); | ||
916 | goto err_config_dma; | ||
917 | } | ||
918 | |||
919 | /* TODO: Implememt DMA setup of pipes here */ | ||
920 | |||
921 | /* Enable target chip, set up transfer */ | ||
922 | pl022->cur_chip->cs_control(SSP_CHIP_SELECT); | ||
923 | if (set_up_next_transfer(pl022, pl022->cur_transfer)) { | ||
924 | /* Error path */ | ||
925 | pl022->cur_msg->state = STATE_ERROR; | ||
926 | pl022->cur_msg->status = -EIO; | ||
927 | giveback(pl022); | ||
928 | return; | ||
929 | } | ||
930 | /* Enable SSP */ | ||
931 | writew((readw(SSP_CR1(pl022->virtbase)) | SSP_CR1_MASK_SSE), | ||
932 | SSP_CR1(pl022->virtbase)); | ||
933 | |||
934 | /* TODO: Enable the DMA transfer here */ | ||
935 | return; | ||
936 | |||
937 | err_config_dma: | ||
938 | pl022->cur_msg->state = STATE_ERROR; | ||
939 | pl022->cur_msg->status = -EIO; | ||
940 | giveback(pl022); | ||
941 | return; | ||
942 | } | ||
943 | |||
944 | static void do_interrupt_transfer(void *data) | ||
945 | { | ||
946 | struct pl022 *pl022 = data; | ||
947 | |||
948 | /* Enable target chip */ | ||
949 | pl022->cur_chip->cs_control(SSP_CHIP_SELECT); | ||
950 | if (set_up_next_transfer(pl022, pl022->cur_transfer)) { | ||
951 | /* Error path */ | ||
952 | pl022->cur_msg->state = STATE_ERROR; | ||
953 | pl022->cur_msg->status = -EIO; | ||
954 | giveback(pl022); | ||
955 | return; | ||
956 | } | ||
957 | /* Enable SSP, turn on interrupts */ | ||
958 | writew((readw(SSP_CR1(pl022->virtbase)) | SSP_CR1_MASK_SSE), | ||
959 | SSP_CR1(pl022->virtbase)); | ||
960 | writew(ENABLE_ALL_INTERRUPTS, SSP_IMSC(pl022->virtbase)); | ||
961 | } | ||
962 | |||
963 | static void do_polling_transfer(void *data) | ||
964 | { | ||
965 | struct pl022 *pl022 = data; | ||
966 | struct spi_message *message = NULL; | ||
967 | struct spi_transfer *transfer = NULL; | ||
968 | struct spi_transfer *previous = NULL; | ||
969 | struct chip_data *chip; | ||
970 | |||
971 | chip = pl022->cur_chip; | ||
972 | message = pl022->cur_msg; | ||
973 | |||
974 | while (message->state != STATE_DONE) { | ||
975 | /* Handle for abort */ | ||
976 | if (message->state == STATE_ERROR) | ||
977 | break; | ||
978 | transfer = pl022->cur_transfer; | ||
979 | |||
980 | /* Delay if requested at end of transfer */ | ||
981 | if (message->state == STATE_RUNNING) { | ||
982 | previous = | ||
983 | list_entry(transfer->transfer_list.prev, | ||
984 | struct spi_transfer, transfer_list); | ||
985 | if (previous->delay_usecs) | ||
986 | udelay(previous->delay_usecs); | ||
987 | if (previous->cs_change) | ||
988 | pl022->cur_chip->cs_control(SSP_CHIP_SELECT); | ||
989 | } else { | ||
990 | /* STATE_START */ | ||
991 | message->state = STATE_RUNNING; | ||
992 | pl022->cur_chip->cs_control(SSP_CHIP_SELECT); | ||
993 | } | ||
994 | |||
995 | /* Configuration Changing Per Transfer */ | ||
996 | if (set_up_next_transfer(pl022, transfer)) { | ||
997 | /* Error path */ | ||
998 | message->state = STATE_ERROR; | ||
999 | break; | ||
1000 | } | ||
1001 | /* Flush FIFOs and enable SSP */ | ||
1002 | flush(pl022); | ||
1003 | writew((readw(SSP_CR1(pl022->virtbase)) | SSP_CR1_MASK_SSE), | ||
1004 | SSP_CR1(pl022->virtbase)); | ||
1005 | |||
1006 | dev_dbg(&pl022->adev->dev, "POLLING TRANSFER ONGOING ... \n"); | ||
1007 | /* FIXME: insert a timeout so we don't hang here indefinately */ | ||
1008 | while (pl022->tx < pl022->tx_end || pl022->rx < pl022->rx_end) | ||
1009 | readwriter(pl022); | ||
1010 | |||
1011 | /* Update total byte transfered */ | ||
1012 | message->actual_length += pl022->cur_transfer->len; | ||
1013 | if (pl022->cur_transfer->cs_change) | ||
1014 | pl022->cur_chip->cs_control(SSP_CHIP_DESELECT); | ||
1015 | /* Move to next transfer */ | ||
1016 | message->state = next_transfer(pl022); | ||
1017 | } | ||
1018 | |||
1019 | /* Handle end of message */ | ||
1020 | if (message->state == STATE_DONE) | ||
1021 | message->status = 0; | ||
1022 | else | ||
1023 | message->status = -EIO; | ||
1024 | |||
1025 | giveback(pl022); | ||
1026 | return; | ||
1027 | } | ||
1028 | |||
1029 | /** | ||
1030 | * pump_messages - Workqueue function which processes spi message queue | ||
1031 | * @data: pointer to private data of SSP driver | ||
1032 | * | ||
1033 | * This function checks if there is any spi message in the queue that | ||
1034 | * needs processing and delegate control to appropriate function | ||
1035 | * do_polling_transfer()/do_interrupt_transfer()/do_dma_transfer() | ||
1036 | * based on the kind of the transfer | ||
1037 | * | ||
1038 | */ | ||
1039 | static void pump_messages(struct work_struct *work) | ||
1040 | { | ||
1041 | struct pl022 *pl022 = | ||
1042 | container_of(work, struct pl022, pump_messages); | ||
1043 | unsigned long flags; | ||
1044 | |||
1045 | /* Lock queue and check for queue work */ | ||
1046 | spin_lock_irqsave(&pl022->queue_lock, flags); | ||
1047 | if (list_empty(&pl022->queue) || pl022->run == QUEUE_STOPPED) { | ||
1048 | pl022->busy = 0; | ||
1049 | spin_unlock_irqrestore(&pl022->queue_lock, flags); | ||
1050 | return; | ||
1051 | } | ||
1052 | /* Make sure we are not already running a message */ | ||
1053 | if (pl022->cur_msg) { | ||
1054 | spin_unlock_irqrestore(&pl022->queue_lock, flags); | ||
1055 | return; | ||
1056 | } | ||
1057 | /* Extract head of queue */ | ||
1058 | pl022->cur_msg = | ||
1059 | list_entry(pl022->queue.next, struct spi_message, queue); | ||
1060 | |||
1061 | list_del_init(&pl022->cur_msg->queue); | ||
1062 | pl022->busy = 1; | ||
1063 | spin_unlock_irqrestore(&pl022->queue_lock, flags); | ||
1064 | |||
1065 | /* Initial message state */ | ||
1066 | pl022->cur_msg->state = STATE_START; | ||
1067 | pl022->cur_transfer = list_entry(pl022->cur_msg->transfers.next, | ||
1068 | struct spi_transfer, | ||
1069 | transfer_list); | ||
1070 | |||
1071 | /* Setup the SPI using the per chip configuration */ | ||
1072 | pl022->cur_chip = spi_get_ctldata(pl022->cur_msg->spi); | ||
1073 | /* | ||
1074 | * We enable the clock here, then the clock will be disabled when | ||
1075 | * giveback() is called in each method (poll/interrupt/DMA) | ||
1076 | */ | ||
1077 | clk_enable(pl022->clk); | ||
1078 | restore_state(pl022); | ||
1079 | flush(pl022); | ||
1080 | |||
1081 | if (pl022->cur_chip->xfer_type == POLLING_TRANSFER) | ||
1082 | do_polling_transfer(pl022); | ||
1083 | else if (pl022->cur_chip->xfer_type == INTERRUPT_TRANSFER) | ||
1084 | do_interrupt_transfer(pl022); | ||
1085 | else | ||
1086 | do_dma_transfer(pl022); | ||
1087 | } | ||
1088 | |||
1089 | |||
1090 | static int __init init_queue(struct pl022 *pl022) | ||
1091 | { | ||
1092 | INIT_LIST_HEAD(&pl022->queue); | ||
1093 | spin_lock_init(&pl022->queue_lock); | ||
1094 | |||
1095 | pl022->run = QUEUE_STOPPED; | ||
1096 | pl022->busy = 0; | ||
1097 | |||
1098 | tasklet_init(&pl022->pump_transfers, | ||
1099 | pump_transfers, (unsigned long)pl022); | ||
1100 | |||
1101 | INIT_WORK(&pl022->pump_messages, pump_messages); | ||
1102 | pl022->workqueue = create_singlethread_workqueue( | ||
1103 | dev_name(pl022->master->dev.parent)); | ||
1104 | if (pl022->workqueue == NULL) | ||
1105 | return -EBUSY; | ||
1106 | |||
1107 | return 0; | ||
1108 | } | ||
1109 | |||
1110 | |||
1111 | static int start_queue(struct pl022 *pl022) | ||
1112 | { | ||
1113 | unsigned long flags; | ||
1114 | |||
1115 | spin_lock_irqsave(&pl022->queue_lock, flags); | ||
1116 | |||
1117 | if (pl022->run == QUEUE_RUNNING || pl022->busy) { | ||
1118 | spin_unlock_irqrestore(&pl022->queue_lock, flags); | ||
1119 | return -EBUSY; | ||
1120 | } | ||
1121 | |||
1122 | pl022->run = QUEUE_RUNNING; | ||
1123 | pl022->cur_msg = NULL; | ||
1124 | pl022->cur_transfer = NULL; | ||
1125 | pl022->cur_chip = NULL; | ||
1126 | spin_unlock_irqrestore(&pl022->queue_lock, flags); | ||
1127 | |||
1128 | queue_work(pl022->workqueue, &pl022->pump_messages); | ||
1129 | |||
1130 | return 0; | ||
1131 | } | ||
1132 | |||
1133 | |||
1134 | static int stop_queue(struct pl022 *pl022) | ||
1135 | { | ||
1136 | unsigned long flags; | ||
1137 | unsigned limit = 500; | ||
1138 | int status = 0; | ||
1139 | |||
1140 | spin_lock_irqsave(&pl022->queue_lock, flags); | ||
1141 | |||
1142 | /* This is a bit lame, but is optimized for the common execution path. | ||
1143 | * A wait_queue on the pl022->busy could be used, but then the common | ||
1144 | * execution path (pump_messages) would be required to call wake_up or | ||
1145 | * friends on every SPI message. Do this instead */ | ||
1146 | pl022->run = QUEUE_STOPPED; | ||
1147 | while (!list_empty(&pl022->queue) && pl022->busy && limit--) { | ||
1148 | spin_unlock_irqrestore(&pl022->queue_lock, flags); | ||
1149 | msleep(10); | ||
1150 | spin_lock_irqsave(&pl022->queue_lock, flags); | ||
1151 | } | ||
1152 | |||
1153 | if (!list_empty(&pl022->queue) || pl022->busy) | ||
1154 | status = -EBUSY; | ||
1155 | |||
1156 | spin_unlock_irqrestore(&pl022->queue_lock, flags); | ||
1157 | |||
1158 | return status; | ||
1159 | } | ||
1160 | |||
1161 | static int destroy_queue(struct pl022 *pl022) | ||
1162 | { | ||
1163 | int status; | ||
1164 | |||
1165 | status = stop_queue(pl022); | ||
1166 | /* we are unloading the module or failing to load (only two calls | ||
1167 | * to this routine), and neither call can handle a return value. | ||
1168 | * However, destroy_workqueue calls flush_workqueue, and that will | ||
1169 | * block until all work is done. If the reason that stop_queue | ||
1170 | * timed out is that the work will never finish, then it does no | ||
1171 | * good to call destroy_workqueue, so return anyway. */ | ||
1172 | if (status != 0) | ||
1173 | return status; | ||
1174 | |||
1175 | destroy_workqueue(pl022->workqueue); | ||
1176 | |||
1177 | return 0; | ||
1178 | } | ||
1179 | |||
1180 | static int verify_controller_parameters(struct pl022 *pl022, | ||
1181 | struct pl022_config_chip *chip_info) | ||
1182 | { | ||
1183 | if ((chip_info->lbm != LOOPBACK_ENABLED) | ||
1184 | && (chip_info->lbm != LOOPBACK_DISABLED)) { | ||
1185 | dev_err(chip_info->dev, | ||
1186 | "loopback Mode is configured incorrectly\n"); | ||
1187 | return -EINVAL; | ||
1188 | } | ||
1189 | if ((chip_info->iface < SSP_INTERFACE_MOTOROLA_SPI) | ||
1190 | || (chip_info->iface > SSP_INTERFACE_UNIDIRECTIONAL)) { | ||
1191 | dev_err(chip_info->dev, | ||
1192 | "interface is configured incorrectly\n"); | ||
1193 | return -EINVAL; | ||
1194 | } | ||
1195 | if ((chip_info->iface == SSP_INTERFACE_UNIDIRECTIONAL) && | ||
1196 | (!pl022->vendor->unidir)) { | ||
1197 | dev_err(chip_info->dev, | ||
1198 | "unidirectional mode not supported in this " | ||
1199 | "hardware version\n"); | ||
1200 | return -EINVAL; | ||
1201 | } | ||
1202 | if ((chip_info->hierarchy != SSP_MASTER) | ||
1203 | && (chip_info->hierarchy != SSP_SLAVE)) { | ||
1204 | dev_err(chip_info->dev, | ||
1205 | "hierarchy is configured incorrectly\n"); | ||
1206 | return -EINVAL; | ||
1207 | } | ||
1208 | if (((chip_info->clk_freq).cpsdvsr < CPSDVR_MIN) | ||
1209 | || ((chip_info->clk_freq).cpsdvsr > CPSDVR_MAX)) { | ||
1210 | dev_err(chip_info->dev, | ||
1211 | "cpsdvsr is configured incorrectly\n"); | ||
1212 | return -EINVAL; | ||
1213 | } | ||
1214 | if ((chip_info->endian_rx != SSP_RX_MSB) | ||
1215 | && (chip_info->endian_rx != SSP_RX_LSB)) { | ||
1216 | dev_err(chip_info->dev, | ||
1217 | "RX FIFO endianess is configured incorrectly\n"); | ||
1218 | return -EINVAL; | ||
1219 | } | ||
1220 | if ((chip_info->endian_tx != SSP_TX_MSB) | ||
1221 | && (chip_info->endian_tx != SSP_TX_LSB)) { | ||
1222 | dev_err(chip_info->dev, | ||
1223 | "TX FIFO endianess is configured incorrectly\n"); | ||
1224 | return -EINVAL; | ||
1225 | } | ||
1226 | if ((chip_info->data_size < SSP_DATA_BITS_4) | ||
1227 | || (chip_info->data_size > SSP_DATA_BITS_32)) { | ||
1228 | dev_err(chip_info->dev, | ||
1229 | "DATA Size is configured incorrectly\n"); | ||
1230 | return -EINVAL; | ||
1231 | } | ||
1232 | if ((chip_info->com_mode != INTERRUPT_TRANSFER) | ||
1233 | && (chip_info->com_mode != DMA_TRANSFER) | ||
1234 | && (chip_info->com_mode != POLLING_TRANSFER)) { | ||
1235 | dev_err(chip_info->dev, | ||
1236 | "Communication mode is configured incorrectly\n"); | ||
1237 | return -EINVAL; | ||
1238 | } | ||
1239 | if ((chip_info->rx_lev_trig < SSP_RX_1_OR_MORE_ELEM) | ||
1240 | || (chip_info->rx_lev_trig > SSP_RX_32_OR_MORE_ELEM)) { | ||
1241 | dev_err(chip_info->dev, | ||
1242 | "RX FIFO Trigger Level is configured incorrectly\n"); | ||
1243 | return -EINVAL; | ||
1244 | } | ||
1245 | if ((chip_info->tx_lev_trig < SSP_TX_1_OR_MORE_EMPTY_LOC) | ||
1246 | || (chip_info->tx_lev_trig > SSP_TX_32_OR_MORE_EMPTY_LOC)) { | ||
1247 | dev_err(chip_info->dev, | ||
1248 | "TX FIFO Trigger Level is configured incorrectly\n"); | ||
1249 | return -EINVAL; | ||
1250 | } | ||
1251 | if (chip_info->iface == SSP_INTERFACE_MOTOROLA_SPI) { | ||
1252 | if ((chip_info->clk_phase != SSP_CLK_RISING_EDGE) | ||
1253 | && (chip_info->clk_phase != SSP_CLK_FALLING_EDGE)) { | ||
1254 | dev_err(chip_info->dev, | ||
1255 | "Clock Phase is configured incorrectly\n"); | ||
1256 | return -EINVAL; | ||
1257 | } | ||
1258 | if ((chip_info->clk_pol != SSP_CLK_POL_IDLE_LOW) | ||
1259 | && (chip_info->clk_pol != SSP_CLK_POL_IDLE_HIGH)) { | ||
1260 | dev_err(chip_info->dev, | ||
1261 | "Clock Polarity is configured incorrectly\n"); | ||
1262 | return -EINVAL; | ||
1263 | } | ||
1264 | } | ||
1265 | if (chip_info->iface == SSP_INTERFACE_NATIONAL_MICROWIRE) { | ||
1266 | if ((chip_info->ctrl_len < SSP_BITS_4) | ||
1267 | || (chip_info->ctrl_len > SSP_BITS_32)) { | ||
1268 | dev_err(chip_info->dev, | ||
1269 | "CTRL LEN is configured incorrectly\n"); | ||
1270 | return -EINVAL; | ||
1271 | } | ||
1272 | if ((chip_info->wait_state != SSP_MWIRE_WAIT_ZERO) | ||
1273 | && (chip_info->wait_state != SSP_MWIRE_WAIT_ONE)) { | ||
1274 | dev_err(chip_info->dev, | ||
1275 | "Wait State is configured incorrectly\n"); | ||
1276 | return -EINVAL; | ||
1277 | } | ||
1278 | if ((chip_info->duplex != SSP_MICROWIRE_CHANNEL_FULL_DUPLEX) | ||
1279 | && (chip_info->duplex != | ||
1280 | SSP_MICROWIRE_CHANNEL_HALF_DUPLEX)) { | ||
1281 | dev_err(chip_info->dev, | ||
1282 | "DUPLEX is configured incorrectly\n"); | ||
1283 | return -EINVAL; | ||
1284 | } | ||
1285 | } | ||
1286 | if (chip_info->cs_control == NULL) { | ||
1287 | dev_warn(chip_info->dev, | ||
1288 | "Chip Select Function is NULL for this chip\n"); | ||
1289 | chip_info->cs_control = null_cs_control; | ||
1290 | } | ||
1291 | return 0; | ||
1292 | } | ||
1293 | |||
1294 | /** | ||
1295 | * pl022_transfer - transfer function registered to SPI master framework | ||
1296 | * @spi: spi device which is requesting transfer | ||
1297 | * @msg: spi message which is to handled is queued to driver queue | ||
1298 | * | ||
1299 | * This function is registered to the SPI framework for this SPI master | ||
1300 | * controller. It will queue the spi_message in the queue of driver if | ||
1301 | * the queue is not stopped and return. | ||
1302 | */ | ||
1303 | static int pl022_transfer(struct spi_device *spi, struct spi_message *msg) | ||
1304 | { | ||
1305 | struct pl022 *pl022 = spi_master_get_devdata(spi->master); | ||
1306 | unsigned long flags; | ||
1307 | |||
1308 | spin_lock_irqsave(&pl022->queue_lock, flags); | ||
1309 | |||
1310 | if (pl022->run == QUEUE_STOPPED) { | ||
1311 | spin_unlock_irqrestore(&pl022->queue_lock, flags); | ||
1312 | return -ESHUTDOWN; | ||
1313 | } | ||
1314 | msg->actual_length = 0; | ||
1315 | msg->status = -EINPROGRESS; | ||
1316 | msg->state = STATE_START; | ||
1317 | |||
1318 | list_add_tail(&msg->queue, &pl022->queue); | ||
1319 | if (pl022->run == QUEUE_RUNNING && !pl022->busy) | ||
1320 | queue_work(pl022->workqueue, &pl022->pump_messages); | ||
1321 | |||
1322 | spin_unlock_irqrestore(&pl022->queue_lock, flags); | ||
1323 | return 0; | ||
1324 | } | ||
1325 | |||
1326 | static int calculate_effective_freq(struct pl022 *pl022, | ||
1327 | int freq, | ||
1328 | struct ssp_clock_params *clk_freq) | ||
1329 | { | ||
1330 | /* Lets calculate the frequency parameters */ | ||
1331 | u16 cpsdvsr = 2; | ||
1332 | u16 scr = 0; | ||
1333 | bool freq_found = false; | ||
1334 | u32 rate; | ||
1335 | u32 max_tclk; | ||
1336 | u32 min_tclk; | ||
1337 | |||
1338 | rate = clk_get_rate(pl022->clk); | ||
1339 | /* cpsdvscr = 2 & scr 0 */ | ||
1340 | max_tclk = (rate / (CPSDVR_MIN * (1 + SCR_MIN))); | ||
1341 | /* cpsdvsr = 254 & scr = 255 */ | ||
1342 | min_tclk = (rate / (CPSDVR_MAX * (1 + SCR_MAX))); | ||
1343 | |||
1344 | if ((freq <= max_tclk) && (freq >= min_tclk)) { | ||
1345 | while (cpsdvsr <= CPSDVR_MAX && !freq_found) { | ||
1346 | while (scr <= SCR_MAX && !freq_found) { | ||
1347 | if ((rate / | ||
1348 | (cpsdvsr * (1 + scr))) > freq) | ||
1349 | scr += 1; | ||
1350 | else { | ||
1351 | /* | ||
1352 | * This bool is made true when | ||
1353 | * effective frequency >= | ||
1354 | * target frequency is found | ||
1355 | */ | ||
1356 | freq_found = true; | ||
1357 | if ((rate / | ||
1358 | (cpsdvsr * (1 + scr))) != freq) { | ||
1359 | if (scr == SCR_MIN) { | ||
1360 | cpsdvsr -= 2; | ||
1361 | scr = SCR_MAX; | ||
1362 | } else | ||
1363 | scr -= 1; | ||
1364 | } | ||
1365 | } | ||
1366 | } | ||
1367 | if (!freq_found) { | ||
1368 | cpsdvsr += 2; | ||
1369 | scr = SCR_MIN; | ||
1370 | } | ||
1371 | } | ||
1372 | if (cpsdvsr != 0) { | ||
1373 | dev_dbg(&pl022->adev->dev, | ||
1374 | "SSP Effective Frequency is %u\n", | ||
1375 | (rate / (cpsdvsr * (1 + scr)))); | ||
1376 | clk_freq->cpsdvsr = (u8) (cpsdvsr & 0xFF); | ||
1377 | clk_freq->scr = (u8) (scr & 0xFF); | ||
1378 | dev_dbg(&pl022->adev->dev, | ||
1379 | "SSP cpsdvsr = %d, scr = %d\n", | ||
1380 | clk_freq->cpsdvsr, clk_freq->scr); | ||
1381 | } | ||
1382 | } else { | ||
1383 | dev_err(&pl022->adev->dev, | ||
1384 | "controller data is incorrect: out of range frequency"); | ||
1385 | return -EINVAL; | ||
1386 | } | ||
1387 | return 0; | ||
1388 | } | ||
1389 | |||
1390 | /** | ||
1391 | * NOT IMPLEMENTED | ||
1392 | * process_dma_info - Processes the DMA info provided by client drivers | ||
1393 | * @chip_info: chip info provided by client device | ||
1394 | * @chip: Runtime state maintained by the SSP controller for each spi device | ||
1395 | * | ||
1396 | * This function processes and stores DMA config provided by client driver | ||
1397 | * into the runtime state maintained by the SSP controller driver | ||
1398 | */ | ||
1399 | static int process_dma_info(struct pl022_config_chip *chip_info, | ||
1400 | struct chip_data *chip) | ||
1401 | { | ||
1402 | dev_err(chip_info->dev, | ||
1403 | "cannot process DMA info, DMA not implemented!\n"); | ||
1404 | return -ENOTSUPP; | ||
1405 | } | ||
1406 | |||
1407 | /** | ||
1408 | * pl022_setup - setup function registered to SPI master framework | ||
1409 | * @spi: spi device which is requesting setup | ||
1410 | * | ||
1411 | * This function is registered to the SPI framework for this SPI master | ||
1412 | * controller. If it is the first time when setup is called by this device, | ||
1413 | * this function will initialize the runtime state for this chip and save | ||
1414 | * the same in the device structure. Else it will update the runtime info | ||
1415 | * with the updated chip info. Nothing is really being written to the | ||
1416 | * controller hardware here, that is not done until the actual transfer | ||
1417 | * commence. | ||
1418 | */ | ||
1419 | |||
1420 | /* FIXME: JUST GUESSING the spi->mode bits understood by this driver */ | ||
1421 | #define MODEBITS (SPI_CPOL | SPI_CPHA | SPI_CS_HIGH \ | ||
1422 | | SPI_LSB_FIRST | SPI_LOOP) | ||
1423 | |||
1424 | static int pl022_setup(struct spi_device *spi) | ||
1425 | { | ||
1426 | struct pl022_config_chip *chip_info; | ||
1427 | struct chip_data *chip; | ||
1428 | int status = 0; | ||
1429 | struct pl022 *pl022 = spi_master_get_devdata(spi->master); | ||
1430 | |||
1431 | if (spi->mode & ~MODEBITS) { | ||
1432 | dev_dbg(&spi->dev, "unsupported mode bits %x\n", | ||
1433 | spi->mode & ~MODEBITS); | ||
1434 | return -EINVAL; | ||
1435 | } | ||
1436 | |||
1437 | if (!spi->max_speed_hz) | ||
1438 | return -EINVAL; | ||
1439 | |||
1440 | /* Get controller_state if one is supplied */ | ||
1441 | chip = spi_get_ctldata(spi); | ||
1442 | |||
1443 | if (chip == NULL) { | ||
1444 | chip = kzalloc(sizeof(struct chip_data), GFP_KERNEL); | ||
1445 | if (!chip) { | ||
1446 | dev_err(&spi->dev, | ||
1447 | "cannot allocate controller state\n"); | ||
1448 | return -ENOMEM; | ||
1449 | } | ||
1450 | dev_dbg(&spi->dev, | ||
1451 | "allocated memory for controller's runtime state\n"); | ||
1452 | } | ||
1453 | |||
1454 | /* Get controller data if one is supplied */ | ||
1455 | chip_info = spi->controller_data; | ||
1456 | |||
1457 | if (chip_info == NULL) { | ||
1458 | /* spi_board_info.controller_data not is supplied */ | ||
1459 | dev_dbg(&spi->dev, | ||
1460 | "using default controller_data settings\n"); | ||
1461 | |||
1462 | chip_info = | ||
1463 | kzalloc(sizeof(struct pl022_config_chip), GFP_KERNEL); | ||
1464 | |||
1465 | if (!chip_info) { | ||
1466 | dev_err(&spi->dev, | ||
1467 | "cannot allocate controller data\n"); | ||
1468 | status = -ENOMEM; | ||
1469 | goto err_first_setup; | ||
1470 | } | ||
1471 | |||
1472 | dev_dbg(&spi->dev, "allocated memory for controller data\n"); | ||
1473 | |||
1474 | /* Pointer back to the SPI device */ | ||
1475 | chip_info->dev = &spi->dev; | ||
1476 | /* | ||
1477 | * Set controller data default values: | ||
1478 | * Polling is supported by default | ||
1479 | */ | ||
1480 | chip_info->lbm = LOOPBACK_DISABLED; | ||
1481 | chip_info->com_mode = POLLING_TRANSFER; | ||
1482 | chip_info->iface = SSP_INTERFACE_MOTOROLA_SPI; | ||
1483 | chip_info->hierarchy = SSP_SLAVE; | ||
1484 | chip_info->slave_tx_disable = DO_NOT_DRIVE_TX; | ||
1485 | chip_info->endian_tx = SSP_TX_LSB; | ||
1486 | chip_info->endian_rx = SSP_RX_LSB; | ||
1487 | chip_info->data_size = SSP_DATA_BITS_12; | ||
1488 | chip_info->rx_lev_trig = SSP_RX_1_OR_MORE_ELEM; | ||
1489 | chip_info->tx_lev_trig = SSP_TX_1_OR_MORE_EMPTY_LOC; | ||
1490 | chip_info->clk_phase = SSP_CLK_FALLING_EDGE; | ||
1491 | chip_info->clk_pol = SSP_CLK_POL_IDLE_LOW; | ||
1492 | chip_info->ctrl_len = SSP_BITS_8; | ||
1493 | chip_info->wait_state = SSP_MWIRE_WAIT_ZERO; | ||
1494 | chip_info->duplex = SSP_MICROWIRE_CHANNEL_FULL_DUPLEX; | ||
1495 | chip_info->cs_control = null_cs_control; | ||
1496 | } else { | ||
1497 | dev_dbg(&spi->dev, | ||
1498 | "using user supplied controller_data settings\n"); | ||
1499 | } | ||
1500 | |||
1501 | /* | ||
1502 | * We can override with custom divisors, else we use the board | ||
1503 | * frequency setting | ||
1504 | */ | ||
1505 | if ((0 == chip_info->clk_freq.cpsdvsr) | ||
1506 | && (0 == chip_info->clk_freq.scr)) { | ||
1507 | status = calculate_effective_freq(pl022, | ||
1508 | spi->max_speed_hz, | ||
1509 | &chip_info->clk_freq); | ||
1510 | if (status < 0) | ||
1511 | goto err_config_params; | ||
1512 | } else { | ||
1513 | if ((chip_info->clk_freq.cpsdvsr % 2) != 0) | ||
1514 | chip_info->clk_freq.cpsdvsr = | ||
1515 | chip_info->clk_freq.cpsdvsr - 1; | ||
1516 | } | ||
1517 | status = verify_controller_parameters(pl022, chip_info); | ||
1518 | if (status) { | ||
1519 | dev_err(&spi->dev, "controller data is incorrect"); | ||
1520 | goto err_config_params; | ||
1521 | } | ||
1522 | /* Now set controller state based on controller data */ | ||
1523 | chip->xfer_type = chip_info->com_mode; | ||
1524 | chip->cs_control = chip_info->cs_control; | ||
1525 | |||
1526 | if (chip_info->data_size <= 8) { | ||
1527 | dev_dbg(&spi->dev, "1 <= n <=8 bits per word\n"); | ||
1528 | chip->n_bytes = 1; | ||
1529 | chip->read = READING_U8; | ||
1530 | chip->write = WRITING_U8; | ||
1531 | } else if (chip_info->data_size <= 16) { | ||
1532 | dev_dbg(&spi->dev, "9 <= n <= 16 bits per word\n"); | ||
1533 | chip->n_bytes = 2; | ||
1534 | chip->read = READING_U16; | ||
1535 | chip->write = WRITING_U16; | ||
1536 | } else { | ||
1537 | if (pl022->vendor->max_bpw >= 32) { | ||
1538 | dev_dbg(&spi->dev, "17 <= n <= 32 bits per word\n"); | ||
1539 | chip->n_bytes = 4; | ||
1540 | chip->read = READING_U32; | ||
1541 | chip->write = WRITING_U32; | ||
1542 | } else { | ||
1543 | dev_err(&spi->dev, | ||
1544 | "illegal data size for this controller!\n"); | ||
1545 | dev_err(&spi->dev, | ||
1546 | "a standard pl022 can only handle " | ||
1547 | "1 <= n <= 16 bit words\n"); | ||
1548 | goto err_config_params; | ||
1549 | } | ||
1550 | } | ||
1551 | |||
1552 | /* Now Initialize all register settings required for this chip */ | ||
1553 | chip->cr0 = 0; | ||
1554 | chip->cr1 = 0; | ||
1555 | chip->dmacr = 0; | ||
1556 | chip->cpsr = 0; | ||
1557 | if ((chip_info->com_mode == DMA_TRANSFER) | ||
1558 | && ((pl022->master_info)->enable_dma)) { | ||
1559 | chip->enable_dma = 1; | ||
1560 | dev_dbg(&spi->dev, "DMA mode set in controller state\n"); | ||
1561 | status = process_dma_info(chip_info, chip); | ||
1562 | if (status < 0) | ||
1563 | goto err_config_params; | ||
1564 | SSP_WRITE_BITS(chip->dmacr, SSP_DMA_ENABLED, | ||
1565 | SSP_DMACR_MASK_RXDMAE, 0); | ||
1566 | SSP_WRITE_BITS(chip->dmacr, SSP_DMA_ENABLED, | ||
1567 | SSP_DMACR_MASK_TXDMAE, 1); | ||
1568 | } else { | ||
1569 | chip->enable_dma = 0; | ||
1570 | dev_dbg(&spi->dev, "DMA mode NOT set in controller state\n"); | ||
1571 | SSP_WRITE_BITS(chip->dmacr, SSP_DMA_DISABLED, | ||
1572 | SSP_DMACR_MASK_RXDMAE, 0); | ||
1573 | SSP_WRITE_BITS(chip->dmacr, SSP_DMA_DISABLED, | ||
1574 | SSP_DMACR_MASK_TXDMAE, 1); | ||
1575 | } | ||
1576 | |||
1577 | chip->cpsr = chip_info->clk_freq.cpsdvsr; | ||
1578 | |||
1579 | SSP_WRITE_BITS(chip->cr0, chip_info->data_size, SSP_CR0_MASK_DSS, 0); | ||
1580 | SSP_WRITE_BITS(chip->cr0, chip_info->duplex, SSP_CR0_MASK_HALFDUP, 5); | ||
1581 | SSP_WRITE_BITS(chip->cr0, chip_info->clk_pol, SSP_CR0_MASK_SPO, 6); | ||
1582 | SSP_WRITE_BITS(chip->cr0, chip_info->clk_phase, SSP_CR0_MASK_SPH, 7); | ||
1583 | SSP_WRITE_BITS(chip->cr0, chip_info->clk_freq.scr, SSP_CR0_MASK_SCR, 8); | ||
1584 | SSP_WRITE_BITS(chip->cr0, chip_info->ctrl_len, SSP_CR0_MASK_CSS, 16); | ||
1585 | SSP_WRITE_BITS(chip->cr0, chip_info->iface, SSP_CR0_MASK_FRF, 21); | ||
1586 | SSP_WRITE_BITS(chip->cr1, chip_info->lbm, SSP_CR1_MASK_LBM, 0); | ||
1587 | SSP_WRITE_BITS(chip->cr1, SSP_DISABLED, SSP_CR1_MASK_SSE, 1); | ||
1588 | SSP_WRITE_BITS(chip->cr1, chip_info->hierarchy, SSP_CR1_MASK_MS, 2); | ||
1589 | SSP_WRITE_BITS(chip->cr1, chip_info->slave_tx_disable, SSP_CR1_MASK_SOD, 3); | ||
1590 | SSP_WRITE_BITS(chip->cr1, chip_info->endian_rx, SSP_CR1_MASK_RENDN, 4); | ||
1591 | SSP_WRITE_BITS(chip->cr1, chip_info->endian_tx, SSP_CR1_MASK_TENDN, 5); | ||
1592 | SSP_WRITE_BITS(chip->cr1, chip_info->wait_state, SSP_CR1_MASK_MWAIT, 6); | ||
1593 | SSP_WRITE_BITS(chip->cr1, chip_info->rx_lev_trig, SSP_CR1_MASK_RXIFLSEL, 7); | ||
1594 | SSP_WRITE_BITS(chip->cr1, chip_info->tx_lev_trig, SSP_CR1_MASK_TXIFLSEL, 10); | ||
1595 | |||
1596 | /* Save controller_state */ | ||
1597 | spi_set_ctldata(spi, chip); | ||
1598 | return status; | ||
1599 | err_config_params: | ||
1600 | err_first_setup: | ||
1601 | kfree(chip); | ||
1602 | return status; | ||
1603 | } | ||
1604 | |||
1605 | /** | ||
1606 | * pl022_cleanup - cleanup function registered to SPI master framework | ||
1607 | * @spi: spi device which is requesting cleanup | ||
1608 | * | ||
1609 | * This function is registered to the SPI framework for this SPI master | ||
1610 | * controller. It will free the runtime state of chip. | ||
1611 | */ | ||
1612 | static void pl022_cleanup(struct spi_device *spi) | ||
1613 | { | ||
1614 | struct chip_data *chip = spi_get_ctldata(spi); | ||
1615 | |||
1616 | spi_set_ctldata(spi, NULL); | ||
1617 | kfree(chip); | ||
1618 | } | ||
1619 | |||
1620 | |||
1621 | static int __init | ||
1622 | pl022_probe(struct amba_device *adev, struct amba_id *id) | ||
1623 | { | ||
1624 | struct device *dev = &adev->dev; | ||
1625 | struct pl022_ssp_controller *platform_info = adev->dev.platform_data; | ||
1626 | struct spi_master *master; | ||
1627 | struct pl022 *pl022 = NULL; /*Data for this driver */ | ||
1628 | int status = 0; | ||
1629 | |||
1630 | dev_info(&adev->dev, | ||
1631 | "ARM PL022 driver, device ID: 0x%08x\n", adev->periphid); | ||
1632 | if (platform_info == NULL) { | ||
1633 | dev_err(&adev->dev, "probe - no platform data supplied\n"); | ||
1634 | status = -ENODEV; | ||
1635 | goto err_no_pdata; | ||
1636 | } | ||
1637 | |||
1638 | /* Allocate master with space for data */ | ||
1639 | master = spi_alloc_master(dev, sizeof(struct pl022)); | ||
1640 | if (master == NULL) { | ||
1641 | dev_err(&adev->dev, "probe - cannot alloc SPI master\n"); | ||
1642 | status = -ENOMEM; | ||
1643 | goto err_no_master; | ||
1644 | } | ||
1645 | |||
1646 | pl022 = spi_master_get_devdata(master); | ||
1647 | pl022->master = master; | ||
1648 | pl022->master_info = platform_info; | ||
1649 | pl022->adev = adev; | ||
1650 | pl022->vendor = id->data; | ||
1651 | |||
1652 | /* | ||
1653 | * Bus Number Which has been Assigned to this SSP controller | ||
1654 | * on this board | ||
1655 | */ | ||
1656 | master->bus_num = platform_info->bus_id; | ||
1657 | master->num_chipselect = platform_info->num_chipselect; | ||
1658 | master->cleanup = pl022_cleanup; | ||
1659 | master->setup = pl022_setup; | ||
1660 | master->transfer = pl022_transfer; | ||
1661 | |||
1662 | dev_dbg(&adev->dev, "BUSNO: %d\n", master->bus_num); | ||
1663 | |||
1664 | status = amba_request_regions(adev, NULL); | ||
1665 | if (status) | ||
1666 | goto err_no_ioregion; | ||
1667 | |||
1668 | pl022->virtbase = ioremap(adev->res.start, resource_size(&adev->res)); | ||
1669 | if (pl022->virtbase == NULL) { | ||
1670 | status = -ENOMEM; | ||
1671 | goto err_no_ioremap; | ||
1672 | } | ||
1673 | printk(KERN_INFO "pl022: mapped registers from 0x%08x to %p\n", | ||
1674 | adev->res.start, pl022->virtbase); | ||
1675 | |||
1676 | pl022->clk = clk_get(&adev->dev, NULL); | ||
1677 | if (IS_ERR(pl022->clk)) { | ||
1678 | status = PTR_ERR(pl022->clk); | ||
1679 | dev_err(&adev->dev, "could not retrieve SSP/SPI bus clock\n"); | ||
1680 | goto err_no_clk; | ||
1681 | } | ||
1682 | |||
1683 | /* Disable SSP */ | ||
1684 | clk_enable(pl022->clk); | ||
1685 | writew((readw(SSP_CR1(pl022->virtbase)) & (~SSP_CR1_MASK_SSE)), | ||
1686 | SSP_CR1(pl022->virtbase)); | ||
1687 | load_ssp_default_config(pl022); | ||
1688 | clk_disable(pl022->clk); | ||
1689 | |||
1690 | status = request_irq(adev->irq[0], pl022_interrupt_handler, 0, "pl022", | ||
1691 | pl022); | ||
1692 | if (status < 0) { | ||
1693 | dev_err(&adev->dev, "probe - cannot get IRQ (%d)\n", status); | ||
1694 | goto err_no_irq; | ||
1695 | } | ||
1696 | /* Initialize and start queue */ | ||
1697 | status = init_queue(pl022); | ||
1698 | if (status != 0) { | ||
1699 | dev_err(&adev->dev, "probe - problem initializing queue\n"); | ||
1700 | goto err_init_queue; | ||
1701 | } | ||
1702 | status = start_queue(pl022); | ||
1703 | if (status != 0) { | ||
1704 | dev_err(&adev->dev, "probe - problem starting queue\n"); | ||
1705 | goto err_start_queue; | ||
1706 | } | ||
1707 | /* Register with the SPI framework */ | ||
1708 | amba_set_drvdata(adev, pl022); | ||
1709 | status = spi_register_master(master); | ||
1710 | if (status != 0) { | ||
1711 | dev_err(&adev->dev, | ||
1712 | "probe - problem registering spi master\n"); | ||
1713 | goto err_spi_register; | ||
1714 | } | ||
1715 | dev_dbg(dev, "probe succeded\n"); | ||
1716 | return 0; | ||
1717 | |||
1718 | err_spi_register: | ||
1719 | err_start_queue: | ||
1720 | err_init_queue: | ||
1721 | destroy_queue(pl022); | ||
1722 | free_irq(adev->irq[0], pl022); | ||
1723 | err_no_irq: | ||
1724 | clk_put(pl022->clk); | ||
1725 | err_no_clk: | ||
1726 | iounmap(pl022->virtbase); | ||
1727 | err_no_ioremap: | ||
1728 | amba_release_regions(adev); | ||
1729 | err_no_ioregion: | ||
1730 | spi_master_put(master); | ||
1731 | err_no_master: | ||
1732 | err_no_pdata: | ||
1733 | return status; | ||
1734 | } | ||
1735 | |||
1736 | static int __exit | ||
1737 | pl022_remove(struct amba_device *adev) | ||
1738 | { | ||
1739 | struct pl022 *pl022 = amba_get_drvdata(adev); | ||
1740 | int status = 0; | ||
1741 | if (!pl022) | ||
1742 | return 0; | ||
1743 | |||
1744 | /* Remove the queue */ | ||
1745 | status = destroy_queue(pl022); | ||
1746 | if (status != 0) { | ||
1747 | dev_err(&adev->dev, | ||
1748 | "queue remove failed (%d)\n", status); | ||
1749 | return status; | ||
1750 | } | ||
1751 | load_ssp_default_config(pl022); | ||
1752 | free_irq(adev->irq[0], pl022); | ||
1753 | clk_disable(pl022->clk); | ||
1754 | clk_put(pl022->clk); | ||
1755 | iounmap(pl022->virtbase); | ||
1756 | amba_release_regions(adev); | ||
1757 | tasklet_disable(&pl022->pump_transfers); | ||
1758 | spi_unregister_master(pl022->master); | ||
1759 | spi_master_put(pl022->master); | ||
1760 | amba_set_drvdata(adev, NULL); | ||
1761 | dev_dbg(&adev->dev, "remove succeded\n"); | ||
1762 | return 0; | ||
1763 | } | ||
1764 | |||
1765 | #ifdef CONFIG_PM | ||
1766 | static int pl022_suspend(struct amba_device *adev, pm_message_t state) | ||
1767 | { | ||
1768 | struct pl022 *pl022 = amba_get_drvdata(adev); | ||
1769 | int status = 0; | ||
1770 | |||
1771 | status = stop_queue(pl022); | ||
1772 | if (status) { | ||
1773 | dev_warn(&adev->dev, "suspend cannot stop queue\n"); | ||
1774 | return status; | ||
1775 | } | ||
1776 | |||
1777 | clk_enable(pl022->clk); | ||
1778 | load_ssp_default_config(pl022); | ||
1779 | clk_disable(pl022->clk); | ||
1780 | dev_dbg(&adev->dev, "suspended\n"); | ||
1781 | return 0; | ||
1782 | } | ||
1783 | |||
1784 | static int pl022_resume(struct amba_device *adev) | ||
1785 | { | ||
1786 | struct pl022 *pl022 = amba_get_drvdata(adev); | ||
1787 | int status = 0; | ||
1788 | |||
1789 | /* Start the queue running */ | ||
1790 | status = start_queue(pl022); | ||
1791 | if (status) | ||
1792 | dev_err(&adev->dev, "problem starting queue (%d)\n", status); | ||
1793 | else | ||
1794 | dev_dbg(&adev->dev, "resumed\n"); | ||
1795 | |||
1796 | return status; | ||
1797 | } | ||
1798 | #else | ||
1799 | #define pl022_suspend NULL | ||
1800 | #define pl022_resume NULL | ||
1801 | #endif /* CONFIG_PM */ | ||
1802 | |||
1803 | static struct vendor_data vendor_arm = { | ||
1804 | .fifodepth = 8, | ||
1805 | .max_bpw = 16, | ||
1806 | .unidir = false, | ||
1807 | }; | ||
1808 | |||
1809 | |||
1810 | static struct vendor_data vendor_st = { | ||
1811 | .fifodepth = 32, | ||
1812 | .max_bpw = 32, | ||
1813 | .unidir = false, | ||
1814 | }; | ||
1815 | |||
1816 | static struct amba_id pl022_ids[] = { | ||
1817 | { | ||
1818 | /* | ||
1819 | * ARM PL022 variant, this has a 16bit wide | ||
1820 | * and 8 locations deep TX/RX FIFO | ||
1821 | */ | ||
1822 | .id = 0x00041022, | ||
1823 | .mask = 0x000fffff, | ||
1824 | .data = &vendor_arm, | ||
1825 | }, | ||
1826 | { | ||
1827 | /* | ||
1828 | * ST Micro derivative, this has 32bit wide | ||
1829 | * and 32 locations deep TX/RX FIFO | ||
1830 | */ | ||
1831 | .id = 0x00108022, | ||
1832 | .mask = 0xffffffff, | ||
1833 | .data = &vendor_st, | ||
1834 | }, | ||
1835 | { 0, 0 }, | ||
1836 | }; | ||
1837 | |||
1838 | static struct amba_driver pl022_driver = { | ||
1839 | .drv = { | ||
1840 | .name = "ssp-pl022", | ||
1841 | }, | ||
1842 | .id_table = pl022_ids, | ||
1843 | .probe = pl022_probe, | ||
1844 | .remove = __exit_p(pl022_remove), | ||
1845 | .suspend = pl022_suspend, | ||
1846 | .resume = pl022_resume, | ||
1847 | }; | ||
1848 | |||
1849 | |||
1850 | static int __init pl022_init(void) | ||
1851 | { | ||
1852 | return amba_driver_register(&pl022_driver); | ||
1853 | } | ||
1854 | |||
1855 | module_init(pl022_init); | ||
1856 | |||
1857 | static void __exit pl022_exit(void) | ||
1858 | { | ||
1859 | amba_driver_unregister(&pl022_driver); | ||
1860 | } | ||
1861 | |||
1862 | module_exit(pl022_exit); | ||
1863 | |||
1864 | MODULE_AUTHOR("Linus Walleij <linus.walleij@stericsson.com>"); | ||
1865 | MODULE_DESCRIPTION("PL022 SSP Controller Driver"); | ||
1866 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/spi/spi_s3c24xx_gpio.c b/drivers/spi/spi_s3c24xx_gpio.c index f2447a5476bb..bbf9371cd284 100644 --- a/drivers/spi/spi_s3c24xx_gpio.c +++ b/drivers/spi/spi_s3c24xx_gpio.c | |||
@@ -17,6 +17,7 @@ | |||
17 | #include <linux/spinlock.h> | 17 | #include <linux/spinlock.h> |
18 | #include <linux/workqueue.h> | 18 | #include <linux/workqueue.h> |
19 | #include <linux/platform_device.h> | 19 | #include <linux/platform_device.h> |
20 | #include <linux/gpio.h> | ||
20 | 21 | ||
21 | #include <linux/spi/spi.h> | 22 | #include <linux/spi/spi.h> |
22 | #include <linux/spi/spi_bitbang.h> | 23 | #include <linux/spi/spi_bitbang.h> |
diff --git a/drivers/staging/go7007/go7007.txt b/drivers/staging/go7007/go7007.txt index 9f6772bc68c2..1c2907c1dc81 100644 --- a/drivers/staging/go7007/go7007.txt +++ b/drivers/staging/go7007/go7007.txt | |||
@@ -2,7 +2,7 @@ This is a driver for the WIS GO7007SB multi-format video encoder. | |||
2 | 2 | ||
3 | Pete Eberlein <pete@sensoray.com> | 3 | Pete Eberlein <pete@sensoray.com> |
4 | 4 | ||
5 | The driver was orignally released under the GPL and is currently hosted at: | 5 | The driver was originally released under the GPL and is currently hosted at: |
6 | http://nikosapi.org/wiki/index.php/WIS_Go7007_Linux_driver | 6 | http://nikosapi.org/wiki/index.php/WIS_Go7007_Linux_driver |
7 | The go7007 firmware can be acquired from the package on the site above. | 7 | The go7007 firmware can be acquired from the package on the site above. |
8 | 8 | ||
@@ -24,7 +24,7 @@ These should be used instead of the non-standard GO7007 ioctls described | |||
24 | below. | 24 | below. |
25 | 25 | ||
26 | 26 | ||
27 | The README files from the orignal package appear below: | 27 | The README files from the original package appears below: |
28 | 28 | ||
29 | --------------------------------------------------------------------------- | 29 | --------------------------------------------------------------------------- |
30 | WIS GO7007SB Public Linux Driver | 30 | WIS GO7007SB Public Linux Driver |
diff --git a/drivers/staging/panel/lcd-panel-cgram.txt b/drivers/staging/panel/lcd-panel-cgram.txt index f9ceef4322a3..7f82c905763d 100644 --- a/drivers/staging/panel/lcd-panel-cgram.txt +++ b/drivers/staging/panel/lcd-panel-cgram.txt | |||
@@ -3,7 +3,7 @@ characters 0 to 7. The escape code to define a new character is | |||
3 | '\e[LG' followed by one digit from 0 to 7, representing the character | 3 | '\e[LG' followed by one digit from 0 to 7, representing the character |
4 | number, and up to 8 couples of hex digits terminated by a semi-colon | 4 | number, and up to 8 couples of hex digits terminated by a semi-colon |
5 | (';'). Each couple of digits represents a line, with 1-bits for each | 5 | (';'). Each couple of digits represents a line, with 1-bits for each |
6 | illuminated pixel with LSB on the right. Lines are numberred from the | 6 | illuminated pixel with LSB on the right. Lines are numbered from the |
7 | top of the character to the bottom. On a 5x7 matrix, only the 5 lower | 7 | top of the character to the bottom. On a 5x7 matrix, only the 5 lower |
8 | bits of the 7 first bytes are used for each character. If the string | 8 | bits of the 7 first bytes are used for each character. If the string |
9 | is incomplete, only complete lines will be redefined. Here are some | 9 | is incomplete, only complete lines will be redefined. Here are some |
diff --git a/drivers/staging/rt2860/common/mlme.c b/drivers/staging/rt2860/common/mlme.c index c00f9ab9c46c..2edf2999f5c8 100644 --- a/drivers/staging/rt2860/common/mlme.c +++ b/drivers/staging/rt2860/common/mlme.c | |||
@@ -5664,7 +5664,7 @@ VOID AsicUpdateProtect( | |||
5664 | #if 0 | 5664 | #if 0 |
5665 | MacReg |= (pAd->CommonCfg.RtsThreshold << 8); | 5665 | MacReg |= (pAd->CommonCfg.RtsThreshold << 8); |
5666 | #else | 5666 | #else |
5667 | // If the user want disable RtsThreshold and enbale Amsdu/Ralink-Aggregation, set the RtsThreshold as 4096 | 5667 | // If the user want disable RtsThreshold and enable Amsdu/Ralink-Aggregation, set the RtsThreshold as 4096 |
5668 | if (( | 5668 | if (( |
5669 | #ifdef DOT11_N_SUPPORT | 5669 | #ifdef DOT11_N_SUPPORT |
5670 | (pAd->CommonCfg.BACapability.field.AmsduEnable) || | 5670 | (pAd->CommonCfg.BACapability.field.AmsduEnable) || |
diff --git a/drivers/staging/rt2870/common/mlme.c b/drivers/staging/rt2870/common/mlme.c index 8a82cee8bf26..a26bc033337d 100644 --- a/drivers/staging/rt2870/common/mlme.c +++ b/drivers/staging/rt2870/common/mlme.c | |||
@@ -5561,7 +5561,7 @@ VOID AsicUpdateProtect( | |||
5561 | #if 0 | 5561 | #if 0 |
5562 | MacReg |= (pAd->CommonCfg.RtsThreshold << 8); | 5562 | MacReg |= (pAd->CommonCfg.RtsThreshold << 8); |
5563 | #else | 5563 | #else |
5564 | // If the user want disable RtsThreshold and enbale Amsdu/Ralink-Aggregation, set the RtsThreshold as 4096 | 5564 | // If the user want disable RtsThreshold and enable Amsdu/Ralink-Aggregation, set the RtsThreshold as 4096 |
5565 | if (( | 5565 | if (( |
5566 | #ifdef DOT11_N_SUPPORT | 5566 | #ifdef DOT11_N_SUPPORT |
5567 | (pAd->CommonCfg.BACapability.field.AmsduEnable) || | 5567 | (pAd->CommonCfg.BACapability.field.AmsduEnable) || |
diff --git a/drivers/staging/rt3070/common/mlme.c b/drivers/staging/rt3070/common/mlme.c index 0ffbfa36699e..0189bab013cf 100644 --- a/drivers/staging/rt3070/common/mlme.c +++ b/drivers/staging/rt3070/common/mlme.c | |||
@@ -5575,7 +5575,7 @@ VOID AsicUpdateProtect( | |||
5575 | RTMP_IO_READ32(pAd, TX_RTS_CFG, &MacReg); | 5575 | RTMP_IO_READ32(pAd, TX_RTS_CFG, &MacReg); |
5576 | MacReg &= 0xFF0000FF; | 5576 | MacReg &= 0xFF0000FF; |
5577 | 5577 | ||
5578 | // If the user want disable RtsThreshold and enbale Amsdu/Ralink-Aggregation, set the RtsThreshold as 4096 | 5578 | // If the user want disable RtsThreshold and enable Amsdu/Ralink-Aggregation, set the RtsThreshold as 4096 |
5579 | if (( | 5579 | if (( |
5580 | #ifdef DOT11_N_SUPPORT | 5580 | #ifdef DOT11_N_SUPPORT |
5581 | (pAd->CommonCfg.BACapability.field.AmsduEnable) || | 5581 | (pAd->CommonCfg.BACapability.field.AmsduEnable) || |
diff --git a/drivers/staging/wlan-ng/hfa384x_usb.c b/drivers/staging/wlan-ng/hfa384x_usb.c index 888198c9a106..824e65bdc433 100644 --- a/drivers/staging/wlan-ng/hfa384x_usb.c +++ b/drivers/staging/wlan-ng/hfa384x_usb.c | |||
@@ -2424,7 +2424,7 @@ int hfa384x_drvr_ramdl_write(hfa384x_t *hw, u32 daddr, void *buf, u32 len) | |||
2424 | * 0 success | 2424 | * 0 success |
2425 | * >0 f/w reported error - f/w status code | 2425 | * >0 f/w reported error - f/w status code |
2426 | * <0 driver reported error | 2426 | * <0 driver reported error |
2427 | * -ETIMEOUT timout waiting for the cmd regs to become | 2427 | * -ETIMEDOUT timout waiting for the cmd regs to become |
2428 | * available, or waiting for the control reg | 2428 | * available, or waiting for the control reg |
2429 | * to indicate the Aux port is enabled. | 2429 | * to indicate the Aux port is enabled. |
2430 | * -ENODATA the buffer does NOT contain a valid PDA. | 2430 | * -ENODATA the buffer does NOT contain a valid PDA. |
diff --git a/drivers/usb/host/ohci-ep93xx.c b/drivers/usb/host/ohci-ep93xx.c index 7cf74f8c2db1..b0dbf4157d29 100644 --- a/drivers/usb/host/ohci-ep93xx.c +++ b/drivers/usb/host/ohci-ep93xx.c | |||
@@ -47,7 +47,7 @@ static int usb_hcd_ep93xx_probe(const struct hc_driver *driver, | |||
47 | struct usb_hcd *hcd; | 47 | struct usb_hcd *hcd; |
48 | 48 | ||
49 | if (pdev->resource[1].flags != IORESOURCE_IRQ) { | 49 | if (pdev->resource[1].flags != IORESOURCE_IRQ) { |
50 | pr_debug("resource[1] is not IORESOURCE_IRQ"); | 50 | dbg("resource[1] is not IORESOURCE_IRQ"); |
51 | return -ENOMEM; | 51 | return -ENOMEM; |
52 | } | 52 | } |
53 | 53 | ||
@@ -65,12 +65,18 @@ static int usb_hcd_ep93xx_probe(const struct hc_driver *driver, | |||
65 | 65 | ||
66 | hcd->regs = ioremap(hcd->rsrc_start, hcd->rsrc_len); | 66 | hcd->regs = ioremap(hcd->rsrc_start, hcd->rsrc_len); |
67 | if (hcd->regs == NULL) { | 67 | if (hcd->regs == NULL) { |
68 | pr_debug("ioremap failed"); | 68 | dbg("ioremap failed"); |
69 | retval = -ENOMEM; | 69 | retval = -ENOMEM; |
70 | goto err2; | 70 | goto err2; |
71 | } | 71 | } |
72 | 72 | ||
73 | usb_host_clock = clk_get(&pdev->dev, "usb_host"); | 73 | usb_host_clock = clk_get(&pdev->dev, NULL); |
74 | if (IS_ERR(usb_host_clock)) { | ||
75 | dbg("clk_get failed"); | ||
76 | retval = PTR_ERR(usb_host_clock); | ||
77 | goto err3; | ||
78 | } | ||
79 | |||
74 | ep93xx_start_hc(&pdev->dev); | 80 | ep93xx_start_hc(&pdev->dev); |
75 | 81 | ||
76 | ohci_hcd_init(hcd_to_ohci(hcd)); | 82 | ohci_hcd_init(hcd_to_ohci(hcd)); |
@@ -80,6 +86,7 @@ static int usb_hcd_ep93xx_probe(const struct hc_driver *driver, | |||
80 | return retval; | 86 | return retval; |
81 | 87 | ||
82 | ep93xx_stop_hc(&pdev->dev); | 88 | ep93xx_stop_hc(&pdev->dev); |
89 | err3: | ||
83 | iounmap(hcd->regs); | 90 | iounmap(hcd->regs); |
84 | err2: | 91 | err2: |
85 | release_mem_region(hcd->rsrc_start, hcd->rsrc_len); | 92 | release_mem_region(hcd->rsrc_start, hcd->rsrc_len); |
diff --git a/drivers/usb/serial/io_ti.c b/drivers/usb/serial/io_ti.c index eabf20eeb370..db964db42d3c 100644 --- a/drivers/usb/serial/io_ti.c +++ b/drivers/usb/serial/io_ti.c | |||
@@ -102,7 +102,7 @@ struct edgeport_port { | |||
102 | __u8 shadow_mcr; | 102 | __u8 shadow_mcr; |
103 | __u8 shadow_lsr; | 103 | __u8 shadow_lsr; |
104 | __u8 lsr_mask; | 104 | __u8 lsr_mask; |
105 | __u32 ump_read_timeout; /* Number of miliseconds the UMP will | 105 | __u32 ump_read_timeout; /* Number of milliseconds the UMP will |
106 | wait without data before completing | 106 | wait without data before completing |
107 | a read short */ | 107 | a read short */ |
108 | int baud_rate; | 108 | int baud_rate; |
diff --git a/drivers/video/Kconfig b/drivers/video/Kconfig index 74712cb8399a..2b5a691064b7 100644 --- a/drivers/video/Kconfig +++ b/drivers/video/Kconfig | |||
@@ -397,7 +397,7 @@ config FB_SA1100 | |||
397 | 397 | ||
398 | config FB_IMX | 398 | config FB_IMX |
399 | tristate "Motorola i.MX LCD support" | 399 | tristate "Motorola i.MX LCD support" |
400 | depends on FB && (ARCH_IMX || ARCH_MX2) | 400 | depends on FB && (ARCH_MX1 || ARCH_MX2) |
401 | select FB_CFB_FILLRECT | 401 | select FB_CFB_FILLRECT |
402 | select FB_CFB_COPYAREA | 402 | select FB_CFB_COPYAREA |
403 | select FB_CFB_IMAGEBLIT | 403 | select FB_CFB_IMAGEBLIT |
@@ -1759,6 +1759,16 @@ config FB_68328 | |||
1759 | Say Y here if you want to support the built-in frame buffer of | 1759 | Say Y here if you want to support the built-in frame buffer of |
1760 | the Motorola 68328 CPU family. | 1760 | the Motorola 68328 CPU family. |
1761 | 1761 | ||
1762 | config FB_PXA168 | ||
1763 | tristate "PXA168/910 LCD framebuffer support" | ||
1764 | depends on FB && (CPU_PXA168 || CPU_PXA910) | ||
1765 | select FB_CFB_FILLRECT | ||
1766 | select FB_CFB_COPYAREA | ||
1767 | select FB_CFB_IMAGEBLIT | ||
1768 | ---help--- | ||
1769 | Frame buffer driver for the built-in LCD controller in the Marvell | ||
1770 | MMP processor. | ||
1771 | |||
1762 | config FB_PXA | 1772 | config FB_PXA |
1763 | tristate "PXA LCD framebuffer support" | 1773 | tristate "PXA LCD framebuffer support" |
1764 | depends on FB && ARCH_PXA | 1774 | depends on FB && ARCH_PXA |
diff --git a/drivers/video/Makefile b/drivers/video/Makefile index d8d0be5151e3..01a819f47371 100644 --- a/drivers/video/Makefile +++ b/drivers/video/Makefile | |||
@@ -97,6 +97,7 @@ obj-$(CONFIG_FB_GBE) += gbefb.o | |||
97 | obj-$(CONFIG_FB_CIRRUS) += cirrusfb.o | 97 | obj-$(CONFIG_FB_CIRRUS) += cirrusfb.o |
98 | obj-$(CONFIG_FB_ASILIANT) += asiliantfb.o | 98 | obj-$(CONFIG_FB_ASILIANT) += asiliantfb.o |
99 | obj-$(CONFIG_FB_PXA) += pxafb.o | 99 | obj-$(CONFIG_FB_PXA) += pxafb.o |
100 | obj-$(CONFIG_FB_PXA168) += pxa168fb.o | ||
100 | obj-$(CONFIG_FB_W100) += w100fb.o | 101 | obj-$(CONFIG_FB_W100) += w100fb.o |
101 | obj-$(CONFIG_FB_TMIO) += tmiofb.o | 102 | obj-$(CONFIG_FB_TMIO) += tmiofb.o |
102 | obj-$(CONFIG_FB_AU1100) += au1100fb.o | 103 | obj-$(CONFIG_FB_AU1100) += au1100fb.o |
diff --git a/drivers/video/amba-clcd.c b/drivers/video/amba-clcd.c index d1f80bac54f0..fb8163d181ab 100644 --- a/drivers/video/amba-clcd.c +++ b/drivers/video/amba-clcd.c | |||
@@ -351,7 +351,7 @@ static int clcdfb_register(struct clcd_fb *fb) | |||
351 | } | 351 | } |
352 | 352 | ||
353 | fb->fb.fix.mmio_start = fb->dev->res.start; | 353 | fb->fb.fix.mmio_start = fb->dev->res.start; |
354 | fb->fb.fix.mmio_len = 4096; | 354 | fb->fb.fix.mmio_len = resource_size(&fb->dev->res); |
355 | 355 | ||
356 | fb->regs = ioremap(fb->fb.fix.mmio_start, fb->fb.fix.mmio_len); | 356 | fb->regs = ioremap(fb->fb.fix.mmio_start, fb->fb.fix.mmio_len); |
357 | if (!fb->regs) { | 357 | if (!fb->regs) { |
diff --git a/drivers/video/mx3fb.c b/drivers/video/mx3fb.c index 9894de1c9b9f..b7af5256e887 100644 --- a/drivers/video/mx3fb.c +++ b/drivers/video/mx3fb.c | |||
@@ -706,7 +706,7 @@ static void mx3fb_dma_done(void *arg) | |||
706 | dev_dbg(mx3fb->dev, "irq %d callback\n", ichannel->eof_irq); | 706 | dev_dbg(mx3fb->dev, "irq %d callback\n", ichannel->eof_irq); |
707 | 707 | ||
708 | /* We only need one interrupt, it will be re-enabled as needed */ | 708 | /* We only need one interrupt, it will be re-enabled as needed */ |
709 | disable_irq(ichannel->eof_irq); | 709 | disable_irq_nosync(ichannel->eof_irq); |
710 | 710 | ||
711 | complete(&mx3_fbi->flip_cmpl); | 711 | complete(&mx3_fbi->flip_cmpl); |
712 | } | 712 | } |
@@ -1366,7 +1366,7 @@ static int init_fb_chan(struct mx3fb_data *mx3fb, struct idmac_channel *ichan) | |||
1366 | 1366 | ||
1367 | mx3fb_blank(FB_BLANK_UNBLANK, fbi); | 1367 | mx3fb_blank(FB_BLANK_UNBLANK, fbi); |
1368 | 1368 | ||
1369 | dev_info(dev, "mx3fb: fb registered, using mode %s\n", fb_mode); | 1369 | dev_info(dev, "registered, using mode %s\n", fb_mode); |
1370 | 1370 | ||
1371 | ret = register_framebuffer(fbi); | 1371 | ret = register_framebuffer(fbi); |
1372 | if (ret < 0) | 1372 | if (ret < 0) |
diff --git a/drivers/video/omap/hwa742.c b/drivers/video/omap/hwa742.c index 8aa6e47202b9..5d4f34887a22 100644 --- a/drivers/video/omap/hwa742.c +++ b/drivers/video/omap/hwa742.c | |||
@@ -133,8 +133,7 @@ struct { | |||
133 | struct lcd_ctrl_extif *extif; | 133 | struct lcd_ctrl_extif *extif; |
134 | struct lcd_ctrl *int_ctrl; | 134 | struct lcd_ctrl *int_ctrl; |
135 | 135 | ||
136 | void (*power_up)(struct device *dev); | 136 | struct clk *sys_ck; |
137 | void (*power_down)(struct device *dev); | ||
138 | } hwa742; | 137 | } hwa742; |
139 | 138 | ||
140 | struct lcd_ctrl hwa742_ctrl; | 139 | struct lcd_ctrl hwa742_ctrl; |
@@ -915,14 +914,13 @@ static void hwa742_suspend(void) | |||
915 | hwa742_set_update_mode(OMAPFB_UPDATE_DISABLED); | 914 | hwa742_set_update_mode(OMAPFB_UPDATE_DISABLED); |
916 | /* Enable sleep mode */ | 915 | /* Enable sleep mode */ |
917 | hwa742_write_reg(HWA742_POWER_SAVE, 1 << 1); | 916 | hwa742_write_reg(HWA742_POWER_SAVE, 1 << 1); |
918 | if (hwa742.power_down != NULL) | 917 | clk_disable(hwa742.sys_ck); |
919 | hwa742.power_down(hwa742.fbdev->dev); | ||
920 | } | 918 | } |
921 | 919 | ||
922 | static void hwa742_resume(void) | 920 | static void hwa742_resume(void) |
923 | { | 921 | { |
924 | if (hwa742.power_up != NULL) | 922 | clk_enable(hwa742.sys_ck); |
925 | hwa742.power_up(hwa742.fbdev->dev); | 923 | |
926 | /* Disable sleep mode */ | 924 | /* Disable sleep mode */ |
927 | hwa742_write_reg(HWA742_POWER_SAVE, 0); | 925 | hwa742_write_reg(HWA742_POWER_SAVE, 0); |
928 | while (1) { | 926 | while (1) { |
@@ -955,14 +953,13 @@ static int hwa742_init(struct omapfb_device *fbdev, int ext_mode, | |||
955 | omapfb_conf = fbdev->dev->platform_data; | 953 | omapfb_conf = fbdev->dev->platform_data; |
956 | ctrl_conf = omapfb_conf->ctrl_platform_data; | 954 | ctrl_conf = omapfb_conf->ctrl_platform_data; |
957 | 955 | ||
958 | if (ctrl_conf == NULL || ctrl_conf->get_clock_rate == NULL) { | 956 | if (ctrl_conf == NULL) { |
959 | dev_err(fbdev->dev, "HWA742: missing platform data\n"); | 957 | dev_err(fbdev->dev, "HWA742: missing platform data\n"); |
960 | r = -ENOENT; | 958 | r = -ENOENT; |
961 | goto err1; | 959 | goto err1; |
962 | } | 960 | } |
963 | 961 | ||
964 | hwa742.power_down = ctrl_conf->power_down; | 962 | hwa742.sys_ck = clk_get(NULL, "hwa_sys_ck"); |
965 | hwa742.power_up = ctrl_conf->power_up; | ||
966 | 963 | ||
967 | spin_lock_init(&hwa742.req_lock); | 964 | spin_lock_init(&hwa742.req_lock); |
968 | 965 | ||
@@ -972,12 +969,11 @@ static int hwa742_init(struct omapfb_device *fbdev, int ext_mode, | |||
972 | if ((r = hwa742.extif->init(fbdev)) < 0) | 969 | if ((r = hwa742.extif->init(fbdev)) < 0) |
973 | goto err2; | 970 | goto err2; |
974 | 971 | ||
975 | ext_clk = ctrl_conf->get_clock_rate(fbdev->dev); | 972 | ext_clk = clk_get_rate(hwa742.sys_ck); |
976 | if ((r = calc_extif_timings(ext_clk, &extif_mem_div)) < 0) | 973 | if ((r = calc_extif_timings(ext_clk, &extif_mem_div)) < 0) |
977 | goto err3; | 974 | goto err3; |
978 | hwa742.extif->set_timings(&hwa742.reg_timings); | 975 | hwa742.extif->set_timings(&hwa742.reg_timings); |
979 | if (hwa742.power_up != NULL) | 976 | clk_enable(hwa742.sys_ck); |
980 | hwa742.power_up(fbdev->dev); | ||
981 | 977 | ||
982 | calc_hwa742_clk_rates(ext_clk, &sys_clk, &pix_clk); | 978 | calc_hwa742_clk_rates(ext_clk, &sys_clk, &pix_clk); |
983 | if ((r = calc_extif_timings(sys_clk, &extif_mem_div)) < 0) | 979 | if ((r = calc_extif_timings(sys_clk, &extif_mem_div)) < 0) |
@@ -1040,8 +1036,7 @@ static int hwa742_init(struct omapfb_device *fbdev, int ext_mode, | |||
1040 | 1036 | ||
1041 | return 0; | 1037 | return 0; |
1042 | err4: | 1038 | err4: |
1043 | if (hwa742.power_down != NULL) | 1039 | clk_disable(hwa742.sys_ck); |
1044 | hwa742.power_down(fbdev->dev); | ||
1045 | err3: | 1040 | err3: |
1046 | hwa742.extif->cleanup(); | 1041 | hwa742.extif->cleanup(); |
1047 | err2: | 1042 | err2: |
@@ -1055,8 +1050,7 @@ static void hwa742_cleanup(void) | |||
1055 | hwa742_set_update_mode(OMAPFB_UPDATE_DISABLED); | 1050 | hwa742_set_update_mode(OMAPFB_UPDATE_DISABLED); |
1056 | hwa742.extif->cleanup(); | 1051 | hwa742.extif->cleanup(); |
1057 | hwa742.int_ctrl->cleanup(); | 1052 | hwa742.int_ctrl->cleanup(); |
1058 | if (hwa742.power_down != NULL) | 1053 | clk_disable(hwa742.sys_ck); |
1059 | hwa742.power_down(hwa742.fbdev->dev); | ||
1060 | } | 1054 | } |
1061 | 1055 | ||
1062 | struct lcd_ctrl hwa742_ctrl = { | 1056 | struct lcd_ctrl hwa742_ctrl = { |
diff --git a/drivers/video/pxa168fb.c b/drivers/video/pxa168fb.c new file mode 100644 index 000000000000..84d8327e47db --- /dev/null +++ b/drivers/video/pxa168fb.c | |||
@@ -0,0 +1,803 @@ | |||
1 | /* | ||
2 | * linux/drivers/video/pxa168fb.c -- Marvell PXA168 LCD Controller | ||
3 | * | ||
4 | * Copyright (C) 2008 Marvell International Ltd. | ||
5 | * All rights reserved. | ||
6 | * | ||
7 | * 2009-02-16 adapted from original version for PXA168/910 | ||
8 | * Jun Nie <njun@marvell.com> | ||
9 | * | ||
10 | * This file is subject to the terms and conditions of the GNU General Public | ||
11 | * License. See the file COPYING in the main directory of this archive for | ||
12 | * more details. | ||
13 | */ | ||
14 | |||
15 | #include <linux/module.h> | ||
16 | #include <linux/kernel.h> | ||
17 | #include <linux/sched.h> | ||
18 | #include <linux/string.h> | ||
19 | #include <linux/interrupt.h> | ||
20 | #include <linux/slab.h> | ||
21 | #include <linux/fb.h> | ||
22 | #include <linux/delay.h> | ||
23 | #include <linux/init.h> | ||
24 | #include <linux/ioport.h> | ||
25 | #include <linux/platform_device.h> | ||
26 | #include <linux/dma-mapping.h> | ||
27 | #include <linux/clk.h> | ||
28 | #include <linux/err.h> | ||
29 | #include <linux/uaccess.h> | ||
30 | #include <video/pxa168fb.h> | ||
31 | |||
32 | #include "pxa168fb.h" | ||
33 | |||
34 | #define DEFAULT_REFRESH 60 /* Hz */ | ||
35 | |||
36 | static int determine_best_pix_fmt(struct fb_var_screeninfo *var) | ||
37 | { | ||
38 | /* | ||
39 | * Pseudocolor mode? | ||
40 | */ | ||
41 | if (var->bits_per_pixel == 8) | ||
42 | return PIX_FMT_PSEUDOCOLOR; | ||
43 | |||
44 | /* | ||
45 | * Check for 565/1555. | ||
46 | */ | ||
47 | if (var->bits_per_pixel == 16 && var->red.length <= 5 && | ||
48 | var->green.length <= 6 && var->blue.length <= 5) { | ||
49 | if (var->transp.length == 0) { | ||
50 | if (var->red.offset >= var->blue.offset) | ||
51 | return PIX_FMT_RGB565; | ||
52 | else | ||
53 | return PIX_FMT_BGR565; | ||
54 | } | ||
55 | |||
56 | if (var->transp.length == 1 && var->green.length <= 5) { | ||
57 | if (var->red.offset >= var->blue.offset) | ||
58 | return PIX_FMT_RGB1555; | ||
59 | else | ||
60 | return PIX_FMT_BGR1555; | ||
61 | } | ||
62 | |||
63 | /* fall through */ | ||
64 | } | ||
65 | |||
66 | /* | ||
67 | * Check for 888/A888. | ||
68 | */ | ||
69 | if (var->bits_per_pixel <= 32 && var->red.length <= 8 && | ||
70 | var->green.length <= 8 && var->blue.length <= 8) { | ||
71 | if (var->bits_per_pixel == 24 && var->transp.length == 0) { | ||
72 | if (var->red.offset >= var->blue.offset) | ||
73 | return PIX_FMT_RGB888PACK; | ||
74 | else | ||
75 | return PIX_FMT_BGR888PACK; | ||
76 | } | ||
77 | |||
78 | if (var->bits_per_pixel == 32 && var->transp.length == 8) { | ||
79 | if (var->red.offset >= var->blue.offset) | ||
80 | return PIX_FMT_RGBA888; | ||
81 | else | ||
82 | return PIX_FMT_BGRA888; | ||
83 | } else { | ||
84 | if (var->red.offset >= var->blue.offset) | ||
85 | return PIX_FMT_RGB888UNPACK; | ||
86 | else | ||
87 | return PIX_FMT_BGR888UNPACK; | ||
88 | } | ||
89 | |||
90 | /* fall through */ | ||
91 | } | ||
92 | |||
93 | return -EINVAL; | ||
94 | } | ||
95 | |||
96 | static void set_pix_fmt(struct fb_var_screeninfo *var, int pix_fmt) | ||
97 | { | ||
98 | switch (pix_fmt) { | ||
99 | case PIX_FMT_RGB565: | ||
100 | var->bits_per_pixel = 16; | ||
101 | var->red.offset = 11; var->red.length = 5; | ||
102 | var->green.offset = 5; var->green.length = 6; | ||
103 | var->blue.offset = 0; var->blue.length = 5; | ||
104 | var->transp.offset = 0; var->transp.length = 0; | ||
105 | break; | ||
106 | case PIX_FMT_BGR565: | ||
107 | var->bits_per_pixel = 16; | ||
108 | var->red.offset = 0; var->red.length = 5; | ||
109 | var->green.offset = 5; var->green.length = 6; | ||
110 | var->blue.offset = 11; var->blue.length = 5; | ||
111 | var->transp.offset = 0; var->transp.length = 0; | ||
112 | break; | ||
113 | case PIX_FMT_RGB1555: | ||
114 | var->bits_per_pixel = 16; | ||
115 | var->red.offset = 10; var->red.length = 5; | ||
116 | var->green.offset = 5; var->green.length = 5; | ||
117 | var->blue.offset = 0; var->blue.length = 5; | ||
118 | var->transp.offset = 15; var->transp.length = 1; | ||
119 | break; | ||
120 | case PIX_FMT_BGR1555: | ||
121 | var->bits_per_pixel = 16; | ||
122 | var->red.offset = 0; var->red.length = 5; | ||
123 | var->green.offset = 5; var->green.length = 5; | ||
124 | var->blue.offset = 10; var->blue.length = 5; | ||
125 | var->transp.offset = 15; var->transp.length = 1; | ||
126 | break; | ||
127 | case PIX_FMT_RGB888PACK: | ||
128 | var->bits_per_pixel = 24; | ||
129 | var->red.offset = 16; var->red.length = 8; | ||
130 | var->green.offset = 8; var->green.length = 8; | ||
131 | var->blue.offset = 0; var->blue.length = 8; | ||
132 | var->transp.offset = 0; var->transp.length = 0; | ||
133 | break; | ||
134 | case PIX_FMT_BGR888PACK: | ||
135 | var->bits_per_pixel = 24; | ||
136 | var->red.offset = 0; var->red.length = 8; | ||
137 | var->green.offset = 8; var->green.length = 8; | ||
138 | var->blue.offset = 16; var->blue.length = 8; | ||
139 | var->transp.offset = 0; var->transp.length = 0; | ||
140 | break; | ||
141 | case PIX_FMT_RGBA888: | ||
142 | var->bits_per_pixel = 32; | ||
143 | var->red.offset = 16; var->red.length = 8; | ||
144 | var->green.offset = 8; var->green.length = 8; | ||
145 | var->blue.offset = 0; var->blue.length = 8; | ||
146 | var->transp.offset = 24; var->transp.length = 8; | ||
147 | break; | ||
148 | case PIX_FMT_BGRA888: | ||
149 | var->bits_per_pixel = 32; | ||
150 | var->red.offset = 0; var->red.length = 8; | ||
151 | var->green.offset = 8; var->green.length = 8; | ||
152 | var->blue.offset = 16; var->blue.length = 8; | ||
153 | var->transp.offset = 24; var->transp.length = 8; | ||
154 | break; | ||
155 | case PIX_FMT_PSEUDOCOLOR: | ||
156 | var->bits_per_pixel = 8; | ||
157 | var->red.offset = 0; var->red.length = 8; | ||
158 | var->green.offset = 0; var->green.length = 8; | ||
159 | var->blue.offset = 0; var->blue.length = 8; | ||
160 | var->transp.offset = 0; var->transp.length = 0; | ||
161 | break; | ||
162 | } | ||
163 | } | ||
164 | |||
165 | static void set_mode(struct pxa168fb_info *fbi, struct fb_var_screeninfo *var, | ||
166 | struct fb_videomode *mode, int pix_fmt, int ystretch) | ||
167 | { | ||
168 | struct fb_info *info = fbi->info; | ||
169 | |||
170 | set_pix_fmt(var, pix_fmt); | ||
171 | |||
172 | var->xres = mode->xres; | ||
173 | var->yres = mode->yres; | ||
174 | var->xres_virtual = max(var->xres, var->xres_virtual); | ||
175 | if (ystretch) | ||
176 | var->yres_virtual = info->fix.smem_len / | ||
177 | (var->xres_virtual * (var->bits_per_pixel >> 3)); | ||
178 | else | ||
179 | var->yres_virtual = max(var->yres, var->yres_virtual); | ||
180 | var->grayscale = 0; | ||
181 | var->accel_flags = FB_ACCEL_NONE; | ||
182 | var->pixclock = mode->pixclock; | ||
183 | var->left_margin = mode->left_margin; | ||
184 | var->right_margin = mode->right_margin; | ||
185 | var->upper_margin = mode->upper_margin; | ||
186 | var->lower_margin = mode->lower_margin; | ||
187 | var->hsync_len = mode->hsync_len; | ||
188 | var->vsync_len = mode->vsync_len; | ||
189 | var->sync = mode->sync; | ||
190 | var->vmode = FB_VMODE_NONINTERLACED; | ||
191 | var->rotate = FB_ROTATE_UR; | ||
192 | } | ||
193 | |||
194 | static int pxa168fb_check_var(struct fb_var_screeninfo *var, | ||
195 | struct fb_info *info) | ||
196 | { | ||
197 | struct pxa168fb_info *fbi = info->par; | ||
198 | int pix_fmt; | ||
199 | |||
200 | /* | ||
201 | * Determine which pixel format we're going to use. | ||
202 | */ | ||
203 | pix_fmt = determine_best_pix_fmt(var); | ||
204 | if (pix_fmt < 0) | ||
205 | return pix_fmt; | ||
206 | set_pix_fmt(var, pix_fmt); | ||
207 | fbi->pix_fmt = pix_fmt; | ||
208 | |||
209 | /* | ||
210 | * Basic geometry sanity checks. | ||
211 | */ | ||
212 | if (var->xoffset + var->xres > var->xres_virtual) | ||
213 | return -EINVAL; | ||
214 | if (var->yoffset + var->yres > var->yres_virtual) | ||
215 | return -EINVAL; | ||
216 | if (var->xres + var->right_margin + | ||
217 | var->hsync_len + var->left_margin > 2048) | ||
218 | return -EINVAL; | ||
219 | if (var->yres + var->lower_margin + | ||
220 | var->vsync_len + var->upper_margin > 2048) | ||
221 | return -EINVAL; | ||
222 | |||
223 | /* | ||
224 | * Check size of framebuffer. | ||
225 | */ | ||
226 | if (var->xres_virtual * var->yres_virtual * | ||
227 | (var->bits_per_pixel >> 3) > info->fix.smem_len) | ||
228 | return -EINVAL; | ||
229 | |||
230 | return 0; | ||
231 | } | ||
232 | |||
233 | /* | ||
234 | * The hardware clock divider has an integer and a fractional | ||
235 | * stage: | ||
236 | * | ||
237 | * clk2 = clk_in / integer_divider | ||
238 | * clk_out = clk2 * (1 - (fractional_divider >> 12)) | ||
239 | * | ||
240 | * Calculate integer and fractional divider for given clk_in | ||
241 | * and clk_out. | ||
242 | */ | ||
243 | static void set_clock_divider(struct pxa168fb_info *fbi, | ||
244 | const struct fb_videomode *m) | ||
245 | { | ||
246 | int divider_int; | ||
247 | int needed_pixclk; | ||
248 | u64 div_result; | ||
249 | u32 x = 0; | ||
250 | |||
251 | /* | ||
252 | * Notice: The field pixclock is used by linux fb | ||
253 | * is in pixel second. E.g. struct fb_videomode & | ||
254 | * struct fb_var_screeninfo | ||
255 | */ | ||
256 | |||
257 | /* | ||
258 | * Check input values. | ||
259 | */ | ||
260 | if (!m || !m->pixclock || !m->refresh) { | ||
261 | dev_err(fbi->dev, "Input refresh or pixclock is wrong.\n"); | ||
262 | return; | ||
263 | } | ||
264 | |||
265 | /* | ||
266 | * Using PLL/AXI clock. | ||
267 | */ | ||
268 | x = 0x80000000; | ||
269 | |||
270 | /* | ||
271 | * Calc divider according to refresh rate. | ||
272 | */ | ||
273 | div_result = 1000000000000ll; | ||
274 | do_div(div_result, m->pixclock); | ||
275 | needed_pixclk = (u32)div_result; | ||
276 | |||
277 | divider_int = clk_get_rate(fbi->clk) / needed_pixclk; | ||
278 | |||
279 | /* check whether divisor is too small. */ | ||
280 | if (divider_int < 2) { | ||
281 | dev_warn(fbi->dev, "Warning: clock source is too slow." | ||
282 | "Try smaller resolution\n"); | ||
283 | divider_int = 2; | ||
284 | } | ||
285 | |||
286 | /* | ||
287 | * Set setting to reg. | ||
288 | */ | ||
289 | x |= divider_int; | ||
290 | writel(x, fbi->reg_base + LCD_CFG_SCLK_DIV); | ||
291 | } | ||
292 | |||
293 | static void set_dma_control0(struct pxa168fb_info *fbi) | ||
294 | { | ||
295 | u32 x; | ||
296 | |||
297 | /* | ||
298 | * Set bit to enable graphics DMA. | ||
299 | */ | ||
300 | x = readl(fbi->reg_base + LCD_SPU_DMA_CTRL0); | ||
301 | x |= fbi->active ? 0x00000100 : 0; | ||
302 | fbi->active = 0; | ||
303 | |||
304 | /* | ||
305 | * If we are in a pseudo-color mode, we need to enable | ||
306 | * palette lookup. | ||
307 | */ | ||
308 | if (fbi->pix_fmt == PIX_FMT_PSEUDOCOLOR) | ||
309 | x |= 0x10000000; | ||
310 | |||
311 | /* | ||
312 | * Configure hardware pixel format. | ||
313 | */ | ||
314 | x &= ~(0xF << 16); | ||
315 | x |= (fbi->pix_fmt >> 1) << 16; | ||
316 | |||
317 | /* | ||
318 | * Check red and blue pixel swap. | ||
319 | * 1. source data swap | ||
320 | * 2. panel output data swap | ||
321 | */ | ||
322 | x &= ~(1 << 12); | ||
323 | x |= ((fbi->pix_fmt & 1) ^ (fbi->panel_rbswap)) << 12; | ||
324 | |||
325 | writel(x, fbi->reg_base + LCD_SPU_DMA_CTRL0); | ||
326 | } | ||
327 | |||
328 | static void set_dma_control1(struct pxa168fb_info *fbi, int sync) | ||
329 | { | ||
330 | u32 x; | ||
331 | |||
332 | /* | ||
333 | * Configure default bits: vsync triggers DMA, gated clock | ||
334 | * enable, power save enable, configure alpha registers to | ||
335 | * display 100% graphics, and set pixel command. | ||
336 | */ | ||
337 | x = readl(fbi->reg_base + LCD_SPU_DMA_CTRL1); | ||
338 | x |= 0x2032ff81; | ||
339 | |||
340 | /* | ||
341 | * We trigger DMA on the falling edge of vsync if vsync is | ||
342 | * active low, or on the rising edge if vsync is active high. | ||
343 | */ | ||
344 | if (!(sync & FB_SYNC_VERT_HIGH_ACT)) | ||
345 | x |= 0x08000000; | ||
346 | |||
347 | writel(x, fbi->reg_base + LCD_SPU_DMA_CTRL1); | ||
348 | } | ||
349 | |||
350 | static void set_graphics_start(struct fb_info *info, int xoffset, int yoffset) | ||
351 | { | ||
352 | struct pxa168fb_info *fbi = info->par; | ||
353 | struct fb_var_screeninfo *var = &info->var; | ||
354 | int pixel_offset; | ||
355 | unsigned long addr; | ||
356 | |||
357 | pixel_offset = (yoffset * var->xres_virtual) + xoffset; | ||
358 | |||
359 | addr = fbi->fb_start_dma + (pixel_offset * (var->bits_per_pixel >> 3)); | ||
360 | writel(addr, fbi->reg_base + LCD_CFG_GRA_START_ADDR0); | ||
361 | } | ||
362 | |||
363 | static void set_dumb_panel_control(struct fb_info *info) | ||
364 | { | ||
365 | struct pxa168fb_info *fbi = info->par; | ||
366 | struct pxa168fb_mach_info *mi = fbi->dev->platform_data; | ||
367 | u32 x; | ||
368 | |||
369 | /* | ||
370 | * Preserve enable flag. | ||
371 | */ | ||
372 | x = readl(fbi->reg_base + LCD_SPU_DUMB_CTRL) & 0x00000001; | ||
373 | |||
374 | x |= (fbi->is_blanked ? 0x7 : mi->dumb_mode) << 28; | ||
375 | x |= mi->gpio_output_data << 20; | ||
376 | x |= mi->gpio_output_mask << 12; | ||
377 | x |= mi->panel_rgb_reverse_lanes ? 0x00000080 : 0; | ||
378 | x |= mi->invert_composite_blank ? 0x00000040 : 0; | ||
379 | x |= (info->var.sync & FB_SYNC_COMP_HIGH_ACT) ? 0x00000020 : 0; | ||
380 | x |= mi->invert_pix_val_ena ? 0x00000010 : 0; | ||
381 | x |= (info->var.sync & FB_SYNC_VERT_HIGH_ACT) ? 0 : 0x00000008; | ||
382 | x |= (info->var.sync & FB_SYNC_HOR_HIGH_ACT) ? 0 : 0x00000004; | ||
383 | x |= mi->invert_pixclock ? 0x00000002 : 0; | ||
384 | |||
385 | writel(x, fbi->reg_base + LCD_SPU_DUMB_CTRL); | ||
386 | } | ||
387 | |||
388 | static void set_dumb_screen_dimensions(struct fb_info *info) | ||
389 | { | ||
390 | struct pxa168fb_info *fbi = info->par; | ||
391 | struct fb_var_screeninfo *v = &info->var; | ||
392 | int x; | ||
393 | int y; | ||
394 | |||
395 | x = v->xres + v->right_margin + v->hsync_len + v->left_margin; | ||
396 | y = v->yres + v->lower_margin + v->vsync_len + v->upper_margin; | ||
397 | |||
398 | writel((y << 16) | x, fbi->reg_base + LCD_SPUT_V_H_TOTAL); | ||
399 | } | ||
400 | |||
401 | static int pxa168fb_set_par(struct fb_info *info) | ||
402 | { | ||
403 | struct pxa168fb_info *fbi = info->par; | ||
404 | struct fb_var_screeninfo *var = &info->var; | ||
405 | struct fb_videomode mode; | ||
406 | u32 x; | ||
407 | struct pxa168fb_mach_info *mi; | ||
408 | |||
409 | mi = fbi->dev->platform_data; | ||
410 | |||
411 | /* | ||
412 | * Set additional mode info. | ||
413 | */ | ||
414 | if (fbi->pix_fmt == PIX_FMT_PSEUDOCOLOR) | ||
415 | info->fix.visual = FB_VISUAL_PSEUDOCOLOR; | ||
416 | else | ||
417 | info->fix.visual = FB_VISUAL_TRUECOLOR; | ||
418 | info->fix.line_length = var->xres_virtual * var->bits_per_pixel / 8; | ||
419 | info->fix.ypanstep = var->yres; | ||
420 | |||
421 | /* | ||
422 | * Disable panel output while we setup the display. | ||
423 | */ | ||
424 | x = readl(fbi->reg_base + LCD_SPU_DUMB_CTRL); | ||
425 | writel(x & ~1, fbi->reg_base + LCD_SPU_DUMB_CTRL); | ||
426 | |||
427 | /* | ||
428 | * Configure global panel parameters. | ||
429 | */ | ||
430 | writel((var->yres << 16) | var->xres, | ||
431 | fbi->reg_base + LCD_SPU_V_H_ACTIVE); | ||
432 | |||
433 | /* | ||
434 | * convet var to video mode | ||
435 | */ | ||
436 | fb_var_to_videomode(&mode, &info->var); | ||
437 | |||
438 | /* Calculate clock divisor. */ | ||
439 | set_clock_divider(fbi, &mode); | ||
440 | |||
441 | /* Configure dma ctrl regs. */ | ||
442 | set_dma_control0(fbi); | ||
443 | set_dma_control1(fbi, info->var.sync); | ||
444 | |||
445 | /* | ||
446 | * Configure graphics DMA parameters. | ||
447 | */ | ||
448 | x = readl(fbi->reg_base + LCD_CFG_GRA_PITCH); | ||
449 | x = (x & ~0xFFFF) | ((var->xres_virtual * var->bits_per_pixel) >> 3); | ||
450 | writel(x, fbi->reg_base + LCD_CFG_GRA_PITCH); | ||
451 | writel((var->yres << 16) | var->xres, | ||
452 | fbi->reg_base + LCD_SPU_GRA_HPXL_VLN); | ||
453 | writel((var->yres << 16) | var->xres, | ||
454 | fbi->reg_base + LCD_SPU_GZM_HPXL_VLN); | ||
455 | |||
456 | /* | ||
457 | * Configure dumb panel ctrl regs & timings. | ||
458 | */ | ||
459 | set_dumb_panel_control(info); | ||
460 | set_dumb_screen_dimensions(info); | ||
461 | |||
462 | writel((var->left_margin << 16) | var->right_margin, | ||
463 | fbi->reg_base + LCD_SPU_H_PORCH); | ||
464 | writel((var->upper_margin << 16) | var->lower_margin, | ||
465 | fbi->reg_base + LCD_SPU_V_PORCH); | ||
466 | |||
467 | /* | ||
468 | * Re-enable panel output. | ||
469 | */ | ||
470 | x = readl(fbi->reg_base + LCD_SPU_DUMB_CTRL); | ||
471 | writel(x | 1, fbi->reg_base + LCD_SPU_DUMB_CTRL); | ||
472 | |||
473 | return 0; | ||
474 | } | ||
475 | |||
476 | static unsigned int chan_to_field(unsigned int chan, struct fb_bitfield *bf) | ||
477 | { | ||
478 | return ((chan & 0xffff) >> (16 - bf->length)) << bf->offset; | ||
479 | } | ||
480 | |||
481 | static u32 to_rgb(u16 red, u16 green, u16 blue) | ||
482 | { | ||
483 | red >>= 8; | ||
484 | green >>= 8; | ||
485 | blue >>= 8; | ||
486 | |||
487 | return (red << 16) | (green << 8) | blue; | ||
488 | } | ||
489 | |||
490 | static int | ||
491 | pxa168fb_setcolreg(unsigned int regno, unsigned int red, unsigned int green, | ||
492 | unsigned int blue, unsigned int trans, struct fb_info *info) | ||
493 | { | ||
494 | struct pxa168fb_info *fbi = info->par; | ||
495 | u32 val; | ||
496 | |||
497 | if (info->var.grayscale) | ||
498 | red = green = blue = (19595 * red + 38470 * green + | ||
499 | 7471 * blue) >> 16; | ||
500 | |||
501 | if (info->fix.visual == FB_VISUAL_TRUECOLOR && regno < 16) { | ||
502 | val = chan_to_field(red, &info->var.red); | ||
503 | val |= chan_to_field(green, &info->var.green); | ||
504 | val |= chan_to_field(blue , &info->var.blue); | ||
505 | fbi->pseudo_palette[regno] = val; | ||
506 | } | ||
507 | |||
508 | if (info->fix.visual == FB_VISUAL_PSEUDOCOLOR && regno < 256) { | ||
509 | val = to_rgb(red, green, blue); | ||
510 | writel(val, fbi->reg_base + LCD_SPU_SRAM_WRDAT); | ||
511 | writel(0x8300 | regno, fbi->reg_base + LCD_SPU_SRAM_CTRL); | ||
512 | } | ||
513 | |||
514 | return 0; | ||
515 | } | ||
516 | |||
517 | static int pxa168fb_blank(int blank, struct fb_info *info) | ||
518 | { | ||
519 | struct pxa168fb_info *fbi = info->par; | ||
520 | |||
521 | fbi->is_blanked = (blank == FB_BLANK_UNBLANK) ? 0 : 1; | ||
522 | set_dumb_panel_control(info); | ||
523 | |||
524 | return 0; | ||
525 | } | ||
526 | |||
527 | static int pxa168fb_pan_display(struct fb_var_screeninfo *var, | ||
528 | struct fb_info *info) | ||
529 | { | ||
530 | set_graphics_start(info, var->xoffset, var->yoffset); | ||
531 | |||
532 | return 0; | ||
533 | } | ||
534 | |||
535 | static irqreturn_t pxa168fb_handle_irq(int irq, void *dev_id) | ||
536 | { | ||
537 | struct pxa168fb_info *fbi = dev_id; | ||
538 | u32 isr = readl(fbi->reg_base + SPU_IRQ_ISR); | ||
539 | |||
540 | if ((isr & GRA_FRAME_IRQ0_ENA_MASK)) { | ||
541 | |||
542 | writel(isr & (~GRA_FRAME_IRQ0_ENA_MASK), | ||
543 | fbi->reg_base + SPU_IRQ_ISR); | ||
544 | |||
545 | return IRQ_HANDLED; | ||
546 | } | ||
547 | return IRQ_NONE; | ||
548 | } | ||
549 | |||
550 | static struct fb_ops pxa168fb_ops = { | ||
551 | .owner = THIS_MODULE, | ||
552 | .fb_check_var = pxa168fb_check_var, | ||
553 | .fb_set_par = pxa168fb_set_par, | ||
554 | .fb_setcolreg = pxa168fb_setcolreg, | ||
555 | .fb_blank = pxa168fb_blank, | ||
556 | .fb_pan_display = pxa168fb_pan_display, | ||
557 | .fb_fillrect = cfb_fillrect, | ||
558 | .fb_copyarea = cfb_copyarea, | ||
559 | .fb_imageblit = cfb_imageblit, | ||
560 | }; | ||
561 | |||
562 | static int __init pxa168fb_init_mode(struct fb_info *info, | ||
563 | struct pxa168fb_mach_info *mi) | ||
564 | { | ||
565 | struct pxa168fb_info *fbi = info->par; | ||
566 | struct fb_var_screeninfo *var = &info->var; | ||
567 | int ret = 0; | ||
568 | u32 total_w, total_h, refresh; | ||
569 | u64 div_result; | ||
570 | const struct fb_videomode *m; | ||
571 | |||
572 | /* | ||
573 | * Set default value | ||
574 | */ | ||
575 | refresh = DEFAULT_REFRESH; | ||
576 | |||
577 | /* try to find best video mode. */ | ||
578 | m = fb_find_best_mode(&info->var, &info->modelist); | ||
579 | if (m) | ||
580 | fb_videomode_to_var(&info->var, m); | ||
581 | |||
582 | /* Init settings. */ | ||
583 | var->xres_virtual = var->xres; | ||
584 | var->yres_virtual = info->fix.smem_len / | ||
585 | (var->xres_virtual * (var->bits_per_pixel >> 3)); | ||
586 | dev_dbg(fbi->dev, "pxa168fb: find best mode: res = %dx%d\n", | ||
587 | var->xres, var->yres); | ||
588 | |||
589 | /* correct pixclock. */ | ||
590 | total_w = var->xres + var->left_margin + var->right_margin + | ||
591 | var->hsync_len; | ||
592 | total_h = var->yres + var->upper_margin + var->lower_margin + | ||
593 | var->vsync_len; | ||
594 | |||
595 | div_result = 1000000000000ll; | ||
596 | do_div(div_result, total_w * total_h * refresh); | ||
597 | var->pixclock = (u32)div_result; | ||
598 | |||
599 | return ret; | ||
600 | } | ||
601 | |||
602 | static int __init pxa168fb_probe(struct platform_device *pdev) | ||
603 | { | ||
604 | struct pxa168fb_mach_info *mi; | ||
605 | struct fb_info *info = 0; | ||
606 | struct pxa168fb_info *fbi = 0; | ||
607 | struct resource *res; | ||
608 | struct clk *clk; | ||
609 | int irq, ret; | ||
610 | |||
611 | mi = pdev->dev.platform_data; | ||
612 | if (mi == NULL) { | ||
613 | dev_err(&pdev->dev, "no platform data defined\n"); | ||
614 | return -EINVAL; | ||
615 | } | ||
616 | |||
617 | clk = clk_get(&pdev->dev, "LCDCLK"); | ||
618 | if (IS_ERR(clk)) { | ||
619 | dev_err(&pdev->dev, "unable to get LCDCLK"); | ||
620 | return PTR_ERR(clk); | ||
621 | } | ||
622 | |||
623 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
624 | if (res == NULL) { | ||
625 | dev_err(&pdev->dev, "no IO memory defined\n"); | ||
626 | return -ENOENT; | ||
627 | } | ||
628 | |||
629 | irq = platform_get_irq(pdev, 0); | ||
630 | if (irq < 0) { | ||
631 | dev_err(&pdev->dev, "no IRQ defined\n"); | ||
632 | return -ENOENT; | ||
633 | } | ||
634 | |||
635 | info = framebuffer_alloc(sizeof(struct pxa168fb_info), &pdev->dev); | ||
636 | if (info == NULL) { | ||
637 | clk_put(clk); | ||
638 | return -ENOMEM; | ||
639 | } | ||
640 | |||
641 | /* Initialize private data */ | ||
642 | fbi = info->par; | ||
643 | fbi->info = info; | ||
644 | fbi->clk = clk; | ||
645 | fbi->dev = info->dev = &pdev->dev; | ||
646 | fbi->panel_rbswap = mi->panel_rbswap; | ||
647 | fbi->is_blanked = 0; | ||
648 | fbi->active = mi->active; | ||
649 | |||
650 | /* | ||
651 | * Initialise static fb parameters. | ||
652 | */ | ||
653 | info->flags = FBINFO_DEFAULT | FBINFO_PARTIAL_PAN_OK | | ||
654 | FBINFO_HWACCEL_XPAN | FBINFO_HWACCEL_YPAN; | ||
655 | info->node = -1; | ||
656 | strlcpy(info->fix.id, mi->id, 16); | ||
657 | info->fix.type = FB_TYPE_PACKED_PIXELS; | ||
658 | info->fix.type_aux = 0; | ||
659 | info->fix.xpanstep = 0; | ||
660 | info->fix.ypanstep = 0; | ||
661 | info->fix.ywrapstep = 0; | ||
662 | info->fix.mmio_start = res->start; | ||
663 | info->fix.mmio_len = res->end - res->start + 1; | ||
664 | info->fix.accel = FB_ACCEL_NONE; | ||
665 | info->fbops = &pxa168fb_ops; | ||
666 | info->pseudo_palette = fbi->pseudo_palette; | ||
667 | |||
668 | /* | ||
669 | * Map LCD controller registers. | ||
670 | */ | ||
671 | fbi->reg_base = ioremap_nocache(res->start, res->end - res->start); | ||
672 | if (fbi->reg_base == NULL) { | ||
673 | ret = -ENOMEM; | ||
674 | goto failed; | ||
675 | } | ||
676 | |||
677 | /* | ||
678 | * Allocate framebuffer memory. | ||
679 | */ | ||
680 | info->fix.smem_len = PAGE_ALIGN(DEFAULT_FB_SIZE); | ||
681 | |||
682 | info->screen_base = dma_alloc_writecombine(fbi->dev, info->fix.smem_len, | ||
683 | &fbi->fb_start_dma, GFP_KERNEL); | ||
684 | if (info->screen_base == NULL) { | ||
685 | ret = -ENOMEM; | ||
686 | goto failed; | ||
687 | } | ||
688 | |||
689 | info->fix.smem_start = (unsigned long)fbi->fb_start_dma; | ||
690 | |||
691 | /* | ||
692 | * Set video mode according to platform data. | ||
693 | */ | ||
694 | set_mode(fbi, &info->var, mi->modes, mi->pix_fmt, 1); | ||
695 | |||
696 | fb_videomode_to_modelist(mi->modes, mi->num_modes, &info->modelist); | ||
697 | |||
698 | /* | ||
699 | * init video mode data. | ||
700 | */ | ||
701 | pxa168fb_init_mode(info, mi); | ||
702 | |||
703 | ret = pxa168fb_check_var(&info->var, info); | ||
704 | if (ret) | ||
705 | goto failed_free_fbmem; | ||
706 | |||
707 | /* | ||
708 | * Fill in sane defaults. | ||
709 | */ | ||
710 | ret = pxa168fb_check_var(&info->var, info); | ||
711 | if (ret) | ||
712 | goto failed; | ||
713 | |||
714 | /* | ||
715 | * enable controller clock | ||
716 | */ | ||
717 | clk_enable(fbi->clk); | ||
718 | |||
719 | pxa168fb_set_par(info); | ||
720 | |||
721 | /* | ||
722 | * Configure default register values. | ||
723 | */ | ||
724 | writel(0, fbi->reg_base + LCD_SPU_BLANKCOLOR); | ||
725 | writel(mi->io_pin_allocation_mode, fbi->reg_base + SPU_IOPAD_CONTROL); | ||
726 | writel(0, fbi->reg_base + LCD_CFG_GRA_START_ADDR1); | ||
727 | writel(0, fbi->reg_base + LCD_SPU_GRA_OVSA_HPXL_VLN); | ||
728 | writel(0, fbi->reg_base + LCD_SPU_SRAM_PARA0); | ||
729 | writel(CFG_CSB_256x32(0x1)|CFG_CSB_256x24(0x1)|CFG_CSB_256x8(0x1), | ||
730 | fbi->reg_base + LCD_SPU_SRAM_PARA1); | ||
731 | |||
732 | /* | ||
733 | * Allocate color map. | ||
734 | */ | ||
735 | if (fb_alloc_cmap(&info->cmap, 256, 0) < 0) { | ||
736 | ret = -ENOMEM; | ||
737 | goto failed_free_clk; | ||
738 | } | ||
739 | |||
740 | /* | ||
741 | * Register irq handler. | ||
742 | */ | ||
743 | ret = request_irq(irq, pxa168fb_handle_irq, IRQF_SHARED, | ||
744 | info->fix.id, fbi); | ||
745 | if (ret < 0) { | ||
746 | dev_err(&pdev->dev, "unable to request IRQ\n"); | ||
747 | ret = -ENXIO; | ||
748 | goto failed_free_cmap; | ||
749 | } | ||
750 | |||
751 | /* | ||
752 | * Enable GFX interrupt | ||
753 | */ | ||
754 | writel(GRA_FRAME_IRQ0_ENA(0x1), fbi->reg_base + SPU_IRQ_ENA); | ||
755 | |||
756 | /* | ||
757 | * Register framebuffer. | ||
758 | */ | ||
759 | ret = register_framebuffer(info); | ||
760 | if (ret < 0) { | ||
761 | dev_err(&pdev->dev, "Failed to register pxa168-fb: %d\n", ret); | ||
762 | ret = -ENXIO; | ||
763 | goto failed_free_irq; | ||
764 | } | ||
765 | |||
766 | platform_set_drvdata(pdev, fbi); | ||
767 | return 0; | ||
768 | |||
769 | failed_free_irq: | ||
770 | free_irq(irq, fbi); | ||
771 | failed_free_cmap: | ||
772 | fb_dealloc_cmap(&info->cmap); | ||
773 | failed_free_clk: | ||
774 | clk_disable(fbi->clk); | ||
775 | failed_free_fbmem: | ||
776 | dma_free_coherent(fbi->dev, info->fix.smem_len, | ||
777 | info->screen_base, fbi->fb_start_dma); | ||
778 | failed: | ||
779 | kfree(info); | ||
780 | clk_put(clk); | ||
781 | |||
782 | dev_err(&pdev->dev, "frame buffer device init failed with %d\n", ret); | ||
783 | return ret; | ||
784 | } | ||
785 | |||
786 | static struct platform_driver pxa168fb_driver = { | ||
787 | .driver = { | ||
788 | .name = "pxa168-fb", | ||
789 | .owner = THIS_MODULE, | ||
790 | }, | ||
791 | .probe = pxa168fb_probe, | ||
792 | }; | ||
793 | |||
794 | static int __devinit pxa168fb_init(void) | ||
795 | { | ||
796 | return platform_driver_register(&pxa168fb_driver); | ||
797 | } | ||
798 | module_init(pxa168fb_init); | ||
799 | |||
800 | MODULE_AUTHOR("Lennert Buytenhek <buytenh@marvell.com> " | ||
801 | "Green Wan <gwan@marvell.com>"); | ||
802 | MODULE_DESCRIPTION("Framebuffer driver for PXA168/910"); | ||
803 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/video/pxa168fb.h b/drivers/video/pxa168fb.h new file mode 100644 index 000000000000..eee09279c524 --- /dev/null +++ b/drivers/video/pxa168fb.h | |||
@@ -0,0 +1,558 @@ | |||
1 | #ifndef __PXA168FB_H__ | ||
2 | #define __PXA168FB_H__ | ||
3 | |||
4 | /* ------------< LCD register >------------ */ | ||
5 | /* Video Frame 0&1 start address registers */ | ||
6 | #define LCD_SPU_DMA_START_ADDR_Y0 0x00C0 | ||
7 | #define LCD_SPU_DMA_START_ADDR_U0 0x00C4 | ||
8 | #define LCD_SPU_DMA_START_ADDR_V0 0x00C8 | ||
9 | #define LCD_CFG_DMA_START_ADDR_0 0x00CC /* Cmd address */ | ||
10 | #define LCD_SPU_DMA_START_ADDR_Y1 0x00D0 | ||
11 | #define LCD_SPU_DMA_START_ADDR_U1 0x00D4 | ||
12 | #define LCD_SPU_DMA_START_ADDR_V1 0x00D8 | ||
13 | #define LCD_CFG_DMA_START_ADDR_1 0x00DC /* Cmd address */ | ||
14 | |||
15 | /* YC & UV Pitch */ | ||
16 | #define LCD_SPU_DMA_PITCH_YC 0x00E0 | ||
17 | #define SPU_DMA_PITCH_C(c) ((c) << 16) | ||
18 | #define SPU_DMA_PITCH_Y(y) (y) | ||
19 | #define LCD_SPU_DMA_PITCH_UV 0x00E4 | ||
20 | #define SPU_DMA_PITCH_V(v) ((v) << 16) | ||
21 | #define SPU_DMA_PITCH_U(u) (u) | ||
22 | |||
23 | /* Video Starting Point on Screen Register */ | ||
24 | #define LCD_SPUT_DMA_OVSA_HPXL_VLN 0x00E8 | ||
25 | #define CFG_DMA_OVSA_VLN(y) ((y) << 16) /* 0~0xfff */ | ||
26 | #define CFG_DMA_OVSA_HPXL(x) (x) /* 0~0xfff */ | ||
27 | |||
28 | /* Video Size Register */ | ||
29 | #define LCD_SPU_DMA_HPXL_VLN 0x00EC | ||
30 | #define CFG_DMA_VLN(y) ((y) << 16) | ||
31 | #define CFG_DMA_HPXL(x) (x) | ||
32 | |||
33 | /* Video Size After zooming Register */ | ||
34 | #define LCD_SPU_DZM_HPXL_VLN 0x00F0 | ||
35 | #define CFG_DZM_VLN(y) ((y) << 16) | ||
36 | #define CFG_DZM_HPXL(x) (x) | ||
37 | |||
38 | /* Graphic Frame 0&1 Starting Address Register */ | ||
39 | #define LCD_CFG_GRA_START_ADDR0 0x00F4 | ||
40 | #define LCD_CFG_GRA_START_ADDR1 0x00F8 | ||
41 | |||
42 | /* Graphic Frame Pitch */ | ||
43 | #define LCD_CFG_GRA_PITCH 0x00FC | ||
44 | |||
45 | /* Graphic Starting Point on Screen Register */ | ||
46 | #define LCD_SPU_GRA_OVSA_HPXL_VLN 0x0100 | ||
47 | #define CFG_GRA_OVSA_VLN(y) ((y) << 16) | ||
48 | #define CFG_GRA_OVSA_HPXL(x) (x) | ||
49 | |||
50 | /* Graphic Size Register */ | ||
51 | #define LCD_SPU_GRA_HPXL_VLN 0x0104 | ||
52 | #define CFG_GRA_VLN(y) ((y) << 16) | ||
53 | #define CFG_GRA_HPXL(x) (x) | ||
54 | |||
55 | /* Graphic Size after Zooming Register */ | ||
56 | #define LCD_SPU_GZM_HPXL_VLN 0x0108 | ||
57 | #define CFG_GZM_VLN(y) ((y) << 16) | ||
58 | #define CFG_GZM_HPXL(x) (x) | ||
59 | |||
60 | /* HW Cursor Starting Point on Screen Register */ | ||
61 | #define LCD_SPU_HWC_OVSA_HPXL_VLN 0x010C | ||
62 | #define CFG_HWC_OVSA_VLN(y) ((y) << 16) | ||
63 | #define CFG_HWC_OVSA_HPXL(x) (x) | ||
64 | |||
65 | /* HW Cursor Size */ | ||
66 | #define LCD_SPU_HWC_HPXL_VLN 0x0110 | ||
67 | #define CFG_HWC_VLN(y) ((y) << 16) | ||
68 | #define CFG_HWC_HPXL(x) (x) | ||
69 | |||
70 | /* Total Screen Size Register */ | ||
71 | #define LCD_SPUT_V_H_TOTAL 0x0114 | ||
72 | #define CFG_V_TOTAL(y) ((y) << 16) | ||
73 | #define CFG_H_TOTAL(x) (x) | ||
74 | |||
75 | /* Total Screen Active Size Register */ | ||
76 | #define LCD_SPU_V_H_ACTIVE 0x0118 | ||
77 | #define CFG_V_ACTIVE(y) ((y) << 16) | ||
78 | #define CFG_H_ACTIVE(x) (x) | ||
79 | |||
80 | /* Screen H&V Porch Register */ | ||
81 | #define LCD_SPU_H_PORCH 0x011C | ||
82 | #define CFG_H_BACK_PORCH(b) ((b) << 16) | ||
83 | #define CFG_H_FRONT_PORCH(f) (f) | ||
84 | #define LCD_SPU_V_PORCH 0x0120 | ||
85 | #define CFG_V_BACK_PORCH(b) ((b) << 16) | ||
86 | #define CFG_V_FRONT_PORCH(f) (f) | ||
87 | |||
88 | /* Screen Blank Color Register */ | ||
89 | #define LCD_SPU_BLANKCOLOR 0x0124 | ||
90 | #define CFG_BLANKCOLOR_MASK 0x00FFFFFF | ||
91 | #define CFG_BLANKCOLOR_R_MASK 0x000000FF | ||
92 | #define CFG_BLANKCOLOR_G_MASK 0x0000FF00 | ||
93 | #define CFG_BLANKCOLOR_B_MASK 0x00FF0000 | ||
94 | |||
95 | /* HW Cursor Color 1&2 Register */ | ||
96 | #define LCD_SPU_ALPHA_COLOR1 0x0128 | ||
97 | #define CFG_HWC_COLOR1 0x00FFFFFF | ||
98 | #define CFG_HWC_COLOR1_R(red) ((red) << 16) | ||
99 | #define CFG_HWC_COLOR1_G(green) ((green) << 8) | ||
100 | #define CFG_HWC_COLOR1_B(blue) (blue) | ||
101 | #define CFG_HWC_COLOR1_R_MASK 0x000000FF | ||
102 | #define CFG_HWC_COLOR1_G_MASK 0x0000FF00 | ||
103 | #define CFG_HWC_COLOR1_B_MASK 0x00FF0000 | ||
104 | #define LCD_SPU_ALPHA_COLOR2 0x012C | ||
105 | #define CFG_HWC_COLOR2 0x00FFFFFF | ||
106 | #define CFG_HWC_COLOR2_R_MASK 0x000000FF | ||
107 | #define CFG_HWC_COLOR2_G_MASK 0x0000FF00 | ||
108 | #define CFG_HWC_COLOR2_B_MASK 0x00FF0000 | ||
109 | |||
110 | /* Video YUV Color Key Control */ | ||
111 | #define LCD_SPU_COLORKEY_Y 0x0130 | ||
112 | #define CFG_CKEY_Y2(y2) ((y2) << 24) | ||
113 | #define CFG_CKEY_Y2_MASK 0xFF000000 | ||
114 | #define CFG_CKEY_Y1(y1) ((y1) << 16) | ||
115 | #define CFG_CKEY_Y1_MASK 0x00FF0000 | ||
116 | #define CFG_CKEY_Y(y) ((y) << 8) | ||
117 | #define CFG_CKEY_Y_MASK 0x0000FF00 | ||
118 | #define CFG_ALPHA_Y(y) (y) | ||
119 | #define CFG_ALPHA_Y_MASK 0x000000FF | ||
120 | #define LCD_SPU_COLORKEY_U 0x0134 | ||
121 | #define CFG_CKEY_U2(u2) ((u2) << 24) | ||
122 | #define CFG_CKEY_U2_MASK 0xFF000000 | ||
123 | #define CFG_CKEY_U1(u1) ((u1) << 16) | ||
124 | #define CFG_CKEY_U1_MASK 0x00FF0000 | ||
125 | #define CFG_CKEY_U(u) ((u) << 8) | ||
126 | #define CFG_CKEY_U_MASK 0x0000FF00 | ||
127 | #define CFG_ALPHA_U(u) (u) | ||
128 | #define CFG_ALPHA_U_MASK 0x000000FF | ||
129 | #define LCD_SPU_COLORKEY_V 0x0138 | ||
130 | #define CFG_CKEY_V2(v2) ((v2) << 24) | ||
131 | #define CFG_CKEY_V2_MASK 0xFF000000 | ||
132 | #define CFG_CKEY_V1(v1) ((v1) << 16) | ||
133 | #define CFG_CKEY_V1_MASK 0x00FF0000 | ||
134 | #define CFG_CKEY_V(v) ((v) << 8) | ||
135 | #define CFG_CKEY_V_MASK 0x0000FF00 | ||
136 | #define CFG_ALPHA_V(v) (v) | ||
137 | #define CFG_ALPHA_V_MASK 0x000000FF | ||
138 | |||
139 | /* SPI Read Data Register */ | ||
140 | #define LCD_SPU_SPI_RXDATA 0x0140 | ||
141 | |||
142 | /* Smart Panel Read Data Register */ | ||
143 | #define LCD_SPU_ISA_RSDATA 0x0144 | ||
144 | #define ISA_RXDATA_16BIT_1_DATA_MASK 0x000000FF | ||
145 | #define ISA_RXDATA_16BIT_2_DATA_MASK 0x0000FF00 | ||
146 | #define ISA_RXDATA_16BIT_3_DATA_MASK 0x00FF0000 | ||
147 | #define ISA_RXDATA_16BIT_4_DATA_MASK 0xFF000000 | ||
148 | #define ISA_RXDATA_32BIT_1_DATA_MASK 0x00FFFFFF | ||
149 | |||
150 | /* HWC SRAM Read Data Register */ | ||
151 | #define LCD_SPU_HWC_RDDAT 0x0158 | ||
152 | |||
153 | /* Gamma Table SRAM Read Data Register */ | ||
154 | #define LCD_SPU_GAMMA_RDDAT 0x015c | ||
155 | #define CFG_GAMMA_RDDAT_MASK 0x000000FF | ||
156 | |||
157 | /* Palette Table SRAM Read Data Register */ | ||
158 | #define LCD_SPU_PALETTE_RDDAT 0x0160 | ||
159 | #define CFG_PALETTE_RDDAT_MASK 0x00FFFFFF | ||
160 | |||
161 | /* I/O Pads Input Read Only Register */ | ||
162 | #define LCD_SPU_IOPAD_IN 0x0178 | ||
163 | #define CFG_IOPAD_IN_MASK 0x0FFFFFFF | ||
164 | |||
165 | /* Reserved Read Only Registers */ | ||
166 | #define LCD_CFG_RDREG5F 0x017C | ||
167 | #define IRE_FRAME_CNT_MASK 0x000000C0 | ||
168 | #define IPE_FRAME_CNT_MASK 0x00000030 | ||
169 | #define GRA_FRAME_CNT_MASK 0x0000000C /* Graphic */ | ||
170 | #define DMA_FRAME_CNT_MASK 0x00000003 /* Video */ | ||
171 | |||
172 | /* SPI Control Register. */ | ||
173 | #define LCD_SPU_SPI_CTRL 0x0180 | ||
174 | #define CFG_SCLKCNT(div) ((div) << 24) /* 0xFF~0x2 */ | ||
175 | #define CFG_SCLKCNT_MASK 0xFF000000 | ||
176 | #define CFG_RXBITS(rx) ((rx) << 16) /* 0x1F~0x1 */ | ||
177 | #define CFG_RXBITS_MASK 0x00FF0000 | ||
178 | #define CFG_TXBITS(tx) ((tx) << 8) /* 0x1F~0x1 */ | ||
179 | #define CFG_TXBITS_MASK 0x0000FF00 | ||
180 | #define CFG_CLKINV(clk) ((clk) << 7) | ||
181 | #define CFG_CLKINV_MASK 0x00000080 | ||
182 | #define CFG_KEEPXFER(transfer) ((transfer) << 6) | ||
183 | #define CFG_KEEPXFER_MASK 0x00000040 | ||
184 | #define CFG_RXBITSTO0(rx) ((rx) << 5) | ||
185 | #define CFG_RXBITSTO0_MASK 0x00000020 | ||
186 | #define CFG_TXBITSTO0(tx) ((tx) << 4) | ||
187 | #define CFG_TXBITSTO0_MASK 0x00000010 | ||
188 | #define CFG_SPI_ENA(spi) ((spi) << 3) | ||
189 | #define CFG_SPI_ENA_MASK 0x00000008 | ||
190 | #define CFG_SPI_SEL(spi) ((spi) << 2) | ||
191 | #define CFG_SPI_SEL_MASK 0x00000004 | ||
192 | #define CFG_SPI_3W4WB(wire) ((wire) << 1) | ||
193 | #define CFG_SPI_3W4WB_MASK 0x00000002 | ||
194 | #define CFG_SPI_START(start) (start) | ||
195 | #define CFG_SPI_START_MASK 0x00000001 | ||
196 | |||
197 | /* SPI Tx Data Register */ | ||
198 | #define LCD_SPU_SPI_TXDATA 0x0184 | ||
199 | |||
200 | /* | ||
201 | 1. Smart Pannel 8-bit Bus Control Register. | ||
202 | 2. AHB Slave Path Data Port Register | ||
203 | */ | ||
204 | #define LCD_SPU_SMPN_CTRL 0x0188 | ||
205 | |||
206 | /* DMA Control 0 Register */ | ||
207 | #define LCD_SPU_DMA_CTRL0 0x0190 | ||
208 | #define CFG_NOBLENDING(nb) ((nb) << 31) | ||
209 | #define CFG_NOBLENDING_MASK 0x80000000 | ||
210 | #define CFG_GAMMA_ENA(gn) ((gn) << 30) | ||
211 | #define CFG_GAMMA_ENA_MASK 0x40000000 | ||
212 | #define CFG_CBSH_ENA(cn) ((cn) << 29) | ||
213 | #define CFG_CBSH_ENA_MASK 0x20000000 | ||
214 | #define CFG_PALETTE_ENA(pn) ((pn) << 28) | ||
215 | #define CFG_PALETTE_ENA_MASK 0x10000000 | ||
216 | #define CFG_ARBFAST_ENA(an) ((an) << 27) | ||
217 | #define CFG_ARBFAST_ENA_MASK 0x08000000 | ||
218 | #define CFG_HWC_1BITMOD(mode) ((mode) << 26) | ||
219 | #define CFG_HWC_1BITMOD_MASK 0x04000000 | ||
220 | #define CFG_HWC_1BITENA(mn) ((mn) << 25) | ||
221 | #define CFG_HWC_1BITENA_MASK 0x02000000 | ||
222 | #define CFG_HWC_ENA(cn) ((cn) << 24) | ||
223 | #define CFG_HWC_ENA_MASK 0x01000000 | ||
224 | #define CFG_DMAFORMAT(dmaformat) ((dmaformat) << 20) | ||
225 | #define CFG_DMAFORMAT_MASK 0x00F00000 | ||
226 | #define CFG_GRAFORMAT(graformat) ((graformat) << 16) | ||
227 | #define CFG_GRAFORMAT_MASK 0x000F0000 | ||
228 | /* for graphic part */ | ||
229 | #define CFG_GRA_FTOGGLE(toggle) ((toggle) << 15) | ||
230 | #define CFG_GRA_FTOGGLE_MASK 0x00008000 | ||
231 | #define CFG_GRA_HSMOOTH(smooth) ((smooth) << 14) | ||
232 | #define CFG_GRA_HSMOOTH_MASK 0x00004000 | ||
233 | #define CFG_GRA_TSTMODE(test) ((test) << 13) | ||
234 | #define CFG_GRA_TSTMODE_MASK 0x00002000 | ||
235 | #define CFG_GRA_SWAPRB(swap) ((swap) << 12) | ||
236 | #define CFG_GRA_SWAPRB_MASK 0x00001000 | ||
237 | #define CFG_GRA_SWAPUV(swap) ((swap) << 11) | ||
238 | #define CFG_GRA_SWAPUV_MASK 0x00000800 | ||
239 | #define CFG_GRA_SWAPYU(swap) ((swap) << 10) | ||
240 | #define CFG_GRA_SWAPYU_MASK 0x00000400 | ||
241 | #define CFG_YUV2RGB_GRA(cvrt) ((cvrt) << 9) | ||
242 | #define CFG_YUV2RGB_GRA_MASK 0x00000200 | ||
243 | #define CFG_GRA_ENA(gra) ((gra) << 8) | ||
244 | #define CFG_GRA_ENA_MASK 0x00000100 | ||
245 | /* for video part */ | ||
246 | #define CFG_DMA_FTOGGLE(toggle) ((toggle) << 7) | ||
247 | #define CFG_DMA_FTOGGLE_MASK 0x00000080 | ||
248 | #define CFG_DMA_HSMOOTH(smooth) ((smooth) << 6) | ||
249 | #define CFG_DMA_HSMOOTH_MASK 0x00000040 | ||
250 | #define CFG_DMA_TSTMODE(test) ((test) << 5) | ||
251 | #define CFG_DMA_TSTMODE_MASK 0x00000020 | ||
252 | #define CFG_DMA_SWAPRB(swap) ((swap) << 4) | ||
253 | #define CFG_DMA_SWAPRB_MASK 0x00000010 | ||
254 | #define CFG_DMA_SWAPUV(swap) ((swap) << 3) | ||
255 | #define CFG_DMA_SWAPUV_MASK 0x00000008 | ||
256 | #define CFG_DMA_SWAPYU(swap) ((swap) << 2) | ||
257 | #define CFG_DMA_SWAPYU_MASK 0x00000004 | ||
258 | #define CFG_DMA_SWAP_MASK 0x0000001C | ||
259 | #define CFG_YUV2RGB_DMA(cvrt) ((cvrt) << 1) | ||
260 | #define CFG_YUV2RGB_DMA_MASK 0x00000002 | ||
261 | #define CFG_DMA_ENA(video) (video) | ||
262 | #define CFG_DMA_ENA_MASK 0x00000001 | ||
263 | |||
264 | /* DMA Control 1 Register */ | ||
265 | #define LCD_SPU_DMA_CTRL1 0x0194 | ||
266 | #define CFG_FRAME_TRIG(trig) ((trig) << 31) | ||
267 | #define CFG_FRAME_TRIG_MASK 0x80000000 | ||
268 | #define CFG_VSYNC_TRIG(trig) ((trig) << 28) | ||
269 | #define CFG_VSYNC_TRIG_MASK 0x70000000 | ||
270 | #define CFG_VSYNC_INV(inv) ((inv) << 27) | ||
271 | #define CFG_VSYNC_INV_MASK 0x08000000 | ||
272 | #define CFG_COLOR_KEY_MODE(cmode) ((cmode) << 24) | ||
273 | #define CFG_COLOR_KEY_MASK 0x07000000 | ||
274 | #define CFG_CARRY(carry) ((carry) << 23) | ||
275 | #define CFG_CARRY_MASK 0x00800000 | ||
276 | #define CFG_LNBUF_ENA(lnbuf) ((lnbuf) << 22) | ||
277 | #define CFG_LNBUF_ENA_MASK 0x00400000 | ||
278 | #define CFG_GATED_ENA(gated) ((gated) << 21) | ||
279 | #define CFG_GATED_ENA_MASK 0x00200000 | ||
280 | #define CFG_PWRDN_ENA(power) ((power) << 20) | ||
281 | #define CFG_PWRDN_ENA_MASK 0x00100000 | ||
282 | #define CFG_DSCALE(dscale) ((dscale) << 18) | ||
283 | #define CFG_DSCALE_MASK 0x000C0000 | ||
284 | #define CFG_ALPHA_MODE(amode) ((amode) << 16) | ||
285 | #define CFG_ALPHA_MODE_MASK 0x00030000 | ||
286 | #define CFG_ALPHA(alpha) ((alpha) << 8) | ||
287 | #define CFG_ALPHA_MASK 0x0000FF00 | ||
288 | #define CFG_PXLCMD(pxlcmd) (pxlcmd) | ||
289 | #define CFG_PXLCMD_MASK 0x000000FF | ||
290 | |||
291 | /* SRAM Control Register */ | ||
292 | #define LCD_SPU_SRAM_CTRL 0x0198 | ||
293 | #define CFG_SRAM_INIT_WR_RD(mode) ((mode) << 14) | ||
294 | #define CFG_SRAM_INIT_WR_RD_MASK 0x0000C000 | ||
295 | #define CFG_SRAM_ADDR_LCDID(id) ((id) << 8) | ||
296 | #define CFG_SRAM_ADDR_LCDID_MASK 0x00000F00 | ||
297 | #define CFG_SRAM_ADDR(addr) (addr) | ||
298 | #define CFG_SRAM_ADDR_MASK 0x000000FF | ||
299 | |||
300 | /* SRAM Write Data Register */ | ||
301 | #define LCD_SPU_SRAM_WRDAT 0x019C | ||
302 | |||
303 | /* SRAM RTC/WTC Control Register */ | ||
304 | #define LCD_SPU_SRAM_PARA0 0x01A0 | ||
305 | |||
306 | /* SRAM Power Down Control Register */ | ||
307 | #define LCD_SPU_SRAM_PARA1 0x01A4 | ||
308 | #define CFG_CSB_256x32(hwc) ((hwc) << 15) /* HWC */ | ||
309 | #define CFG_CSB_256x32_MASK 0x00008000 | ||
310 | #define CFG_CSB_256x24(palette) ((palette) << 14) /* Palette */ | ||
311 | #define CFG_CSB_256x24_MASK 0x00004000 | ||
312 | #define CFG_CSB_256x8(gamma) ((gamma) << 13) /* Gamma */ | ||
313 | #define CFG_CSB_256x8_MASK 0x00002000 | ||
314 | #define CFG_PDWN256x32(pdwn) ((pdwn) << 7) /* HWC */ | ||
315 | #define CFG_PDWN256x32_MASK 0x00000080 | ||
316 | #define CFG_PDWN256x24(pdwn) ((pdwn) << 6) /* Palette */ | ||
317 | #define CFG_PDWN256x24_MASK 0x00000040 | ||
318 | #define CFG_PDWN256x8(pdwn) ((pdwn) << 5) /* Gamma */ | ||
319 | #define CFG_PDWN256x8_MASK 0x00000020 | ||
320 | #define CFG_PDWN32x32(pdwn) ((pdwn) << 3) | ||
321 | #define CFG_PDWN32x32_MASK 0x00000008 | ||
322 | #define CFG_PDWN16x66(pdwn) ((pdwn) << 2) | ||
323 | #define CFG_PDWN16x66_MASK 0x00000004 | ||
324 | #define CFG_PDWN32x66(pdwn) ((pdwn) << 1) | ||
325 | #define CFG_PDWN32x66_MASK 0x00000002 | ||
326 | #define CFG_PDWN64x66(pdwn) (pdwn) | ||
327 | #define CFG_PDWN64x66_MASK 0x00000001 | ||
328 | |||
329 | /* Smart or Dumb Panel Clock Divider */ | ||
330 | #define LCD_CFG_SCLK_DIV 0x01A8 | ||
331 | #define SCLK_SOURCE_SELECT(src) ((src) << 31) | ||
332 | #define SCLK_SOURCE_SELECT_MASK 0x80000000 | ||
333 | #define CLK_FRACDIV(frac) ((frac) << 16) | ||
334 | #define CLK_FRACDIV_MASK 0x0FFF0000 | ||
335 | #define CLK_INT_DIV(div) (div) | ||
336 | #define CLK_INT_DIV_MASK 0x0000FFFF | ||
337 | |||
338 | /* Video Contrast Register */ | ||
339 | #define LCD_SPU_CONTRAST 0x01AC | ||
340 | #define CFG_BRIGHTNESS(bright) ((bright) << 16) | ||
341 | #define CFG_BRIGHTNESS_MASK 0xFFFF0000 | ||
342 | #define CFG_CONTRAST(contrast) (contrast) | ||
343 | #define CFG_CONTRAST_MASK 0x0000FFFF | ||
344 | |||
345 | /* Video Saturation Register */ | ||
346 | #define LCD_SPU_SATURATION 0x01B0 | ||
347 | #define CFG_C_MULTS(mult) ((mult) << 16) | ||
348 | #define CFG_C_MULTS_MASK 0xFFFF0000 | ||
349 | #define CFG_SATURATION(sat) (sat) | ||
350 | #define CFG_SATURATION_MASK 0x0000FFFF | ||
351 | |||
352 | /* Video Hue Adjust Register */ | ||
353 | #define LCD_SPU_CBSH_HUE 0x01B4 | ||
354 | #define CFG_SIN0(sin0) ((sin0) << 16) | ||
355 | #define CFG_SIN0_MASK 0xFFFF0000 | ||
356 | #define CFG_COS0(con0) (con0) | ||
357 | #define CFG_COS0_MASK 0x0000FFFF | ||
358 | |||
359 | /* Dump LCD Panel Control Register */ | ||
360 | #define LCD_SPU_DUMB_CTRL 0x01B8 | ||
361 | #define CFG_DUMBMODE(mode) ((mode) << 28) | ||
362 | #define CFG_DUMBMODE_MASK 0xF0000000 | ||
363 | #define CFG_LCDGPIO_O(data) ((data) << 20) | ||
364 | #define CFG_LCDGPIO_O_MASK 0x0FF00000 | ||
365 | #define CFG_LCDGPIO_ENA(gpio) ((gpio) << 12) | ||
366 | #define CFG_LCDGPIO_ENA_MASK 0x000FF000 | ||
367 | #define CFG_BIAS_OUT(bias) ((bias) << 8) | ||
368 | #define CFG_BIAS_OUT_MASK 0x00000100 | ||
369 | #define CFG_REVERSE_RGB(rRGB) ((rRGB) << 7) | ||
370 | #define CFG_REVERSE_RGB_MASK 0x00000080 | ||
371 | #define CFG_INV_COMPBLANK(blank) ((blank) << 6) | ||
372 | #define CFG_INV_COMPBLANK_MASK 0x00000040 | ||
373 | #define CFG_INV_COMPSYNC(sync) ((sync) << 5) | ||
374 | #define CFG_INV_COMPSYNC_MASK 0x00000020 | ||
375 | #define CFG_INV_HENA(hena) ((hena) << 4) | ||
376 | #define CFG_INV_HENA_MASK 0x00000010 | ||
377 | #define CFG_INV_VSYNC(vsync) ((vsync) << 3) | ||
378 | #define CFG_INV_VSYNC_MASK 0x00000008 | ||
379 | #define CFG_INV_HSYNC(hsync) ((hsync) << 2) | ||
380 | #define CFG_INV_HSYNC_MASK 0x00000004 | ||
381 | #define CFG_INV_PCLK(pclk) ((pclk) << 1) | ||
382 | #define CFG_INV_PCLK_MASK 0x00000002 | ||
383 | #define CFG_DUMB_ENA(dumb) (dumb) | ||
384 | #define CFG_DUMB_ENA_MASK 0x00000001 | ||
385 | |||
386 | /* LCD I/O Pads Control Register */ | ||
387 | #define SPU_IOPAD_CONTROL 0x01BC | ||
388 | #define CFG_GRA_VM_ENA(vm) ((vm) << 15) /* gfx */ | ||
389 | #define CFG_GRA_VM_ENA_MASK 0x00008000 | ||
390 | #define CFG_DMA_VM_ENA(vm) ((vm) << 13) /* video */ | ||
391 | #define CFG_DMA_VM_ENA_MASK 0x00002000 | ||
392 | #define CFG_CMD_VM_ENA(vm) ((vm) << 13) | ||
393 | #define CFG_CMD_VM_ENA_MASK 0x00000800 | ||
394 | #define CFG_CSC(csc) ((csc) << 8) /* csc */ | ||
395 | #define CFG_CSC_MASK 0x00000300 | ||
396 | #define CFG_AXICTRL(axi) ((axi) << 4) | ||
397 | #define CFG_AXICTRL_MASK 0x000000F0 | ||
398 | #define CFG_IOPADMODE(iopad) (iopad) | ||
399 | #define CFG_IOPADMODE_MASK 0x0000000F | ||
400 | |||
401 | /* LCD Interrupt Control Register */ | ||
402 | #define SPU_IRQ_ENA 0x01C0 | ||
403 | #define DMA_FRAME_IRQ0_ENA(irq) ((irq) << 31) | ||
404 | #define DMA_FRAME_IRQ0_ENA_MASK 0x80000000 | ||
405 | #define DMA_FRAME_IRQ1_ENA(irq) ((irq) << 30) | ||
406 | #define DMA_FRAME_IRQ1_ENA_MASK 0x40000000 | ||
407 | #define DMA_FF_UNDERFLOW_ENA(ff) ((ff) << 29) | ||
408 | #define DMA_FF_UNDERFLOW_ENA_MASK 0x20000000 | ||
409 | #define GRA_FRAME_IRQ0_ENA(irq) ((irq) << 27) | ||
410 | #define GRA_FRAME_IRQ0_ENA_MASK 0x08000000 | ||
411 | #define GRA_FRAME_IRQ1_ENA(irq) ((irq) << 26) | ||
412 | #define GRA_FRAME_IRQ1_ENA_MASK 0x04000000 | ||
413 | #define GRA_FF_UNDERFLOW_ENA(ff) ((ff) << 25) | ||
414 | #define GRA_FF_UNDERFLOW_ENA_MASK 0x02000000 | ||
415 | #define VSYNC_IRQ_ENA(vsync_irq) ((vsync_irq) << 23) | ||
416 | #define VSYNC_IRQ_ENA_MASK 0x00800000 | ||
417 | #define DUMB_FRAMEDONE_ENA(fdone) ((fdone) << 22) | ||
418 | #define DUMB_FRAMEDONE_ENA_MASK 0x00400000 | ||
419 | #define TWC_FRAMEDONE_ENA(fdone) ((fdone) << 21) | ||
420 | #define TWC_FRAMEDONE_ENA_MASK 0x00200000 | ||
421 | #define HWC_FRAMEDONE_ENA(fdone) ((fdone) << 20) | ||
422 | #define HWC_FRAMEDONE_ENA_MASK 0x00100000 | ||
423 | #define SLV_IRQ_ENA(irq) ((irq) << 19) | ||
424 | #define SLV_IRQ_ENA_MASK 0x00080000 | ||
425 | #define SPI_IRQ_ENA(irq) ((irq) << 18) | ||
426 | #define SPI_IRQ_ENA_MASK 0x00040000 | ||
427 | #define PWRDN_IRQ_ENA(irq) ((irq) << 17) | ||
428 | #define PWRDN_IRQ_ENA_MASK 0x00020000 | ||
429 | #define ERR_IRQ_ENA(irq) ((irq) << 16) | ||
430 | #define ERR_IRQ_ENA_MASK 0x00010000 | ||
431 | #define CLEAN_SPU_IRQ_ISR(irq) (irq) | ||
432 | #define CLEAN_SPU_IRQ_ISR_MASK 0x0000FFFF | ||
433 | |||
434 | /* LCD Interrupt Status Register */ | ||
435 | #define SPU_IRQ_ISR 0x01C4 | ||
436 | #define DMA_FRAME_IRQ0(irq) ((irq) << 31) | ||
437 | #define DMA_FRAME_IRQ0_MASK 0x80000000 | ||
438 | #define DMA_FRAME_IRQ1(irq) ((irq) << 30) | ||
439 | #define DMA_FRAME_IRQ1_MASK 0x40000000 | ||
440 | #define DMA_FF_UNDERFLOW(ff) ((ff) << 29) | ||
441 | #define DMA_FF_UNDERFLOW_MASK 0x20000000 | ||
442 | #define GRA_FRAME_IRQ0(irq) ((irq) << 27) | ||
443 | #define GRA_FRAME_IRQ0_MASK 0x08000000 | ||
444 | #define GRA_FRAME_IRQ1(irq) ((irq) << 26) | ||
445 | #define GRA_FRAME_IRQ1_MASK 0x04000000 | ||
446 | #define GRA_FF_UNDERFLOW(ff) ((ff) << 25) | ||
447 | #define GRA_FF_UNDERFLOW_MASK 0x02000000 | ||
448 | #define VSYNC_IRQ(vsync_irq) ((vsync_irq) << 23) | ||
449 | #define VSYNC_IRQ_MASK 0x00800000 | ||
450 | #define DUMB_FRAMEDONE(fdone) ((fdone) << 22) | ||
451 | #define DUMB_FRAMEDONE_MASK 0x00400000 | ||
452 | #define TWC_FRAMEDONE(fdone) ((fdone) << 21) | ||
453 | #define TWC_FRAMEDONE_MASK 0x00200000 | ||
454 | #define HWC_FRAMEDONE(fdone) ((fdone) << 20) | ||
455 | #define HWC_FRAMEDONE_MASK 0x00100000 | ||
456 | #define SLV_IRQ(irq) ((irq) << 19) | ||
457 | #define SLV_IRQ_MASK 0x00080000 | ||
458 | #define SPI_IRQ(irq) ((irq) << 18) | ||
459 | #define SPI_IRQ_MASK 0x00040000 | ||
460 | #define PWRDN_IRQ(irq) ((irq) << 17) | ||
461 | #define PWRDN_IRQ_MASK 0x00020000 | ||
462 | #define ERR_IRQ(irq) ((irq) << 16) | ||
463 | #define ERR_IRQ_MASK 0x00010000 | ||
464 | /* read-only */ | ||
465 | #define DMA_FRAME_IRQ0_LEVEL_MASK 0x00008000 | ||
466 | #define DMA_FRAME_IRQ1_LEVEL_MASK 0x00004000 | ||
467 | #define DMA_FRAME_CNT_ISR_MASK 0x00003000 | ||
468 | #define GRA_FRAME_IRQ0_LEVEL_MASK 0x00000800 | ||
469 | #define GRA_FRAME_IRQ1_LEVEL_MASK 0x00000400 | ||
470 | #define GRA_FRAME_CNT_ISR_MASK 0x00000300 | ||
471 | #define VSYNC_IRQ_LEVEL_MASK 0x00000080 | ||
472 | #define DUMB_FRAMEDONE_LEVEL_MASK 0x00000040 | ||
473 | #define TWC_FRAMEDONE_LEVEL_MASK 0x00000020 | ||
474 | #define HWC_FRAMEDONE_LEVEL_MASK 0x00000010 | ||
475 | #define SLV_FF_EMPTY_MASK 0x00000008 | ||
476 | #define DMA_FF_ALLEMPTY_MASK 0x00000004 | ||
477 | #define GRA_FF_ALLEMPTY_MASK 0x00000002 | ||
478 | #define PWRDN_IRQ_LEVEL_MASK 0x00000001 | ||
479 | |||
480 | |||
481 | /* | ||
482 | * defined Video Memory Color format for DMA control 0 register | ||
483 | * DMA0 bit[23:20] | ||
484 | */ | ||
485 | #define VMODE_RGB565 0x0 | ||
486 | #define VMODE_RGB1555 0x1 | ||
487 | #define VMODE_RGB888PACKED 0x2 | ||
488 | #define VMODE_RGB888UNPACKED 0x3 | ||
489 | #define VMODE_RGBA888 0x4 | ||
490 | #define VMODE_YUV422PACKED 0x5 | ||
491 | #define VMODE_YUV422PLANAR 0x6 | ||
492 | #define VMODE_YUV420PLANAR 0x7 | ||
493 | #define VMODE_SMPNCMD 0x8 | ||
494 | #define VMODE_PALETTE4BIT 0x9 | ||
495 | #define VMODE_PALETTE8BIT 0xa | ||
496 | #define VMODE_RESERVED 0xb | ||
497 | |||
498 | /* | ||
499 | * defined Graphic Memory Color format for DMA control 0 register | ||
500 | * DMA0 bit[19:16] | ||
501 | */ | ||
502 | #define GMODE_RGB565 0x0 | ||
503 | #define GMODE_RGB1555 0x1 | ||
504 | #define GMODE_RGB888PACKED 0x2 | ||
505 | #define GMODE_RGB888UNPACKED 0x3 | ||
506 | #define GMODE_RGBA888 0x4 | ||
507 | #define GMODE_YUV422PACKED 0x5 | ||
508 | #define GMODE_YUV422PLANAR 0x6 | ||
509 | #define GMODE_YUV420PLANAR 0x7 | ||
510 | #define GMODE_SMPNCMD 0x8 | ||
511 | #define GMODE_PALETTE4BIT 0x9 | ||
512 | #define GMODE_PALETTE8BIT 0xa | ||
513 | #define GMODE_RESERVED 0xb | ||
514 | |||
515 | /* | ||
516 | * define for DMA control 1 register | ||
517 | */ | ||
518 | #define DMA1_FRAME_TRIG 31 /* bit location */ | ||
519 | #define DMA1_VSYNC_MODE 28 | ||
520 | #define DMA1_VSYNC_INV 27 | ||
521 | #define DMA1_CKEY 24 | ||
522 | #define DMA1_CARRY 23 | ||
523 | #define DMA1_LNBUF_ENA 22 | ||
524 | #define DMA1_GATED_ENA 21 | ||
525 | #define DMA1_PWRDN_ENA 20 | ||
526 | #define DMA1_DSCALE 18 | ||
527 | #define DMA1_ALPHA_MODE 16 | ||
528 | #define DMA1_ALPHA 08 | ||
529 | #define DMA1_PXLCMD 00 | ||
530 | |||
531 | /* | ||
532 | * defined for Configure Dumb Mode | ||
533 | * DUMB LCD Panel bit[31:28] | ||
534 | */ | ||
535 | #define DUMB16_RGB565_0 0x0 | ||
536 | #define DUMB16_RGB565_1 0x1 | ||
537 | #define DUMB18_RGB666_0 0x2 | ||
538 | #define DUMB18_RGB666_1 0x3 | ||
539 | #define DUMB12_RGB444_0 0x4 | ||
540 | #define DUMB12_RGB444_1 0x5 | ||
541 | #define DUMB24_RGB888_0 0x6 | ||
542 | #define DUMB_BLANK 0x7 | ||
543 | |||
544 | /* | ||
545 | * defined for Configure I/O Pin Allocation Mode | ||
546 | * LCD LCD I/O Pads control register bit[3:0] | ||
547 | */ | ||
548 | #define IOPAD_DUMB24 0x0 | ||
549 | #define IOPAD_DUMB18SPI 0x1 | ||
550 | #define IOPAD_DUMB18GPIO 0x2 | ||
551 | #define IOPAD_DUMB16SPI 0x3 | ||
552 | #define IOPAD_DUMB16GPIO 0x4 | ||
553 | #define IOPAD_DUMB12 0x5 | ||
554 | #define IOPAD_SMART18SPI 0x6 | ||
555 | #define IOPAD_SMART16SPI 0x7 | ||
556 | #define IOPAD_SMART8BOTH 0x8 | ||
557 | |||
558 | #endif /* __PXA168FB_H__ */ | ||
diff --git a/drivers/w1/Kconfig b/drivers/w1/Kconfig index 9adbb4f90479..fd2c7bd9dfbe 100644 --- a/drivers/w1/Kconfig +++ b/drivers/w1/Kconfig | |||
@@ -8,7 +8,7 @@ menuconfig W1 | |||
8 | If you want W1 support, you should say Y here. | 8 | If you want W1 support, you should say Y here. |
9 | 9 | ||
10 | This W1 support can also be built as a module. If so, the module | 10 | This W1 support can also be built as a module. If so, the module |
11 | will be called wire.ko. | 11 | will be called wire. |
12 | 12 | ||
13 | if W1 | 13 | if W1 |
14 | 14 | ||
diff --git a/drivers/w1/masters/Kconfig b/drivers/w1/masters/Kconfig index 96d2f8e4c275..3195fb8b7d9a 100644 --- a/drivers/w1/masters/Kconfig +++ b/drivers/w1/masters/Kconfig | |||
@@ -12,7 +12,7 @@ config W1_MASTER_MATROX | |||
12 | using Matrox's G400 GPIO pins. | 12 | using Matrox's G400 GPIO pins. |
13 | 13 | ||
14 | This support is also available as a module. If so, the module | 14 | This support is also available as a module. If so, the module |
15 | will be called matrox_w1.ko. | 15 | will be called matrox_w1. |
16 | 16 | ||
17 | config W1_MASTER_DS2490 | 17 | config W1_MASTER_DS2490 |
18 | tristate "DS2490 USB <-> W1 transport layer for 1-wire" | 18 | tristate "DS2490 USB <-> W1 transport layer for 1-wire" |
@@ -22,7 +22,7 @@ config W1_MASTER_DS2490 | |||
22 | for example DS9490*. | 22 | for example DS9490*. |
23 | 23 | ||
24 | This support is also available as a module. If so, the module | 24 | This support is also available as a module. If so, the module |
25 | will be called ds2490.ko. | 25 | will be called ds2490. |
26 | 26 | ||
27 | config W1_MASTER_DS2482 | 27 | config W1_MASTER_DS2482 |
28 | tristate "Maxim DS2482 I2C to 1-Wire bridge" | 28 | tristate "Maxim DS2482 I2C to 1-Wire bridge" |
@@ -56,7 +56,7 @@ config W1_MASTER_GPIO | |||
56 | GPIO pins. This driver uses the GPIO API to control the wire. | 56 | GPIO pins. This driver uses the GPIO API to control the wire. |
57 | 57 | ||
58 | This support is also available as a module. If so, the module | 58 | This support is also available as a module. If so, the module |
59 | will be called w1-gpio.ko. | 59 | will be called w1-gpio. |
60 | 60 | ||
61 | config HDQ_MASTER_OMAP | 61 | config HDQ_MASTER_OMAP |
62 | tristate "OMAP HDQ driver" | 62 | tristate "OMAP HDQ driver" |
diff --git a/drivers/watchdog/Kconfig b/drivers/watchdog/Kconfig index 5eb8f21da82e..b166f2852a64 100644 --- a/drivers/watchdog/Kconfig +++ b/drivers/watchdog/Kconfig | |||
@@ -231,14 +231,14 @@ config DAVINCI_WATCHDOG | |||
231 | NOTE: once enabled, this timer cannot be disabled. | 231 | NOTE: once enabled, this timer cannot be disabled. |
232 | Say N if you are unsure. | 232 | Say N if you are unsure. |
233 | 233 | ||
234 | config ORION5X_WATCHDOG | 234 | config ORION_WATCHDOG |
235 | tristate "Orion5x watchdog" | 235 | tristate "Orion watchdog" |
236 | depends on ARCH_ORION5X | 236 | depends on ARCH_ORION5X || ARCH_KIRKWOOD |
237 | help | 237 | help |
238 | Say Y here if to include support for the watchdog timer | 238 | Say Y here if to include support for the watchdog timer |
239 | in the Orion5x ARM SoCs. | 239 | in the Marvell Orion5x and Kirkwood ARM SoCs. |
240 | To compile this driver as a module, choose M here: the | 240 | To compile this driver as a module, choose M here: the |
241 | module will be called orion5x_wdt. | 241 | module will be called orion_wdt. |
242 | 242 | ||
243 | # AVR32 Architecture | 243 | # AVR32 Architecture |
244 | 244 | ||
@@ -531,7 +531,7 @@ config SBC8360_WDT | |||
531 | Board Computer produced by Axiomtek Co., Ltd. (www.axiomtek.com). | 531 | Board Computer produced by Axiomtek Co., Ltd. (www.axiomtek.com). |
532 | 532 | ||
533 | To compile this driver as a module, choose M here: the | 533 | To compile this driver as a module, choose M here: the |
534 | module will be called sbc8360.ko. | 534 | module will be called sbc8360. |
535 | 535 | ||
536 | Most people will say N. | 536 | Most people will say N. |
537 | 537 | ||
diff --git a/drivers/watchdog/Makefile b/drivers/watchdog/Makefile index 7f8c56b14f58..c3afa14d5be1 100644 --- a/drivers/watchdog/Makefile +++ b/drivers/watchdog/Makefile | |||
@@ -40,7 +40,7 @@ obj-$(CONFIG_EP93XX_WATCHDOG) += ep93xx_wdt.o | |||
40 | obj-$(CONFIG_PNX4008_WATCHDOG) += pnx4008_wdt.o | 40 | obj-$(CONFIG_PNX4008_WATCHDOG) += pnx4008_wdt.o |
41 | obj-$(CONFIG_IOP_WATCHDOG) += iop_wdt.o | 41 | obj-$(CONFIG_IOP_WATCHDOG) += iop_wdt.o |
42 | obj-$(CONFIG_DAVINCI_WATCHDOG) += davinci_wdt.o | 42 | obj-$(CONFIG_DAVINCI_WATCHDOG) += davinci_wdt.o |
43 | obj-$(CONFIG_ORION5X_WATCHDOG) += orion5x_wdt.o | 43 | obj-$(CONFIG_ORION_WATCHDOG) += orion_wdt.o |
44 | 44 | ||
45 | # AVR32 Architecture | 45 | # AVR32 Architecture |
46 | obj-$(CONFIG_AT32AP700X_WDT) += at32ap700x_wdt.o | 46 | obj-$(CONFIG_AT32AP700X_WDT) += at32ap700x_wdt.o |
diff --git a/drivers/watchdog/iop_wdt.c b/drivers/watchdog/iop_wdt.c index 96eb2cbe5874..0c9059676690 100644 --- a/drivers/watchdog/iop_wdt.c +++ b/drivers/watchdog/iop_wdt.c | |||
@@ -192,7 +192,7 @@ static int iop_wdt_release(struct inode *inode, struct file *file) | |||
192 | if (test_bit(WDT_ENABLED, &wdt_status)) | 192 | if (test_bit(WDT_ENABLED, &wdt_status)) |
193 | state = wdt_disable(); | 193 | state = wdt_disable(); |
194 | 194 | ||
195 | /* if the timer is not disbaled reload and notify that we are still | 195 | /* if the timer is not disabled reload and notify that we are still |
196 | * going down | 196 | * going down |
197 | */ | 197 | */ |
198 | if (state != 0) { | 198 | if (state != 0) { |
diff --git a/drivers/watchdog/orion5x_wdt.c b/drivers/watchdog/orion_wdt.c index 2cde568e4fb0..2d9fb96a9ee9 100644 --- a/drivers/watchdog/orion5x_wdt.c +++ b/drivers/watchdog/orion_wdt.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * drivers/watchdog/orion5x_wdt.c | 2 | * drivers/watchdog/orion_wdt.c |
3 | * | 3 | * |
4 | * Watchdog driver for Orion5x processors | 4 | * Watchdog driver for Orion/Kirkwood processors |
5 | * | 5 | * |
6 | * Author: Sylver Bruneau <sylver.bruneau@googlemail.com> | 6 | * Author: Sylver Bruneau <sylver.bruneau@googlemail.com> |
7 | * | 7 | * |
@@ -23,7 +23,7 @@ | |||
23 | #include <linux/io.h> | 23 | #include <linux/io.h> |
24 | #include <linux/spinlock.h> | 24 | #include <linux/spinlock.h> |
25 | #include <mach/bridge-regs.h> | 25 | #include <mach/bridge-regs.h> |
26 | #include <plat/orion5x_wdt.h> | 26 | #include <plat/orion_wdt.h> |
27 | 27 | ||
28 | /* | 28 | /* |
29 | * Watchdog timer block registers. | 29 | * Watchdog timer block registers. |
@@ -43,7 +43,7 @@ static unsigned int wdt_tclk; | |||
43 | static unsigned long wdt_status; | 43 | static unsigned long wdt_status; |
44 | static spinlock_t wdt_lock; | 44 | static spinlock_t wdt_lock; |
45 | 45 | ||
46 | static void orion5x_wdt_ping(void) | 46 | static void orion_wdt_ping(void) |
47 | { | 47 | { |
48 | spin_lock(&wdt_lock); | 48 | spin_lock(&wdt_lock); |
49 | 49 | ||
@@ -53,7 +53,7 @@ static void orion5x_wdt_ping(void) | |||
53 | spin_unlock(&wdt_lock); | 53 | spin_unlock(&wdt_lock); |
54 | } | 54 | } |
55 | 55 | ||
56 | static void orion5x_wdt_enable(void) | 56 | static void orion_wdt_enable(void) |
57 | { | 57 | { |
58 | u32 reg; | 58 | u32 reg; |
59 | 59 | ||
@@ -73,23 +73,23 @@ static void orion5x_wdt_enable(void) | |||
73 | writel(reg, TIMER_CTRL); | 73 | writel(reg, TIMER_CTRL); |
74 | 74 | ||
75 | /* Enable reset on watchdog */ | 75 | /* Enable reset on watchdog */ |
76 | reg = readl(CPU_RESET_MASK); | 76 | reg = readl(RSTOUTn_MASK); |
77 | reg |= WDT_RESET; | 77 | reg |= WDT_RESET_OUT_EN; |
78 | writel(reg, CPU_RESET_MASK); | 78 | writel(reg, RSTOUTn_MASK); |
79 | 79 | ||
80 | spin_unlock(&wdt_lock); | 80 | spin_unlock(&wdt_lock); |
81 | } | 81 | } |
82 | 82 | ||
83 | static void orion5x_wdt_disable(void) | 83 | static void orion_wdt_disable(void) |
84 | { | 84 | { |
85 | u32 reg; | 85 | u32 reg; |
86 | 86 | ||
87 | spin_lock(&wdt_lock); | 87 | spin_lock(&wdt_lock); |
88 | 88 | ||
89 | /* Disable reset on watchdog */ | 89 | /* Disable reset on watchdog */ |
90 | reg = readl(CPU_RESET_MASK); | 90 | reg = readl(RSTOUTn_MASK); |
91 | reg &= ~WDT_RESET; | 91 | reg &= ~WDT_RESET_OUT_EN; |
92 | writel(reg, CPU_RESET_MASK); | 92 | writel(reg, RSTOUTn_MASK); |
93 | 93 | ||
94 | /* Disable watchdog timer */ | 94 | /* Disable watchdog timer */ |
95 | reg = readl(TIMER_CTRL); | 95 | reg = readl(TIMER_CTRL); |
@@ -99,7 +99,7 @@ static void orion5x_wdt_disable(void) | |||
99 | spin_unlock(&wdt_lock); | 99 | spin_unlock(&wdt_lock); |
100 | } | 100 | } |
101 | 101 | ||
102 | static int orion5x_wdt_get_timeleft(int *time_left) | 102 | static int orion_wdt_get_timeleft(int *time_left) |
103 | { | 103 | { |
104 | spin_lock(&wdt_lock); | 104 | spin_lock(&wdt_lock); |
105 | *time_left = readl(WDT_VAL) / wdt_tclk; | 105 | *time_left = readl(WDT_VAL) / wdt_tclk; |
@@ -107,16 +107,16 @@ static int orion5x_wdt_get_timeleft(int *time_left) | |||
107 | return 0; | 107 | return 0; |
108 | } | 108 | } |
109 | 109 | ||
110 | static int orion5x_wdt_open(struct inode *inode, struct file *file) | 110 | static int orion_wdt_open(struct inode *inode, struct file *file) |
111 | { | 111 | { |
112 | if (test_and_set_bit(WDT_IN_USE, &wdt_status)) | 112 | if (test_and_set_bit(WDT_IN_USE, &wdt_status)) |
113 | return -EBUSY; | 113 | return -EBUSY; |
114 | clear_bit(WDT_OK_TO_CLOSE, &wdt_status); | 114 | clear_bit(WDT_OK_TO_CLOSE, &wdt_status); |
115 | orion5x_wdt_enable(); | 115 | orion_wdt_enable(); |
116 | return nonseekable_open(inode, file); | 116 | return nonseekable_open(inode, file); |
117 | } | 117 | } |
118 | 118 | ||
119 | static ssize_t orion5x_wdt_write(struct file *file, const char *data, | 119 | static ssize_t orion_wdt_write(struct file *file, const char *data, |
120 | size_t len, loff_t *ppos) | 120 | size_t len, loff_t *ppos) |
121 | { | 121 | { |
122 | if (len) { | 122 | if (len) { |
@@ -133,18 +133,18 @@ static ssize_t orion5x_wdt_write(struct file *file, const char *data, | |||
133 | set_bit(WDT_OK_TO_CLOSE, &wdt_status); | 133 | set_bit(WDT_OK_TO_CLOSE, &wdt_status); |
134 | } | 134 | } |
135 | } | 135 | } |
136 | orion5x_wdt_ping(); | 136 | orion_wdt_ping(); |
137 | } | 137 | } |
138 | return len; | 138 | return len; |
139 | } | 139 | } |
140 | 140 | ||
141 | static int orion5x_wdt_settimeout(int new_time) | 141 | static int orion_wdt_settimeout(int new_time) |
142 | { | 142 | { |
143 | if ((new_time <= 0) || (new_time > wdt_max_duration)) | 143 | if ((new_time <= 0) || (new_time > wdt_max_duration)) |
144 | return -EINVAL; | 144 | return -EINVAL; |
145 | 145 | ||
146 | /* Set new watchdog time to be used when | 146 | /* Set new watchdog time to be used when |
147 | * orion5x_wdt_enable() or orion5x_wdt_ping() is called. */ | 147 | * orion_wdt_enable() or orion_wdt_ping() is called. */ |
148 | heartbeat = new_time; | 148 | heartbeat = new_time; |
149 | return 0; | 149 | return 0; |
150 | } | 150 | } |
@@ -152,10 +152,10 @@ static int orion5x_wdt_settimeout(int new_time) | |||
152 | static const struct watchdog_info ident = { | 152 | static const struct watchdog_info ident = { |
153 | .options = WDIOF_MAGICCLOSE | WDIOF_SETTIMEOUT | | 153 | .options = WDIOF_MAGICCLOSE | WDIOF_SETTIMEOUT | |
154 | WDIOF_KEEPALIVEPING, | 154 | WDIOF_KEEPALIVEPING, |
155 | .identity = "Orion5x Watchdog", | 155 | .identity = "Orion Watchdog", |
156 | }; | 156 | }; |
157 | 157 | ||
158 | static long orion5x_wdt_ioctl(struct file *file, unsigned int cmd, | 158 | static long orion_wdt_ioctl(struct file *file, unsigned int cmd, |
159 | unsigned long arg) | 159 | unsigned long arg) |
160 | { | 160 | { |
161 | int ret = -ENOTTY; | 161 | int ret = -ENOTTY; |
@@ -173,7 +173,7 @@ static long orion5x_wdt_ioctl(struct file *file, unsigned int cmd, | |||
173 | break; | 173 | break; |
174 | 174 | ||
175 | case WDIOC_KEEPALIVE: | 175 | case WDIOC_KEEPALIVE: |
176 | orion5x_wdt_ping(); | 176 | orion_wdt_ping(); |
177 | ret = 0; | 177 | ret = 0; |
178 | break; | 178 | break; |
179 | 179 | ||
@@ -182,11 +182,11 @@ static long orion5x_wdt_ioctl(struct file *file, unsigned int cmd, | |||
182 | if (ret) | 182 | if (ret) |
183 | break; | 183 | break; |
184 | 184 | ||
185 | if (orion5x_wdt_settimeout(time)) { | 185 | if (orion_wdt_settimeout(time)) { |
186 | ret = -EINVAL; | 186 | ret = -EINVAL; |
187 | break; | 187 | break; |
188 | } | 188 | } |
189 | orion5x_wdt_ping(); | 189 | orion_wdt_ping(); |
190 | /* Fall through */ | 190 | /* Fall through */ |
191 | 191 | ||
192 | case WDIOC_GETTIMEOUT: | 192 | case WDIOC_GETTIMEOUT: |
@@ -194,7 +194,7 @@ static long orion5x_wdt_ioctl(struct file *file, unsigned int cmd, | |||
194 | break; | 194 | break; |
195 | 195 | ||
196 | case WDIOC_GETTIMELEFT: | 196 | case WDIOC_GETTIMELEFT: |
197 | if (orion5x_wdt_get_timeleft(&time)) { | 197 | if (orion_wdt_get_timeleft(&time)) { |
198 | ret = -EINVAL; | 198 | ret = -EINVAL; |
199 | break; | 199 | break; |
200 | } | 200 | } |
@@ -204,10 +204,10 @@ static long orion5x_wdt_ioctl(struct file *file, unsigned int cmd, | |||
204 | return ret; | 204 | return ret; |
205 | } | 205 | } |
206 | 206 | ||
207 | static int orion5x_wdt_release(struct inode *inode, struct file *file) | 207 | static int orion_wdt_release(struct inode *inode, struct file *file) |
208 | { | 208 | { |
209 | if (test_bit(WDT_OK_TO_CLOSE, &wdt_status)) | 209 | if (test_bit(WDT_OK_TO_CLOSE, &wdt_status)) |
210 | orion5x_wdt_disable(); | 210 | orion_wdt_disable(); |
211 | else | 211 | else |
212 | printk(KERN_CRIT "WATCHDOG: Device closed unexpectedly - " | 212 | printk(KERN_CRIT "WATCHDOG: Device closed unexpectedly - " |
213 | "timer will not stop\n"); | 213 | "timer will not stop\n"); |
@@ -218,98 +218,98 @@ static int orion5x_wdt_release(struct inode *inode, struct file *file) | |||
218 | } | 218 | } |
219 | 219 | ||
220 | 220 | ||
221 | static const struct file_operations orion5x_wdt_fops = { | 221 | static const struct file_operations orion_wdt_fops = { |
222 | .owner = THIS_MODULE, | 222 | .owner = THIS_MODULE, |
223 | .llseek = no_llseek, | 223 | .llseek = no_llseek, |
224 | .write = orion5x_wdt_write, | 224 | .write = orion_wdt_write, |
225 | .unlocked_ioctl = orion5x_wdt_ioctl, | 225 | .unlocked_ioctl = orion_wdt_ioctl, |
226 | .open = orion5x_wdt_open, | 226 | .open = orion_wdt_open, |
227 | .release = orion5x_wdt_release, | 227 | .release = orion_wdt_release, |
228 | }; | 228 | }; |
229 | 229 | ||
230 | static struct miscdevice orion5x_wdt_miscdev = { | 230 | static struct miscdevice orion_wdt_miscdev = { |
231 | .minor = WATCHDOG_MINOR, | 231 | .minor = WATCHDOG_MINOR, |
232 | .name = "watchdog", | 232 | .name = "watchdog", |
233 | .fops = &orion5x_wdt_fops, | 233 | .fops = &orion_wdt_fops, |
234 | }; | 234 | }; |
235 | 235 | ||
236 | static int __devinit orion5x_wdt_probe(struct platform_device *pdev) | 236 | static int __devinit orion_wdt_probe(struct platform_device *pdev) |
237 | { | 237 | { |
238 | struct orion5x_wdt_platform_data *pdata = pdev->dev.platform_data; | 238 | struct orion_wdt_platform_data *pdata = pdev->dev.platform_data; |
239 | int ret; | 239 | int ret; |
240 | 240 | ||
241 | if (pdata) { | 241 | if (pdata) { |
242 | wdt_tclk = pdata->tclk; | 242 | wdt_tclk = pdata->tclk; |
243 | } else { | 243 | } else { |
244 | printk(KERN_ERR "Orion5x Watchdog misses platform data\n"); | 244 | printk(KERN_ERR "Orion Watchdog misses platform data\n"); |
245 | return -ENODEV; | 245 | return -ENODEV; |
246 | } | 246 | } |
247 | 247 | ||
248 | if (orion5x_wdt_miscdev.parent) | 248 | if (orion_wdt_miscdev.parent) |
249 | return -EBUSY; | 249 | return -EBUSY; |
250 | orion5x_wdt_miscdev.parent = &pdev->dev; | 250 | orion_wdt_miscdev.parent = &pdev->dev; |
251 | 251 | ||
252 | wdt_max_duration = WDT_MAX_CYCLE_COUNT / wdt_tclk; | 252 | wdt_max_duration = WDT_MAX_CYCLE_COUNT / wdt_tclk; |
253 | if (orion5x_wdt_settimeout(heartbeat)) | 253 | if (orion_wdt_settimeout(heartbeat)) |
254 | heartbeat = wdt_max_duration; | 254 | heartbeat = wdt_max_duration; |
255 | 255 | ||
256 | ret = misc_register(&orion5x_wdt_miscdev); | 256 | ret = misc_register(&orion_wdt_miscdev); |
257 | if (ret) | 257 | if (ret) |
258 | return ret; | 258 | return ret; |
259 | 259 | ||
260 | printk(KERN_INFO "Orion5x Watchdog Timer: Initial timeout %d sec%s\n", | 260 | printk(KERN_INFO "Orion Watchdog Timer: Initial timeout %d sec%s\n", |
261 | heartbeat, nowayout ? ", nowayout" : ""); | 261 | heartbeat, nowayout ? ", nowayout" : ""); |
262 | return 0; | 262 | return 0; |
263 | } | 263 | } |
264 | 264 | ||
265 | static int __devexit orion5x_wdt_remove(struct platform_device *pdev) | 265 | static int __devexit orion_wdt_remove(struct platform_device *pdev) |
266 | { | 266 | { |
267 | int ret; | 267 | int ret; |
268 | 268 | ||
269 | if (test_bit(WDT_IN_USE, &wdt_status)) { | 269 | if (test_bit(WDT_IN_USE, &wdt_status)) { |
270 | orion5x_wdt_disable(); | 270 | orion_wdt_disable(); |
271 | clear_bit(WDT_IN_USE, &wdt_status); | 271 | clear_bit(WDT_IN_USE, &wdt_status); |
272 | } | 272 | } |
273 | 273 | ||
274 | ret = misc_deregister(&orion5x_wdt_miscdev); | 274 | ret = misc_deregister(&orion_wdt_miscdev); |
275 | if (!ret) | 275 | if (!ret) |
276 | orion5x_wdt_miscdev.parent = NULL; | 276 | orion_wdt_miscdev.parent = NULL; |
277 | 277 | ||
278 | return ret; | 278 | return ret; |
279 | } | 279 | } |
280 | 280 | ||
281 | static void orion5x_wdt_shutdown(struct platform_device *pdev) | 281 | static void orion_wdt_shutdown(struct platform_device *pdev) |
282 | { | 282 | { |
283 | if (test_bit(WDT_IN_USE, &wdt_status)) | 283 | if (test_bit(WDT_IN_USE, &wdt_status)) |
284 | orion5x_wdt_disable(); | 284 | orion_wdt_disable(); |
285 | } | 285 | } |
286 | 286 | ||
287 | static struct platform_driver orion5x_wdt_driver = { | 287 | static struct platform_driver orion_wdt_driver = { |
288 | .probe = orion5x_wdt_probe, | 288 | .probe = orion_wdt_probe, |
289 | .remove = __devexit_p(orion5x_wdt_remove), | 289 | .remove = __devexit_p(orion_wdt_remove), |
290 | .shutdown = orion5x_wdt_shutdown, | 290 | .shutdown = orion_wdt_shutdown, |
291 | .driver = { | 291 | .driver = { |
292 | .owner = THIS_MODULE, | 292 | .owner = THIS_MODULE, |
293 | .name = "orion5x_wdt", | 293 | .name = "orion_wdt", |
294 | }, | 294 | }, |
295 | }; | 295 | }; |
296 | 296 | ||
297 | static int __init orion5x_wdt_init(void) | 297 | static int __init orion_wdt_init(void) |
298 | { | 298 | { |
299 | spin_lock_init(&wdt_lock); | 299 | spin_lock_init(&wdt_lock); |
300 | return platform_driver_register(&orion5x_wdt_driver); | 300 | return platform_driver_register(&orion_wdt_driver); |
301 | } | 301 | } |
302 | 302 | ||
303 | static void __exit orion5x_wdt_exit(void) | 303 | static void __exit orion_wdt_exit(void) |
304 | { | 304 | { |
305 | platform_driver_unregister(&orion5x_wdt_driver); | 305 | platform_driver_unregister(&orion_wdt_driver); |
306 | } | 306 | } |
307 | 307 | ||
308 | module_init(orion5x_wdt_init); | 308 | module_init(orion_wdt_init); |
309 | module_exit(orion5x_wdt_exit); | 309 | module_exit(orion_wdt_exit); |
310 | 310 | ||
311 | MODULE_AUTHOR("Sylver Bruneau <sylver.bruneau@googlemail.com>"); | 311 | MODULE_AUTHOR("Sylver Bruneau <sylver.bruneau@googlemail.com>"); |
312 | MODULE_DESCRIPTION("Orion5x Processor Watchdog"); | 312 | MODULE_DESCRIPTION("Orion Processor Watchdog"); |
313 | 313 | ||
314 | module_param(heartbeat, int, 0); | 314 | module_param(heartbeat, int, 0); |
315 | MODULE_PARM_DESC(heartbeat, "Initial watchdog heartbeat in seconds"); | 315 | MODULE_PARM_DESC(heartbeat, "Initial watchdog heartbeat in seconds"); |