Merge branch 'upstream' of git://ftp.linux-mips.org/pub/scm/upstream-linus
authorLinus Torvalds <torvalds@woody.osdl.org>
Thu, 7 Dec 2006 00:17:37 +0000 (16:17 -0800)
committerLinus Torvalds <torvalds@woody.osdl.org>
Thu, 7 Dec 2006 00:17:37 +0000 (16:17 -0800)
* 'upstream' of git://ftp.linux-mips.org/pub/scm/upstream-linus:
  [MIPS] Import updates from i386's i8259.c
  [MIPS] *-berr: Header inclusions for DEC bus error handlers
  [MIPS] Compile __do_IRQ() when really needed
  [MIPS] genirq: use name instead of typename
  [MIPS] Do not use handle_level_irq for ioasic_dma_irq_type.
  [MIPS] pte_offset(dir,addr): parenthesis fix

527 files changed:
arch/arm/common/sharpsl_pm.c
arch/arm/mach-omap1/board-h3.c
arch/arm/mach-omap1/board-nokia770.c
arch/arm/mach-omap1/leds-osk.c
arch/arm/mach-omap2/board-h4.c
arch/arm/mach-pxa/akita-ioexp.c
arch/i386/kernel/cpu/mcheck/non-fatal.c
arch/i386/kernel/smpboot.c
arch/i386/kernel/tsc.c
arch/ia64/hp/sim/simserial.c
arch/ia64/kernel/mca.c
arch/ia64/kernel/smpboot.c
arch/ia64/pci/pci.c
arch/m68knommu/platform/5307/timers.c
arch/m68knommu/platform/68360/config.c
arch/mips/kernel/kspd.c
arch/powerpc/platforms/embedded6xx/ls_uart.c
arch/powerpc/platforms/powermac/backlight.c
arch/powerpc/platforms/pseries/eeh_event.c
arch/ppc/8260_io/fcc_enet.c
arch/ppc/8xx_io/fec.c
arch/s390/appldata/appldata_base.c
arch/sh/Kconfig
arch/sh/Kconfig.debug
arch/sh/Makefile
arch/sh/boards/renesas/r7780rp/Makefile
arch/sh/boards/renesas/r7780rp/irq.c
arch/sh/boards/renesas/r7780rp/psw.c [new file with mode: 0644]
arch/sh/boards/renesas/r7780rp/setup.c
arch/sh/boards/se/7206/Makefile [new file with mode: 0644]
arch/sh/boards/se/7206/io.c [new file with mode: 0644]
arch/sh/boards/se/7206/irq.c [new file with mode: 0644]
arch/sh/boards/se/7206/led.c [new file with mode: 0644]
arch/sh/boards/se/7206/setup.c [new file with mode: 0644]
arch/sh/boards/se/7619/Makefile [new file with mode: 0644]
arch/sh/boards/se/7619/io.c [new file with mode: 0644]
arch/sh/boards/se/7619/setup.c [new file with mode: 0644]
arch/sh/boards/titan/setup.c
arch/sh/boot/compressed/misc.c
arch/sh/configs/r7780rp_defconfig
arch/sh/configs/se7206_defconfig [new file with mode: 0644]
arch/sh/drivers/Kconfig [new file with mode: 0644]
arch/sh/drivers/Makefile
arch/sh/drivers/dma/Makefile
arch/sh/drivers/dma/dma-api.c
arch/sh/drivers/dma/dma-sh.c
arch/sh/drivers/dma/dma-sysfs.c
arch/sh/drivers/pci/ops-titan.c
arch/sh/drivers/pci/pci-sh7780.c
arch/sh/drivers/push-switch.c [new file with mode: 0644]
arch/sh/kernel/Makefile
arch/sh/kernel/cpu/Makefile
arch/sh/kernel/cpu/clock.c
arch/sh/kernel/cpu/init.c
arch/sh/kernel/cpu/irq/Makefile
arch/sh/kernel/cpu/irq/imask.c
arch/sh/kernel/cpu/irq/intc2.c
arch/sh/kernel/cpu/irq/ipr.c
arch/sh/kernel/cpu/sh2/Makefile
arch/sh/kernel/cpu/sh2/clock-sh7619.c [new file with mode: 0644]
arch/sh/kernel/cpu/sh2/entry.S [new file with mode: 0644]
arch/sh/kernel/cpu/sh2/ex.S [new file with mode: 0644]
arch/sh/kernel/cpu/sh2/probe.c
arch/sh/kernel/cpu/sh2/setup-sh7619.c [new file with mode: 0644]
arch/sh/kernel/cpu/sh2a/Makefile [new file with mode: 0644]
arch/sh/kernel/cpu/sh2a/clock-sh7206.c [new file with mode: 0644]
arch/sh/kernel/cpu/sh2a/probe.c [new file with mode: 0644]
arch/sh/kernel/cpu/sh2a/setup-sh7206.c [new file with mode: 0644]
arch/sh/kernel/cpu/sh3/Makefile
arch/sh/kernel/cpu/sh3/clock-sh7709.c
arch/sh/kernel/cpu/sh3/entry.S [moved from arch/sh/kernel/entry.S with 58% similarity]
arch/sh/kernel/cpu/sh4/Makefile
arch/sh/kernel/cpu/sh4/clock-sh4-202.c
arch/sh/kernel/cpu/sh4/clock-sh7780.c
arch/sh/kernel/cpu/sh4/fpu.c
arch/sh/kernel/cpu/sh4/probe.c
arch/sh/kernel/cpu/sh4/setup-sh7750.c
arch/sh/kernel/cpu/sh4/setup-sh7780.c
arch/sh/kernel/cpu/sh4/sq.c
arch/sh/kernel/early_printk.c
arch/sh/kernel/entry-common.S [new file with mode: 0644]
arch/sh/kernel/head.S
arch/sh/kernel/irq.c
arch/sh/kernel/process.c
arch/sh/kernel/relocate_kernel.S
arch/sh/kernel/setup.c
arch/sh/kernel/sh_ksyms.c
arch/sh/kernel/signal.c
arch/sh/kernel/stacktrace.c [new file with mode: 0644]
arch/sh/kernel/sys_sh.c
arch/sh/kernel/time.c
arch/sh/kernel/timers/Makefile
arch/sh/kernel/timers/timer-cmt.c [new file with mode: 0644]
arch/sh/kernel/timers/timer-mtu2.c [new file with mode: 0644]
arch/sh/kernel/timers/timer-tmu.c
arch/sh/kernel/timers/timer.c
arch/sh/kernel/traps.c
arch/sh/mm/Kconfig
arch/sh/mm/cache-sh2.c
arch/sh/mm/cache-sh4.c
arch/sh/mm/clear_page.S
arch/sh/mm/copy_page.S
arch/sh/mm/fault.c
arch/sh/mm/init.c
arch/sh/mm/ioremap.c
arch/sh/mm/pg-dma.c
arch/sh/mm/pg-sh4.c
arch/sh/tools/mach-types
arch/um/drivers/chan_kern.c
arch/um/drivers/mconsole_kern.c
arch/um/drivers/net_kern.c
arch/um/drivers/port_kern.c
arch/x86_64/kernel/mce.c
arch/x86_64/kernel/smpboot.c
arch/x86_64/kernel/time.c
block/as-iosched.c
block/cfq-iosched.c
block/ll_rw_blk.c
crypto/cryptomgr.c
drivers/acpi/osl.c
drivers/ata/libata-core.c
drivers/ata/libata-eh.c
drivers/ata/libata-scsi.c
drivers/ata/libata.h
drivers/atm/idt77252.c
drivers/block/aoe/aoe.h
drivers/block/aoe/aoecmd.c
drivers/block/aoe/aoedev.c
drivers/block/floppy.c
drivers/block/paride/pd.c
drivers/block/paride/pseudo.h
drivers/block/sx8.c
drivers/block/ub.c
drivers/bluetooth/bcm203x.c
drivers/char/cyclades.c
drivers/char/drm/via_dmablit.c
drivers/char/epca.c
drivers/char/esp.c
drivers/char/genrtc.c
drivers/char/hvsi.c
drivers/char/ip2/i2lib.c
drivers/char/ip2/ip2main.c
drivers/char/isicom.c
drivers/char/istallion.c
drivers/char/moxa.c
drivers/char/mxser.c
drivers/char/pcmcia/synclink_cs.c
drivers/char/random.c
drivers/char/riscom8.c
drivers/char/serial167.c
drivers/char/sonypi.c
drivers/char/specialix.c
drivers/char/stallion.c
drivers/char/synclink.c
drivers/char/synclink_gt.c
drivers/char/synclinkmp.c
drivers/char/sysrq.c
drivers/char/tpm/tpm.c
drivers/char/tty_io.c
drivers/char/vt.c
drivers/connector/cn_queue.c
drivers/connector/connector.c
drivers/cpufreq/cpufreq.c
drivers/cpufreq/cpufreq_conservative.c
drivers/cpufreq/cpufreq_ondemand.c
drivers/i2c/chips/ds1374.c
drivers/i2c/chips/m41t00.c
drivers/ieee1394/hosts.c
drivers/ieee1394/hosts.h
drivers/ieee1394/sbp2.c
drivers/ieee1394/sbp2.h
drivers/infiniband/core/addr.c
drivers/infiniband/core/cache.c
drivers/infiniband/core/cm.c
drivers/infiniband/core/cma.c
drivers/infiniband/core/iwcm.c
drivers/infiniband/core/mad.c
drivers/infiniband/core/mad_priv.h
drivers/infiniband/core/mad_rmpp.c
drivers/infiniband/core/sa_query.c
drivers/infiniband/core/uverbs_mem.c
drivers/infiniband/hw/ipath/ipath_user_pages.c
drivers/infiniband/hw/mthca/mthca_catas.c
drivers/infiniband/ulp/ipoib/ipoib.h
drivers/infiniband/ulp/ipoib/ipoib_ib.c
drivers/infiniband/ulp/ipoib/ipoib_main.c
drivers/infiniband/ulp/ipoib/ipoib_multicast.c
drivers/infiniband/ulp/iser/iser_verbs.c
drivers/infiniband/ulp/srp/ib_srp.c
drivers/input/keyboard/atkbd.c
drivers/input/keyboard/lkkbd.c
drivers/input/keyboard/sunkbd.c
drivers/input/mouse/psmouse-base.c
drivers/input/serio/libps2.c
drivers/isdn/act2000/capi.c
drivers/isdn/act2000/capi.h
drivers/isdn/act2000/module.c
drivers/isdn/capi/kcapi.c
drivers/isdn/hisax/amd7930_fn.c
drivers/isdn/hisax/config.c
drivers/isdn/hisax/hfc4s8s_l1.c
drivers/isdn/hisax/hfc_2bds0.c
drivers/isdn/hisax/hfc_pci.c
drivers/isdn/hisax/hfc_sx.c
drivers/isdn/hisax/icc.c
drivers/isdn/hisax/isac.c
drivers/isdn/hisax/isar.c
drivers/isdn/hisax/isdnl1.c
drivers/isdn/hisax/w6692.c
drivers/isdn/hysdn/boardergo.c
drivers/isdn/i4l/isdn_net.c
drivers/isdn/pcbit/drv.c
drivers/isdn/pcbit/layer2.c
drivers/isdn/pcbit/pcbit.h
drivers/macintosh/adb.c
drivers/macintosh/rack-meter.c
drivers/macintosh/smu.c
drivers/md/dm-crypt.c
drivers/md/dm-mpath.c
drivers/md/dm-raid1.c
drivers/md/dm-snap.c
drivers/md/kcopyd.c
drivers/media/dvb/b2c2/flexcop-pci.c
drivers/media/dvb/cinergyT2/cinergyT2.c
drivers/media/dvb/dvb-core/dvb_net.c
drivers/media/dvb/dvb-usb/dvb-usb-remote.c
drivers/media/dvb/dvb-usb/dvb-usb.h
drivers/media/video/cpia_pp.c
drivers/media/video/cx88/cx88-input.c
drivers/media/video/ir-kbd-i2c.c
drivers/media/video/pvrusb2/pvrusb2-context.c
drivers/media/video/saa6588.c
drivers/media/video/saa7134/saa7134-empress.c
drivers/message/fusion/mptfc.c
drivers/message/fusion/mptlan.c
drivers/message/fusion/mptsas.c
drivers/message/fusion/mptspi.c
drivers/message/i2o/driver.c
drivers/message/i2o/exec-osm.c
drivers/message/i2o/i2o_block.c
drivers/message/i2o/i2o_block.h
drivers/misc/tifm_7xx1.c
drivers/mmc/mmc.c
drivers/mmc/mmc.h
drivers/mmc/mmc_sysfs.c
drivers/mmc/tifm_sd.c
drivers/net/8139too.c
drivers/net/bnx2.c
drivers/net/cassini.c
drivers/net/chelsio/common.h
drivers/net/chelsio/cphy.h
drivers/net/chelsio/cxgb2.c
drivers/net/chelsio/my3126.c
drivers/net/e100.c
drivers/net/e1000/e1000_main.c
drivers/net/ehea/ehea_main.c
drivers/net/hamradio/baycom_epp.c
drivers/net/hamradio/dmascc.c
drivers/net/irda/mcs7780.c
drivers/net/irda/sir-dev.h
drivers/net/irda/sir_dev.c
drivers/net/iseries_veth.c
drivers/net/ixgb/ixgb_main.c
drivers/net/mv643xx_eth.c
drivers/net/myri10ge/myri10ge.c
drivers/net/netxen/netxen_nic.h
drivers/net/netxen/netxen_nic_init.c
drivers/net/netxen/netxen_nic_main.c
drivers/net/ns83820.c
drivers/net/pcmcia/xirc2ps_cs.c
drivers/net/phy/phy.c
drivers/net/plip.c
drivers/net/qla3xxx.c
drivers/net/qla3xxx.h
drivers/net/r8169.c
drivers/net/s2io.c
drivers/net/s2io.h
drivers/net/sis190.c
drivers/net/skge.c
drivers/net/skge.h
drivers/net/smc91x.c
drivers/net/spider_net.c
drivers/net/sungem.c
drivers/net/tg3.c
drivers/net/tlan.c
drivers/net/tlan.h
drivers/net/tulip/21142.c
drivers/net/tulip/timer.c
drivers/net/tulip/tulip.h
drivers/net/tulip/tulip_core.c
drivers/net/wan/pc300_tty.c
drivers/net/wireless/bcm43xx/bcm43xx.h
drivers/net/wireless/bcm43xx/bcm43xx_main.c
drivers/net/wireless/hostap/hostap.h
drivers/net/wireless/hostap/hostap_ap.c
drivers/net/wireless/hostap/hostap_hw.c
drivers/net/wireless/hostap/hostap_info.c
drivers/net/wireless/hostap/hostap_main.c
drivers/net/wireless/ipw2100.c
drivers/net/wireless/ipw2100.h
drivers/net/wireless/ipw2200.c
drivers/net/wireless/ipw2200.h
drivers/net/wireless/orinoco.c
drivers/net/wireless/prism54/isl_ioctl.c
drivers/net/wireless/prism54/isl_ioctl.h
drivers/net/wireless/prism54/islpci_dev.c
drivers/net/wireless/prism54/islpci_eth.c
drivers/net/wireless/prism54/islpci_eth.h
drivers/net/wireless/prism54/islpci_mgt.c
drivers/net/wireless/zd1211rw/zd_mac.c
drivers/net/wireless/zd1211rw/zd_mac.h
drivers/oprofile/cpu_buffer.c
drivers/oprofile/cpu_buffer.h
drivers/pci/hotplug/shpchp.h
drivers/pci/hotplug/shpchp_core.c
drivers/pci/hotplug/shpchp_ctrl.c
drivers/pci/pcie/aer/aerdrv.c
drivers/pci/pcie/aer/aerdrv.h
drivers/pci/pcie/aer/aerdrv_core.c
drivers/pcmcia/ds.c
drivers/rtc/rtc-dev.c
drivers/s390/block/dasd.c
drivers/s390/cio/css.c
drivers/s390/crypto/ap_bus.c
drivers/s390/net/lcs.c
drivers/s390/net/qeth_main.c
drivers/scsi/NCR5380.c
drivers/scsi/NCR5380.h
drivers/scsi/aha152x.c
drivers/scsi/aic94xx/aic94xx_scb.c
drivers/scsi/ibmvscsi/ibmvstgt.c
drivers/scsi/imm.c
drivers/scsi/ipr.c
drivers/scsi/libiscsi.c
drivers/scsi/libsas/sas_discover.c
drivers/scsi/libsas/sas_event.c
drivers/scsi/libsas/sas_init.c
drivers/scsi/libsas/sas_internal.h
drivers/scsi/libsas/sas_phy.c
drivers/scsi/libsas/sas_port.c
drivers/scsi/libsas/sas_scsi_host.c
drivers/scsi/oktagon_esp.c
drivers/scsi/ppa.c
drivers/scsi/qla4xxx/ql4_os.c
drivers/scsi/scsi_scan.c
drivers/scsi/scsi_sysfs.c
drivers/scsi/scsi_tgt_lib.c
drivers/scsi/scsi_transport_fc.c
drivers/scsi/scsi_transport_iscsi.c
drivers/scsi/scsi_transport_spi.c
drivers/serial/mcfserial.c
drivers/serial/sh-sci.c
drivers/serial/sh-sci.h
drivers/spi/pxa2xx_spi.c
drivers/spi/spi_bitbang.c
drivers/usb/atm/cxacru.c
drivers/usb/atm/speedtch.c
drivers/usb/atm/ueagle-atm.c
drivers/usb/class/cdc-acm.c
drivers/usb/core/hub.c
drivers/usb/core/message.c
drivers/usb/core/usb.c
drivers/usb/gadget/ether.c
drivers/usb/host/u132-hcd.c
drivers/usb/input/hid-core.c
drivers/usb/misc/appledisplay.c
drivers/usb/misc/ftdi-elan.c
drivers/usb/misc/phidgetkit.c
drivers/usb/misc/phidgetmotorcontrol.c
drivers/usb/net/kaweth.c
drivers/usb/net/pegasus.c
drivers/usb/net/pegasus.h
drivers/usb/net/usbnet.c
drivers/usb/serial/aircable.c
drivers/usb/serial/digi_acceleport.c
drivers/usb/serial/ftdi_sio.c
drivers/usb/serial/keyspan_pda.c
drivers/usb/serial/usb-serial.c
drivers/usb/serial/whiteheat.c
drivers/video/console/fbcon.c
drivers/video/pxafb.c
fs/9p/mux.c
fs/aio.c
fs/bio.c
fs/file.c
fs/gfs2/glock.c
fs/ncpfs/inode.c
fs/ncpfs/sock.c
fs/nfs/client.c
fs/nfs/namespace.c
fs/nfs/nfs4_fs.h
fs/nfs/nfs4renewd.c
fs/nfsd/nfs4state.c
fs/ocfs2/alloc.c
fs/ocfs2/cluster/heartbeat.c
fs/ocfs2/cluster/quorum.c
fs/ocfs2/cluster/tcp.c
fs/ocfs2/cluster/tcp_internal.h
fs/ocfs2/dlm/dlmcommon.h
fs/ocfs2/dlm/dlmdomain.c
fs/ocfs2/dlm/dlmrecovery.c
fs/ocfs2/dlm/userdlm.c
fs/ocfs2/journal.c
fs/ocfs2/journal.h
fs/ocfs2/ocfs2.h
fs/ocfs2/super.c
fs/reiserfs/journal.c
fs/xfs/linux-2.6/xfs_aops.c
fs/xfs/linux-2.6/xfs_buf.c
include/asm-arm/arch-omap/irda.h
include/asm-i386/atomic.h
include/asm-i386/spinlock_types.h
include/asm-m68knommu/irq.h
include/asm-m68knommu/rtc.h [new file with mode: 0644]
include/asm-m68knommu/ucontext.h
include/asm-sh/atomic.h
include/asm-sh/bugs.h
include/asm-sh/clock.h
include/asm-sh/cpu-sh2/cache.h
include/asm-sh/cpu-sh2/freq.h [new file with mode: 0644]
include/asm-sh/cpu-sh2/mmu_context.h [new file with mode: 0644]
include/asm-sh/cpu-sh2/timer.h [new file with mode: 0644]
include/asm-sh/cpu-sh2a/addrspace.h [new file with mode: 0644]
include/asm-sh/cpu-sh2a/cache.h [new file with mode: 0644]
include/asm-sh/cpu-sh2a/cacheflush.h [new file with mode: 0644]
include/asm-sh/cpu-sh2a/dma.h [new file with mode: 0644]
include/asm-sh/cpu-sh2a/freq.h [new file with mode: 0644]
include/asm-sh/cpu-sh2a/mmu_context.h [new file with mode: 0644]
include/asm-sh/cpu-sh2a/timer.h [new file with mode: 0644]
include/asm-sh/cpu-sh2a/ubc.h [new file with mode: 0644]
include/asm-sh/cpu-sh2a/watchdog.h [new file with mode: 0644]
include/asm-sh/dma.h
include/asm-sh/elf.h
include/asm-sh/entry-macros.S [new file with mode: 0644]
include/asm-sh/irq-sh73180.h [deleted file]
include/asm-sh/irq-sh7343.h [deleted file]
include/asm-sh/irq-sh7780.h [deleted file]
include/asm-sh/irq.h
include/asm-sh/irqflags.h [new file with mode: 0644]
include/asm-sh/mmu_context.h
include/asm-sh/page.h
include/asm-sh/pgalloc.h
include/asm-sh/pgtable-2level.h [deleted file]
include/asm-sh/pgtable.h
include/asm-sh/processor.h
include/asm-sh/push-switch.h [new file with mode: 0644]
include/asm-sh/rwsem.h
include/asm-sh/se7206.h [new file with mode: 0644]
include/asm-sh/system.h
include/asm-sh/thread_info.h
include/asm-sh/timer.h
include/asm-sh/titan.h
include/asm-sh/unistd.h
include/asm-x86_64/atomic.h
include/asm-x86_64/spinlock_types.h
include/linux/aio.h
include/linux/connector.h
include/linux/i2o.h
include/linux/kbd_kern.h
include/linux/libata.h
include/linux/mmc/host.h
include/linux/ncp_fs_sb.h
include/linux/netpoll.h
include/linux/nfs_fs_sb.h
include/linux/reiserfs_fs_sb.h
include/linux/relay.h
include/linux/sunrpc/rpc_pipe_fs.h
include/linux/sunrpc/xprt.h
include/linux/tty.h
include/linux/usb.h
include/linux/workqueue.h
include/net/ieee80211softmac.h
include/net/inet_timewait_sock.h
include/net/sctp/structs.h
include/scsi/libsas.h
include/scsi/scsi_transport_fc.h
include/scsi/scsi_transport_iscsi.h
include/sound/ac97_codec.h
include/sound/ak4114.h
ipc/util.c
kernel/kmod.c
kernel/kthread.c
kernel/power/poweroff.c
kernel/relay.c
kernel/sys.c
kernel/workqueue.c
mm/nommu.c
mm/slab.c
mm/swap.c
net/atm/lec.c
net/atm/lec.h
net/bluetooth/hci_sysfs.c
net/bridge/br_if.c
net/bridge/br_private.h
net/core/link_watch.c
net/core/netpoll.c
net/dccp/minisocks.c
net/ieee80211/softmac/ieee80211softmac_assoc.c
net/ieee80211/softmac/ieee80211softmac_auth.c
net/ieee80211/softmac/ieee80211softmac_event.c
net/ieee80211/softmac/ieee80211softmac_module.c
net/ieee80211/softmac/ieee80211softmac_priv.h
net/ieee80211/softmac/ieee80211softmac_scan.c
net/ieee80211/softmac/ieee80211softmac_wx.c
net/ipv4/inet_timewait_sock.c
net/ipv4/ipvs/ip_vs_ctl.c
net/ipv4/tcp_minisocks.c
net/irda/ircomm/ircomm_tty.c
net/sctp/associola.c
net/sctp/endpointola.c
net/sctp/inqueue.c
net/sunrpc/cache.c
net/sunrpc/rpc_pipe.c
net/sunrpc/sched.c
net/sunrpc/xprt.c
net/sunrpc/xprtsock.c
net/xfrm/xfrm_policy.c
net/xfrm/xfrm_state.c
security/keys/key.c
sound/aoa/aoa-gpio.h
sound/aoa/core/snd-aoa-gpio-feature.c
sound/aoa/core/snd-aoa-gpio-pmf.c
sound/i2c/other/ak4114.c
sound/pci/ac97/ac97_codec.c
sound/pci/hda/hda_codec.c
sound/pci/hda/hda_local.h
sound/ppc/tumbler.c

index 605dedf967907cf3f360f194e467ff5b0b5b7375..b3599743093ba8f5ece1bc6a3753ee4eb70ee852 100644 (file)
@@ -60,16 +60,16 @@ static int sharpsl_ac_check(void);
 static int sharpsl_fatal_check(void);
 static int sharpsl_average_value(int ad);
 static void sharpsl_average_clear(void);
-static void sharpsl_charge_toggle(void *private_);
-static void sharpsl_battery_thread(void *private_);
+static void sharpsl_charge_toggle(struct work_struct *private_);
+static void sharpsl_battery_thread(struct work_struct *private_);
 
 
 /*
  * Variables
  */
 struct sharpsl_pm_status sharpsl_pm;
-DECLARE_WORK(toggle_charger, sharpsl_charge_toggle, NULL);
-DECLARE_WORK(sharpsl_bat, sharpsl_battery_thread, NULL);
+DECLARE_DELAYED_WORK(toggle_charger, sharpsl_charge_toggle);
+DECLARE_DELAYED_WORK(sharpsl_bat, sharpsl_battery_thread);
 DEFINE_LED_TRIGGER(sharpsl_charge_led_trigger);
 
 
@@ -116,7 +116,7 @@ void sharpsl_battery_kick(void)
 EXPORT_SYMBOL(sharpsl_battery_kick);
 
 
-static void sharpsl_battery_thread(void *private_)
+static void sharpsl_battery_thread(struct work_struct *private_)
 {
        int voltage, percent, apm_status, i = 0;
 
@@ -128,7 +128,7 @@ static void sharpsl_battery_thread(void *private_)
        /* Corgi cannot confirm when battery fully charged so periodically kick! */
        if (!sharpsl_pm.machinfo->batfull_irq && (sharpsl_pm.charge_mode == CHRG_ON)
                        && time_after(jiffies, sharpsl_pm.charge_start_time +  SHARPSL_CHARGE_ON_TIME_INTERVAL))
-               schedule_work(&toggle_charger);
+               schedule_delayed_work(&toggle_charger, 0);
 
        while(1) {
                voltage = sharpsl_pm.machinfo->read_devdata(SHARPSL_BATT_VOLT);
@@ -212,7 +212,7 @@ static void sharpsl_charge_off(void)
        sharpsl_pm_led(SHARPSL_LED_OFF);
        sharpsl_pm.charge_mode = CHRG_OFF;
 
-       schedule_work(&sharpsl_bat);
+       schedule_delayed_work(&sharpsl_bat, 0);
 }
 
 static void sharpsl_charge_error(void)
@@ -222,7 +222,7 @@ static void sharpsl_charge_error(void)
        sharpsl_pm.charge_mode = CHRG_ERROR;
 }
 
-static void sharpsl_charge_toggle(void *private_)
+static void sharpsl_charge_toggle(struct work_struct *private_)
 {
        dev_dbg(sharpsl_pm.dev, "Toogling Charger at time: %lx\n", jiffies);
 
@@ -254,7 +254,7 @@ static void sharpsl_ac_timer(unsigned long data)
        else if (sharpsl_pm.charge_mode == CHRG_ON)
                sharpsl_charge_off();
 
-       schedule_work(&sharpsl_bat);
+       schedule_delayed_work(&sharpsl_bat, 0);
 }
 
 
