More SA11x0/PXA related fixes
Subsystems (4)
Russell King - ARM Linux
maintainercover More SA11x0/PXA related fixes
More fixes for SA11x0/PXA:
* Locomo blows up because it uses the wrong data for the handler, overwriting the chip's data.
* Fixes for PCMCIA problems discovered by Robert.
* Fixing SA1111 suspend/resume
Can I have acks for these please, so I can push them to Linus later this week. Thanks.
arch/arm/common/locomo.c | 5 ++--- arch/arm/common/sa1111.c | 32 +++++++++++++++++++------------- arch/arm/mach-pxa/lubbock.c | 14 ++++++++++++++ drivers/pcmcia/pxa2xx_base.c | 9 +++++---- drivers/pcmcia/pxa2xx_base.h | 2 +- drivers/pcmcia/sa1111_badge4.c | 22 ++++++++-------------- drivers/pcmcia/sa1111_generic.c | 22 +++++++++++++++++----- drivers/pcmcia/sa1111_jornada720.c | 25 ++++++++++--------------- drivers/pcmcia/sa1111_lubbock.c | 32 +++++++++++++------------------- drivers/pcmcia/sa1111_neponset.c | 26 ++++++++++---------------- 10 files changed, 99 insertions(+), 90 deletions(-)
Signature · 3 lines
RMK's Patch system: http://www.armlinux.org.uk/developer/patches/ FTTC broadband for 0.8mile line: currently at 9.6Mbps down 400kbps up according to speedtest.net.
PATCH 1/8 pcmcia: sa1111: fix propagation of lowlevel board init return code
When testing Lubbock, it was noticed that the sa1111 pcmcia driver bound but was not functional due to no sockets being registered. This is because the return code from the lowlevel board initialisation was not being propagated out of the probe function. Fix this.
--- drivers/pcmcia/sa1111_badge4.c | 22 ++++++++-------------- drivers/pcmcia/sa1111_generic.c | 22 +++++++++++++++++----- drivers/pcmcia/sa1111_jornada720.c | 25 ++++++++++--------------- drivers/pcmcia/sa1111_lubbock.c | 32 +++++++++++++------------------- drivers/pcmcia/sa1111_neponset.c | 26 ++++++++++---------------- 5 files changed, 58 insertions(+), 69 deletions(-)
drivers/pcmcia/sa1111_badge4.c +8 -14
@@ -134,20 +134,14 @@ static struct pcmcia_low_level badge4_pcmcia_ops = {int pcmcia_badge4_init (struct sa1111_dev *dev) { -int ret = -ENODEV ; - -if (machine_is_badge4 ()) { -printk (KERN_INFO -"%s: badge4_pcmvcc=%d, badge4_pcmvpp=%d, badge4_cfvcc=%d\n" , - __func__, - badge4_pcmvcc, badge4_pcmvpp, badge4_cfvcc); - -sa11xx_drv_pcmcia_ops (&badge4_pcmcia_ops); - ret =sa1111_pcmcia_add (dev, &badge4_pcmcia_ops, - sa11xx_drv_pcmcia_add_one); - } - -return ret; +printk (KERN_INFO +"%s: badge4_pcmvcc=%d, badge4_pcmvpp=%d, badge4_cfvcc=%d\n" , + __func__, + badge4_pcmvcc, badge4_pcmvpp, badge4_cfvcc); + +sa11xx_drv_pcmcia_ops (&badge4_pcmcia_ops); +return sa1111_pcmcia_add (dev, &badge4_pcmcia_ops, + sa11xx_drv_pcmcia_add_one); }static int __init pcmv_setup (char *s)
drivers/pcmcia/sa1111_generic.c +17 -5
@@ -18,6 +18,7 @@#include <mach/hardware.h> #include <asm/hardware/sa1111.h> +#include <asm/mach-types.h> #include <asm/irq.h> #include "sa1111_generic.h"
@@ -203,19 +204,30 @@ static int pcmcia_probe(struct sa1111_dev *dev)sa1111_writel (PCSSR_S0_SLEEP |PCSSR_S1_SLEEP , base +PCSSR );sa1111_writel (PCCR_S0_FLT |PCCR_S1_FLT , base +PCCR ); + ret = -ENODEV ;#ifdef CONFIG_SA1100_BADGE4 -pcmcia_badge4_init (dev); +if (machine_is_badge4 ()) + ret =pcmcia_badge4_init (dev);#endif #ifdef CONFIG_SA1100_JORNADA720 -pcmcia_jornada720_init (dev); +if (machine_is_jornada720 ()) + ret =pcmcia_jornada720_init (dev);#endif #ifdef CONFIG_ARCH_LUBBOCK -pcmcia_lubbock_init (dev); +if (machine_is_lubbock ()) + ret =pcmcia_lubbock_init (dev);#endif #ifdef CONFIG_ASSABET_NEPONSET -pcmcia_neponset_init (dev); +if (machine_is_assabet ()) + ret =pcmcia_neponset_init (dev);#endif -return 0 ; + +if (ret) { +release_mem_region (dev->res.start,512 ); +sa1111_disable_device (dev); + } + +return ret; }static int pcmcia_remove (struct sa1111_dev *dev)
drivers/pcmcia/sa1111_jornada720.c +10 -15
@@ -94,22 +94,17 @@ static struct pcmcia_low_level jornada720_pcmcia_ops = {int pcmcia_jornada720_init (struct sa1111_dev *sadev) { -int ret = -ENODEV ; +unsigned int pin =GPIO_A0 |GPIO_A1 |GPIO_A2 |GPIO_A3 ; -if (machine_is_jornada720 ()) { -unsigned int pin =GPIO_A0 |GPIO_A1 |GPIO_A2 |GPIO_A3 ; +/* Fixme: why messing around with SA11x0's GPIO1? */ +GRER |=0x00000002 ; -GRER |=0x00000002 ; +/* Set GPIO_A<3:1> to be outputs for PCMCIA/CF power controller: */ +sa1111_set_io_dir (sadev, pin,0 ,0 ); +sa1111_set_io (sadev, pin,0 ); +sa1111_set_sleep_io (sadev, pin,0 ); -/* Set GPIO_A<3:1> to be outputs for PCMCIA/CF power controller: */ -sa1111_set_io_dir (sadev, pin,0 ,0 ); -sa1111_set_io (sadev, pin,0 ); -sa1111_set_sleep_io (sadev, pin,0 ); - -sa11xx_drv_pcmcia_ops (&jornada720_pcmcia_ops); - ret =sa1111_pcmcia_add (sadev, &jornada720_pcmcia_ops, - sa11xx_drv_pcmcia_add_one); - } - -return ret; +sa11xx_drv_pcmcia_ops (&jornada720_pcmcia_ops); +return sa1111_pcmcia_add (sadev, &jornada720_pcmcia_ops, + sa11xx_drv_pcmcia_add_one); }
drivers/pcmcia/sa1111_lubbock.c +13 -19
@@ -210,27 +210,21 @@ static struct pcmcia_low_level lubbock_pcmcia_ops = {int pcmcia_lubbock_init (struct sa1111_dev *sadev) { -int ret = -ENODEV ; - -if (machine_is_lubbock ()) { -/* -* Set GPIO_A<3:0> to be outputs for the MAX1600, -* and switch to standby mode. -*/ -sa1111_set_io_dir (sadev,GPIO_A0 |GPIO_A1 |GPIO_A2 |GPIO_A3 ,0 ,0 ); -sa1111_set_io (sadev,GPIO_A0 |GPIO_A1 |GPIO_A2 |GPIO_A3 ,0 ); -sa1111_set_sleep_io (sadev,GPIO_A0 |GPIO_A1 |GPIO_A2 |GPIO_A3 ,0 ); - -/* Set CF Socket 1 power to standby mode. */ -lubbock_set_misc_wr ((1 <<15 ) | (1 <<14 ),0 ); +/* +* Set GPIO_A<3:0> to be outputs for the MAX1600, +* and switch to standby mode. +*/ +sa1111_set_io_dir (sadev,GPIO_A0 |GPIO_A1 |GPIO_A2 |GPIO_A3 ,0 ,0 ); +sa1111_set_io (sadev,GPIO_A0 |GPIO_A1 |GPIO_A2 |GPIO_A3 ,0 ); +sa1111_set_sleep_io (sadev,GPIO_A0 |GPIO_A1 |GPIO_A2 |GPIO_A3 ,0 ); -pxa2xx_drv_pcmcia_ops (&lubbock_pcmcia_ops); -pxa2xx_configure_sockets (&sadev->dev); - ret =sa1111_pcmcia_add (sadev, &lubbock_pcmcia_ops, - pxa2xx_drv_pcmcia_add_one); - } +/* Set CF Socket 1 power to standby mode. */ +lubbock_set_misc_wr ((1 <<15 ) | (1 <<14 ),0 ); -return ret; +pxa2xx_drv_pcmcia_ops (&lubbock_pcmcia_ops); +pxa2xx_configure_sockets (&sadev->dev); +return sa1111_pcmcia_add (sadev, &lubbock_pcmcia_ops, + pxa2xx_drv_pcmcia_add_one); }MODULE_LICENSE ("GPL" );
drivers/pcmcia/sa1111_neponset.c +10 -16
@@ -110,20 +110,14 @@ static struct pcmcia_low_level neponset_pcmcia_ops = {int pcmcia_neponset_init (struct sa1111_dev *sadev) { -int ret = -ENODEV ; - -if (machine_is_assabet ()) { -/* -* Set GPIO_A<3:0> to be outputs for the MAX1600, -* and switch to standby mode. -*/ -sa1111_set_io_dir (sadev,GPIO_A0 |GPIO_A1 |GPIO_A2 |GPIO_A3 ,0 ,0 ); -sa1111_set_io (sadev,GPIO_A0 |GPIO_A1 |GPIO_A2 |GPIO_A3 ,0 ); -sa1111_set_sleep_io (sadev,GPIO_A0 |GPIO_A1 |GPIO_A2 |GPIO_A3 ,0 ); -sa11xx_drv_pcmcia_ops (&neponset_pcmcia_ops); - ret =sa1111_pcmcia_add (sadev, &neponset_pcmcia_ops, - sa11xx_drv_pcmcia_add_one); - } - -return ret; +/* +* Set GPIO_A<3:0> to be outputs for the MAX1600, +* and switch to standby mode. +*/ +sa1111_set_io_dir (sadev,GPIO_A0 |GPIO_A1 |GPIO_A2 |GPIO_A3 ,0 ,0 ); +sa1111_set_io (sadev,GPIO_A0 |GPIO_A1 |GPIO_A2 |GPIO_A3 ,0 ); +sa1111_set_sleep_io (sadev,GPIO_A0 |GPIO_A1 |GPIO_A2 |GPIO_A3 ,0 ); +sa11xx_drv_pcmcia_ops (&neponset_pcmcia_ops); +return sa1111_pcmcia_add (sadev, &neponset_pcmcia_ops, + sa11xx_drv_pcmcia_add_one); }
Signature · 1 line
2.1.0
PATCH 2/8 pcmcia: lubbock: fix sockets configuration
In reply to Russell King - ARM LinuxFrom: Robert Jarzmik <[email protected]>
On lubbock board, the probe of the driver crashes by dereferencing very early a platform_data structure which is not set, in pxa2xx_configure_sockets().
The stack fixed is :
[ 0.244353] SA1111 Microprocessor Companion Chip: silicon revision 1, metal revision 1 [ 0.256321] sa1111 sa1111: Providing IRQ336-390 [ 0.340899] clocksource: Switched to clocksource oscr0 [ 0.472263] Unable to handle kernel NULL pointer dereference at virtual address 00000004 [ 0.480469] pgd = c0004000 [ 0.483432] [00000004] *pgd=00000000 [ 0.487105] Internal error: Oops: f5 [#1] ARM [ 0.491497] Modules linked in: [ 0.494650] CPU: 0 PID: 1 Comm: swapper Not tainted 4.8.0-rc3-00080-g1aaa68426f0c-dirty #2068 [ 0.503229] Hardware name: Intel DBPXA250 Development Platform (aka Lubbock) [ 0.510344] task: c3e42000 task.stack: c3e44000 [ 0.514984] PC is at pxa2xx_configure_sockets+0x4/0x24 (drivers/pcmcia/pxa2xx_base.c:227) [ 0.520193] LR is at pcmcia_lubbock_init+0x1c/0x38 [ 0.525079] pc : [<c0247c30>] lr : [<c02479b0>] psr: a0000053 [ 0.525079] sp : c3e45e70 ip : 100019ff fp : 00000000 [ 0.536651] r10: c0828900 r9 : c0434838 r8 : 00000000 [ 0.541953] r7 : c0820700 r6 : c0857b30 r5 : c3ec1400 r4 : c0820758 [ 0.548549] r3 : 00000000 r2 : 0000000c r1 : c3c09c40 r0 : c3ec1400 [ 0.555154] Flags: NzCv IRQs on FIQs off Mode SVC_32 ISA ARM Segment none [ 0.562450] Control: 0000397f Table: a0004000 DAC: 00000053 [ 0.568257] Process swapper (pid: 1, stack limit = 0xc3e44190) [ 0.574154] Stack: (0xc3e45e70 to 0xc3e46000) [ 0.578610] 5e60: c4849800 00000000 c3ec1400 c024769c [ 0.586928] 5e80: 00000000 c3ec140c c3c0ee0c c3ec1400 c3ec1434 c020c410 c3ec1400 c3ec1434 [ 0.595244] 5ea0: c0820700 c080b408 c0828900 c020c5f8 00000000 c0820700 c020c578 c020ac5c [ 0.603560] 5ec0: c3e687cc c3e71e10 c0820700 00000000 c3c02de0 c020bae4 c03c62f7 c03c62f7 [ 0.611872] 5ee0: c3e68780 c0820700 c042e034 00000000 c043c440 c020cdec c080b408 00000005 [ 0.620188] 5f00: c042e034 c00096c0 c0034440 c01c730c 20000053 ffffffff 00000000 00000000 [ 0.628502] 5f20: 00000000 c3ffcb87 c3ffcb90 c00346ac c3e66ba0 c03f7914 00000092 00000005 [ 0.636811] 5f40: 00000005 c03f847c 00000091 c03f847c 00000000 00000005 c0434828 00000005 [ 0.645125] 5f60: c043482c 00000092 c043c440 c0828900 c0434838 c0418d2c 00000005 00000005 [ 0.653430] 5f80: 00000000 c041858c 00000000 c032e9f0 00000000 00000000 00000000 00000000 [ 0.661729] 5fa0: 00000000 c032e9f8 00000000 c000f0f0 00000000 00000000 00000000 00000000 [ 0.670020] 5fc0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 [ 0.678311] 5fe0: 00000000 00000000 00000000 00000000 00000013 00000000 00000000 00000000 [ 0.686673] (pxa2xx_configure_sockets) from pcmcia_lubbock_init (/drivers/pcmcia/sa1111_lubbock.c:161) [ 0.696026] (pcmcia_lubbock_init) from pcmcia_probe (/drivers/pcmcia/sa1111_generic.c:213) [ 0.704358] (pcmcia_probe) from driver_probe_device (/drivers/base/dd.c:378 /drivers/base/dd.c:499) [ 0.712848] (driver_probe_device) from __driver_attach (/./include/linux/device.h:983 /drivers/base/dd.c:733) [ 0.721414] (__driver_attach) from bus_for_each_dev (/drivers/base/bus.c:313) [ 0.729723] (bus_for_each_dev) from bus_add_driver (/drivers/base/bus.c:708) [ 0.738036] (bus_add_driver) from driver_register (/drivers/base/driver.c:169) [ 0.746185] (driver_register) from do_one_initcall (/init/main.c:778) [ 0.754561] (do_one_initcall) from kernel_init_freeable (/init/main.c:843 /init/main.c:851 /init/main.c:869 /init/main.c:1016) [ 0.763409] (kernel_init_freeable) from kernel_init (/init/main.c:944) [ 0.771660] (kernel_init) from ret_from_fork (/arch/arm/kernel/entry-common.S:119) [ 0.779347] Code: c03c6305 c03c631e c03c632e e5903048 (e993000c)
All code
========
0: c03c6305 eorsgt r6, ip, r5, lsl #6
4: c03c631e eorsgt r6, ip, lr, lsl r3
8: c03c632e eorsgt r6, ip, lr, lsr #6
c: e5903048 ldr r3, [r0, #72] ; 0x48
10:* e993000c ldmib r3, {r2, r3} <-- trapping instruction
--- drivers/pcmcia/pxa2xx_base.c | 9 +++++---- drivers/pcmcia/pxa2xx_base.h | 2 +- drivers/pcmcia/sa1111_lubbock.c | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-)
drivers/pcmcia/pxa2xx_base.c +5 -4
@@ -214,9 +214,8 @@ pxa2xx_pcmcia_frequency_change(struct soc_pcmcia_socket *skt, }#endif -void pxa2xx_configure_sockets (struct device *dev) +void pxa2xx_configure_sockets (struct device *dev,struct pcmcia_low_level *ops) { -struct pcmcia_low_level *ops = dev->platform_data;/* * We have at least one socket, so set MECR:CIT * (Card Is There)
@@ -322,7 +321,7 @@ static int pxa2xx_drv_pcmcia_probe(struct platform_device *dev) goto err1; } -pxa2xx_configure_sockets (&dev->dev); +pxa2xx_configure_sockets (&dev->dev, ops);dev_set_drvdata (&dev->dev, sinfo);return 0 ;
@@ -348,7 +347,9 @@ static int pxa2xx_drv_pcmcia_remove(struct platform_device *dev)static int pxa2xx_drv_pcmcia_resume (struct device *dev) { -pxa2xx_configure_sockets (dev); +struct pcmcia_low_level *ops = (struct pcmcia_low_level *)dev->platform_data; + +pxa2xx_configure_sockets (dev, ops);return 0 ; }
drivers/pcmcia/pxa2xx_base.h +1 -1
@@ -1,4 +1,4 @@int pxa2xx_drv_pcmcia_add_one (struct soc_pcmcia_socket *skt);void pxa2xx_drv_pcmcia_ops (struct pcmcia_low_level *ops); -void pxa2xx_configure_sockets (struct device *dev); +void pxa2xx_configure_sockets (struct device *dev,struct pcmcia_low_level *ops);
drivers/pcmcia/sa1111_lubbock.c +1 -1
@@ -222,7 +222,7 @@ int pcmcia_lubbock_init(struct sa1111_dev *sadev)lubbock_set_misc_wr ((1 <<15 ) | (1 <<14 ),0 );pxa2xx_drv_pcmcia_ops (&lubbock_pcmcia_ops); -pxa2xx_configure_sockets (&sadev->dev); +pxa2xx_configure_sockets (&sadev->dev, &lubbock_pcmcia_ops);return sa1111_pcmcia_add (sadev, &lubbock_pcmcia_ops, pxa2xx_drv_pcmcia_add_one); }
Signature · 1 line
2.1.0
PATCH 3/8 ARM: locomo: fix locomo irq handling
In reply to Russell King - ARM LinuxAccidentally booting Collie on Assabet reveals that the locomo driver incorrectly overwrites gpio-sa1100's chip data for its parent interrupt, leading to oops in sa1100_gpio_unmask() and sa1100_update_edge_regs() when "gpio: sa1100: convert to use IO accessors" is applied. Fix locomo to use the handler data rather than chip data for its parent interrupt.
--- arch/arm/common/locomo.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
arch/arm/common/locomo.c +2 -3
@@ -140,7 +140,7 @@ static struct locomo_dev_info locomo_devices[] = {static void locomo_handler (struct irq_desc *desc) { -struct locomo *lchip =irq_desc_get_chip_data (desc); +struct locomo *lchip =irq_desc_get_handler_data (desc);int req, i;/* Acknowledge the parent IRQ */
@@ -200,8 +200,7 @@ static void locomo_setup_irq(struct locomo *lchip)* Install handler for IRQ_LOCOMO_HW. */ irq_set_irq_type (lchip->irq,IRQ_TYPE_EDGE_FALLING ); -irq_set_chip_data (lchip->irq, lchip); -irq_set_chained_handler (lchip->irq, locomo_handler); +irq_set_chained_handler_and_data (lchip->irq, locomo_handler, lchip);/* Install handlers for IRQ_LOCOMO_* */ for ( ; irq <= lchip->irq_base +3 ; irq++) {
Signature · 1 line
2.1.0
PATCH 4/8 ARM: sa1111: fix error code propagation in sa1111_probe()
In reply to Russell King - ARM LinuxEnsure that we propagate the platform_get_irq() error code out of the probe function. This allows probe deferrals to work correctly should platform_get_irq() not be able to resolve the interrupt in a DT environment at probe time.
--- arch/arm/common/sa1111.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm/common/sa1111.c +1 -1
@@ -1017,7 +1017,7 @@ static int sa1111_probe(struct platform_device *pdev)return -EINVAL ; irq =platform_get_irq (pdev,0 );if (irq <0 ) -return -ENXIO ; +return irq;return __sa1111_probe (&pdev->dev, mem, irq); }
Signature · 1 line
2.1.0
PATCH 5/8 ARM: sa1111: fix pcmcia interrupt mask polarity
In reply to Russell King - ARM LinuxThe polarity of the high IRQs was being calculated using SA1111_IRQMASK_HI(), but this assumes a Linux interrupt number, not a hardware interrupt number. Hence, the resulting mask was incorrect. Fix this.
--- arch/arm/common/sa1111.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/arm/common/sa1111.c +2 -2
@@ -472,8 +472,8 @@ static int sa1111_setup_irq(struct sa1111 *sachip, unsigned irq_base)* specifies that S0ReadyInt and S1ReadyInt should be '1'. */ sa1111_writel (0 , irqbase +SA1111_INTPOL0 ); -sa1111_writel (SA1111_IRQMASK_HI (IRQ_S0_READY_NINT ) | -SA1111_IRQMASK_HI (IRQ_S1_READY_NINT ), +sa1111_writel (BIT (IRQ_S0_READY_NINT &31 ) | +BIT (IRQ_S1_READY_NINT &31 ), irqbase +SA1111_INTPOL1 );/* clear all IRQs */
Signature · 1 line
2.1.0
PATCH 6/8 ARM: sa1111: fix pcmcia suspend/resume
In reply to Russell King - ARM LinuxSA1111 PCMCIA was broken when PCMCIA switched to using dev_pm_ops for the PCMCIA socket class. PCMCIA used to handle suspend/resume via the socket hosting device, which happened at normal device suspend/resume time.
However, the referenced commit changed this: much of the resume now happens much earlier, in the noirq resume handler of dev_pm_ops.
However, on SA1111, the PCMCIA device is not accessible as the SA1111 has not been resumed at _noirq time. It's slightly worse than that, because the SA1111 has already been put to sleep at _noirq time, so suspend doesn't work properly.
Fix this by converting the core SA1111 code to use dev_pm_ops as well, and performing its own suspend/resume at noirq time.
This fixes these errors in the kernel log:
pcmcia_socket pcmcia_socket0: time out after reset pcmcia_socket pcmcia_socket1: time out after reset
and the resulting lack of PCMCIA cards after a S2RAM cycle.
--- arch/arm/common/sa1111.c | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-)
arch/arm/common/sa1111.c +13 -9
@@ -869,9 +869,9 @@ struct sa1111_save_data {#ifdef CONFIG_PM -static int sa1111_suspend (struct platform_device *dev,pm_message_t state) +static int sa1111_suspend_noirq (struct device *dev) { -struct sa1111 *sachip =platform_get_drvdata (dev); +struct sa1111 *sachip =dev_get_drvdata (dev);struct sa1111_save_data *save;unsigned long flags;unsigned int val;
@@ -934,9 +934,9 @@ static int sa1111_suspend(struct platform_device *dev, pm_message_t state)* restored by their respective drivers, and must be called * via LDM after this function. */ -static int sa1111_resume (struct platform_device *dev) +static int sa1111_resume_noirq (struct device *dev) { -struct sa1111 *sachip =platform_get_drvdata (dev); +struct sa1111 *sachip =dev_get_drvdata (dev);struct sa1111_save_data *save;unsigned long flags, id;void __iomem *base;
@@ -952,7 +952,7 @@ static int sa1111_resume(struct platform_device *dev) id =sa1111_readl (sachip->base +SA1111_SKID );if ((id &SKID_ID_MASK ) !=SKID_SA1111_ID ) {__sa1111_remove (sachip); -platform_set_drvdata (dev,NULL ); +dev_set_drvdata (dev,NULL );kfree (save);return 0 ; }
@@ -1003,8 +1003,8 @@ static int sa1111_resume(struct platform_device *dev) }#else -#define sa1111_suspend NULL -#define sa1111_resume NULL +#define sa1111_suspend_noirq NULL +#define sa1111_resume_noirq NULL#endif static int sa1111_probe (struct platform_device *pdev)
@@ -1038,6 +1038,11 @@ static int sa1111_remove(struct platform_device *pdev)return 0 ; } +static struct dev_pm_ops sa1111_pm_ops = { + .suspend_noirq = sa1111_suspend_noirq, + .resume_noirq = sa1111_resume_noirq, +}; +/* * Not sure if this should be on the system bus or not yet. * We really want some way to register a system device at
@@ -1050,10 +1055,9 @@ static int sa1111_remove(struct platform_device *pdev)static struct platform_driver sa1111_device_driver = { .probe = sa1111_probe, .remove = sa1111_remove, - .suspend = sa1111_suspend, - .resume = sa1111_resume, .driver = { .name ="sa1111" , + .pm = &sa1111_pm_ops, }, };
Signature · 1 line
2.1.0
PATCH 7/8 ARM: sa1111: fix missing clk_disable()
In reply to Russell King - ARM LinuxSA1111 forgets to call clk_disable() in the probe error cleanup path. Add the necessary call.
--- arch/arm/common/sa1111.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
arch/arm/common/sa1111.c +3 -1
@@ -754,7 +754,7 @@ static int __sa1111_probe(struct device *me, struct resource *mem, int irq)if (sachip->irq !=NO_IRQ ) { ret =sa1111_setup_irq (sachip, pd->irq_base);if (ret) - goto err_unmap; + goto err_clk; }#ifdef CONFIG_ARCH_SA1100
@@ -799,6 +799,8 @@ static int __sa1111_probe(struct device *me, struct resource *mem, int irq)return 0 ; + err_clk: +clk_disable (sachip->clk); err_unmap:iounmap (sachip->base); err_clk_unprep:
Signature · 1 line
2.1.0
PATCH 8/8 ARM: pxa/lubbock: add pcmcia clock
In reply to Russell King - ARM LinuxAdd the required PCMCIA clock for the SA1111 "1800" device. This clock is used to compute timing information for the PCMCIA interface in the SoC device, rather than the SA1111. Hence, the provision of this clock is a convenience for the driver and does not reflect the hardware, so this must not be copied into DT.
--- arch/arm/mach-pxa/lubbock.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+)
arch/arm/mach-pxa/lubbock.c +14 -0
@@ -137,6 +137,18 @@ static struct pxa2xx_udc_mach_info udc_info __initdata = {// no D+ pullup; lubbock can't connect/disconnect in software }; +static void lubbock_init_pcmcia (void ) +{ +struct clk *clk; + +/* Add an alias for the SA1111 PCMCIA clock */ + clk =clk_get_sys ("pxa2xx-pcmcia" ,NULL ); +if (!IS_ERR (clk)) { +clkdev_create (clk,NULL ,"1800" ); +clk_put (clk); + } +} +static struct resource sa1111_resources[] = { [0 ] = { .start =0x10000000 ,
@@ -467,6 +479,8 @@ static void __init lubbock_init(void)pxa_set_btuart_info (NULL );pxa_set_stuart_info (NULL ); +lubbock_init_pcmcia (); +clk_add_alias ("SA1111_CLK" ,NULL ,"GPIO11_CLK" ,NULL );pxa_set_udc_info (&udc_info);pxa_set_fb_info (NULL , &sharp_lm8v31);
Signature · 1 line
2.1.0
Robert Jarzmik
maintainerPATCH 8/8 ARM: pxa/lubbock: add pcmcia clock
Quoted 7 lines · Russell King
Add the required PCMCIA clock for the SA1111 "1800" device. This clock is used to compute timing information for the PCMCIA interface in the SoC device, rather than the SA1111. Hence, the provision of this clock is a convenience for the driver and does not reflect the hardware, so this must not be copied into DT.
Signed-off-by Russell King <[email protected]>
But more importantly:
Cheers.
--
Robert
Russell King - ARM Linux
maintainerPATCH 8/8 ARM: pxa/lubbock: add pcmcia clock
Quoted 8 lines · Robert Jarzmik
Quoted 6 lines · Russell King
Add the required PCMCIA clock for the SA1111 "1800" device. This clock is used to compute timing information for the PCMCIA interface in the SoC device, rather than the SA1111. Hence, the provision of this clock is a convenience for the driver and does not reflect the hardware, so this must not be copied into DT.
Quoted 4 lines
Quoted 1 line
Signed-off-by Russell King <[email protected]>Acked-by Robert Jarzmik <[email protected]>But more importantly:
Tested-by Robert Jarzmik <[email protected]>
Thanks Robert. I guess no one else is be interested in these patches, so I'm going to drop them into -next today, and send them on Friday or over this weekend.
Signature · 3 lines
RMK's Patch system: http://www.armlinux.org.uk/developer/patches/ FTTC broadband for 0.8mile line: currently at 9.6Mbps down 400kbps up according to speedtest.net.
Robert Jarzmik
maintainerPATCH 8/8 ARM: pxa/lubbock: add pcmcia clock
Quoted 9 lines · Russell King - ARM Linux
Quoted 8 lines · Robert Jarzmik
Quoted 6 lines · Russell King
Add the required PCMCIA clock for the SA1111 "1800" device. This clock is used to compute timing information for the PCMCIA interface in the SoC device, rather than the SA1111. Hence, the provision of this clock is a convenience for the driver and does not reflect the hardware, so this must not be copied into DT.
Quoted 8 lines
Quoted 4 lines
Quoted 1 line
Signed-off-by Russell King <[email protected]>Acked-by Robert Jarzmik <[email protected]>But more importantly:
Tested-by Robert Jarzmik <[email protected]>Thanks Robert. I guess no one else is be interested in these patches, so I'm going to drop them into -next today, and send them on Friday or over this weekend.
Great !!!!
I'll keep the irq_get_chip() workaround in my private tree for now so that my automated testing farm can also test the compact flash card. And yes, /dev/hda1 appeared on my lubbock, with a good old MSDOS filesystem :))))
Thanks for the time taken for explanations, I appreciated.
Cheers.
Signature · 1 line
Robert