Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge master.kernel.org:/home/rmk/linux-2.6-arm

+445 -338
+2
arch/arm/mach-s3c2410/Makefile
··· 23 23 # S3C2440 support 24 24 25 25 obj-$(CONFIG_CPU_S3C2440) += s3c2440.o s3c2440-dsc.o 26 + obj-$(CONFIG_CPU_S3C2440) += s3c2440-irq.o 27 + obj-$(CONFIG_CPU_S3C2440) += s3c2440-clock.o 26 28 27 29 # machine specific support 28 30
-57
arch/arm/mach-s3c2410/clock.c
··· 448 448 449 449 return 0; 450 450 } 451 - 452 - /* S3C2440 extended clock support */ 453 - 454 - #ifdef CONFIG_CPU_S3C2440 455 - 456 - static struct clk s3c2440_clk_upll = { 457 - .name = "upll", 458 - .id = -1, 459 - }; 460 - 461 - static struct clk s3c2440_clk_cam = { 462 - .name = "camif", 463 - .parent = &clk_h, 464 - .id = -1, 465 - .enable = s3c24xx_clkcon_enable, 466 - .ctrlbit = S3C2440_CLKCON_CAMERA, 467 - }; 468 - 469 - static struct clk s3c2440_clk_ac97 = { 470 - .name = "ac97", 471 - .parent = &clk_p, 472 - .id = -1, 473 - .enable = s3c24xx_clkcon_enable, 474 - .ctrlbit = S3C2440_CLKCON_CAMERA, 475 - }; 476 - 477 - static int s3c2440_clk_add(struct sys_device *sysdev) 478 - { 479 - unsigned long upllcon = __raw_readl(S3C2410_UPLLCON); 480 - 481 - s3c2440_clk_upll.rate = s3c2410_get_pll(upllcon, clk_xtal.rate); 482 - 483 - printk("S3C2440: Clock Support, UPLL %ld.%03ld MHz\n", 484 - print_mhz(s3c2440_clk_upll.rate)); 485 - 486 - s3c24xx_register_clock(&s3c2440_clk_ac97); 487 - s3c24xx_register_clock(&s3c2440_clk_cam); 488 - s3c24xx_register_clock(&s3c2440_clk_upll); 489 - 490 - clk_disable(&s3c2440_clk_ac97); 491 - clk_disable(&s3c2440_clk_cam); 492 - 493 - return 0; 494 - } 495 - 496 - static struct sysdev_driver s3c2440_clk_driver = { 497 - .add = s3c2440_clk_add, 498 - }; 499 - 500 - static int s3c24xx_clk_driver(void) 501 - { 502 - return sysdev_driver_register(&s3c2440_sysclass, &s3c2440_clk_driver); 503 - } 504 - 505 - arch_initcall(s3c24xx_clk_driver); 506 - 507 - #endif /* CONFIG_CPU_S3C2440 */
+5 -255
arch/arm/mach-s3c2410/irq.c
··· 45 45 * 46 46 * 28-Jun-2005 Ben Dooks 47 47 * Mark IRQ_LCD valid 48 + * 49 + * 25-Jul-2005 Ben Dooks 50 + * Split the S3C2440 IRQ code to seperate file 48 51 */ 49 52 50 53 #include <linux/init.h> ··· 68 65 69 66 #include "cpu.h" 70 67 #include "pm.h" 71 - 72 - #define irqdbf(x...) 73 - #define irqdbf2(x...) 74 - 75 - #define EXTINT_OFF (IRQ_EINT4 - 4) 68 + #include "irq.h" 76 69 77 70 /* wakeup irq control */ 78 71 ··· 180 181 __raw_writel(mask, S3C2410_INTMSK); 181 182 } 182 183 183 - static struct irqchip s3c_irq_level_chip = { 184 + struct irqchip s3c_irq_level_chip = { 184 185 .ack = s3c_irq_maskack, 185 186 .mask = s3c_irq_mask, 186 187 .unmask = s3c_irq_unmask, ··· 369 370 #define INTMSK_UART2 (1UL << (IRQ_UART2 - IRQ_EINT0)) 370 371 #define INTMSK_ADCPARENT (1UL << (IRQ_ADCPARENT - IRQ_EINT0)) 371 372 372 - static inline void 373 - s3c_irqsub_mask(unsigned int irqno, unsigned int parentbit, 374 - int subcheck) 375 - { 376 - unsigned long mask; 377 - unsigned long submask; 378 - 379 - submask = __raw_readl(S3C2410_INTSUBMSK); 380 - mask = __raw_readl(S3C2410_INTMSK); 381 - 382 - submask |= (1UL << (irqno - IRQ_S3CUART_RX0)); 383 - 384 - /* check to see if we need to mask the parent IRQ */ 385 - 386 - if ((submask & subcheck) == subcheck) { 387 - __raw_writel(mask | parentbit, S3C2410_INTMSK); 388 - } 389 - 390 - /* write back masks */ 391 - __raw_writel(submask, S3C2410_INTSUBMSK); 392 - 393 - } 394 - 395 - static inline void 396 - s3c_irqsub_unmask(unsigned int irqno, unsigned int parentbit) 397 - { 398 - unsigned long mask; 399 - unsigned long submask; 400 - 401 - submask = __raw_readl(S3C2410_INTSUBMSK); 402 - mask = __raw_readl(S3C2410_INTMSK); 403 - 404 - submask &= ~(1UL << (irqno - IRQ_S3CUART_RX0)); 405 - mask &= ~parentbit; 406 - 407 - /* write back masks */ 408 - __raw_writel(submask, S3C2410_INTSUBMSK); 409 - __raw_writel(mask, S3C2410_INTMSK); 410 - } 411 - 412 - 413 - static inline void 414 - s3c_irqsub_maskack(unsigned int irqno, unsigned int parentmask, unsigned int group) 415 - { 416 - unsigned int bit = 1UL << (irqno - IRQ_S3CUART_RX0); 417 - 418 - s3c_irqsub_mask(irqno, parentmask, group); 419 - 420 - __raw_writel(bit, S3C2410_SUBSRCPND); 421 - 422 - /* only ack parent if we've got all the irqs (seems we must 423 - * ack, all and hope that the irq system retriggers ok when 424 - * the interrupt goes off again) 425 - */ 426 - 427 - if (1) { 428 - __raw_writel(parentmask, S3C2410_SRCPND); 429 - __raw_writel(parentmask, S3C2410_INTPND); 430 - } 431 - } 432 - 433 - static inline void 434 - s3c_irqsub_ack(unsigned int irqno, unsigned int parentmask, unsigned int group) 435 - { 436 - unsigned int bit = 1UL << (irqno - IRQ_S3CUART_RX0); 437 - 438 - __raw_writel(bit, S3C2410_SUBSRCPND); 439 - 440 - /* only ack parent if we've got all the irqs (seems we must 441 - * ack, all and hope that the irq system retriggers ok when 442 - * the interrupt goes off again) 443 - */ 444 - 445 - if (1) { 446 - __raw_writel(parentmask, S3C2410_SRCPND); 447 - __raw_writel(parentmask, S3C2410_INTPND); 448 - } 449 - } 450 373 451 374 /* UART0 */ 452 375 ··· 715 794 716 795 irqdbf("s3c2410: registered interrupt handlers\n"); 717 796 } 718 - 719 - /* s3c2440 irq code 720 - */ 721 - 722 - #ifdef CONFIG_CPU_S3C2440 723 - 724 - /* WDT/AC97 */ 725 - 726 - static void s3c_irq_demux_wdtac97(unsigned int irq, 727 - struct irqdesc *desc, 728 - struct pt_regs *regs) 729 - { 730 - unsigned int subsrc, submsk; 731 - struct irqdesc *mydesc; 732 - 733 - /* read the current pending interrupts, and the mask 734 - * for what it is available */ 735 - 736 - subsrc = __raw_readl(S3C2410_SUBSRCPND); 737 - submsk = __raw_readl(S3C2410_INTSUBMSK); 738 - 739 - subsrc &= ~submsk; 740 - subsrc >>= 13; 741 - subsrc &= 3; 742 - 743 - if (subsrc != 0) { 744 - if (subsrc & 1) { 745 - mydesc = irq_desc + IRQ_S3C2440_WDT; 746 - mydesc->handle( IRQ_S3C2440_WDT, mydesc, regs); 747 - } 748 - if (subsrc & 2) { 749 - mydesc = irq_desc + IRQ_S3C2440_AC97; 750 - mydesc->handle(IRQ_S3C2440_AC97, mydesc, regs); 751 - } 752 - } 753 - } 754 - 755 - 756 - #define INTMSK_WDT (1UL << (IRQ_WDT - IRQ_EINT0)) 757 - 758 - static void 759 - s3c_irq_wdtac97_mask(unsigned int irqno) 760 - { 761 - s3c_irqsub_mask(irqno, INTMSK_WDT, 3<<13); 762 - } 763 - 764 - static void 765 - s3c_irq_wdtac97_unmask(unsigned int irqno) 766 - { 767 - s3c_irqsub_unmask(irqno, INTMSK_WDT); 768 - } 769 - 770 - static void 771 - s3c_irq_wdtac97_ack(unsigned int irqno) 772 - { 773 - s3c_irqsub_maskack(irqno, INTMSK_WDT, 3<<13); 774 - } 775 - 776 - static struct irqchip s3c_irq_wdtac97 = { 777 - .mask = s3c_irq_wdtac97_mask, 778 - .unmask = s3c_irq_wdtac97_unmask, 779 - .ack = s3c_irq_wdtac97_ack, 780 - }; 781 - 782 - /* camera irq */ 783 - 784 - static void s3c_irq_demux_cam(unsigned int irq, 785 - struct irqdesc *desc, 786 - struct pt_regs *regs) 787 - { 788 - unsigned int subsrc, submsk; 789 - struct irqdesc *mydesc; 790 - 791 - /* read the current pending interrupts, and the mask 792 - * for what it is available */ 793 - 794 - subsrc = __raw_readl(S3C2410_SUBSRCPND); 795 - submsk = __raw_readl(S3C2410_INTSUBMSK); 796 - 797 - subsrc &= ~submsk; 798 - subsrc >>= 11; 799 - subsrc &= 3; 800 - 801 - if (subsrc != 0) { 802 - if (subsrc & 1) { 803 - mydesc = irq_desc + IRQ_S3C2440_CAM_C; 804 - mydesc->handle( IRQ_S3C2440_WDT, mydesc, regs); 805 - } 806 - if (subsrc & 2) { 807 - mydesc = irq_desc + IRQ_S3C2440_CAM_P; 808 - mydesc->handle(IRQ_S3C2440_AC97, mydesc, regs); 809 - } 810 - } 811 - } 812 - 813 - #define INTMSK_CAM (1UL << (IRQ_CAM - IRQ_EINT0)) 814 - 815 - static void 816 - s3c_irq_cam_mask(unsigned int irqno) 817 - { 818 - s3c_irqsub_mask(irqno, INTMSK_CAM, 3<<11); 819 - } 820 - 821 - static void 822 - s3c_irq_cam_unmask(unsigned int irqno) 823 - { 824 - s3c_irqsub_unmask(irqno, INTMSK_CAM); 825 - } 826 - 827 - static void 828 - s3c_irq_cam_ack(unsigned int irqno) 829 - { 830 - s3c_irqsub_maskack(irqno, INTMSK_CAM, 3<<11); 831 - } 832 - 833 - static struct irqchip s3c_irq_cam = { 834 - .mask = s3c_irq_cam_mask, 835 - .unmask = s3c_irq_cam_unmask, 836 - .ack = s3c_irq_cam_ack, 837 - }; 838 - 839 - static int s3c2440_irq_add(struct sys_device *sysdev) 840 - { 841 - unsigned int irqno; 842 - 843 - printk("S3C2440: IRQ Support\n"); 844 - 845 - set_irq_chip(IRQ_NFCON, &s3c_irq_level_chip); 846 - set_irq_handler(IRQ_NFCON, do_level_IRQ); 847 - set_irq_flags(IRQ_NFCON, IRQF_VALID); 848 - 849 - /* add new chained handler for wdt, ac7 */ 850 - 851 - set_irq_chip(IRQ_WDT, &s3c_irq_level_chip); 852 - set_irq_handler(IRQ_WDT, do_level_IRQ); 853 - set_irq_chained_handler(IRQ_WDT, s3c_irq_demux_wdtac97); 854 - 855 - for (irqno = IRQ_S3C2440_WDT; irqno <= IRQ_S3C2440_AC97; irqno++) { 856 - set_irq_chip(irqno, &s3c_irq_wdtac97); 857 - set_irq_handler(irqno, do_level_IRQ); 858 - set_irq_flags(irqno, IRQF_VALID); 859 - } 860 - 861 - /* add chained handler for camera */ 862 - 863 - set_irq_chip(IRQ_CAM, &s3c_irq_level_chip); 864 - set_irq_handler(IRQ_CAM, do_level_IRQ); 865 - set_irq_chained_handler(IRQ_CAM, s3c_irq_demux_cam); 866 - 867 - for (irqno = IRQ_S3C2440_CAM_C; irqno <= IRQ_S3C2440_CAM_P; irqno++) { 868 - set_irq_chip(irqno, &s3c_irq_cam); 869 - set_irq_handler(irqno, do_level_IRQ); 870 - set_irq_flags(irqno, IRQF_VALID); 871 - } 872 - 873 - return 0; 874 - } 875 - 876 - static struct sysdev_driver s3c2440_irq_driver = { 877 - .add = s3c2440_irq_add, 878 - }; 879 - 880 - static int s3c24xx_irq_driver(void) 881 - { 882 - return sysdev_driver_register(&s3c2440_sysclass, &s3c2440_irq_driver); 883 - } 884 - 885 - arch_initcall(s3c24xx_irq_driver); 886 - 887 - #endif /* CONFIG_CPU_S3C2440 */ 888 -
+99
arch/arm/mach-s3c2410/irq.h
··· 1 + /* arch/arm/mach-s3c2410/irq.h 2 + * 3 + * Copyright (c) 2004-2005 Simtec Electronics 4 + * Ben Dooks <ben@simtec.co.uk> 5 + * 6 + * Header file for S3C24XX CPU IRQ support 7 + * 8 + * This program is free software; you can redistribute it and/or modify 9 + * it under the terms of the GNU General Public License version 2 as 10 + * published by the Free Software Foundation. 11 + * 12 + * Modifications: 13 + */ 14 + 15 + #define irqdbf(x...) 16 + #define irqdbf2(x...) 17 + 18 + #define EXTINT_OFF (IRQ_EINT4 - 4) 19 + 20 + extern struct irqchip s3c_irq_level_chip; 21 + 22 + static inline void 23 + s3c_irqsub_mask(unsigned int irqno, unsigned int parentbit, 24 + int subcheck) 25 + { 26 + unsigned long mask; 27 + unsigned long submask; 28 + 29 + submask = __raw_readl(S3C2410_INTSUBMSK); 30 + mask = __raw_readl(S3C2410_INTMSK); 31 + 32 + submask |= (1UL << (irqno - IRQ_S3CUART_RX0)); 33 + 34 + /* check to see if we need to mask the parent IRQ */ 35 + 36 + if ((submask & subcheck) == subcheck) { 37 + __raw_writel(mask | parentbit, S3C2410_INTMSK); 38 + } 39 + 40 + /* write back masks */ 41 + __raw_writel(submask, S3C2410_INTSUBMSK); 42 + 43 + } 44 + 45 + static inline void 46 + s3c_irqsub_unmask(unsigned int irqno, unsigned int parentbit) 47 + { 48 + unsigned long mask; 49 + unsigned long submask; 50 + 51 + submask = __raw_readl(S3C2410_INTSUBMSK); 52 + mask = __raw_readl(S3C2410_INTMSK); 53 + 54 + submask &= ~(1UL << (irqno - IRQ_S3CUART_RX0)); 55 + mask &= ~parentbit; 56 + 57 + /* write back masks */ 58 + __raw_writel(submask, S3C2410_INTSUBMSK); 59 + __raw_writel(mask, S3C2410_INTMSK); 60 + } 61 + 62 + 63 + static inline void 64 + s3c_irqsub_maskack(unsigned int irqno, unsigned int parentmask, unsigned int group) 65 + { 66 + unsigned int bit = 1UL << (irqno - IRQ_S3CUART_RX0); 67 + 68 + s3c_irqsub_mask(irqno, parentmask, group); 69 + 70 + __raw_writel(bit, S3C2410_SUBSRCPND); 71 + 72 + /* only ack parent if we've got all the irqs (seems we must 73 + * ack, all and hope that the irq system retriggers ok when 74 + * the interrupt goes off again) 75 + */ 76 + 77 + if (1) { 78 + __raw_writel(parentmask, S3C2410_SRCPND); 79 + __raw_writel(parentmask, S3C2410_INTPND); 80 + } 81 + } 82 + 83 + static inline void 84 + s3c_irqsub_ack(unsigned int irqno, unsigned int parentmask, unsigned int group) 85 + { 86 + unsigned int bit = 1UL << (irqno - IRQ_S3CUART_RX0); 87 + 88 + __raw_writel(bit, S3C2410_SUBSRCPND); 89 + 90 + /* only ack parent if we've got all the irqs (seems we must 91 + * ack, all and hope that the irq system retriggers ok when 92 + * the interrupt goes off again) 93 + */ 94 + 95 + if (1) { 96 + __raw_writel(parentmask, S3C2410_SRCPND); 97 + __raw_writel(parentmask, S3C2410_INTPND); 98 + } 99 + }
+5 -8
arch/arm/mach-s3c2410/mach-bast.c
··· 25 25 * 14-Jan-2005 BJD Add support for muitlple NAND devices 26 26 * 03-Mar-2005 BJD Ensured that bast-cpld.h is included 27 27 * 10-Mar-2005 LCVR Changed S3C2410_VA to S3C24XX_VA 28 - * 14-Mar-2006 BJD Updated for __iomem changes 29 - * 22-Jun-2006 BJD Added DM9000 platform information 30 - * 28-Jun-2006 BJD Moved pm functionality out to common code 31 - * 17-Jul-2006 BJD Changed to platform device for SuperIO 16550s 28 + * 14-Mar-2005 BJD Updated for __iomem changes 29 + * 22-Jun-2005 BJD Added DM9000 platform information 30 + * 28-Jun-2005 BJD Moved pm functionality out to common code 31 + * 17-Jul-2005 BJD Changed to platform device for SuperIO 16550s 32 + * 25-Jul-2005 BJD Removed ASIX static mappings 32 33 */ 33 34 34 35 #include <linux/kernel.h> ··· 117 116 /* slow, byte */ 118 117 { VA_C2(BAST_VA_ISAIO), PA_CS2(BAST_PA_ISAIO), SZ_16M, MT_DEVICE }, 119 118 { VA_C2(BAST_VA_ISAMEM), PA_CS2(BAST_PA_ISAMEM), SZ_16M, MT_DEVICE }, 120 - { VA_C2(BAST_VA_ASIXNET), PA_CS3(BAST_PA_ASIXNET), SZ_1M, MT_DEVICE }, 121 119 { VA_C2(BAST_VA_SUPERIO), PA_CS2(BAST_PA_SUPERIO), SZ_1M, MT_DEVICE }, 122 120 { VA_C2(BAST_VA_IDEPRI), PA_CS3(BAST_PA_IDEPRI), SZ_1M, MT_DEVICE }, 123 121 { VA_C2(BAST_VA_IDESEC), PA_CS3(BAST_PA_IDESEC), SZ_1M, MT_DEVICE }, ··· 126 126 /* slow, word */ 127 127 { VA_C3(BAST_VA_ISAIO), PA_CS3(BAST_PA_ISAIO), SZ_16M, MT_DEVICE }, 128 128 { VA_C3(BAST_VA_ISAMEM), PA_CS3(BAST_PA_ISAMEM), SZ_16M, MT_DEVICE }, 129 - { VA_C3(BAST_VA_ASIXNET), PA_CS3(BAST_PA_ASIXNET), SZ_1M, MT_DEVICE }, 130 129 { VA_C3(BAST_VA_SUPERIO), PA_CS3(BAST_PA_SUPERIO), SZ_1M, MT_DEVICE }, 131 130 { VA_C3(BAST_VA_IDEPRI), PA_CS3(BAST_PA_IDEPRI), SZ_1M, MT_DEVICE }, 132 131 { VA_C3(BAST_VA_IDESEC), PA_CS3(BAST_PA_IDESEC), SZ_1M, MT_DEVICE }, ··· 135 136 /* fast, byte */ 136 137 { VA_C4(BAST_VA_ISAIO), PA_CS4(BAST_PA_ISAIO), SZ_16M, MT_DEVICE }, 137 138 { VA_C4(BAST_VA_ISAMEM), PA_CS4(BAST_PA_ISAMEM), SZ_16M, MT_DEVICE }, 138 - { VA_C4(BAST_VA_ASIXNET), PA_CS5(BAST_PA_ASIXNET), SZ_1M, MT_DEVICE }, 139 139 { VA_C4(BAST_VA_SUPERIO), PA_CS4(BAST_PA_SUPERIO), SZ_1M, MT_DEVICE }, 140 140 { VA_C4(BAST_VA_IDEPRI), PA_CS5(BAST_PA_IDEPRI), SZ_1M, MT_DEVICE }, 141 141 { VA_C4(BAST_VA_IDESEC), PA_CS5(BAST_PA_IDESEC), SZ_1M, MT_DEVICE }, ··· 144 146 /* fast, word */ 145 147 { VA_C5(BAST_VA_ISAIO), PA_CS5(BAST_PA_ISAIO), SZ_16M, MT_DEVICE }, 146 148 { VA_C5(BAST_VA_ISAMEM), PA_CS5(BAST_PA_ISAMEM), SZ_16M, MT_DEVICE }, 147 - { VA_C5(BAST_VA_ASIXNET), PA_CS5(BAST_PA_ASIXNET), SZ_1M, MT_DEVICE }, 148 149 { VA_C5(BAST_VA_SUPERIO), PA_CS5(BAST_PA_SUPERIO), SZ_1M, MT_DEVICE }, 149 150 { VA_C5(BAST_VA_IDEPRI), PA_CS5(BAST_PA_IDEPRI), SZ_1M, MT_DEVICE }, 150 151 { VA_C5(BAST_VA_IDESEC), PA_CS5(BAST_PA_IDESEC), SZ_1M, MT_DEVICE },
+116
arch/arm/mach-s3c2410/s3c2440-clock.c
··· 1 + /* linux/arch/arm/mach-s3c2410/s3c2440-clock.c 2 + * 3 + * Copyright (c) 2004-2005 Simtec Electronics 4 + * http://armlinux.simtec.co.uk/ 5 + * Ben Dooks <ben@simtec.co.uk> 6 + * 7 + * S3C2440 Clock support 8 + * 9 + * This program is free software; you can redistribute it and/or modify 10 + * it under the terms of the GNU General Public License as published by 11 + * the Free Software Foundation; either version 2 of the License, or 12 + * (at your option) any later version. 13 + * 14 + * This program is distributed in the hope that it will be useful, 15 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 16 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 + * GNU General Public License for more details. 18 + * 19 + * You should have received a copy of the GNU General Public License 20 + * along with this program; if not, write to the Free Software 21 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 22 + */ 23 + 24 + #include <linux/init.h> 25 + #include <linux/module.h> 26 + #include <linux/kernel.h> 27 + #include <linux/list.h> 28 + #include <linux/errno.h> 29 + #include <linux/err.h> 30 + #include <linux/device.h> 31 + #include <linux/sysdev.h> 32 + 33 + #include <linux/interrupt.h> 34 + #include <linux/ioport.h> 35 + 36 + #include <asm/hardware.h> 37 + #include <asm/atomic.h> 38 + #include <asm/irq.h> 39 + #include <asm/io.h> 40 + 41 + #include <asm/hardware/clock.h> 42 + #include <asm/arch/regs-clock.h> 43 + 44 + #include "clock.h" 45 + #include "cpu.h" 46 + 47 + /* S3C2440 extended clock support */ 48 + 49 + static struct clk s3c2440_clk_upll = { 50 + .name = "upll", 51 + .id = -1, 52 + }; 53 + 54 + static struct clk s3c2440_clk_cam = { 55 + .name = "camif", 56 + .id = -1, 57 + .enable = s3c24xx_clkcon_enable, 58 + .ctrlbit = S3C2440_CLKCON_CAMERA, 59 + }; 60 + 61 + static struct clk s3c2440_clk_ac97 = { 62 + .name = "ac97", 63 + .id = -1, 64 + .enable = s3c24xx_clkcon_enable, 65 + .ctrlbit = S3C2440_CLKCON_CAMERA, 66 + }; 67 + 68 + static int s3c2440_clk_add(struct sys_device *sysdev) 69 + { 70 + unsigned long upllcon = __raw_readl(S3C2410_UPLLCON); 71 + struct clk *clk_h; 72 + struct clk *clk_p; 73 + struct clk *clk_xtal; 74 + 75 + clk_xtal = clk_get(NULL, "xtal"); 76 + if (IS_ERR(clk_xtal)) { 77 + printk(KERN_ERR "S3C2440: Failed to get clk_xtal\n"); 78 + return -EINVAL; 79 + } 80 + 81 + s3c2440_clk_upll.rate = s3c2410_get_pll(upllcon, clk_xtal->rate); 82 + 83 + printk("S3C2440: Clock Support, UPLL %ld.%03ld MHz\n", 84 + print_mhz(s3c2440_clk_upll.rate)); 85 + 86 + clk_p = clk_get(NULL, "pclk"); 87 + clk_h = clk_get(NULL, "hclk"); 88 + 89 + if (IS_ERR(clk_p) || IS_ERR(clk_h)) { 90 + printk(KERN_ERR "S3C2440: Failed to get parent clocks\n"); 91 + return -EINVAL; 92 + } 93 + 94 + s3c2440_clk_cam.parent = clk_h; 95 + s3c2440_clk_ac97.parent = clk_p; 96 + 97 + s3c24xx_register_clock(&s3c2440_clk_ac97); 98 + s3c24xx_register_clock(&s3c2440_clk_cam); 99 + s3c24xx_register_clock(&s3c2440_clk_upll); 100 + 101 + clk_disable(&s3c2440_clk_ac97); 102 + clk_disable(&s3c2440_clk_cam); 103 + 104 + return 0; 105 + } 106 + 107 + static struct sysdev_driver s3c2440_clk_driver = { 108 + .add = s3c2440_clk_add, 109 + }; 110 + 111 + static __init int s3c24xx_clk_driver(void) 112 + { 113 + return sysdev_driver_register(&s3c2440_sysclass, &s3c2440_clk_driver); 114 + } 115 + 116 + arch_initcall(s3c24xx_clk_driver);
+207
arch/arm/mach-s3c2410/s3c2440-irq.c
··· 1 + /* linux/arch/arm/mach-s3c2410/s3c2440-irq.c 2 + * 3 + * Copyright (c) 2003,2004 Simtec Electronics 4 + * Ben Dooks <ben@simtec.co.uk> 5 + * 6 + * This program is free software; you can redistribute it and/or modify 7 + * it under the terms of the GNU General Public License as published by 8 + * the Free Software Foundation; either version 2 of the License, or 9 + * (at your option) any later version. 10 + * 11 + * This program is distributed in the hope that it will be useful, 12 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 + * GNU General Public License for more details. 15 + * 16 + * You should have received a copy of the GNU General Public License 17 + * along with this program; if not, write to the Free Software 18 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 19 + * 20 + * Changelog: 21 + * 25-Jul-2005 BJD Split from irq.c 22 + * 23 + */ 24 + 25 + #include <linux/init.h> 26 + #include <linux/module.h> 27 + #include <linux/interrupt.h> 28 + #include <linux/ioport.h> 29 + #include <linux/ptrace.h> 30 + #include <linux/sysdev.h> 31 + 32 + #include <asm/hardware.h> 33 + #include <asm/irq.h> 34 + #include <asm/io.h> 35 + 36 + #include <asm/mach/irq.h> 37 + 38 + #include <asm/arch/regs-irq.h> 39 + #include <asm/arch/regs-gpio.h> 40 + 41 + #include "cpu.h" 42 + #include "pm.h" 43 + #include "irq.h" 44 + 45 + /* WDT/AC97 */ 46 + 47 + static void s3c_irq_demux_wdtac97(unsigned int irq, 48 + struct irqdesc *desc, 49 + struct pt_regs *regs) 50 + { 51 + unsigned int subsrc, submsk; 52 + struct irqdesc *mydesc; 53 + 54 + /* read the current pending interrupts, and the mask 55 + * for what it is available */ 56 + 57 + subsrc = __raw_readl(S3C2410_SUBSRCPND); 58 + submsk = __raw_readl(S3C2410_INTSUBMSK); 59 + 60 + subsrc &= ~submsk; 61 + subsrc >>= 13; 62 + subsrc &= 3; 63 + 64 + if (subsrc != 0) { 65 + if (subsrc & 1) { 66 + mydesc = irq_desc + IRQ_S3C2440_WDT; 67 + mydesc->handle( IRQ_S3C2440_WDT, mydesc, regs); 68 + } 69 + if (subsrc & 2) { 70 + mydesc = irq_desc + IRQ_S3C2440_AC97; 71 + mydesc->handle(IRQ_S3C2440_AC97, mydesc, regs); 72 + } 73 + } 74 + } 75 + 76 + 77 + #define INTMSK_WDT (1UL << (IRQ_WDT - IRQ_EINT0)) 78 + 79 + static void 80 + s3c_irq_wdtac97_mask(unsigned int irqno) 81 + { 82 + s3c_irqsub_mask(irqno, INTMSK_WDT, 3<<13); 83 + } 84 + 85 + static void 86 + s3c_irq_wdtac97_unmask(unsigned int irqno) 87 + { 88 + s3c_irqsub_unmask(irqno, INTMSK_WDT); 89 + } 90 + 91 + static void 92 + s3c_irq_wdtac97_ack(unsigned int irqno) 93 + { 94 + s3c_irqsub_maskack(irqno, INTMSK_WDT, 3<<13); 95 + } 96 + 97 + static struct irqchip s3c_irq_wdtac97 = { 98 + .mask = s3c_irq_wdtac97_mask, 99 + .unmask = s3c_irq_wdtac97_unmask, 100 + .ack = s3c_irq_wdtac97_ack, 101 + }; 102 + 103 + /* camera irq */ 104 + 105 + static void s3c_irq_demux_cam(unsigned int irq, 106 + struct irqdesc *desc, 107 + struct pt_regs *regs) 108 + { 109 + unsigned int subsrc, submsk; 110 + struct irqdesc *mydesc; 111 + 112 + /* read the current pending interrupts, and the mask 113 + * for what it is available */ 114 + 115 + subsrc = __raw_readl(S3C2410_SUBSRCPND); 116 + submsk = __raw_readl(S3C2410_INTSUBMSK); 117 + 118 + subsrc &= ~submsk; 119 + subsrc >>= 11; 120 + subsrc &= 3; 121 + 122 + if (subsrc != 0) { 123 + if (subsrc & 1) { 124 + mydesc = irq_desc + IRQ_S3C2440_CAM_C; 125 + mydesc->handle( IRQ_S3C2440_WDT, mydesc, regs); 126 + } 127 + if (subsrc & 2) { 128 + mydesc = irq_desc + IRQ_S3C2440_CAM_P; 129 + mydesc->handle(IRQ_S3C2440_AC97, mydesc, regs); 130 + } 131 + } 132 + } 133 + 134 + #define INTMSK_CAM (1UL << (IRQ_CAM - IRQ_EINT0)) 135 + 136 + static void 137 + s3c_irq_cam_mask(unsigned int irqno) 138 + { 139 + s3c_irqsub_mask(irqno, INTMSK_CAM, 3<<11); 140 + } 141 + 142 + static void 143 + s3c_irq_cam_unmask(unsigned int irqno) 144 + { 145 + s3c_irqsub_unmask(irqno, INTMSK_CAM); 146 + } 147 + 148 + static void 149 + s3c_irq_cam_ack(unsigned int irqno) 150 + { 151 + s3c_irqsub_maskack(irqno, INTMSK_CAM, 3<<11); 152 + } 153 + 154 + static struct irqchip s3c_irq_cam = { 155 + .mask = s3c_irq_cam_mask, 156 + .unmask = s3c_irq_cam_unmask, 157 + .ack = s3c_irq_cam_ack, 158 + }; 159 + 160 + static int s3c2440_irq_add(struct sys_device *sysdev) 161 + { 162 + unsigned int irqno; 163 + 164 + printk("S3C2440: IRQ Support\n"); 165 + 166 + set_irq_chip(IRQ_NFCON, &s3c_irq_level_chip); 167 + set_irq_handler(IRQ_NFCON, do_level_IRQ); 168 + set_irq_flags(IRQ_NFCON, IRQF_VALID); 169 + 170 + /* add new chained handler for wdt, ac7 */ 171 + 172 + set_irq_chip(IRQ_WDT, &s3c_irq_level_chip); 173 + set_irq_handler(IRQ_WDT, do_level_IRQ); 174 + set_irq_chained_handler(IRQ_WDT, s3c_irq_demux_wdtac97); 175 + 176 + for (irqno = IRQ_S3C2440_WDT; irqno <= IRQ_S3C2440_AC97; irqno++) { 177 + set_irq_chip(irqno, &s3c_irq_wdtac97); 178 + set_irq_handler(irqno, do_level_IRQ); 179 + set_irq_flags(irqno, IRQF_VALID); 180 + } 181 + 182 + /* add chained handler for camera */ 183 + 184 + set_irq_chip(IRQ_CAM, &s3c_irq_level_chip); 185 + set_irq_handler(IRQ_CAM, do_level_IRQ); 186 + set_irq_chained_handler(IRQ_CAM, s3c_irq_demux_cam); 187 + 188 + for (irqno = IRQ_S3C2440_CAM_C; irqno <= IRQ_S3C2440_CAM_P; irqno++) { 189 + set_irq_chip(irqno, &s3c_irq_cam); 190 + set_irq_handler(irqno, do_level_IRQ); 191 + set_irq_flags(irqno, IRQF_VALID); 192 + } 193 + 194 + return 0; 195 + } 196 + 197 + static struct sysdev_driver s3c2440_irq_driver = { 198 + .add = s3c2440_irq_add, 199 + }; 200 + 201 + static int s3c24xx_irq_driver(void) 202 + { 203 + return sysdev_driver_register(&s3c2440_sysclass, &s3c2440_irq_driver); 204 + } 205 + 206 + arch_initcall(s3c24xx_irq_driver); 207 +
+4 -15
drivers/pcmcia/sa1100_jornada720.c
··· 30 30 */ 31 31 GRER |= 0x00000002; 32 32 /* Set GPIO_A<3:1> to be outputs for PCMCIA/CF power controller: */ 33 - PA_DDR = 0; 34 - PA_DWR = 0; 35 - PA_SDR = 0; 36 - PA_SSR = 0; 37 - 38 - PB_DDR = 0; 39 - PB_DWR = 0x01; 40 - PB_SDR = 0; 41 - PB_SSR = 0; 42 - 43 - PC_DDR = 0x88; 44 - PC_DWR = 0x20; 45 - PC_SDR = 0; 46 - PC_SSR = 0; 33 + sa1111_set_io_dir(SA1111_DEV(skt->dev), GPIO_A0|GPIO_A1|GPIO_A2|GPIO_A3, 0, 0); 34 + sa1111_set_io(SA1111_DEV(skt->dev), GPIO_A0|GPIO_A1|GPIO_A2|GPIO_A3, 0); 35 + sa1111_set_sleep_io(SA1111_DEV(skt->dev), GPIO_A0|GPIO_A1|GPIO_A2|GPIO_A3, 0); 47 36 48 37 return sa1111_pcmcia_hw_init(skt); 49 38 } ··· 84 95 unsigned long flags; 85 96 86 97 local_irq_save(flags); 87 - PA_DWR = (PA_DWR & ~pa_dwr_mask) | pa_dwr_set; 98 + sa1111_set_io(SA1111_DEV(skt->dev), pa_dwr_mask, pa_dwr_set); 88 99 local_irq_restore(flags); 89 100 } 90 101
+7 -3
include/asm-arm/arch-s3c2410/regs-iis.h
··· 15 15 * 12-03-2004 BJD Updated include protection 16 16 * 07-03-2005 BJD Added FIFO size flags and S3C2440 MPLL 17 17 * 05-04-2005 LCVR Added IISFCON definitions for the S3C2400 18 + * 18-07-2005 DA Change IISCON_MPLL to IISMOD_MPLL 19 + * Correct IISMOD_256FS and IISMOD_384FS 20 + * Add IISCON_PSCEN 18 21 */ 19 22 20 23 #ifndef __ASM_ARCH_REGS_IIS_H ··· 25 22 26 23 #define S3C2410_IISCON (0x00) 27 24 28 - #define S3C2440_IISCON_MPLL (1<<9) 29 25 #define S3C2410_IISCON_LRINDEX (1<<8) 30 26 #define S3C2410_IISCON_TXFIFORDY (1<<7) 31 27 #define S3C2410_IISCON_RXFIFORDY (1<<6) ··· 32 30 #define S3C2410_IISCON_RXDMAEN (1<<4) 33 31 #define S3C2410_IISCON_TXIDLE (1<<3) 34 32 #define S3C2410_IISCON_RXIDLE (1<<2) 33 + #define S3C2410_IISCON_PSCEN (1<<1) 35 34 #define S3C2410_IISCON_IISEN (1<<0) 36 35 37 36 #define S3C2410_IISMOD (0x04) 38 37 38 + #define S3C2440_IISMOD_MPLL (1<<9) 39 39 #define S3C2410_IISMOD_SLAVE (1<<8) 40 40 #define S3C2410_IISMOD_NOXFER (0<<6) 41 41 #define S3C2410_IISMOD_RXMODE (1<<6) ··· 50 46 #define S3C2410_IISMOD_8BIT (0<<3) 51 47 #define S3C2410_IISMOD_16BIT (1<<3) 52 48 #define S3C2410_IISMOD_BITMASK (1<<3) 53 - #define S3C2410_IISMOD_256FS (0<<1) 54 - #define S3C2410_IISMOD_384FS (1<<1) 49 + #define S3C2410_IISMOD_256FS (0<<2) 50 + #define S3C2410_IISMOD_384FS (1<<2) 55 51 #define S3C2410_IISMOD_16FS (0<<0) 56 52 #define S3C2410_IISMOD_32FS (1<<0) 57 53 #define S3C2410_IISMOD_48FS (2<<0)