@@ -279,10 +279,10 @@ static void sharpsl_chrg_full_timer(unsigned long data)
                        sharpsl_charge_off();
        } else if (sharpsl_pm.full_count < 2) {
                dev_dbg(sharpsl_pm.dev, "Charge Full: Count too low\n");
-               schedule_work(&toggle_charger);
+               schedule_delayed_work(&toggle_charger, 0);
        } else if (time_after(jiffies, sharpsl_pm.charge_start_time + SHARPSL_CHARGE_FINISH_TIME)) {
                dev_dbg(sharpsl_pm.dev, "Charge Full: Interrupt generated too slowly - retry.\n");
-               schedule_work(&toggle_charger);
+               schedule_delayed_work(&toggle_charger, 0);
        } else {
                sharpsl_charge_off();
                sharpsl_pm.charge_mode = CHRG_DONE;
index f225a083dee1bb13073127a6cc05c6a21e199cfa..9d2346fb68f41da85c51dd0211a6e826121c0b33 100644 (file)
@@ -323,7 +323,8 @@ static int h3_transceiver_mode(struct device *dev, int mode)
 
        cancel_delayed_work(&irda_config->gpio_expa);
        PREPARE_WORK(&irda_config->gpio_expa, set_trans_mode, &mode);
-       schedule_work(&irda_config->gpio_expa);
+#error this is not permitted - mode is an argument variable
+       schedule_delayed_work(&irda_config->gpio_expa, 0);
 
        return 0;
 }
index dbc555d209ff914eeff8b0b51d77d814212e430b..cbe909bad79b3fde3e1b064b69bdb78e081b56f1 100644 (file)
@@ -74,7 +74,7 @@ static struct omap_kp_platform_data nokia770_kp_data = {
        .rows           = 8,
        .cols           = 8,
        .keymap         = nokia770_keymap,
-       .keymapsize     = ARRAY_SIZE(nokia770_keymap)
+       .keymapsize     = ARRAY_SIZE(nokia770_keymap),
        .delay          = 4,
 };
 
@@ -191,7 +191,7 @@ static void nokia770_audio_pwr_up(void)
                printk("HP connected\n");
 }
 
-static void codec_delayed_power_down(void *arg)
+static void codec_delayed_power_down(struct work_struct *work)
 {
        down(&audio_pwr_sem);
        if (audio_pwr_state == -1)
@@ -200,7 +200,7 @@ static void codec_delayed_power_down(void *arg)
        up(&audio_pwr_sem);
 }
 
-static DECLARE_WORK(codec_power_down_work, codec_delayed_power_down, NULL);
+static DECLARE_DELAYED_WORK(codec_power_down_work, codec_delayed_power_down);
 
 static void nokia770_audio_pwr_down(void)
 {
index 3b29e59b0e6f47d3da318ae426483ab304a42518..0cbf1b0071f8737057205590952a77be2296763c 100644 (file)
@@ -35,7 +35,7 @@ static u8 hw_led_state;
 
 static u8 tps_leds_change;
 
-static void tps_work(void *unused)
+static void tps_work(struct work_struct *unused)
 {
        for (;;) {
                u8      leds;
@@ -61,7 +61,7 @@ static void tps_work(void *unused)
        }
 }
 
-static DECLARE_WORK(work, tps_work, NULL);
+static DECLARE_WORK(work, tps_work);
 
 #ifdef CONFIG_OMAP_OSK_MISTRAL
 
index 26a95a642ad7a1f4dde8227b034f22120ba554b0..3b1ad1d981a359288dc67c84c6f5416e5b1042c7 100644 (file)
@@ -206,7 +206,8 @@ static int h4_transceiver_mode(struct device *dev, int mode)
 
        cancel_delayed_work(&irda_config->gpio_expa);
        PREPARE_WORK(&irda_config->gpio_expa, set_trans_mode, &mode);
-       schedule_work(&irda_config->gpio_expa);
+#error this is not permitted - mode is an argument variable
+       schedule_delayed_work(&irda_config->gpio_expa, 0);
 
        return 0;
 }
index 1b398742ab564dc0a874ec20a7e00553feb249e9..12d2fe0ceff6c8032fc90eab06370f114146d1a6 100644 (file)
@@ -36,11 +36,11 @@ I2C_CLIENT_INSMOD;
 
 static int max7310_write(struct i2c_client *client, int address, int data);
 static struct i2c_client max7310_template;
-static void akita_ioexp_work(void *private_);
+static void akita_ioexp_work(struct work_struct *private_);
 
 static struct device *akita_ioexp_device;
 static unsigned char ioexp_output_value = AKITA_IOEXP_IO_OUT;
-DECLARE_WORK(akita_ioexp, akita_ioexp_work, NULL);
+DECLARE_WORK(akita_ioexp, akita_ioexp_work);
 
 
 /*
@@ -158,7 +158,7 @@ void akita_reset_ioexp(struct device *dev, unsigned char bit)
 EXPORT_SYMBOL(akita_set_ioexp);
 EXPORT_SYMBOL(akita_reset_ioexp);
 
-static void akita_ioexp_work(void *private_)
+static void akita_ioexp_work(struct work_struct *private_)
 {
        if (akita_ioexp_device)
                max7310_set_ouputs(akita_ioexp_device, ioexp_output_value);
index 1f9153ae5b03729c799e792f7bef3a508d49cccd..6b5d3518a1c09b3532871fc337419b9477dcbc0c 100644 (file)
@@ -51,10 +51,10 @@ static void mce_checkregs (void *info)
        }
 }
 
-static void mce_work_fn(void *data);
-static DECLARE_WORK(mce_work, mce_work_fn, NULL);
+static void mce_work_fn(struct work_struct *work);
+static DECLARE_DELAYED_WORK(mce_work, mce_work_fn);
 
-static void mce_work_fn(void *data)
+static void mce_work_fn(struct work_struct *work)
 { 
        on_each_cpu(mce_checkregs, NULL, 1, 1);
        schedule_delayed_work(&mce_work, MCE_RATE);
index 4bb8b77cd65b257b4b54a730f5c5e3cf46595f4a..02a9b66b6ac38ae95aa199e8d91e7576d10daeba 100644 (file)
@@ -1049,13 +1049,15 @@ void cpu_exit_clear(void)
 
 struct warm_boot_cpu_info {
        struct completion *complete;
+       struct work_struct task;
        int apicid;
        int cpu;
 };
 
-static void __cpuinit do_warm_boot_cpu(void *p)
+static void __cpuinit do_warm_boot_cpu(struct work_struct *work)
 {
-       struct warm_boot_cpu_info *info = p;
+       struct warm_boot_cpu_info *info =
+               container_of(work, struct warm_boot_cpu_info, task);
        do_boot_cpu(info->apicid, info->cpu);
        complete(info->complete);
 }
@@ -1064,7 +1066,6 @@ static int __cpuinit __smp_prepare_cpu(int cpu)
 {
        DECLARE_COMPLETION_ONSTACK(done);
        struct warm_boot_cpu_info info;
-       struct work_struct task;
        int     apicid, ret;
        struct Xgt_desc_struct *cpu_gdt_descr = &per_cpu(cpu_gdt_descr, cpu);
 
@@ -1089,7 +1090,7 @@ static int __cpuinit __smp_prepare_cpu(int cpu)
        info.complete = &done;
        info.apicid = apicid;
        info.cpu = cpu;
-       INIT_WORK(&task, do_warm_boot_cpu, &info);
+       INIT_WORK(&info.task, do_warm_boot_cpu);
 
        tsc_sync_disabled = 1;
 
@@ -1097,7 +1098,7 @@ static int __cpuinit __smp_prepare_cpu(int cpu)
        clone_pgd_range(swapper_pg_dir, swapper_pg_dir + USER_PGD_PTRS,
                        KERNEL_PGD_PTRS);
        flush_tlb_all();
-       schedule_work(&task);
+       schedule_work(&info.task);
        wait_for_completion(&done);
 
        tsc_sync_disabled = 0;
index fbc95828cd7493082aeeedc0396a762db056097b..9810c8c9075060bb5bb54d2c4e6657214ccb44a9 100644 (file)
@@ -217,7 +217,7 @@ static unsigned int cpufreq_delayed_issched = 0;
 static unsigned int cpufreq_init = 0;
 static struct work_struct cpufreq_delayed_get_work;
 
-static void handle_cpufreq_delayed_get(void *v)
+static void handle_cpufreq_delayed_get(struct work_struct *work)
 {
        unsigned int cpu;
 
@@ -306,7 +306,7 @@ static int __init cpufreq_tsc(void)
 {
        int ret;
 
-       INIT_WORK(&cpufreq_delayed_get_work, handle_cpufreq_delayed_get, NULL);
+       INIT_WORK(&cpufreq_delayed_get_work, handle_cpufreq_delayed_get);
        ret = cpufreq_register_notifier(&time_cpufreq_notifier_block,
                                        CPUFREQ_TRANSITION_NOTIFIER);
        if (!ret)
index caab986af70c0ef7efa7a881a7b73c43c2254261..b62f0c4d2c7cb6909b03f8d9d3143bd7bec32a32 100644 (file)
@@ -209,7 +209,7 @@ static void do_serial_bh(void)
 }
 #endif
 
-static void do_softint(void *private_)
+static void do_softint(struct work_struct *private_)
 {
        printk(KERN_ERR "simserial: do_softint called\n");
 }
@@ -698,7 +698,7 @@ static int get_async_struct(int line, struct async_struct **ret_info)
        info->flags = sstate->flags;
        info->xmit_fifo_size = sstate->xmit_fifo_size;
        info->line = line;
-       INIT_WORK(&info->work, do_softint, info);
+       INIT_WORK(&info->work, do_softint);
        info->state = sstate;
        if (sstate->info) {
                kfree(info);
index 7cfa63a98cb36adcd48ddb18d6022f94c6cf063b..6bedd97570ca97dceddbd7ab46270160e5a1f771 100644 (file)
@@ -678,7 +678,7 @@ ia64_mca_cmc_vector_enable (void *dummy)
  * disable the cmc interrupt vector.
  */
 static void
-ia64_mca_cmc_vector_disable_keventd(void *unused)
+ia64_mca_cmc_vector_disable_keventd(struct work_struct *unused)
 {
        on_each_cpu(ia64_mca_cmc_vector_disable, NULL, 1, 0);
 }
@@ -690,7 +690,7 @@ ia64_mca_cmc_vector_disable_keventd(void *unused)
  * enable the cmc interrupt vector.
  */
 static void
-ia64_mca_cmc_vector_enable_keventd(void *unused)
+ia64_mca_cmc_vector_enable_keventd(struct work_struct *unused)
 {
        on_each_cpu(ia64_mca_cmc_vector_enable, NULL, 1, 0);
 }
@@ -1247,8 +1247,8 @@ ia64_mca_handler(struct pt_regs *regs, struct switch_stack *sw,
        monarch_cpu = -1;
 }
 
-static DECLARE_WORK(cmc_disable_work, ia64_mca_cmc_vector_disable_keventd, NULL);
-static DECLARE_WORK(cmc_enable_work, ia64_mca_cmc_vector_enable_keventd, NULL);
+static DECLARE_WORK(cmc_disable_work, ia64_mca_cmc_vector_disable_keventd);
+static DECLARE_WORK(cmc_enable_work, ia64_mca_cmc_vector_enable_keventd);
 
 /*
  * ia64_mca_cmc_int_handler
index f7d7f5668144fcec8e76bcadb66c5df27aad17d9..b21ddecea943a63f51130b20fd8372322cec29e2 100644 (file)
@@ -463,15 +463,17 @@ struct pt_regs * __devinit idle_regs(struct pt_regs *regs)
 }
 
 struct create_idle {
+       struct work_struct work;
        struct task_struct *idle;
        struct completion done;
        int cpu;
 };
 
 void
-do_fork_idle(void *_c_idle)
+do_fork_idle(struct work_struct *work)
 {
-       struct create_idle *c_idle = _c_idle;
+       struct create_idle *c_idle =
+               container_of(work, struct create_idle, work);
 
        c_idle->idle = fork_idle(c_idle->cpu);
        complete(&c_idle->done);
@@ -482,10 +484,10 @@ do_boot_cpu (int sapicid, int cpu)
 {
        int timeout;
        struct create_idle c_idle = {
+               .work = __WORK_INITIALIZER(c_idle.work, do_fork_idle),
                .cpu    = cpu,
                .done   = COMPLETION_INITIALIZER(c_idle.done),
        };
-       DECLARE_WORK(work, do_fork_idle, &c_idle);
 
        c_idle.idle = get_idle_for_cpu(cpu);
        if (c_idle.idle) {
@@ -497,9 +499,9 @@ do_boot_cpu (int sapicid, int cpu)
         * We can't use kernel_thread since we must avoid to reschedule the child.
         */
        if (!keventd_up() || current_is_keventd())
-               work.func(work.data);
+               c_idle.work.func(&c_idle.work);
        else {
-               schedule_work(&work);
+               schedule_work(&c_idle.work);
                wait_for_completion(&c_idle.done);
        }
 
index f4edfbf27134e5e0c19432f750173ae1932d34f8..eb92cef9cd0de15190d303b0d076c77c480e2944 100644 (file)
@@ -564,8 +564,8 @@ pcibios_enable_device (struct pci_dev *dev, int mask)
 void
 pcibios_disable_device (struct pci_dev *dev)
 {
-       if (dev->is_enabled)
-               acpi_pci_irq_disable(dev);
+       BUG_ON(atomic_read(&dev->enable_cnt));
+       acpi_pci_irq_disable(dev);
 }
 
 void
index 24781f009337ae69a4b7e33e10b1697daf2edd50..e5668af19789ccae8e2843befd28f2749341d3ed 100644 (file)
@@ -3,7 +3,7 @@
 /*
  *     timers.c -- generic ColdFire hardware timer support.
  *
- *     Copyright (C) 1999-2003, Greg Ungerer (gerg@snapgear.com)
+ *     Copyright (C) 1999-2006, Greg Ungerer (gerg@snapgear.com)
  */
 
 /***************************************************************************/
@@ -44,6 +44,14 @@ unsigned int mcf_timerlevel = 5;
 extern void mcf_settimericr(int timer, int level);
 extern int mcf_timerirqpending(int timer);
 
+#if defined(CONFIG_M532x)
+#define        __raw_readtrr   __raw_readl
+#define        __raw_writetrr  __raw_writel
+#else
+#define        __raw_readtrr   __raw_readw
+#define        __raw_writetrr  __raw_writew
+#endif
+
 /***************************************************************************/
 
 void coldfire_tick(void)
