···361361 Alternatively, if you want dynamic tick automatically enabled362362 during boot, pass "dyntick=enable" via the kernel command string.363363364364+ Please note that dynamic tick may affect the accuracy of365365+ timekeeping on some platforms depending on the implementation.366366+ Currently at least OMAP platform is known to have accurate367367+ timekeeping with dynamic tick.368368+364369config ARCH_DISCONTIGMEM_ENABLE365370 bool366371 default (ARCH_LH7A40X && !LH7A40X_CONTIGMEM)
+4-3
arch/arm/mach-s3c2410/irq.c
···4040 * 04-Nov-2004 Ben Dooks4141 * Fix standard IRQ wake for EINT0..4 and RTC4242 *4343- * 22-Feb-2004 Ben Dooks4343+ * 22-Feb-2005 Ben Dooks4444 * Fixed edge-triggering on ADC IRQ4545+ *4646+ * 28-Jun-2005 Ben Dooks4747+ * Mark IRQ_LCD valid4548*/46494750#include <linux/init.h>···369366#define INTMSK_UART1 (1UL << (IRQ_UART1 - IRQ_EINT0))370367#define INTMSK_UART2 (1UL << (IRQ_UART2 - IRQ_EINT0))371368#define INTMSK_ADCPARENT (1UL << (IRQ_ADCPARENT - IRQ_EINT0))372372-#define INTMSK_LCD (1UL << (IRQ_LCD - IRQ_EINT0))373369374370static inline void375371s3c_irqsub_mask(unsigned int irqno, unsigned int parentbit,···718716 case IRQ_UART0:719717 case IRQ_UART1:720718 case IRQ_UART2:721721- case IRQ_LCD:722719 case IRQ_ADCPARENT:723720 set_irq_chip(irqno, &s3c_irq_level_chip);724721 set_irq_handler(irqno, do_level_IRQ);
···11+/*22+ * Arm specific backtracing code for oprofile33+ *44+ * Copyright 2005 Openedhand Ltd.55+ *66+ * Author: Richard Purdie <rpurdie@openedhand.com>77+ *88+ * Based on i386 oprofile backtrace code by John Levon, David Smith99+ *1010+ * This program is free software; you can redistribute it and/or modify1111+ * it under the terms of the GNU General Public License version 2 as1212+ * published by the Free Software Foundation.1313+ *1414+ */1515+1616+#include <linux/oprofile.h>1717+#include <linux/sched.h>1818+#include <linux/mm.h>1919+#include <asm/ptrace.h>2020+#include <asm/uaccess.h>2121+2222+2323+/*2424+ * The registers we're interested in are at the end of the variable2525+ * length saved register structure. The fp points at the end of this2626+ * structure so the address of this struct is:2727+ * (struct frame_tail *)(xxx->fp)-12828+ */2929+struct frame_tail {3030+ struct frame_tail *fp;3131+ unsigned long sp;3232+ unsigned long lr;3333+} __attribute__((packed));3434+3535+3636+#ifdef CONFIG_FRAME_POINTER3737+static struct frame_tail* kernel_backtrace(struct frame_tail *tail)3838+{3939+ oprofile_add_trace(tail->lr);4040+4141+ /* frame pointers should strictly progress back up the stack4242+ * (towards higher addresses) */4343+ if (tail >= tail->fp)4444+ return NULL;4545+4646+ return tail->fp-1;4747+}4848+#endif4949+5050+static struct frame_tail* user_backtrace(struct frame_tail *tail)5151+{5252+ struct frame_tail buftail;5353+5454+ /* hardware pte might not be valid due to dirty/accessed bit emulation5555+ * so we use copy_from_user and benefit from exception fixups */5656+ if (copy_from_user(&buftail, tail, sizeof(struct frame_tail)))5757+ return NULL;5858+5959+ oprofile_add_trace(buftail.lr);6060+6161+ /* frame pointers should strictly progress back up the stack6262+ * (towards higher addresses) */6363+ if (tail >= buftail.fp)6464+ return NULL;6565+6666+ return buftail.fp-1;6767+}6868+6969+/* Compare two addresses and see if they're on the same page */7070+#define CMP_ADDR_EQUAL(x,y,offset) ((((unsigned long) x) >> PAGE_SHIFT) \7171+ == ((((unsigned long) y) + offset) >> PAGE_SHIFT))7272+7373+/* check that the page(s) containing the frame tail are present */7474+static int pages_present(struct frame_tail *tail)7575+{7676+ struct mm_struct * mm = current->mm;7777+7878+ if (!check_user_page_readable(mm, (unsigned long)tail))7979+ return 0;8080+8181+ if (CMP_ADDR_EQUAL(tail, tail, 8))8282+ return 1;8383+8484+ if (!check_user_page_readable(mm, ((unsigned long)tail) + 8))8585+ return 0;8686+8787+ return 1;8888+}8989+9090+/*9191+ * | | /\ Higher addresses9292+ * | |9393+ * --------------- stack base (address of current_thread_info)9494+ * | thread info |9595+ * . .9696+ * | stack |9797+ * --------------- saved regs->ARM_fp value if valid (frame_tail address)9898+ * . .9999+ * --------------- struct pt_regs stored on stack (struct pt_regs *)100100+ * | |101101+ * . .102102+ * | |103103+ * --------------- %esp104104+ * | |105105+ * | | \/ Lower addresses106106+ *107107+ * Thus, &pt_regs <-> stack base restricts the valid(ish) fp values108108+ */109109+static int valid_kernel_stack(struct frame_tail *tail, struct pt_regs *regs)110110+{111111+ unsigned long tailaddr = (unsigned long)tail;112112+ unsigned long stack = (unsigned long)regs;113113+ unsigned long stack_base = (stack & ~(THREAD_SIZE - 1)) + THREAD_SIZE;114114+115115+ return (tailaddr > stack) && (tailaddr < stack_base);116116+}117117+118118+void arm_backtrace(struct pt_regs const *regs, unsigned int depth)119119+{120120+ struct frame_tail *tail;121121+ unsigned long last_address = 0;122122+123123+ tail = ((struct frame_tail *) regs->ARM_fp) - 1;124124+125125+ if (!user_mode(regs)) {126126+127127+#ifdef CONFIG_FRAME_POINTER128128+ while (depth-- && tail && valid_kernel_stack(tail, regs)) {129129+ tail = kernel_backtrace(tail);130130+ }131131+#endif132132+ return;133133+ }134134+135135+ while (depth-- && tail && !((unsigned long) tail & 3)) {136136+ if ((!CMP_ADDR_EQUAL(last_address, tail, 0)137137+ || !CMP_ADDR_EQUAL(last_address, tail, 8))138138+ && !pages_present(tail))139139+ return;140140+ last_address = (unsigned long) tail;141141+ tail = user_backtrace(tail);142142+ }143143+}144144+
+2
arch/arm/oprofile/init.c
···2020 ret = pmu_init(ops, &op_xscale_spec);2121#endif22222323+ ops->backtrace = arm_backtrace;2424+2325 return ret;2426}2527
···11+/* linux/include/asm-arm/arch-s3c2410/audio.h22+ *33+ * (c) 2004-2005 Simtec Electronics44+ * http://www.simtec.co.uk/products/SWLINUX/55+ * Ben Dooks <ben@simtec.co.uk>66+ *77+ * S3C24XX - Audio platfrom_device info88+ *99+ * This program is free software; you can redistribute it and/or modify1010+ * it under the terms of the GNU General Public License version 2 as1111+ * published by the Free Software Foundation.1212+ *1313+ * Changelog:1414+ * 20-Nov-2004 BJD Created file1515+ * 07-Mar-2005 BJD Added suspend/resume calls1616+*/1717+1818+#ifndef __ASM_ARCH_AUDIO_H1919+#define __ASM_ARCH_AUDIO_H __FILE__2020+2121+/* struct s3c24xx_iis_ops2222+ *2323+ * called from the s3c24xx audio core to deal with the architecture2424+ * or the codec's setup and control.2525+ *2626+ * the pointer to itself is passed through in case the caller wants to2727+ * embed this in an larger structure for easy reference to it's context.2828+*/2929+3030+struct s3c24xx_iis_ops {3131+ struct module *owner;3232+3333+ int (*startup)(struct s3c24xx_iis_ops *me);3434+ void (*shutdown)(struct s3c24xx_iis_ops *me);3535+ int (*suspend)(struct s3c24xx_iis_ops *me);3636+ int (*resume)(struct s3c24xx_iis_ops *me);3737+3838+ int (*open)(struct s3c24xx_iis_ops *me, snd_pcm_substream_t *strm);3939+ int (*close)(struct s3c24xx_iis_ops *me, snd_pcm_substream_t *strm);4040+ int (*prepare)(struct s3c24xx_iis_ops *me, snd_pcm_substream_t *strm, snd_pcm_runtime_t *rt);4141+};4242+4343+struct s3c24xx_platdata_iis {4444+ const char *codec_clk;4545+ struct s3c24xx_iis_ops *ops;4646+ int (*match_dev)(struct device *dev);4747+};4848+4949+#endif /* __ASM_ARCH_AUDIO_H */