···361 Alternatively, if you want dynamic tick automatically enabled362 during boot, pass "dyntick=enable" via the kernel command string.36300000364config ARCH_DISCONTIGMEM_ENABLE365 bool366 default (ARCH_LH7A40X && !LH7A40X_CONTIGMEM)
···361 Alternatively, if you want dynamic tick automatically enabled362 during boot, pass "dyntick=enable" via the kernel command string.363364+ Please note that dynamic tick may affect the accuracy of365+ timekeeping on some platforms depending on the implementation.366+ Currently at least OMAP platform is known to have accurate367+ timekeeping with dynamic tick.368+369config ARCH_DISCONTIGMEM_ENABLE370 bool371 default (ARCH_LH7A40X && !LH7A40X_CONTIGMEM)
+4-3
arch/arm/mach-s3c2410/irq.c
···40 * 04-Nov-2004 Ben Dooks41 * Fix standard IRQ wake for EINT0..4 and RTC42 *43- * 22-Feb-2004 Ben Dooks44 * Fixed edge-triggering on ADC IRQ00045*/4647#include <linux/init.h>···369#define INTMSK_UART1 (1UL << (IRQ_UART1 - IRQ_EINT0))370#define INTMSK_UART2 (1UL << (IRQ_UART2 - IRQ_EINT0))371#define INTMSK_ADCPARENT (1UL << (IRQ_ADCPARENT - IRQ_EINT0))372-#define INTMSK_LCD (1UL << (IRQ_LCD - IRQ_EINT0))373374static inline void375s3c_irqsub_mask(unsigned int irqno, unsigned int parentbit,···718 case IRQ_UART0:719 case IRQ_UART1:720 case IRQ_UART2:721- case IRQ_LCD:722 case IRQ_ADCPARENT:723 set_irq_chip(irqno, &s3c_irq_level_chip);724 set_irq_handler(irqno, do_level_IRQ);
···40 * 04-Nov-2004 Ben Dooks41 * Fix standard IRQ wake for EINT0..4 and RTC42 *43+ * 22-Feb-2005 Ben Dooks44 * Fixed edge-triggering on ADC IRQ45+ *46+ * 28-Jun-2005 Ben Dooks47+ * Mark IRQ_LCD valid48*/4950#include <linux/init.h>···366#define INTMSK_UART1 (1UL << (IRQ_UART1 - IRQ_EINT0))367#define INTMSK_UART2 (1UL << (IRQ_UART2 - IRQ_EINT0))368#define INTMSK_ADCPARENT (1UL << (IRQ_ADCPARENT - IRQ_EINT0))0369370static inline void371s3c_irqsub_mask(unsigned int irqno, unsigned int parentbit,···716 case IRQ_UART0:717 case IRQ_UART1:718 case IRQ_UART2:0719 case IRQ_ADCPARENT:720 set_irq_chip(irqno, &s3c_irq_level_chip);721 set_irq_handler(irqno, do_level_IRQ);
···1+/*2+ * Arm specific backtracing code for oprofile3+ *4+ * Copyright 2005 Openedhand Ltd.5+ *6+ * Author: Richard Purdie <rpurdie@openedhand.com>7+ *8+ * Based on i386 oprofile backtrace code by John Levon, David Smith9+ *10+ * This program is free software; you can redistribute it and/or modify11+ * it under the terms of the GNU General Public License version 2 as12+ * published by the Free Software Foundation.13+ *14+ */15+16+#include <linux/oprofile.h>17+#include <linux/sched.h>18+#include <linux/mm.h>19+#include <asm/ptrace.h>20+#include <asm/uaccess.h>21+22+23+/*24+ * The registers we're interested in are at the end of the variable25+ * length saved register structure. The fp points at the end of this26+ * structure so the address of this struct is:27+ * (struct frame_tail *)(xxx->fp)-128+ */29+struct frame_tail {30+ struct frame_tail *fp;31+ unsigned long sp;32+ unsigned long lr;33+} __attribute__((packed));34+35+36+#ifdef CONFIG_FRAME_POINTER37+static struct frame_tail* kernel_backtrace(struct frame_tail *tail)38+{39+ oprofile_add_trace(tail->lr);40+41+ /* frame pointers should strictly progress back up the stack42+ * (towards higher addresses) */43+ if (tail >= tail->fp)44+ return NULL;45+46+ return tail->fp-1;47+}48+#endif49+50+static struct frame_tail* user_backtrace(struct frame_tail *tail)51+{52+ struct frame_tail buftail;53+54+ /* hardware pte might not be valid due to dirty/accessed bit emulation55+ * so we use copy_from_user and benefit from exception fixups */56+ if (copy_from_user(&buftail, tail, sizeof(struct frame_tail)))57+ return NULL;58+59+ oprofile_add_trace(buftail.lr);60+61+ /* frame pointers should strictly progress back up the stack62+ * (towards higher addresses) */63+ if (tail >= buftail.fp)64+ return NULL;65+66+ return buftail.fp-1;67+}68+69+/* Compare two addresses and see if they're on the same page */70+#define CMP_ADDR_EQUAL(x,y,offset) ((((unsigned long) x) >> PAGE_SHIFT) \71+ == ((((unsigned long) y) + offset) >> PAGE_SHIFT))72+73+/* check that the page(s) containing the frame tail are present */74+static int pages_present(struct frame_tail *tail)75+{76+ struct mm_struct * mm = current->mm;77+78+ if (!check_user_page_readable(mm, (unsigned long)tail))79+ return 0;80+81+ if (CMP_ADDR_EQUAL(tail, tail, 8))82+ return 1;83+84+ if (!check_user_page_readable(mm, ((unsigned long)tail) + 8))85+ return 0;86+87+ return 1;88+}89+90+/*91+ * | | /\ Higher addresses92+ * | |93+ * --------------- stack base (address of current_thread_info)94+ * | thread info |95+ * . .96+ * | stack |97+ * --------------- saved regs->ARM_fp value if valid (frame_tail address)98+ * . .99+ * --------------- struct pt_regs stored on stack (struct pt_regs *)100+ * | |101+ * . .102+ * | |103+ * --------------- %esp104+ * | |105+ * | | \/ Lower addresses106+ *107+ * Thus, &pt_regs <-> stack base restricts the valid(ish) fp values108+ */109+static int valid_kernel_stack(struct frame_tail *tail, struct pt_regs *regs)110+{111+ unsigned long tailaddr = (unsigned long)tail;112+ unsigned long stack = (unsigned long)regs;113+ unsigned long stack_base = (stack & ~(THREAD_SIZE - 1)) + THREAD_SIZE;114+115+ return (tailaddr > stack) && (tailaddr < stack_base);116+}117+118+void arm_backtrace(struct pt_regs const *regs, unsigned int depth)119+{120+ struct frame_tail *tail;121+ unsigned long last_address = 0;122+123+ tail = ((struct frame_tail *) regs->ARM_fp) - 1;124+125+ if (!user_mode(regs)) {126+127+#ifdef CONFIG_FRAME_POINTER128+ while (depth-- && tail && valid_kernel_stack(tail, regs)) {129+ tail = kernel_backtrace(tail);130+ }131+#endif132+ return;133+ }134+135+ while (depth-- && tail && !((unsigned long) tail & 3)) {136+ if ((!CMP_ADDR_EQUAL(last_address, tail, 0)137+ || !CMP_ADDR_EQUAL(last_address, tail, 8))138+ && !pages_present(tail))139+ return;140+ last_address = (unsigned long) tail;141+ tail = user_backtrace(tail);142+ }143+}144+
+2
arch/arm/oprofile/init.c
···20 ret = pmu_init(ops, &op_xscale_spec);21#endif220023 return ret;24}25
···20 ret = pmu_init(ops, &op_xscale_spec);21#endif2223+ ops->backtrace = arm_backtrace;24+25 return ret;26}27
···1+/* linux/include/asm-arm/arch-s3c2410/audio.h2+ *3+ * (c) 2004-2005 Simtec Electronics4+ * http://www.simtec.co.uk/products/SWLINUX/5+ * Ben Dooks <ben@simtec.co.uk>6+ *7+ * S3C24XX - Audio platfrom_device info8+ *9+ * This program is free software; you can redistribute it and/or modify10+ * it under the terms of the GNU General Public License version 2 as11+ * published by the Free Software Foundation.12+ *13+ * Changelog:14+ * 20-Nov-2004 BJD Created file15+ * 07-Mar-2005 BJD Added suspend/resume calls16+*/17+18+#ifndef __ASM_ARCH_AUDIO_H19+#define __ASM_ARCH_AUDIO_H __FILE__20+21+/* struct s3c24xx_iis_ops22+ *23+ * called from the s3c24xx audio core to deal with the architecture24+ * or the codec's setup and control.25+ *26+ * the pointer to itself is passed through in case the caller wants to27+ * embed this in an larger structure for easy reference to it's context.28+*/29+30+struct s3c24xx_iis_ops {31+ struct module *owner;32+33+ int (*startup)(struct s3c24xx_iis_ops *me);34+ void (*shutdown)(struct s3c24xx_iis_ops *me);35+ int (*suspend)(struct s3c24xx_iis_ops *me);36+ int (*resume)(struct s3c24xx_iis_ops *me);37+38+ int (*open)(struct s3c24xx_iis_ops *me, snd_pcm_substream_t *strm);39+ int (*close)(struct s3c24xx_iis_ops *me, snd_pcm_substream_t *strm);40+ int (*prepare)(struct s3c24xx_iis_ops *me, snd_pcm_substream_t *strm, snd_pcm_runtime_t *rt);41+};42+43+struct s3c24xx_platdata_iis {44+ const char *codec_clk;45+ struct s3c24xx_iis_ops *ops;46+ int (*match_dev)(struct device *dev);47+};48+49+#endif /* __ASM_ARCH_AUDIO_H */