@@ -57,7 +65,7 @@ void coldfire_tick(void)
 void coldfire_timer_init(irqreturn_t (*handler)(int, void *, struct pt_regs *))
 {
        __raw_writew(MCFTIMER_TMR_DISABLE, TA(MCFTIMER_TMR));
-       __raw_writew(((MCF_BUSCLK / 16) / HZ), TA(MCFTIMER_TRR));
+       __raw_writetrr(((MCF_BUSCLK / 16) / HZ), TA(MCFTIMER_TRR));
        __raw_writew(MCFTIMER_TMR_ENORI | MCFTIMER_TMR_CLK16 |
                MCFTIMER_TMR_RESTART | MCFTIMER_TMR_ENABLE, TA(MCFTIMER_TMR));
 
@@ -76,7 +84,7 @@ unsigned long coldfire_timer_offset(void)
        unsigned long trr, tcn, offset;
 
        tcn = __raw_readw(TA(MCFTIMER_TCN));
-       trr = __raw_readw(TA(MCFTIMER_TRR));
+       trr = __raw_readtrr(TA(MCFTIMER_TRR));
        offset = (tcn * (1000000 / HZ)) / trr;
 
        /* Check if we just wrapped the counters and maybe missed a tick */
@@ -120,7 +128,7 @@ void coldfire_profile_init(void)
        /* Set up TIMER 2 as high speed profile clock */
        __raw_writew(MCFTIMER_TMR_DISABLE, PA(MCFTIMER_TMR));
 
-       __raw_writew(((MCF_CLK / 16) / PROFILEHZ), PA(MCFTIMER_TRR));
+       __raw_writetrr(((MCF_CLK / 16) / PROFILEHZ), PA(MCFTIMER_TRR));
        __raw_writew(MCFTIMER_TMR_ENORI | MCFTIMER_TMR_CLK16 |
                MCFTIMER_TMR_RESTART | MCFTIMER_TMR_ENABLE, PA(MCFTIMER_TMR));
 
index c5482e3622eb158b76804c8d5e5a45a47df16b68..1b36f62617645358a2c8b0aadd20d7c77bbc1f6c 100644 (file)
@@ -114,7 +114,7 @@ void BSP_gettod (int *yearp, int *monp, int *dayp,
 {
 }
 
-int BSP_hwclk(int op, struct hwclk_time *t)
+int BSP_hwclk(int op, struct rtc_time *t)
 {
   if (!op) {
     /* read */
index f06a144c788118b935434321c6972facdfb06d3b..2c82412b9efe9ba885419cd80609e754b5d99400 100644 (file)
@@ -319,7 +319,7 @@ static void sp_cleanup(void)
 static int channel_open = 0;
 
 /* the work handler */
-static void sp_work(void *data)
+static void sp_work(struct work_struct *unused)
 {
        if (!channel_open) {
                if( rtlx_open(RTLX_CHANNEL_SYSIO, 1) != 0) {
@@ -354,7 +354,7 @@ static void startwork(int vpe)
                        return;
                }
 
-               INIT_WORK(&work, sp_work, NULL);
+               INIT_WORK(&work, sp_work);
                queue_work(workqueue, &work);
        } else
                queue_work(workqueue, &work);
index 31bcdae84823af51a3964c7642ef760130d1066d..0e837762cc5bf5b60b7a047fe62ac9b2c51d2a05 100644 (file)
@@ -14,7 +14,7 @@ static unsigned long avr_clock;
 
 static struct work_struct wd_work;
 
-static void wd_stop(void *unused)
+static void wd_stop(struct work_struct *unused)
 {
        const char string[] = "AAAAFFFFJJJJ>>>>VVVV>>>>ZZZZVVVVKKKK";
        int i = 0, rescue = 8;
@@ -122,7 +122,7 @@ static int __init ls_uarts_init(void)
 
        ls_uart_init();
 
-       INIT_WORK(&wd_work, wd_stop, NULL);
+       INIT_WORK(&wd_work, wd_stop);
        schedule_work(&wd_work);
 
        return 0;
index afa593a8544a82a82b09922d4f2c6795939b6b6f..c3a89414ddc099d1baf91fe28234fe87b75b02b5 100644 (file)
 
 #define OLD_BACKLIGHT_MAX 15
 
-static void pmac_backlight_key_worker(void *data);
-static void pmac_backlight_set_legacy_worker(void *data);
+static void pmac_backlight_key_worker(struct work_struct *work);
+static void pmac_backlight_set_legacy_worker(struct work_struct *work);
 
-static DECLARE_WORK(pmac_backlight_key_work, pmac_backlight_key_worker, NULL);
-static DECLARE_WORK(pmac_backlight_set_legacy_work, pmac_backlight_set_legacy_worker, NULL);
+static DECLARE_WORK(pmac_backlight_key_work, pmac_backlight_key_worker);
+static DECLARE_WORK(pmac_backlight_set_legacy_work, pmac_backlight_set_legacy_worker);
 
 /* Although these variables are used in interrupt context, it makes no sense to
  * protect them. No user is able to produce enough key events per second and
@@ -94,7 +94,7 @@ int pmac_backlight_curve_lookup(struct fb_info *info, int value)
        return level;
 }
 
-static void pmac_backlight_key_worker(void *data)
+static void pmac_backlight_key_worker(struct work_struct *work)
 {
        if (atomic_read(&kernel_backlight_disabled))
                return;
@@ -166,7 +166,7 @@ static int __pmac_backlight_set_legacy_brightness(int brightness)
        return error;
 }
 
-static void pmac_backlight_set_legacy_worker(void *data)
+static void pmac_backlight_set_legacy_worker(struct work_struct *work)
 {
        if (atomic_read(&kernel_backlight_disabled))
                return;
index 137077451316b7f83f8e88f1a0aebc026a4b3092..49037edf7d3999545c9190d2d7fd0e0594330f49 100644 (file)
@@ -37,8 +37,8 @@
 /* EEH event workqueue setup. */
 static DEFINE_SPINLOCK(eeh_eventlist_lock);
 LIST_HEAD(eeh_eventlist);
-static void eeh_thread_launcher(void *);
-DECLARE_WORK(eeh_event_wq, eeh_thread_launcher, NULL);
+static void eeh_thread_launcher(struct work_struct *);
+DECLARE_WORK(eeh_event_wq, eeh_thread_launcher);
 
 /* Serialize reset sequences for a given pci device */
 DEFINE_MUTEX(eeh_event_mutex);
@@ -103,7 +103,7 @@ static int eeh_event_handler(void * dummy)
  * eeh_thread_launcher
  * @dummy - unused
  */
-static void eeh_thread_launcher(void *dummy)
+static void eeh_thread_launcher(struct work_struct *dummy)
 {
        if (kernel_thread(eeh_event_handler, NULL, CLONE_KERNEL) < 0)
                printk(KERN_ERR "Failed to start EEH daemon\n");
index 2e1943e2781963886eda3a1b8ea2afdbb6850060..709952c25f2948c197acdbc6947c3b2493f2b1d1 100644 (file)
@@ -385,6 +385,7 @@ struct fcc_enet_private {
        phy_info_t      *phy;
        struct work_struct phy_relink;
        struct work_struct phy_display_config;
+       struct net_device *dev;
 
        uint    sequence_done;
 
@@ -1391,10 +1392,11 @@ static phy_info_t *phy_info[] = {
        NULL
 };
 
-static void mii_display_status(void *data)
+static void mii_display_status(struct work_struct *work)
 {
-       struct net_device *dev = data;
-       volatile struct fcc_enet_private *fep = dev->priv;
+       volatile struct fcc_enet_private *fep =
+               container_of(work, struct fcc_enet_private, phy_relink);
+       struct net_device *dev = fep->dev;
        uint s = fep->phy_status;
 
        if (!fep->link && !fep->old_link) {
@@ -1428,10 +1430,12 @@ static void mii_display_status(void *data)
        printk(".\n");
 }
 
-static void mii_display_config(void *data)
+static void mii_display_config(struct work_struct *work)
 {
-       struct net_device *dev = data;
-       volatile struct fcc_enet_private *fep = dev->priv;
+       volatile struct fcc_enet_private *fep =
+               container_of(work, struct fcc_enet_private,
+                            phy_display_config);
+       struct net_device *dev = fep->dev;
        uint s = fep->phy_status;
 
        printk("%s: config: auto-negotiation ", dev->name);
@@ -1758,8 +1762,9 @@ static int __init fec_enet_init(void)
                cep->phy_id_done = 0;
                cep->phy_addr = fip->fc_phyaddr;
                mii_queue(dev, mk_mii_read(MII_PHYSID1), mii_discover_phy);
-               INIT_WORK(&cep->phy_relink, mii_display_status, dev);
-               INIT_WORK(&cep->phy_display_config, mii_display_config, dev);
+               INIT_WORK(&cep->phy_relink, mii_display_status);
+               INIT_WORK(&cep->phy_display_config, mii_display_config);
+               cep->dev = dev;
 #endif /* CONFIG_USE_MDIO */
 
                fip++;
index 2f9fa9e3d331fcdc903164068262156de075bb2c..e6c28fb423b234ba5c8f8892499923e36c1cd92e 100644 (file)
@@ -173,6 +173,7 @@ struct fec_enet_private {
        uint    phy_speed;
        phy_info_t      *phy;
        struct work_struct phy_task;
+       struct net_device *dev;
 
        uint    sequence_done;
 
@@ -1263,10 +1264,11 @@ static void mii_display_status(struct net_device *dev)
        printk(".\n");
 }
 
-static void mii_display_config(void *priv)
+static void mii_display_config(struct work_struct *work)
 {
-       struct net_device *dev = (struct net_device *)priv;
-       struct fec_enet_private *fep = dev->priv;
+       struct fec_enet_private *fep =
+               container_of(work, struct fec_enet_private, phy_task);
+       struct net_device *dev = fep->dev;
        volatile uint *s = &(fep->phy_status);
 
        printk("%s: config: auto-negotiation ", dev->name);
@@ -1295,10 +1297,11 @@ static void mii_display_config(void *priv)
        fep->sequence_done = 1;
 }
 
-static void mii_relink(void *priv)
+static void mii_relink(struct work_struct *work)
 {
-       struct net_device *dev = (struct net_device *)priv;
-       struct fec_enet_private *fep = dev->priv;
+       struct fec_enet_private *fep =
+               container_of(work, struct fec_enet_private, phy_task);
+       struct net_device *dev = fep->dev;
        int duplex;
 
        fep->link = (fep->phy_status & PHY_STAT_LINK) ? 1 : 0;
@@ -1325,7 +1328,8 @@ static void mii_queue_relink(uint mii_reg, struct net_device *dev)
 {
        struct fec_enet_private *fep = dev->priv;
 
-       INIT_WORK(&fep->phy_task, mii_relink, (void *)dev);
+       fep->dev = dev;
+       INIT_WORK(&fep->phy_task, mii_relink);
        schedule_work(&fep->phy_task);
 }
 
@@ -1333,7 +1337,8 @@ static void mii_queue_config(uint mii_reg, struct net_device *dev)
 {
        struct fec_enet_private *fep = dev->priv;
 
-       INIT_WORK(&fep->phy_task, mii_display_config, (void *)dev);
+       fep->dev = dev;
+       INIT_WORK(&fep->phy_task, mii_display_config);
        schedule_work(&fep->phy_task);
 }
 
index af1e8fc7d985aab03d758a9f10423a486a0eda28..67d5cf9cba83b2dcdc1288dcfd8fc0efd596f7c9 100644 (file)
@@ -92,8 +92,8 @@ static int appldata_timer_active;
  * Work queue
  */
 static struct workqueue_struct *appldata_wq;
-static void appldata_work_fn(void *data);
-static DECLARE_WORK(appldata_work, appldata_work_fn, NULL);
+static void appldata_work_fn(struct work_struct *work);
+static DECLARE_WORK(appldata_work, appldata_work_fn);
 
 
 /*
@@ -125,7 +125,7 @@ static void appldata_timer_function(unsigned long data)
  *
  * call data gathering function for each (active) module
  */
-static void appldata_work_fn(void *data)
+static void appldata_work_fn(struct work_struct *work)
 {
        struct list_head *lh;
        struct appldata_ops *ops;
index bffc7e176970ffa7eb1e6ad20203fd6862ae866b..d83d64af31f277d5451507d2b60fcc13c3a0af33 100644 (file)
@@ -51,6 +51,14 @@ config GENERIC_TIME
 config ARCH_MAY_HAVE_PC_FDC
        bool
 
+config STACKTRACE_SUPPORT
+       bool
+       default y
+
+config LOCKDEP_SUPPORT
+       bool
+       default y
+
 source "init/Kconfig"
 
 menu "System type"
@@ -219,6 +227,20 @@ config SH_SHMIN
        help
          Select SHMIN if configuring for the SHMIN board.
 
+config SH_7206_SOLUTION_ENGINE
+       bool "SolutionEngine7206"
+       select CPU_SUBTYPE_SH7206
+       help
+         Select 7206 SolutionEngine if configuring for a Hitachi SH7206
+         evaluation board.
+
+config SH_7619_SOLUTION_ENGINE
+       bool "SolutionEngine7619"
+       select CPU_SUBTYPE_SH7619
+       help
+         Select 7619 SolutionEngine if configuring for a Hitachi SH7619
+         evaluation board.
+
 config SH_UNKNOWN
        bool "BareCPU"
        help
@@ -280,12 +302,20 @@ config CF_BASE_ADDR
 
 menu "Processor features"
 
-config CPU_LITTLE_ENDIAN
-       bool "Little Endian"
+choice
+       prompt "Endianess selection" 
+       default CPU_LITTLE_ENDIAN
        help
          Some SuperH machines can be configured for either little or big
-         endian byte order. These modes require different kernels. Say Y if
-         your machine is little endian, N if it's a big endian machine.
+         endian byte order. These modes require different kernels.
+
+config CPU_LITTLE_ENDIAN
+       bool "Little Endian"
+
+config CPU_BIG_ENDIAN
+       bool "Big Endian"
+
+endchoice
 
 config SH_FPU
        bool "FPU support"
@@ -345,6 +375,9 @@ config CPU_HAS_MASKREG_IRQ
 config CPU_HAS_INTC2_IRQ
        bool
 
+config CPU_HAS_IPR_IRQ
+       bool
+
 config CPU_HAS_SR_RB
        bool "CPU has SR.RB"
        depends on CPU_SH3 || CPU_SH4
@@ -357,6 +390,9 @@ config CPU_HAS_SR_RB
          See <file:Documentation/sh/register-banks.txt> for further
          information on SR.RB and register banking in the kernel in general.
 
+config CPU_HAS_PTEA
+       bool
+
 endmenu
 
 menu "Timer support"
@@ -364,10 +400,25 @@ depends on !GENERIC_TIME
 
 config SH_TMU
        bool "TMU timer support"
+       depends on CPU_SH3 || CPU_SH4
        default y
        help
          This enables the use of the TMU as the system timer.
 
+config SH_CMT
+       bool "CMT timer support"
+       depends on CPU_SH2
+       default y
+       help
+         This enables the use of the CMT as the system timer.
+
+config SH_MTU2
+       bool "MTU2 timer support"
+       depends on CPU_SH2A
+       default n
+       help
+         This enables the use of the MTU2 as the system timer.
+
 endmenu
 
 source "arch/sh/boards/renesas/hs7751rvoip/Kconfig"
@@ -376,19 +427,52 @@ source "arch/sh/boards/renesas/rts7751r2d/Kconfig"
 
 source "arch/sh/boards/renesas/r7780rp/Kconfig"
 
+config SH_TIMER_IRQ
+       int
+       default "28" if CPU_SUBTYPE_SH7780
+       default "86" if CPU_SUBTYPE_SH7619
+       default "140" if CPU_SUBTYPE_SH7206
+       default "16"
+
+config NO_IDLE_HZ
+       bool "Dynamic tick timer"
+       help
+         Select this option if you want to disable continuous timer ticks
+         and have them programmed to occur as required. This option saves
+         power as the system can remain in idle state for longer.
+
+         By default dynamic tick is disabled during the boot, and can be
+         manually enabled with:
+
+           echo 1 > /sys/devices/system/timer/timer0/dyn_tick
+
+         Alternatively, if you want dynamic tick automatically enabled
+         during boot, pass "dyntick=enable" via the kernel command string.
+
+         Please note that dynamic tick may affect the accuracy of
+         timekeeping on some platforms depending on the implementation.
+
 config SH_PCLK_FREQ
        int "Peripheral clock frequency (in Hz)"
+       default "27000000" if CPU_SUBTYPE_SH73180 || CPU_SUBTYPE_SH7343
+       default "31250000" if CPU_SUBTYPE_SH7619
+       default "33333333" if CPU_SUBTYPE_SH7300 || CPU_SUBTYPE_SH7770 || \
+                             CPU_SUBTYPE_SH7760 || CPU_SUBTYPE_SH7705 || \
+                             CPU_SUBTYPE_SH7206
        default "50000000" if CPU_SUBTYPE_SH7750 || CPU_SUBTYPE_SH7780
        default "60000000" if CPU_SUBTYPE_SH7751
-       default "33333333" if CPU_SUBTYPE_SH7300 || CPU_SUBTYPE_SH7770 || \
-                             CPU_SUBTYPE_SH7760 || CPU_SUBTYPE_SH7705
-       default "27000000" if CPU_SUBTYPE_SH73180 || CPU_SUBTYPE_SH7343
        default "66000000" if CPU_SUBTYPE_SH4_202
        help
          This option is used to specify the peripheral clock frequency.
          This is necessary for determining the reference clock value on
          platforms lacking an RTC.
 
+config SH_CLK_MD
+       int "CPU Mode Pin Setting"
+       depends on CPU_SUBTYPE_SH7619 || CPU_SUBTYPE_SH7206
+       help
+         MD2 - MD0 Setting.
+
 menu "CPU Frequency scaling"
 
 source "drivers/cpufreq/Kconfig"
@@ -421,6 +505,8 @@ config HEARTBEAT
          behavior is platform-dependent, but normally the flash frequency is
          a hyperbolic function of the 5-minute load average.
 
+source "arch/sh/drivers/Kconfig"
+
 endmenu
 
 config ISA_DMA_API
index 48479e014dac657f3b36dc4252801ed38e61b1b9..66a25ef4ef1b8bf233e7936f049c91617933596f 100644 (file)
@@ -1,5 +1,9 @@
 menu "Kernel hacking"
 
+config TRACE_IRQFLAGS_SUPPORT
+       bool
+       default y
+
 source "lib/Kconfig.debug"
 
 config SH_STANDARD_BIOS
@@ -17,7 +21,18 @@ config SH_STANDARD_BIOS
 
 config EARLY_SCIF_CONSOLE
        bool "Use early SCIF console"
-       depends on CPU_SH4 || CPU_SH2A && !SH_STANDARD_BIOS
+       help
+         This enables an early console using a fixed SCIF port. This can
+         be used by platforms that are either not running the SH
+         standard BIOS, or do not wish to use the BIOS callbacks for the
+         serial I/O.
+
+config EARLY_SCIF_CONSOLE_PORT
+       hex "SCIF port for early console"
+       depends on EARLY_SCIF_CONSOLE
+       default "0xffe00000" if CPU_SUBTYPE_SH7780
+       default "0xfffe9800" if CPU_SUBTYPE_SH72060
+       default "0xffe80000" if CPU_SH4
 
 config EARLY_PRINTK
        bool "Early printk support"
@@ -30,6 +45,11 @@ config EARLY_PRINTK
          when the kernel may crash or hang before the serial console is
          initialised. If unsure, say N.
 
+         On devices that are running SH-IPL and want to keep the port
+         initialization consistent while not using the BIOS callbacks,
+         select both the EARLY_SCIF_CONSOLE and SH_STANDARD_BIOS, using
+         the kernel command line option to toggle back and forth.
+
 config DEBUG_STACKOVERFLOW
        bool "Check for stack overflows"
        depends on DEBUG_KERNEL
index 26d62ff51a64e951b96aa90d1620365f15c7a1a1..d10bba5e1074bef182503c598125ef0fa963a7d8 100644 (file)
 # for "archclean" and "archdep" for cleaning up and making dependencies for
 # this architecture
 #
-
-cflags-y                               := -mb
-cflags-$(CONFIG_CPU_LITTLE_ENDIAN)     := -ml
-
 isa-y                                  := any
 isa-$(CONFIG_SH_DSP)                   := sh
 isa-$(CONFIG_CPU_SH2)                  := sh2
@@ -38,13 +34,16 @@ isa-y                       := $(isa-y)-nofpu
 endif
 endif
 
-cflags-y       += $(call as-option,-Wa$(comma)-isa=$(isa-y),)
-
-cflags-$(CONFIG_CPU_SH2)               += -m2
-cflags-$(CONFIG_CPU_SH3)               += -m3
-cflags-$(CONFIG_CPU_SH4)               += -m4 \
+cflags-$(CONFIG_CPU_SH2)               := -m2
+cflags-$(CONFIG_CPU_SH3)               := -m3
+cflags-$(CONFIG_CPU_SH4)               := -m4 \
        $(call cc-option,-mno-implicit-fp,-m4-nofpu)
-cflags-$(CONFIG_CPU_SH4A)              += $(call cc-option,-m4a-nofpu,)
+cflags-$(CONFIG_CPU_SH4A)              := -m4a $(call cc-option,-m4a-nofpu,)
+
+cflags-$(CONFIG_CPU_BIG_ENDIAN)                += -mb
+cflags-$(CONFIG_CPU_LITTLE_ENDIAN)     += -ml
+
+cflags-y       += $(call as-option,-Wa$(comma)-isa=$(isa-y),) -ffreestanding
 
 cflags-$(CONFIG_SH_DSP)                        += -Wa,-dsp
 cflags-$(CONFIG_SH_KGDB)               += -g
@@ -59,7 +58,9 @@ OBJCOPYFLAGS  := -O binary -R .note -R .comment -R .stab -R .stabstr -S
 # never be used by anyone. Use a board-specific defconfig that has a
 # reasonable chance of being current instead.
 #
-KBUILD_DEFCONFIG := rts7751r2d_defconfig
+KBUILD_DEFCONFIG := r7780rp_defconfig
+
+KBUILD_IMAGE   := arch/sh/boot/zImage
 
 #
 # Choosing incompatible machines durings configuration will result in
@@ -109,6 +110,8 @@ machdir-$(CONFIG_SH_SH4202_MICRODEV)                := superh/microdev
 machdir-$(CONFIG_SH_LANDISK)                   := landisk
 machdir-$(CONFIG_SH_TITAN)                     := titan
 machdir-$(CONFIG_SH_SHMIN)                     := shmin
+machdir-$(CONFIG_SH_7206_SOLUTION_ENGINE)      := se/7206
+machdir-$(CONFIG_SH_7619_SOLUTION_ENGINE)      := se/7619
 machdir-$(CONFIG_SH_UNKNOWN)                   := unknown
 
 incdir-y                       := $(notdir $(machdir-y))
@@ -124,6 +127,7 @@ core-$(CONFIG_HD64465)              += arch/sh/cchips/hd6446x/hd64465/
 core-$(CONFIG_VOYAGERGX)       += arch/sh/cchips/voyagergx/
 
 cpuincdir-$(CONFIG_CPU_SH2)    := cpu-sh2
+cpuincdir-$(CONFIG_CPU_SH2A)   := cpu-sh2a
 cpuincdir-$(CONFIG_CPU_SH3)    := cpu-sh3
 cpuincdir-$(CONFIG_CPU_SH4)    := cpu-sh4
 
index f1776d0279787756c02dc48bd106a5af430b68a8..574b0316ed564ace61bd0ca0ce5364f2d38e1741 100644 (file)
@@ -3,4 +3,6 @@
 #
 
 obj-y   := setup.o io.o irq.o
-obj-$(CONFIG_HEARTBEAT)        += led.o
+
+obj-$(CONFIG_HEARTBEAT)                += led.o
+obj-$(CONFIG_PUSH_SWITCH)      += psw.o
index aa15ec5bc69ee42cf26b776f20562520277f1f46..cc381e19778305a121b0a61c827c066ba515e230 100644 (file)
@@ -10,6 +10,7 @@
  */
 #include <linux/init.h>
 #include <linux/irq.h>
+#include <linux/interrupt.h>
 #include <linux/io.h>
 #include <asm/r7780rp.h>
 
diff --git a/arch/sh/boards/renesas/r7780rp/psw.c b/arch/sh/boards/renesas/r7780rp/psw.c
new file mode 100644 (file)
index 0000000..c844dfa
--- /dev/null
@@ -0,0 +1,122 @@
+/*
+ * arch/sh/boards/renesas/r7780rp/psw.c
+ *
+ * push switch support for RDBRP-1/RDBREVRP-1 debug boards.
+ *
+ * Copyright (C) 2006  Paul Mundt
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License.  See the file "COPYING" in the main directory of this archive
+ * for more details.
+ */
+#include <linux/io.h>
+#include <linux/init.h>
+#include <linux/interrupt.h>
+#include <linux/platform_device.h>
+#include <asm/mach/r7780rp.h>
+#include <asm/push-switch.h>
+
+static irqreturn_t psw_irq_handler(int irq, void *arg)
+{
+       struct platform_device *pdev = arg;
+       struct push_switch *psw = platform_get_drvdata(pdev);
+       struct push_switch_platform_info *psw_info = pdev->dev.platform_data;
+       unsigned int l, mask;
+       int ret = 0;
+
+       l = ctrl_inw(PA_DBSW);
+
+       /* Nothing to do if there's no state change */
+       if (psw->state) {
+               ret = 1;
+               goto out;
+       }
+
+       mask = l & 0x70;
+       /* Figure out who raised it */
+       if (mask & (1 << psw_info->bit)) {
+               psw->state = !!(mask & (1 << psw_info->bit));
+               if (psw->state) /* debounce */
+                       mod_timer(&psw->debounce, jiffies + 50);
+
+               ret = 1;
+       }
+
+out:
+       /* Clear the switch IRQs */
+       l |= (0x7 << 12);
+       ctrl_outw(l, PA_DBSW);
+
+       return IRQ_RETVAL(ret);
+}
+
+static struct resource psw_resources[] = {
+       [0] = {
+               .start  = IRQ_PSW,
+               .flags  = IORESOURCE_IRQ,
+       },
+};
+
+static struct push_switch_platform_info s2_platform_data = {
+       .name           = "s2",
+       .bit            = 6,
+       .irq_flags      = IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING |
+                         IRQF_SHARED,
+       .irq_handler    = psw_irq_handler,
+};
+
+static struct platform_device s2_switch_device = {
+       .name           = "push-switch",
+       .id             = 0,
+       .num_resources  = ARRAY_SIZE(psw_resources),
+       .resource       = psw_resources,
+       .dev            = {
+               .platform_data = &s2_platform_data,
+       },
+};
+
+static struct push_switch_platform_info s3_platform_data = {
+       .name           = "s3",
+       .bit            = 5,
+       .irq_flags      = IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING |
+                         IRQF_SHARED,
+       .irq_handler    = psw_irq_handler,
+};
+
+static struct platform_device s3_switch_device = {
+       .name           = "push-switch",
+       .id             = 1,
+       .num_resources  = ARRAY_SIZE(psw_resources),
+       .resource       = psw_resources,
+       .dev            = {
+               .platform_data = &s3_platform_data,
+       },
+};
+
+static struct push_switch_platform_info s4_platform_data = {
+       .name           = "s4",
+       .bit            = 4,
+       .irq_flags      = IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING |
+                         IRQF_SHARED,
+       .irq_handler    = psw_irq_handler,
+};
+
+static struct platform_device s4_switch_device = {
+       .name           = "push-switch",
+       .id             = 2,
+       .num_resources  = ARRAY_SIZE(psw_resources),
+       .resource       = psw_resources,
+       .dev            = {
+               .platform_data = &s4_platform_data,
+       },
+};
+
+static struct platform_device *psw_devices[] = {
+       &s2_switch_device, &s3_switch_device, &s4_switch_device,
+};
+
+static int __init psw_init(void)
+{
+       return platform_add_devices(psw_devices, ARRAY_SIZE(psw_devices));
+}
+module_init(psw_init);
index c331caeb694b681658639d5a8e75a3f765afa36c..9f89c8de9db98ba9f5a4e0ad3f6478520af515a0 100644 (file)
@@ -44,8 +44,37 @@ static struct platform_device m66596_usb_host_device = {
        .resource       = m66596_usb_host_resources,
 };
 
+static struct resource cf_ide_resources[] = {
+       [0] = {
+               .start  = 0x1f0,
+               .end    = 0x1f0 + 8,
+               .flags  = IORESOURCE_IO,
+       },
+       [1] = {
+               .start  = 0x1f0 + 0x206,
+               .end    = 0x1f0 + 8 + 0x206 + 8,
+               .flags  = IORESOURCE_IO,
+       },
+       [2] = {
+#ifdef CONFIG_SH_R7780MP
+               .start  = 1,
+#else
+               .start  = 4,
+#endif
+               .flags  = IORESOURCE_IRQ,
+       },
+};
+
+static struct platform_device cf_ide_device  = {
+       .name           = "pata_platform",
+       .id             = -1,
+       .num_resources  = ARRAY_SIZE(cf_ide_resources),
+       .resource       = cf_ide_resources,
+};
+
 static struct platform_device *r7780rp_devices[] __initdata = {
        &m66596_usb_host_device,
+       &cf_ide_device,
 };
 
 static int __init r7780rp_devices_setup(void)
diff --git a/arch/sh/boards/se/7206/Makefile b/arch/sh/boards/se/7206/Makefile
new file mode 100644 (file)
index 0000000..63950f4
--- /dev/null
@@ -0,0 +1,7 @@
+#
+# Makefile for the 7206 SolutionEngine specific parts of the kernel
+#
+
+obj-y   := setup.o io.o irq.o
+obj-$(CONFIG_HEARTBEAT) += led.o
+
diff --git a/arch/sh/boards/se/7206/io.c b/arch/sh/boards/se/7206/io.c
new file mode 100644 (file)
index 0000000..b557273
--- /dev/null
@@ -0,0 +1,123 @@
+/* $Id: io.c,v 1.5 2004/02/22 23:08:43 kkojima Exp $
+ *
+ * linux/arch/sh/boards/se/7206/io.c
+ *
+ * Copyright (C) 2006 Yoshinori Sato
+ *
+ * I/O routine for Hitachi 7206 SolutionEngine.
+ *
+ */
+
+#include <linux/kernel.h>
+#include <linux/types.h>
+#include <asm/io.h>
+#include <asm/se7206.h>
+
+
+static inline void delay(void)
+{
+       ctrl_inw(0x20000000);  /* P2 ROM Area */
+}
+
+/* MS7750 requires special versions of in*, out* routines, since
+   PC-like io ports are located at upper half byte of 16-bit word which
+   can be accessed only with 16-bit wide.  */
+
+static inline volatile __u16 *
+port2adr(unsigned int port)
+{
+       if (port >= 0x2000)
+               return (volatile __u16 *) (PA_MRSHPC + (port - 0x2000));
+       else if (port >= 0x300 || port < 0x310)
+               return (volatile __u16 *) (PA_SMSC + (port - 0x300));
+}
+
+unsigned char se7206_inb(unsigned long port)
+{
+       return (*port2adr(port))&0xff; 
+}
+
+unsigned char se7206_inb_p(unsigned long port)
+{
+       unsigned long v;
+
+       v = (*port2adr(port))&0xff; 
+       delay();
+       return v;
+}
+
+unsigned short se7206_inw(unsigned long port)
+{
+       return *port2adr(port);;
+}
+
+unsigned int se7206_inl(unsigned long port)
+{
+       maybebadio(port);
+       return 0;
+}
+
+void se7206_outb(unsigned char value, unsigned long port)
+{
+       *(port2adr(port)) = value;
+}
+
+void se7206_outb_p(unsigned char value, unsigned long port)
+{
+       *(port2adr(port)) = value;
+       delay();
+}
+
+void se7206_outw(unsigned short value, unsigned long port)
+{
+       *port2adr(port) = value;
+}
+
+void se7206_outl(unsigned int value, unsigned long port)
+{
+       maybebadio(port);
+}
+
+void se7206_insb(unsigned long port, void *addr, unsigned long count)
+{
+       volatile __u16 *p = port2adr(port);
+       __u8 *ap = addr;
+
+       while (count--)
+               *ap++ = *p;
+}
+
+void se7206_insw(unsigned long port, void *addr, unsigned long count)
+{
+       volatile __u16 *p = port2adr(port);
+       __u16 *ap = addr;
+       while (count--)
+               *ap++ = *p;
+}
+
+void se7206_insl(unsigned long port, void *addr, unsigned long count)
+{
+       maybebadio(port);
+}
+
+void se7206_outsb(unsigned long port, const void *addr, unsigned long count)
+{
+       volatile __u16 *p = port2adr(port);
+       const __u8 *ap = addr;
+
+       while (count--)
+               *p = *ap++;
+}
+
+void se7206_outsw(unsigned long port, const void *addr, unsigned long count)
+{
+       volatile __u16 *p = port2adr(port);
+       const __u16 *ap = addr;
+       while (count--)
+               *p = *ap++;
+}
+
+void se7206_outsl(unsigned long port, const void *addr, unsigned long count)
+{
+       maybebadio(port);
+}
diff --git a/arch/sh/boards/se/7206/irq.c b/arch/sh/boards/se/7206/irq.c
new file mode 100644 (file)
index 0000000..3fb0c5f
--- /dev/null
@@ -0,0 +1,139 @@
+/*
+ * linux/arch/sh/boards/se/7206/irq.c
+ *
+ * Copyright (C) 2005,2006 Yoshinori Sato
+ *
+ * Hitachi SolutionEngine Support.
+ *
+ */
+#include <linux/init.h>
+#include <linux/irq.h>
+#include <linux/io.h>
+#include <linux/irq.h>
+#include <asm/se7206.h>
+
+#define INTSTS0 0x31800000
+#define INTSTS1 0x31800002
+#define INTMSK0 0x31800004
+#define INTMSK1 0x31800006
+#define INTSEL  0x31800008
+
+static void disable_se7206_irq(unsigned int irq)
+{
+       unsigned short val;
+       unsigned short mask = 0xffff ^ (0x0f << 4 * (3 - (IRQ0_IRQ - irq)));
+       unsigned short msk0,msk1;
+
+       /* Set the priority in IPR to 0 */
+       val = ctrl_inw(INTC_IPR01);
+       val &= mask;
+       ctrl_outw(val, INTC_IPR01);
+       /* FPGA mask set */
+       msk0 = ctrl_inw(INTMSK0);
+       msk1 = ctrl_inw(INTMSK1);
+
+       switch (irq) {
+       case IRQ0_IRQ:
+               msk0 |= 0x0010;
+               break;
+       case IRQ1_IRQ:
+               msk0 |= 0x000f;
+               break;
+       case IRQ2_IRQ:
+               msk0 |= 0x0f00;
+               msk1 |= 0x00ff;
+               break;
+       }
+       ctrl_outw(msk0, INTMSK0);
+       ctrl_outw(msk1, INTMSK1);
+}
+
+static void enable_se7206_irq(unsigned int irq)
+{
+       unsigned short val;
+       unsigned short value = (0x0001 << 4 * (3 - (IRQ0_IRQ - irq)));
+       unsigned short msk0,msk1;
+
+       /* Set priority in IPR back to original value */
+       val = ctrl_inw(INTC_IPR01);
+       val |= value;
+       ctrl_outw(val, INTC_IPR01);
+
+       /* FPGA mask reset */
+       msk0 = ctrl_inw(INTMSK0);
+       msk1 = ctrl_inw(INTMSK1);
+
+       switch (irq) {
+       case IRQ0_IRQ:
+               msk0 &= ~0x0010;
+               break;
+       case IRQ1_IRQ:
+               msk0 &= ~0x000f;
+               break;
+       case IRQ2_IRQ:
+               msk0 &= ~0x0f00;
+               msk1 &= ~0x00ff;
+               break;
+       }
+       ctrl_outw(msk0, INTMSK0);
+       ctrl_outw(msk1, INTMSK1);
+}
+
+static void eoi_se7206_irq(unsigned int irq)
+{
+       unsigned short sts0,sts1;
+
+       if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS)))
+               enable_se7206_irq(irq);
+       /* FPGA isr clear */
+       sts0 = ctrl_inw(INTSTS0);
+       sts1 = ctrl_inw(INTSTS1);
+
+       switch (irq) {
+       case IRQ0_IRQ:
+               sts0 &= ~0x0010;
+               break;
+       case IRQ1_IRQ:
+               sts0 &= ~0x000f;
+               break;
+       case IRQ2_IRQ:
+               sts0 &= ~0x0f00;
+               sts1 &= ~0x00ff;
+               break;
+       }
+       ctrl_outw(sts0, INTSTS0);
+       ctrl_outw(sts1, INTSTS1);
+}
+
+static struct irq_chip se7206_irq_chip __read_mostly = {
+       .name           = "SE7206-FPGA-IRQ",
+       .mask           = disable_se7206_irq,
+       .unmask         = enable_se7206_irq,
+       .mask_ack       = disable_se7206_irq,
+       .eoi            = eoi_se7206_irq,
+};
+
+static void make_se7206_irq(unsigned int irq)
+{
+       disable_irq_nosync(irq);
+       set_irq_chip_and_handler_name(irq, &se7206_irq_chip,
+                                     handle_level_irq, "level");
+       disable_se7206_irq(irq);
+}
+
+/*
+ * Initialize IRQ setting
+ */
+void __init init_se7206_IRQ(void)
+{
+       make_se7206_irq(IRQ0_IRQ); /* SMC91C111 */
+       make_se7206_irq(IRQ1_IRQ); /* ATA */
+       make_se7206_irq(IRQ3_IRQ); /* SLOT / PCM */
+       ctrl_outw(inw(INTC_ICR1) | 0x000b ,INTC_ICR1 ) ; /* ICR1 */
+
+       /* FPGA System register setup*/
+       ctrl_outw(0x0000,INTSTS0); /* Clear INTSTS0 */
+       ctrl_outw(0x0000,INTSTS1); /* Clear INTSTS1 */
+       /* IRQ0=LAN, IRQ1=ATA, IRQ3=SLT,PCM */
+       ctrl_outw(0x0001,INTSEL);
+}
diff --git a/arch/sh/boards/se/7206/led.c b/arch/sh/boards/se/7206/led.c
new file mode 100644 (file)
index 0000000..ef79460
--- /dev/null
@@ -0,0 +1,57 @@
+/*
+ * linux/arch/sh/kernel/led_se.c
+ *
+ * Copyright (C) 2000 Stuart Menefy <stuart.menefy@st.com>
+ *
+ * May be copied or modified under the terms of the GNU General Public
+ * License.  See linux/COPYING for more information.
+ *
+ * This file contains Solution Engine specific LED code.
+ */
+
+#include <linux/config.h>
+#include <asm/se7206.h>
+
+#ifdef CONFIG_HEARTBEAT
+
+#include <linux/sched.h>
+
+/* Cycle the LED's in the clasic Knightrider/Sun pattern */
+void heartbeat_se(void)
+{
+       static unsigned int cnt = 0, period = 0;
+       volatile unsigned short* p = (volatile unsigned short*)PA_LED;
+       static unsigned bit = 0, up = 1;
+
+       cnt += 1;
+       if (cnt < period) {
+               return;
+       }
+
+       cnt = 0;
+
+       /* Go through the points (roughly!):
+        * f(0)=10, f(1)=16, f(2)=20, f(5)=35,f(inf)->110
+        */
+       period = 110 - ( (300<<FSHIFT)/
+                        ((avenrun[0]/5) + (3<<FSHIFT)) );
+
+       if (up) {
+               if (bit == 7) {
+                       bit--;
+                       up=0;
+               } else {
+                       bit ++;
+               }
+       } else {
+               if (bit == 0) {
+                       bit++;
+                       up=1;
+               } else {
+                       bit--;
+               }
+       }
+       *p = 1<<(bit+8);
+
+}
+#endif /* CONFIG_HEARTBEAT */
diff --git a/arch/sh/boards/se/7206/setup.c b/arch/sh/boards/se/7206/setup.c
new file mode 100644 (file)
index 0000000..0f42e91
--- /dev/null
@@ -0,0 +1,79 @@
+/*
+ *
+ * linux/arch/sh/boards/se/7206/setup.c
+ *
+ * Copyright (C) 2006  Yoshinori Sato
+ *
+ * Hitachi 7206 SolutionEngine Support.
+ *
+ */
+
+#include <linux/init.h>
+#include <linux/platform_device.h>
+#include <asm/se7206.h>
+#include <asm/io.h>
+#include <asm/machvec.h>
+
+static struct resource smc91x_resources[] = {
+       [0] = {
+               .start          = 0x300,
+               .end            = 0x300 + 0x020 - 1,
+               .flags          = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start          = 64,
+               .end            = 64,
+               .flags          = IORESOURCE_IRQ,
+       },
+};
+
+static struct platform_device smc91x_device = {
+       .name           = "smc91x",
+       .id             = -1,
+       .num_resources  = ARRAY_SIZE(smc91x_resources),
+       .resource       = smc91x_resources,
+};
+
+static int __init se7206_devices_setup(void)
+{
+       return platform_device_register(&smc91x_device);
+}
+
+__initcall(se7206_devices_setup);
+
+void heartbeat_se(void);
+
+/*
+ * The Machine Vector
+ */
+
+struct sh_machine_vector mv_se __initmv = {
+       .mv_name                = "SolutionEngine",
+       .mv_nr_irqs             = 256,
+       .mv_inb                 = se7206_inb,
+       .mv_inw                 = se7206_inw,
+       .mv_inl                 = se7206_inl,
+       .mv_outb                = se7206_outb,
+       .mv_outw                = se7206_outw,
+       .mv_outl                = se7206_outl,
+
+       .mv_inb_p               = se7206_inb_p,
+       .mv_inw_p               = se7206_inw,
+       .mv_inl_p               = se7206_inl,
+       .mv_outb_p              = se7206_outb_p,
+       .mv_outw_p              = se7206_outw,
+       .mv_outl_p              = se7206_outl,
+
+       .mv_insb                = se7206_insb,
+       .mv_insw                = se7206_insw,
+       .mv_insl                = se7206_insl,
+       .mv_outsb               = se7206_outsb,
+       .mv_outsw               = se7206_outsw,
+       .mv_outsl               = se7206_outsl,
+
+       .mv_init_irq            = init_se7206_IRQ,
+#ifdef CONFIG_HEARTBEAT
+       .mv_heartbeat           = heartbeat_se,
+#endif
+};
+ALIAS_MV(se)
diff --git a/arch/sh/boards/se/7619/Makefile b/arch/sh/boards/se/7619/Makefile
new file mode 100644 (file)
index 0000000..3666eca
--- /dev/null
@@ -0,0 +1,5 @@
+#
+# Makefile for the 7619 SolutionEngine specific parts of the kernel
+#
+
+obj-y   := setup.o io.o
diff --git a/arch/sh/boards/se/7619/io.c b/arch/sh/boards/se/7619/io.c
new file mode 100644 (file)
index 0000000..176f1f3
--- /dev/null
@@ -0,0 +1,102 @@
+/*
+ *
+ * linux/arch/sh/boards/se/7619/io.c
+ *
+ * Copyright (C) 2006  Yoshinori Sato
+ *
+ * I/O routine for Hitachi 7619 SolutionEngine.
+ *
+ */
+
+#include <linux/kernel.h>
+#include <linux/types.h>
+#include <asm/io.h>
+#include <asm/se7619.h>
+#include <asm/irq.h>
+
+/* FIXME: M3A-ZAB7 Compact Flash Slot support */
+
+static inline void delay(void)
+{
+       ctrl_inw(0xa0000000);   /* Uncached ROM area (P2) */
+}
+
+#define badio(name,port) \
+  printk("bad I/O operation (%s) for port 0x%lx at 0x%08x\n", \
+        #name, (port), (__u32) __builtin_return_address(0))
+
+unsigned char se7619___inb(unsigned long port)
+{
+       badio(inb, port);
+       return 0;
+}
+
+unsigned char se7619___inb_p(unsigned long port)
+{
+       badio(inb_p, port);
+       delay();
+       return 0;
+}
+
+unsigned short se7619___inw(unsigned long port)
+{
+       badio(inw, port);
+       return 0;
+}
+
+unsigned int se7619___inl(unsigned long port)
+{
+       badio(inl, port);
+       return 0;
+}
+
+void se7619___outb(unsigned char value, unsigned long port)
+{
+       badio(outb, port);
+}
+
+void se7619___outb_p(unsigned char value, unsigned long port)
+{
+       badio(outb_p, port);
+       delay();
+}
+
+void se7619___outw(unsigned short value, unsigned long port)
+{
+       badio(outw, port);
+}
+
+void se7619___outl(unsigned int value, unsigned long port)
+{
+       badio(outl, port);
+}
+
+void se7619___insb(unsigned long port, void *addr, unsigned long count)
+{
+       badio(inw, port);
+}
+
+void se7619___insw(unsigned long port, void *addr, unsigned long count)
+{
+       badio(inw, port);
+}
+
+void se7619___insl(unsigned long port, void *addr, unsigned long count)
+{
+       badio(insl, port);
+}
+
+void se7619___outsb(unsigned long port, const void *addr, unsigned long count)
+{
+       badio(insl, port);
+}
+
+void se7619___outsw(unsigned long port, const void *addr, unsigned long count)
+{
+       badio(insl, port);
+}
+
+void se7619___outsl(unsigned long port, const void *addr, unsigned long count)
+{
+       badio(outsw, port);
+}
diff --git a/arch/sh/boards/se/7619/setup.c b/arch/sh/boards/se/7619/setup.c
new file mode 100644 (file)
index 0000000..e627b26
--- /dev/null
@@ -0,0 +1,43 @@
+/*
+ * arch/sh/boards/se/7619/setup.c
+ *
+ * Copyright (C) 2006 Yoshinori Sato
+ *
+ * Hitachi SH7619 SolutionEngine Support.
+ */
+
+#include <linux/init.h>
+#include <linux/platform_device.h>
+#include <asm/io.h>
+#include <asm/se7619.h>
+#include <asm/machvec.h>
+
+/*
+ * The Machine Vector
+ */
+
+struct sh_machine_vector mv_se __initmv = {
+       .mv_name                = "SolutionEngine",
+       .mv_nr_irqs             = 108,
+       .mv_inb                 = se7619___inb,
+       .mv_inw                 = se7619___inw,
+       .mv_inl                 = se7619___inl,
+       .mv_outb                = se7619___outb,
+       .mv_outw                = se7619___outw,
+       .mv_outl                = se7619___outl,
+
+       .mv_inb_p               = se7619___inb_p,
+       .mv_inw_p               = se7619___inw,
+       .mv_inl_p               = se7619___inl,
+       .mv_outb_p              = se7619___outb_p,
+       .mv_outw_p              = se7619___outw,
+       .mv_outl_p              = se7619___outl,
+
+       .mv_insb                = se7619___insb,
+       .mv_insw                = se7619___insw,
+       .mv_insl                = se7619___insl,
+       .mv_outsb               = se7619___outsb,
+       .mv_outsw               = se7619___outsw,
+       .mv_outsl               = se7619___outsl,
+};
+ALIAS_MV(se)
index a6046d93758b80430d25d422c6374bb755061a63..6bcd939bfaed4899783bf579eabd3011e9221c32 100644 (file)
@@ -1,26 +1,30 @@
 /*
- *     Setup for Titan
+ * arch/sh/boards/titan/setup.c - Setup for Titan
+ *
+ *  Copyright (C) 2006  Jamie Lenehan
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License.  See the file "COPYING" in the main directory of this archive
+ * for more details.
  */
-
 #include <linux/init.h>
-#include <asm/irq.h>
+#include <linux/irq.h>
 #include <asm/titan.h>
 #include <asm/io.h>
 
-extern void __init pcibios_init_platform(void);
-
 static struct ipr_data titan_ipr_map[] = {
-       { TITAN_IRQ_WAN,        IRL0_IPR_ADDR,  IRL0_IPR_POS,   IRL0_PRIORITY },
-       { TITAN_IRQ_LAN,        IRL1_IPR_ADDR,  IRL1_IPR_POS,   IRL1_PRIORITY },
-       { TITAN_IRQ_MPCIA,      IRL2_IPR_ADDR,  IRL2_IPR_POS,   IRL2_PRIORITY },
-       { TITAN_IRQ_USB,        IRL3_IPR_ADDR,  IRL3_IPR_POS,   IRL3_PRIORITY },
+       /* IRQ, IPR idx, shift, prio */
+       { TITAN_IRQ_WAN,   3, 12, 8 },  /* eth0 (WAN) */
+       { TITAN_IRQ_LAN,   3,  8, 8 },  /* eth1 (LAN) */
+       { TITAN_IRQ_MPCIA, 3,  4, 8 },  /* mPCI A (top) */
+       { TITAN_IRQ_USB,   3,  0, 8 },  /* mPCI B (bottom), USB */
 };
 
 static void __init init_titan_irq(void)
 {
        /* enable individual interrupt mode for externals */
-       ctrl_outw(ctrl_inw(INTC_ICR) | INTC_ICR_IRLM, INTC_ICR);
-
+       ipr_irq_enable_irlm();
+       /* register ipr irqs */
        make_ipr_irq(titan_ipr_map, ARRAY_SIZE(titan_ipr_map));
 }
 
@@ -47,6 +51,5 @@ struct sh_machine_vector mv_titan __initmv = {
        .mv_ioport_map = titan_ioport_map,
 
        .mv_init_irq =  init_titan_irq,
-       .mv_init_pci =  pcibios_init_platform,
 };
 ALIAS_MV(titan)
index f2fed5ce5cc315b0dac14a1ffa6f568a77d6b950..35452d85b7f7f21ccf341ae3af407ed679dfb450 100644 (file)
@@ -12,6 +12,7 @@
  */
 
 #include <asm/uaccess.h>
+#include <asm/addrspace.h>
 #ifdef CONFIG_SH_STANDARD_BIOS
 #include <asm/sh_bios.h>
 #endif
@@ -228,7 +229,7 @@ long* stack_start = &user_stack[STACK_SIZE];
 void decompress_kernel(void)
 {
        output_data = 0;
-       output_ptr = (unsigned long)&_text+0x20001000;
+       output_ptr = P2SEGADDR((unsigned long)&_text+0x1000);
        free_mem_ptr = (unsigned long)&_end;
        free_mem_end_ptr = free_mem_ptr + HEAP_SIZE;
 
index 34e2046c3213db5e69ac9492ef687401fd70813a..2b75b4896ba5ed44a996e37b19e1945a31f2ed80 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.19-rc3
-# Tue Oct 31 12:32:06 2006
+# Linux kernel version: 2.6.19
+# Wed Dec  6 11:59:38 2006
 #
 CONFIG_SUPERH=y
 CONFIG_RWSEM_GENERIC_SPINLOCK=y
@@ -11,6 +11,8 @@ CONFIG_GENERIC_HARDIRQS=y
 CONFIG_GENERIC_IRQ_PROBE=y
 CONFIG_GENERIC_CALIBRATE_DELAY=y
 # CONFIG_GENERIC_TIME is not set
+CONFIG_STACKTRACE_SUPPORT=y
+CONFIG_LOCKDEP_SUPPORT=y
 CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
 
 #
@@ -37,6 +39,7 @@ CONFIG_BSD_PROCESS_ACCT=y
 # CONFIG_AUDIT is not set
 CONFIG_IKCONFIG=y
 CONFIG_IKCONFIG_PROC=y
+# CONFIG_SYSFS_DEPRECATED is not set
 # CONFIG_RELAY is not set
 CONFIG_INITRAMFS_SOURCE=""
 CONFIG_CC_OPTIMIZE_FOR_SIZE=y
@@ -118,6 +121,8 @@ CONFIG_SH_R7780RP=y
 # CONFIG_SH_LANDISK is not set
 # CONFIG_SH_TITAN is not set
 # CONFIG_SH_SHMIN is not set
+# CONFIG_SH_7206_SOLUTION_ENGINE is not set
+# CONFIG_SH_7619_SOLUTION_ENGINE is not set
 # CONFIG_SH_UNKNOWN is not set
 
 #
@@ -130,6 +135,12 @@ CONFIG_CPU_SH4A=y
 # SH-2 Processor Support
 #
 # CONFIG_CPU_SUBTYPE_SH7604 is not set
+# CONFIG_CPU_SUBTYPE_SH7619 is not set
+
+#
+# SH-2A Processor Support
+#
+# CONFIG_CPU_SUBTYPE_SH7206 is not set
 
 #
 # SH-3 Processor Support
@@ -165,6 +176,7 @@ CONFIG_CPU_SH4A=y
 #
 # CONFIG_CPU_SUBTYPE_SH7770 is not set
 CONFIG_CPU_SUBTYPE_SH7780=y
+# CONFIG_CPU_SUBTYPE_SH7785 is not set
 
 #
 # SH4AL-DSP Processor Support
@@ -181,8 +193,14 @@ CONFIG_MEMORY_START=0x08000000
 CONFIG_MEMORY_SIZE=0x08000000
 # CONFIG_32BIT is not set
 CONFIG_VSYSCALL=y
+CONFIG_PAGE_SIZE_4KB=y
+# CONFIG_PAGE_SIZE_8KB is not set
+# CONFIG_PAGE_SIZE_64KB is not set
 CONFIG_HUGETLB_PAGE_SIZE_64K=y
+# CONFIG_HUGETLB_PAGE_SIZE_256K is not set
 # CONFIG_HUGETLB_PAGE_SIZE_1MB is not set
+# CONFIG_HUGETLB_PAGE_SIZE_4MB is not set
+# CONFIG_HUGETLB_PAGE_SIZE_64MB is not set
 CONFIG_SELECT_MEMORY_MODEL=y
 CONFIG_FLATMEM_MANUAL=y
 # CONFIG_DISCONTIGMEM_MANUAL is not set
@@ -204,12 +222,14 @@ CONFIG_SPLIT_PTLOCK_CPUS=4
 # Processor features
 #
 CONFIG_CPU_LITTLE_ENDIAN=y
+# CONFIG_CPU_BIG_ENDIAN is not set
 CONFIG_SH_FPU=y
 # CONFIG_SH_DSP is not set
 CONFIG_SH_STORE_QUEUES=y
 CONFIG_CPU_HAS_INTEVT=y
 CONFIG_CPU_HAS_INTC2_IRQ=y
 CONFIG_CPU_HAS_SR_RB=y
+CONFIG_CPU_HAS_PTEA=y
 
 #
 # Timer support
@@ -220,6 +240,8 @@ CONFIG_SH_TMU=y
 # R7780RP options
 #
 CONFIG_SH_R7780MP=y
+CONFIG_SH_TIMER_IRQ=28
+CONFIG_NO_IDLE_HZ=y
 CONFIG_SH_PCLK_FREQ=32000000
 
 #
@@ -237,6 +259,11 @@ CONFIG_SH_PCLK_FREQ=32000000
 #
 # CONFIG_HD6446X_SERIES is not set
 
+#
+# Additional SuperH Device Drivers
+#
+CONFIG_PUSH_SWITCH=y
+
 #
 # Kernel features
 #
@@ -244,7 +271,7 @@ CONFIG_SH_PCLK_FREQ=32000000
 CONFIG_HZ_250=y
 # CONFIG_HZ_1000 is not set
 CONFIG_HZ=250
-# CONFIG_KEXEC is not set
+CONFIG_KEXEC=y
 # CONFIG_SMP is not set
 # CONFIG_PREEMPT_NONE is not set
 # CONFIG_PREEMPT_VOLUNTARY is not set
@@ -278,10 +305,7 @@ CONFIG_PCI_AUTO_UPDATE_RESOURCES=y
 #
 # PCI Hotplug Support
 #
-CONFIG_HOTPLUG_PCI=y
-# CONFIG_HOTPLUG_PCI_FAKE is not set
-# CONFIG_HOTPLUG_PCI_CPCI is not set
-# CONFIG_HOTPLUG_PCI_SHPC is not set
+# CONFIG_HOTPLUG_PCI is not set
 
 #
 # Executable file formats
@@ -341,6 +365,7 @@ CONFIG_INET_TCP_DIAG=y
 # CONFIG_TCP_CONG_ADVANCED is not set
 CONFIG_TCP_CONG_CUBIC=y
 CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_TCP_MD5SIG is not set
 # CONFIG_IPV6 is not set
 # CONFIG_INET6_XFRM_TUNNEL is not set
 # CONFIG_INET6_TUNNEL is not set
@@ -556,6 +581,7 @@ CONFIG_SATA_SIL=y
 # CONFIG_PATA_IT821X is not set
 # CONFIG_PATA_JMICRON is not set
 # CONFIG_PATA_TRIFLEX is not set
+# CONFIG_PATA_MARVELL is not set
 # CONFIG_PATA_MPIIX is not set
 # CONFIG_PATA_OLDPIIX is not set
 # CONFIG_PATA_NETCELL is not set
@@ -572,6 +598,7 @@ CONFIG_SATA_SIL=y
 # CONFIG_PATA_SIS is not set
 # CONFIG_PATA_VIA is not set
 # CONFIG_PATA_WINBOND is not set
+CONFIG_PATA_PLATFORM=y
 
 #
 # Multi-device support (RAID and LVM)
@@ -688,6 +715,7 @@ CONFIG_R8169=y
 # CONFIG_IXGB is not set
 # CONFIG_S2IO is not set
 # CONFIG_MYRI10GE is not set
+# CONFIG_NETXEN_NIC is not set
 
 #
 # Token Ring devices
@@ -830,10 +858,6 @@ CONFIG_HW_RANDOM=y
 # CONFIG_DTLK is not set
 # CONFIG_R3964 is not set
 # CONFIG_APPLICOM is not set
-
-#
-# Ftape, the floppy tape device driver
-#
 # CONFIG_DRM is not set
 # CONFIG_RAW_DRIVER is not set
 
@@ -1020,7 +1044,7 @@ CONFIG_INOTIFY_USER=y
 CONFIG_DNOTIFY=y
 # CONFIG_AUTOFS_FS is not set
 # CONFIG_AUTOFS4_FS is not set
-# CONFIG_FUSE_FS is not set
+CONFIG_FUSE_FS=m
 
 #
 # CD-ROM/DVD Filesystems
@@ -1052,7 +1076,7 @@ CONFIG_TMPFS=y
 CONFIG_HUGETLBFS=y
 CONFIG_HUGETLB_PAGE=y
 CONFIG_RAMFS=y
-# CONFIG_CONFIGFS_FS is not set
+CONFIG_CONFIGFS_FS=m
 
 #
 # Miscellaneous filesystems
@@ -1153,28 +1177,33 @@ CONFIG_NLS_ISO8859_1=y
 #
 # Profiling support
 #
-# CONFIG_PROFILING is not set
+CONFIG_PROFILING=y
+CONFIG_OPROFILE=m
 
 #
 # Kernel hacking
 #
-# CONFIG_PRINTK_TIME is not set
+CONFIG_TRACE_IRQFLAGS_SUPPORT=y
+CONFIG_PRINTK_TIME=y
 CONFIG_ENABLE_MUST_CHECK=y
-# CONFIG_MAGIC_SYSRQ is not set
+CONFIG_MAGIC_SYSRQ=y
 # CONFIG_UNUSED_SYMBOLS is not set
 CONFIG_DEBUG_KERNEL=y
 CONFIG_LOG_BUF_SHIFT=14
 CONFIG_DETECT_SOFTLOCKUP=y
 # CONFIG_SCHEDSTATS is not set
 # CONFIG_DEBUG_SLAB is not set
-CONFIG_DEBUG_SPINLOCK=y
+# CONFIG_DEBUG_PREEMPT is not set
+# CONFIG_DEBUG_SPINLOCK is not set
 # CONFIG_DEBUG_MUTEXES is not set
 # CONFIG_DEBUG_RWSEMS is not set
+# CONFIG_DEBUG_LOCK_ALLOC is not set
+# CONFIG_PROVE_LOCKING is not set
 # CONFIG_DEBUG_SPINLOCK_SLEEP is not set
 # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
 # CONFIG_DEBUG_KOBJECT is not set
-# CONFIG_DEBUG_BUGVERBOSE is not set
-# CONFIG_DEBUG_INFO is not set
+CONFIG_DEBUG_BUGVERBOSE=y
+CONFIG_DEBUG_INFO=y
 CONFIG_DEBUG_FS=y
 # CONFIG_DEBUG_VM is not set
 # CONFIG_DEBUG_LIST is not set
@@ -1184,7 +1213,7 @@ CONFIG_FORCED_INLINING=y
 # CONFIG_RCU_TORTURE_TEST is not set
 # CONFIG_SH_STANDARD_BIOS is not set
 # CONFIG_EARLY_SCIF_CONSOLE is not set
-# CONFIG_DEBUG_STACKOVERFLOW is not set
+CONFIG_DEBUG_STACKOVERFLOW=y
 # CONFIG_DEBUG_STACK_USAGE is not set
 # CONFIG_4KSTACKS is not set
 # CONFIG_KGDB is not set
diff --git a/arch/sh/configs/se7206_defconfig b/arch/sh/configs/se7206_defconfig
new file mode 100644 (file)
index 0000000..36cec0b
--- /dev/null
@@ -0,0 +1,826 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.19-rc4
+# Sun Nov  5 16:20:10 2006
+#
+CONFIG_SUPERH=y
+CONFIG_RWSEM_GENERIC_SPINLOCK=y
+CONFIG_GENERIC_FIND_NEXT_BIT=y
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_HARDIRQS=y
+CONFIG_GENERIC_IRQ_PROBE=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+# CONFIG_GENERIC_TIME is not set
+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
+
+#
+# Code maturity level options
+#
+CONFIG_EXPERIMENTAL=y
+CONFIG_BROKEN_ON_SMP=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+
+#
+# General setup
+#
+CONFIG_LOCALVERSION=""
+# CONFIG_LOCALVERSION_AUTO is not set
+# CONFIG_SYSVIPC is not set
+# CONFIG_POSIX_MQUEUE is not set
+# CONFIG_BSD_PROCESS_ACCT is not set
+# CONFIG_TASKSTATS is not set
+# CONFIG_UTS_NS is not set
+# CONFIG_AUDIT is not set
+# CONFIG_IKCONFIG is not set
+# CONFIG_RELAY is not set
+CONFIG_INITRAMFS_SOURCE=""
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+CONFIG_SYSCTL=y
+CONFIG_EMBEDDED=y
+CONFIG_UID16=y
+# CONFIG_SYSCTL_SYSCALL is not set
+CONFIG_KALLSYMS=y
+# CONFIG_KALLSYMS_EXTRA_PASS is not set
+# CONFIG_HOTPLUG is not set
+CONFIG_PRINTK=y
+CONFIG_BUG=y
+CONFIG_ELF_CORE=y
+CONFIG_BASE_FULL=y
+# CONFIG_FUTEX is not set
+# CONFIG_EPOLL is not set
+CONFIG_SLAB=y
+CONFIG_VM_EVENT_COUNTERS=y
+CONFIG_TINY_SHMEM=y
+CONFIG_BASE_SMALL=0
+# CONFIG_SLOB is not set
+
+#
+# Loadable module support
+#
+# CONFIG_MODULES is not set
+
+#
+# Block layer
+#
+CONFIG_BLOCK=y
+# CONFIG_LBD is not set
+# CONFIG_LSF is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+# CONFIG_IOSCHED_AS is not set
+# CONFIG_IOSCHED_DEADLINE is not set
+# CONFIG_IOSCHED_CFQ is not set
+# CONFIG_DEFAULT_AS is not set
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+CONFIG_DEFAULT_NOOP=y
+CONFIG_DEFAULT_IOSCHED="noop"
+
+#
+# System type
+#
+# CONFIG_SH_SOLUTION_ENGINE is not set
+# CONFIG_SH_7751_SOLUTION_ENGINE is not set
+# CONFIG_SH_7300_SOLUTION_ENGINE is not set
+# CONFIG_SH_7343_SOLUTION_ENGINE is not set
+# CONFIG_SH_73180_SOLUTION_ENGINE is not set
+# CONFIG_SH_7751_SYSTEMH is not set
+# CONFIG_SH_HP6XX is not set
+# CONFIG_SH_EC3104 is not set
+# CONFIG_SH_SATURN is not set
+# CONFIG_SH_DREAMCAST is not set
+# CONFIG_SH_BIGSUR is not set
+# CONFIG_SH_MPC1211 is not set
+# CONFIG_SH_SH03 is not set
+# CONFIG_SH_SECUREEDGE5410 is not set
+# CONFIG_SH_HS7751RVOIP is not set
+# CONFIG_SH_7710VOIPGW is not set
+# CONFIG_SH_RTS7751R2D is not set
+# CONFIG_SH_R7780RP is not set
+# CONFIG_SH_EDOSK7705 is not set
+# CONFIG_SH_SH4202_MICRODEV is not set
+# CONFIG_SH_LANDISK is not set
+# CONFIG_SH_TITAN is not set
+# CONFIG_SH_SHMIN is not set
+CONFIG_SH_7206_SOLUTION_ENGINE=y
+# CONFIG_SH_7619_SOLUTION_ENGINE is not set
+# CONFIG_SH_UNKNOWN is not set
+
+#
+# Processor selection
+#
+CONFIG_CPU_SH2=y
+CONFIG_CPU_SH2A=y
+
+#
+# SH-2 Processor Support
+#
+# CONFIG_CPU_SUBTYPE_SH7604 is not set
+# CONFIG_CPU_SUBTYPE_SH7619 is not set
+
+#
+# SH-2A Processor Support
+#
+CONFIG_CPU_SUBTYPE_SH7206=y
+
+#
+# SH-3 Processor Support
+#
+# CONFIG_CPU_SUBTYPE_SH7300 is not set
+# CONFIG_CPU_SUBTYPE_SH7705 is not set
+# CONFIG_CPU_SUBTYPE_SH7706 is not set
+# CONFIG_CPU_SUBTYPE_SH7707 is not set
+# CONFIG_CPU_SUBTYPE_SH7708 is not set
+# CONFIG_CPU_SUBTYPE_SH7709 is not set
+# CONFIG_CPU_SUBTYPE_SH7710 is not set
+
+#
+# SH-4 Processor Support
+#
+# CONFIG_CPU_SUBTYPE_SH7750 is not set
+# CONFIG_CPU_SUBTYPE_SH7091 is not set
+# CONFIG_CPU_SUBTYPE_SH7750R is not set
+# CONFIG_CPU_SUBTYPE_SH7750S is not set
+# CONFIG_CPU_SUBTYPE_SH7751 is not set
+# CONFIG_CPU_SUBTYPE_SH7751R is not set
+# CONFIG_CPU_SUBTYPE_SH7760 is not set
+# CONFIG_CPU_SUBTYPE_SH4_202 is not set
+
+#
+# ST40 Processor Support
+#
+# CONFIG_CPU_SUBTYPE_ST40STB1 is not set
+# CONFIG_CPU_SUBTYPE_ST40GX1 is not set
+
+#
+# SH-4A Processor Support
+#
+# CONFIG_CPU_SUBTYPE_SH7770 is not set
+# CONFIG_CPU_SUBTYPE_SH7780 is not set
+
+#
+# SH4AL-DSP Processor Support
+#
+# CONFIG_CPU_SUBTYPE_SH73180 is not set
+# CONFIG_CPU_SUBTYPE_SH7343 is not set
+
+#
+# Memory management options
+#
+CONFIG_PAGE_OFFSET=0x00000000
+CONFIG_MEMORY_START=0x0c000000
+CONFIG_MEMORY_SIZE=0x02000000
+CONFIG_SELECT_MEMORY_MODEL=y
+CONFIG_FLATMEM_MANUAL=y
+# CONFIG_DISCONTIGMEM_MANUAL is not set
+# CONFIG_SPARSEMEM_MANUAL is not set
+CONFIG_FLATMEM=y
+CONFIG_FLAT_NODE_MEM_MAP=y
+# CONFIG_SPARSEMEM_STATIC is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4
+# CONFIG_RESOURCES_64BIT is not set
+
+#
+# Cache configuration
+#
+# CONFIG_SH_DIRECT_MAPPED is not set
+# CONFIG_SH_WRITETHROUGH is not set
+# CONFIG_SH_OCRAM is not set
+
+#
+# Processor features
+#
+# CONFIG_CPU_LITTLE_ENDIAN is not set
+# CONFIG_SH_FPU is not set
+# CONFIG_SH_FPU_EMU is not set
+# CONFIG_SH_DSP is not set
+
+#
+# Timer support
+#
+CONFIG_SH_CMT=y
+# CONFIG_SH_MTU2 is not set
+CONFIG_SH_PCLK_FREQ=33333333
+CONFIG_SH_CLK_MD=6
+
+#
+# CPU Frequency scaling
+#
+# CONFIG_CPU_FREQ is not set
+
+#
+# DMA support
+#
+# CONFIG_SH_DMA is not set
+
+#
+# Companion Chips
+#
+# CONFIG_HD6446X_SERIES is not set
+
+#
+# Kernel features
+#
+CONFIG_HZ_100=y
+# CONFIG_HZ_250 is not set
+# CONFIG_HZ_1000 is not set
+CONFIG_HZ=100
+# CONFIG_KEXEC is not set
+# CONFIG_SMP is not set
+CONFIG_PREEMPT_NONE=y
+# CONFIG_PREEMPT_VOLUNTARY is not set
+# CONFIG_PREEMPT is not set
+
+#
+# Boot options
+#
+CONFIG_ZERO_PAGE_OFFSET=0x00001000
+CONFIG_BOOT_LINK_OFFSET=0x00800000
+# CONFIG_UBC_WAKEUP is not set
+# CONFIG_CMDLINE_BOOL is not set
+
+#
+# Bus options
+#
+# CONFIG_PCI is not set
+
+#
+# PCCARD (PCMCIA/CardBus) support
+#
+
+#
+# PCI Hotplug Support
+#
+
+#
+# Executable file formats
+#
+CONFIG_BINFMT_FLAT=y
+CONFIG_BINFMT_ZFLAT=y
+# CONFIG_BINFMT_SHARED_FLAT is not set
+# CONFIG_BINFMT_MISC is not set
+
+#
+# Power management options (EXPERIMENTAL)
+#
+# CONFIG_PM is not set
+
+#
+# Networking
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+# CONFIG_NETDEBUG is not set
+# CONFIG_PACKET is not set
+# CONFIG_UNIX is not set
+CONFIG_XFRM=y
+# CONFIG_XFRM_USER is not set
+# CONFIG_XFRM_SUB_POLICY is not set
+# CONFIG_NET_KEY is not set
+CONFIG_INET=y
+# CONFIG_IP_MULTICAST is not set
+# CONFIG_IP_ADVANCED_ROUTER is not set
+CONFIG_IP_FIB_HASH=y
+# CONFIG_IP_PNP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE is not set
+# CONFIG_ARPD is not set
+# CONFIG_SYN_COOKIES is not set
+# CONFIG_INET_AH is not set
+# CONFIG_INET_ESP is not set
+# CONFIG_INET_IPCOMP is not set
+# CONFIG_INET_XFRM_TUNNEL is not set
+# CONFIG_INET_TUNNEL is not set
+CONFIG_INET_XFRM_MODE_TRANSPORT=y
+CONFIG_INET_XFRM_MODE_TUNNEL=y
+CONFIG_INET_XFRM_MODE_BEET=y
+# CONFIG_INET_DIAG is not set
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_IPV6 is not set
+# CONFIG_INET6_XFRM_TUNNEL is not set
+# CONFIG_INET6_TUNNEL is not set
+# CONFIG_NETWORK_SECMARK is not set
+# CONFIG_NETFILTER is not set
+
+#
+# DCCP Configuration (EXPERIMENTAL)
+#
+# CONFIG_IP_DCCP is not set
+
+#
+# SCTP Configuration (EXPERIMENTAL)
+#
+# CONFIG_IP_SCTP is not set
+
+#
+# TIPC Configuration (EXPERIMENTAL)
+#
+# CONFIG_TIPC is not set
+# CONFIG_ATM is not set
+# CONFIG_BRIDGE is not set
+# CONFIG_VLAN_8021Q is not set
+# CONFIG_DECNET is not set
+# CONFIG_LLC2 is not set
+# CONFIG_IPX is not set
+# CONFIG_ATALK is not set
+# CONFIG_X25 is not set
+# CONFIG_LAPB is not set
+# CONFIG_ECONET is not set
+# CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
+# CONFIG_NET_SCHED is not set
+
+#
+# Network testing
+#
+# CONFIG_NET_PKTGEN is not set
+# CONFIG_HAMRADIO is not set
+# CONFIG_IRDA is not set
+# CONFIG_BT is not set
+# CONFIG_IEEE80211 is not set
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+# CONFIG_STANDALONE is not set
+# CONFIG_PREVENT_FIRMWARE_BUILD is not set
+# CONFIG_SYS_HYPERVISOR is not set
+
+#
+# Connector - unified userspace <-> kernelspace linker
+#
+# CONFIG_CONNECTOR is not set
+
+#
+# Memory Technology Devices (MTD)
+#
+CONFIG_MTD=y
+# CONFIG_MTD_DEBUG is not set
+# CONFIG_MTD_CONCAT is not set
+CONFIG_MTD_PARTITIONS=y
+CONFIG_MTD_REDBOOT_PARTS=y
+CONFIG_MTD_REDBOOT_DIRECTORY_BLOCK=-1
+# CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED is not set
+# CONFIG_MTD_REDBOOT_PARTS_READONLY is not set
+# CONFIG_MTD_CMDLINE_PARTS is not set
+
+#
+# User Modules And Translation Layers
+#
+CONFIG_MTD_CHAR=y
+CONFIG_MTD_BLOCK=y
+# CONFIG_FTL is not set
+# CONFIG_NFTL is not set
+# CONFIG_INFTL is not set
+# CONFIG_RFD_FTL is not set
+# CONFIG_SSFDC is not set
+
+#
+# RAM/ROM/Flash chip drivers
+#
+CONFIG_MTD_CFI=y
+# CONFIG_MTD_JEDECPROBE is not set
+CONFIG_MTD_GEN_PROBE=y
+# CONFIG_MTD_CFI_ADV_OPTIONS is not set
+CONFIG_MTD_MAP_BANK_WIDTH_1=y
+CONFIG_MTD_MAP_BANK_WIDTH_2=y
+CONFIG_MTD_MAP_BANK_WIDTH_4=y
+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
+CONFIG_MTD_CFI_I1=y
+CONFIG_MTD_CFI_I2=y
+# CONFIG_MTD_CFI_I4 is not set
+# CONFIG_MTD_CFI_I8 is not set
+# CONFIG_MTD_CFI_INTELEXT is not set
+CONFIG_MTD_CFI_AMDSTD=y
+# CONFIG_MTD_CFI_STAA is not set
+CONFIG_MTD_CFI_UTIL=y
+# CONFIG_MTD_RAM is not set
+# CONFIG_MTD_ROM is not set
+# CONFIG_MTD_ABSENT is not set
+# CONFIG_MTD_OBSOLETE_CHIPS is not set
+
+#
+# Mapping drivers for chip access
+#
+# CONFIG_MTD_COMPLEX_MAPPINGS is not set
+CONFIG_MTD_PHYSMAP=y
+CONFIG_MTD_PHYSMAP_START=0x20000000
+CONFIG_MTD_PHYSMAP_LEN=0x1000000
+CONFIG_MTD_PHYSMAP_BANKWIDTH=4
+# CONFIG_MTD_SOLUTIONENGINE is not set
+# CONFIG_MTD_UCLINUX is not set
+# CONFIG_MTD_PLATRAM is not set
+
+#
+# Self-contained MTD device drivers
+#
+# CONFIG_MTD_SLRAM is not set
+# CONFIG_MTD_PHRAM is not set
+# CONFIG_MTD_MTDRAM is not set
+# CONFIG_MTD_BLOCK2MTD is not set
+
+#
+# Disk-On-Chip Device Drivers
+#
+# CONFIG_MTD_DOC2000 is not set
+# CONFIG_MTD_DOC2001 is not set
+# CONFIG_MTD_DOC2001PLUS is not set
+
+#
+# NAND Flash Device Drivers
+#
+# CONFIG_MTD_NAND is not set
+
+#
+# OneNAND Flash Device Drivers
+#
+# CONFIG_MTD_ONENAND is not set
+
+#
+# Parallel port support
+#
+# CONFIG_PARPORT is not set
+
+#
+# Plug and Play support
+#
+
+#
+# Block devices
+#
+# CONFIG_BLK_DEV_COW_COMMON is not set
+# CONFIG_BLK_DEV_LOOP is not set
+# CONFIG_BLK_DEV_NBD is not set
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_COUNT=16
+CONFIG_BLK_DEV_RAM_SIZE=4096
+CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
+# CONFIG_BLK_DEV_INITRD is not set
+# CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
+
+#
+# Misc devices
+#
+# CONFIG_TIFM_CORE is not set
+
+#
+# ATA/ATAPI/MFM/RLL support
+#
+# CONFIG_IDE is not set
+
+#
+# SCSI device support
+#
+# CONFIG_RAID_ATTRS is not set
+# CONFIG_SCSI is not set
+# CONFIG_SCSI_NETLINK is not set
+
+#
+# Serial ATA (prod) and Parallel ATA (experimental) drivers
+#
+# CONFIG_ATA is not set
+
+#
+# Multi-device support (RAID and LVM)
+#
+# CONFIG_MD is not set
+
+#
+# Fusion MPT device support
+#
+# CONFIG_FUSION is not set
+
+#
+# IEEE 1394 (FireWire) support
+#
+
+#
+# I2O device support
+#
+
+#
+# Network device support
+#
+# CONFIG_NETDEVICES is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
+
+#
+# ISDN subsystem
+#
+# CONFIG_ISDN is not set
+
+#
+# Telephony Support
+#
+# CONFIG_PHONE is not set
+
+#
+# Input device support
+#
+# CONFIG_INPUT is not set
+
+#
+# Hardware I/O ports
+#
+# CONFIG_SERIO is not set
+# CONFIG_GAMEPORT is not set
+
+#
+# Character devices
+#
+# CONFIG_VT is not set
+# CONFIG_SERIAL_NONSTANDARD is not set
+
+#
+# Serial drivers
+#
+# CONFIG_SERIAL_8250 is not set
+
+#
+# Non-8250 serial port support
+#
+CONFIG_SERIAL_SH_SCI=y
+CONFIG_SERIAL_SH_SCI_NR_UARTS=4
+CONFIG_SERIAL_SH_SCI_CONSOLE=y
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+# CONFIG_UNIX98_PTYS is not set
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
+
+#
+# IPMI
+#
+# CONFIG_IPMI_HANDLER is not set
+
+#
+# Watchdog Cards
+#
+# CONFIG_WATCHDOG is not set
+CONFIG_HW_RANDOM=y
+# CONFIG_GEN_RTC is not set
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+
+#
+# Ftape, the floppy tape device driver
+#
+# CONFIG_RAW_DRIVER is not set
+
+#
+# TPM devices
+#
+# CONFIG_TCG_TPM is not set
+
+#
+# I2C support
+#
+# CONFIG_I2C is not set
+
+#
+# SPI support
+#
+# CONFIG_SPI is not set
+# CONFIG_SPI_MASTER is not set
+
+#
+# Dallas's 1-wire bus
+#
+# CONFIG_W1 is not set
+
+#
+# Hardware Monitoring support
+#
+CONFIG_HWMON=y
+# CONFIG_HWMON_VID is not set
+# CONFIG_SENSORS_ABITUGURU is not set
+# CONFIG_SENSORS_F71805F is not set
+# CONFIG_SENSORS_VT1211 is not set
+# CONFIG_HWMON_DEBUG_CHIP is not set
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+
+#
+# Digital Video Broadcasting Devices
+#
+# CONFIG_DVB is not set
+
+#
+# Graphics support
+#
+CONFIG_FIRMWARE_EDID=y
+# CONFIG_FB is not set
+
+#
+# Sound
+#
+# CONFIG_SOUND is not set
+
+#
+# USB support
+#
+# CONFIG_USB_ARCH_HAS_HCD is not set
+# CONFIG_USB_ARCH_HAS_OHCI is not set
+# CONFIG_USB_ARCH_HAS_EHCI is not set
+
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
+#
+# USB Gadget Support
+#
+# CONFIG_USB_GADGET is not set
+
+#
+# MMC/SD Card support
+#
+# CONFIG_MMC is not set
+
+#
+# LED devices
+#
+# CONFIG_NEW_LEDS is not set
+
+#
+# LED drivers
+#
+
+#
+# LED Triggers
+#
+
+#
+# InfiniBand support
+#
+
+#
+# EDAC - error detection and reporting (RAS) (EXPERIMENTAL)
+#
+
+#
+# Real Time Clock
+#
+# CONFIG_RTC_CLASS is not set
+
+#
+# DMA Engine support
+#
+# CONFIG_DMA_ENGINE is not set
+
+#
+# DMA Clients
+#
+
+#
+# DMA Devices
+#
+
+#
+# File systems
+#
+CONFIG_EXT2_FS=y
+# CONFIG_EXT2_FS_XATTR is not set
+# CONFIG_EXT3_FS is not set
+# CONFIG_EXT4DEV_FS is not set
+# CONFIG_REISERFS_FS is not set
+# CONFIG_JFS_FS is not set
+# CONFIG_FS_POSIX_ACL is not set
+# CONFIG_XFS_FS is not set
+# CONFIG_GFS2_FS is not set
+# CONFIG_MINIX_FS is not set
+CONFIG_ROMFS_FS=y
+# CONFIG_INOTIFY is not set
+# CONFIG_QUOTA is not set
+# CONFIG_DNOTIFY is not set
+# CONFIG_AUTOFS_FS is not set
+# CONFIG_AUTOFS4_FS is not set
+# CONFIG_FUSE_FS is not set
+
+#
+# CD-ROM/DVD Filesystems
+#
+# CONFIG_ISO9660_FS is not set
+# CONFIG_UDF_FS is not set
+
+#
+# DOS/FAT/NT Filesystems
+#
+# CONFIG_MSDOS_FS is not set
+# CONFIG_VFAT_FS is not set
+# CONFIG_NTFS_FS is not set
+
+#
+# Pseudo filesystems
+#
+CONFIG_PROC_FS=y
+CONFIG_PROC_SYSCTL=y
+# CONFIG_SYSFS is not set
+# CONFIG_TMPFS is not set
+# CONFIG_HUGETLBFS is not set
+# CONFIG_HUGETLB_PAGE is not set
+CONFIG_RAMFS=y
+
+#
+# Miscellaneous filesystems
+#
+# CONFIG_ADFS_FS is not set
+# CONFIG_AFFS_FS is not set
+# CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
+# CONFIG_BEFS_FS is not set
+# CONFIG_BFS_FS is not set
+# CONFIG_EFS_FS is not set
+# CONFIG_JFFS_FS is not set
+# CONFIG_JFFS2_FS is not set
+CONFIG_CRAMFS=y
+# CONFIG_VXFS_FS is not set
+# CONFIG_HPFS_FS is not set
+# CONFIG_QNX4FS_FS is not set
+# CONFIG_SYSV_FS is not set
+# CONFIG_UFS_FS is not set
+
+#
+# Network File Systems
+#
+# CONFIG_NFS_FS is not set
+# CONFIG_NFSD is not set
+# CONFIG_SMB_FS is not set
+# CONFIG_CIFS is not set
+# CONFIG_NCP_FS is not set
+# CONFIG_CODA_FS is not set
+# CONFIG_AFS_FS is not set
+# CONFIG_9P_FS is not set
+
+#
+# Partition Types
+#
+# CONFIG_PARTITION_ADVANCED is not set
+CONFIG_MSDOS_PARTITION=y
+
+#
+# Native Language Support
+#
+# CONFIG_NLS is not set
+
+#
+# Profiling support
+#
+# CONFIG_PROFILING is not set
+
+#
+# Kernel hacking
+#
+# CONFIG_PRINTK_TIME is not set
+CONFIG_ENABLE_MUST_CHECK=y
+# CONFIG_MAGIC_SYSRQ is not set
+# CONFIG_UNUSED_SYMBOLS is not set
+# CONFIG_DEBUG_KERNEL is not set
+CONFIG_LOG_BUF_SHIFT=14
+# CONFIG_DEBUG_BUGVERBOSE is not set
+# CONFIG_UNWIND_INFO is not set
+# CONFIG_HEADERS_CHECK is not set
+# CONFIG_SH_STANDARD_BIOS is not set
+# CONFIG_EARLY_SCIF_CONSOLE is not set
+# CONFIG_KGDB is not set
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+
+#
+# Cryptographic options
+#
+# CONFIG_CRYPTO is not set
+
+#
+# Library routines
+#
+CONFIG_CRC_CCITT=y
+# CONFIG_CRC16 is not set
+CONFIG_CRC32=y
+# CONFIG_LIBCRC32C is not set
+CONFIG_ZLIB_INFLATE=y
diff --git a/arch/sh/drivers/Kconfig b/arch/sh/drivers/Kconfig
new file mode 100644 (file)
index 0000000..c54c758
--- /dev/null
@@ -0,0 +1,9 @@
+menu "Additional SuperH Device Drivers"
+
+config PUSH_SWITCH
+       tristate "Push switch support"
+       help
+         This enables support for the push switch framework, a simple
+         framework that allows for sysfs driven switch status reporting.
+
+endmenu
index 338c3729d2705095a338743e2cb6b5528275dbd2..bf18dbfb6787db618d339e082b08bd0a8d6e2713 100644 (file)
@@ -5,4 +5,4 @@
 obj-$(CONFIG_PCI)              += pci/
 obj-$(CONFIG_SH_DMA)           += dma/
 obj-$(CONFIG_SUPERHYWAY)       += superhyway/
-
+obj-$(CONFIG_PUSH_SWITCH)      += push-switch.o
index 065d4c90970ea51956d0e67c9a02d11315c4213e..db1295d32268b51fdd393227bac89a0347004696 100644 (file)
@@ -2,8 +2,8 @@
 # Makefile for the SuperH DMA specific kernel interface routines under Linux.
 #
 
-obj-y                          += dma-api.o dma-isa.o
+obj-y                          += dma-api.o
+obj-$(CONFIG_ISA_DMA_API)      += dma-isa.o
 obj-$(CONFIG_SYSFS)            += dma-sysfs.o
 obj-$(CONFIG_SH_DMA)           += dma-sh.o
 obj-$(CONFIG_SH_DREAMCAST)     += dma-pvr2.o dma-g2.o
-
index 47c3e837599b755c90a57d246dfe9f68c606635c..e062067edd243fac0e2bdacd12ee3fdf1600fdfc 100644 (file)
  */
 #include <linux/init.h>
 #include <linux/module.h>
-#include <linux/interrupt.h>
 #include <linux/spinlock.h>
 #include <linux/proc_fs.h>
 #include <linux/list.h>
 #include <linux/platform_device.h>
+#include <linux/mm.h>
 #include <asm/dma.h>
 
 DEFINE_SPINLOCK(dma_spin_lock);
 static LIST_HEAD(registered_dmac_list);
 
-/*
- * A brief note about the reasons for this API as it stands.
- *
- * For starters, the old ISA DMA API didn't work for us for a number of
- * reasons, for one, the vast majority of channels on the SH DMAC are
- * dual-address mode only, and both the new and the old DMA APIs are after the
- * concept of managing a DMA buffer, which doesn't overly fit this model very
- * well. In addition to which, the new API is largely geared at IOMMUs and
- * GARTs, and doesn't even support the channel notion very well.
- *
- * The other thing that's a marginal issue, is the sheer number of random DMA
- * engines that are present (ie, in boards like the Dreamcast), some of which
- * cascade off of the SH DMAC, and others do not. As such, there was a real
- * need for a scalable subsystem that could deal with both single and
- * dual-address mode usage, in addition to interoperating with cascaded DMACs.
- *
- * There really isn't any reason why this needs to be SH specific, though I'm
- * not aware of too many other processors (with the exception of some MIPS)
- * that have the same concept of a dual address mode, or any real desire to
- * actually make use of the DMAC even if such a subsystem were exposed
- * elsewhere.
- *
- * The idea for this was derived from the ARM port, which acted as an excellent
- * reference when trying to address these issues.
- *
- * It should also be noted that the decision to add Yet Another DMA API(tm) to
- * the kernel wasn't made easily, and was only decided upon after conferring
- * with jejb with regards to the state of the old and new APIs as they applied
- * to these circumstances. Philip Blundell was also a great help in figuring
- * out some single-address mode DMA semantics that were otherwise rather
- * confusing.
- */
-
 struct dma_info *get_dma_info(unsigned int chan)
 {
        struct dma_info *info;
-       unsigned int total = 0;
 
        /*
         * Look for each DMAC's range to determine who the owner of
         * the channel is.
         */
        list_for_each_entry(info, &registered_dmac_list, list) {
-               total += info->nr_channels;
-               if (chan > total)
+               if ((chan <  info->first_channel_nr) ||
+                   (chan >= info->first_channel_nr + info->nr_channels))
                        continue;
 
                return info;
@@ -73,6 +39,22 @@ struct dma_info *get_dma_info(unsigned int chan)
 
        return NULL;
 }
+EXPORT_SYMBOL(get_dma_info);
+
+struct dma_info *get_dma_info_by_name(const char *dmac_name)
+{
+       struct dma_info *info;
+
+       list_for_each_entry(info, &registered_dmac_list, list) {
+               if (dmac_name && (strcmp(dmac_name, info->name) != 0))
+                       continue;
+               else
+                       return info;
+       }
+
+       return NULL;
+}
+EXPORT_SYMBOL(get_dma_info_by_name);
 
 static unsigned int get_nr_channels(void)
 {
@@ -91,63 +73,161 @@ static unsigned int get_nr_channels(void)
 struct dma_channel *get_dma_channel(unsigned int chan)
 {
        struct dma_info *info = get_dma_info(chan);
+       struct dma_channel *channel;
+       int i;
 
-       if (!info)
+       if (unlikely(!info))
                return ERR_PTR(-EINVAL);
 
-       return info->channels + chan;
+       for (i = 0; i < info->nr_channels; i++) {
+               channel = &info->channels[i];
+               if (channel->chan == chan)
+                       return channel;
+       }
+
+       return NULL;
 }
+EXPORT_SYMBOL(get_dma_channel);
 
 int get_dma_residue(unsigned int chan)
 {
        struct dma_info *info = get_dma_info(chan);
-       struct dma_channel *channel = &info->channels[chan];
+       struct dma_channel *channel = get_dma_channel(chan);
 
        if (info->ops->get_residue)
                return info->ops->get_residue(channel);
 
        return 0;
 }
+EXPORT_SYMBOL(get_dma_residue);
 
-int request_dma(unsigned int chan, const char *dev_id)
+static int search_cap(const char **haystack, const char *needle)
 {
-       struct dma_info *info = get_dma_info(chan);
-       struct dma_channel *channel = &info->channels[chan];
+       const char **p;
+
+       for (p = haystack; *p; p++)
+               if (strcmp(*p, needle) == 0)
+                       return 1;
+
+       return 0;
+}
+
+/**
+ * request_dma_bycap - Allocate a DMA channel based on its capabilities
+ * @dmac: List of DMA controllers to search
+ * @caps: List of capabilites
+ *
+ * Search all channels of all DMA controllers to find a channel which
+ * matches the requested capabilities. The result is the channel
+ * number if a match is found, or %-ENODEV if no match is found.
+ *
+ * Note that not all DMA controllers export capabilities, in which
+ * case they can never be allocated using this API, and so
+ * request_dma() must be used specifying the channel number.
+ */
+int request_dma_bycap(const char **dmac, const char **caps, const char *dev_id)
+{
+       unsigned int found = 0;
+       struct dma_info *info;
+       const char **p;
+       int i;
+
+       BUG_ON(!dmac || !caps);
+
+       list_for_each_entry(info, &registered_dmac_list, list)
+               if (strcmp(*dmac, info->name) == 0) {
+                       found = 1;
+                       break;
+               }
+
+       if (!found)
+               return -ENODEV;
+
+       for (i = 0; i < info->nr_channels; i++) {
+               struct dma_channel *channel = &info->channels[i];
+
+               if (unlikely(!channel->caps))
+                       continue;
+
+               for (p = caps; *p; p++) {
+                       if (!search_cap(channel->caps, *p))
+                               break;
+                       if (request_dma(channel->chan, dev_id) == 0)
+                               return channel->chan;
+               }
+       }
+
+       return -EINVAL;
+}
+EXPORT_SYMBOL(request_dma_bycap);
+
+int dmac_search_free_channel(const char *dev_id)
+{
+       struct dma_channel *channel = { 0 };
+       struct dma_info *info = get_dma_info(0);
+       int i;
+
+       for (i = 0; i < info->nr_channels; i++) {
+               channel = &info->channels[i];
+               if (unlikely(!channel))
+                       return -ENODEV;
+
+               if (atomic_read(&channel->busy) == 0)
+                       break;
+       }
 
-       down(&channel->sem);
+       if (info->ops->request) {
+               int result = info->ops->request(channel);
+               if (result)
+                       return result;
 
-       if (!info->ops || chan >= MAX_DMA_CHANNELS) {
-               up(&channel->sem);
-               return -EINVAL;
+               atomic_set(&channel->busy, 1);
+               return channel->chan;
        }
 
-       atomic_set(&channel->busy, 1);
+       return -ENOSYS;
+}
+
+int request_dma(unsigned int chan, const char *dev_id)
+{
+       struct dma_channel *channel = { 0 };
+       struct dma_info *info = get_dma_info(chan);
+       int result;
+
+       channel = get_dma_channel(chan);
+       if (atomic_xchg(&channel->busy, 1))
+               return -EBUSY;
 
        strlcpy(channel->dev_id, dev_id, sizeof(channel->dev_id));
 
-       up(&channel->sem);
+       if (info->ops->request) {
+               result = info->ops->request(channel);
+               if (result)
+                       atomic_set(&channel->busy, 0);
 
-       if (info->ops->request)
-               return info->ops->request(channel);
+               return result;
+       }
 
        return 0;
 }
+EXPORT_SYMBOL(request_dma);
 
 void free_dma(unsigned int chan)
 {
        struct dma_info *info = get_dma_info(chan);
-       struct dma_channel *channel = &info->channels[chan];
+       struct dma_channel *channel = get_dma_channel(chan);
 
        if (info->ops->free)
                info->ops->free(channel);
 
        atomic_set(&channel->busy, 0);
 }
+EXPORT_SYMBOL(free_dma);
 
 void dma_wait_for_completion(unsigned int chan)
 {
        struct dma_info *info = get_dma_info(chan);
-       struct dma_channel *channel = &info->channels[chan];
+       struct dma_channel *channel = get_dma_channel(chan);
 
        if (channel->flags & DMA_TEI_CAPABLE) {
                wait_event(channel->wait_queue,
@@ -158,21 +238,52 @@ void dma_wait_for_completion(unsigned int chan)
        while (info->ops->get_residue(channel))
                cpu_relax();
 }
+EXPORT_SYMBOL(dma_wait_for_completion);
+
+int register_chan_caps(const char *dmac, struct dma_chan_caps *caps)
+{
+       struct dma_info *info;
+       unsigned int found = 0;
+       int i;
+
+       list_for_each_entry(info, &registered_dmac_list, list)
+               if (strcmp(dmac, info->name) == 0) {
+                       found = 1;
+                       break;
+               }
+
+       if (unlikely(!found))
+               return -ENODEV;
+
+       for (i = 0; i < info->nr_channels; i++, caps++) {
+               struct dma_channel *channel;
+
+               if ((info->first_channel_nr + i) != caps->ch_num)
+                       return -EINVAL;
+
+               channel = &info->channels[i];
+               channel->caps = caps->caplist;
+       }
+
+       return 0;
+}
+EXPORT_SYMBOL(register_chan_caps);
 
 void dma_configure_channel(unsigned int chan, unsigned long flags)
 {
        struct dma_info *info = get_dma_info(chan);
-       struct dma_channel *channel = &info->channels[chan];
+       struct dma_channel *channel = get_dma_channel(chan);
 
        if (info->ops->configure)
                info->ops->configure(channel, flags);
 }
+EXPORT_SYMBOL(dma_configure_channel);
 
 int dma_xfer(unsigned int chan, unsigned long from,
             unsigned long to, size_t size, unsigned int mode)
 {
        struct dma_info *info = get_dma_info(chan);
-       struct dma_channel *channel = &info->channels[chan];
+       struct dma_channel *channel = get_dma_channel(chan);
 
        channel->sar    = from;
        channel->dar    = to;
@@ -181,8 +292,20 @@ int dma_xfer(unsigned int chan, unsigned long from,
 
        return info->ops->xfer(channel);
 }
+EXPORT_SYMBOL(dma_xfer);
+
+int dma_extend(unsigned int chan, unsigned long op, void *param)
+{
+       struct dma_info *info = get_dma_info(chan);
+       struct dma_channel *channel = get_dma_channel(chan);
+
+       if (info->ops->extend)
+               return info->ops->extend(channel, op, param);
+
+       return -ENOSYS;
+}
+EXPORT_SYMBOL(dma_extend);
 
-#ifdef CONFIG_PROC_FS
 static int dma_read_proc(char *buf, char **start, off_t off,
                         int len, int *eof, void *data)
 {
@@ -214,8 +337,6 @@ static int dma_read_proc(char *buf, char **start, off_t off,
 
        return p - buf;
 }
-#endif
-
 
 int register_dmac(struct dma_info *info)
 {
@@ -224,8 +345,7 @@ int register_dmac(struct dma_info *info)
        INIT_LIST_HEAD(&info->list);
 
        printk(KERN_INFO "DMA: Registering %s handler (%d channel%s).\n",
-              info->name, info->nr_channels,
-              info->nr_channels > 1 ? "s" : "");
+              info->name, info->nr_channels, info->nr_channels > 1 ? "s" : "");
 
        BUG_ON((info->flags & DMAC_CHANNELS_CONFIGURED) && !info->channels);
 
@@ -242,28 +362,26 @@ int register_dmac(struct dma_info *info)
 
                size = sizeof(struct dma_channel) * info->nr_channels;
 
-               info->channels = kmalloc(size, GFP_KERNEL);
+               info->channels = kzalloc(size, GFP_KERNEL);
                if (!info->channels)
                        return -ENOMEM;
-
-               memset(info->channels, 0, size);
        }
 
        total_channels = get_nr_channels();
        for (i = 0; i < info->nr_channels; i++) {
-               struct dma_channel *chan = info->channels + i;
+               struct dma_channel *chan = &info->channels[i];
+
+               atomic_set(&chan->busy, 0);
 
-               chan->chan = i;
-               chan->vchan = i + total_channels;
+               chan->chan  = info->first_channel_nr + i;
+               chan->vchan = info->first_channel_nr + i + total_channels;
 
                memcpy(chan->dev_id, "Unused", 7);
 
                if (info->flags & DMAC_CHANNELS_TEI_CAPABLE)
                        chan->flags |= DMA_TEI_CAPABLE;
 
-               init_MUTEX(&chan->sem);
                init_waitqueue_head(&chan->wait_queue);
-
                dma_create_sysfs_files(chan, info);
        }
 
@@ -271,6 +389,7 @@ int register_dmac(struct dma_info *info)
 
        return 0;
 }
+EXPORT_SYMBOL(register_dmac);
 
 void unregister_dmac(struct dma_info *info)
 {
@@ -285,31 +404,16 @@ void unregister_dmac(struct dma_info *info)
        list_del(&info->list);
        platform_device_unregister(info->pdev);
 }
+EXPORT_SYMBOL(unregister_dmac);
 
 static int __init dma_api_init(void)
 {
-       printk("DMA: Registering DMA API.\n");
-
-#ifdef CONFIG_PROC_FS
+       printk(KERN_NOTICE "DMA: Registering DMA API.\n");
        create_proc_read_entry("dma", 0, 0, dma_read_proc, 0);
-#endif
-
        return 0;
 }
-
 subsys_initcall(dma_api_init);
 
 MODULE_AUTHOR("Paul Mundt <lethal@linux-sh.org>");
 MODULE_DESCRIPTION("DMA API for SuperH");
 MODULE_LICENSE("GPL");
-
-EXPORT_SYMBOL(request_dma);
-EXPORT_SYMBOL(free_dma);
-EXPORT_SYMBOL(register_dmac);
-EXPORT_SYMBOL(get_dma_residue);
-EXPORT_SYMBOL(get_dma_info);
-EXPORT_SYMBOL(get_dma_channel);
-EXPORT_SYMBOL(dma_xfer);
-EXPORT_SYMBOL(dma_wait_for_completion);
-EXPORT_SYMBOL(dma_configure_channel);
-
index 66078601335009804e06213b82bef57a324b4765..f63721ed86c273fc20864fe107e0877e88d3b65c 100644 (file)
@@ -94,20 +94,13 @@ static int sh_dmac_request_dma(struct dma_channel *chan)
        if (unlikely(!chan->flags & DMA_TEI_CAPABLE))
                return 0;
 
-       chan->name = kzalloc(32, GFP_KERNEL);
-       if (unlikely(chan->name == NULL))
-               return -ENOMEM;
-       snprintf(chan->name, 32, "DMAC Transfer End (Channel %d)",
-                chan->chan);
-
        return request_irq(get_dmte_irq(chan->chan), dma_tei,
-                          IRQF_DISABLED, chan->name, chan);
+                          IRQF_DISABLED, chan->dev_id, chan);
 }
 
 static void sh_dmac_free_dma(struct dma_channel *chan)
 {
        free_irq(get_dmte_irq(chan->chan), chan);
-       kfree(chan->name);
 }
 
 static void
index 29b8ef9873d19128f27c150275e8705b2d7357c5..eebcd4768bbf01a12ecbfd2cd6b06b0e60f3c5d8 100644 (file)
@@ -3,7 +3,7 @@
  *
  * sysfs interface for SH DMA API
  *
- * Copyright (C) 2004, 2005  Paul Mundt
+ * Copyright (C) 2004 - 2006  Paul Mundt
  *
  * This file is subject to the terms and conditions of the GNU General Public
  * License.  See the file "COPYING" in the main directory of this archive
@@ -21,7 +21,6 @@
 static struct sysdev_class dma_sysclass = {
        set_kset_name("dma"),
 };
-
 EXPORT_SYMBOL(dma_sysclass);
 
 static ssize_t dma_show_devices(struct sys_device *dev, char *buf)
@@ -31,7 +30,10 @@ static ssize_t dma_show_devices(struct sys_device *dev, char *buf)
 
        for (i = 0; i < MAX_DMA_CHANNELS; i++) {
                struct dma_info *info = get_dma_info(i);
-               struct dma_channel *channel = &info->channels[i];
+               struct dma_channel *channel = get_dma_channel(i);
+
+               if (unlikely(!info) || !channel)
+                       continue;
 
                len += sprintf(buf + len, "%2d: %14s    %s\n",
                               channel->chan, info->name,
@@ -125,11 +127,16 @@ int dma_create_sysfs_files(struct dma_channel *chan, struct dma_info *info)
        if (ret)
                return ret;
 
-       sysdev_create_file(dev, &attr_dev_id);
-       sysdev_create_file(dev, &attr_count);
-       sysdev_create_file(dev, &attr_mode);
-       sysdev_create_file(dev, &attr_flags);
-       sysdev_create_file(dev, &attr_config);
+       ret |= sysdev_create_file(dev, &attr_dev_id);
+       ret |= sysdev_create_file(dev, &attr_count);
+       ret |= sysdev_create_file(dev, &attr_mode);
+       ret |= sysdev_create_file(dev, &attr_flags);
+       ret |= sysdev_create_file(dev, &attr_config);
+
+       if (unlikely(ret)) {
+               dev_err(&info->pdev->dev, "Failed creating attrs\n");
+               return ret;
+       }
 
        snprintf(name, sizeof(name), "dma%d", chan->chan);
        return sysfs_create_link(&info->pdev->dev.kobj, &dev->kobj, name);
index cd56d53375e7dc806c32c31cd2851058a622985b..ac8ee2312cd8935b3f8e53e0ef07d0592d866edd 100644 (file)
 #include <linux/types.h>
 #include <linux/init.h>
 #include <linux/pci.h>
-#include <asm/io.h>
+#include <linux/io.h>
 #include <asm/titan.h>
 #include "pci-sh4.h"
 
+static char titan_irq_tab[] __initdata = {
+       TITAN_IRQ_WAN,
+       TITAN_IRQ_LAN,
+       TITAN_IRQ_MPCIA,
+       TITAN_IRQ_MPCIB,
+       TITAN_IRQ_USB,
+};
+
 int __init pcibios_map_platform_irq(struct pci_dev *pdev, u8 slot, u8 pin)
 {
-       int irq = -1;
-
-       switch (slot) {
-       case 0: irq = TITAN_IRQ_WAN;   break;   /* eth0 (WAN) */
-       case 1: irq = TITAN_IRQ_LAN;   break;   /* eth1 (LAN) */
-       case 2: irq = TITAN_IRQ_MPCIA; break;   /* mPCI A */
-       case 3: irq = TITAN_IRQ_MPCIB; break;   /* mPCI B */
-       case 4: irq = TITAN_IRQ_USB;   break;   /* USB */
-       default:
-               printk(KERN_INFO "PCI: Bad IRQ mapping "
-                                "request for slot %d\n", slot);
-               return -1;
-       }
+       int irq = titan_irq_tab[slot];
 
        printk("PCI: Mapping TITAN IRQ for slot %d, pin %c to irq %d\n",
                slot, pin - 1 + 'A', irq);
index d6e635296534201965be4c9ce72a806a154b3597..602b644c35ad66c8f84fe44d5e1365cb4b261457 100644 (file)
 #include <linux/delay.h>
 #include "pci-sh4.h"
 
+#define INTC_BASE      0xffd00000
+#define INTC_ICR0      (INTC_BASE+0x0)
+#define INTC_ICR1      (INTC_BASE+0x1c)
+#define INTC_INTPRI    (INTC_BASE+0x10)
+#define INTC_INTREQ    (INTC_BASE+0x24)
+#define INTC_INTMSK0   (INTC_BASE+0x44)
+#define INTC_INTMSK1   (INTC_BASE+0x48)
+#define INTC_INTMSK2   (INTC_BASE+0x40080)
+#define INTC_INTMSKCLR0        (INTC_BASE+0x64)
+#define INTC_INTMSKCLR1        (INTC_BASE+0x68)
+#define INTC_INTMSKCLR2        (INTC_BASE+0x40084)
+#define INTC_INT2MSKR  (INTC_BASE+0x40038)
+#define INTC_INT2MSKCR (INTC_BASE+0x4003c)
+
 /*
  * Initialization. Try all known PCI access methods. Note that we support
  * using both PCI BIOS and direct access: in such cases, we use I/O ports
diff --git a/arch/sh/drivers/push-switch.c b/arch/sh/drivers/push-switch.c
new file mode 100644 (file)
index 0000000..f2b9157
--- /dev/null
@@ -0,0 +1,138 @@
+/*
+ * Generic push-switch framework
+ *
+ * Copyright (C) 2006  Paul Mundt
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License.  See the file "COPYING" in the main directory of this archive
+ * for more details.
+ */
+#include <linux/init.h>
+#include <linux/module.h>
+#include <linux/interrupt.h>
+#include <linux/platform_device.h>
+#include <asm/push-switch.h>
+
+#define DRV_NAME "push-switch"
+#define DRV_VERSION "0.1.0"
+
+static ssize_t switch_show(struct device *dev,
+                          struct device_attribute *attr,
+                          char *buf)
+{
+       struct push_switch_platform_info *psw_info = dev->platform_data;
+       return sprintf(buf, "%s\n", psw_info->name);
+}
+static DEVICE_ATTR(switch, S_IRUGO, switch_show, NULL);
+
+static void switch_timer(unsigned long data)
+{
+       struct push_switch *psw = (struct push_switch *)data;
+
+       schedule_work(&psw->work);
+}
+
+static void switch_work_handler(void *data)
+{
+       struct platform_device *pdev = data;
+       struct push_switch *psw = platform_get_drvdata(pdev);
+
+       psw->state = 0;
+
+       kobject_uevent(&pdev->dev.kobj, KOBJ_CHANGE);
+}
+
+static int switch_drv_probe(struct platform_device *pdev)
+{
+       struct push_switch_platform_info *psw_info;
+       struct push_switch *psw;
+       int ret, irq;
+
+       psw = kzalloc(sizeof(struct push_switch), GFP_KERNEL);
+       if (unlikely(!psw))
+               return -ENOMEM;
+
+       irq = platform_get_irq(pdev, 0);
+       if (unlikely(irq < 0)) {
+               ret = -ENODEV;
+               goto err;
+       }
+
+       psw_info = pdev->dev.platform_data;
+       BUG_ON(!psw_info);
+
+       ret = request_irq(irq, psw_info->irq_handler,
+                         IRQF_DISABLED | psw_info->irq_flags,
+                         psw_info->name ? psw_info->name : DRV_NAME, pdev);
+       if (unlikely(ret < 0))
+               goto err;
+
+       if (psw_info->name) {
+               ret = device_create_file(&pdev->dev, &dev_attr_switch);
+               if (unlikely(ret)) {
+                       dev_err(&pdev->dev, "Failed creating device attrs\n");
+                       ret = -EINVAL;
+                       goto err_irq;
+               }
+       }
+
+       INIT_WORK(&psw->work, switch_work_handler, pdev);
+       init_timer(&psw->debounce);
+
+       psw->debounce.function = switch_timer;
+       psw->debounce.data = (unsigned long)psw;
+
+       platform_set_drvdata(pdev, psw);
+
+       return 0;
+
+err_irq:
+       free_irq(irq, pdev);
+err:
+       kfree(psw);
+       return ret;
+}
+
+static int switch_drv_remove(struct platform_device *pdev)
+{
+       struct push_switch *psw = platform_get_drvdata(pdev);
+       struct push_switch_platform_info *psw_info = pdev->dev.platform_data;
+       int irq = platform_get_irq(pdev, 0);
+
+       if (psw_info->name)
+               device_remove_file(&pdev->dev, &dev_attr_switch);
+
+       platform_set_drvdata(pdev, NULL);
+       flush_scheduled_work();
+       del_timer_sync(&psw->debounce);
+       free_irq(irq, pdev);
+
+       kfree(psw);
+
+       return 0;
+}
+
+static struct platform_driver switch_driver = {
+       .probe          = switch_drv_probe,
+       .remove         = switch_drv_remove,
+       .driver         = {
+               .name   = DRV_NAME,
+       },
+};
+
+static int __init switch_init(void)
+{
+       printk(KERN_NOTICE DRV_NAME ": version %s loaded\n", DRV_VERSION);
+       return platform_driver_register(&switch_driver);
+}
+
+static void __exit switch_exit(void)
+{
+       platform_driver_unregister(&switch_driver);
+}
+module_init(switch_init);
+module_exit(switch_exit);
+
+MODULE_VERSION(DRV_VERSION);
+MODULE_AUTHOR("Paul Mundt");
+MODULE_LICENSE("GPLv2");
index 5da88a43d350f4d38d92956090f4dce201e17d6e..99c7e5249f7a6ca16a68911955e90e3abb357855 100644 (file)
@@ -4,7 +4,7 @@
 
 extra-y        := head.o init_task.o vmlinux.lds
 
-obj-y  := process.o signal.o entry.o traps.o irq.o \
+obj-y  := process.o signal.o traps.o irq.o \
        ptrace.o setup.o time.o sys_sh.o semaphore.o \
        io.o io_generic.o sh_ksyms.o syscalls.o
 
@@ -21,3 +21,4 @@ obj-$(CONFIG_EARLY_PRINTK)    += early_printk.o
 obj-$(CONFIG_KEXEC)            += machine_kexec.o relocate_kernel.o
 obj-$(CONFIG_APM)              += apm.o
 obj-$(CONFIG_PM)               += pm.o
+obj-$(CONFIG_STACKTRACE)       += stacktrace.o
index fb5dac0693827df8316d15ec253b7005c0349b39..0582e6712b7927aaf6bf3841758e7ba39f5f0329 100644 (file)
@@ -2,11 +2,12 @@
 # Makefile for the Linux/SuperH CPU-specifc backends.
 #
 
-obj-y  += irq/ init.o clock.o
-
-obj-$(CONFIG_CPU_SH2)          += sh2/
-obj-$(CONFIG_CPU_SH3)          += sh3/
-obj-$(CONFIG_CPU_SH4)          += sh4/
+obj-$(CONFIG_CPU_SH2)          = sh2/
+obj-$(CONFIG_CPU_SH2A)         = sh2a/
+obj-$(CONFIG_CPU_SH3)          = sh3/
+obj-$(CONFIG_CPU_SH4)          = sh4/
 
 obj-$(CONFIG_UBC_WAKEUP)       += ubc.o
 obj-$(CONFIG_SH_ADC)           += adc.o
+
+obj-y  += irq/ init.o clock.o
index 51ec64cdf348ebb30c61ffab7be21e4dc2ffa1d6..abb586b125657a09e2b7f85579173313ec51cc8e 100644 (file)
@@ -5,9 +5,11 @@
  *
  * This clock framework is derived from the OMAP version by:
  *
- *     Copyright (C) 2004 Nokia Corporation
+ *     Copyright (C) 2004 - 2005 Nokia Corporation
  *     Written by Tuukka Tikkanen <tuukka.tikkanen@elektrobit.com>
  *
+ *  Modified for omap shared clock framework by Tony Lindgren <tony@atomide.com>
+ *
  * This file is subject to the terms and conditions of the GNU General Public
  * License.  See the file "COPYING" in the main directory of this archive
  * for more details.
@@ -20,6 +22,7 @@
 #include <linux/kref.h>
 #include <linux/seq_file.h>
 #include <linux/err.h>
+#include <linux/platform_device.h>
 #include <asm/clock.h>
 #include <asm/timer.h>
 
@@ -195,17 +198,37 @@ void clk_recalc_rate(struct clk *clk)
                propagate_rate(clk);
 }
 
-struct clk *clk_get(const char *id)
+/*
+ * Returns a clock. Note that we first try to use device id on the bus
+ * and clock name. If this fails, we try to use clock name only.
+ */
+struct clk *clk_get(struct device *dev, const char *id)
 {
        struct clk *p, *clk = ERR_PTR(-ENOENT);
+       int idno;
+
+       if (dev == NULL || dev->bus != &platform_bus_type)
+               idno = -1;
+       else
+               idno = to_platform_device(dev)->id;
 
        mutex_lock(&clock_list_sem);
+       list_for_each_entry(p, &clock_list, node) {
+               if (p->id == idno &&
+                   strcmp(id, p->name) == 0 && try_module_get(p->owner)) {
+                       clk = p;
+                       goto found;
+               }
+       }
+
        list_for_each_entry(p, &clock_list, node) {
                if (strcmp(id, p->name) == 0 && try_module_get(p->owner)) {
                        clk = p;
                        break;
                }
        }
+
+found:
        mutex_unlock(&clock_list_sem);
 
        return clk;
index bfb90eb0b7a6caabc529f33e49c5371a74f62208..48121766e8d243e07065e3f3797da7376092cc9b 100644 (file)
@@ -68,12 +68,14 @@ static void __init cache_init(void)
 
                waysize = cpu_data->dcache.sets;
 
+#ifdef CCR_CACHE_ORA
                /*
                 * If the OC is already in RAM mode, we only have
                 * half of the entries to flush..
                 */
                if (ccr & CCR_CACHE_ORA)
                        waysize >>= 1;
+#endif
 
                waysize <<= cpu_data->dcache.entry_shift;
 
index 1c034c283f594aee3b73ac546909dfb173bfbd17..0049d217561aa726797c97811a7198b60104535f 100644 (file)
@@ -1,8 +1,9 @@
 #
 # Makefile for the Linux/SuperH CPU-specifc IRQ handlers.
 #
-obj-y  += ipr.o imask.o
+obj-y  += imask.o
 
+obj-$(CONFIG_CPU_HAS_IPR_IRQ)          += ipr.o
 obj-$(CONFIG_CPU_HAS_PINT_IRQ)         += pint.o
 obj-$(CONFIG_CPU_HAS_MASKREG_IRQ)      += maskreg.o
 obj-$(CONFIG_CPU_HAS_INTC2_IRQ)                += intc2.o
index a33ae3e0a5a5dc808f72c425d69afca96d4ed531..301b505c4278929668bceeee5b2b4b09a4eca06f 100644 (file)
@@ -53,7 +53,10 @@ void static inline set_interrupt_registers(int ip)
 {
        unsigned long __dummy;
 
-       asm volatile("ldc       %2, r6_bank\n\t"
+       asm volatile(
+#ifdef CONFIG_CPU_HAS_SR_RB
+                    "ldc       %2, r6_bank\n\t"
+#endif
                     "stc       sr, %0\n\t"
                     "and       #0xf0, %0\n\t"
                     "shlr2     %0\n\t"
index 74ca576a7ce502984e26cf8511a7808acaf65c03..74defe76a0580c163f2f883c495c78db05c2448d 100644 (file)
  * Hitachi 7751, the STM ST40 STB1, SH7760, and SH7780.
  */
 #include <linux/kernel.h>
-#include <linux/irq.h>
+#include <linux/interrupt.h>
 #include <linux/io.h>
-#include <asm/system.h>
+
+#if defined(CONFIG_CPU_SUBTYPE_SH7760)
+#define INTC2_BASE     0xfe080000
+#define INTC2_INTMSK   (INTC2_BASE + 0x40)
+#define INTC2_INTMSKCLR        (INTC2_BASE + 0x60)
+#elif defined(CONFIG_CPU_SUBTYPE_SH7780)
+#define INTC2_BASE     0xffd40000
+#define INTC2_INTMSK   (INTC2_BASE + 0x38)
+#define INTC2_INTMSKCLR        (INTC2_BASE + 0x3c)
+#endif
 
 static void disable_intc2_irq(unsigned int irq)
 {
        struct intc2_data *p = get_irq_chip_data(irq);
-       ctrl_outl(1 << p->msk_shift,
-                 INTC2_BASE + INTC2_INTMSK_OFFSET + p->msk_offset);
+       ctrl_outl(1 << p->msk_shift, INTC2_INTMSK + p->msk_offset);
 }
 
 static void enable_intc2_irq(unsigned int irq)
 {
        struct intc2_data *p = get_irq_chip_data(irq);
-       ctrl_outl(1 << p->msk_shift,
-                 INTC2_BASE + INTC2_INTMSKCLR_OFFSET + p->msk_offset);
+       ctrl_outl(1 << p->msk_shift, INTC2_INTMSKCLR + p->msk_offset);
 }
 
 static struct irq_chip intc2_irq_chip = {
@@ -61,12 +68,10 @@ void make_intc2_irq(struct intc2_data *table, unsigned int nr_irqs)
                /* Set the priority level */
                local_irq_save(flags);
 
-               ipr = ctrl_inl(INTC2_BASE + INTC2_INTPRI_OFFSET +
-                              p->ipr_offset);
+               ipr = ctrl_inl(INTC2_BASE + p->ipr_offset);
                ipr &= ~(0xf << p->ipr_shift);
                ipr |= p->priority << p->ipr_shift;
-               ctrl_outl(ipr, INTC2_BASE + INTC2_INTPRI_OFFSET +
-                         p->ipr_offset);
+               ctrl_outl(ipr, INTC2_BASE + p->ipr_offset);
 
                local_irq_restore(flags);
 
index a0089563cbfcfef2d7618a45c97e401185e0d86c..35eb5751a3aaf842ecaecdb59e66f2dc70bc6d01 100644 (file)
 #include <linux/init.h>
 #include <linux/irq.h>
 #include <linux/module.h>
-#include <asm/system.h>
-#include <asm/io.h>
-#include <asm/machvec.h>
-
+#include <linux/io.h>
+#include <linux/interrupt.h>
 
 static void disable_ipr_irq(unsigned int irq)
 {
        struct ipr_data *p = get_irq_chip_data(irq);
-       int shift = p->shift*4;
        /* Set the priority in IPR to 0 */
-       ctrl_outw(ctrl_inw(p->addr) & (0xffff ^ (0xf << shift)), p->addr);
+       ctrl_outw(ctrl_inw(p->addr) & (0xffff ^ (0xf << p->shift)), p->addr);
 }
 
 static void enable_ipr_irq(unsigned int irq)
 {
        struct ipr_data *p = get_irq_chip_data(irq);
-       int shift = p->shift*4;
        /* Set priority in IPR back to original value */
-       ctrl_outw(ctrl_inw(p->addr) | (p->priority << shift), p->addr);
+       ctrl_outw(ctrl_inw(p->addr) | (p->priority << p->shift), p->addr);
 }
 
 static struct irq_chip ipr_irq_chip = {
@@ -53,6 +49,10 @@ void make_ipr_irq(struct ipr_data *table, unsigned int nr_irqs)
 
        for (i = 0; i < nr_irqs; i++) {
                unsigned int irq = table[i].irq;
+               table[i].addr = map_ipridx_to_addr(table[i].ipr_idx);
+               /* could the IPR index be mapped, if not we ignore this */
+               if (table[i].addr == 0)
+                       continue;
                disable_irq_nosync(irq);
                set_irq_chip_and_handler_name(irq, &ipr_irq_chip,
                                      handle_level_irq, "level");
@@ -62,83 +62,6 @@ void make_ipr_irq(struct ipr_data *table, unsigned int nr_irqs)
 }
 EXPORT_SYMBOL(make_ipr_irq);
 
-static struct ipr_data sys_ipr_map[] = {
-#ifndef CONFIG_CPU_SUBTYPE_SH7780
-       { TIMER_IRQ, TIMER_IPR_ADDR, TIMER_IPR_POS, TIMER_PRIORITY },
-       { TIMER1_IRQ, TIMER1_IPR_ADDR, TIMER1_IPR_POS, TIMER1_PRIORITY },
-#ifdef RTC_IRQ
-       { RTC_IRQ, RTC_IPR_ADDR, RTC_IPR_POS, RTC_PRIORITY },
-#endif
-#ifdef SCI_ERI_IRQ
-       { SCI_ERI_IRQ, SCI_IPR_ADDR, SCI_IPR_POS, SCI_PRIORITY },
-       { SCI_RXI_IRQ, SCI_IPR_ADDR, SCI_IPR_POS, SCI_PRIORITY },
-       { SCI_TXI_IRQ, SCI_IPR_ADDR, SCI_IPR_POS, SCI_PRIORITY },
-#endif
-#ifdef SCIF1_ERI_IRQ
-       { SCIF1_ERI_IRQ, SCIF1_IPR_ADDR, SCIF1_IPR_POS, SCIF1_PRIORITY },
-       { SCIF1_RXI_IRQ, SCIF1_IPR_ADDR, SCIF1_IPR_POS, SCIF1_PRIORITY },
-       { SCIF1_BRI_IRQ, SCIF1_IPR_ADDR, SCIF1_IPR_POS, SCIF1_PRIORITY },
-       { SCIF1_TXI_IRQ, SCIF1_IPR_ADDR, SCIF1_IPR_POS, SCIF1_PRIORITY },
-#endif
-#if defined(CONFIG_CPU_SUBTYPE_SH7300)
-       { SCIF0_IRQ, SCIF0_IPR_ADDR, SCIF0_IPR_POS, SCIF0_PRIORITY },
-       { DMTE2_IRQ, DMA1_IPR_ADDR, DMA1_IPR_POS, DMA1_PRIORITY },
-       { DMTE3_IRQ, DMA1_IPR_ADDR, DMA1_IPR_POS, DMA1_PRIORITY },
-       { VIO_IRQ, VIO_IPR_ADDR, VIO_IPR_POS, VIO_PRIORITY },
-#endif
-#ifdef SCIF_ERI_IRQ
-       { SCIF_ERI_IRQ, SCIF_IPR_ADDR, SCIF_IPR_POS, SCIF_PRIORITY },
-       { SCIF_RXI_IRQ, SCIF_IPR_ADDR, SCIF_IPR_POS, SCIF_PRIORITY },
-       { SCIF_BRI_IRQ, SCIF_IPR_ADDR, SCIF_IPR_POS, SCIF_PRIORITY },
-       { SCIF_TXI_IRQ, SCIF_IPR_ADDR, SCIF_IPR_POS, SCIF_PRIORITY },
-#endif
-#ifdef IRDA_ERI_IRQ
-       { IRDA_ERI_IRQ, IRDA_IPR_ADDR, IRDA_IPR_POS, IRDA_PRIORITY },
-       { IRDA_RXI_IRQ, IRDA_IPR_ADDR, IRDA_IPR_POS, IRDA_PRIORITY },
-       { IRDA_BRI_IRQ, IRDA_IPR_ADDR, IRDA_IPR_POS, IRDA_PRIORITY },
-       { IRDA_TXI_IRQ, IRDA_IPR_ADDR, IRDA_IPR_POS, IRDA_PRIORITY },
-#endif
-#if defined(CONFIG_CPU_SUBTYPE_SH7707) || defined(CONFIG_CPU_SUBTYPE_SH7709) || \
-    defined(CONFIG_CPU_SUBTYPE_SH7706) || \
-    defined(CONFIG_CPU_SUBTYPE_SH7300) || defined(CONFIG_CPU_SUBTYPE_SH7705)
-       /*
-        * Initialize the Interrupt Controller (INTC)
-        * registers to their power on values
-        */
-
-       /*
-        * Enable external irq (INTC IRQ mode).
-        * You should set corresponding bits of PFC to "00"
-        * to enable these interrupts.
-        */
-       { IRQ0_IRQ, IRQ0_IPR_ADDR, IRQ0_IPR_POS, IRQ0_PRIORITY },
-       { IRQ1_IRQ, IRQ1_IPR_ADDR, IRQ1_IPR_POS, IRQ1_PRIORITY },
-       { IRQ2_IRQ, IRQ2_IPR_ADDR, IRQ2_IPR_POS, IRQ2_PRIORITY },
-       { IRQ3_IRQ, IRQ3_IPR_ADDR, IRQ3_IPR_POS, IRQ3_PRIORITY },
-       { IRQ4_IRQ, IRQ4_IPR_ADDR, IRQ4_IPR_POS, IRQ4_PRIORITY },
-       { IRQ5_IRQ, IRQ5_IPR_ADDR, IRQ5_IPR_POS, IRQ5_PRIORITY },
-#endif
-#endif
-};
-
-void __init init_IRQ(void)
-{
-       make_ipr_irq(sys_ipr_map, ARRAY_SIZE(sys_ipr_map));
-
-#ifdef CONFIG_CPU_HAS_PINT_IRQ
-       init_IRQ_pint();
-#endif
-
-#ifdef CONFIG_CPU_HAS_INTC2_IRQ
-       init_IRQ_intc2();
-#endif
-       /* Perform the machine specific initialisation */
-       if (sh_mv.mv_init_irq != NULL)
-               sh_mv.mv_init_irq();
-
-       irq_ctx_init(smp_processor_id());
-}
-
 #if !defined(CONFIG_CPU_HAS_PINT_IRQ)
 int ipr_irq_demux(int irq)
 {
index 389353fba608f7aecf9a6e606f8f28892fbdeaf5..f0f059acfcfbd5707766eea4c8c15064bfd437cf 100644 (file)
@@ -2,5 +2,6 @@
 # Makefile for the Linux/SuperH SH-2 backends.
 #
 
-obj-y  := probe.o
+obj-y  := ex.o probe.o entry.o
 
+obj-$(CONFIG_CPU_SUBTYPE_SH7619) += setup-sh7619.o clock-sh7619.o
diff --git a/arch/sh/kernel/cpu/sh2/clock-sh7619.c b/arch/sh/kernel/cpu/sh2/clock-sh7619.c
new file mode 100644 (file)
index 0000000..d0440b2
--- /dev/null
@@ -0,0 +1,81 @@
+/*
+ * arch/sh/kernel/cpu/sh2/clock-sh7619.c
+ *
+ * SH7619 support for the clock framework
+ *
+ *  Copyright (C) 2006  Yoshinori Sato
+ *
+ * Based on clock-sh4.c
+ *  Copyright (C) 2005  Paul Mundt
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License.  See the file "COPYING" in the main directory of this archive
+ * for more details.
+ */
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <asm/clock.h>
+#include <asm/freq.h>
+#include <asm/io.h>
+
+const static int pll1rate[]={1,2};
+const static int pfc_divisors[]={1,2,0,4};
+
+#if (CONFIG_SH_CLK_MD == 1) || (CONFIG_SH_CLK_MD == 2)
+#define PLL2 (4)
+#elif (CONFIG_SH_CLK_MD == 5) || (CONFIG_SH_CLK_MD == 6)
+#define PLL2 (2)
+#else
+#error "Illigal Clock Mode!"
+#endif
+
+static void master_clk_init(struct clk *clk)
+{
+       clk->rate *= PLL2 * pll1rate[(ctrl_inw(FREQCR) >> 8) & 7];
+}
+
+static struct clk_ops sh7619_master_clk_ops = {
+       .init           = master_clk_init,
+};
+
+static void module_clk_recalc(struct clk *clk)
+{
+       int idx = (ctrl_inw(FREQCR) & 0x0007);
+       clk->rate = clk->parent->rate / pfc_divisors[idx];
+}
+
+static struct clk_ops sh7619_module_clk_ops = {
+       .recalc         = module_clk_recalc,
+};
+
+static void bus_clk_recalc(struct clk *clk)
+{
+       clk->rate = clk->parent->rate / pll1rate[(ctrl_inw(FREQCR) >> 8) & 7];
+}
+
+static struct clk_ops sh7619_bus_clk_ops = {
+       .recalc         = bus_clk_recalc,
+};
+
+static void cpu_clk_recalc(struct clk *clk)
+{
+       clk->rate = clk->parent->rate;
+}
+
+static struct clk_ops sh7619_cpu_clk_ops = {
+       .recalc         = cpu_clk_recalc,
+};
+
+static struct clk_ops *sh7619_clk_ops[] = {
+       &sh7619_master_clk_ops,
+       &sh7619_module_clk_ops,
+       &sh7619_bus_clk_ops,
+       &sh7619_cpu_clk_ops,
+};
+
+void __init arch_init_clk_ops(struct clk_ops **ops, int idx)
+{
+       if (idx < ARRAY_SIZE(sh7619_clk_ops))
+               *ops = sh7619_clk_ops[idx];
+}
+
diff --git a/arch/sh/kernel/cpu/sh2/entry.S b/arch/sh/kernel/cpu/sh2/entry.S
new file mode 100644 (file)
index 0000000..34d51b3
--- /dev/null
@@ -0,0 +1,341 @@
+/*
+ * arch/sh/kernel/cpu/sh2/entry.S
+ *
+ * The SH-2 exception entry
+ *
+ * Copyright (C) 2005,2006 Yoshinori Sato
+ * Copyright (C) 2005  AXE,Inc.
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License.  See the file "COPYING" in the main directory of this archive
+ * for more details.
+ */
+
+#include <linux/linkage.h>
+#include <asm/asm-offsets.h>
+#include <asm/thread_info.h>
+#include <asm/cpu/mmu_context.h>
+#include <asm/unistd.h>
+#include <asm/errno.h>
+#include <asm/page.h>
+       
+/* Offsets to the stack */
+OFF_R0  =  0           /* Return value. New ABI also arg4 */
+OFF_R1  =  4           /* New ABI: arg5 */
+OFF_R2  =  8           /* New ABI: arg6 */
+OFF_R3  =  12          /* New ABI: syscall_nr */
+OFF_R4  =  16          /* New ABI: arg0 */
+OFF_R5  =  20          /* New ABI: arg1 */
+OFF_R6  =  24          /* New ABI: arg2 */
+OFF_R7  =  28          /* New ABI: arg3 */
+OFF_SP =  (15*4)
+OFF_PC  =  (16*4)
+OFF_SR =  (16*4+2*4)
+OFF_TRA        =  (16*4+6*4)
+
+#include <asm/entry-macros.S>
+
+ENTRY(exception_handler)
+       ! already saved r0/r1
+       mov.l   r2,@-sp
+       mov.l   r3,@-sp
+       mov     r0,r1
+       cli
+       mov.l   $cpu_mode,r2
+       mov.l   @r2,r0
+       mov.l   @(5*4,r15),r3   ! previous SR
+       shll2   r3              ! set "S" flag
+       rotl    r0              ! T <- "S" flag
+       rotl    r0              ! "S" flag is LSB
+       rotcr   r3              ! T -> r3:b30
+       shlr    r3
+       shlr    r0
+       bt/s    1f
+        mov.l  r3,@(5*4,r15)   ! copy cpu mode to SR
+       ! switch to kernel mode
+       mov     #1,r0
+       rotr    r0
+       rotr    r0
+       mov.l   r0,@r2          ! enter kernel mode
+       mov.l   $current_thread_info,r2
+       mov.l   @r2,r2
+       mov     #0x20,r0
+       shll8   r0
+       add     r2,r0
+       mov     r15,r2          ! r2 = user stack top
+       mov     r0,r15          ! switch kernel stack
+       add     #-4,r15         ! dummy
+       mov.l   r1,@-r15        ! TRA
+       sts.l   macl, @-r15
+       sts.l   mach, @-r15
+       stc.l   gbr, @-r15
+       mov.l   @(4*4,r2),r0
+       mov.l   @(5*4,r2),r1
+       mov.l   r1,@-r15        ! original SR
+       sts.l   pr,@-r15
+       mov.l   r0,@-r15        ! original PC
+       mov     r2,r3
+       add     #(4+2)*4,r3     ! rewind r0 - r3 + exception frame
+       mov.l   r3,@-r15        ! original SP
+       mov.l   r14,@-r15
+       mov.l   r13,@-r15
+       mov.l   r12,@-r15
+       mov.l   r11,@-r15
+       mov.l   r10,@-r15
+       mov.l   r9,@-r15
+       mov.l   r8,@-r15
+       mov.l   r7,@-r15
+       mov.l   r6,@-r15
+       mov.l   r5,@-r15
+       mov.l   r4,@-r15
+       mov     r2,r8           ! copy user -> kernel stack
+       mov.l   @r8+,r3
+       mov.l   r3,@-r15
+       mov.l   @r8+,r2
+       mov.l   r2,@-r15
+       mov.l   @r8+,r1
+       mov.l   r1,@-r15
+       mov.l   @r8+,r0
+       bra     2f
+        mov.l  r0,@-r15
+1:
+       ! in kernel exception
+       mov     #(22-4-4-1)*4+4,r0
+       mov     r15,r2
+       sub     r0,r15
+       mov.l   @r2+,r0         ! old R3
+       mov.l   r0,@-r15        
+       mov.l   @r2+,r0         ! old R2
+       mov.l   r0,@-r15        
+       mov.l   @r2+,r0         ! old R1
+       mov.l   r0,@-r15        
+       mov.l   @r2+,r0         ! old R0
+       mov.l   r0,@-r15        
+       mov.l   @r2+,r3         ! old PC
+       mov.l   @r2+,r0         ! old SR
+       add     #-4,r2          ! exception frame stub (sr)
+       mov.l   r1,@-r2         ! TRA
+       sts.l   macl, @-r2
+       sts.l   mach, @-r2
+       stc.l   gbr, @-r2
+       mov.l   r0,@-r2         ! save old SR
+       sts.l   pr,@-r2
+       mov.l   r3,@-r2         ! save old PC
+       mov     r2,r0
+       add     #8*4,r0
+       mov.l   r0,@-r2         ! save old SP
+       mov.l   r14,@-r2
+       mov.l   r13,@-r2
+       mov.l   r12,@-r2
+       mov.l   r11,@-r2
+       mov.l   r10,@-r2
+       mov.l   r9,@-r2
+       mov.l   r8,@-r2
+       mov.l   r7,@-r2
+       mov.l   r6,@-r2
+       mov.l   r5,@-r2
+       mov.l   r4,@-r2
+       mov.l   @(OFF_R0,r15),r0
+       mov.l   @(OFF_R1,r15),r1
+       mov.l   @(OFF_R2,r15),r2
+       mov.l   @(OFF_R3,r15),r3
+2:
+       mov     #OFF_TRA,r8
+       add     r15,r8
+       mov.l   @r8,r9  
+       mov     #64,r8
+       cmp/hs  r8,r9
+       bt      interrupt_entry ! vec >= 64 is interrupt
+       mov     #32,r8
+       cmp/hs  r8,r9
+       bt      trap_entry      ! 64 > vec >= 32  is trap
+       mov.l   4f,r8
+       mov     r9,r4
+       shll2   r9
+       add     r9,r8
+       mov.l   @r8,r8
+       mov     #0,r9
+       cmp/eq  r9,r8
+       bf      3f
+       mov.l   8f,r8           ! unhandled exception
+3:
+       mov.l   5f,r10
+       jmp     @r8
+        lds    r10,pr
+
+interrupt_entry:
+       mov     r9,r4
+       mov.l   6f,r9
+       mov.l   7f,r8
+       jmp     @r8
+        lds    r9,pr
+
+       .align  2
+4:     .long   exception_handling_table
+5:     .long   ret_from_exception
+6:     .long   ret_from_irq
+7:     .long   do_IRQ
+8:     .long   do_exception_error
+       
+trap_entry:    
+       add     #-0x10,r9
+       shll2   r9                      ! TRA
+       mov     #OFF_TRA,r8
+       add     r15,r8
+       mov.l   r9,@r8
+       mov     r9,r8
+#ifdef CONFIG_TRACE_IRQFLAGS
+       mov.l   5f, r9
+       jsr     @r9
+        nop
+#endif
+       sti
+       bra     system_call
+        nop
+       
+       .align  2
+1:     .long   syscall_exit
+2:     .long   break_point_trap_software
+3:     .long   NR_syscalls
+4:     .long   sys_call_table
+#ifdef CONFIG_TRACE_IRQFLAGS
+5:     .long   trace_hardirqs_on
+#endif
+
+#if defined(CONFIG_SH_STANDARD_BIOS)
+       /* Unwind the stack and jmp to the debug entry */
+debug_kernel_fw:
+       mov     r15,r0
+       add     #(22-4)*4-4,r0
+       ldc.l   @r0+,gbr
+       lds.l   @r0+,mach
+       lds.l   @r0+,macl
+       mov     r15,r0
+       mov.l   @(OFF_SP,r0),r1
+       mov     #OFF_SR,r2
+       mov.l   @(r0,r2),r3
+       mov.l   r3,@-r1
+       mov     #OFF_SP,r2
+       mov.l   @(r0,r2),r3
+       mov.l   r3,@-r1
+       mov     r15,r0
+       add     #(22-4)*4-8,r0
+       mov.l   1f,r2
+       mov.l   @r2,r2
+       stc     sr,r3
+       mov.l   r2,@r0
+       mov.l   r3,@r0
+       mov.l   r1,@(8,r0)      
+       mov.l   @r15+, r0
+       mov.l   @r15+, r1
+       mov.l   @r15+, r2
+       mov.l   @r15+, r3
+       mov.l   @r15+, r4
+       mov.l   @r15+, r5
+       mov.l   @r15+, r6
+       mov.l   @r15+, r7
+       mov.l   @r15+, r8
+       mov.l   @r15+, r9
+       mov.l   @r15+, r10
+       mov.l   @r15+, r11
+       mov.l   @r15+, r12
+       mov.l   @r15+, r13
+       mov.l   @r15+, r14
+       add     #8,r15
+       lds.l   @r15+, pr
+       rte
+        mov.l  @r15+,r15
+       .align  2
+1:     .long   gdb_vbr_vector
+#endif /* CONFIG_SH_STANDARD_BIOS */
+
+ENTRY(address_error_handler)
+       mov     r15,r4                          ! regs
+       add     #4,r4
+       mov     #OFF_PC,r0
+       mov.l   @(r0,r15),r6                    ! pc
+       mov.l   1f,r0
+       jmp     @r0
+        mov    #0,r5                           ! writeaccess is unknown
+       .align  2
+
+1:     .long   do_address_error
+
+restore_all:
+       cli
+#ifdef CONFIG_TRACE_IRQFLAGS
+       mov.l   3f, r0
+       jsr     @r0
+        nop
+#endif
+       mov     r15,r0
+       mov.l   $cpu_mode,r2
+       mov     #OFF_SR,r3
+       mov.l   @(r0,r3),r1
+       mov.l   r1,@r2
+       shll2   r1                              ! clear MD bit
+       shlr2   r1
+       mov.l   @(OFF_SP,r0),r2
+       add     #-8,r2
+       mov.l   r2,@(OFF_SP,r0)                 ! point exception frame top
+       mov.l   r1,@(4,r2)                      ! set sr
+       mov     #OFF_PC,r3
+       mov.l   @(r0,r3),r1
+       mov.l   r1,@r2                          ! set pc
+       add     #4*16+4,r0
+       lds.l   @r0+,pr
+       add     #4,r0                           ! skip sr
+       ldc.l   @r0+,gbr
+       lds.l   @r0+,mach
+       lds.l   @r0+,macl
+       get_current_thread_info r0, r1
+       mov.l   $current_thread_info,r1
+       mov.l   r0,@r1
+       mov.l   @r15+,r0
+       mov.l   @r15+,r1
+       mov.l   @r15+,r2
+       mov.l   @r15+,r3
+       mov.l   @r15+,r4
+       mov.l   @r15+,r5
+       mov.l   @r15+,r6
+       mov.l   @r15+,r7
+       mov.l   @r15+,r8
+       mov.l   @r15+,r9
+       mov.l   @r15+,r10
+       mov.l   @r15+,r11
+       mov.l   @r15+,r12
+       mov.l   @r15+,r13
+       mov.l   @r15+,r14
+       mov.l   @r15,r15
+       rte
+        nop
+2:
+       mov.l   1f,r8
+       mov.l   2f,r9
+       jmp     @r9
+        lds    r8,pr
+
+       .align  2
+$current_thread_info:
+       .long   __current_thread_info
+$cpu_mode:     
+       .long   __cpu_mode
+#ifdef CONFIG_TRACE_IRQFLAGS
+3:     .long   trace_hardirqs_off
+#endif
+               
+! common exception handler
+#include "../../entry-common.S"
+       
+       .data
+! cpu operation mode 
+! bit30 = MD (compatible SH3/4)
+__cpu_mode:
+       .long   0x40000000
+               
+       .section        .bss
+__current_thread_info:
+       .long   0
+
+ENTRY(exception_handling_table)
+       .space  4*32
diff --git a/arch/sh/kernel/cpu/sh2/ex.S b/arch/sh/kernel/cpu/sh2/ex.S
new file mode 100644 (file)
index 0000000..6d285af
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ * arch/sh/kernel/cpu/sh2/ex.S
+ *
+ * The SH-2 exception vector table
+ *
+ * Copyright (C) 2005 Yoshinori Sato
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License.  See the file "COPYING" in the main directory of this archive
+ * for more details.
+ */
+
+#include <linux/linkage.h>
+
+!
+! convert Exception Vector to Exception Number
+!
+exception_entry:       
+no     =       0
+       .rept   256
+       mov.l   r0,@-sp
+       mov     #no,r0
+       bra     exception_trampoline
+       and     #0xff,r0
+no     =       no + 1
+       .endr
+exception_trampoline:
+       mov.l   r1,@-sp
+       mov.l   $exception_handler,r1
+       jmp     @r1
+
+       .align  2
+$exception_entry:
+       .long   exception_entry
+$exception_handler:
+       .long   exception_handler
+!
+! Exception Vector Base
+!
+       .align  2
+ENTRY(vbr_base)
+vector =       0
+       .rept   256
+       .long   exception_entry + vector * 8
+vector =       vector + 1
+       .endr
index f17a2a0d588edf52985018241c333374d7da03da..ba527d9b502411a56db05cb9b840688f8e4ba4fb 100644 (file)
 
 int __init detect_cpu_and_cache_system(void)
 {
-       /*
-        * For now, assume SH7604 .. fix this later.
-        */
+#if defined(CONFIG_CPU_SUBTYPE_SH7604)
        cpu_data->type                  = CPU_SH7604;
        cpu_data->dcache.ways           = 4;
-       cpu_data->dcache.way_shift      = 6;
+       cpu_data->dcache.way_incr       = (1<<10);
        cpu_data->dcache.sets           = 64;
        cpu_data->dcache.entry_shift    = 4;
        cpu_data->dcache.linesz         = L1_CACHE_BYTES;
        cpu_data->dcache.flags          = 0;
-
+#elif defined(CONFIG_CPU_SUBTYPE_SH7619)
+       cpu_data->type                  = CPU_SH7619;
+       cpu_data->dcache.ways           = 4;
+       cpu_data->dcache.way_incr       = (1<<12);
+       cpu_data->dcache.sets           = 256;
+       cpu_data->dcache.entry_shift    = 4;
+       cpu_data->dcache.linesz         = L1_CACHE_BYTES;
+       cpu_data->dcache.flags          = 0;
+#endif
        /*
         * SH-2 doesn't have separate caches
         */
diff --git a/arch/sh/kernel/cpu/sh2/setup-sh7619.c b/arch/sh/kernel/cpu/sh2/setup-sh7619.c
new file mode 100644 (file)
index 0000000..82c2d90
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+ * SH7619 Setup
+ *
+ *  Copyright (C) 2006  Yoshinori Sato
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License.  See the file "COPYING" in the main directory of this archive
+ * for more details.
+ */
+#include <linux/platform_device.h>
+#include <linux/init.h>
+#include <linux/serial.h>
+#include <asm/sci.h>
+
+static struct plat_sci_port sci_platform_data[] = {
+       {
+               .mapbase        = 0xf8400000,
+               .flags          = UPF_BOOT_AUTOCONF,
+               .type           = PORT_SCIF,
+               .irqs           =  { 88, 89, 91, 90},
+       }, {
+               .mapbase        = 0xf8410000,
+               .flags          = UPF_BOOT_AUTOCONF,
+               .type           = PORT_SCIF,
+               .irqs           =  { 92, 93, 95, 94},
+       }, {
+               .mapbase        = 0xf8420000,
+               .flags          = UPF_BOOT_AUTOCONF,
+               .type           = PORT_SCIF,
+               .irqs           =  { 96, 97, 99, 98},
+       }, {
+               .flags = 0,
+       }
+};
+
+static struct platform_device sci_device = {
+       .name           = "sh-sci",
+       .id             = -1,
+       .dev            = {
+               .platform_data  = sci_platform_data,
+       },
+};
+
+static struct platform_device *sh7619_devices[] __initdata = {
+       &sci_device,
+};
+
+static int __init sh7619_devices_setup(void)
+{
+       return platform_add_devices(sh7619_devices,
+                                   ARRAY_SIZE(sh7619_devices));
+}
+__initcall(sh7619_devices_setup);
diff --git a/arch/sh/kernel/cpu/sh2a/Makefile b/arch/sh/kernel/cpu/sh2a/Makefile
new file mode 100644 (file)
index 0000000..350972a
--- /dev/null
@@ -0,0 +1,10 @@
+#
+# Makefile for the Linux/SuperH SH-2A backends.
+#
+
+obj-y  := common.o probe.o
+
+common-y       += $(addprefix ../sh2/, ex.o)
+common-y       += $(addprefix ../sh2/, entry.o)
+
+obj-$(CONFIG_CPU_SUBTYPE_SH7206) += setup-sh7206.o clock-sh7206.o
diff --git a/arch/sh/kernel/cpu/sh2a/clock-sh7206.c b/arch/sh/kernel/cpu/sh2a/clock-sh7206.c
new file mode 100644 (file)
index 0000000..a9ad309
--- /dev/null
@@ -0,0 +1,85 @@
+/*
+ * arch/sh/kernel/cpu/sh2a/clock-sh7206.c
+ *
+ * SH7206 support for the clock framework
+ *
+ *  Copyright (C) 2006  Yoshinori Sato
+ *
+ * Based on clock-sh4.c
+ *  Copyright (C) 2005  Paul Mundt
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License.  See the file "COPYING" in the main directory of this archive
+ * for more details.
+ */
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <asm/clock.h>
+#include <asm/freq.h>
+#include <asm/io.h>
+
+const static int pll1rate[]={1,2,3,4,6,8};
+const static int pfc_divisors[]={1,2,3,4,6,8,12};
+#define ifc_divisors pfc_divisors
+
+#if (CONFIG_SH_CLK_MD == 2)
+#define PLL2 (4)
+#elif (CONFIG_SH_CLK_MD == 6)
+#define PLL2 (2)
+#elif (CONFIG_SH_CLK_MD == 7)
+#define PLL2 (1)
+#else
+#error "Illigal Clock Mode!"
+#endif
+
+static void master_clk_init(struct clk *clk)
+{
+       clk->rate *= PLL2 * pll1rate[(ctrl_inw(FREQCR) >> 8) & 0x0007];
+}
+
+static struct clk_ops sh7206_master_clk_ops = {
+       .init           = master_clk_init,
+};
+
+static void module_clk_recalc(struct clk *clk)
+{
+       int idx = (ctrl_inw(FREQCR) & 0x0007);
+       clk->rate = clk->parent->rate / pfc_divisors[idx];
+}
+
+static struct clk_ops sh7206_module_clk_ops = {
+       .recalc         = module_clk_recalc,
+};
+
+static void bus_clk_recalc(struct clk *clk)
+{
+       clk->rate = clk->parent->rate / pll1rate[(ctrl_inw(FREQCR) >> 8) & 0x0007];
+}
+
+static struct clk_ops sh7206_bus_clk_ops = {
+       .recalc         = bus_clk_recalc,
+};
+
+static void cpu_clk_recalc(struct clk *clk)
+{
+       int idx = (ctrl_inw(FREQCR) & 0x0007);
+       clk->rate = clk->parent->rate / ifc_divisors[idx];
+}
+
+static struct clk_ops sh7206_cpu_clk_ops = {
+       .recalc         = cpu_clk_recalc,
+};
+
+static struct clk_ops *sh7206_clk_ops[] = {
+       &sh7206_master_clk_ops,
+       &sh7206_module_clk_ops,
+       &sh7206_bus_clk_ops,
+       &sh7206_cpu_clk_ops,
+};
+
+void __init arch_init_clk_ops(struct clk_ops **ops, int idx)
+{
+       if (idx < ARRAY_SIZE(sh7206_clk_ops))
+               *ops = sh7206_clk_ops[idx];
+}
+
diff --git a/arch/sh/kernel/cpu/sh2a/probe.c b/arch/sh/kernel/cpu/sh2a/probe.c
new file mode 100644 (file)
index 0000000..87c6c05
--- /dev/null
@@ -0,0 +1,39 @@
+/*
+ * arch/sh/kernel/cpu/sh2a/probe.c
+ *
+ * CPU Subtype Probing for SH-2A.
+ *
+ * Copyright (C) 2004, 2005 Paul Mundt
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License.  See the file "COPYING" in the main directory of this archive
+ * for more details.
+ */
+
+#include <linux/init.h>
+#include <asm/processor.h>
+#include <asm/cache.h>
+
+int __init detect_cpu_and_cache_system(void)
+{
+       /* Just SH7206 for now .. */
+       cpu_data->type                  = CPU_SH7206;
+
+       cpu_data->dcache.ways           = 4;
+       cpu_data->dcache.way_incr       = (1 << 11);
+       cpu_data->dcache.sets           = 128;
+       cpu_data->dcache.entry_shift    = 4;
+       cpu_data->dcache.linesz         = L1_CACHE_BYTES;
+       cpu_data->dcache.flags          = 0;
+
+       /*
+        * The icache is the same as the dcache as far as this setup is
+        * concerned. The only real difference in hardware is that the icache
+        * lacks the U bit that the dcache has, none of this has any bearing
+        * on the cache info.
+        */
+       cpu_data->icache                = cpu_data->dcache;
+
+       return 0;
+}
+
diff --git a/arch/sh/kernel/cpu/sh2a/setup-sh7206.c b/arch/sh/kernel/cpu/sh2a/setup-sh7206.c
new file mode 100644 (file)
index 0000000..cdfeef4
--- /dev/null
@@ -0,0 +1,58 @@
+/*
+ * SH7206 Setup
+ *
+ *  Copyright (C) 2006  Yoshinori Sato
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License.  See the file "COPYING" in the main directory of this archive
+ * for more details.
+ */
+#include <linux/platform_device.h>
+#include <linux/init.h>
+#include <linux/serial.h>
+#include <asm/sci.h>
+
+static struct plat_sci_port sci_platform_data[] = {
+       {
+               .mapbase        = 0xfffe8000,
+               .flags          = UPF_BOOT_AUTOCONF,
+               .type           = PORT_SCIF,
+               .irqs           =  { 240, 241, 242, 243},
+       }, {
+               .mapbase        = 0xfffe8800,
+               .flags          = UPF_BOOT_AUTOCONF,
+               .type           = PORT_SCIF,
+               .irqs           =  { 244, 245, 246, 247},
+       }, {
+               .mapbase        = 0xfffe9000,
+               .flags          = UPF_BOOT_AUTOCONF,
+               .type           = PORT_SCIF,
+               .irqs           =  { 248, 249, 250, 251},
+       }, {
+               .mapbase        = 0xfffe9800,
+               .flags          = UPF_BOOT_AUTOCONF,
+               .type           = PORT_SCIF,
+               .irqs           =  { 252, 253, 254, 255},
+       }, {
+               .flags = 0,
+       }
+};
+
+static struct platform_device sci_device = {
+       .name           = "sh-sci",
+       .id             = -1,
+       .dev            = {
+               .platform_data  = sci_platform_data,
+       },
+};
+
+static struct platform_device *sh7206_devices[] __initdata = {
+       &sci_device,
+};
+
+static int __init sh7206_devices_setup(void)
+{
+       return platform_add_devices(sh7206_devices,
+                                   ARRAY_SIZE(sh7206_devices));
+}
+__initcall(sh7206_devices_setup);
index 58d3815695ffa70d21f15f4243461223b0b70064..83905e4e43872017ea905073f12410eca98e3a80 100644 (file)
@@ -2,7 +2,7 @@
 # Makefile for the Linux/SuperH SH-3 backends.
 #
 
-obj-y  := ex.o probe.o
+obj-y  := ex.o probe.o entry.o
 
 # CPU subtype setup
 obj-$(CONFIG_CPU_SUBTYPE_SH7705)       += setup-sh7705.o
index 10461a745e5f0f89471fea0c04dfe9c19f6a96ef..b791a29fdb6245773c045eb55ab5e39e2e830e79 100644 (file)
@@ -24,7 +24,7 @@ static int pfc_divisors[]    = { 1, 2, 4, 1, 3, 6, 1, 1 };
 
 static void set_bus_parent(struct clk *clk)
 {
-       struct clk *bus_clk = clk_get("bus_clk");
+       struct clk *bus_clk = clk_get(NULL, "bus_clk");
        clk->parent = bus_clk;
        clk_put(bus_clk);
 }
similarity index 58%
rename from arch/sh/kernel/entry.S
rename to arch/sh/kernel/cpu/sh3/entry.S
index 39aaefb2d83f427d58a0b05ad48a45868dfba2e2..8c0dc2700c69ebc79df3085e0c2e93ce2099a6bb 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/arch/sh/entry.S
+ * arch/sh/kernel/entry.S
  *
  *  Copyright (C) 1999, 2000, 2002  Niibe Yutaka
  *  Copyright (C) 2003 - 2006  Paul Mundt
@@ -7,15 +7,16 @@
  * This file is subject to the terms and conditions of the GNU General Public
  * License.  See the file "COPYING" in the main directory of this archive
  * for more details.
- *
  */
 #include <linux/sys.h>
 #include <linux/errno.h>
 #include <linux/linkage.h>
 #include <asm/asm-offsets.h>
 #include <asm/thread_info.h>
-#include <asm/cpu/mmu_context.h>
 #include <asm/unistd.h>
+#include <asm/cpu/mmu_context.h>
+#include <asm/pgtable.h>
+#include <asm/page.h>
 
 ! NOTE:
 ! GNU as (as of 2.9.1) changes bf/s into bt/s and bra, when the address
@@ -81,6 +82,8 @@ OFF_TRA       =  (16*4+6*4)
 #define k_g_imask      r6_bank /* r6_bank1 */
 #define current                r7      /* r7_bank1 */
 
+#include <asm/entry-macros.S>
+       
 /*
  * Kernel mode register usage:
  *     k0      scratch
@@ -107,26 +110,6 @@ OFF_TRA    =  (16*4+6*4)
 ! this first version depends *much* on C implementation.
 !
 
-#define CLI()                          \
-       stc     sr, r0;                 \
-       or      #0xf0, r0;              \
-       ldc     r0, sr
-
-#define STI()                          \
-       mov.l   __INV_IMASK, r11;       \
-       stc     sr, r10;                \
-       and     r11, r10;               \
-       stc     k_g_imask, r11;         \
-       or      r11, r10;               \
-       ldc     r10, sr
-
-#if defined(CONFIG_PREEMPT)
-#  define preempt_stop()       CLI()
-#else
-#  define preempt_stop()
-#  define resume_kernel                restore_all
-#endif
-
 #if defined(CONFIG_MMU)
        .align  2
 ENTRY(tlb_miss_load)
@@ -155,29 +138,14 @@ ENTRY(tlb_protection_violation_store)
 
 call_dpf:
        mov.l   1f, r0
-       mov     r5, r8
-       mov.l   @r0, r6
-       mov     r6, r9
-       mov.l   2f, r0
-       sts     pr, r10
-       jsr     @r0
-        mov    r15, r4
-       !
-       tst     r0, r0
-       bf/s    0f
-        lds    r10, pr
-       rts
-        nop
-0:     STI()
+       mov.l   @r0, r6         ! address
        mov.l   3f, r0
-       mov     r9, r6
-       mov     r8, r5
+
        jmp     @r0
-        mov    r15, r4
+        mov    r15, r4         ! regs
 
        .align 2
 1:     .long   MMU_TEA
-2:     .long   __do_page_fault
 3:     .long   do_page_fault
 
        .align  2
@@ -203,32 +171,6 @@ call_dae:
 2:     .long   do_address_error
 #endif /* CONFIG_MMU */
 
-#if defined(CONFIG_SH_STANDARD_BIOS) || defined(CONFIG_SH_KGDB)
-! Handle kernel debug if either kgdb (SW) or gdb-stub (FW) is present.
-! If both are configured, handle the debug traps (breakpoints) in SW,
-! but still allow BIOS traps to FW.
-
-       .align  2
-debug_kernel:
-#if defined(CONFIG_SH_STANDARD_BIOS) && defined(CONFIG_SH_KGDB)
-       /* Force BIOS call to FW (debug_trap put TRA in r8) */
-       mov     r8,r0
-       shlr2   r0
-       cmp/eq  #0x3f,r0
-       bt      debug_kernel_fw
-#endif /* CONFIG_SH_STANDARD_BIOS && CONFIG_SH_KGDB */
-
-debug_enter:           
-#if defined(CONFIG_SH_KGDB)
-       /* Jump to kgdb, pass stacked regs as arg */
-debug_kernel_sw:
-       mov.l   3f, r0
-       jmp     @r0
-        mov    r15, r4
-       .align  2
-3:     .long   kgdb_handle_exception
-#endif /* CONFIG_SH_KGDB */
-
 #if defined(CONFIG_SH_STANDARD_BIOS)
        /* Unwind the stack and jmp to the debug entry */
 debug_kernel_fw:
@@ -269,276 +211,6 @@ debug_kernel_fw:
 2:     .long   gdb_vbr_vector
 #endif /* CONFIG_SH_STANDARD_BIOS */
 
-#endif /* CONFIG_SH_STANDARD_BIOS || CONFIG_SH_KGDB */
-
-
-       .align  2
-debug_trap:    
-#if defined(CONFIG_SH_STANDARD_BIOS) || defined(CONFIG_SH_KGDB)
-       mov     #OFF_SR, r0
-       mov.l   @(r0,r15), r0           ! get status register
-       shll    r0
-       shll    r0                      ! kernel space?
-       bt/s    debug_kernel
-#endif
-        mov.l  @r15, r0                ! Restore R0 value
-       mov.l   1f, r8
-       jmp     @r8
-        nop
-
-       .align  2
-ENTRY(exception_error)
-       !
-       STI()
-       mov.l   2f, r0
-       jmp     @r0
-        nop
-
-!
-       .align  2
-1:     .long   break_point_trap_software
-2:     .long   do_exception_error
-
-       .align  2
-ret_from_exception:
-       preempt_stop()
-ENTRY(ret_from_irq)
-       !
-       mov     #OFF_SR, r0
-       mov.l   @(r0,r15), r0   ! get status register
-       shll    r0
-       shll    r0              ! kernel space?
-       bt/s    resume_kernel   ! Yes, it's from kernel, go back soon
-        GET_THREAD_INFO(r8)
-
-#ifdef CONFIG_PREEMPT
-       bra     resume_userspace
-        nop
-ENTRY(resume_kernel)
-       mov.l   @(TI_PRE_COUNT,r8), r0  ! current_thread_info->preempt_count
-       tst     r0, r0
-       bf      noresched
-need_resched:
-       mov.l   @(TI_FLAGS,r8), r0      ! current_thread_info->flags
-       tst     #_TIF_NEED_RESCHED, r0  ! need_resched set?
-       bt      noresched
-
-       mov     #OFF_SR, r0
-       mov.l   @(r0,r15), r0           ! get status register
-       and     #0xf0, r0               ! interrupts off (exception path)?
-       cmp/eq  #0xf0, r0
-       bt      noresched
-
-       mov.l   1f, r0
-       mov.l   r0, @(TI_PRE_COUNT,r8)
-
-       STI()
-       mov.l   2f, r0
-       jsr     @r0
-        nop
-       mov     #0, r0
-       mov.l   r0, @(TI_PRE_COUNT,r8)
-       CLI()
-
-       bra     need_resched
-        nop
-noresched:
-       bra     restore_all
-        nop
-
-       .align 2
-1:     .long   PREEMPT_ACTIVE
-2:     .long   schedule
-#endif
-
-ENTRY(resume_userspace)
-       ! r8: current_thread_info
-       CLI()
-       mov.l   @(TI_FLAGS,r8), r0              ! current_thread_info->flags
-       tst     #_TIF_WORK_MASK, r0
-       bt/s    restore_all
-        tst    #_TIF_NEED_RESCHED, r0
-
-       .align  2
-work_pending:
-       ! r0: current_thread_info->flags
-       ! r8: current_thread_info
-       ! t:  result of "tst    #_TIF_NEED_RESCHED, r0"
-       bf/s    work_resched
-        tst    #(_TIF_SIGPENDING | _TIF_RESTORE_SIGMASK), r0
-work_notifysig:
-       bt/s    restore_all
-        mov    r15, r4
-       mov     r12, r5         ! set arg1(save_r0)
-       mov     r0, r6
-       mov.l   2f, r1
-       mova    restore_all, r0
-       jmp     @r1
-        lds    r0, pr
-work_resched:
-#ifndef CONFIG_PREEMPT
-       ! gUSA handling
-       mov.l   @(OFF_SP,r15), r0       ! get user space stack pointer
-       mov     r0, r1
-       shll    r0
-       bf/s    1f
-        shll   r0
-       bf/s    1f
-        mov    #OFF_PC, r0
-       !                                 SP >= 0xc0000000 : gUSA mark
-       mov.l   @(r0,r15), r2           ! get user space PC (program counter)
-       mov.l   @(OFF_R0,r15), r3       ! end point
-       cmp/hs  r3, r2                  ! r2 >= r3? 
-       bt      1f
-       add     r3, r1                  ! rewind point #2
-       mov.l   r1, @(r0,r15)           ! reset PC to rewind point #2
-       !
-1:
-#endif
-       mov.l   1f, r1
-       jsr     @r1                             ! schedule
-        nop
-       CLI()
-       !
-       mov.l   @(TI_FLAGS,r8), r0              ! current_thread_info->flags
-       tst     #_TIF_WORK_MASK, r0
-       bt      restore_all
-       bra     work_pending
-        tst    #_TIF_NEED_RESCHED, r0
-
-       .align  2
-1:     .long   schedule
-2:     .long   do_notify_resume
-
-       .align  2
-syscall_exit_work:
-       ! r0: current_thread_info->flags
-       ! r8: current_thread_info
-       tst     #_TIF_SYSCALL_TRACE, r0
-       bt/s    work_pending
-        tst    #_TIF_NEED_RESCHED, r0
-       STI()
-       ! XXX setup arguments...
-       mov.l   4f, r0                  ! do_syscall_trace
-       jsr     @r0
-        nop
-       bra     resume_userspace
-        nop
-
-       .align  2
-syscall_trace_entry:
-       !                       Yes it is traced.
-       ! XXX setup arguments...
-       mov.l   4f, r11         ! Call do_syscall_trace which notifies
-       jsr     @r11            ! superior (will chomp R[0-7])
-        nop
-       !                       Reload R0-R4 from kernel stack, where the
-       !                       parent may have modified them using
-       !                       ptrace(POKEUSR).  (Note that R0-R2 are
-       !                       used by the system call handler directly
-       !                       from the kernel stack anyway, so don't need
-       !                       to be reloaded here.)  This allows the parent
-       !                       to rewrite system calls and args on the fly.
-       mov.l   @(OFF_R4,r15), r4   ! arg0
-       mov.l   @(OFF_R5,r15), r5
-       mov.l   @(OFF_R6,r15), r6
-       mov.l   @(OFF_R7,r15), r7   ! arg3
-       mov.l   @(OFF_R3,r15), r3   ! syscall_nr
-       !                   Arrange for do_syscall_trace to be called
-       !                   again as the system call returns.
-       mov.l   2f, r10                 ! Number of syscalls
-       cmp/hs  r10, r3
-       bf      syscall_call
-       mov     #-ENOSYS, r0
-       bra     syscall_exit
-        mov.l  r0, @(OFF_R0,r15)       ! Return value
-
-/*
- * Syscall interface:
- *
- *     Syscall #: R3
- *     Arguments #0 to #3: R4--R7
- *     Arguments #4 to #6: R0, R1, R2
- *     TRA: (number of arguments + 0x10) x 4
- *
- * This code also handles delegating other traps to the BIOS/gdb stub
- * according to:
- *
- * Trap number
- * (TRA>>2)        Purpose
- * --------        -------
- * 0x0-0xf         old syscall ABI
- * 0x10-0x1f       new syscall ABI
- * 0x20-0xff       delegated through debug_trap to BIOS/gdb stub.
- *
- * Note: When we're first called, the TRA value must be shifted
- * right 2 bits in order to get the value that was used as the "trapa"
- * argument.
- */
-
-       .align  2
-       .globl  ret_from_fork
-ret_from_fork:
-       mov.l   1f, r8
-       jsr     @r8
-        mov    r0, r4
-       bra     syscall_exit
-        nop
-       .align  2
-1:     .long   schedule_tail
-       !
-ENTRY(system_call)
-       mov.l   1f, r9
-       mov.l   @r9, r8         ! Read from TRA (Trap Address) Register
-       !
-       ! Is the trap argument >= 0x20? (TRA will be >= 0x80)
-       mov     #0x7f, r9
-       cmp/hi  r9, r8
-       bt/s    0f
-        mov    #OFF_TRA, r9
-       add     r15, r9
-       !
-       mov.l   r8, @r9                 ! set TRA value to tra
-       STI()
-       !                   Call the system call handler through the table.
-       !                   First check for bad syscall number
-       mov     r3, r9
-       mov.l   2f, r8                  ! Number of syscalls
-       cmp/hs  r8, r9
-       bf/s    good_system_call
-        GET_THREAD_INFO(r8)
-syscall_badsys:                        ! Bad syscall number
-       mov     #-ENOSYS, r0
-       bra     resume_userspace
-        mov.l  r0, @(OFF_R0,r15)       ! Return value
-       !
-0:
-       bra     debug_trap
-        nop
-       !
-good_system_call:              ! Good syscall number
-       mov.l   @(TI_FLAGS,r8), r8
-       mov     #_TIF_SYSCALL_TRACE, r10
-       tst     r10, r8
-       bf      syscall_trace_entry
-       !
-syscall_call:
-       shll2   r9              ! x4
-       mov.l   3f, r8          ! Load the address of sys_call_table
-       add     r8, r9
-       mov.l   @r9, r8
-       jsr     @r8             ! jump to specific syscall handler
-        nop
-       mov.l   @(OFF_R0,r15), r12              ! save r0
-       mov.l   r0, @(OFF_R0,r15)               ! save the return value
-       !
-syscall_exit:
-       CLI()
-       !
-       GET_THREAD_INFO(r8)
-       mov.l   @(TI_FLAGS,r8), r0              ! current_thread_info->flags
-       tst     #_TIF_ALLWORK_MASK, r0
-       bf      syscall_exit_work
 restore_all:
        mov.l   @r15+, r0
        mov.l   @r15+, r1
@@ -606,7 +278,9 @@ skip_restore:
        !
        ! Calculate new SR value
        mov     k3, k2                  ! original SR value
-       mov.l   9f, k1
+       mov     #0xf0, k1
+       extu.b  k1, k1
+       not     k1, k1
        and     k1, k2                  ! Mask orignal SR value
        !
        mov     k3, k0                  ! Calculate IMASK-bits
@@ -632,16 +306,12 @@ skip_restore:
         nop
 
        .align  2
-1:     .long   TRA
-2:     .long   NR_syscalls
-3:     .long   sys_call_table
-4:     .long   do_syscall_trace
 5:     .long   0x00001000      ! DSP
 7:     .long   0x30000000
-9:
-__INV_IMASK:
-       .long   0xffffff0f      ! ~(IMASK)
 
+! common exception handler
+#include "../../entry-common.S"
+       
 ! Exception Vector Base
 !
 !      Should be aligned page boundary.
@@ -661,9 +331,176 @@ general_exception:
 2:     .long   ret_from_exception
 !
 !
+
+/* This code makes some assumptions to improve performance.
+ * Make sure they are stil true. */
+#if PTRS_PER_PGD != PTRS_PER_PTE
+#error PGD and PTE sizes don't match
+#endif
+
+/* gas doesn't flag impossible values for mov #immediate as an error */
+#if (_PAGE_PRESENT >> 2) > 0x7f
+#error cannot load PAGE_PRESENT as an immediate
+#endif
+#if _PAGE_DIRTY > 0x7f
+#error cannot load PAGE_DIRTY as an immediate
+#endif
+#if (_PAGE_PRESENT << 2) != _PAGE_ACCESSED
+#error cannot derive PAGE_ACCESSED from PAGE_PRESENT
+#endif
+
+#if defined(CONFIG_CPU_SH4)
+#define ldmmupteh(r)   mov.l   8f, r
+#else
+#define ldmmupteh(r)   mov     #MMU_PTEH, r
+#endif
+
        .balign         1024,0,1024
 tlb_miss:
-       mov.l   1f, k2
+#ifdef COUNT_EXCEPTIONS
+       ! Increment the counts
+       mov.l   9f, k1
+       mov.l   @k1, k2
+       add     #1, k2
+       mov.l   k2, @k1
+#endif
+
+       ! k0 scratch
+       ! k1 pgd and pte pointers
+       ! k2 faulting address
+       ! k3 pgd and pte index masks
+       ! k4 shift
+
+       ! Load up the pgd entry (k1)
+
+       ldmmupteh(k0)                   !  9 LS (latency=2)     MMU_PTEH
+
+       mov.w   4f, k3                  !  8 LS (latency=2)     (PTRS_PER_PGD-1) << 2
+       mov     #-(PGDIR_SHIFT-2), k4   !  6 EX
+
+       mov.l   @(MMU_TEA-MMU_PTEH,k0), k2      ! 18 LS (latency=2)
+
+       mov.l   @(MMU_TTB-MMU_PTEH,k0), k1      ! 18 LS (latency=2)
+
+       mov     k2, k0                  !   5 MT (latency=0)
+       shld    k4, k0                  !  99 EX
+
+       and     k3, k0                  !  78 EX
+
+       mov.l   @(k0, k1), k1           !  21 LS (latency=2)
+       mov     #-(PAGE_SHIFT-2), k4    !   6 EX
+
+       ! Load up the pte entry (k2)
+
+       mov     k2, k0                  !   5 MT (latency=0)
+       shld    k4, k0                  !  99 EX
+
+       tst     k1, k1                  !  86 MT
+
+       bt      20f                     ! 110 BR
+
+       and     k3, k0                  !  78 EX
+       mov.w   5f, k4                  !   8 LS (latency=2)    _PAGE_PRESENT
+
+       mov.l   @(k0, k1), k2           !  21 LS (latency=2)
+       add     k0, k1                  !  49 EX
+
+#ifdef CONFIG_CPU_HAS_PTEA
+       ! Test the entry for present and _PAGE_ACCESSED
+
+       mov     #-28, k3                !   6 EX
+       mov     k2, k0                  !   5 MT (latency=0)
+
+       tst     k4, k2                  !  68 MT
+       shld    k3, k0                  !  99 EX
+
+       bt      20f                     ! 110 BR
+
+       ! Set PTEA register
+       ! MMU_PTEA = ((pteval >> 28) & 0xe) | (pteval & 0x1)
+       !
+       ! k0=pte>>28, k1=pte*, k2=pte, k3=<unused>, k4=_PAGE_PRESENT
+
+       and     #0xe, k0                !  79 EX
+
+       mov     k0, k3                  !   5 MT (latency=0)
+       mov     k2, k0                  !   5 MT (latency=0)
+
+       and     #1, k0                  !  79 EX
+
+       or      k0, k3                  !  82 EX
+
+       ldmmupteh(k0)                   !   9 LS (latency=2)
+       shll2   k4                      ! 101 EX                _PAGE_ACCESSED
+
+       tst     k4, k2                  !  68 MT
+
+       mov.l   k3, @(MMU_PTEA-MMU_PTEH,k0)     ! 27 LS
+
+       mov.l   7f, k3                  !   9 LS (latency=2)    _PAGE_FLAGS_HARDWARE_MASK
+
+       ! k0=MMU_PTEH, k1=pte*, k2=pte, k3=_PAGE_FLAGS_HARDWARE, k4=_PAGE_ACCESSED
+#else
+
+       ! Test the entry for present and _PAGE_ACCESSED
+
+       mov.l   7f, k3                  !   9 LS (latency=2)    _PAGE_FLAGS_HARDWARE_MASK
+       tst     k4, k2                  !  68 MT
+
+       shll2   k4                      ! 101 EX                _PAGE_ACCESSED
+       ldmmupteh(k0)                   !   9 LS (latency=2)
+
+       bt      20f                     ! 110 BR
+       tst     k4, k2                  !  68 MT
+
+       ! k0=MMU_PTEH, k1=pte*, k2=pte, k3=_PAGE_FLAGS_HARDWARE, k4=_PAGE_ACCESSED
+
+#endif
+
+       ! Set up the entry
+
+       and     k2, k3                  !  78 EX
+       bt/s    10f                     ! 108 BR
+
+        mov.l  k3, @(MMU_PTEL-MMU_PTEH,k0)     ! 27 LS
+
+       ldtlb                           ! 128 CO
+
+       ! At least one instruction between ldtlb and rte
+       nop                             ! 119 NOP
+
+       rte                             ! 126 CO
+
+        nop                            ! 119 NOP
+
+
+10:    or      k4, k2                  !  82 EX
+
+       ldtlb                           ! 128 CO
+
+       ! At least one instruction between ldtlb and rte
+       mov.l   k2, @k1                 !  27 LS
+
+       rte                             ! 126 CO
+
+       ! Note we cannot execute mov here, because it is executed after
+       ! restoring SSR, so would be executed in user space.
+        nop                            ! 119 NOP
+
+
+       .align 5
+       ! Once cache line if possible...
+1:     .long   swapper_pg_dir
+4:     .short  (PTRS_PER_PGD-1) << 2
+5:     .short  _PAGE_PRESENT
+7:     .long   _PAGE_FLAGS_HARDWARE_MASK
+8:     .long   MMU_PTEH
+#ifdef COUNT_EXCEPTIONS
+9:     .long   exception_count_miss
+#endif
+
+       ! Either pgd or pte not present
+20:    mov.l   1f, k2
        mov.l   4f, k3
        bra     handle_exception
         mov.l  @k2, k2
@@ -710,8 +547,9 @@ ENTRY(handle_exception)
        bt/s    1f              ! It's a kernel to kernel transition.
         mov    r15, k0         ! save original stack to k0
        /* User space to kernel */
-       mov     #(THREAD_SIZE >> 8), k1
+       mov     #(THREAD_SIZE >> 10), k1
        shll8   k1              ! k1 := THREAD_SIZE
+       shll2   k1
        add     current, k1
        mov     k1, r15         ! change to kernel stack
        !
@@ -761,7 +599,7 @@ skip_save:
        ! Save the user registers on the stack.
        mov.l   k2, @-r15       ! EXPEVT
 
-       mov     #-1, k4
+       mov     #-1, k4
        mov.l   k4, @-r15       ! set TRA (default: -1)
        !
        sts.l   macl, @-r15
@@ -813,6 +651,15 @@ skip_save:
        bf      interrupt_exception
        shlr2   r8
        shlr    r8
+
+#ifdef COUNT_EXCEPTIONS
+       mov.l   5f, r9
+       add     r8, r9
+       mov.l   @r9, r10
+       add     #1, r10
+       mov.l   r10, @r9
+#endif
+
        mov.l   4f, r9
        add     r8, r9
        mov.l   @r9, r9
@@ -826,6 +673,9 @@ skip_save:
 2:     .long   0x000080f0      ! FD=1, IMASK=15
 3:     .long   0xcfffffff      ! RB=0, BL=0
 4:     .long   exception_handling_table
+#ifdef COUNT_EXCEPTIONS
+5:     .long   exception_count_table
+#endif
 
 interrupt_exception:
        mov.l   1f, r9
index 8dbf3895ece7406c248e2405f8bc18b2392f0f81..6e415baf04b4f23bfb5767172dfbe18485ec1b2e 100644 (file)
@@ -2,7 +2,8 @@
 # Makefile for the Linux/SuperH SH-4 backends.
 #
 
-obj-y  := ex.o probe.o
+obj-y  := ex.o probe.o common.o
+common-y       += $(addprefix ../sh3/, entry.o)
 
 obj-$(CONFIG_SH_FPU)                    += fpu.o
 obj-$(CONFIG_SH_STORE_QUEUES)          += sq.o
index bfdf5fe8d948f221ac2ef2371a952dbfd6f18561..fa2019aabd74f1827bfb4c8374b6be842393a616 100644 (file)
@@ -97,7 +97,7 @@ static void shoc_clk_recalc(struct clk *clk)
 
 static int shoc_clk_verify_rate(struct clk *clk, unsigned long rate)
 {
-       struct clk *bclk = clk_get("bus_clk");
+       struct clk *bclk = clk_get(NULL, "bus_clk");
        unsigned long bclk_rate = clk_get_rate(bclk);
 
        clk_put(bclk);
@@ -151,7 +151,7 @@ static struct clk *sh4202_onchip_clocks[] = {
 
 static int __init sh4202_clk_init(void)
 {
-       struct clk *clk = clk_get("master_clk");
+       struct clk *clk = clk_get(NULL, "master_clk");
        int i;
 
        for (i = 0; i < ARRAY_SIZE(sh4202_onchip_clocks); i++) {
index 93ad367342c9c6a715a4ea96f22b987a007f967b..9e6a216750c800529788b340aa12fdb7f5956f17 100644 (file)
@@ -98,7 +98,7 @@ static struct clk *sh7780_onchip_clocks[] = {
 
 static int __init sh7780_clk_init(void)
 {
-       struct clk *clk = clk_get("master_clk");
+       struct clk *clk = clk_get(NULL, "master_clk");
        int i;
 
        for (i = 0; i < ARRAY_SIZE(sh7780_onchip_clocks); i++) {
index f486c07e10e286b9d4776874beefb6b184584203..7624677f66281e7ef31b99d9b48caf1bc7534b5d 100644 (file)
@@ -282,11 +282,8 @@ ieee_fpe_handler (struct pt_regs *regs)
                        grab_fpu(regs);
                        restore_fpu(tsk);
                        set_tsk_thread_flag(tsk, TIF_USEDFPU);
-               } else {
-                       tsk->thread.trap_no = 11;
-                       tsk->thread.error_code = 0;
+               } else
                        force_sig(SIGFPE, tsk);
-               }
 
                regs->pc = nextpc;
                return 1;
@@ -296,29 +293,29 @@ ieee_fpe_handler (struct pt_regs *regs)
 }
 
 asmlinkage void
-do_fpu_error(unsigned long r4, unsigned long r5, unsigned long r6, unsigned long r7,
-            struct pt_regs regs)
+do_fpu_error(unsigned long r4, unsigned long r5, unsigned long r6,
+            unsigned long r7, struct pt_regs __regs)
 {
+       struct pt_regs *regs = RELOC_HIDE(&__regs, 0);
        struct task_struct *tsk = current;
 
-       if (ieee_fpe_handler (&regs))
+       if (ieee_fpe_handler(regs))
                return;
 
-       regs.pc += 2;
-       save_fpu(tsk, &regs);
-       tsk->thread.trap_no = 11;
-       tsk->thread.error_code = 0;
+       regs->pc += 2;
+       save_fpu(tsk, regs);
        force_sig(SIGFPE, tsk);
 }
 
 asmlinkage void
 do_fpu_state_restore(unsigned long r4, unsigned long r5, unsigned long r6,
-                    unsigned long r7, struct pt_regs regs)
+                    unsigned long r7, struct pt_regs __regs)
 {
+       struct pt_regs *regs = RELOC_HIDE(&__regs, 0);
        struct task_struct *tsk = current;
 
-       grab_fpu(&regs);
-       if (!user_mode(&regs)) {
+       grab_fpu(regs);
+       if (!user_mode(regs)) {
                printk(KERN_ERR "BUG: FPU is used in kernel mode.\n");
                return;
        }
index c294de1e14a3c2ae8d994e25a7f238fcbce9b8b6..afe0f1b1c030636f6cd156c8d48796d5843e0cb4 100644 (file)
@@ -79,16 +79,16 @@ int __init detect_cpu_and_cache_system(void)
        case 0x205:
                cpu_data->type = CPU_SH7750;
                cpu_data->flags |= CPU_HAS_P2_FLUSH_BUG | CPU_HAS_FPU |
-                                  CPU_HAS_PERF_COUNTER | CPU_HAS_PTEA;
+                                  CPU_HAS_PERF_COUNTER;
                break;
        case 0x206:
                cpu_data->type = CPU_SH7750S;
                cpu_data->flags |= CPU_HAS_P2_FLUSH_BUG | CPU_HAS_FPU |
-                                  CPU_HAS_PERF_COUNTER | CPU_HAS_PTEA;
+                                  CPU_HAS_PERF_COUNTER;
                break;
        case 0x1100:
                cpu_data->type = CPU_SH7751;
-               cpu_data->flags |= CPU_HAS_FPU | CPU_HAS_PTEA;
+               cpu_data->flags |= CPU_HAS_FPU;
                break;
        case 0x2000:
                cpu_data->type = CPU_SH73180;
@@