This list is closed, nobody may subscribe to it.
2004 |
Jan
(53) |
Feb
(78) |
Mar
(34) |
Apr
(26) |
May
(25) |
Jun
(34) |
Jul
(16) |
Aug
(16) |
Sep
(2) |
Oct
(58) |
Nov
(13) |
Dec
(32) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2005 |
Jan
(62) |
Feb
(4) |
Mar
(40) |
Apr
(9) |
May
(13) |
Jun
(26) |
Jul
(32) |
Aug
(24) |
Sep
(18) |
Oct
(18) |
Nov
(14) |
Dec
|
2006 |
Jan
(15) |
Feb
(2) |
Mar
(23) |
Apr
(2) |
May
(2) |
Jun
(13) |
Jul
|
Aug
|
Sep
|
Oct
|
Nov
(1) |
Dec
|
2007 |
Jan
(1) |
Feb
(45) |
Mar
|
Apr
(13) |
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
(1) |
Nov
(31) |
Dec
(5) |
2008 |
Jan
(6) |
Feb
(34) |
Mar
(113) |
Apr
(40) |
May
(19) |
Jun
(5) |
Jul
(41) |
Aug
(13) |
Sep
(53) |
Oct
(4) |
Nov
(53) |
Dec
|
2009 |
Jan
(1) |
Feb
(29) |
Mar
(66) |
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
(163) |
Nov
|
Dec
(91) |
From: Albert H. <he...@us...> - 2008-03-27 22:36:50
|
Update of /cvsroot/gc-linux/linux/drivers/serial In directory sc8-pr-cvs2.sourceforge.net:/tmp/cvs-serv15970/drivers/serial Modified Files: usbgecko.c Log Message: Small cleanups: - Added copyright notices to the DTS files. - Renamed DTS node names and compatible properties as per segher suggestion. - s/-isobel/i/ from version strings. - Added missing arch/powerpc/platforms/embedded6xx/usbgecko_udbg.h file. - s/DVD/Disk/ on gcn-di.c. - Use "exi" instead of "exi-driver" in exi-driver messages. Index: usbgecko.c =================================================================== RCS file: /cvsroot/gc-linux/linux/drivers/serial/usbgecko.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- usbgecko.c 26 Mar 2008 20:15:21 -0000 1.3 +++ usbgecko.c 27 Mar 2008 22:35:41 -0000 1.4 @@ -31,7 +31,7 @@ #define DRV_DESCRIPTION "Console and TTY driver for the USB Gecko adapter" #define DRV_AUTHOR "Albert Herranz" -static char ug_driver_version[] = "0.1-isobel"; +static char ug_driver_version[] = "0.1i"; #define drv_printk(level, format, arg...) \ printk(level DRV_MODULE_NAME ": " format , ## arg) |
From: Albert H. <he...@us...> - 2008-03-27 22:36:50
|
Update of /cvsroot/gc-linux/linux/drivers/input/si In directory sc8-pr-cvs2.sourceforge.net:/tmp/cvs-serv15970/drivers/input/si Modified Files: gcn-si.c Log Message: Small cleanups: - Added copyright notices to the DTS files. - Renamed DTS node names and compatible properties as per segher suggestion. - s/-isobel/i/ from version strings. - Added missing arch/powerpc/platforms/embedded6xx/usbgecko_udbg.h file. - s/DVD/Disk/ on gcn-di.c. - Use "exi" instead of "exi-driver" in exi-driver messages. Index: gcn-si.c =================================================================== RCS file: /cvsroot/gc-linux/linux/drivers/input/si/gcn-si.c,v retrieving revision 1.10 retrieving revision 1.11 diff -u -d -r1.10 -r1.11 --- gcn-si.c 26 Mar 2008 23:25:11 -0000 1.10 +++ gcn-si.c 27 Mar 2008 22:35:38 -0000 1.11 @@ -42,7 +42,7 @@ #define DRV_AUTHOR "Steven Looman <st...@kr...>, " \ "Albert Herranz" -static char si_driver_version[] = "1.0-isobel"; +static char si_driver_version[] = "1.0i"; #define drv_printk(level, format, arg...) \ printk(level DRV_MODULE_NAME ": " format , ## arg) @@ -685,7 +685,8 @@ } static struct of_device_id si_of_match[] = { - { .compatible = "nintendo,si" }, + { .compatible = "nintendo,flipper-serial" }, + { .compatible = "nintendo,hollywood-serial" }, { }, }; |
From: Albert H. <he...@us...> - 2008-03-27 22:36:50
|
Update of /cvsroot/gc-linux/linux/drivers/rtc In directory sc8-pr-cvs2.sourceforge.net:/tmp/cvs-serv15970/drivers/rtc Modified Files: rtc-gcn.c Log Message: Small cleanups: - Added copyright notices to the DTS files. - Renamed DTS node names and compatible properties as per segher suggestion. - s/-isobel/i/ from version strings. - Added missing arch/powerpc/platforms/embedded6xx/usbgecko_udbg.h file. - s/DVD/Disk/ on gcn-di.c. - Use "exi" instead of "exi-driver" in exi-driver messages. Index: rtc-gcn.c =================================================================== RCS file: /cvsroot/gc-linux/linux/drivers/rtc/rtc-gcn.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- rtc-gcn.c 26 Mar 2008 22:09:29 -0000 1.1 +++ rtc-gcn.c 27 Mar 2008 22:35:40 -0000 1.2 @@ -25,7 +25,7 @@ #define DRV_AUTHOR "Torben Nielsen, " \ "Albert Herranz" -static char gcnrtc_driver_version[] = "1.0-isobel"; +static char gcnrtc_driver_version[] = "1.0i"; #define drv_printk(level, format, arg...) \ printk(level DRV_MODULE_NAME ": " format , ## arg) |
From: Albert H. <he...@us...> - 2008-03-27 22:36:50
|
Update of /cvsroot/gc-linux/linux/arch/powerpc/boot/dts In directory sc8-pr-cvs2.sourceforge.net:/tmp/cvs-serv15970/arch/powerpc/boot/dts Modified Files: gamecube.dts wii.dts Log Message: Small cleanups: - Added copyright notices to the DTS files. - Renamed DTS node names and compatible properties as per segher suggestion. - s/-isobel/i/ from version strings. - Added missing arch/powerpc/platforms/embedded6xx/usbgecko_udbg.h file. - s/DVD/Disk/ on gcn-di.c. - Use "exi" instead of "exi-driver" in exi-driver messages. Index: gamecube.dts =================================================================== RCS file: /cvsroot/gc-linux/linux/arch/powerpc/boot/dts/gamecube.dts,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- gamecube.dts 26 Mar 2008 19:48:47 -0000 1.2 +++ gamecube.dts 27 Mar 2008 22:35:20 -0000 1.3 @@ -1,10 +1,17 @@ /* + * arch/powerpc/boot/dts/gamecube.dts + * + * Nintendo GameCube platform device tree source + * Copyright (C) 2007-2008 The GameCube Linux Team + * Copyright (C) 2007,2008 Albert Herranz * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. * */ -/* /memreserve/ 01654000-017fffff; */ - / { model = "NintendoGameCube"; compatible = "nintendo,gamecube"; @@ -12,22 +19,20 @@ #size-cells = <1>; chosen { - //bootargs = "root=/dev/ram0 video=gcn-vifb:tv=auto ip=192.168.001.047:192.168.001.253:192.168.001.251 force_keyboard_port=4"; + //bootargs = "root=/dev/ram0 video=gcn-vifb:tv=auto ip=on force_keyboard_port=4"; bootargs = "root=/dev/nfs nfsroot=192.168.001.253:/nfsroot/cube video=gcn-vifb:tv=auto ip=192.168.001.047:192.168.001.253:192.168.001.251 force_keyboard_port=4"; linux,crashkernel-base = <0>; linux,crashkernel-size = <0>; - linux,stdout-path = "/exi@0c006800/usbgecko@0c006814"; }; memory { device_type = "memory"; - /* 24M - framebuffer - fifo - kexec, 00000000-01653fff */ - reg = <00000000 01654000>; + /* 24M minus framebuffer memory area (640*576*2*2) */ + reg = <00000000 01698000>; }; cpus { - #cpus = <1>; #address-cells = <1>; #size-cells = <0>; @@ -45,20 +50,21 @@ }; }; - flipper_pic: pic@0c003000 { + pic: pic@0c003000 { #interrupt-cells = <1>; compatible = "nintendo,flipper-pic"; reg = <0c003000 8>; interrupt-controller; }; + /* External Interface bus */ exi@0c006800 { #address-cells = <1>; #size-cells = <1>; - compatible = "nintendo,exi"; + compatible = "nintendo,flipper-exi"; reg = <0c006800 40>; interrupts = <04>; - interrupt-parent = <&flipper_pic>; + interrupt-parent = <&pic>; udbg_console: usbgecko@0c006814 { compatible = "usbgecko,usbgecko"; @@ -67,7 +73,8 @@ }; }; - flipper@0c000000 { + /* devices contained int the flipper chipset */ + soc { #address-cells = <1>; #size-cells = <1>; #interrupt-cells = <1>; @@ -76,49 +83,49 @@ clock-frequency = <9a7ec80>; /* 162MHz */ ranges = <0c000000 0c000000 00010000>; - vifb@0c002000 { - compatible = "nintendo,vifb"; + video@0c002000 { + compatible = "nintendo,flipper-video"; reg = <0c002000 100>; interrupts = <08>; - interrupt-parent = <&flipper_pic>; + interrupt-parent = <&pic>; xfb-start = <01698000>; /* end-of-ram - xfb-size */ xfb-size = <168000>; }; - rsw@0c003000 { - compatible = "nintendo,rsw"; + resetswitch@0c003000 { + compatible = "nintendo,flipper-resetswitch"; reg = <0c003000 4>; interrupts = <01>; - interrupt-parent = <&flipper_pic>; + interrupt-parent = <&pic>; }; - aram@0c005000 { - compatible = "nintendo,aram"; + auxram@0c005000 { + compatible = "nintendo,flipper-auxram"; reg = <0c005000 200>; /* DSP */ interrupts = <06>; - interrupt-parent = <&flipper_pic>; + interrupt-parent = <&pic>; }; - ai@0c005000 { - compatible = "nintendo,ai"; + audio@0c005000 { + compatible = "nintendo,flipper-audio"; reg = <0c005000 200 /* DSP */ 0c006c00 20>; /* AI */ interrupts = <06>; - interrupt-parent = <&flipper_pic>; + interrupt-parent = <&pic>; }; - di@0c006000 { - compatible = "nintendo,di"; + disk@0c006000 { + compatible = "nintendo,flipper-disk"; reg = <0c006000 40>; interrupts = <02>; - interrupt-parent = <&flipper_pic>; + interrupt-parent = <&pic>; }; - si@0c006400 { - compatible = "nintendo,si"; + serial@0c006400 { + compatible = "nintendo,flipper-serial"; reg = <0c006400 100>; interrupts = <03>; - interrupt-parent = <&flipper_pic>; + interrupt-parent = <&pic>; }; }; }; Index: wii.dts =================================================================== RCS file: /cvsroot/gc-linux/linux/arch/powerpc/boot/dts/wii.dts,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- wii.dts 26 Mar 2008 19:51:04 -0000 1.2 +++ wii.dts 27 Mar 2008 22:35:22 -0000 1.3 @@ -1,10 +1,17 @@ /* + * arch/powerpc/boot/dts/wii.dts * + * Nintendo Wii platform device tree source + * Copyright (C) 2008 The GameCube Linux Team + * Copyright (C) 2008 Albert Herranz + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. * */ -/* /memreserve/ 01654000-017fffff; */ - / { model = "NintendoWii"; compatible = "nintendo,wii"; @@ -12,18 +19,16 @@ #size-cells = <1>; chosen { - bootargs = "root=/dev/ram0 video=gcnfb:tv=auto ip=192.168.001.047:192.168.001.253:192.168.001.251 force_keyboard_port=4"; - + bootargs = "root=/dev/ram0 video=gcnfb:tv=auto ip=on force_keyboard_port=4"; linux,crashkernel-base = <0>; linux,crashkernel-size = <0>; - linux,stdout-path = "/exi@0d006800/usbgecko@0d006814"; }; memory { device_type = "memory"; - /* 24M - framebuffer - fifo - kexec, 00000000-01653fff */ - reg = <00000000 01654000 /* only 1st range is used */ + /* 24M minus framebuffer memory area (640*576*2*2) */ + reg = <00000000 01698000 /* only 1st range is used */ 10000000 04000000>; }; @@ -46,25 +51,27 @@ }; }; - hollywood_pic: pic@0c003000 { + pic: pic@0c003000 { #interrupt-cells = <1>; compatible = "nintendo,flipper-pic"; reg = <0c003000 8>; interrupt-controller; }; + /* MEM2 memory, discontiguous */ mem2 { - compatible = "nintendo,mem2"; + compatible = "nintendo,hollywood-mem2"; reg = <10000000 3400000>; /* 52M of MEM2 RAM */ }; + /* External Interface bus */ exi@0d006800 { #address-cells = <1>; #size-cells = <1>; - compatible = "nintendo,exi"; + compatible = "nintendo,hollywood-exi"; reg = <0d006800 40>; interrupts = <04>; - interrupt-parent = <&hollywood_pic>; + interrupt-parent = <&pic>; udbg_console: usbgecko@0d006814 { compatible = "usbgecko,usbgecko"; @@ -73,7 +80,8 @@ }; }; - hollywood { + /* devices contained in the hollywood chipset */ + soc { #address-cells = <1>; #size-cells = <1>; #interrupt-cells = <1>; @@ -83,42 +91,42 @@ ranges = <0c000000 0c000000 00010000 0d000000 0d000000 00010000>; - vifb@0c002000 { - compatible = "nintendo,vifb"; + video@0c002000 { + compatible = "nintendo,hollywood-video"; reg = <0c002000 100>; interrupts = <08>; - interrupt-parent = <&hollywood_pic>; + interrupt-parent = <&pic>; xfb-start = <01698000>; /* end-of-ram - xfb-size */ xfb-size = <168000>; }; - rsw@0c003000 { - compatible = "nintendo,rsw"; + resetswitch@0c003000 { + compatible = "nintendo,hollywood-resetswitch"; reg = <0c003000 4>; interrupts = <01>; - interrupt-parent = <&hollywood_pic>; + interrupt-parent = <&pic>; }; - ai@0c005000 { - compatible = "nintendo,ai"; + audio@0c005000 { + compatible = "nintendo,hollywood-audio"; reg = <0c005000 200 /* DSP */ 0d006c00 20>; /* AI */ interrupts = <06>; - interrupt-parent = <&hollywood_pic>; + interrupt-parent = <&pic>; }; starlet-ipc@0d000000 { compatible = "nintendo,starlet-ipc"; reg = <0d000000 40>; interrupts = <0e>; - interrupt-parent = <&hollywood_pic>; + interrupt-parent = <&pic>; }; - si@0d006400 { - compatible = "nintendo,si"; + serial@0d006400 { + compatible = "nintendo,hollywood-serial"; reg = <0d006400 100>; interrupts = <03>; - interrupt-parent = <&hollywood_pic>; + interrupt-parent = <&pic>; }; }; }; |
From: Albert H. <he...@us...> - 2008-03-27 22:36:50
|
Update of /cvsroot/gc-linux/linux/drivers/block In directory sc8-pr-cvs2.sourceforge.net:/tmp/cvs-serv15970/drivers/block Modified Files: gcn-aram.c gcn-sd.c rvl-mem2.c Log Message: Small cleanups: - Added copyright notices to the DTS files. - Renamed DTS node names and compatible properties as per segher suggestion. - s/-isobel/i/ from version strings. - Added missing arch/powerpc/platforms/embedded6xx/usbgecko_udbg.h file. - s/DVD/Disk/ on gcn-di.c. - Use "exi" instead of "exi-driver" in exi-driver messages. Index: rvl-mem2.c =================================================================== RCS file: /cvsroot/gc-linux/linux/drivers/block/rvl-mem2.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- rvl-mem2.c 26 Mar 2008 20:15:08 -0000 1.3 +++ rvl-mem2.c 27 Mar 2008 22:35:35 -0000 1.4 @@ -368,7 +368,7 @@ } static struct of_device_id mem2_of_match[] = { - { .compatible = "nintendo,mem2" }, + { .compatible = "nintendo,hollywood-mem2" }, { }, }; Index: gcn-sd.c =================================================================== RCS file: /cvsroot/gc-linux/linux/drivers/block/gcn-sd.c,v retrieving revision 1.13 retrieving revision 1.14 diff -u -d -r1.13 -r1.14 --- gcn-sd.c 26 Mar 2008 20:15:08 -0000 1.13 +++ gcn-sd.c 27 Mar 2008 22:35:28 -0000 1.14 @@ -82,7 +82,7 @@ MODULE_DESCRIPTION(DRV_DESCRIPTION); MODULE_LICENSE("GPL"); -static char sd_driver_version[] = "4.1-isobel"; +static char sd_driver_version[] = "4.1i"; #define sd_printk(level, format, arg...) \ printk(level DRV_MODULE_NAME ": " format , ## arg) Index: gcn-aram.c =================================================================== RCS file: /cvsroot/gc-linux/linux/drivers/block/gcn-aram.c,v retrieving revision 1.16 retrieving revision 1.17 diff -u -d -r1.16 -r1.17 --- gcn-aram.c 26 Mar 2008 20:15:08 -0000 1.16 +++ gcn-aram.c 27 Mar 2008 22:35:28 -0000 1.17 @@ -31,7 +31,7 @@ #define DRV_AUTHOR "Todd Jeffreys <to...@vo...>, " \ "Albert Herranz" -static char aram_driver_version[] = "4.0"; +static char aram_driver_version[] = "4.0i"; #define drv_printk(level, format, arg...) \ printk(level DRV_MODULE_NAME ": " format , ## arg) @@ -583,7 +583,7 @@ static struct of_device_id aram_of_match[] = { - { .compatible = "nintendo,aram" }, + { .compatible = "nintendo,flipper-auxram" }, { }, }; |
From: Albert H. <he...@us...> - 2008-03-27 22:36:50
|
Update of /cvsroot/gc-linux/linux/drivers/net In directory sc8-pr-cvs2.sourceforge.net:/tmp/cvs-serv15970/drivers/net Modified Files: gcn-bba.c Log Message: Small cleanups: - Added copyright notices to the DTS files. - Renamed DTS node names and compatible properties as per segher suggestion. - s/-isobel/i/ from version strings. - Added missing arch/powerpc/platforms/embedded6xx/usbgecko_udbg.h file. - s/DVD/Disk/ on gcn-di.c. - Use "exi" instead of "exi-driver" in exi-driver messages. Index: gcn-bba.c =================================================================== RCS file: /cvsroot/gc-linux/linux/drivers/net/gcn-bba.c,v retrieving revision 1.13 retrieving revision 1.14 diff -u -d -r1.13 -r1.14 --- gcn-bba.c 26 Mar 2008 20:15:20 -0000 1.13 +++ gcn-bba.c 27 Mar 2008 22:35:39 -0000 1.14 @@ -44,7 +44,7 @@ #define DRV_AUTHOR "Albert Herranz, " \ "Todd Jeffreys" -static char bba_driver_version[] = "1.4-isobel"; +static char bba_driver_version[] = "1.4i"; #define bba_printk(level, format, arg...) \ |
From: Albert H. <he...@us...> - 2008-03-27 22:36:50
|
Update of /cvsroot/gc-linux/linux/drivers/block/gcn-di In directory sc8-pr-cvs2.sourceforge.net:/tmp/cvs-serv15970/drivers/block/gcn-di Modified Files: gcn-di.c Log Message: Small cleanups: - Added copyright notices to the DTS files. - Renamed DTS node names and compatible properties as per segher suggestion. - s/-isobel/i/ from version strings. - Added missing arch/powerpc/platforms/embedded6xx/usbgecko_udbg.h file. - s/DVD/Disk/ on gcn-di.c. - Use "exi" instead of "exi-driver" in exi-driver messages. Index: gcn-di.c =================================================================== RCS file: /cvsroot/gc-linux/linux/drivers/block/gcn-di/gcn-di.c,v retrieving revision 1.22 retrieving revision 1.23 diff -u -d -r1.22 -r1.23 --- gcn-di.c 26 Mar 2008 20:15:10 -0000 1.22 +++ gcn-di.c 27 Mar 2008 22:35:36 -0000 1.23 @@ -1,7 +1,7 @@ /* * drivers/block/gcn-di/gcn-di.c * - * Nintendo GameCube DVD Interface (DI) driver + * Nintendo GameCube Disk Interface (DI) driver * Copyright (C) 2005-2007 The GameCube Linux Team * Copyright (C) 2005,2006,2007 Albert Herranz * @@ -33,10 +33,10 @@ #define DI_DEBUG #define DRV_MODULE_NAME "gcn-di" -#define DRV_DESCRIPTION "Nintendo GameCube DVD Interface (DI) driver" +#define DRV_DESCRIPTION "Nintendo GameCube Disk Interface (DI) driver" #define DRV_AUTHOR "Albert Herranz" -static char di_driver_version[] = "1.0-isobel"; +static char di_driver_version[] = "1.0i"; #define drv_printk(level, format, arg...) \ printk(level DRV_MODULE_NAME ": " format , ## arg) @@ -191,7 +191,7 @@ struct di_device; /* - * A DVD Interface command. + * A Disk Interface command. */ struct di_command { u16 opidx; @@ -229,7 +229,7 @@ }; /* - * The DVD Interface device. + * The Disk Interface device. */ struct di_device { spinlock_t lock; @@ -2343,7 +2343,7 @@ static struct of_device_id di_of_match[] = { - { .compatible = "nintendo,di" }, + { .compatible = "nintendo,flipper-disk" }, { }, }; |
From: Albert H. <he...@us...> - 2008-03-27 22:36:48
|
Update of /cvsroot/gc-linux/linux/drivers/exi In directory sc8-pr-cvs2.sourceforge.net:/tmp/cvs-serv15970/drivers/exi Modified Files: exi-driver.c Log Message: Small cleanups: - Added copyright notices to the DTS files. - Renamed DTS node names and compatible properties as per segher suggestion. - s/-isobel/i/ from version strings. - Added missing arch/powerpc/platforms/embedded6xx/usbgecko_udbg.h file. - s/DVD/Disk/ on gcn-di.c. - Use "exi" instead of "exi-driver" in exi-driver messages. Index: exi-driver.c =================================================================== RCS file: /cvsroot/gc-linux/linux/drivers/exi/exi-driver.c,v retrieving revision 1.15 retrieving revision 1.16 diff -u -d -r1.15 -r1.16 --- exi-driver.c 26 Mar 2008 20:15:11 -0000 1.15 +++ exi-driver.c 27 Mar 2008 22:35:37 -0000 1.16 @@ -21,13 +21,13 @@ #include <linux/module.h> #include <linux/of_platform.h> -#define DRV_MODULE_NAME "exi-driver" +#define DRV_MODULE_NAME "exi" #define DRV_DESCRIPTION "Nintendo GameCube EXternal Interface (EXI) driver" #define DRV_AUTHOR "Arthur Othieno <a.o...@bl...>, " \ "Todd Jeffreys <to...@vo...>, " \ "Albert Herranz" -static char exi_driver_version[] = "4.0-isobel"; +static char exi_driver_version[] = "4.0i"; #define drv_printk(level, format, arg...) \ printk(level DRV_MODULE_NAME ": " format , ## arg) @@ -493,9 +493,13 @@ drv_printk(KERN_INFO, "%s - version %s\n", DRV_DESCRIPTION, exi_driver_version); - np = of_find_compatible_node(NULL, NULL, "nintendo,exi"); - if (!np) - return -ENODEV; + np = of_find_compatible_node(NULL, NULL, "nintendo,flipper-exi"); + if (!np) { + np = of_find_compatible_node(NULL, NULL, + "nintendo,hollywood-exi"); + if (!np) + return -ENODEV; + } retval = of_address_to_resource(np, 0, &res); if (retval) { |
From: Albert H. <he...@us...> - 2008-03-27 22:36:20
|
Update of /cvsroot/gc-linux/linux/arch/powerpc/platforms/embedded6xx In directory sc8-pr-cvs2.sourceforge.net:/tmp/cvs-serv15970/arch/powerpc/platforms/embedded6xx Modified Files: Kconfig gcn-rsw.c wii_dev.c Added Files: usbgecko_udbg.h Log Message: Small cleanups: - Added copyright notices to the DTS files. - Renamed DTS node names and compatible properties as per segher suggestion. - s/-isobel/i/ from version strings. - Added missing arch/powerpc/platforms/embedded6xx/usbgecko_udbg.h file. - s/DVD/Disk/ on gcn-di.c. - Use "exi" instead of "exi-driver" in exi-driver messages. Index: gcn-rsw.c =================================================================== RCS file: /cvsroot/gc-linux/linux/arch/powerpc/platforms/embedded6xx/gcn-rsw.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- gcn-rsw.c 26 Mar 2008 20:14:58 -0000 1.2 +++ gcn-rsw.c 27 Mar 2008 22:35:24 -0000 1.3 @@ -36,7 +36,7 @@ #define DRV_AUTHOR "Stefan Esser <se...@no...>, " \ "Albert Herranz" -static char rsw_driver_version[] = "1.0-isobel"; +static char rsw_driver_version[] = "1.0i"; #define drv_printk(level, format, arg...) \ printk(level DRV_MODULE_NAME ": " format , ## arg) @@ -282,7 +282,8 @@ } static struct of_device_id rsw_of_match[] = { - {.compatible = "nintendo,rsw"}, + {.compatible = "nintendo,flipper-resetswitch"}, + {.compatible = "nintendo,hollywood-resetswitch"}, {}, }; Index: Kconfig =================================================================== RCS file: /cvsroot/gc-linux/linux/arch/powerpc/platforms/embedded6xx/Kconfig,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- Kconfig 26 Mar 2008 20:02:27 -0000 1.2 +++ Kconfig 27 Mar 2008 22:35:24 -0000 1.3 @@ -65,7 +65,6 @@ More information at: <http://gc-linux.sourceforge.net/> config TSI108_BRIDGE -config TSI108_BRIDGE bool depends on MPC7448HPC2 || PPC_HOLLY select PCI --- NEW FILE: usbgecko_udbg.h --- /* * arch/powerpc/platforms/embedded6xx/usbgecko_udbg.h * * udbg serial input/output routines for the USB Gecko adapter. * Copyright (C) 2008 The GameCube Linux Team * Copyright (C) 2008 Albert Herranz * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * */ #ifndef __USBGECKO_UDBG_H #define __USBGECKO_UDBG_H #ifdef CONFIG_USBGECKO_UDBG extern void __init ug_udbg_init(void); #else static inline void __init ug_udbg_init(void) { } #endif /* CONFIG_USBGECKO_UDBG */ #ifdef CONFIG_PPC_EARLY_DEBUG_USBGECKO void __init udbg_init_debug_usbgecko(void); #endif /* CONFIG_PPC_EARLY_DEBUG_USBGECKO */ #endif /* __USBGECKO_UDBG_H */ Index: wii_dev.c =================================================================== RCS file: /cvsroot/gc-linux/linux/arch/powerpc/platforms/embedded6xx/wii_dev.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- wii_dev.c 26 Mar 2008 19:51:02 -0000 1.1 +++ wii_dev.c 27 Mar 2008 22:35:26 -0000 1.2 @@ -35,7 +35,7 @@ of_platform_bus_probe(NULL, wii_of_bus, NULL); - np = of_find_compatible_node(NULL, NULL, "nintendo,mem2"); + np = of_find_compatible_node(NULL, NULL, "nintendo,hollywood-mem2"); if (np) { of_platform_device_create(np, NULL, NULL); of_node_put(np); |
From: Albert H. <he...@us...> - 2008-03-27 22:36:02
|
Update of /cvsroot/gc-linux/linux/arch/powerpc/boot In directory sc8-pr-cvs2.sourceforge.net:/tmp/cvs-serv15970/arch/powerpc/boot Modified Files: Makefile Log Message: Small cleanups: - Added copyright notices to the DTS files. - Renamed DTS node names and compatible properties as per segher suggestion. - s/-isobel/i/ from version strings. - Added missing arch/powerpc/platforms/embedded6xx/usbgecko_udbg.h file. - s/DVD/Disk/ on gcn-di.c. - Use "exi" instead of "exi-driver" in exi-driver messages. Index: Makefile =================================================================== RCS file: /cvsroot/gc-linux/linux/arch/powerpc/boot/Makefile,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- Makefile 26 Mar 2008 19:58:28 -0000 1.2 +++ Makefile 27 Mar 2008 22:35:19 -0000 1.3 @@ -49,13 +49,11 @@ src-wlib := string.S crt0.S stdio.c main.c flatdevtree.c flatdevtree_misc.c \ ns16550.c serial.c simple_alloc.c div64.S util.S \ gunzip_util.c elf_util.c $(zlib) devtree.c oflib.c ofconsole.c \ - mv64x60.c mpsc.c mv64x60_i2c.c cuboot.c bamboo.c \ cpm-serial.c stdlib.c mpc52xx-psc.c planetcore.c uartlite.c \ fsl-soc.c mpc8xx.c pq2.c ugecon.c src-plat := of.c cuboot-52xx.c cuboot-83xx.c cuboot-85xx.c holly.c \ cuboot-ebony.c treeboot-ebony.c prpmc2800.c \ - treeboot-bamboo.c cuboot-8xx.c \ - cuboot-pq2.c cuboot-sequoia.c cuboot-bamboo.c \ + cuboot-pq2.c cuboot-sequoia.c treeboot-walnut.c cuboot-bamboo.c \ fixed-head.S ep88xc.c cuboot-hpc2.c gamecube.c src-boot := $(src-wlib) $(src-plat) empty.c |
From: Albert H. <he...@us...> - 2008-03-26 23:25:25
|
Update of /cvsroot/gc-linux/linux/drivers/input/si In directory sc8-pr-cvs2.sourceforge.net:/tmp/cvs-serv28215/drivers/input/si Modified Files: gcn-keymap.h gcn-si.c Log Message: From: Maarten ter Huurne <maarten <at> treewalker.org> Subject: GC keyboard adapter Newsgroups: gmane.linux.ports.game-cube.devel Date: 2008-03-15 13:18:37 GMT (1 week, 4 days, 9 hours and 59 minutes ago) Hi, Attached are the modifications I had to make to get my PS/2 to GC keyboard adapter working properly. The adapter from "May Flash" and on the box it is called "GC Keyboard & PS Controller Adapter 2in1" (it can convert PSX joypads as well). There are two parts to the modifications: - getting the key codes from the raw data - a few changes in the key mapping The raw data was located in different nibbles as in the original code. I don't know if my adapter is different from the other keyboards/adapters, whether the data format is different in Wii mode compared to GC mode or whether the old code was simply broken. The old code for the third key does look broken: key[2] = (raw[0] << 4) & 0xFF; key[2] |= (raw[1] << 28) & 0xFF; The second statement has no effect, but if you replace "<<" by ">>", it starts making sense. Since this only makes a difference if 3 keys are pressed simultaneously, it's likely nobody noticed it, so the rest of it might still be correct. If you look at the diff, the key mapping looks totally different, but that is because I had to realign the columns; in fact there are only a few changes: 0A: scroll Lock 36: PrtSc and numpad-slash 37: numpad-star 39: semicolon 3A: apostrophe 3F: backslash 53: caps Lock cursors: 36 and listed I'm using a US/International PS/2 PC keyboard, so differences are probably not due to a PC keyboard layout difference. I am looking for someone with a different keyboard/adapter to test whether this new code works with it. And if it doesn't, if there is some way to auto-detect the keyboard type (maybe using other parts of the raw data). Bye, Maarten Index: gcn-keymap.h =================================================================== RCS file: /cvsroot/gc-linux/linux/drivers/input/si/gcn-keymap.h,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- gcn-keymap.h 6 Jul 2005 16:41:08 -0000 1.1 +++ gcn-keymap.h 26 Mar 2008 23:25:11 -0000 1.2 @@ -1,46 +1,47 @@ /* * keymap for a Datel adapater + US keyboard (not the normal keyboard) * not mapped: - * printscreen / sysreq - * scroll lcok + * printscreen / sysreq * pause / break * numlock * windows key 1 * windows key 2 * windows menu key + * + * cursor keys send both 36 and their own code, so 36 must be RESERVED */ static unsigned char gamecube_keymap[] = { - /* 00 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_HOME, KEY_END, - /* 08 */ KEY_PAGEUP, KEY_PAGEDOWN, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, - /* 10 */ KEY_A, KEY_B, KEY_C, KEY_D, KEY_E, KEY_F, KEY_G, KEY_H, - /* 18 */ KEY_I, KEY_J, KEY_K, KEY_L, KEY_M, KEY_N, KEY_O, KEY_P, - /* 20 */ KEY_Q, KEY_R, KEY_S, KEY_T, KEY_U, KEY_V, KEY_W, KEY_X, - /* 28 */ KEY_Y, KEY_Z, KEY_1, KEY_2, KEY_3, KEY_4, KEY_5, KEY_6, - /* 30 */ KEY_7, KEY_8, KEY_9, KEY_0, KEY_MINUS, KEY_EQUAL, KEY_BACKSLASH, KEY_APOSTROPHE, - /* 38 */ KEY_LEFTBRACE, KEY_EQUAL, KEY_KPASTERISK, KEY_RIGHTBRACE, KEY_COMMA, KEY_DOT, KEY_SLASH, KEY_RESERVED, - /* 40 */ KEY_F1, KEY_F2, KEY_F3, KEY_F4, KEY_F5, KEY_F6, KEY_F7, KEY_F8, - /* 48 */ KEY_F9, KEY_F10, KEY_F11, KEY_F12, KEY_ESC, KEY_INSERT, KEY_DELETE, KEY_GRAVE, - /* 50 */ KEY_BACKSPACE, KEY_TAB, KEY_RESERVED, KEY_CAPSLOCK, KEY_LEFTSHIFT, KEY_RIGHTSHIFT, KEY_LEFTCTRL, KEY_LEFTALT, - /* 58 */ KEY_RESERVED, KEY_SPACE, KEY_RESERVED, KEY_RESERVED, KEY_LEFT, KEY_DOWN, KEY_UP, KEY_RIGHT, - /* 60 */ KEY_RESERVED, KEY_ENTER, KEY_RESERVED, KEY_RESERVED, KEY_SEMICOLON, KEY_KPPLUS, KEY_RESERVED, KEY_RESERVED, - /* 68 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, - /* 70 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, - /* 78 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, - /* 80 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, - /* 88 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, - /* 90 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, - /* 98 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, - /* a0 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, - /* a8 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, - /* b0 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, - /* b8 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, - /* c0 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, - /* c8 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, - /* d0 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, - /* d8 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, - /* e0 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, - /* e8 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, - /* f0 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, - /* f8 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED + /* 00 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_HOME, KEY_END, + /* 08 */ KEY_PAGEUP, KEY_PAGEDOWN, KEY_SCROLLLOCK, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, + /* 10 */ KEY_A, KEY_B, KEY_C, KEY_D, KEY_E, KEY_F, KEY_G, KEY_H, + /* 18 */ KEY_I, KEY_J, KEY_K, KEY_L, KEY_M, KEY_N, KEY_O, KEY_P, + /* 20 */ KEY_Q, KEY_R, KEY_S, KEY_T, KEY_U, KEY_V, KEY_W, KEY_X, + /* 28 */ KEY_Y, KEY_Z, KEY_1, KEY_2, KEY_3, KEY_4, KEY_5, KEY_6, + /* 30 */ KEY_7, KEY_8, KEY_9, KEY_0, KEY_MINUS, KEY_EQUAL, KEY_RESERVED, KEY_KPASTERISK, + /* 38 */ KEY_LEFTBRACE, KEY_SEMICOLON, KEY_APOSTROPHE, KEY_RIGHTBRACE, KEY_COMMA, KEY_DOT, KEY_SLASH, KEY_BACKSLASH, + /* 40 */ KEY_F1, KEY_F2, KEY_F3, KEY_F4, KEY_F5, KEY_F6, KEY_F7, KEY_F8, + /* 48 */ KEY_F9, KEY_F10, KEY_F11, KEY_F12, KEY_ESC, KEY_INSERT, KEY_DELETE, KEY_GRAVE, + /* 50 */ KEY_BACKSPACE, KEY_TAB, KEY_RESERVED, KEY_CAPSLOCK, KEY_LEFTSHIFT, KEY_RIGHTSHIFT, KEY_LEFTCTRL, KEY_LEFTALT, + /* 58 */ KEY_RESERVED, KEY_SPACE, KEY_RESERVED, KEY_RESERVED, KEY_LEFT, KEY_DOWN, KEY_UP, KEY_RIGHT, + /* 60 */ KEY_RESERVED, KEY_ENTER, KEY_RESERVED, KEY_RESERVED, KEY_SEMICOLON, KEY_KPPLUS, KEY_RESERVED, KEY_RESERVED, + /* 68 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, + /* 70 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, + /* 78 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, + /* 80 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, + /* 88 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, + /* 90 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, + /* 98 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, + /* a0 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, + /* a8 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, + /* b0 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, + /* b8 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, + /* c0 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, + /* c8 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, + /* d0 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, + /* d8 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, + /* e0 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, + /* e8 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, + /* f0 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, + /* f8 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED }; Index: gcn-si.c =================================================================== RCS file: /cvsroot/gc-linux/linux/drivers/input/si/gcn-si.c,v retrieving revision 1.9 retrieving revision 1.10 diff -u -d -r1.9 -r1.10 --- gcn-si.c 26 Mar 2008 20:15:16 -0000 1.9 +++ gcn-si.c 26 Mar 2008 23:25:11 -0000 1.10 @@ -314,10 +314,19 @@ break; case CTL_KEYBOARD: - key[0] = (raw[0] >> 12) & 0xFF; - key[1] = (raw[0] >> 4) & 0xFF; - key[2] = (raw[0] << 4) & 0xFF; - key[2] |= (raw[1] << 28) & 0xFF; + /* + raw nibbles: + [4]<C>[0][0][0][0][0][0] <1H><1L><2H><2L><3H><3L><X><C> + where: + [n] = fixed to n + <nH> <nL> = high / low nibble of n-th key pressed + (0 if not pressed) + <X> = <1H> xor <2H> xor <3H> + <C> = counter: 0, 0, 1, 1, 2, 2, ..., F, F, 0, 0, ... + */ + key[0] = (raw[1] >> 24) & 0xFF; + key[1] = (raw[1] >> 16) & 0xFF; + key[2] = (raw[1] >> 8) & 0xFF; /* check if anything was released */ for (i = 0; i < 3; ++i) { |
From: Albert H. <he...@us...> - 2008-03-26 22:09:28
|
Update of /cvsroot/gc-linux/linux/drivers/rtc In directory sc8-pr-cvs2.sourceforge.net:/tmp/cvs-serv10889/drivers/rtc Added Files: Kconfig Makefile rtc-gcn.c Log Message: Added Nintendo GameCube/Wii RTC class driver. --- NEW FILE: Makefile --- # # Makefile for RTC class/drivers. # ifeq ($(CONFIG_RTC_DEBUG),y) EXTRA_CFLAGS += -DDEBUG endif obj-$(CONFIG_RTC_LIB) += rtc-lib.o obj-$(CONFIG_RTC_HCTOSYS) += hctosys.o obj-$(CONFIG_RTC_CLASS) += rtc-core.o rtc-core-y := class.o interface.o rtc-core-$(CONFIG_RTC_INTF_DEV) += rtc-dev.o rtc-core-$(CONFIG_RTC_INTF_PROC) += rtc-proc.o rtc-core-$(CONFIG_RTC_INTF_SYSFS) += rtc-sysfs.o # Keep the list ordered. obj-$(CONFIG_RTC_DRV_AT32AP700X)+= rtc-at32ap700x.o obj-$(CONFIG_RTC_DRV_AT91RM9200)+= rtc-at91rm9200.o obj-$(CONFIG_RTC_DRV_BFIN) += rtc-bfin.o obj-$(CONFIG_RTC_DRV_CMOS) += rtc-cmos.o obj-$(CONFIG_RTC_DRV_DS1216) += rtc-ds1216.o obj-$(CONFIG_RTC_DRV_DS1307) += rtc-ds1307.o obj-$(CONFIG_RTC_DRV_DS1374) += rtc-ds1374.o obj-$(CONFIG_RTC_DRV_DS1553) += rtc-ds1553.o obj-$(CONFIG_RTC_DRV_DS1672) += rtc-ds1672.o obj-$(CONFIG_RTC_DRV_DS1742) += rtc-ds1742.o obj-$(CONFIG_RTC_DRV_EP93XX) += rtc-ep93xx.o obj-$(CONFIG_RTC_DRV_GCN) += rtc-gcn.o obj-$(CONFIG_RTC_DRV_ISL1208) += rtc-isl1208.o obj-$(CONFIG_RTC_DRV_M41T80) += rtc-m41t80.o obj-$(CONFIG_RTC_DRV_M48T59) += rtc-m48t59.o obj-$(CONFIG_RTC_DRV_M48T86) += rtc-m48t86.o obj-$(CONFIG_RTC_DRV_MAX6900) += rtc-max6900.o obj-$(CONFIG_RTC_DRV_MAX6902) += rtc-max6902.o obj-$(CONFIG_RTC_DRV_OMAP) += rtc-omap.o obj-$(CONFIG_RTC_DRV_PCF8563) += rtc-pcf8563.o obj-$(CONFIG_RTC_DRV_PCF8583) += rtc-pcf8583.o obj-$(CONFIG_RTC_DRV_PL031) += rtc-pl031.o obj-$(CONFIG_RTC_DRV_RS5C313) += rtc-rs5c313.o obj-$(CONFIG_RTC_DRV_RS5C348) += rtc-rs5c348.o obj-$(CONFIG_RTC_DRV_RS5C372) += rtc-rs5c372.o obj-$(CONFIG_RTC_DRV_S3C) += rtc-s3c.o obj-$(CONFIG_RTC_DRV_SA1100) += rtc-sa1100.o obj-$(CONFIG_RTC_DRV_SH) += rtc-sh.o obj-$(CONFIG_RTC_DRV_STK17TA8) += rtc-stk17ta8.o obj-$(CONFIG_RTC_DRV_TEST) += rtc-test.o obj-$(CONFIG_RTC_DRV_V3020) += rtc-v3020.o obj-$(CONFIG_RTC_DRV_VR41XX) += rtc-vr41xx.o obj-$(CONFIG_RTC_DRV_X1205) += rtc-x1205.o --- NEW FILE: Kconfig --- # # RTC class/drivers configuration # config RTC_LIB tristate menuconfig RTC_CLASS tristate "Real Time Clock" default n depends on !S390 select RTC_LIB help Generic RTC class support. If you say yes here, you will be allowed to plug one or more RTCs to your system. You will probably want to enable one or more of the interfaces below. This driver can also be built as a module. If so, the module will be called rtc-class. if RTC_CLASS config RTC_HCTOSYS bool "Set system time from RTC on startup and resume" depends on RTC_CLASS = y default y help If you say yes here, the system time (wall clock) will be set using the value read from a specified RTC device. This is useful to avoid unnecessary fsck runs at boot time, and to network better. config RTC_HCTOSYS_DEVICE string "RTC used to set the system time" depends on RTC_HCTOSYS = y default "rtc0" help The RTC device that will be used to (re)initialize the system clock, usually rtc0. Initialization is done when the system starts up, and when it resumes from a low power state. This device should record time in UTC, since the kernel won't do timezone correction. The driver for this RTC device must be loaded before late_initcall functions run, so it must usually be statically linked. This clock should be battery-backed, so that it reads the correct time when the system boots from a power-off state. Otherwise, your system will need an external clock source (like an NTP server). If the clock you specify here is not battery backed, it may still be useful to reinitialize system time when resuming from system sleep states. Do not specify an RTC here unless it stays powered during all this system's supported sleep states. config RTC_DEBUG bool "RTC debug support" depends on RTC_CLASS = y help Say yes here to enable debugging support in the RTC framework and individual RTC drivers. comment "RTC interfaces" config RTC_INTF_SYSFS boolean "/sys/class/rtc/rtcN (sysfs)" depends on SYSFS default RTC_CLASS help Say yes here if you want to use your RTCs using sysfs interfaces, /sys/class/rtc/rtc0 through /sys/.../rtcN. This driver can also be built as a module. If so, the module will be called rtc-sysfs. config RTC_INTF_PROC boolean "/proc/driver/rtc (procfs for rtc0)" depends on PROC_FS default RTC_CLASS help Say yes here if you want to use your first RTC through the proc interface, /proc/driver/rtc. Other RTCs will not be available through that API. This driver can also be built as a module. If so, the module will be called rtc-proc. config RTC_INTF_DEV boolean "/dev/rtcN (character devices)" default RTC_CLASS help Say yes here if you want to use your RTCs using the /dev interfaces, which "udev" sets up as /dev/rtc0 through /dev/rtcN. You may want to set up a symbolic link so one of these can be accessed as /dev/rtc, which is a name expected by "hwclock" and some other programs. This driver can also be built as a module. If so, the module will be called rtc-dev. config RTC_INTF_DEV_UIE_EMUL bool "RTC UIE emulation on dev interface" depends on RTC_INTF_DEV help Provides an emulation for RTC_UIE if the underlying rtc chip driver does not expose RTC_UIE ioctls. Those requests generate once-per-second update interrupts, used for synchronization. config RTC_DRV_TEST tristate "Test driver/device" help If you say yes here you get support for the RTC test driver. It's a software RTC which can be used to test the RTC subsystem APIs. It gets the time from the system clock. You want this driver only if you are doing development on the RTC subsystem. Please read the source code for further details. This driver can also be built as a module. If so, the module will be called rtc-test. comment "I2C RTC drivers" depends on I2C if I2C config RTC_DRV_DS1307 tristate "Dallas/Maxim DS1307/37/38/39/40, ST M41T00" help If you say yes here you get support for various compatible RTC chips (often with battery backup) connected with I2C. This driver should handle DS1307, DS1337, DS1338, DS1339, DS1340, ST M41T00, and probably other chips. In some cases the RTC must already have been initialized (by manufacturing or a bootloader). The first seven registers on these chips hold an RTC, and other registers may add features such as NVRAM, a trickle charger for the RTC/NVRAM backup power, and alarms. NVRAM is visible in sysfs, but other chip features may not be available. This driver can also be built as a module. If so, the module will be called rtc-ds1307. config RTC_DRV_DS1374 tristate "Maxim/Dallas Semiconductor DS1374 Real Time Clock" depends on RTC_CLASS && I2C help If you say yes here you get support for Dallas Semiconductor DS1374 real-time clock chips. If an interrupt is associated with the device, the alarm functionality is supported. This driver can also be built as a module. If so, the module will be called rtc-ds1374. config RTC_DRV_DS1672 tristate "Dallas/Maxim DS1672" help If you say yes here you get support for the Dallas/Maxim DS1672 timekeeping chip. This driver can also be built as a module. If so, the module will be called rtc-ds1672. config RTC_DRV_MAX6900 tristate "Maxim 6900" help If you say yes here you will get support for the Maxim MAX6900 I2C RTC chip. This driver can also be built as a module. If so, the module will be called rtc-max6900. config RTC_DRV_RS5C372 tristate "Ricoh RS5C372A/B, RV5C386, RV5C387A" help If you say yes here you get support for the Ricoh RS5C372A, RS5C372B, RV5C386, and RV5C387A RTC chips. This driver can also be built as a module. If so, the module will be called rtc-rs5c372. config RTC_DRV_ISL1208 tristate "Intersil 1208" help If you say yes here you get support for the Intersil 1208 RTC chip. This driver can also be built as a module. If so, the module will be called rtc-isl1208. config RTC_DRV_X1205 tristate "Xicor/Intersil X1205" help If you say yes here you get support for the Xicor/Intersil X1205 RTC chip. This driver can also be built as a module. If so, the module will be called rtc-x1205. config RTC_DRV_PCF8563 tristate "Philips PCF8563/Epson RTC8564" help If you say yes here you get support for the Philips PCF8563 RTC chip. The Epson RTC8564 should work as well. This driver can also be built as a module. If so, the module will be called rtc-pcf8563. config RTC_DRV_PCF8583 tristate "Philips PCF8583" help If you say yes here you get support for the Philips PCF8583 RTC chip found on Acorn RiscPCs. This driver supports the platform specific method of retrieving the current year from the RTC's SRAM. It will work on other platforms with the same chip, but the year will probably have to be tweaked. This driver can also be built as a module. If so, the module will be called rtc-pcf8583. config RTC_DRV_M41T80 tristate "ST M41T80 series RTC" help If you say Y here you will get support for the ST M41T80 RTC chips series. Currently following chips are supported: M41T80, M41T81, M41T82, M41T83, M41ST84, M41ST85 and M41ST87. This driver can also be built as a module. If so, the module will be called rtc-m41t80. config RTC_DRV_M41T80_WDT bool "ST M41T80 series RTC watchdog timer" depends on RTC_DRV_M41T80 help If you say Y here you will get support for the watchdog timer in ST M41T80 RTC chips series. config RTC_DRV_TWL92330 boolean "TI TWL92330/Menelaus" depends on MENELAUS help If you say yes here you get support for the RTC on the TWL92330 "Menelaus" power management chip, used with OMAP2 platforms. The support is integrated with the rest of the Menelaus driver; it's not separate module. endif # I2C comment "SPI RTC drivers" if SPI_MASTER config RTC_DRV_RS5C348 tristate "Ricoh RS5C348A/B" help If you say yes here you get support for the Ricoh RS5C348A and RS5C348B RTC chips. This driver can also be built as a module. If so, the module will be called rtc-rs5c348. config RTC_DRV_MAX6902 tristate "Maxim 6902" help If you say yes here you will get support for the Maxim MAX6902 SPI RTC chip. This driver can also be built as a module. If so, the module will be called rtc-max6902. endif # SPI_MASTER comment "Platform RTC drivers" # this 'CMOS' RTC driver is arch dependent because <asm-generic/rtc.h> # requires <asm/mc146818rtc.h> defining CMOS_READ/CMOS_WRITE, and a # global rtc_lock ... it's not yet just another platform_device. config RTC_DRV_CMOS tristate "PC-style 'CMOS'" depends on X86 || ALPHA || ARM || M32R || ATARI || PPC || MIPS help Say "yes" here to get direct support for the real time clock found in every PC or ACPI-based system, and some other boards. Specifically the original MC146818, compatibles like those in PC south bridges, the DS12887 or M48T86, some multifunction or LPC bus chips, and so on. Your system will need to define the platform device used by this driver, otherwise it won't be accessible. This means you can safely enable this driver if you don't know whether or not your board has this kind of hardware. This driver can also be built as a module. If so, the module will be called rtc-cmos. config RTC_DRV_DS1216 tristate "Dallas DS1216" depends on SNI_RM help If you say yes here you get support for the Dallas DS1216 RTC chips. config RTC_DRV_DS1553 tristate "Dallas DS1553" help If you say yes here you get support for the Dallas DS1553 timekeeping chip. This driver can also be built as a module. If so, the module will be called rtc-ds1553. config RTC_DRV_STK17TA8 tristate "Simtek STK17TA8" depends on RTC_CLASS help If you say yes here you get support for the Simtek STK17TA8 timekeeping chip. This driver can also be built as a module. If so, the module will be called rtc-stk17ta8. config RTC_DRV_DS1742 tristate "Dallas DS1742/1743" help If you say yes here you get support for the Dallas DS1742/1743 timekeeping chip. This driver can also be built as a module. If so, the module will be called rtc-ds1742. config RTC_DRV_M48T86 tristate "ST M48T86/Dallas DS12887" help If you say Y here you will get support for the ST M48T86 and Dallas DS12887 RTC chips. This driver can also be built as a module. If so, the module will be called rtc-m48t86. config RTC_DRV_M48T59 tristate "ST M48T59" help If you say Y here you will get support for the ST M48T59 RTC chip. This driver can also be built as a module, if so, the module will be called "rtc-m48t59". config RTC_DRV_V3020 tristate "EM Microelectronic V3020" help If you say yes here you will get support for the EM Microelectronic v3020 RTC chip. This driver can also be built as a module. If so, the module will be called rtc-v3020. config RTC_DRV_GCN bool "Nintendo GameCube/Wii Real Time Clock and SRAM" depends on GAMECUBE_EXI default y help If you say yes to this option, support will be included for the Real Time Clock and SRAM of the Nintendo GameCube/Wii. If in doubt, say Y here. comment "on-CPU RTC drivers" config RTC_DRV_OMAP tristate "TI OMAP1" depends on ARCH_OMAP15XX || ARCH_OMAP16XX || ARCH_OMAP730 help Say "yes" here to support the real time clock on TI OMAP1 chips. This driver can also be built as a module called rtc-omap. config RTC_DRV_S3C tristate "Samsung S3C series SoC RTC" depends on ARCH_S3C2410 help RTC (Realtime Clock) driver for the clock inbuilt into the Samsung S3C24XX series of SoCs. This can provide periodic interrupt rates from 1Hz to 64Hz for user programs, and wakeup from Alarm. The driver currently supports the common features on all the S3C24XX range, such as the S3C2410, S3C2412, S3C2413, S3C2440 and S3C2442. This driver can also be build as a module. If so, the module will be called rtc-s3c. config RTC_DRV_EP93XX tristate "Cirrus Logic EP93XX" depends on ARCH_EP93XX help If you say yes here you get support for the RTC embedded in the Cirrus Logic EP93XX processors. This driver can also be built as a module. If so, the module will be called rtc-ep93xx. config RTC_DRV_SA1100 tristate "SA11x0/PXA2xx" depends on ARCH_SA1100 || ARCH_PXA help If you say Y here you will get access to the real time clock built into your SA11x0 or PXA2xx CPU. To compile this driver as a module, choose M here: the module will be called rtc-sa1100. config RTC_DRV_SH tristate "SuperH On-Chip RTC" depends on RTC_CLASS && (CPU_SH3 || CPU_SH4) help Say Y here to enable support for the on-chip RTC found in most SuperH processors. To compile this driver as a module, choose M here: the module will be called rtc-sh. config RTC_DRV_VR41XX tristate "NEC VR41XX" depends on CPU_VR41XX help If you say Y here you will get access to the real time clock built into your NEC VR41XX CPU. To compile this driver as a module, choose M here: the module will be called rtc-vr41xx. config RTC_DRV_PL031 tristate "ARM AMBA PL031 RTC" depends on ARM_AMBA help If you say Y here you will get access to ARM AMBA PrimeCell PL031 RTC found on certain ARM SOCs. To compile this driver as a module, choose M here: the module will be called rtc-pl031. config RTC_DRV_AT32AP700X tristate "AT32AP700X series RTC" depends on PLATFORM_AT32AP help Driver for the internal RTC (Realtime Clock) on Atmel AVR32 AT32AP700x family processors. config RTC_DRV_AT91RM9200 tristate "AT91RM9200" depends on ARCH_AT91RM9200 help Driver for the Atmel AT91RM9200's internal RTC (Realtime Clock). config RTC_DRV_BFIN tristate "Blackfin On-Chip RTC" depends on BLACKFIN help If you say yes here you will get support for the Blackfin On-Chip Real Time Clock. This driver can also be built as a module. If so, the module will be called rtc-bfin. config RTC_DRV_RS5C313 tristate "Ricoh RS5C313" depends on SH_LANDISK help If you say yes here you get support for the Ricoh RS5C313 RTC chips. endif # RTC_CLASS --- NEW FILE: rtc-gcn.c --- /* * drivers/rtc/rtc-gcn.c * * Nintendo GameCube/Wii RTC/SRAM driver * Copyright (C) 2004-2008 The GameCube Linux Team * Copyright (C) 2005,2008 Albert Herranz * * Based on gamecube_time.c from Torben Nielsen. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * */ #include <linux/init.h> #include <linux/time.h> #include <linux/rtc.h> #include <linux/exi.h> #include <asm/machdep.h> #define DRV_MODULE_NAME "rtc-gcn" #define DRV_DESCRIPTION "Nintendo GameCube/Wii RTC/SRAM driver" #define DRV_AUTHOR "Torben Nielsen, " \ "Albert Herranz" static char gcnrtc_driver_version[] = "1.0-isobel"; #define drv_printk(level, format, arg...) \ printk(level DRV_MODULE_NAME ": " format , ## arg) #define RTC_EXI_GCN_ID 0xffff1698 #define RTC_EXI_RVL_ID 0xfffff308 #define RTC_EXI_CHANNEL 0 #define RTC_EXI_DEVICE 1 #define RTC_EXI_FREQ 3 /* 8MHz */ #define RTC_OFFSET 946684800L struct gcn_sram { u16 csum1; u16 csum2; u32 ead0; u32 ead1; int bias; s8 horz_display_offset; u8 ntd; u8 language; u8 flags; u8 reserved[44]; }; struct gcnrtc_drvdata { spinlock_t lock; struct exi_device *dev; struct rtc_device *rtc_dev; struct gcn_sram sram; }; static struct gcnrtc_drvdata gcnrtc_drvdata; /* * Hardware interfaces. * */ /* * Loads the SRAM contents. * Context: user. */ static void sram_load(struct exi_device *dev) { struct gcnrtc_drvdata *drvdata = exi_get_drvdata(dev); struct gcn_sram *sram = &drvdata->sram; u32 req; exi_dev_take(dev); /* select the SRAM device */ exi_dev_select(dev); /* send the appropriate command */ req = 0x20000100; exi_dev_write(dev, &req, sizeof(req)); /* read the SRAM data */ exi_dev_read(dev, sram, sizeof(*sram)); /* deselect the SRAM device */ exi_dev_deselect(dev); exi_dev_give(dev); return; } /* * Gets the hardware clock date and time. * Context: user. */ static unsigned long gcnrtc_read_time(struct exi_device *dev) { unsigned long a = 0; exi_dev_take(dev); /* select the SRAM device */ exi_dev_select(dev); /* send the appropriate command */ a = 0x20000000; exi_dev_write(dev, &a, sizeof(a)); /* read the time and date value */ exi_dev_read(dev, &a, sizeof(a)); /* deselect the RTC device */ exi_dev_deselect(dev); exi_dev_give(dev); return a; } /* * Sets the hardware clock date and time to @aval. * Context: user, interrupt (adjtimex). */ static int gcnrtc_write_time(struct exi_device *dev, unsigned long aval) { u32 req; int retval; /* * We may get called from the timer interrupt. In that case, * we could fail if the exi channel used to access the RTC * is busy. If this happens, we just return an error. The timer * interrupt code is prepared to deal with such case. */ retval = exi_dev_try_take(dev); if (!retval) { /* select the RTC device */ exi_dev_select(dev); /* send the appropriate command */ req = 0xa0000000; exi_dev_write(dev, &req, sizeof(req)); /* set the new time and date value */ exi_dev_write(dev, &aval, sizeof(aval)); /* deselect the RTC device */ exi_dev_deselect(dev); exi_dev_give(dev); } return retval; } /* * Platform time functions. * */ /* * Platform specific function to return the current date and time. */ static void gcnrtc_plat_rtc_get_time(struct rtc_time *t) { struct gcnrtc_drvdata *drvdata = &gcnrtc_drvdata; unsigned long nowtime; if (!drvdata->dev) return; nowtime = gcnrtc_read_time(drvdata->dev) + drvdata->sram.bias + RTC_OFFSET; rtc_time_to_tm(nowtime, t); } /* * Platform specific function to set the current date and time. * */ static int gcnrtc_plat_rtc_set_time(struct rtc_time *t) { struct gcnrtc_drvdata *drvdata = &gcnrtc_drvdata; unsigned long nowtime; if (!drvdata->dev) return -ENODEV; rtc_tm_to_time(t, &nowtime); return gcnrtc_write_time(drvdata->dev, nowtime - RTC_OFFSET - drvdata->sram.bias); } /* * RTC class driver. * */ /* * */ static int gcnrtc_rtc_read_time(struct device *dev, struct rtc_time *t) { gcnrtc_plat_rtc_get_time(t); return 0; } /* * */ static int gcnrtc_rtc_set_time(struct device *dev, struct rtc_time *t) { return gcnrtc_plat_rtc_set_time(t); } static const struct rtc_class_ops gcnrtc_ops = { .read_time = gcnrtc_rtc_read_time, .set_time = gcnrtc_rtc_set_time, }; /* * EXI driver. * */ /* * */ static int gcnrtc_probe(struct exi_device *dev) { struct gcnrtc_drvdata *drvdata = &gcnrtc_drvdata; unsigned long flags; int retval = -ENODEV; if (exi_device_get(dev)) { spin_lock_init(&drvdata->lock); exi_set_drvdata(dev, drvdata); drvdata->dev = dev; memset(&drvdata->sram, 0, sizeof(struct gcn_sram)); sram_load(dev); spin_lock_irqsave(&drvdata->lock, flags); ppc_md.set_rtc_time = gcnrtc_plat_rtc_set_time; ppc_md.get_rtc_time = gcnrtc_plat_rtc_get_time; spin_unlock_irqrestore(&drvdata->lock, flags); drvdata->rtc_dev = rtc_device_register(DRV_MODULE_NAME, &dev->dev, &gcnrtc_ops, THIS_MODULE); retval = 0; } return retval; } /* * */ static void gcnrtc_remove(struct exi_device *dev) { struct gcnrtc_drvdata *drvdata = exi_get_drvdata(dev); unsigned long flags; if (drvdata) { spin_lock_irqsave(&drvdata->lock, flags); ppc_md.set_rtc_time = NULL; ppc_md.get_rtc_time = NULL; spin_unlock_irqrestore(&drvdata->lock, flags); if (!IS_ERR(drvdata->rtc_dev)) rtc_device_unregister(drvdata->rtc_dev); } exi_device_put(dev); } static struct exi_device_id gcnrtc_eid_table[] = { { .channel = RTC_EXI_CHANNEL, .device = RTC_EXI_DEVICE, .id = RTC_EXI_GCN_ID }, { .channel = RTC_EXI_CHANNEL, .device = RTC_EXI_DEVICE, .id = RTC_EXI_RVL_ID }, { }, }; static struct exi_driver gcnrtc_driver = { .name = DRV_MODULE_NAME, .eid_table = gcnrtc_eid_table, .frequency = RTC_EXI_FREQ, .probe = gcnrtc_probe, .remove = gcnrtc_remove, }; /* * */ static int __init gcnrtc_init_module(void) { drv_printk(KERN_INFO, "%s - version %s\n", DRV_DESCRIPTION, gcnrtc_driver_version); return exi_driver_register(&gcnrtc_driver); } /* * */ static void __exit gcnrtc_exit_module(void) { exi_driver_unregister(&gcnrtc_driver); } module_init(gcnrtc_init_module); module_exit(gcnrtc_exit_module); MODULE_AUTHOR(DRV_AUTHOR); MODULE_DESCRIPTION(DRV_DESCRIPTION); MODULE_LICENSE("GPL"); |
From: Albert H. <he...@us...> - 2008-03-26 22:07:41
|
Update of /cvsroot/gc-linux/linux/drivers/rtc In directory sc8-pr-cvs2.sourceforge.net:/tmp/cvs-serv9074/drivers/rtc Log Message: Directory /cvsroot/gc-linux/linux/drivers/rtc added to the repository |
From: Albert H. <he...@us...> - 2008-03-26 20:15:57
|
Update of /cvsroot/gc-linux/linux/drivers/serial In directory sc8-pr-cvs2.sourceforge.net:/tmp/cvs-serv22420/drivers/serial Modified Files: Kconfig usbgecko.c Log Message: Remove old ugecon driver (we use now usbgecko_udbg). Rewrite the following drivers as of_platform drivers using the device tree: - gcn-rsw - starlet-ipc - gcn-aram - rvl-mem2 - gcn-di - exi-driver, exi-hw - gcn-si - gcnfb (gcn-vifb) - gcn-ai Marked as broken gcn-mi and gcngx. Updated defconfigs. Index: usbgecko.c =================================================================== RCS file: /cvsroot/gc-linux/linux/drivers/serial/usbgecko.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- usbgecko.c 4 Mar 2008 06:11:22 -0000 1.2 +++ usbgecko.c 26 Mar 2008 20:15:21 -0000 1.3 @@ -31,23 +31,11 @@ #define DRV_DESCRIPTION "Console and TTY driver for the USB Gecko adapter" #define DRV_AUTHOR "Albert Herranz" -MODULE_AUTHOR(DRV_AUTHOR); -MODULE_DESCRIPTION(DRV_DESCRIPTION); -MODULE_LICENSE("GPL"); - static char ug_driver_version[] = "0.1-isobel"; -#define ug_printk(level, format, arg...) \ +#define drv_printk(level, format, arg...) \ printk(level DRV_MODULE_NAME ": " format , ## arg) -#ifdef UG_DEBUG -# define DBG(fmt, args...) \ - printk(KERN_ERR "%s: " fmt, __FUNCTION__ , ## args) -#else -# define DBG(fmt, args...) -#endif - - /* * * EXI related definitions. @@ -278,7 +266,8 @@ int i; char c; - for (i = 0; i < count; i++) { + i = count; + while(i--) { ug_safe_getc(adapter, &c); *buf++ = c; } @@ -326,12 +315,14 @@ struct sched_param param = { .sched_priority = 1 }; struct tty_struct *tty = tty_; struct ug_adapter *adapter; - int count; + int count, chunk; + const int max_outstanding = 32; char ch; sched_setscheduler(current, SCHED_FIFO, ¶m); set_task_state(current, TASK_RUNNING); + chunk = 0; while(!kthread_should_stop()) { count = 0; adapter = tty->driver_data; @@ -340,9 +331,17 @@ set_task_state(current, TASK_INTERRUPTIBLE); if (count) { tty_insert_flip_char(tty, ch, TTY_NORMAL); - tty_flip_buffer_push(tty); + if (chunk++ > max_outstanding) { + tty_flip_buffer_push(tty); + chunk = 0; + } + } else { + if (chunk) { + tty_flip_buffer_push(tty); + chunk = 0; + } + schedule_timeout(1); } - schedule_timeout(1); set_task_state(current, TASK_RUNNING); } @@ -368,7 +367,7 @@ if (!adapter->refcnt) { adapter->poller = kthread_run(ug_tty_poller, tty, "kugtty"); if (IS_ERR(adapter->poller)) { - ug_printk(KERN_ERR, "error creating poller thread\n"); + drv_printk(KERN_ERR, "error creating poller thread\n"); mutex_unlock(&adapter->mutex); return -ENOMEM; } @@ -502,8 +501,8 @@ console = &ug_consoles[slot]; adapter = console->data; - ug_printk(KERN_INFO, "USB Gecko detected in memcard slot-%c\n", - 'A'+slot); + drv_printk(KERN_INFO, "USB Gecko detected in memcard slot-%c\n", + 'A'+slot); adapter->poller = ERR_PTR(-EINVAL); mutex_init(&adapter->mutex); @@ -533,7 +532,7 @@ adapter = console->data; if (adapter->refcnt) { - ug_printk(KERN_ERR, "adapter removed while in use!\n"); + drv_printk(KERN_ERR, "adapter removed while in use!\n"); } ug_tty_exit(); @@ -545,8 +544,8 @@ mutex_destroy(&adapter->mutex); - ug_printk(KERN_INFO, "USB Gecko removed from memcard slot-%c\n", - 'A'+slot); + drv_printk(KERN_INFO, "USB Gecko removed from memcard slot-%c\n", + 'A'+slot); } static struct exi_device_id ug_eid_table[] = { @@ -579,8 +578,8 @@ static int __init ug_init_module(void) { - ug_printk(KERN_INFO, "%s - version %s\n", DRV_DESCRIPTION, - ug_driver_version); + drv_printk(KERN_INFO, "%s - version %s\n", DRV_DESCRIPTION, + ug_driver_version); return exi_driver_register(&ug_exi_driver); } @@ -593,3 +592,7 @@ module_init(ug_init_module); module_exit(ug_exit_module); +MODULE_AUTHOR(DRV_AUTHOR); +MODULE_DESCRIPTION(DRV_DESCRIPTION); +MODULE_LICENSE("GPL"); + Index: Kconfig =================================================================== RCS file: /cvsroot/gc-linux/linux/drivers/serial/Kconfig,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- Kconfig 24 Feb 2008 18:08:15 -0000 1.1 +++ Kconfig 26 Mar 2008 20:15:21 -0000 1.2 @@ -1285,7 +1285,7 @@ others can easily be added. config SERIAL_USBGECKO - bool "USBGecko adapter on the Nintendo GameCube" + bool "USBGecko adapter on the Nintendo GameCube/Wii" depends on GAMECUBE_EXI select SERIAL_CORE help |
From: Albert H. <he...@us...> - 2008-03-26 20:15:57
|
Update of /cvsroot/gc-linux/linux/drivers/video In directory sc8-pr-cvs2.sourceforge.net:/tmp/cvs-serv22420/drivers/video Modified Files: gcnfb.c gcngx.c Log Message: Remove old ugecon driver (we use now usbgecko_udbg). Rewrite the following drivers as of_platform drivers using the device tree: - gcn-rsw - starlet-ipc - gcn-aram - rvl-mem2 - gcn-di - exi-driver, exi-hw - gcn-si - gcnfb (gcn-vifb) - gcn-ai Marked as broken gcn-mi and gcngx. Updated defconfigs. Index: gcnfb.c =================================================================== RCS file: /cvsroot/gc-linux/linux/drivers/video/gcnfb.c,v retrieving revision 1.17 retrieving revision 1.18 diff -u -d -r1.17 -r1.18 --- gcnfb.c 4 Mar 2008 06:20:56 -0000 1.17 +++ gcnfb.c 26 Mar 2008 20:15:21 -0000 1.18 @@ -1,11 +1,11 @@ /* - * drivers/video/gcnfb.c + * drivers/video/gcn-vifb.c * - * Nintendo GameCube "Flipper" chipset frame buffer driver - * Copyright (C) 2004-2007 The GameCube Linux Team + * Nintendo GameCube/Wii Video Interface (VI) frame buffer driver + * Copyright (C) 2004-2008 The GameCube Linux Team * Copyright (C) 2004 Michael Steil <mi...@c6...> * Copyright (C) 2004,2005 Todd Jeffreys <to...@vo...> - * Copyright (C) 2006,2007 Albert Herranz + * Copyright (C) 2006,2007,2008 Albert Herranz * * Based on vesafb (c) 1998 Gerd Knorr <kr...@go...> * @@ -16,48 +16,39 @@ * */ -#include <linux/module.h> -#include <linux/kernel.h> -#include <linux/errno.h> -#include <linux/string.h> -#include <linux/mm.h> -#include <linux/tty.h> -#include <linux/slab.h> #include <linux/delay.h> +#include <linux/errno.h> #include <linux/fb.h> -#include <linux/ioport.h> #include <linux/init.h> #include <linux/interrupt.h> +#include <linux/kernel.h> +#include <linux/mm.h> +#include <linux/module.h> +#include <linux/of_platform.h> +//#include <linux/slab.h> +#include <linux/string.h> +#include <linux/tty.h> #include <linux/wait.h> -#include <linux/platform_device.h> #include <asm/io.h> -#ifdef CONFIG_PPC_MERGE -#include <platforms/embedded6xx/gamecube.h> -#else -#include <platforms/gamecube.h> -#endif - #include "gcngx.h" -#define DRV_MODULE_NAME "gcnfb" -#define DRV_DESCRIPTION "Nintendo GameCube framebuffer driver" +#define DRV_MODULE_NAME "gcn-vifb" +#define DRV_DESCRIPTION "Nintendo GameCube/Wii Video Interface (VI)" \ + " frame buffer driver" #define DRV_AUTHOR "Michael Steil <mi...@c6...>, " \ "Todd Jeffreys <to...@vo...>, " \ "Albert Herranz" -/* - * - * Hardware. - */ - -#define VI_IRQ 8 +static char vifb_driver_version[] = "1.0-isobel"; -#define VI_BASE (GCN_IO1_BASE+0x2000) -#define VI_SIZE 0x100 +#define drv_printk(level, format, arg...) \ + printk(level DRV_MODULE_NAME ": " format , ## arg) -#define VI_IO_BASE ((void __iomem *)VI_BASE) +/* + * Hardware registers. + */ #define VI_DCR 0x02 #define VI_HTR0 0x04 #define VI_TFBL 0x1c @@ -80,10 +71,15 @@ #define VI_VISEL 0x6e #define VI_VISEL_PROGRESSIVE (1 << 0) + +/* + * Video control data structure. + */ struct vi_ctl { spinlock_t lock; void __iomem *io_base; + unsigned int irq; int in_vtrace; wait_queue_head_t vtrace_waitq; @@ -189,14 +185,14 @@ }; -static struct fb_fix_screeninfo gcnfb_fix = { +static struct fb_fix_screeninfo vifb_fix = { .id = DRV_MODULE_NAME, .type = FB_TYPE_PACKED_PIXELS, .visual = FB_VISUAL_TRUECOLOR, /* lies, lies, lies, ... */ .accel = FB_ACCEL_NONE, }; -static struct fb_var_screeninfo gcnfb_var = { +static struct fb_var_screeninfo vifb_var = { .bits_per_pixel = 16, .activate = FB_ACTIVATE_NOW, .height = -1, @@ -214,7 +210,7 @@ static struct vi_video_mode *vi_current_video_mode = NULL; static int ypan = 1; /* 0..nothing, 1..ypan */ -/* legacy stuff, XXX really needed? */ +/* FIXME: is this really needed? */ static u32 pseudo_palette[17]; @@ -334,34 +330,22 @@ return (in_be16(ctl->io_base + VI_DCR) >> 8) & 3; } -/* - * Check if the current video mode is NTSC. - */ static inline int vi_is_mode_ntsc(struct vi_ctl *ctl) { return vi_get_mode(ctl) == 0; } -/* - * Check if the passed video mode is a progressive one. - */ static inline int vi_is_mode_progressive(__u32 vmode) { return (vmode & FB_VMODE_MASK) == FB_VMODE_NONINTERLACED; } -/* - * Check if the display supports progressive modes. - */ static inline int vi_can_do_progressive(struct vi_ctl *ctl) { return in_be16(ctl->io_base + VI_VISEL) & VI_VISEL_PROGRESSIVE; } -/* - * Try to guess a suitable video mode if none is currently selected. - */ -static void vi_mode_guess(struct vi_ctl *ctl) +static void vi_guess_mode(struct vi_ctl *ctl) { void __iomem *io_base = ctl->io_base; u16 mode; @@ -395,7 +379,8 @@ /* if we get here something wrong happened */ if (vi_current_video_mode == NULL) { - printk(KERN_DEBUG "HEY! SOMETHING WEIRD HERE!\n"); + drv_printk(KERN_DEBUG, "failed to guess video mode," + "using NTSC\n"); vi_current_video_mode = vi_video_modes + VI_VM_NTSC; } } @@ -429,9 +414,6 @@ ctl->flip_pending = 0; } -/* - * Enable video related interrupts. - */ static void vi_enable_interrupts(struct vi_ctl *ctl, int enable) { void __iomem *io_base = ctl->io_base; @@ -471,9 +453,6 @@ out_be32(io_base + VI_DI3, 0); } -/* - * Take care of vertical retrace events. - */ static void vi_dispatch_vtrace(struct vi_ctl *ctl) { unsigned long flags; @@ -486,14 +465,9 @@ wake_up_interruptible(&ctl->vtrace_waitq); } - -/* - * Handler for video related interrupts. - */ static irqreturn_t vi_irq_handler(int irq, void *dev) { - struct fb_info *info = - platform_get_drvdata((struct platform_device *)dev); + struct fb_info *info = dev_get_drvdata((struct device *)dev); struct vi_ctl *ctl = info->par; void __iomem *io_base = ctl->io_base; u32 val; @@ -533,15 +507,15 @@ } /* - * * Linux framebuffer support routines. + * */ /* * This is just a quick, dirty and cheap way of getting right colors on the * linux framebuffer console. */ -unsigned int gcnfb_writel(unsigned int rgbrgb, void *address) +unsigned int vifb_writel(unsigned int rgbrgb, void *address) { uint16_t *rgb = (uint16_t *) & rgbrgb; return fb_writel_real(rgbrgb16toycbycr(rgb[0], rgb[1]), address); @@ -550,16 +524,13 @@ /* * Restore the video hardware to sane defaults. */ -int gcnfb_restorefb(struct fb_info *info) +int vifb_restorefb(struct fb_info *info) { struct vi_ctl *ctl = info->par; void __iomem *io_base = ctl->io_base; int i; unsigned long flags; -/* - printk(KERN_INFO "Setting mode %s\n", vi_current_video_mode->name); -*/ /* set page 0 as the visible page and cancel pending flips */ spin_lock_irqsave(&ctl->lock, flags); ctl->visible_page = 1; @@ -587,13 +558,12 @@ return 0; } - -EXPORT_SYMBOL(gcnfb_restorefb); +EXPORT_SYMBOL(vifb_restorefb); /* - * XXX I wonder if we really need this. + * FIXME: do we really need this? */ -static int gcnfb_setcolreg(unsigned regno, unsigned red, unsigned green, +static int vifb_setcolreg(unsigned regno, unsigned red, unsigned green, unsigned blue, unsigned transp, struct fb_info *info) { /* @@ -607,13 +577,9 @@ return 1; switch (info->var.bits_per_pixel) { - case 8: - break; - case 15: case 16: if (info->var.red.offset == 10) { - /* XXX, not used currently */ - /* 1:5:5:5 */ + /* 1:5:5:5, not used currently */ ((u32 *) (info->pseudo_palette))[regno] = ((red & 0xf800) >> 1) | ((green & 0xf800) >> 6) | ((blue & 0xf800) >> 11); @@ -624,16 +590,10 @@ ((green & 0xfc00) >> 5) | ((blue & 0xf800) >> 11); } break; + case 8: + case 15: case 24: case 32: - /* XXX, not used currently */ - red >>= 8; - green >>= 8; - blue >>= 8; - ((u32 *) (info->pseudo_palette))[regno] = - (red << info->var.red.offset) | - (green << info->var.green.offset) | - (blue << info->var.blue.offset); break; } return 0; @@ -642,7 +602,7 @@ /* * Pan the display by altering the framebuffer address in hardware. */ -static int gcnfb_pan_display(struct fb_var_screeninfo *var, +static int vifb_pan_display(struct fb_var_screeninfo *var, struct fb_info *info) { struct vi_ctl *ctl = info->par; @@ -660,10 +620,7 @@ return 0; } -/* - * Miscellaneous stuff end up here. - */ -static int gcnfb_ioctl(struct fb_info *info, +static int vifb_ioctl(struct fb_info *info, unsigned int cmd, unsigned long arg) { struct vi_ctl *ctl = info->par; @@ -731,10 +688,10 @@ /* * Set the video mode according to info->var. */ -static int gcnfb_set_par(struct fb_info *info) +static int vifb_set_par(struct fb_info *info) { /* just load sane default here */ - gcnfb_restorefb(info); + vifb_restorefb(info); return 0; } @@ -742,7 +699,7 @@ * Check var and eventually tweak it to something supported. * Do not modify par here. */ -static int gcnfb_check_var(struct fb_var_screeninfo *var, struct fb_info *info) +static int vifb_check_var(struct fb_var_screeninfo *var, struct fb_info *info) { struct vi_ctl *ctl = info->par; @@ -759,26 +716,29 @@ return 0; } -/* linux framebuffer operations */ -struct fb_ops gcnfb_ops = { +struct fb_ops vifb_ops = { .owner = THIS_MODULE, - .fb_setcolreg = gcnfb_setcolreg, - .fb_pan_display = gcnfb_pan_display, - .fb_ioctl = gcnfb_ioctl, + .fb_setcolreg = vifb_setcolreg, + .fb_pan_display = vifb_pan_display, + .fb_ioctl = vifb_ioctl, #ifdef CONFIG_FB_GAMECUBE_GX .fb_mmap = gcngx_mmap, #endif - .fb_check_var = gcnfb_check_var, - .fb_set_par = gcnfb_set_par, + .fb_check_var = vifb_check_var, + .fb_set_par = vifb_set_par, .fb_fillrect = cfb_fillrect, .fb_copyarea = cfb_copyarea, .fb_imageblit = cfb_imageblit, }; /* + * Driver model helper routines. * */ -static int gcnfb_probe(struct platform_device *dev) + +static int vifb_do_probe(struct device *dev, + struct resource *mem, unsigned int irq, + unsigned long xfb_start, unsigned long xfb_size) { struct fb_info *info; struct vi_ctl *ctl; @@ -786,20 +746,21 @@ int video_cmap_len; int err = -EINVAL; - info = framebuffer_alloc(sizeof(struct vi_ctl), &dev->dev); + info = framebuffer_alloc(sizeof(struct vi_ctl), dev); if (!info) goto err_framebuffer_alloc; - info->fbops = &gcnfb_ops; - info->var = gcnfb_var; - info->fix = gcnfb_fix; + info->fbops = &vifb_ops; + info->var = vifb_var; + info->fix = vifb_fix; ctl = info->par; ctl->info = info; /* first thing needed */ - ctl->io_base = VI_IO_BASE; + ctl->io_base = ioremap(mem->start, mem->end - mem->start + 1); + ctl->irq = irq; - vi_mode_guess(ctl); + vi_guess_mode(ctl); info->var.xres = vi_current_video_mode->width; info->var.yres = vi_current_video_mode->height; @@ -814,24 +775,22 @@ /* * Location and size of the external framebuffer. */ - info->fix.smem_start = GCN_XFB_START; - info->fix.smem_len = GCN_XFB_SIZE; + info->fix.smem_start = xfb_start; + info->fix.smem_len = xfb_size; if (!request_mem_region(info->fix.smem_start, info->fix.smem_len, DRV_MODULE_NAME)) { - printk(KERN_WARNING - "gcnfb: abort, cannot reserve video memory at %p\n", - (void *)info->fix.smem_start); - /* We cannot make this fatal. Sometimes this comes from magic - spaces our resource handlers simply don't know about */ + drv_printk(KERN_WARNING, + "failed to request video memory at %p\n", + (void *)info->fix.smem_start); } info->screen_base = ioremap(info->fix.smem_start, info->fix.smem_len); if (!info->screen_base) { - printk(KERN_ERR - "gcnfb: abort, cannot ioremap video memory" - " at %p (%dk)\n", - (void *)info->fix.smem_start, info->fix.smem_len / 1024); + drv_printk(KERN_ERR, + "failed to ioremap video memory at %p (%dk)\n", + (void *)info->fix.smem_start, + info->fix.smem_len / 1024); err = -EIO; goto err_ioremap; } @@ -846,26 +805,26 @@ ctl->flip_pending = 0; - printk(KERN_INFO - "gcnfb: framebuffer at 0x%p, mapped to 0x%p, size %dk\n", - (void *)info->fix.smem_start, info->screen_base, - info->fix.smem_len / 1024); - printk(KERN_INFO - "gcnfb: mode is %dx%dx%d, linelength=%d, pages=%d\n", - info->var.xres, info->var.yres, - info->var.bits_per_pixel, - info->fix.line_length, - info->fix.smem_len / (info->fix.line_length * info->var.yres)); + drv_printk(KERN_INFO, + "framebuffer at 0x%p, mapped to 0x%p, size %dk\n", + (void *)info->fix.smem_start, info->screen_base, + info->fix.smem_len / 1024); + drv_printk(KERN_INFO, + "mode is %dx%dx%d, linelength=%d, pages=%d\n", + info->var.xres, info->var.yres, + info->var.bits_per_pixel, + info->fix.line_length, + info->fix.smem_len / (info->fix.line_length*info->var.yres)); info->var.xres_virtual = info->var.xres; info->var.yres_virtual = info->fix.smem_len / info->fix.line_length; if (ypan && info->var.yres_virtual > info->var.yres) { - printk(KERN_INFO "gcnfb: scrolling: pan, yres_virtual=%d\n", - info->var.yres_virtual); + drv_printk(KERN_INFO, "scrolling: pan, yres_virtual=%d\n", + info->var.yres_virtual); } else { - printk(KERN_INFO "gcnfb: scrolling: redraw, yres_virtual=%d\n", - info->var.yres_virtual); + drv_printk(KERN_INFO, "scrolling: redraw, yres_virtual=%d\n", + info->var.yres_virtual); info->var.yres_virtual = info->var.yres; ypan = 0; } @@ -875,38 +834,21 @@ if (!ypan) info->fbops->fb_pan_display = NULL; - /* FIXME! Please, use here *real* values */ - /* some dummy values for timing to make fbset happy */ + /* use some dummy values for timing to make fbset happy */ info->var.pixclock = 10000000 / info->var.xres * 1000 / info->var.yres; info->var.left_margin = (info->var.xres / 8) & 0xf8; info->var.hsync_len = (info->var.xres / 8) & 0xf8; - if (info->var.bits_per_pixel == 15) { - info->var.red.offset = 11; - info->var.red.length = 5; - info->var.green.offset = 6; - info->var.green.length = 5; - info->var.blue.offset = 1; - info->var.blue.length = 5; - info->var.transp.offset = 15; - info->var.transp.length = 1; - video_cmap_len = 16; - } else if (info->var.bits_per_pixel == 16) { - info->var.red.offset = 11; - info->var.red.length = 5; - info->var.green.offset = 5; - info->var.green.length = 6; - info->var.blue.offset = 0; - info->var.blue.length = 5; - info->var.transp.offset = 0; - info->var.transp.length = 0; - video_cmap_len = 16; - } else { - info->var.red.length = 6; - info->var.green.length = 6; - info->var.blue.length = 6; - video_cmap_len = 256; - } + /* we support ony 16 bits per pixel */ + info->var.red.offset = 11; + info->var.red.length = 5; + info->var.green.offset = 5; + info->var.green.length = 6; + info->var.blue.offset = 0; + info->var.blue.length = 5; + info->var.transp.offset = 0; + info->var.transp.length = 0; + video_cmap_len = 16; info->pseudo_palette = pseudo_palette; if (fb_alloc_cmap(&info->cmap, video_cmap_len, 0)) { @@ -916,10 +858,11 @@ info->flags = FBINFO_FLAG_DEFAULT | (ypan) ? FBINFO_HWACCEL_YPAN : 0; - platform_set_drvdata(dev, info); + dev_set_drvdata(dev, info); - if (request_irq(VI_IRQ, vi_irq_handler, IRQF_DISABLED, "gcn-vi", dev)) { - printk(KERN_ERR "unable to register IRQ %u\n", VI_IRQ); + err = request_irq(ctl->irq, vi_irq_handler, 0, DRV_MODULE_NAME, dev); + if (err) { + drv_printk(KERN_ERR, "unable to register IRQ %u\n", ctl->irq); goto err_request_irq; } @@ -930,7 +873,7 @@ } /* setup the framebuffer address */ - gcnfb_restorefb(info); + vifb_restorefb(info); #ifdef CONFIG_FB_GAMECUBE_GX err = gcngx_init(info); @@ -938,8 +881,8 @@ goto err_gcngx_init; #endif - printk(KERN_INFO "fb%d: %s frame buffer device\n", - info->node, info->fix.id); + drv_printk(KERN_INFO, "fb%d: %s frame buffer device\n", + info->node, info->fix.id); return 0; @@ -948,7 +891,7 @@ unregister_framebuffer(info); #endif err_register_framebuffer: - free_irq(VI_IRQ, 0); + free_irq(ctl->irq, 0); err_request_irq: fb_dealloc_cmap(&info->cmap); err_alloc_cmap: @@ -956,18 +899,17 @@ err_ioremap: release_mem_region(info->fix.smem_start, info->fix.smem_len); - platform_set_drvdata(dev, NULL); + dev_set_drvdata(dev, NULL); + iounmap(ctl->io_base); framebuffer_release(info); err_framebuffer_alloc: return err; } -/** - * - */ -static int gcnfb_remove(struct platform_device *dev) +static int vifb_do_remove(struct device *dev) { - struct fb_info *info = platform_get_drvdata(dev); + struct fb_info *info = dev_get_drvdata(dev); + struct vi_ctl *ctl = info->par; if (!info) return -ENODEV; @@ -975,42 +917,28 @@ #ifdef CONFIG_FB_GAMECUBE_GX gcngx_exit(info); #endif - free_irq(VI_IRQ, dev); + free_irq(ctl->irq, dev); unregister_framebuffer(info); fb_dealloc_cmap(&info->cmap); iounmap(info->screen_base); release_mem_region(info->fix.smem_start, info->fix.smem_len); - platform_set_drvdata(dev, NULL); + dev_set_drvdata(dev, NULL); + iounmap(ctl->io_base); framebuffer_release(info); return 0; } -static struct platform_driver gcnfb_driver = { - .probe = gcnfb_probe, - .remove = gcnfb_remove, - .driver = { - .name = DRV_MODULE_NAME, - }, -}; - -static struct platform_device gcnfb_device = { - .name = DRV_MODULE_NAME, -}; - #ifndef MODULE -/** - * - */ -static int __devinit gcnfb_setup(char *options) +static int __devinit vifb_setup(char *options) { char *this_opt; if (!options || !*options) return 0; - printk("gcnfb: options = %s\n", options); + drv_printk(KERN_DEBUG, "options = %s\n", options); while ((this_opt = strsep(&options, ",")) != NULL) { if (!*this_opt) @@ -1034,45 +962,99 @@ return 0; } -#endif /* MODULE */ +#endif /* MODULE */ + /* + * OF platform driver hooks. * */ -static int __init gcnfb_init_module(void) + +static int __init vifb_of_probe(struct of_device *odev, + const struct of_device_id *match) { - int ret = 0; -#ifndef MODULE - char *option = NULL; + struct resource res; + const unsigned long *prop; + unsigned long xfb_start, xfb_size; + int retval; - if (fb_get_options(DRV_MODULE_NAME, &option)) { - /* for backwards compatibility */ - if (fb_get_options("gamecubefb", &option)) - return -ENODEV; + retval = of_address_to_resource(odev->node, 0, &res); + if (retval) { + drv_printk(KERN_ERR, "no io memory range found\n"); + return -ENODEV; } - gcnfb_setup(option); -#endif - ret = platform_driver_register(&gcnfb_driver); - if (!ret) { - ret = platform_device_register(&gcnfb_device); - if (ret) - platform_driver_unregister(&gcnfb_driver); + prop = of_get_property(odev->node, "xfb-start", NULL); + if (!prop) { + drv_printk(KERN_ERR, "no xfb start found\n"); + return -ENODEV; } - return ret; + xfb_start = *prop; + + prop = of_get_property(odev->node, "xfb-size", NULL); + if (!prop) { + drv_printk(KERN_ERR, "no xfb size found\n"); + return -ENODEV; + } + xfb_size = *prop; + + return vifb_do_probe(&odev->dev, + &res, irq_of_parse_and_map(odev->node, 0), + xfb_start, xfb_size); } +static int __exit vifb_of_remove(struct of_device *odev) +{ + return vifb_do_remove(&odev->dev); +} + + +static struct of_device_id vifb_of_match[] = { + { .compatible = "nintendo,vifb", }, + { }, +}; + +MODULE_DEVICE_TABLE(of, vifb_of_match); + +static struct of_platform_driver vifb_of_driver = { + .owner = THIS_MODULE, + .name = DRV_MODULE_NAME, + .match_table = vifb_of_match, + .probe = vifb_of_probe, + .remove = vifb_of_remove, +}; + /* + * Module interface hooks * */ -static void __exit gcnfb_exit_module(void) + +static int __init vifb_init_module(void) { - platform_device_unregister(&gcnfb_device); - platform_driver_unregister(&gcnfb_driver); +#ifndef MODULE + char *option = NULL; + + if (fb_get_options(DRV_MODULE_NAME, &option)) { + /* for backwards compatibility */ + if (fb_get_options("gcnfb", &option)) + return -ENODEV; + } + vifb_setup(option); +#endif + + drv_printk(KERN_INFO, "%s - version %s\n", DRV_DESCRIPTION, + vifb_driver_version); + + return of_register_platform_driver(&vifb_of_driver); } -module_init(gcnfb_init_module); -module_exit(gcnfb_exit_module); +static void __exit vifb_exit_module(void) +{ + of_unregister_platform_driver(&vifb_of_driver); +} + +module_init(vifb_init_module); +module_exit(vifb_exit_module); MODULE_DESCRIPTION(DRV_DESCRIPTION); MODULE_AUTHOR(DRV_AUTHOR); Index: gcngx.c =================================================================== RCS file: /cvsroot/gc-linux/linux/drivers/video/gcngx.c,v retrieving revision 1.13 retrieving revision 1.14 diff -u -d -r1.13 -r1.14 --- gcngx.c 4 Mar 2008 06:20:56 -0000 1.13 +++ gcngx.c 26 Mar 2008 20:15:22 -0000 1.14 @@ -31,6 +31,8 @@ #include <asm/atomic.h> #include <asm/cacheflush.h> +#error This driver is broken since ARCH=powerpc changes. A rewrite is needed. + #ifdef CONFIG_PPC_MERGE #include <platforms/embedded6xx/gamecube.h> #else |
From: Albert H. <he...@us...> - 2008-03-26 20:15:57
|
Update of /cvsroot/gc-linux/linux/sound/ppc In directory sc8-pr-cvs2.sourceforge.net:/tmp/cvs-serv22420/sound/ppc Modified Files: gcn-ai.c gcn-mic.c Log Message: Remove old ugecon driver (we use now usbgecko_udbg). Rewrite the following drivers as of_platform drivers using the device tree: - gcn-rsw - starlet-ipc - gcn-aram - rvl-mem2 - gcn-di - exi-driver, exi-hw - gcn-si - gcnfb (gcn-vifb) - gcn-ai Marked as broken gcn-mi and gcngx. Updated defconfigs. Index: gcn-mic.c =================================================================== RCS file: /cvsroot/gc-linux/linux/sound/ppc/gcn-mic.c,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- gcn-mic.c 24 Feb 2008 18:05:35 -0000 1.5 +++ gcn-mic.c 26 Mar 2008 20:15:24 -0000 1.6 @@ -30,7 +30,7 @@ #include <sound/initval.h> #define DRV_MODULE_NAME "gcn-mic" -#define DRV_DESCRIPTION "Nintendo GameCube Microphone (DOL-022) driver" +#define DRV_DESCRIPTION "Nintendo Microphone (DOL-022) driver" #define DRV_AUTHOR "Albert Herranz" MODULE_AUTHOR(DRV_AUTHOR); Index: gcn-ai.c =================================================================== RCS file: /cvsroot/gc-linux/linux/sound/ppc/gcn-ai.c,v retrieving revision 1.10 retrieving revision 1.11 diff -u -d -r1.10 -r1.11 --- gcn-ai.c 4 Mar 2008 06:20:56 -0000 1.10 +++ gcn-ai.c 26 Mar 2008 20:15:24 -0000 1.11 @@ -1,9 +1,9 @@ /* * sound/ppc/gcn-ai.c * - * Nintendo GameCube audio interface driver - * Copyright (C) 2004-2007 The GameCube Linux Team - * Copyright (C) 2007 Albert Herranz + * Nintendo GameCube/Wii Audio Interface (AI) driver + * Copyright (C) 2004-2008 The GameCube Linux Team + * Copyright (C) 2007,2008 Albert Herranz * * Based on work from mist, kirin, groepaz, Steve_-, isobel and others. * @@ -14,101 +14,168 @@ * */ -/* #define AI_DEBUG */ - -#include <sound/driver.h> +#include <linux/kernel.h> +#include <linux/module.h> #include <linux/init.h> +#include <linux/of_platform.h> #include <linux/interrupt.h> -#include <linux/module.h> -#include <linux/kernel.h> +#include <linux/dma-mapping.h> #include <asm/io.h> -#include <asm/cacheflush.h> +#include <sound/driver.h> #include <sound/core.h> #include <sound/pcm.h> #define SNDRV_GET_ID #include <sound/initval.h> -#ifdef CONFIG_PPC_MERGE -#include <platforms/embedded6xx/gamecube.h> -#else -#include <platforms/gamecube.h> -#endif - -#ifdef AI_DEBUG -# define DPRINTK(fmt, args...) \ - printk(KERN_ERR "%s: " fmt, __FUNCTION__ , ## args) -#else -# define DPRINTK(fmt, args...) -#endif #define DRV_MODULE_NAME "gcn-ai" -#define DRV_DESCRIPTION "Nintendo GameCube Audio Interface driver" -#define DRV_AUTHOR "me!" +#define DRV_DESCRIPTION "Nintendo GameCube/Wii Audio Interface (AI) driver" +#define DRV_AUTHOR "Michael Steil, " \ + "(kirin), " \ + "(groepaz), " \ + "Steven Looman, " \ + "Albert Herranz" -MODULE_DESCRIPTION(DRV_DESCRIPTION); -MODULE_AUTHOR(DRV_AUTHOR); -MODULE_LICENSE("GPL"); +static char ai_driver_version[] = "1.0-isobel"; -#define PFX DRV_MODULE_NAME ": " -#define ai_printk(level, format, arg...) \ - printk(level PFX format , ## arg) +#define drv_printk(level, format, arg...) \ + printk(level DRV_MODULE_NAME ": " format , ## arg) -#define DSP_BASE (GCN_IO1_BASE + 0x5000) -#define AI_BASE (GCN_IO2_BASE + 0x6c00) -#define DSP_IRQ 6 +/* + * Hardware. + * + */ -#define AI_DSP_CSR (void __iomem*)0xCC00500A -#define AI_CSR_RES (1<<0) -#define AI_CSR_PIINT (1<<1) -#define AI_CSR_HALT (1<<2) -#define AI_CSR_AIDINT (1<<3) -#define AI_CSR_AIDINTMASK (1<<4) -#define AI_CSR_ARINT (1<<5) -#define AI_CSR_ARINTMASK (1<<6) -#define AI_CSR_DSPINT (1<<7) -#define AI_CSR_DSPINTMASK (1<<8) -#define AI_CSR_DSPDMA (1<<9) -#define AI_CSR_RESETXXX (1<<11) -#define AUDIO_IRQ_CAUSE *(volatile u_int16_t *)(0xCC005010) +/* + * DSP registers. + */ +#define AI_DSP_CSR 0x0a /* 16 bits */ +#define AI_CSR_RES (1<<0) +#define AI_CSR_PIINT (1<<1) +#define AI_CSR_HALT (1<<2) +#define AI_CSR_AIDINT (1<<3) +#define AI_CSR_AIDINTMASK (1<<4) +#define AI_CSR_ARINT (1<<5) +#define AI_CSR_ARINTMASK (1<<6) +#define AI_CSR_DSPINT (1<<7) +#define AI_CSR_DSPINTMASK (1<<8) +#define AI_CSR_DSPDMA (1<<9) +#define AI_CSR_RESETXXX (1<<11) -#define AUDIO_DMA_STARTH *(volatile u_int16_t *)(0xCC005030) -#define AUDIO_DMA_STARTL *(volatile u_int16_t *)(0xCC005032) +#define AI_DSP_DMA_ADDRH 0x30 /* 16 bits */ -#define AUDIO_DMA_LENGTH *(volatile u_int16_t *)(0xCC005036) -#define AI_DCL_PLAY (1<<15) +#define AI_DSP_DMA_ADDRL 0x32 /* 16 bits */ -#define AUDIO_DMA_LEFT *(volatile u_int16_t *)(0xCC00503A) +#define AI_DSP_DMA_CTLLEN 0x36 /* 16 bits */ +#define AI_CTLLEN_PLAY (1<<15) -#define AUDIO_STREAM_STATUS *(volatile u_int32_t *)(GCN_IO2_BASE+0x6C00) -#define AI_AICR_RATE (1<<6) +#define AI_DSP_DMA_LEFT 0x3a /* 16 bits */ -#define LoadSample(addr, len) \ - AUDIO_DMA_STARTH = (addr >> 16) & 0xffff; \ - AUDIO_DMA_STARTL = addr & 0xffff; \ - AUDIO_DMA_LENGTH = (AUDIO_DMA_LENGTH & AI_DCL_PLAY) | (len >> 5) -#define StartSample() AUDIO_DMA_LENGTH |= AI_DCL_PLAY -#define StopSample() AUDIO_DMA_LENGTH &= ~AI_DCL_PLAY -#define SetFreq32KHz() AUDIO_STREAM_STATUS |= AI_AICR_RATE -#define SetFreq48KHz() AUDIO_STREAM_STATUS &= ~AI_AICR_RATE +/* + * AI registers. + */ +#define AI_AICR 0x00 /* 32 bits */ +#define AI_AICR_RATE (1<<6) -static int index = SNDRV_DEFAULT_IDX1; /* Index 0-MAX */ -static char *id = SNDRV_DEFAULT_STR1; /* ID for this card */ +/* + * Sound chip. + */ struct snd_gcn { - struct snd_card *card; - struct snd_pcm *pcm; - struct snd_pcm_substream *playback_substream; - struct snd_pcm_substream *capture_substream; - spinlock_t reg_lock; - int dma_size; - int period_size; - int nperiods; - volatile int cur_period; - volatile int start_play; - volatile int stop_play; + struct snd_card *card; + struct snd_pcm *pcm; + struct snd_pcm_substream *playback_substream; + struct snd_pcm_substream *capture_substream; + + volatile int start_play; + volatile int stop_play; + + dma_addr_t dma_addr; + size_t period_size; + int nperiods; + volatile int cur_period; + + void __iomem *dsp_base; + void __iomem *ai_base; + unsigned int irq; + + struct device *dev; }; + +/* + * Hardware functions. + * + */ + +static void ai_dsp_load_sample(void __iomem *dsp_base, + void *addr, size_t size) +{ + u32 daddr = (unsigned long)addr; + + out_be16(dsp_base + AI_DSP_DMA_ADDRH, daddr >> 16); + out_be16(dsp_base + AI_DSP_DMA_ADDRL, daddr & 0xffff); + out_be16(dsp_base + AI_DSP_DMA_CTLLEN, + (in_be16(dsp_base + AI_DSP_DMA_CTLLEN) & AI_CTLLEN_PLAY) | + size >> 5); +} + +static void ai_dsp_start_sample(void __iomem *dsp_base) +{ + out_be16(dsp_base + AI_DSP_DMA_CTLLEN, + in_be16(dsp_base + AI_DSP_DMA_CTLLEN) | AI_CTLLEN_PLAY); +} + +static void ai_dsp_stop_sample(void __iomem *dsp_base) +{ + out_be16(dsp_base + AI_DSP_DMA_CTLLEN, + in_be16(dsp_base + AI_DSP_DMA_CTLLEN) & ~AI_CTLLEN_PLAY); +} + +static int ai_dsp_get_remaining_byte_count(void __iomem *dsp_base) +{ + return in_be16(dsp_base + AI_DSP_DMA_LEFT) << 5; +} + +static void ai_enable_interrupts(void __iomem *dsp_base) +{ + unsigned long flags; + + /* enable AI DMA and DSP interrupts */ + local_irq_save(flags); + out_be16(dsp_base + AI_DSP_CSR, + in_be16(dsp_base + AI_DSP_CSR) | + AI_CSR_AIDINTMASK | AI_CSR_PIINT); + local_irq_restore(flags); +} + +static void ai_disable_interrupts(void __iomem *dsp_base) +{ + unsigned long flags; + + /* disable AI interrupts */ + local_irq_save(flags); + out_be16(dsp_base + AI_DSP_CSR, + in_be16(dsp_base + AI_DSP_CSR) & ~AI_CSR_AIDINTMASK); + local_irq_restore(flags); +} + +static void ai_set_rate(void __iomem *ai_base, int fortyeight) +{ + /* set rate to 48KHz or 32KHz */ + if (fortyeight) + out_be32(ai_base + AI_AICR, + in_be32(ai_base + AI_AICR) & ~AI_AICR_RATE); + else + out_be32(ai_base + AI_AICR, + in_be32(ai_base + AI_AICR) | AI_AICR_RATE); +} + + +static int index = SNDRV_DEFAULT_IDX1; /* index 0-MAX */ +static char *id = SNDRV_DEFAULT_STR1; /* ID for this card */ + static struct snd_gcn *gcn_audio = NULL; static struct snd_pcm_hardware snd_gcn_playback = { @@ -127,12 +194,11 @@ .periods_max = 1024, }; -static int snd_gcn_open(struct snd_pcm_substream * substream) +static int snd_gcn_open(struct snd_pcm_substream *substream) { struct snd_gcn *chip = snd_pcm_substream_chip(substream); struct snd_pcm_runtime *runtime = substream->runtime; - DPRINTK("pcm open\n"); chip->playback_substream = substream; runtime->hw = snd_gcn_playback; @@ -145,94 +211,74 @@ return 0; } -static int snd_gcn_close(struct snd_pcm_substream * substream) +static int snd_gcn_close(struct snd_pcm_substream *substream) { struct snd_gcn *chip = snd_pcm_substream_chip(substream); - DPRINTK("pcm close\n"); chip->playback_substream = NULL; return 0; } -static int snd_gcn_hw_params(struct snd_pcm_substream * substream, +static int snd_gcn_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params * hw_params) { - DPRINTK("snd_gcn_hw_params\n"); return snd_pcm_lib_malloc_pages(substream, params_buffer_bytes(hw_params)); } -static int snd_gcn_hw_free(struct snd_pcm_substream * substream) +static int snd_gcn_hw_free(struct snd_pcm_substream *substream) { - DPRINTK("snd_gcn_hw_free\n"); return snd_pcm_lib_free_pages(substream); } -static int snd_gcn_prepare(struct snd_pcm_substream * substream) +static int snd_gcn_prepare(struct snd_pcm_substream *substream) { - /* struct snd_gcn *chip = snd_pcm_substream_chip(substream); */ + struct snd_gcn *chip = snd_pcm_substream_chip(substream); struct snd_pcm_runtime *runtime = substream->runtime; - DPRINTK("snd_gcn_prepare\n"); - DPRINTK("prepare: rate=%i, channels=%i, sample_bits=%i\n", - runtime->rate, runtime->channels, runtime->sample_bits); - DPRINTK("prepare: format=%i, access=%i\n", - runtime->format, runtime->access); - - /* set requested samplerate */ + /* set requested sample rate */ switch (runtime->rate) { case 32000: - SetFreq32KHz(); + ai_set_rate(chip->ai_base, 0); break; case 48000: - SetFreq48KHz(); + ai_set_rate(chip->ai_base, 1); break; default: - DPRINTK("unsupported rate: %i!\n", runtime->rate); + drv_printk(KERN_ERR, "unsupported rate %i\n", runtime->rate); return -EINVAL; } return 0; } -static int snd_gcn_trigger(struct snd_pcm_substream * substream, int cmd) +static int snd_gcn_trigger(struct snd_pcm_substream *substream, int cmd) { struct snd_gcn *chip = snd_pcm_substream_chip(substream); struct snd_pcm_runtime *runtime = substream->runtime; - DPRINTK("snd_gcn_trigger\n"); switch (cmd) { case SNDRV_PCM_TRIGGER_START: /* do something to start the PCM engine */ - DPRINTK("PCM_TRIGGER_START\n"); if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - chip->dma_size = snd_pcm_lib_buffer_bytes(substream); chip->period_size = snd_pcm_lib_period_bytes(substream); - chip->nperiods = chip->dma_size / chip->period_size; + chip->nperiods = snd_pcm_lib_buffer_bytes(substream) / + chip->period_size; chip->cur_period = 0; chip->stop_play = 0; chip->start_play = 1; - DPRINTK("stream is PCM_PLAYBACK," - " dma_area=0x%p dma_size=%i\n", - runtime->dma_area, chip->dma_size); - DPRINTK("%i periods of %i bytes\n", chip->nperiods, - chip->period_size); - - flush_dcache_range((unsigned long)runtime->dma_area, - (unsigned long)(runtime->dma_area + - chip->period_size)); - LoadSample((u_int32_t) runtime->dma_area, - chip->period_size); - StartSample(); + chip->dma_addr = dma_map_single(chip->dev, + runtime->dma_area, + chip->period_size, + DMA_TO_DEVICE); + ai_dsp_load_sample(chip->dsp_base, runtime->dma_area, + chip->period_size); + ai_dsp_start_sample(chip->dsp_base); } break; case SNDRV_PCM_TRIGGER_STOP: - /* do something to stop the PCM engine */ - DPRINTK("PCM_TRIGGER_STOP\n"); - chip->stop_play = 1; - /* StopSample(); */ break; default: return -EINVAL; @@ -241,19 +287,14 @@ return 0; } -static snd_pcm_uframes_t snd_gcn_pointer(struct snd_pcm_substream * substream) +static snd_pcm_uframes_t snd_gcn_pointer(struct snd_pcm_substream *substream) { struct snd_gcn *chip = snd_pcm_substream_chip(substream); struct snd_pcm_runtime *runtime = substream->runtime; int left, bytes; - DPRINTK("snd_gcn_pointer\n"); - left = AUDIO_DMA_LEFT << 5; + left = ai_dsp_get_remaining_byte_count(chip->dsp_base); bytes = chip->period_size * (chip->cur_period + 1); - /* bytes = snd_pcm_lib_buffer_bytes(substream); */ - - DPRINTK("pointer: %i of %i(%i) bytes left, period #%i\n", left, - chip->period_size, bytes, chip->cur_period); return bytes_to_frames(runtime, bytes - left); } @@ -261,52 +302,59 @@ static irqreturn_t snd_gcn_interrupt(int irq, void *dev) { struct snd_gcn *chip = dev; + void *addr; unsigned long flags; - u16 tmp; - - if (in_be16(AI_DSP_CSR) & AI_CSR_AIDINT) { - u_int32_t addr; + u16 csr; - DPRINTK("DSP interrupt! period #%i\n", chip->cur_period); + /* + * This is a shared interrupt. Do nothing if it ain't ours. + */ + csr = in_be16(chip->dsp_base + AI_DSP_CSR); + if (!(csr & AI_CSR_AIDINT)) + return IRQ_NONE; - if (chip->start_play) { - chip->start_play = 0; - } else if (chip->stop_play) { - StopSample(); - } else { - StopSample(); + if (chip->start_play) { + chip->start_play = 0; + } else { + /* stop current sample */ + ai_dsp_stop_sample(chip->dsp_base); + dma_unmap_single(chip->dev, chip->dma_addr, chip->period_size, + DMA_TO_DEVICE); + /* load next sample if we are not stopping */ + if (!chip->stop_play) { if (chip->cur_period < (chip->nperiods - 1)) { chip->cur_period++; } else chip->cur_period = 0; - addr = - (u_int32_t) chip->playback_substream->runtime-> - dma_area + (chip->cur_period * chip->period_size); - - flush_dcache_range(addr, addr + chip->period_size); - LoadSample(addr, chip->period_size); - - StartSample(); - /* chip->start_play = 1; */ + addr = chip->playback_substream->runtime->dma_area + + (chip->cur_period * chip->period_size); + chip->dma_addr = dma_map_single(chip->dev, + addr, + chip->period_size, + DMA_TO_DEVICE); + ai_dsp_load_sample(chip->dsp_base, addr, + chip->period_size); + ai_dsp_start_sample(chip->dsp_base); snd_pcm_period_elapsed(chip->playback_substream); } - /* ack AI DMA interrupt, go through lengths to only ack - the audio part */ - local_irq_save(flags); - tmp = in_be16(AI_DSP_CSR); - tmp &= ~(AI_CSR_PIINT | AI_CSR_ARINT | AI_CSR_DSPINT); - out_be16(AI_DSP_CSR, tmp); - local_irq_restore(flags); - - return IRQ_HANDLED; } - - return IRQ_NONE; + /* + * Ack the AI DMA interrupt, going through lengths to only ack + * the audio part. + */ + local_irq_save(flags); + csr = in_be16(chip->dsp_base + AI_DSP_CSR); + csr &= ~(AI_CSR_PIINT | AI_CSR_ARINT | AI_CSR_DSPINT); + out_be16(chip->dsp_base + AI_DSP_CSR, csr); + local_irq_restore(flags); + + return IRQ_HANDLED; } + static struct snd_pcm_ops snd_gcn_playback_ops = { .open = snd_gcn_open, .close = snd_gcn_close, @@ -321,15 +369,14 @@ static int __devinit snd_gcn_new_pcm(struct snd_gcn * chip) { struct snd_pcm *pcm; - int err; + int retval; - if ((err = - snd_pcm_new(chip->card, chip->card->shortname, 0, 1, 0, &pcm)) < 0) - return err; + retval = snd_pcm_new(chip->card, chip->card->shortname, 0, 1, 0, &pcm); + if (retval < 0) + return retval; snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &snd_gcn_playback_ops); - /* snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &snd_gcn_capture_ops); */ /* preallocate 64k buffer */ snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_CONTINUOUS, @@ -346,96 +393,206 @@ return 0; } -static int __init alsa_card_gcn_init(void) +static void ai_shutdown(struct snd_gcn *chip) { - int err; - struct snd_card *card; - unsigned long flags; -/* if (!is_gamecube()) - return -ENODEV; */ + ai_dsp_stop_sample(chip->dsp_base); + ai_disable_interrupts(chip->dsp_base); +} - /* register the soundcard */ - card = snd_card_new(index, id, THIS_MODULE, sizeof(struct snd_gcn)); - if (card == NULL) - return -ENOMEM; +static int ai_init(struct snd_gcn *chip, + struct resource *dsp, struct resource *ai, + unsigned int irq) +{ + struct snd_card *card; + int retval; - gcn_audio = (struct snd_gcn *) card->private_data; - if (gcn_audio == NULL) - return -ENOMEM; + chip->dsp_base = ioremap(dsp->start, dsp->end - dsp->start + 1); + chip->ai_base = ioremap(ai->start, ai->end - ai->start + 1); + chip->irq = irq; - memset(gcn_audio, 0, sizeof(struct snd_gcn)); - gcn_audio->card = card; - gcn_audio->stop_play = 1; + chip->stop_play = 1; + card = chip->card; - strcpy(card->driver, "gcn-ai"); + strcpy(card->driver, DRV_MODULE_NAME); strcpy(card->shortname, card->driver); sprintf(card->longname, "Nintendo GameCube Audio Interface"); - if (request_irq(DSP_IRQ, snd_gcn_interrupt, - IRQF_DISABLED | IRQF_SHARED, - card->shortname,gcn_audio)) { - snd_printk(KERN_ERR "%s: unable to grab IRQ %d\n", - card->shortname, DSP_IRQ); - return -EBUSY; - } else { + /* PCM */ + retval = snd_gcn_new_pcm(chip); + if (retval < 0) + goto err_new_pcm; - /* enable AI DMA and DSP interrupt */ - local_irq_save(flags); - out_be16(AI_DSP_CSR, - in_be16(AI_DSP_CSR) | AI_CSR_AIDINTMASK | AI_CSR_PIINT); - local_irq_restore(flags); + retval = request_irq(chip->irq, snd_gcn_interrupt, + IRQF_DISABLED | IRQF_SHARED, + card->shortname, chip); + if (retval) { + drv_printk(KERN_ERR, "unable to request IRQ %d\n", chip->irq); + goto err_request_irq; } + ai_enable_interrupts(chip->dsp_base); -#if 0 - if (request_region(AUDIO_INTERFACE_ADDR, 0x200, card->shortname) == - NULL) { - printk("unable to grab memory region 0x%lx-0x%lx\n", - AUDIO_INTERFACE_ADDR, AUDIO_INTERFACE_ADDR + 0x200 - 1); - return -EBUSY; + gcn_audio = chip; + retval = snd_card_register(card); + if (retval) { + drv_printk(KERN_ERR, "failed to register card\n"); + goto err_card_register; } - if ((iobase = (unsigned long)ioremap(AUDIO_INTERFACE_ADDR, 0x200)) == 0) { - printk("unable to remap memory region 0x%lx-0x%lx\n", - AUDIO_INTERFACE_ADDR, AUDIO_INTERFACE_ADDR + 0x200 - 1); + return 0; + +err_card_register: + ai_disable_interrupts(chip->dsp_base); + free_irq(chip->irq, chip); +err_request_irq: +err_new_pcm: + iounmap(chip->dsp_base); + iounmap(chip->ai_base); + return retval; +} + +static void ai_exit(struct snd_gcn *chip) +{ + ai_dsp_stop_sample(chip->dsp_base); + ai_disable_interrupts(chip->dsp_base); + + free_irq(chip->irq, chip); + iounmap(chip->dsp_base); + iounmap(chip->ai_base); +} + + +/* + * Device interfaces. + * + */ + +static int ai_do_shutdown(struct device *dev) +{ + struct snd_gcn *chip; + + chip = dev_get_drvdata(dev); + if (chip) { + ai_shutdown(chip); + return 0; + } + return -ENODEV; +} + +static int ai_do_probe(struct device *dev, + struct resource *dsp, struct resource *ai, + unsigned int irq) +{ + struct snd_card *card; + struct snd_gcn *chip; + int retval; + + card = snd_card_new(index, id, THIS_MODULE, sizeof(struct snd_gcn)); + if (!card) { + drv_printk(KERN_ERR, "failed to allocate card\n"); return -ENOMEM; } + chip = (struct snd_gcn *)card->private_data; + memset(chip, 0, sizeof(*chip)); + chip->card = card; + dev_set_drvdata(dev, chip); + chip->dev = dev; - printk("iobase=0x%lx\n", iobase); -#endif + retval = ai_init(chip, dsp, ai, irq); + if (retval) + snd_card_free(card); -#if 0 - /* mixer */ - if ((err = snd_gcn_mixer_new(gcn_audio)) < 0) - goto fail; -#endif - /* PCM */ - if ((err = snd_gcn_new_pcm(gcn_audio)) < 0) - goto fail; + return retval; +} - if ((err = snd_card_register(card)) == 0) { - ai_printk(KERN_INFO, "%s initialized\n", DRV_DESCRIPTION); +static int ai_do_remove(struct device *dev) +{ + struct snd_gcn *chip; + + chip = dev_get_drvdata(dev); + if (chip) { + ai_exit(chip); + dev_set_drvdata(dev, NULL); + snd_card_free(chip->card); return 0; } + return -ENODEV; +} - fail: - snd_card_free(card); - return err; +/* + * OF Platform device interfaces. + * + */ + +static int __init ai_of_probe(struct of_device *odev, + const struct of_device_id *match) +{ + struct resource dsp, ai; + int retval; + + retval = of_address_to_resource(odev->node, 0, &dsp); + if (retval) { + drv_printk(KERN_ERR, "no dsp io memory range found\n"); + return -ENODEV; + } + retval = of_address_to_resource(odev->node, 1, &ai); + if (retval) { + drv_printk(KERN_ERR, "no ai io memory range found\n"); + return -ENODEV; + } + + return ai_do_probe(&odev->dev, + &dsp, &ai, irq_of_parse_and_map(odev->node, 0)); } -static void __exit alsa_card_gcn_exit(void) +static int __exit ai_of_remove(struct of_device *odev) { - unsigned long flags; - DPRINTK("Goodbye, cruel world\n"); + return ai_do_remove(&odev->dev); +} - StopSample(); - /* disable interrupts */ - local_irq_save(flags); - out_be16(AI_DSP_CSR, in_be16(AI_DSP_CSR) & ~AI_CSR_AIDINTMASK); - local_irq_restore(flags); - - free_irq(DSP_IRQ, gcn_audio); - snd_card_free(gcn_audio->card); +static int ai_of_shutdown(struct of_device *odev) +{ + return ai_do_shutdown(&odev->dev); } -module_init(alsa_card_gcn_init); -module_exit(alsa_card_gcn_exit); + +static struct of_device_id ai_of_match[] = { + { .compatible = "nintendo,ai" }, + { }, +}; + +MODULE_DEVICE_TABLE(of, ai_of_match); + +static struct of_platform_driver ai_of_driver = { + .owner = THIS_MODULE, + .name = DRV_MODULE_NAME, + .match_table = ai_of_match, + .probe = ai_of_probe, + .remove = ai_of_remove, + .shutdown = ai_of_shutdown, +}; + +/* + * Module interfaces. + * + */ + +static int __init ai_init_module(void) +{ + drv_printk(KERN_INFO, "%s - version %s\n", DRV_DESCRIPTION, + ai_driver_version); + + return of_register_platform_driver(&ai_of_driver); +} + +static void __exit ai_exit_module(void) +{ + of_unregister_platform_driver(&ai_of_driver); +} + +module_init(ai_init_module); +module_exit(ai_exit_module); + +MODULE_DESCRIPTION(DRV_DESCRIPTION); +MODULE_AUTHOR(DRV_AUTHOR); +MODULE_LICENSE("GPL"); + |
From: Albert H. <he...@us...> - 2008-03-26 20:15:57
|
Update of /cvsroot/gc-linux/linux/drivers/net In directory sc8-pr-cvs2.sourceforge.net:/tmp/cvs-serv22420/drivers/net Modified Files: gcn-bba.c Log Message: Remove old ugecon driver (we use now usbgecko_udbg). Rewrite the following drivers as of_platform drivers using the device tree: - gcn-rsw - starlet-ipc - gcn-aram - rvl-mem2 - gcn-di - exi-driver, exi-hw - gcn-si - gcnfb (gcn-vifb) - gcn-ai Marked as broken gcn-mi and gcngx. Updated defconfigs. Index: gcn-bba.c =================================================================== RCS file: /cvsroot/gc-linux/linux/drivers/net/gcn-bba.c,v retrieving revision 1.12 retrieving revision 1.13 diff -u -d -r1.12 -r1.13 --- gcn-bba.c 24 Feb 2008 18:05:33 -0000 1.12 +++ gcn-bba.c 26 Mar 2008 20:15:20 -0000 1.13 @@ -1,7 +1,7 @@ /** * drivers/net/gcn-bba.c * - * Nintendo GameCube Broadband Adapter driver + * Nintendo GameCube Broadband Adapter (BBA) driver * Copyright (C) 2004-2008 The GameCube Linux Team * Copyright (C) 2005 Todd Jeffreys * Copyright (C) 2004,2005,2006,2007,2008 Albert Herranz @@ -40,7 +40,7 @@ #define DRV_MODULE_NAME "gcn-bba" -#define DRV_DESCRIPTION "Nintendo GameCube Broadband Adapter driver" +#define DRV_DESCRIPTION "Nintendo GameCube Broadband Adapter (BBA) driver" #define DRV_AUTHOR "Albert Herranz, " \ "Todd Jeffreys" |
From: Albert H. <he...@us...> - 2008-03-26 20:15:56
|
Update of /cvsroot/gc-linux/linux/drivers/input/si In directory sc8-pr-cvs2.sourceforge.net:/tmp/cvs-serv22420/drivers/input/si Modified Files: gcn-si.c Log Message: Remove old ugecon driver (we use now usbgecko_udbg). Rewrite the following drivers as of_platform drivers using the device tree: - gcn-rsw - starlet-ipc - gcn-aram - rvl-mem2 - gcn-di - exi-driver, exi-hw - gcn-si - gcnfb (gcn-vifb) - gcn-ai Marked as broken gcn-mi and gcngx. Updated defconfigs. Index: gcn-si.c =================================================================== RCS file: /cvsroot/gc-linux/linux/drivers/input/si/gcn-si.c,v retrieving revision 1.8 retrieving revision 1.9 diff -u -d -r1.8 -r1.9 --- gcn-si.c 4 Mar 2008 06:01:49 -0000 1.8 +++ gcn-si.c 26 Mar 2008 20:15:16 -0000 1.9 @@ -1,10 +1,10 @@ /* * drivers/input/gcn-si.c * - * Nintendo GameCube Serial Interface driver + * Nintendo GameCube/Wii Serial Interface (SI) driver. * Copyright (C) 2004-2008 The GameCube Linux Team * Copyright (C) 2004 Steven Looman - * Copyright (C) 2005 Albert Herranz + * Copyright (C) 2005,2008 Albert Herranz * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -15,27 +15,19 @@ /* #define SI_DEBUG */ -#include <linux/module.h> +#include <linux/delay.h> #include <linux/init.h> #include <linux/input.h> -#include <linux/ioport.h> +#include <linux/io.h> +#include <linux/kernel.h> +#include <linux/module.h> +#include <linux/of_platform.h> #include <linux/timer.h> -#include <linux/delay.h> - -#include <asm/io.h> - -#ifdef CONFIG_PPC_MERGE -#include <platforms/embedded6xx/gamecube.h> -#else -#include <platforms/gamecube.h> -#endif -#ifdef SI_DEBUG -# define DPRINTK(fmt, args...) \ - printk(KERN_ERR "%s: " fmt, __FUNCTION__ , ## args) -#else -# define DPRINTK(fmt, args...) -#endif +/* + * This keymap is for a datel adapter + normal US keyboard. + */ +#include "gcn-keymap.h" /* * Defining HACK_FORCE_KEYBOARD_PORT allows one to specify a port that @@ -46,37 +38,30 @@ #define DRV_MODULE_NAME "gcn-si" -#define DRV_DESCRIPTION "Nintendo GameCube Serial Interface driver" -#define DRV_AUTHOR "Steven Looman <st...@kr...>" +#define DRV_DESCRIPTION "Nintendo GameCube/Wii Serial Interface (SI) driver" +#define DRV_AUTHOR "Steven Looman <st...@kr...>, " \ + "Albert Herranz" -MODULE_DESCRIPTION(DRV_DESCRIPTION); -MODULE_AUTHOR(DRV_AUTHOR); -MODULE_LICENSE("GPL"); +static char si_driver_version[] = "1.0-isobel"; -#define PFX DRV_MODULE_NAME ": " -#define si_printk(level, format, arg...) \ - printk(level PFX format , ## arg) +#define drv_printk(level, format, arg...) \ + printk(level DRV_MODULE_NAME ": " format , ## arg) + +#define SI_MAX_PORTS 4 /* the four controller ports */ +#define SI_REFRESH_TIME HZ/100 /* polling interval */ /* - * This keymap is for a datel adapter + normal US keyboard. + * Hardware registers */ -#include "gcn-keymap.h" - - -#define SI_MAX_PORTS 4 - -#define REFRESH_TIME HZ/100 - -#define SI_BASE (GCN_IO2_BASE | 0x00006400) - -#define SICOUTBUF(x) ((void __iomem *)(SI_BASE + 0 + (x)*12)) -#define SICINBUFH(x) ((void __iomem *)(SI_BASE + 4 + (x)*12)) -#define SICINBUFL(x) ((void __iomem *)(SI_BASE + 8 + (x)*12)) +#define SI_PORT_SPACING 12 -#define SIPOLL ((void __iomem *)(SI_BASE + 0x30)) -#define SICOMCSR ((void __iomem *)(SI_BASE + 0x34)) -#define SISR ((void __iomem *)(SI_BASE + 0x38)) -#define SIEXILK ((void __iomem *)(SI_BASE + 0x3c)) +#define SICOUTBUF(i) (0x00 + (i)*SI_PORT_SPACING) +#define SICINBUFH(i) (0x04 + (i)*SI_PORT_SPACING) +#define SICINBUFL(i) (0x08 + (i)*SI_PORT_SPACING) +#define SIPOLL 0x30 +#define SICOMCSR 0x34 +#define SISR 0x38 +#define SIEXILK 0x3c #define ID_PAD 0x0900 #define ID_KEYBOARD 0x0820 @@ -97,233 +82,233 @@ #define PAD_LEFT (1 << 16) -static struct resource gcn_si_resources = { - .start = SI_BASE, - .end = SI_BASE + 0x0100, - .name = DRV_MODULE_NAME, - .flags = IORESOURCE_MEM | IORESOURCE_BUSY +struct si_keyboard_status { + unsigned char old[3]; }; -typedef struct { - unsigned char old[3]; -} keyboard_status; +enum si_control_type { + CTL_PAD, + CTL_KEYBOARD, + CTL_UNKNOWN +}; -typedef enum {CTL_PAD,CTL_KEYBOARD,CTL_UNKNOWN} control_type; +struct si_drvdata; -struct si_device { - control_type id; - int si_id; +struct si_port { + unsigned int index; + struct si_drvdata *drvdata; + + u32 id; /* SI id */ + + enum si_control_type type; unsigned int raw[2]; struct input_dev *idev; struct timer_list timer; + char name[32]; union { - keyboard_status keyboard; + struct si_keyboard_status keyboard; }; - char name[32]; }; -static struct si_device port[SI_MAX_PORTS]; +struct si_drvdata { + struct si_port ports[SI_MAX_PORTS]; + + void __iomem *io_base; + + struct device *dev; +}; #ifdef HACK_FORCE_KEYBOARD_PORT -static int gcn_si_force_keyboard_port = -1; +static int si_force_keyboard_port = -1; #ifdef MODULE -module_param_named(force_keyboard_port, gcn_si_force_keyboard_port, int, 0644); +module_psi_named(force_keyboard_port, si_force_keyboard_port, int, 0644); MODULE_PARM_DESC(force_keyboard_port, "port n becomes a keyboard port if" " automatic identification fails"); #else -static int __init gcn_si_force_keyboard_port_setup(char *line) +static int __init si_force_keyboard_port_setup(char *line) { - if (sscanf(line, "%d", &gcn_si_force_keyboard_port) != 1) { - gcn_si_force_keyboard_port = -1; + if (sscanf(line, "%d", &si_force_keyboard_port) != 1) { + si_force_keyboard_port = -1; } return 1; } -__setup("force_keyboard_port=", gcn_si_force_keyboard_port_setup); +__setup("force_keyboard_port=", si_force_keyboard_port_setup); #endif /* MODULE */ #endif /* HACK_FORCE_KEYBOARD_PORT */ -/** + +/* + * Hardware. * */ -static void gcn_si_reset(void) + +static void si_reset(void __iomem *io_base) { int i; - /* clear si registers */ + /* clear all SI registers */ - /* SICOUTBUF */ for (i = 0; i < SI_MAX_PORTS; ++i) - out_be32(SICOUTBUF(i), 0); - - /* SICINBUFH */ + out_be32(io_base + SICOUTBUF(i), 0); for (i = 0; i < SI_MAX_PORTS; ++i) - out_be32(SICINBUFH(i), 0); - - /* SICINBUFL */ + out_be32(io_base + SICINBUFH(i), 0); for (i = 0; i < SI_MAX_PORTS; ++i) - out_be32(SICINBUFL(i), 0); - - out_be32(SIPOLL, 0); - out_be32(SICOMCSR, 0); - out_be32(SISR, 0); - - out_be32((void __iomem *)(SI_BASE + 0x80), 0); - out_be32((void __iomem *)(SI_BASE + 0x84), 0); - out_be32((void __iomem *)(SI_BASE + 0x88), 0); - out_be32((void __iomem *)(SI_BASE + 0x8c), 0); + out_be32(io_base + SICINBUFL(i), 0); + out_be32(io_base + SIPOLL, 0); + out_be32(io_base + SICOMCSR, 0); + out_be32(io_base + SISR, 0); - out_be32((void __iomem *)(SI_BASE + 0x90), 0); - out_be32((void __iomem *)(SI_BASE + 0x94), 0); - out_be32((void __iomem *)(SI_BASE + 0x98), 0); - out_be32((void __iomem *)(SI_BASE + 0x9c), 0); + /* these too... */ + out_be32(io_base + 0x80, 0); + out_be32(io_base + 0x84, 0); + out_be32(io_base + 0x88, 0); + out_be32(io_base + 0x8c, 0); + out_be32(io_base + 0x90, 0); + out_be32(io_base + 0x94, 0); + out_be32(io_base + 0x98, 0); + out_be32(io_base + 0x9c, 0); + out_be32(io_base + 0xa0, 0); + out_be32(io_base + 0xa4, 0); + out_be32(io_base + 0xa8, 0); + out_be32(io_base + 0xac, 0); +} - out_be32((void __iomem *)(SI_BASE + 0xa0), 0); - out_be32((void __iomem *)(SI_BASE + 0xa4), 0); - out_be32((void __iomem *)(SI_BASE + 0xa8), 0); - out_be32((void __iomem *)(SI_BASE + 0xac), 0); +static void si_set_rumbling(void __iomem *io_base, unsigned int index, + int rumble) +{ + out_be32(io_base + SICOUTBUF(index), 0x00400000 | (rumble)?1:0); + out_be32(io_base + SISR, 0x80000000); } -/** - * - */ -static void gcn_si_wait_transfer_done(void) +static void si_wait_transfer_done(void __iomem *io_base) { - unsigned long transfer_done; + unsigned long deadline = jiffies + 2*HZ; + int borked = 0; - do { - transfer_done = in_be32(SICOMCSR) & (1 << 31); - } while (!transfer_done); + while(!(in_be32(io_base + SICOMCSR) & (1 << 31)) && !borked) { + cpu_relax(); + borked = time_after(jiffies, deadline); + } - out_be32(SICOMCSR, in_be32(SICOMCSR) | (1 << 31)); /* ack IRQ */ + if (borked) { + drv_printk(KERN_ERR, "serial transfer took too long, " + "is your hardware ok?"); + } + + out_be32(io_base + SICOMCSR, + in_be32(io_base + SICOMCSR) | (1 << 31)); /* ack IRQ */ } -/** - * - */ -static unsigned long gcn_si_get_controller_id(int port) +static u32 si_get_controller_id(void __iomem *io_base, + unsigned int index) { - gcn_si_reset(); - - out_be32(SIPOLL, 0); - out_be32(SICOUTBUF(port), 0); - out_be32(SISR, 0x80000000); - out_be32(SICOMCSR, 0xd0010001 | port << 1); + out_be32(io_base + SICOUTBUF(index), 0); + out_be32(io_base + SIPOLL, 0); - gcn_si_wait_transfer_done(); + out_be32(io_base + SISR, 0x80000000); + out_be32(io_base + SICOMCSR, 0xd0010001 | index << 1); + si_wait_transfer_done(io_base); - return in_be32((void __iomem *)(SI_BASE + 0x80)); + return in_be32(io_base + 0x80) >> 16; } -/** - * - */ -static void gcn_si_set_polling(void) +static void si_setup_polling(struct si_drvdata *drvdata) { + void __iomem *io_base = drvdata->io_base; unsigned long pad_bits = 0; int i; for (i = 0; i < SI_MAX_PORTS; ++i) { - switch (port[i].id) { + switch (drvdata->ports[i].type) { case CTL_PAD: - out_be32(SICOUTBUF(i), 0x00400300); + out_be32(io_base + SICOUTBUF(i), 0x00400300); break; case CTL_KEYBOARD: - out_be32(SICOUTBUF(i), 0x00540000); + out_be32(io_base + SICOUTBUF(i), 0x00540000); break; default: continue; } pad_bits |= 1 << (7 - i); } + out_be32(io_base + SIPOLL, 0x00f70200 | pad_bits); - out_be32(SIPOLL, 0x00F70200 | pad_bits); - out_be32(SISR, 0x80000000); - out_be32(SICOMCSR, 0xC0010801); - - gcn_si_wait_transfer_done(); -} - -/** - * - */ -static void gcn_si_set_rumbling(int portno, int rumble) -{ - out_be32(SICOUTBUF(portno), 0x00400000 | (rumble)?1:0); - out_be32(SISR, 0x80000000); + out_be32(io_base + SISR, 0x80000000); + out_be32(io_base + SICOMCSR, 0xc0010801); + si_wait_transfer_done(io_base); } -/** - * - */ -static void gcn_si_timer(unsigned long portno) +static void si_timer(unsigned long data) { - struct si_device *sdev = &port[portno]; + struct si_port *port = (struct si_port *)data; + unsigned int index = port->index; + void __iomem *io_base = port->drvdata->io_base; unsigned long raw[2]; unsigned char key[3]; unsigned char oldkey; int i; - raw[0] = in_be32(SICINBUFH(portno)); - raw[1] = in_be32(SICINBUFL(portno)); + raw[0] = in_be32(io_base + SICINBUFH(index)); + raw[1] = in_be32(io_base + SICINBUFL(index)); - switch (sdev->id) { + switch (port->type) { case CTL_PAD: /* buttons */ - input_report_key(sdev->idev, BTN_A, raw[0] & PAD_A); - input_report_key(sdev->idev, BTN_B, raw[0] & PAD_B); - input_report_key(sdev->idev, BTN_X, raw[0] & PAD_X); - input_report_key(sdev->idev, BTN_Y, raw[0] & PAD_Y); - input_report_key(sdev->idev, BTN_Z, raw[0] & PAD_Z); - input_report_key(sdev->idev, BTN_TL, + input_report_key(port->idev, BTN_A, raw[0] & PAD_A); + input_report_key(port->idev, BTN_B, raw[0] & PAD_B); + input_report_key(port->idev, BTN_X, raw[0] & PAD_X); + input_report_key(port->idev, BTN_Y, raw[0] & PAD_Y); + input_report_key(port->idev, BTN_Z, raw[0] & PAD_Z); + input_report_key(port->idev, BTN_TL, raw[0] & PAD_LT); - input_report_key(sdev->idev, BTN_TR, + input_report_key(port->idev, BTN_TR, raw[0] & PAD_RT); - input_report_key(sdev->idev, BTN_START, + input_report_key(port->idev, BTN_START, raw[0] & PAD_START); - input_report_key(sdev->idev, BTN_0, raw[0] & PAD_UP); - input_report_key(sdev->idev, BTN_1, raw[0] & PAD_RIGHT); - input_report_key(sdev->idev, BTN_2, raw[0] & PAD_DOWN); - input_report_key(sdev->idev, BTN_3, raw[0] & PAD_LEFT); + input_report_key(port->idev, BTN_0, raw[0] & PAD_UP); + input_report_key(port->idev, BTN_1, raw[0] & PAD_RIGHT); + input_report_key(port->idev, BTN_2, raw[0] & PAD_DOWN); + input_report_key(port->idev, BTN_3, raw[0] & PAD_LEFT); /* axis */ /* a stick */ - input_report_abs(sdev->idev, ABS_X, + input_report_abs(port->idev, ABS_X, raw[0] >> 8 & 0xFF); - input_report_abs(sdev->idev, ABS_Y, + input_report_abs(port->idev, ABS_Y, 0xFF - (raw[0] >> 0 & 0xFF)); /* b pad */ if (raw[0] & PAD_RIGHT) - input_report_abs(sdev->idev, ABS_HAT0X, 1); + input_report_abs(port->idev, ABS_HAT0X, 1); else if (raw[0] & PAD_LEFT) - input_report_abs(sdev->idev, ABS_HAT0X, -1); + input_report_abs(port->idev, ABS_HAT0X, -1); else - input_report_abs(sdev->idev, ABS_HAT0X, 0); + input_report_abs(port->idev, ABS_HAT0X, 0); if (raw[0] & PAD_DOWN) - input_report_abs(sdev->idev, ABS_HAT0Y, 1); + input_report_abs(port->idev, ABS_HAT0Y, 1); else if (raw[0] & PAD_UP) - input_report_abs(sdev->idev, ABS_HAT0Y, -1); + input_report_abs(port->idev, ABS_HAT0Y, -1); else - input_report_abs(sdev->idev, ABS_HAT0Y, 0); + input_report_abs(port->idev, ABS_HAT0Y, 0); /* c stick */ - input_report_abs(sdev->idev, ABS_RX, + input_report_abs(port->idev, ABS_RX, raw[1] >> 24 & 0xFF); - input_report_abs(sdev->idev, ABS_RY, + input_report_abs(port->idev, ABS_RY, raw[1] >> 16 & 0xFF); /* triggers */ - input_report_abs(sdev->idev, ABS_BRAKE, + input_report_abs(port->idev, ABS_BRAKE, raw[1] >> 8 & 0xFF); - input_report_abs(sdev->idev, ABS_GAS, + input_report_abs(port->idev, ABS_GAS, raw[1] >> 0 & 0xFF); break; @@ -336,19 +321,19 @@ /* check if anything was released */ for (i = 0; i < 3; ++i) { - oldkey = sdev->keyboard.old[i]; + oldkey = port->keyboard.old[i]; if (oldkey != key[0] && oldkey != key[1] && oldkey != key[2]) - input_report_key(sdev->idev, + input_report_key(port->idev, gamecube_keymap[oldkey], 0); } /* report keys */ for (i = 0; i < 3; ++i) { if (key[i]) - input_report_key(sdev->idev, + input_report_key(port->idev, gamecube_keymap[key[i]], 1); - sdev->keyboard.old[i] = key[i]; + port->keyboard.old[i] = key[i]; } break; @@ -356,63 +341,56 @@ break; } - input_sync(sdev->idev); + input_sync(port->idev); - mod_timer(&sdev->timer, jiffies + REFRESH_TIME); + mod_timer(&port->timer, jiffies + SI_REFRESH_TIME); } -/** +/* + * Input driver hooks. * */ -static int gcn_si_open(struct input_dev *idev) + +static int si_open(struct input_dev *idev) { - int portno = (int)idev->private; - struct si_device *sdev = &port[portno]; + struct si_port *port = input_get_drvdata(idev); - init_timer(&sdev->timer); - sdev->timer.function = gcn_si_timer; - sdev->timer.data = (int)idev->private; - sdev->timer.expires = jiffies + REFRESH_TIME; - add_timer(&sdev->timer); + init_timer(&port->timer); + port->timer.function = si_timer; + port->timer.data = (unsigned long)port; + port->timer.expires = jiffies + SI_REFRESH_TIME; + add_timer(&port->timer); return 0; } -/** - * - */ -static void gcn_si_close(struct input_dev *idev) +static void si_close(struct input_dev *idev) { - int portno = (int)idev->private; - struct si_device *sdev = &port[portno]; + struct si_port *port = input_get_drvdata(idev); - del_timer(&sdev->timer); + del_timer(&port->timer); } -/** - * - */ -static int gcn_si_event(struct input_dev *dev, unsigned int type, - unsigned int code, int value) +static int si_event(struct input_dev *idev, unsigned int type, + unsigned int code, int value) { - int portno = (int)dev->private; + struct si_port *port = input_get_drvdata(idev); + unsigned int index = port->index; + void __iomem *io_base = port->drvdata->io_base; if (type == EV_FF) { if (code == FF_RUMBLE) { - gcn_si_set_rumbling(portno, value); + si_set_rumbling(io_base, index, value); } } return value; } -/** - * - */ static int si_setup_pad(struct input_dev *idev) { struct ff_device *ff; - int error; + int retval; set_bit(EV_KEY, idev->evbit); set_bit(EV_ABS, idev->evbit); @@ -481,17 +459,14 @@ /* rumbling */ set_bit(EV_FF, idev->evbit); set_bit(FF_RUMBLE, idev->ffbit); - error = input_ff_create(idev, 1); - if (error) - return error; + retval = input_ff_create(idev, 1); + if (retval) + return retval; ff = idev->ff; - idev->event = gcn_si_event; + idev->event = si_event; return 0; } -/** - * - */ static void si_setup_keyboard(struct input_dev *idev) { int i; @@ -503,141 +478,242 @@ set_bit(gamecube_keymap[i], idev->keybit); } -/** - * - */ -static int si_setup_device(struct si_device *sdev, int idx) +static int si_port_probe(struct si_port *port) { + unsigned int index = port->index; + void __iomem *io_base = port->drvdata->io_base; struct input_dev *idev; - int result = 0; - - memset(sdev, 0, sizeof(*sdev)); + int retval = 0; - /* probe port */ - sdev->si_id = gcn_si_get_controller_id(idx) >> 16; + si_reset(io_base); - /* convert si_id to id */ - if (sdev->si_id == ID_PAD) { - sdev->id = CTL_PAD; - strcpy(sdev->name, "standard pad"); - } else if (sdev->si_id & ID_WIRELESS_BIT) { - sdev->id = CTL_PAD; - strcpy(sdev->name,(sdev->si_id & ID_WAVEBIRD_BIT) ? + /* + * Determine input device type from SI id. + */ + port->id = si_get_controller_id(io_base, index); + if (port->id == ID_PAD) { + port->type = CTL_PAD; + strcpy(port->name, "standard pad"); + } else if (port->id & ID_WIRELESS_BIT) { + /* wireless pad */ + port->type = CTL_PAD; + strcpy(port->name,(port->id & ID_WAVEBIRD_BIT) ? "Nintendo Wavebird" : "wireless pad"); - } else if (sdev->si_id == ID_KEYBOARD) { - sdev->id = CTL_KEYBOARD; - strcpy(sdev->name, "keyboard"); + } else if (port->id == ID_KEYBOARD) { + port->type = CTL_KEYBOARD; + strcpy(port->name, "keyboard"); } else { - sdev->id = CTL_UNKNOWN; - if (sdev->si_id) { - sprintf(sdev->name, "unknown (%x)", - sdev->si_id); + port->type = CTL_UNKNOWN; + if (port->id) { + sprintf(port->name, "unknown (%x)", + port->id); #ifdef HACK_FORCE_KEYBOARD_PORT - if (idx+1 == gcn_si_force_keyboard_port) { - si_printk(KERN_WARNING, + if (index+1 == si_force_keyboard_port) { + drv_printk(KERN_WARNING, "port %d forced to keyboard mode\n", - idx+1); - sdev->si_id = ID_KEYBOARD; - sdev->id = CTL_KEYBOARD; - strcpy(sdev->name, "keyboard (forced)"); + index+1); + port->id = ID_KEYBOARD; + port->type = CTL_KEYBOARD; + strcpy(port->name, "keyboard (forced)"); } #endif /* HACK_FORCE_KEYBOARD_PORT */ } else { - strcpy(sdev->name, "Not Present"); + strcpy(port->name, "not present"); } } - if (sdev->id == CTL_UNKNOWN) { - result = -ENODEV; + if (port->type == CTL_UNKNOWN) { + retval = -ENODEV; goto done; } idev = input_allocate_device(); if (!idev) { - si_printk(KERN_ERR, "not enough memory for input device\n"); - result = -ENOMEM; + drv_printk(KERN_ERR, "failed to allocate input_dev\n"); + retval = -ENOMEM; goto done; } - idev->open = gcn_si_open; - idev->close = gcn_si_close; - idev->private = (unsigned int *)idx; - idev->name = sdev->name; + idev->open = si_open; + idev->close = si_close; + idev->name = port->name; - switch (sdev->id) { + switch (port->type) { case CTL_PAD: - result = si_setup_pad(idev); + retval = si_setup_pad(idev); break; case CTL_KEYBOARD: si_setup_keyboard(idev); break; default: - /* this is here to avoid compiler warnings */ break; } - if (result) { + if (retval) { input_free_device(idev); goto done; } - sdev->idev = idev; + input_set_drvdata(idev, port); + port->idev = idev; done: - return result; + return retval; } -/** +/* + * Setup routines. * */ -static int __init gcn_si_init(void) + +static int si_init(struct si_drvdata *drvdata, struct resource *mem) { - struct si_device *sdev; - int idx; - int result; + struct si_port *port; + int index; + int retval; - si_printk(KERN_INFO, "%s\n", DRV_DESCRIPTION); + drvdata->io_base = ioremap(mem->start, mem->end - mem->start + 1); - if (request_resource(&iomem_resource, &gcn_si_resources) < 0) { - printk(KERN_WARNING PFX "resource busy\n"); - return -EBUSY; - } + for (index = 0; index < SI_MAX_PORTS; ++index) { + port = &drvdata->ports[index]; - for (idx = 0; idx < SI_MAX_PORTS; ++idx) { - sdev = &port[idx]; + memset(port, 0, sizeof(*port)); + port->index = index; + port->drvdata = drvdata; - result = si_setup_device(sdev, idx); - if (!result) - input_register_device(sdev->idev); + retval = si_port_probe(port); + if (!retval) + input_register_device(port->idev); - si_printk(KERN_INFO, "Port %d: %s\n", idx+1, sdev->name); + drv_printk(KERN_INFO, "port %d: %s\n", index+1, port->name); } - gcn_si_set_polling(); + si_setup_polling(drvdata); return 0; } -/** +static void si_exit(struct si_drvdata *drvdata) +{ + struct si_port *port; + int index; + + for (index = 0; index < SI_MAX_PORTS; ++index) { + port = &drvdata->ports[index]; + if (port->idev) + input_unregister_device(port->idev); + } + + if (drvdata->io_base) { + iounmap(drvdata->io_base); + drvdata->io_base = NULL; + } +} + +/* + * Driver model helper routines. * */ -static void __exit gcn_si_exit(void) + +static int si_do_probe(struct device *dev, struct resource *mem) { - struct si_device *sdev; - int idx; + struct si_drvdata *drvdata; + int retval; - si_printk(KERN_INFO, "exit\n"); + drvdata = kzalloc(sizeof(*drvdata), GFP_KERNEL); + if (!drvdata) { + drv_printk(KERN_ERR, "failed to allocate si_drvdata\n"); + return -ENOMEM; + } + dev_set_drvdata(dev, drvdata); + drvdata->dev = dev; - for (idx = 0; idx < SI_MAX_PORTS; ++idx) { - sdev = &port[idx]; - if (sdev->idev) - input_unregister_device(sdev->idev); - } + retval = si_init(drvdata, mem); + if (retval) { + dev_set_drvdata(dev, NULL); + kfree(drvdata); + } + return retval; +} - release_resource(&gcn_si_resources); +static int si_do_remove(struct device *dev) +{ + struct si_drvdata *drvdata = dev_get_drvdata(dev); + + if (drvdata) { + si_exit(drvdata); + dev_set_drvdata(dev, NULL); + kfree(drvdata); + return 0; + } + return -ENODEV; } -module_init(gcn_si_init); -module_exit(gcn_si_exit); +/* + * OF platform driver hooks. + * + */ + +static int __init si_of_probe(struct of_device *odev, + const struct of_device_id *match) +{ + struct resource mem; + int retval; + + retval = of_address_to_resource(odev->node, 0, &mem); + if (retval) { + drv_printk(KERN_ERR, "no io memory range found\n"); + return -ENODEV; + } + + return si_do_probe(&odev->dev, &mem); +} + +static int __exit si_of_remove(struct of_device *odev) +{ + return si_do_remove(&odev->dev); +} + +static struct of_device_id si_of_match[] = { + { .compatible = "nintendo,si" }, + { }, +}; + + +MODULE_DEVICE_TABLE(of, si_of_match); + +static struct of_platform_driver si_of_driver = { + .owner = THIS_MODULE, + .name = DRV_MODULE_NAME, + .match_table = si_of_match, + .probe = si_of_probe, + .remove = si_of_remove, +}; + + +/* + * Module interface hooks. + * + */ + +static int __init si_init_module(void) +{ + drv_printk(KERN_INFO, "%s - version %s\n", DRV_DESCRIPTION, + si_driver_version); + + return of_register_platform_driver(&si_of_driver); +} + +static void __exit si_exit_module(void) +{ + of_unregister_platform_driver(&si_of_driver); +} + +module_init(si_init_module); +module_exit(si_exit_module); + +MODULE_DESCRIPTION(DRV_DESCRIPTION); +MODULE_AUTHOR(DRV_AUTHOR); +MODULE_LICENSE("GPL"); |
From: Albert H. <he...@us...> - 2008-03-26 20:15:56
|
Update of /cvsroot/gc-linux/linux/include/linux In directory sc8-pr-cvs2.sourceforge.net:/tmp/cvs-serv22420/include/linux Modified Files: fb.h Log Message: Remove old ugecon driver (we use now usbgecko_udbg). Rewrite the following drivers as of_platform drivers using the device tree: - gcn-rsw - starlet-ipc - gcn-aram - rvl-mem2 - gcn-di - exi-driver, exi-hw - gcn-si - gcnfb (gcn-vifb) - gcn-ai Marked as broken gcn-mi and gcngx. Updated defconfigs. Index: fb.h =================================================================== RCS file: /cvsroot/gc-linux/linux/include/linux/fb.h,v retrieving revision 1.27 retrieving revision 1.28 diff -u -d -r1.27 -r1.28 --- fb.h 24 Feb 2008 18:05:34 -0000 1.27 +++ fb.h 26 Mar 2008 20:15:23 -0000 1.28 @@ -889,8 +889,8 @@ #ifndef CONFIG_FB_GAMECUBE /* XXX Why? O' why? */ # define fb_writel __raw_writel #else - extern unsigned int gcnfb_writel(unsigned int, void *); -# define fb_writel(b,addr) gcnfb_writel(b,addr) + extern unsigned int vifb_writel(unsigned int, void *); +# define fb_writel(b,addr) vifb_writel(b,addr) # define fb_writel_real(b,addr) /* __raw_writel */ (*(volatile u32 __iomem *) (addr) = (b)) #endif #define fb_writeq __raw_writeq |
From: Albert H. <he...@us...> - 2008-03-26 20:15:56
|
Update of /cvsroot/gc-linux/linux/drivers/misc In directory sc8-pr-cvs2.sourceforge.net:/tmp/cvs-serv22420/drivers/misc Modified Files: gcn-mi.c Log Message: Remove old ugecon driver (we use now usbgecko_udbg). Rewrite the following drivers as of_platform drivers using the device tree: - gcn-rsw - starlet-ipc - gcn-aram - rvl-mem2 - gcn-di - exi-driver, exi-hw - gcn-si - gcnfb (gcn-vifb) - gcn-ai Marked as broken gcn-mi and gcngx. Updated defconfigs. Index: gcn-mi.c =================================================================== RCS file: /cvsroot/gc-linux/linux/drivers/misc/gcn-mi.c,v retrieving revision 1.7 retrieving revision 1.8 diff -u -d -r1.7 -r1.8 --- gcn-mi.c 4 Mar 2008 06:20:56 -0000 1.7 +++ gcn-mi.c 26 Mar 2008 20:15:20 -0000 1.8 @@ -1,9 +1,9 @@ /* * drivers/misc/gcn-mi.c * - * Nintendo GameCube Memory Interface driver - * Copyright (C) 2004-2007 The GameCube Linux Team - * Copyright (C) 2004,2005,2007 Albert Herranz + * Nintendo GameCube Memory Interface (MI) driver. + * Copyright (C) 2004-2008 The GameCube Linux Team + * Copyright (C) 2004,2005,2007,2008 Albert Herranz * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -12,10 +12,10 @@ * */ +#include <linux/device.h> +#include <linux/init.h> #include <linux/kernel.h> #include <linux/module.h> -#include <linux/init.h> -#include <linux/device.h> #include <linux/platform_device.h> #include <linux/ioport.h> #include <linux/interrupt.h> |
From: Albert H. <he...@us...> - 2008-03-26 20:15:56
|
Update of /cvsroot/gc-linux/linux/include/asm-powerpc In directory sc8-pr-cvs2.sourceforge.net:/tmp/cvs-serv22420/include/asm-powerpc Modified Files: starlet.h Log Message: Remove old ugecon driver (we use now usbgecko_udbg). Rewrite the following drivers as of_platform drivers using the device tree: - gcn-rsw - starlet-ipc - gcn-aram - rvl-mem2 - gcn-di - exi-driver, exi-hw - gcn-si - gcnfb (gcn-vifb) - gcn-ai Marked as broken gcn-mi and gcngx. Updated defconfigs. Index: starlet.h =================================================================== RCS file: /cvsroot/gc-linux/linux/include/asm-powerpc/starlet.h,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- starlet.h 18 Mar 2008 18:57:18 -0000 1.1 +++ starlet.h 26 Mar 2008 20:15:23 -0000 1.2 @@ -25,9 +25,11 @@ #define STARLET_IPC_DMA_ALIGN 0x1f /* 32 bytes */ struct starlet_ipc_device { - void __iomem *io_base; unsigned long flags; + void __iomem *io_base; + int irq; + struct dma_pool *dma_pool; spinlock_t list_lock; @@ -36,21 +38,19 @@ struct list_head pending_list; unsigned long nr_pending; - struct platform_device pdev; -}; + struct device *dev; -#define to_ipc_dev(n) container_of(n,struct starlet_ipc_device,pdev) +}; /* from starlet-ipc.c */ extern struct starlet_ipc_device *starlet_ipc_get_device(void); - extern int starlet_ios_open(const char *pathname, int flags); extern int starlet_ios_close(int fd); extern int starlet_ios_ioctl(int fd, int request, - dma_addr_t ibuf, size_t ilen, - dma_addr_t obuf, size_t olen); + void *ibuf, size_t ilen, + void *obuf, size_t olen); /* from starlet-stm.c */ |
From: Albert H. <he...@us...> - 2008-03-26 20:15:54
|
Update of /cvsroot/gc-linux/linux/drivers/block In directory sc8-pr-cvs2.sourceforge.net:/tmp/cvs-serv22420/drivers/block Modified Files: gcn-aram.c gcn-sd.c rvl-mem2.c Log Message: Remove old ugecon driver (we use now usbgecko_udbg). Rewrite the following drivers as of_platform drivers using the device tree: - gcn-rsw - starlet-ipc - gcn-aram - rvl-mem2 - gcn-di - exi-driver, exi-hw - gcn-si - gcnfb (gcn-vifb) - gcn-ai Marked as broken gcn-mi and gcngx. Updated defconfigs. Index: rvl-mem2.c =================================================================== RCS file: /cvsroot/gc-linux/linux/drivers/block/rvl-mem2.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- rvl-mem2.c 18 Mar 2008 18:57:18 -0000 1.2 +++ rvl-mem2.c 26 Mar 2008 20:15:08 -0000 1.3 @@ -5,7 +5,7 @@ * Copyright (C) 2008 The GameCube Linux Team * Copyright (C) 2008 Albert Herranz * - * Based on gcn-aram.c. + * Based on gcn-mem2.c. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -16,7 +16,7 @@ #include <linux/module.h> #include <linux/major.h> -#include <linux/platform_device.h> +#include <linux/of_platform.h> #include <linux/blkdev.h> #include <linux/fcntl.h> /* O_ACCMODE */ #include <linux/hdreg.h> /* HDIO_GETGEO */ @@ -27,25 +27,11 @@ #define DRV_DESCRIPTION "Nintendo Wii MEM2 block driver" #define DRV_AUTHOR "Albert Herranz" -static char mem2_driver_version[] = "0.1"; +static char mem2_driver_version[] = "0.1-isobel"; -#define mem2_printk(level, format, arg...) \ +#define drv_printk(level, format, arg...) \ printk(level DRV_MODULE_NAME ": " format , ## arg) -#ifdef MEM2_DEBUG -# define DBG(fmt, args...) \ - printk(KERN_ERR "%s: " fmt, __FUNCTION__ , ## args) -#else -# define DBG(fmt, args...) -#endif - -/* - * Hardware. - */ - -#define MEM2_START 0x10000000 -#define MEM2_SIZE (52*1024*1024) /* 52MB */ -#define MEM2_END (MEM2_START + MEM2_SIZE - 1) /* * Driver settings @@ -56,10 +42,11 @@ #define MEM2_SECTOR_SIZE PAGE_SIZE -struct mem2_device { +struct mem2_drvdata { spinlock_t lock; void __iomem *io_base; + size_t size; struct block_device_operations fops; struct gendisk *disk; @@ -67,13 +54,9 @@ int ref_count; - struct platform_device pdev; /* must be last member */ + struct device *dev; }; - -/* get the mem2 device given the platform device of a mem2 device */ -#define to_mem2_device(n) container_of(n,struct mem2_device,pdev) - /* * */ @@ -83,7 +66,7 @@ */ static void mem2_do_request(struct request_queue *q) { - struct mem2_device *adev = q->queuedata; + struct mem2_drvdata *drvdata = q->queuedata; struct request *req; unsigned long mem2_addr; size_t len; @@ -97,8 +80,8 @@ len = req->current_nr_sectors << 9; /* give up if the request goes out of bounds */ - if (mem2_addr + len > MEM2_SIZE) { - mem2_printk(KERN_ERR, "bad access: block=%lu," + if (mem2_addr + len > drvdata->size) { + drv_printk(KERN_ERR, "bad access: block=%lu," " size=%u\n", (unsigned long)req->sector, len); uptodate = 0; @@ -106,10 +89,10 @@ switch(rq_data_dir(req)) { case READ: memcpy(req->buffer, - adev->io_base + mem2_addr, len); + drvdata->io_base + mem2_addr, len); break; case WRITE: - memcpy(adev->io_base + mem2_addr, + memcpy(drvdata->io_base + mem2_addr, req->buffer, len); break; } @@ -128,11 +111,11 @@ */ static int mem2_open(struct inode *inode, struct file *filp) { - struct mem2_device *adev = inode->i_bdev->bd_disk->private_data; + struct mem2_drvdata *drvdata = inode->i_bdev->bd_disk->private_data; unsigned long flags; int retval = 0; - spin_lock_irqsave(&adev->lock, flags); + spin_lock_irqsave(&drvdata->lock, flags); /* only allow a minor of 0 to be opened */ if (iminor(inode)) { @@ -141,19 +124,19 @@ } /* honor exclusive open mode */ - if (adev->ref_count == -1 || - (adev->ref_count && (filp->f_flags & O_EXCL))) { + if (drvdata->ref_count == -1 || + (drvdata->ref_count && (filp->f_flags & O_EXCL))) { retval = -EBUSY; goto out; } if ((filp->f_flags & O_EXCL)) - adev->ref_count = -1; + drvdata->ref_count = -1; else - adev->ref_count++; + drvdata->ref_count++; out: - spin_unlock_irqrestore(&adev->lock, flags); + spin_unlock_irqrestore(&drvdata->lock, flags); return retval; } @@ -162,15 +145,15 @@ */ static int mem2_release(struct inode *inode, struct file *filp) { - struct mem2_device *adev = inode->i_bdev->bd_disk->private_data; + struct mem2_drvdata *drvdata = inode->i_bdev->bd_disk->private_data; unsigned long flags; - spin_lock_irqsave(&adev->lock, flags); - if (adev->ref_count > 0) - adev->ref_count--; + spin_lock_irqsave(&drvdata->lock, flags); + if (drvdata->ref_count > 0) + drvdata->ref_count--; else - adev->ref_count = 0; - spin_unlock_irqrestore(&adev->lock, flags); + drvdata->ref_count = 0; + spin_unlock_irqrestore(&drvdata->lock, flags); return 0; } @@ -178,9 +161,10 @@ /* * Minimal ioctl for the MEM2 device. */ -static int mem2_ioctl(struct inode *inode, struct file *file, +static int mem2_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg) { + struct mem2_drvdata *drvdata = inode->i_bdev->bd_disk->private_data; struct hd_geometry geo; switch (cmd) { @@ -199,7 +183,7 @@ geo.heads = 16; geo.sectors = 32; geo.start = 0; - geo.cylinders = MEM2_SIZE / (geo.heads * geo.sectors); + geo.cylinders = drvdata->size / (geo.heads * geo.sectors); if (copy_to_user((void __user*)arg,&geo,sizeof(geo))) return -EFAULT; return 0; @@ -220,29 +204,29 @@ /* * */ -static int mem2_init_blk_dev(struct mem2_device *adev) +static int mem2_init_blk_dev(struct mem2_drvdata *drvdata) { struct gendisk *disk; struct request_queue *queue; int retval; - adev->ref_count = 0; + drvdata->ref_count = 0; retval = register_blkdev(MEM2_MAJOR, MEM2_NAME); if (retval) goto err_register_blkdev; retval = -ENOMEM; - spin_lock_init(&adev->lock); - queue = blk_init_queue(mem2_do_request, &adev->lock); + spin_lock_init(&drvdata->lock); + queue = blk_init_queue(mem2_do_request, &drvdata->lock); if (!queue) goto err_blk_init_queue; blk_queue_hardsect_size(queue, MEM2_SECTOR_SIZE); blk_queue_max_phys_segments(queue, 1); blk_queue_max_hw_segments(queue, 1); - queue->queuedata = adev; - adev->queue = queue; + queue->queuedata = drvdata; + drvdata->queue = queue; disk = alloc_disk(1); if (!disk) @@ -252,18 +236,18 @@ disk->first_minor = 0; disk->fops = &mem2_fops; strcpy(disk->disk_name, MEM2_NAME); - disk->queue = adev->queue; - set_capacity(disk, MEM2_SIZE >> 9); - disk->private_data = adev; - adev->disk = disk; + disk->queue = drvdata->queue; + set_capacity(disk, drvdata->size >> 9); + disk->private_data = drvdata; + drvdata->disk = disk; - add_disk(adev->disk); + add_disk(drvdata->disk); retval = 0; goto out; err_alloc_disk: - blk_cleanup_queue(adev->queue); + blk_cleanup_queue(drvdata->queue); err_blk_init_queue: unregister_blkdev(MEM2_MAJOR, MEM2_NAME); err_register_blkdev: @@ -274,142 +258,152 @@ /* * */ -static void mem2_exit_blk_dev(struct mem2_device *adev) +static void mem2_exit_blk_dev(struct mem2_drvdata *drvdata) { - if (adev->disk) { - del_gendisk(adev->disk); - put_disk(adev->disk); + if (drvdata->disk) { + del_gendisk(drvdata->disk); + put_disk(drvdata->disk); } - if (adev->queue) - blk_cleanup_queue(adev->queue); + if (drvdata->queue) + blk_cleanup_queue(drvdata->queue); unregister_blkdev(MEM2_MAJOR, MEM2_NAME); } /* * */ -static int mem2_init(struct mem2_device *adev, struct resource *mem) +static int mem2_init(struct mem2_drvdata *drvdata, struct resource *mem) { - memset(adev, 0, sizeof(*adev) - sizeof(adev->pdev)); + int retval; + size_t size; - adev->io_base = ioremap(MEM2_START, MEM2_SIZE); - if (!adev->io_base) { - mem2_printk(KERN_ERR, "unable to ioremap MEM2\n"); + size = mem->end - mem->start + 1; + drvdata->size = size; + drvdata->io_base = ioremap(mem->start, size); + if (!drvdata->io_base) { + drv_printk(KERN_ERR, "failed to ioremap MEM2\n"); return -EIO; } - return mem2_init_blk_dev(adev); + retval = mem2_init_blk_dev(drvdata); + if (retval) { + iounmap(drvdata->io_base); + } + return retval; } /* * */ -static void mem2_exit(struct mem2_device *adev) +static void mem2_exit(struct mem2_drvdata *drvdata) { - if (adev->io_base) - iounmap(adev->io_base); - mem2_exit_blk_dev(adev); + if (drvdata->io_base) + iounmap(drvdata->io_base); + mem2_exit_blk_dev(drvdata); } /* - * Needed for platform devices. + * */ -static void mem2_dev_release(struct device *dev) +static int mem2_do_probe(struct device *dev, struct resource *mem) { -} - - -static struct resource mem2_resources[] = { - [0] = { - .start = MEM2_START, - .end = MEM2_END, - .flags = IORESOURCE_MEM, - }, -}; + struct mem2_drvdata *drvdata; + int retval; -static struct mem2_device mem2_device = { - .pdev = { - .name = MEM2_NAME, - .id = 0, - .num_resources = ARRAY_SIZE(mem2_resources), - .resource = mem2_resources, - .dev = { - .release = mem2_dev_release, - }, - }, -}; + drvdata = kzalloc(sizeof(*drvdata), GFP_KERNEL); + if (!drvdata) { + drv_printk(KERN_ERR, "failed to allocate mem2_drvdata\n"); + return -ENOMEM; + } + dev_set_drvdata(dev, drvdata); + drvdata->dev = dev; + retval = mem2_init(drvdata, mem); + if (retval) { + dev_set_drvdata(dev, NULL); + kfree(drvdata); + } + return retval; +} /* * */ -static int mem2_probe(struct device *device) +static int mem2_do_remove(struct device *dev) { - struct platform_device *pdev = to_platform_device(device); - struct mem2_device *adev = to_mem2_device(pdev); - struct resource *mem; - int retval; + struct mem2_drvdata *drvdata = dev_get_drvdata(dev); - retval = -ENODEV; - mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); - if (mem) { - retval = mem2_init(adev, mem); + if (drvdata) { + mem2_exit(drvdata); + dev_set_drvdata(dev, NULL); + return 0; } - return retval; + return -ENODEV; } /* - * + * Driver model probe function. */ -static int mem2_remove(struct device *device) +static int __init mem2_of_probe(struct of_device *odev, + const struct of_device_id *match) { - struct platform_device *pdev = to_platform_device(device); - struct mem2_device *adev = to_mem2_device(pdev); + struct resource res; + int retval; - mem2_exit(adev); + retval = of_address_to_resource(odev->node, 0, &res); + if (retval) { + drv_printk(KERN_ERR, "no memory range found\n"); + return -ENODEV; + } - return 0; + return mem2_do_probe(&odev->dev, &res); } +/* + * Driver model remove function. + */ +static int __exit mem2_of_remove(struct of_device *odev) +{ + return mem2_do_remove(&odev->dev); +} -static struct device_driver mem2_driver = { - .name = MEM2_NAME, - .bus = &platform_bus_type, - .probe = mem2_probe, - .remove = mem2_remove, +static struct of_device_id mem2_of_match[] = { + { .compatible = "nintendo,mem2" }, + { }, +}; + +MODULE_DEVICE_TABLE(of, mem2_of_match); + +static struct of_platform_driver mem2_of_driver = { + .owner = THIS_MODULE, + .name = DRV_MODULE_NAME, + .match_table = mem2_of_match, + .probe = mem2_of_probe, + .remove = mem2_of_remove, }; /* - * + * Module initialization function. */ static int __init mem2_init_module(void) { - int retval = 0; - - mem2_printk(KERN_INFO, "%s - version %s\n", DRV_DESCRIPTION, - mem2_driver_version); - - retval = driver_register(&mem2_driver); - if (!retval) { - retval = platform_device_register(&mem2_device.pdev); - } + drv_printk(KERN_INFO, "%s - version %s\n", DRV_DESCRIPTION, + mem2_driver_version); - return retval; + return of_register_platform_driver(&mem2_of_driver); } /* - * + * Module deinitialization funtion. */ static void __exit mem2_exit_module(void) { - platform_device_unregister(&mem2_device.pdev); - driver_unregister(&mem2_driver); + of_unregister_platform_driver(&mem2_of_driver); } module_init(mem2_init_module); module_exit(mem2_exit_module); - MODULE_DESCRIPTION(DRV_DESCRIPTION); MODULE_AUTHOR(DRV_AUTHOR); MODULE_LICENSE("GPL"); Index: gcn-sd.c =================================================================== RCS file: /cvsroot/gc-linux/linux/drivers/block/gcn-sd.c,v retrieving revision 1.12 retrieving revision 1.13 diff -u -d -r1.12 -r1.13 --- gcn-sd.c 4 Mar 2008 06:20:55 -0000 1.12 +++ gcn-sd.c 26 Mar 2008 20:15:08 -0000 1.13 @@ -73,7 +73,7 @@ #include <linux/exi.h> #define DRV_MODULE_NAME "gcn-sd" -#define DRV_DESCRIPTION "MMC/SD card block driver for the Nintendo GameCube" +#define DRV_DESCRIPTION "MMC/SD card block driver for the Nintendo GameCube/Wii" #define DRV_AUTHOR "Rob Reylink, " \ "Todd Jeffreys, " \ "Albert Herranz" @@ -501,9 +501,6 @@ /* */ static inline void spi_read(struct sd_host *host, void *data, size_t len) { -#ifdef CONFIG_GAMECUBE_WII - exi_dev_read(host->exi_device, data, len); -#else /* * Houston, we have a problem. * @@ -534,7 +531,6 @@ * */ exi_dev_transfer(host->exi_device, data, len, EXI_OP_READ, EXI_CMD_IDI); -#endif } /* cycles are expressed in 8 clock cycles */ Index: gcn-aram.c =================================================================== RCS file: /cvsroot/gc-linux/linux/drivers/block/gcn-aram.c,v retrieving revision 1.15 retrieving revision 1.16 diff -u -d -r1.15 -r1.16 --- gcn-aram.c 19 Nov 2007 17:46:53 -0000 1.15 +++ gcn-aram.c 26 Mar 2008 20:15:08 -0000 1.16 @@ -1,10 +1,10 @@ /* * drivers/block/gcn-aram.c * - * Nintendo GameCube Auxiliary RAM block driver - * Copyright (C) 2004-2007 The GameCube Linux Team + * Nintendo GameCube Auxiliary RAM (ARAM) block driver + * Copyright (C) 2004-2008 The GameCube Linux Team * Copyright (C) 2005 Todd Jeffreys <to...@vo...> - * Copyright (C) 2005,2007 Albert Herranz + * Copyright (C) 2005,2007,2008 Albert Herranz * * Based on previous work by Franz Lehner. * @@ -15,46 +15,33 @@ * */ -#include <linux/module.h> -#include <linux/major.h> -#include <linux/platform_device.h> #include <linux/blkdev.h> +#include <linux/dma-mapping.h> #include <linux/fcntl.h> /* O_ACCMODE */ #include <linux/hdreg.h> /* HDIO_GETGEO */ #include <linux/interrupt.h> -#include <linux/dma-mapping.h> +#include <linux/major.h> +#include <linux/module.h> +#include <linux/of_platform.h> #include <asm/io.h> #define DRV_MODULE_NAME "gcn-aram" -#define DRV_DESCRIPTION "Nintendo GameCube Auxiliary RAM block driver" +#define DRV_DESCRIPTION "Nintendo GameCube Auxiliary RAM (ARAM) block driver" #define DRV_AUTHOR "Todd Jeffreys <to...@vo...>, " \ "Albert Herranz" -static char aram_driver_version[] = "3.0"; +static char aram_driver_version[] = "4.0"; -#define aram_printk(level, format, arg...) \ +#define drv_printk(level, format, arg...) \ printk(level DRV_MODULE_NAME ": " format , ## arg) -#ifdef ARAM_DEBUG -# define DBG(fmt, args...) \ - printk(KERN_ERR "%s: " fmt, __FUNCTION__ , ## args) -#else -# define DBG(fmt, args...) -#endif /* * Hardware. */ -#define ARAM_IRQ 6 - #define ARAM_DMA_ALIGN 0x1f /* 32 bytes */ -#define DSP_BASE 0xcc005000 -#define DSP_SIZE 0x200 - -#define DSP_IO_BASE ((void __iomem *)DSP_BASE) - #define DSP_CSR 0x00a #define DSP_CSR_RES (1<<0) #define DSP_CSR_PIINT (1<<1) @@ -90,22 +77,22 @@ /* * Driver settings */ -#define ARAM_NAME "gcnaram" -#define ARAM_MAJOR Z2RAM_MAJOR +#define ARAM_NAME DRV_MODULE_NAME +#define ARAM_MAJOR Z2RAM_MAJOR /* we share the major */ #define ARAM_SECTOR_SIZE PAGE_SIZE -#define ARAM_SOUNDMEMORYOFFSET 0 -#define ARAM_BUFFERSIZE (16*1024*1024 - ARAM_SOUNDMEMORYOFFSET) - - +#define ARAM_BUFFERSIZE (16*1024*1024) -struct aram_device { +/* + * Driver data. + */ +struct aram_drvdata { spinlock_t lock; - int irq; - void __iomem *io_base; spinlock_t io_lock; + void __iomem *io_base; + int irq; struct block_device_operations fops; struct gendisk *disk; @@ -117,16 +104,10 @@ int ref_count; - struct platform_device pdev; /* must be last member */ + struct device *dev; }; -/* get the aram device given the platform device of an aram device */ -#define to_aram_device(n) container_of(n,struct aram_device,pdev) - -/* - * Converts a request direction into a DMA data direction. - */ static inline enum dma_data_direction rq_dir_to_dma_dir(struct request *req) { if (rq_data_dir(req) == READ) { @@ -136,9 +117,6 @@ } } -/* - * Converts a request direction into an ARAM data direction. - */ static inline int rq_dir_to_aram_dir(struct request *req) { if (rq_data_dir(req) == READ) { @@ -148,16 +126,12 @@ } } - -/* - * Starts an ARAM DMA transfer. - */ -static void aram_start_dma_transfer(struct aram_device *adev, +static void aram_start_dma_transfer(struct aram_drvdata *drvdata, unsigned long aram_addr) { - void __iomem *io_base = adev->io_base; - dma_addr_t dma_addr = adev->dma_addr; - size_t dma_len = adev->dma_len; + void __iomem *io_base = drvdata->io_base; + dma_addr_t dma_addr = drvdata->dma_addr; + size_t dma_len = drvdata->dma_len; /* DMA transfers require proper alignment */ BUG_ON((dma_addr & ARAM_DMA_ALIGN) != 0 || @@ -167,30 +141,28 @@ out_be32(io_base + AR_DMA_ARADDR, aram_addr); /* writing the low-word kicks off the DMA */ - out_be32(io_base + AR_DMA_CNT, rq_dir_to_aram_dir(adev->req) | dma_len); + out_be32(io_base + AR_DMA_CNT, + rq_dir_to_aram_dir(drvdata->req) | dma_len); } -/* - * Handles ARAM interrupts. - */ static irqreturn_t aram_irq_handler(int irq, void *dev0) { - struct aram_device *adev = dev0; + struct aram_drvdata *drvdata = dev0; struct request *req; - u16 __iomem *csr_reg = adev->io_base + DSP_CSR; + u16 __iomem *csr_reg = drvdata->io_base + DSP_CSR; u16 csr; unsigned long flags; - spin_lock_irqsave(&adev->io_lock, flags); + spin_lock_irqsave(&drvdata->io_lock, flags); csr = in_be16(csr_reg); /* * Do nothing if the interrupt is not targetted for us. - * (We share this interrupt with the sound driver). + * We share this interrupt with the sound driver. */ if (!(csr & DSP_CSR_ARINT)) { - spin_unlock_irqrestore(&adev->io_lock, flags); + spin_unlock_irqrestore(&drvdata->io_lock, flags); return IRQ_NONE; } @@ -199,34 +171,32 @@ out_be16(csr_reg, csr); /* pick up current request being serviced */ - req = adev->req; - adev->req = NULL; + req = drvdata->req; + drvdata->req = NULL; - spin_unlock_irqrestore(&adev->io_lock, flags); + spin_unlock_irqrestore(&drvdata->io_lock, flags); if (req) { if (!end_that_request_first(req, 1, req->current_nr_sectors)) { add_disk_randomness(req->rq_disk); end_that_request_last(req, 1); } - dma_unmap_single(&adev->pdev.dev, adev->dma_addr, adev->dma_len, + dma_unmap_single(drvdata->dev, + drvdata->dma_addr, drvdata->dma_len, rq_dir_to_dma_dir(req)); - spin_lock(&adev->lock); - blk_start_queue(adev->queue); - spin_unlock(&adev->lock); + spin_lock(&drvdata->lock); + blk_start_queue(drvdata->queue); + spin_unlock(&drvdata->lock); } else { - aram_printk(KERN_ERR, "ignoring interrupt, no request\n"); + drv_printk(KERN_ERR, "ignoring interrupt, no request\n"); } return IRQ_HANDLED; } -/* - * Performs block layer requests. - */ static void aram_do_request(struct request_queue *q) { - struct aram_device *adev = q->queuedata; + struct aram_drvdata *drvdata = q->queuedata; struct request *req; unsigned long aram_addr; size_t len; @@ -234,11 +204,11 @@ req = elv_next_request(q); while(req) { - spin_lock_irqsave(&adev->io_lock, flags); + spin_lock_irqsave(&drvdata->io_lock, flags); - /* we can schedule just a single request each time */ - if (adev->req) { - spin_unlock_irqrestore(&adev->io_lock, flags); + /* we schedule a single request each time */ + if (drvdata->req) { + spin_unlock_irqrestore(&drvdata->io_lock, flags); blk_stop_queue(q); break; } @@ -247,15 +217,15 @@ /* ignore requests that we can't handle */ if (!blk_fs_request(req)) { - spin_unlock_irqrestore(&adev->io_lock, flags); + spin_unlock_irqrestore(&drvdata->io_lock, flags); continue; } /* store the request being handled */ - adev->req = req; + drvdata->req = req; blk_stop_queue(q); - spin_unlock_irqrestore(&adev->io_lock, flags); + spin_unlock_irqrestore(&drvdata->io_lock, flags); /* calculate the ARAM address and length */ aram_addr = req->sector << 9; @@ -263,8 +233,8 @@ /* give up if the request goes out of bounds */ if (aram_addr + len > ARAM_BUFFERSIZE) { - aram_printk(KERN_ERR, "bad access: block=%lu," - " size=%u\n", (unsigned long)req->sector, + drv_printk(KERN_ERR, "bad access: block=%lu," + " size=%u\n", (unsigned long)req->sector, len); /* XXX correct? the request is already dequeued */ end_request(req, 0); @@ -274,27 +244,29 @@ BUG_ON(req->nr_phys_segments != 1); /* perform DMA mappings */ - adev->dma_len = len; - adev->dma_addr = dma_map_single(&adev->pdev.dev, req->buffer, - len, rq_dir_to_dma_dir(req)); + drvdata->dma_len = len; + drvdata->dma_addr = dma_map_single(drvdata->dev, + req->buffer, len, + rq_dir_to_dma_dir(req)); /* start the DMA transfer */ - aram_start_dma_transfer(adev, - ARAM_SOUNDMEMORYOFFSET + aram_addr); + aram_start_dma_transfer(drvdata, aram_addr); break; } } /* - * Opens the ARAM device. + * Block device hooks. + * */ + static int aram_open(struct inode *inode, struct file *filp) { - struct aram_device *adev = inode->i_bdev->bd_disk->private_data; + struct aram_drvdata *drvdata = inode->i_bdev->bd_disk->private_data; unsigned long flags; int retval = 0; - spin_lock_irqsave(&adev->lock, flags); + spin_lock_irqsave(&drvdata->lock, flags); /* only allow a minor of 0 to be opened */ if (iminor(inode)) { @@ -303,43 +275,37 @@ } /* honor exclusive open mode */ - if (adev->ref_count == -1 || - (adev->ref_count && (filp->f_flags & O_EXCL))) { + if (drvdata->ref_count == -1 || + (drvdata->ref_count && (filp->f_flags & O_EXCL))) { retval = -EBUSY; goto out; } if ((filp->f_flags & O_EXCL)) - adev->ref_count = -1; + drvdata->ref_count = -1; else - adev->ref_count++; + drvdata->ref_count++; out: - spin_unlock_irqrestore(&adev->lock, flags); + spin_unlock_irqrestore(&drvdata->lock, flags); return retval; } -/* - * Closes the ARAM device. - */ static int aram_release(struct inode *inode, struct file *filp) { - struct aram_device *adev = inode->i_bdev->bd_disk->private_data; + struct aram_drvdata *drvdata = inode->i_bdev->bd_disk->private_data; unsigned long flags; - spin_lock_irqsave(&adev->lock, flags); - if (adev->ref_count > 0) - adev->ref_count--; + spin_lock_irqsave(&drvdata->lock, flags); + if (drvdata->ref_count > 0) + drvdata->ref_count--; else - adev->ref_count = 0; - spin_unlock_irqrestore(&adev->lock, flags); + drvdata->ref_count = 0; + spin_unlock_irqrestore(&drvdata->lock, flags); return 0; } -/* - * Minimal ioctl for the ARAM device. - */ static int aram_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) { @@ -380,24 +346,26 @@ /* + * Setup routines. * */ -static int aram_init_blk_dev(struct aram_device *adev) + +static int aram_init_blk_dev(struct aram_drvdata *drvdata) { struct gendisk *disk; struct request_queue *queue; int retval; - adev->ref_count = 0; + drvdata->ref_count = 0; retval = register_blkdev(ARAM_MAJOR, ARAM_NAME); if (retval) goto err_register_blkdev; retval = -ENOMEM; - spin_lock_init(&adev->lock); - spin_lock_init(&adev->io_lock); - queue = blk_init_queue(aram_do_request, &adev->lock); + spin_lock_init(&drvdata->lock); + spin_lock_init(&drvdata->io_lock); + queue = blk_init_queue(aram_do_request, &drvdata->lock); if (!queue) goto err_blk_init_queue; @@ -405,8 +373,8 @@ blk_queue_dma_alignment(queue, ARAM_DMA_ALIGN); blk_queue_max_phys_segments(queue, 1); blk_queue_max_hw_segments(queue, 1); - queue->queuedata = adev; - adev->queue = queue; + queue->queuedata = drvdata; + drvdata->queue = queue; disk = alloc_disk(1); if (!disk) @@ -416,18 +384,18 @@ disk->first_minor = 0; disk->fops = &aram_fops; strcpy(disk->disk_name, ARAM_NAME); - disk->queue = adev->queue; + disk->queue = drvdata->queue; set_capacity(disk, ARAM_BUFFERSIZE >> 9); - disk->private_data = adev; - adev->disk = disk; + disk->private_data = drvdata; + drvdata->disk = disk; - add_disk(adev->disk); + add_disk(drvdata->disk); retval = 0; goto out; err_alloc_disk: - blk_cleanup_queue(adev->queue); + blk_cleanup_queue(drvdata->queue); err_blk_init_queue: unregister_blkdev(ARAM_MAJOR, ARAM_NAME); err_register_blkdev: @@ -435,238 +403,223 @@ return retval; } -/* - * - */ -static void aram_exit_blk_dev(struct aram_device *adev) +static void aram_exit_blk_dev(struct aram_drvdata *drvdata) { - if (adev->disk) { - del_gendisk(adev->disk); - put_disk(adev->disk); + if (drvdata->disk) { + del_gendisk(drvdata->disk); + put_disk(drvdata->disk); } - if (adev->queue) - blk_cleanup_queue(adev->queue); + if (drvdata->queue) + blk_cleanup_queue(drvdata->queue); unregister_blkdev(ARAM_MAJOR, ARAM_NAME); } -/* - * - */ -static void aram_quiesce(struct aram_device *adev) +static void aram_quiesce(struct aram_drvdata *drvdata) { - u16 __iomem *csr_reg = adev->io_base + DSP_CSR; + u16 __iomem *csr_reg = drvdata->io_base + DSP_CSR; u16 csr; unsigned long flags; /* * Disable ARAM interrupts, but do not accidentally ack non-ARAM ones. */ - spin_lock_irqsave(&adev->io_lock, flags); + spin_lock_irqsave(&drvdata->io_lock, flags); csr = in_be16(csr_reg); csr &= ~(DSP_CSR_AIDINT | DSP_CSR_DSPINT | DSP_CSR_ARINTMASK); out_be16(csr_reg, csr); - spin_unlock_irqrestore(&adev->io_lock, flags); + spin_unlock_irqrestore(&drvdata->io_lock, flags); /* wait until pending transfers are finished */ while(in_be16(csr_reg) & DSP_CSR_DSPDMA) cpu_relax(); } -/* - * - */ -static int aram_init_irq(struct aram_device *adev) +static int aram_init_irq(struct aram_drvdata *drvdata) { - u16 __iomem *csr_reg = adev->io_base + DSP_CSR; + u16 __iomem *csr_reg = drvdata->io_base + DSP_CSR; u16 csr; unsigned long flags; int retval; - /* request interrupt */ - retval = request_irq(adev->irq, aram_irq_handler, + retval = request_irq(drvdata->irq, aram_irq_handler, IRQF_DISABLED | IRQF_SHARED, - DRV_MODULE_NAME, adev); + DRV_MODULE_NAME, drvdata); if (retval) { - aram_printk(KERN_ERR, "request of irq%d failed\n", adev->irq); + drv_printk(KERN_ERR, "request of IRQ %d failed\n", + drvdata->irq); goto out; } /* * Enable ARAM interrupts, and route them to the processor. - * As in the other cases, preserve the AI and DSP interrupts. + * Make sure to preserve the AI and DSP interrupts. */ - spin_lock_irqsave(&adev->io_lock, flags); + spin_lock_irqsave(&drvdata->io_lock, flags); csr = in_be16(csr_reg); csr |= (DSP_CSR_ARINT | DSP_CSR_ARINTMASK | DSP_CSR_PIINT); csr &= ~(DSP_CSR_AIDINT | DSP_CSR_DSPINT); out_be16(csr_reg, csr); - spin_unlock_irqrestore(&adev->io_lock, flags); + spin_unlock_irqrestore(&drvdata->io_lock, flags); out: return retval; } -/* - * - */ -static void aram_exit_irq(struct aram_device *adev) +static void aram_exit_irq(struct aram_drvdata *drvdata) { - aram_quiesce(adev); + aram_quiesce(drvdata); - free_irq(adev->irq, adev); + free_irq(drvdata->irq, drvdata); } -/* - * - */ -static int aram_init(struct aram_device *adev, +static int aram_init(struct aram_drvdata *drvdata, struct resource *mem, int irq) { int retval; - memset(adev, 0, sizeof(*adev) - sizeof(adev->pdev)); - - adev->io_base = (void __iomem *)mem->start; - adev->irq = irq; + drvdata->io_base = ioremap(mem->start, mem->end - mem->start + 1); + drvdata->irq = irq; - retval = aram_init_blk_dev(adev); + retval = aram_init_blk_dev(drvdata); if (!retval) { - retval = aram_init_irq(adev); + retval = aram_init_irq(drvdata); if (retval) { - aram_exit_blk_dev(adev); + aram_exit_blk_dev(drvdata); } } return retval; } -/* - * - */ -static void aram_exit(struct aram_device *adev) +static void aram_exit(struct aram_drvdata *drvdata) { - aram_exit_blk_dev(adev); - aram_exit_irq(adev); + aram_exit_blk_dev(drvdata); + aram_exit_irq(drvdata); + if (drvdata->io_base) { + iounmap(drvdata->io_base); + drvdata->io_base = NULL; + } } /* - * Needed for platform devices. + * Driver model helper routines. + * */ -static void aram_dev_release(struct device *dev) + +static int aram_do_probe(struct device *dev, struct resource *mem, + int irq) { -} + struct aram_drvdata *drvdata; + int retval; + drvdata = kzalloc(sizeof(*drvdata), GFP_KERNEL); + if (!drvdata) { + drv_printk(KERN_ERR, "failed to allocate aram_drvdata\n"); + return -ENOMEM; + } + dev_set_drvdata(dev, drvdata); + drvdata->dev = dev; -static struct resource aram_resources[] = { - [0] = { - .start = DSP_BASE, - .end = DSP_BASE + DSP_SIZE -1, - .flags = IORESOURCE_MEM, - }, - [1] = { - .start = ARAM_IRQ, - .end = ARAM_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; + retval = aram_init(drvdata, mem, irq); + if (retval) { + dev_set_drvdata(dev, NULL); + kfree(drvdata); + } + return retval; +} -static struct aram_device aram_device = { - .pdev = { - .name = ARAM_NAME, - .id = 0, - .num_resources = ARRAY_SIZE(aram_resources), - .resource = aram_resources, - .dev = { - .release = aram_dev_release, - }, - }, -}; +static int aram_do_remove(struct device *dev) +{ + struct aram_drvdata *drvdata = dev_get_drvdata(dev); + if (drvdata) { + aram_exit(drvdata); + dev_set_drvdata(dev, NULL); + kfree(drvdata); + return 0; + } + return -ENODEV; +} -/* - * - */ -static int aram_probe(struct device *device) +static int aram_do_shutdown(struct device *dev) { - struct platform_device *pdev = to_platform_device(device); - struct aram_device *adev = to_aram_device(pdev); - struct resource *mem; - int irq; - int retval; + struct aram_drvdata *drvdata = dev_get_drvdata(dev); - retval = -ENODEV; - irq = platform_get_irq(pdev, 0); - mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); - if (mem) { - retval = aram_init(adev, mem, irq); - } - return retval; + if (drvdata) + aram_quiesce(drvdata); + return 0; } + /* + * OF platform device routines. * */ -static int aram_remove(struct device *device) + +static int __init aram_of_probe(struct of_device *odev, + const struct of_device_id *match) { - struct platform_device *pdev = to_platform_device(device); - struct aram_device *adev = to_aram_device(pdev); + struct resource res; + int retval; - aram_exit(adev); + retval = of_address_to_resource(odev->node, 0, &res); + if (retval) { + drv_printk(KERN_ERR, "no io memory range found\n"); + return -ENODEV; + } - return 0; + return aram_do_probe(&odev->dev, + &res, irq_of_parse_and_map(odev->node, 0)); } -/* - * - */ -static void aram_shutdown(struct device *device) +static int __exit aram_of_remove(struct of_device *odev) { - struct platform_device *pdev = to_platform_device(device); - struct aram_device *adev = to_aram_device(pdev); + return aram_do_remove(&odev->dev); +} - aram_quiesce(adev); +static int aram_of_shutdown(struct of_device *odev) +{ + return aram_do_shutdown(&odev->dev); } -static struct device_driver aram_driver = { - .name = ARAM_NAME, - .bus = &platform_bus_type, - .probe = aram_probe, - .remove = aram_remove, - .shutdown = aram_shutdown, +static struct of_device_id aram_of_match[] = { + { .compatible = "nintendo,aram" }, + { }, }; + +MODULE_DEVICE_TABLE(of, aram_of_match); + +static struct of_platform_driver aram_of_driver = { + .owner = THIS_MODULE, + .name = DRV_MODULE_NAME, + .match_table = aram_of_match, + .probe = aram_of_probe, + .remove = aram_of_remove, + .shutdown = aram_of_shutdown, +}; /* + * Module interfaces. * */ + static int __init aram_init_module(void) { - int retval = 0; - - aram_printk(KERN_INFO, "%s - version %s\n", DRV_DESCRIPTION, - aram_driver_version); - - retval = driver_register(&aram_driver); - if (!retval) { - retval = platform_device_register(&aram_device.pdev); - } + drv_printk(KERN_INFO, "%s - version %s\n", DRV_DESCRIPTION, + aram_driver_version); - return retval; + return of_register_platform_driver(&aram_of_driver); } -/* - * - */ static void __exit aram_exit_module(void) { - platform_device_unregister(&aram_device.pdev); - driver_unregister(&aram_driver); + of_unregister_platform_driver(&aram_of_driver); } module_init(aram_init_module); module_exit(aram_exit_module); - MODULE_DESCRIPTION(DRV_DESCRIPTION); MODULE_AUTHOR(DRV_AUTHOR); MODULE_LICENSE("GPL"); |
From: Albert H. <he...@us...> - 2008-03-26 20:15:53
|
Update of /cvsroot/gc-linux/linux/drivers/exi In directory sc8-pr-cvs2.sourceforge.net:/tmp/cvs-serv22420/drivers/exi Modified Files: exi-driver.c exi-hw.c exi-hw.h Log Message: Remove old ugecon driver (we use now usbgecko_udbg). Rewrite the following drivers as of_platform drivers using the device tree: - gcn-rsw - starlet-ipc - gcn-aram - rvl-mem2 - gcn-di - exi-driver, exi-hw - gcn-si - gcnfb (gcn-vifb) - gcn-ai Marked as broken gcn-mi and gcngx. Updated defconfigs. Index: exi-driver.c =================================================================== RCS file: /cvsroot/gc-linux/linux/drivers/exi/exi-driver.c,v retrieving revision 1.14 retrieving revision 1.15 diff -u -d -r1.14 -r1.15 --- exi-driver.c 24 Feb 2008 18:05:31 -0000 1.14 +++ exi-driver.c 26 Mar 2008 20:15:11 -0000 1.15 @@ -1,7 +1,7 @@ /* * drivers/exi/exi-driver.c * - * Nintendo GameCube Expansion Interface support. Driver model routines. + * Nintendo GameCube EXternal Interface (EXI) driver model routines. * Copyright (C) 2004-2008 The GameCube Linux Team * Copyright (C) 2004 Arthur Othieno <a.o...@bl...> * Copyright (C) 2004,2005 Todd Jeffreys <to...@vo...> @@ -14,20 +14,23 @@ * */ -#include <linux/module.h> -#include <linux/init.h> -#include <linux/device.h> -#include <linux/kthread.h> #include <linux/delay.h> #include <linux/exi.h> +#include <linux/init.h> +#include <linux/kthread.h> +#include <linux/module.h> +#include <linux/of_platform.h> #define DRV_MODULE_NAME "exi-driver" -#define DRV_DESCRIPTION "Nintendo GameCube EXpansion Interface driver" +#define DRV_DESCRIPTION "Nintendo GameCube EXternal Interface (EXI) driver" #define DRV_AUTHOR "Arthur Othieno <a.o...@bl...>, " \ "Todd Jeffreys <to...@vo...>, " \ "Albert Herranz" -static char exi_driver_version[] = "3.2-isobel"; +static char exi_driver_version[] = "4.0-isobel"; + +#define drv_printk(level, format, arg...) \ + printk(level DRV_MODULE_NAME ": " format , ## arg) struct exi_map_id_to_name { @@ -44,6 +47,7 @@ .name = "exi", .match = exi_bus_match, }; +EXPORT_SYMBOL(exi_bus_type); static struct device exi_bus_devices[EXI_MAX_CHANNELS] = { [0] = { @@ -67,7 +71,8 @@ static struct exi_map_id_to_name exi_map_id_to_name[] = { { .id = EXI_ID_NONE, .name = "(external card)" }, - { .id = 0xffff1698, .name = "Mask ROM/RTC/SRAM/UART" }, + { .id = 0xffff1698, .name = "GameCube Mask ROM/RTC/SRAM/UART" }, + { .id = 0xfffff308, .name = "Wii Mask ROM/RTC/SRAM/UART" }, { .id = 0x00000004, .name = "Memory Card 59" }, { .id = 0x00000008, .name = "Memory Card 123" }, { .id = 0x00000010, .name = "Memory Card 251" }, @@ -156,7 +161,7 @@ */ static void exi_bus_device_release(struct device *dev) { - exi_printk(KERN_WARNING, "exi_bus_device_release called!\n"); + drv_printk(KERN_WARNING, "exi_bus_device_release called!\n"); } static void exi_device_release(struct device *dev); @@ -211,7 +216,7 @@ get_device(&exi_device->dev); return exi_device; } - +EXPORT_SYMBOL(exi_device_get); /** * exi_device_put - Releases a use of the exi device @@ -224,6 +229,7 @@ if (exi_device) put_device(&exi_device->dev); } +EXPORT_SYMBOL(exi_device_put); /** * exi_get_exi_device - Returns a reference to an exi device @@ -236,6 +242,7 @@ // FIXME, maybe exi_device_get it too return &exi_devices[to_channel(exi_channel)][device]; } +EXPORT_SYMBOL(exi_get_exi_device); /* * Internal. Call device driver probe function on match. @@ -295,6 +302,7 @@ return driver_register(&driver->driver); } +EXPORT_SYMBOL(exi_driver_register); /** * exi_driver_unregister - unregister an EXI device driver. @@ -307,6 +315,7 @@ { driver_unregister(&driver->driver); } +EXPORT_SYMBOL(exi_driver_unregister); /* @@ -321,23 +330,23 @@ if (exi_device->eid.id != EXI_ID_INVALID) { /* device removed or changed */ - exi_printk(KERN_INFO, "about to remove [%s] id=0x%08x %s\n", + drv_printk(KERN_INFO, "about to remove [%s] id=0x%08x %s\n", exi_device->dev.bus_id, exi_device->eid.id, exi_name_id(exi_device->eid.id)); device_unregister(&exi_device->dev); - exi_printk(KERN_INFO, "remove completed\n"); + drv_printk(KERN_INFO, "remove completed\n"); exi_device->eid.id = EXI_ID_INVALID; } if (id != EXI_ID_INVALID) { /* a new device has been found */ - exi_printk(KERN_INFO, "about to add [%s] id=0x%08x %s\n", + drv_printk(KERN_INFO, "about to add [%s] id=0x%08x %s\n", exi_device->dev.bus_id, id, exi_name_id(id)); exi_device->eid.id = id; device_register(&exi_device->dev); - exi_printk(KERN_INFO, "add completed\n"); + drv_printk(KERN_INFO, "add completed\n"); } exi_update_ext_status(exi_get_exi_channel(exi_device)); @@ -412,19 +421,19 @@ extern void exi_channel_init(struct exi_channel *exi_channel, unsigned int channel); -static int __init exi_layer_init(void) +/* + * + */ +static int exi_init(struct resource *mem, unsigned int irq) { struct exi_channel *exi_channel; struct exi_device *exi_device; unsigned int channel, device; int retval; - exi_printk(KERN_INFO, "%s - version %s\n", DRV_DESCRIPTION, - exi_driver_version); - extern unsigned long exi_running; if (!test_and_set_bit(1, &exi_running)) { - retval = exi_hw_init(DRV_MODULE_NAME); + retval = exi_hw_init(DRV_MODULE_NAME, mem, irq); if (retval) goto err_hw_init; } @@ -457,7 +466,7 @@ init_waitqueue_head(&exi_bus_waitq); exi_bus_task = kthread_run(exi_bus_thread, NULL, "kexid"); if (IS_ERR(exi_bus_task)) { - exi_printk(KERN_WARNING, "failed to start exi kernel thread\n"); + drv_printk(KERN_WARNING, "failed to start exi kernel thread\n"); } return 0; @@ -467,20 +476,38 @@ while(--channel > 0) { device_unregister(&exi_bus_devices[channel]); } - exi_hw_exit(); + exi_hw_exit(mem, irq); err_hw_init: return retval; } -EXPORT_SYMBOL(exi_driver_register); -EXPORT_SYMBOL(exi_driver_unregister); -EXPORT_SYMBOL(exi_bus_type); +/* + * + */ +static int __init exi_layer_init(void) +{ + struct device_node *np; + struct resource res; + int retval; -EXPORT_SYMBOL(exi_get_exi_device); -EXPORT_SYMBOL(exi_device_get); -EXPORT_SYMBOL(exi_device_put); + drv_printk(KERN_INFO, "%s - version %s\n", DRV_DESCRIPTION, + exi_driver_version); + + np = of_find_compatible_node(NULL, NULL, "nintendo,exi"); + if (!np) + return -ENODEV; + retval = of_address_to_resource(np, 0, &res); + if (retval) { + drv_printk(KERN_ERR, "no io memory range found\n"); + return -ENOMEM; + } + retval = exi_init(&res, irq_of_parse_and_map(np, 0)); + of_node_put(np); + + return retval; +} postcore_initcall(exi_layer_init); MODULE_AUTHOR(DRV_AUTHOR); Index: exi-hw.h =================================================================== RCS file: /cvsroot/gc-linux/linux/drivers/exi/exi-hw.h,v retrieving revision 1.10 retrieving revision 1.11 diff -u -d -r1.10 -r1.11 --- exi-hw.h 4 Mar 2008 06:20:56 -0000 1.10 +++ exi-hw.h 26 Mar 2008 20:15:11 -0000 1.11 @@ -16,20 +16,11 @@ #ifndef __EXI_HW_H #define __EXI_HW_H +#include <linux/exi.h> #include <linux/interrupt.h> +#include <linux/resource.h> #include <asm/atomic.h> -#include <linux/exi.h> - -#ifdef CONFIG_PPC_MERGE -#include <platforms/embedded6xx/gamecube.h> -#else -#include <platforms/gamecube.h> -#endif - -#define exi_printk(level, format, arg...) \ - printk(level "exi: " format , ## arg) - #define EXI_MAX_CHANNELS 3 /* channels on the EXI bus */ #define EXI_DEVICES_PER_CHANNEL 3 /* number of devices per EXI channel */ @@ -51,17 +42,10 @@ #define EXI_IDI_MAX_SIZE 4 -#define EXI_IRQ 4 - #define EXI_DMA_ALIGN 0x1f /* 32 bytes */ -#define EXI_BASE (GCN_IO2_BASE+0x6800) -#define EXI_SIZE 0x40 - #define EXI_CHANNEL_SPACING 0x14 -#define EXI_IO_BASE(c) ((void __iomem *)(EXI_BASE + ((c)*EXI_CHANNEL_SPACING))) - #define EXI_CSR 0x00 #define EXI_CSR_EXIINTMASK (1<<0) #define EXI_CSR_EXIINT (1<<1) @@ -146,8 +130,8 @@ extern int exi_get_ext_line(struct exi_channel *exi_channel); extern void exi_update_ext_status(struct exi_channel *exi_channel); -extern int exi_hw_init(char *); -extern void exi_hw_exit(void); +extern int exi_hw_init(char *name, struct resource *mem, unsigned int irq); +extern void exi_hw_exit(struct resource *mem, unsigned int irq); #define exi_is_taken(x) ((x)->owner) Index: exi-hw.c =================================================================== RCS file: /cvsroot/gc-linux/linux/drivers/exi/exi-hw.c,v retrieving revision 1.17 retrieving revision 1.18 diff -u -d -r1.17 -r1.18 --- exi-hw.c 4 Mar 2008 06:20:56 -0000 1.17 +++ exi-hw.c 26 Mar 2008 20:15:11 -0000 1.18 @@ -70,6 +70,9 @@ #include "exi-hw.h" +#define drv_printk(level, format, arg...) \ + printk(level "exi: " format , ## arg) + #ifdef EXI_DEBUG # define DBG(fmt, args...) \ printk(KERN_ERR "%s: " fmt, __FUNCTION__ , ## args) @@ -77,13 +80,19 @@ # define DBG(fmt, args...) #endif + extern wait_queue_head_t exi_bus_waitq; static void exi_tasklet(unsigned long param); + /* for compatibility with the old exi-lite framework */ unsigned long exi_running = 0; +/* io memory base for EXI */ +static void __iomem *exi_io_mem; + + /* * These are the available exi channels. */ @@ -92,7 +101,6 @@ .channel = 0, .lock = SPIN_LOCK_UNLOCKED, .io_lock = SPIN_LOCK_UNLOCKED, - .io_base = EXI_IO_BASE(0), .wait_queue = __WAIT_QUEUE_HEAD_INITIALIZER( exi_channels[0].wait_queue), }, @@ -100,7 +108,6 @@ .channel = 1, .lock = SPIN_LOCK_UNLOCKED, .io_lock = SPIN_LOCK_UNLOCKED, - .io_base = EXI_IO_BASE(1), .wait_queue = __WAIT_QUEUE_HEAD_INITIALIZER( exi_channels[1].wait_queue), }, @@ -108,7 +115,6 @@ .channel = 2, .lock = SPIN_LOCK_UNLOCKED, .io_lock = SPIN_LOCK_UNLOCKED, - .io_base = EXI_IO_BASE(2), .wait_queue = __WAIT_QUEUE_HEAD_INITIALIZER( exi_channels[2].wait_queue), }, @@ -402,7 +408,7 @@ } if (borked) { - exi_printk(KERN_ERR, "exi transfer took too long, " + drv_printk(KERN_ERR, "exi transfer took too long, " "is your hardware ok?"); } @@ -435,7 +441,7 @@ init_waitqueue_head(&exi_channel->wait_queue); exi_channel->channel = channel; - exi_channel->io_base = EXI_IO_BASE(channel); + exi_channel->io_base = exi_io_mem + channel * EXI_CHANNEL_SPACING; tasklet_init(&exi_channel->tasklet, exi_tasklet, (unsigned long)exi_channel); @@ -1357,12 +1363,18 @@ /* * Pseudo-Internal. Initialize basic channel structures and hardware. */ -int exi_hw_init(char *module_name) +int exi_hw_init(char *module_name, struct resource *mem, unsigned int irq) { struct exi_channel *exi_channel; int channel; int result; + exi_io_mem = ioremap(mem->start, mem->end - mem->start + 1); + if (!exi_io_mem) { + drv_printk(KERN_ERR, "ioremap failed\n"); + return -ENOMEM; + } + for(channel = 0; channel < EXI_MAX_CHANNELS; channel++) { exi_channel = __to_exi_channel(channel); @@ -1374,9 +1386,9 @@ exi_quiesce_all_channels(EXI_CSR_EXTINMASK); /* register the exi interrupt handler */ - result = request_irq(EXI_IRQ, exi_irq_handler, 0, module_name, NULL); + result = request_irq(irq, exi_irq_handler, 0, module_name, NULL); if (result) { - exi_printk(KERN_ERR, "unable to register irq%d\n", EXI_IRQ); + drv_printk(KERN_ERR, "failed to register IRQ %d\n", irq); } return result; @@ -1385,10 +1397,11 @@ /* * Pseudo-Internal. */ -void exi_hw_exit(void) +void exi_hw_exit(struct resource *mem, unsigned int irq) { exi_quiesce_all_channels(0); - free_irq(EXI_IRQ, NULL); + iounmap(exi_io_mem); + free_irq(irq, NULL); } |
From: Albert H. <he...@us...> - 2008-03-26 20:15:43
|
Update of /cvsroot/gc-linux/linux/drivers/block/gcn-di In directory sc8-pr-cvs2.sourceforge.net:/tmp/cvs-serv22420/drivers/block/gcn-di Modified Files: gcn-di.c Log Message: Remove old ugecon driver (we use now usbgecko_udbg). Rewrite the following drivers as of_platform drivers using the device tree: - gcn-rsw - starlet-ipc - gcn-aram - rvl-mem2 - gcn-di - exi-driver, exi-hw - gcn-si - gcnfb (gcn-vifb) - gcn-ai Marked as broken gcn-mi and gcngx. Updated defconfigs. Index: gcn-di.c =================================================================== RCS file: /cvsroot/gc-linux/linux/drivers/block/gcn-di/gcn-di.c,v retrieving revision 1.21 retrieving revision 1.22 diff -u -d -r1.21 -r1.22 --- gcn-di.c 16 Nov 2007 23:26:07 -0000 1.21 +++ gcn-di.c 26 Mar 2008 20:15:10 -0000 1.22 @@ -1,7 +1,7 @@ /* * drivers/block/gcn-di/gcn-di.c * - * Nintendo GameCube DVD Interface driver + * Nintendo GameCube DVD Interface (DI) driver * Copyright (C) 2005-2007 The GameCube Linux Team * Copyright (C) 2005,2006,2007 Albert Herranz * @@ -14,32 +14,31 @@ * */ -#include <linux/kernel.h> -#include <linux/module.h> +#include <linux/blkdev.h> +#include <linux/cdrom.h> +#include <linux/delay.h> +#include <linux/dma-mapping.h> +#include <linux/fcntl.h> +#include <linux/hdreg.h> #include <linux/init.h> #include <linux/interrupt.h> -#include <linux/dma-mapping.h> -#include <linux/timer.h> -#include <linux/delay.h> +#include <linux/kernel.h> +#include <linux/module.h> +#include <linux/of_platform.h> #include <linux/proc_fs.h> #include <linux/seq_file.h> -#include <linux/platform_device.h> -#include <linux/blkdev.h> -#include <linux/fcntl.h> -#include <linux/hdreg.h> -#include <linux/cdrom.h> - +#include <linux/timer.h> #include <asm/io.h> #define DI_DEBUG #define DRV_MODULE_NAME "gcn-di" -#define DRV_DESCRIPTION "Nintendo GameCube DVD Interface driver" +#define DRV_DESCRIPTION "Nintendo GameCube DVD Interface (DI) driver" #define DRV_AUTHOR "Albert Herranz" -static char di_driver_version[] = "0.8-isobel"; +static char di_driver_version[] = "1.0-isobel"; -#define di_printk(level, format, arg...) \ +#define drv_printk(level, format, arg...) \ printk(level DRV_MODULE_NAME ": " format , ## arg) #ifdef DI_DEBUG @@ -53,15 +52,8 @@ /* * Hardware. */ -#define DI_IRQ 2 - #define DI_DMA_ALIGN 0x1f /* 32 bytes */ -#define DI_BASE 0xcc006000 -#define DI_SIZE 0x40 - -#define DI_IO_BASE ((void __iomem *)DI_BASE) - /* DI Status Register */ #define DI_SR 0x00 #define DI_SR_BRK (1<<0) @@ -138,7 +130,7 @@ /* Driver Settings */ -#define DI_NAME "gcndi" +#define DI_NAME DRV_MODULE_NAME #define DI_MAJOR 60 #define DI_COMMAND_TIMEOUT 20 /* seconds */ @@ -280,12 +272,9 @@ int ref_count; - struct platform_device pdev; /* must be last member */ + struct device *dev; }; -/* get the di device given the platform device of a di device */ -#define to_di_device(n) container_of(n,struct di_device,pdev) - static struct di_drive_info di_drive_info __attribute__ ((aligned (DI_DMA_ALIGN+1))); @@ -299,8 +288,8 @@ static const int di_accept_gods = 0; /* - * * Drive firmware extensions. + * */ #define DI_DRIVE_CODE_BASE 0x40d000 @@ -781,9 +770,9 @@ */ static void di_print_drive_status(u32 drive_status) { - di_printk(KERN_INFO, "drive_status=%08x, [%s, %s]\n", drive_status, - di_printable_status(drive_status), - di_printable_error(drive_status)); + drv_printk(KERN_INFO, "drive_status=%08x, [%s, %s]\n", drive_status, + di_printable_status(drive_status), + di_printable_error(drive_status)); } /* @@ -791,7 +780,7 @@ */ static void di_print_disk_id(struct di_disk_id *disk_id) { - di_printk(KERN_INFO, "disk_id = [%s]\n", disk_id->id); + drv_printk(KERN_INFO, "disk_id = [%s]\n", disk_id->id); } /* @@ -915,8 +904,8 @@ } /* - * * Command engine. + * */ /* @@ -980,7 +969,7 @@ ddev->cmd = cmd; cmd->dma_len = cmd->len; - cmd->dma_addr = dma_map_single(&ddev->pdev.dev, + cmd->dma_addr = dma_map_single(ddev->dev, cmd->data, cmd->len, di_opidx_to_dma_dir(cmd)); @@ -1030,7 +1019,7 @@ /* deal with caches after a dma transfer */ if (cmd->dma_len) { - dma_unmap_single(&ddev->pdev.dev, + dma_unmap_single(ddev->dev, cmd->dma_addr, cmd->dma_len, di_opidx_to_dma_dir(cmd)); } @@ -1267,7 +1256,7 @@ /* - * + * Misc routines. * */ @@ -1282,8 +1271,9 @@ di_op_inq(&cmd, ddev, &di_drive_info); di_run_command_and_wait(&cmd); - di_printk(KERN_INFO, "laser unit: rev=%x, code=%x, date=%x\n", - di_drive_info.rev, di_drive_info.code, di_drive_info.date); + drv_printk(KERN_INFO, "laser unit: rev=%x, code=%x, date=%x\n", + di_drive_info.rev, di_drive_info.code, + di_drive_info.date); ddev->model = di_drive_info.date; return ddev->model; @@ -1446,9 +1436,9 @@ ddev->drive_code = &drive_20010831; break; default: - di_printk(KERN_ERR, "sorry, drive %x is not yet" - " supported\n", - di_drive_info.date); + drv_printk(KERN_ERR, "sorry, drive %x is not yet" + " supported\n", + di_drive_info.date); break; } @@ -1499,7 +1489,7 @@ */ irq_handler = le32_to_cpu(di_fw_get_irq_handler(ddev)); if (irq_handler != original_irq_handler) { - di_printk(KERN_ERR, "parking failed!\n"); + drv_printk(KERN_ERR, "parking failed!\n"); di_reset(ddev); } else { DBG("parking done, irq handler = %08x\n", irq_handler); @@ -1572,7 +1562,7 @@ */ if (!di_fw_read_meml(ddev, &fingerprint, 0x40c60a)) { if (fingerprint == 0xf710fff7) { - di_printk(KERN_INFO, "drivechip: xenogc/duoq\n"); + drv_printk(KERN_INFO, "drivechip: xenogc/duoq\n"); set_bit(__DI_AVOID_DEBUG, &ddev->flags); } } @@ -1644,16 +1634,16 @@ { if (di_probe_debug_features(ddev)) { /* we can't use debug features, thus try to avoid them */ - di_printk(KERN_INFO, "firmware: debug features do not work," - " using standard command set\n"); + drv_printk(KERN_INFO, "firmware: debug features do not work," + " using standard command set\n"); set_bit(__DI_AVOID_DEBUG, &ddev->flags); } else { if (di_has_alien_drive_code(ddev)) { - di_printk(KERN_INFO, "firmware: patched drive\n"); + drv_printk(KERN_INFO, "firmware: patched drive\n"); /* enable some workarounds if required */ di_init_alien_drive_code_quirks(ddev); } else { - di_printk(KERN_INFO, "firmware: unpatched drive\n"); + drv_printk(KERN_INFO, "firmware: unpatched drive\n"); } } } @@ -1758,13 +1748,10 @@ /* + * Block layer hooks. * - * Block Layer. */ -/* - * Determines media type and accepts accordingly. - */ static int di_read_toc(struct di_device *ddev) { static struct di_disk_id disk_id @@ -1789,8 +1776,8 @@ if (disk_id.id[0] && memcmp(disk_id.id, "GBL", 3) && !di_accept_gods) { di_print_disk_id(&disk_id); - di_printk(KERN_ERR, "sorry, gamecube media" - " support is disabled\n"); + drv_printk(KERN_ERR, "sorry, gamecube media" + " support is disabled\n"); } else { accepted_media = 1; } @@ -1835,9 +1822,6 @@ } -/* - * Finishes a block layer request. - */ static void di_request_done(struct di_command *cmd) { struct di_device *ddev = cmd->ddev; @@ -1864,9 +1848,6 @@ } } -/* - * Processes a block layer request. - */ static void di_do_request(struct request_queue *q) { struct di_device *ddev = q->queuedata; @@ -1879,21 +1860,21 @@ while ((req = elv_next_request(q))) { /* keep our reads within limits */ if (req->sector + req->current_nr_sectors > ddev->nr_sectors) { - di_printk(KERN_ERR, "reading past end\n"); + drv_printk(KERN_ERR, "reading past end\n"); end_request(req, 0); continue; } /* it doesn't make sense to write to this device */ if (rq_data_dir(req) == WRITE) { - di_printk(KERN_ERR, "write attempted\n"); + drv_printk(KERN_ERR, "write attempted\n"); end_request(req, 0); continue; } /* it is not a good idea to open the lid ... */ if ((ddev->flags & DI_MEDIA_CHANGED)) { - di_printk(KERN_ERR, "media changed, aborting\n"); + drv_printk(KERN_ERR, "media changed, aborting\n"); end_request(req, 0); continue; } @@ -1937,13 +1918,10 @@ } /* + * Block device hooks. * - * Driver hooks. */ -/* - * Opens the drive device. - */ static int di_open(struct inode *inode, struct file *filp) { struct di_device *ddev = inode->i_bdev->bd_disk->private_data; @@ -2007,9 +1985,6 @@ } -/* - * Releases the drive device. - */ static int di_release(struct inode *inode, struct file *filp) { struct di_device *ddev = inode->i_bdev->bd_disk->private_data; @@ -2038,9 +2013,6 @@ return 0; } -/* - * Checks if media is still valid. - */ static int di_revalidate_disk(struct gendisk *disk) { struct di_device *ddev = disk->private_data; @@ -2048,18 +2020,12 @@ return 0; } -/* - * Checks if media changed. - */ static int di_media_changed(struct gendisk *disk) { struct di_device *ddev = disk->private_data; return (ddev->flags & DI_MEDIA_CHANGED) ? 1 : 0; } -/* - * Ioctl. Specific CDROM stuff is pending support. - */ static int di_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg) { @@ -2115,8 +2081,10 @@ }; /* - * Initializes the hardware. + * Setup routines. + * */ + static int di_init_irq(struct di_device *ddev) { void __iomem *io_base = ddev->io_base; @@ -2140,7 +2108,7 @@ retval = request_irq(ddev->irq, di_irq_handler, 0, DRV_MODULE_NAME, ddev); if (retval) { - di_printk(KERN_ERR, "request of irq%d failed\n", ddev->irq); + drv_printk(KERN_ERR, "request of irq%d failed\n", ddev->irq); goto out; } @@ -2167,9 +2135,6 @@ return retval; } -/* - * Relinquishes control of the hardware. - */ static void di_exit_irq(struct di_device *ddev) { /* stop DVD motor */ @@ -2181,10 +2146,6 @@ free_irq(ddev->irq, ddev); } - -/* - * Initializes the block layer interfaces. - */ static int di_init_blk_dev(struct di_device *ddev) { struct gendisk *disk; @@ -2198,7 +2159,7 @@ retval = register_blkdev(DI_MAJOR, DI_NAME); if (retval) { - di_printk(KERN_ERR, "error registering major %d\n", DI_MAJOR); + drv_printk(KERN_ERR, "error registering major %d\n", DI_MAJOR); goto err_register_blkdev; } @@ -2206,7 +2167,7 @@ spin_lock_init(&ddev->queue_lock); queue = blk_init_queue(di_do_request, &ddev->queue_lock); if (!queue) { - di_printk(KERN_ERR, "error initializing queue\n"); + drv_printk(KERN_ERR, "error initializing queue\n"); goto err_blk_init_queue; } @@ -2219,7 +2180,7 @@ disk = alloc_disk(1); if (!disk) { - di_printk(KERN_ERR, "error allocating disk\n"); + drv_printk(KERN_ERR, "error allocating disk\n"); goto err_alloc_disk; } @@ -2246,9 +2207,6 @@ return retval; } -/* - * Exits the block layer interfaces. - */ static void di_exit_blk_dev(struct di_device *ddev) { if (ddev->disk) { @@ -2260,9 +2218,6 @@ unregister_blkdev(DI_MAJOR, DI_NAME); } -/* - * Initializes /proc filesystem support. - */ static int di_init_proc(struct di_device *ddev) { #ifdef CONFIG_PROC_FS @@ -2270,26 +2225,17 @@ return 0; } -/* - * Exits /proc filesystem support. - */ static void di_exit_proc(struct di_device *ddev) { #ifdef CONFIG_PROC_FS #endif /* CONFIG_PROC_FS */ } - -/* - * Initializes the device. - */ static int di_init(struct di_device *ddev, struct resource *mem, int irq) { int retval; - memset(ddev, 0, sizeof(*ddev) - sizeof(ddev->pdev)); - - ddev->io_base = (void __iomem *)mem->start; + ddev->io_base = ioremap(mem->start, mem->end - mem->start + 1); ddev->irq = irq; retval = di_init_blk_dev(ddev); @@ -2304,140 +2250,130 @@ return retval; } -/* - * Exits the device. - */ static void di_exit(struct di_device *ddev) { di_exit_blk_dev(ddev); di_exit_irq(ddev); di_exit_proc(ddev); + if (ddev->io_base) { + iounmap(ddev->io_base); + ddev->io_base = NULL; + } } - /* - * Needed for platform devices. + * Driver model helper routines. + * */ -static void di_dev_release(struct device *dev) + +static int di_do_probe(struct device *dev, + struct resource *mem, int irq) { + struct di_device *ddev; + int retval; + + ddev = kzalloc(sizeof(*ddev), GFP_KERNEL); + if (!ddev) { + drv_printk(KERN_ERR, "failed to allocate di_device\n"); + return -ENOMEM; + } + dev_set_drvdata(dev, ddev); + ddev->dev = dev; + + retval = di_init(ddev, mem, irq); + if (retval) { + dev_set_drvdata(dev, NULL); + kfree(ddev); + } + return retval; } -/* - * Set of resources used by the disk interface device. - */ -static struct resource di_resources[] = { - [0] = { - .start = DI_BASE, - .end = DI_BASE + DI_SIZE -1, - .flags = IORESOURCE_MEM, - }, - [1] = { - .start = DI_IRQ, - .end = DI_IRQ, - .flags = IORESOURCE_IRQ, - }, -}; +static int di_do_remove(struct device *dev) +{ + struct di_device *ddev = dev_get_drvdata(dev); + if (ddev) { + di_exit(ddev); + dev_set_drvdata(dev, NULL); + kfree(ddev); + return 0; + } + return -ENODEV; +} -/* - * The disk interface device. - */ -static struct di_device di_device = { - .pdev = { - .name = DI_NAME, - .id = 0, - .num_resources = ARRAY_SIZE(di_resources), - .resource = di_resources, - .dev = { - .release = di_dev_release, - }, - }, -}; +static int di_do_shutdown(struct device *dev) +{ + struct di_device *ddev = dev_get_drvdata(dev); + if (ddev) + di_quiesce(ddev); + return 0; +} /* - * Driver model probe function for our device. + * OF platform driver hooks. + * */ -static int di_probe(struct device *device) + +static int __init di_of_probe(struct of_device *odev, + const struct of_device_id *match) { - struct platform_device *pdev = to_platform_device(device); - struct di_device *ddev = to_di_device(pdev); - struct resource *mem; - int irq; + struct resource res; int retval; - retval = -ENODEV; - irq = platform_get_irq(pdev, 0); - mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); - if (mem) { - retval = di_init(ddev, mem, irq); + retval = of_address_to_resource(odev->node, 0, &res); + if (retval) { + drv_printk(KERN_ERR, "no io memory range found\n"); + return -ENODEV; } - return retval; + + return di_do_probe(&odev->dev, + &res, irq_of_parse_and_map(odev->node, 0)); } -/* - * Driver model remove function for our device. - */ -static int di_remove(struct device *device) +static int __exit di_of_remove(struct of_device *odev) { - struct platform_device *pdev = to_platform_device(device); - struct di_device *ddev = to_di_device(pdev); - - di_exit(ddev); - - return 0; + return di_do_remove(&odev->dev); } -/* - * Driver model shutdown function for our device. - */ -static void di_shutdown(struct device *device) +static int di_of_shutdown(struct of_device *odev) { - struct platform_device *pdev = to_platform_device(device); - struct di_device *ddev = to_di_device(pdev); - - di_quiesce(ddev); + return di_do_shutdown(&odev->dev); } -/* - * The disk interface driver. - */ -static struct device_driver di_driver = { - .name = DI_NAME, - .bus = &platform_bus_type, - .probe = di_probe, - .remove = di_remove, - .shutdown = di_shutdown, +static struct of_device_id di_of_match[] = { + { .compatible = "nintendo,di" }, + { }, +}; + +MODULE_DEVICE_TABLE(of, di_of_match); + +static struct of_platform_driver di_of_driver = { + .owner = THIS_MODULE, + .name = DRV_MODULE_NAME, + .match_table = di_of_match, + .probe = di_of_probe, + .remove = di_of_remove, + .shutdown = di_of_shutdown, }; /* - * Module initialization routine. + * Module interface hooks. + * */ + static int __init di_init_module(void) { - int retval = 0; - - di_printk(KERN_INFO, "%s - version %s\n", DRV_DESCRIPTION, - di_driver_version); - - retval = driver_register(&di_driver); - if (!retval) { - retval = platform_device_register(&di_device.pdev); - if (retval) - driver_unregister(&di_driver); - } + drv_printk(KERN_INFO, "%s - version %s\n", DRV_DESCRIPTION, + di_driver_version); - return retval; + return of_register_platform_driver(&di_of_driver); } -/* - * Module de-initialization routine. - */ static void __exit di_exit_module(void) { - platform_device_unregister(&di_device.pdev); - driver_unregister(&di_driver); + of_unregister_platform_driver(&di_of_driver); } module_init(di_init_module); |
From: Albert H. <he...@us...> - 2008-03-26 20:15:42
|
Update of /cvsroot/gc-linux/linux/arch/powerpc/platforms/embedded6xx In directory sc8-pr-cvs2.sourceforge.net:/tmp/cvs-serv22420/arch/powerpc/platforms/embedded6xx Modified Files: gcn-rsw.c starlet-ipc.c starlet-stm.c Removed Files: ugecon.c ugecon.h Log Message: Remove old ugecon driver (we use now usbgecko_udbg). Rewrite the following drivers as of_platform drivers using the device tree: - gcn-rsw - starlet-ipc - gcn-aram - rvl-mem2 - gcn-di - exi-driver, exi-hw - gcn-si - gcnfb (gcn-vifb) - gcn-ai Marked as broken gcn-mi and gcngx. Updated defconfigs. --- ugecon.h DELETED --- --- ugecon.c DELETED --- Index: gcn-rsw.c =================================================================== RCS file: /cvsroot/gc-linux/linux/arch/powerpc/platforms/embedded6xx/gcn-rsw.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- gcn-rsw.c 4 Mar 2008 06:20:55 -0000 1.1 +++ gcn-rsw.c 26 Mar 2008 20:14:58 -0000 1.2 @@ -1,7 +1,7 @@ /* * arch/powerpc/platforms/embedded6xx/gcn-rsw.c * - * Nintendo GameCube reset switch driver + * Nintendo GameCube/Wii reset switch (RSW) driver. * Copyright (C) 2004-2008 The GameCube Linux Team * Copyright (C) 2004 Stefan Esser * Copyright (C) 2004,2005,2008 Albert Herranz @@ -16,7 +16,9 @@ #include <linux/kernel.h> #include <linux/module.h> #include <linux/init.h> +#include <linux/of_platform.h> #include <linux/interrupt.h> +#include <linux/io.h> #include <linux/spinlock.h> #include <linux/delay.h> #include <linux/reboot.h> @@ -25,7 +27,20 @@ #include <linux/kexec.h> #endif -#define RSW_IRQ 1 + +/* for flipper hardware registers */ +#include "flipper-pic.h" + +#define DRV_MODULE_NAME "gcn-rsw" +#define DRV_DESCRIPTION "Nintendo GameCube/Wii Reset SWitch (RSW) driver" +#define DRV_AUTHOR "Stefan Esser <se...@no...>, " \ + "Albert Herranz" + +static char rsw_driver_version[] = "1.0-isobel"; + +#define drv_printk(level, format, arg...) \ + printk(level DRV_MODULE_NAME ": " format , ## arg) + #define RSW_NORMAL_TIMEOUT 3 /* seconds */ #define RSW_EMERGENCY_PUSHES 10 @@ -34,103 +49,105 @@ IDLE = 0, /* nothing to do */ NORMAL_RESET, /* reboot requested */ EMERGENCY_RESET, /* try emergency reboot */ -} gcn_rsw_state_t; +} rsw_state_t; -struct gcn_rsw_private { - gcn_rsw_state_t state; +struct rsw_drvdata { + rsw_state_t state; struct timer_list timer; unsigned long jiffies; int pushes; int timeout; spinlock_t lock; + + void __iomem *io_base; + unsigned int irq; + + struct device *dev; }; -#define DRV_MODULE_NAME "gcn-rsw" -#define DRV_DESCRIPTION "Nintendo GameCube reset switch driver" -#define DRV_AUTHOR "Stefan Esser <se...@no...>" - -MODULE_DESCRIPTION(DRV_DESCRIPTION); -MODULE_AUTHOR(DRV_AUTHOR); -MODULE_LICENSE("GPL"); - -#define PFX DRV_MODULE_NAME ": " -#define rsw_printk(level, format, arg...) \ - printk(level PFX format , ## arg) - +/* + * Tells if the reset button is pressed. + */ +static int rsw_is_button_pressed(void __iomem * io_base) +{ + u32 icr = in_be32(io_base + FLIPPER_ICR); + + drv_printk(KERN_INFO, "%x\n", icr); + return !(icr & FLIPPER_ICR_RSS); +} /* from kernel/sys.c */ extern void ctrl_alt_del(void); -static struct gcn_rsw_private gcn_rsw_private = { - .state = IDLE, - .timeout = RSW_NORMAL_TIMEOUT, -}; - - -/** - * +/* + * Invokes a normal system restart. */ -static void gcn_rsw_normal_reset(unsigned long dummy) +static void rsw_normal_restart(unsigned long dummy) { ctrl_alt_del(); } -/** - * +/* + * Performs a low level system restart. */ -static void gcn_rsw_emergency_reset(void) +static void rsw_emergency_restart(void) { #ifdef CONFIG_KEXEC struct kimage *image; image = xchg(&kexec_image, 0); - if (image) { + if (image) machine_kexec(image); - } #endif machine_restart(NULL); } -/** - * +/* + * Handles the interrupt associated to the reset button. */ -static irqreturn_t gcn_rsw_handler(int this_irq, void *data) +static irqreturn_t rsw_handler(int irq, void *data) { - struct gcn_rsw_private *priv = (struct gcn_rsw_private *)data; + struct rsw_drvdata *drvdata = (struct rsw_drvdata *)data; unsigned long flags; - spin_lock_irqsave(&priv->lock, flags); + if (!rsw_is_button_pressed(drvdata->io_base)) { + /* nothing to do */ + return IRQ_HANDLED; + } + + spin_lock_irqsave(&drvdata->lock, flags); /* someone pushed the reset button */ - switch (priv->state) { + switch (drvdata->state) { case IDLE: - priv->state = NORMAL_RESET; + drvdata->state = NORMAL_RESET; printk(KERN_EMERG "Rebooting in %d seconds...\n", - priv->timeout); + drvdata->timeout); printk(KERN_WARNING "Push the Reset button again to cancel reboot!\n"); /* schedule a reboot in a few seconds */ - init_timer(&priv->timer); - priv->timer.expires = jiffies + priv->timeout * HZ; - priv->timer.function = - (void (*)(unsigned long))gcn_rsw_normal_reset; - add_timer(&priv->timer); - priv->jiffies = jiffies; + init_timer(&drvdata->timer); + drvdata->timer.expires = jiffies + drvdata->timeout * HZ; + drvdata->timer.function = + (void (*)(unsigned long))rsw_normal_restart; + add_timer(&drvdata->timer); + drvdata->jiffies = jiffies; break; case NORMAL_RESET: - if (time_before(jiffies, priv->jiffies + priv->timeout * HZ)) { + if (time_before(jiffies, + drvdata->jiffies + drvdata->timeout * HZ)) { /* the reset button was hit again before deadline */ - del_timer(&priv->timer); - priv->state = IDLE; + del_timer(&drvdata->timer); + drvdata->state = IDLE; printk(KERN_EMERG "Reboot cancelled!\n"); } else { /* * Time expired. System should be now restarting. * Go to emergency mode in case something goes bad. */ - priv->state = EMERGENCY_RESET; - priv->pushes = 0; + drvdata->state = EMERGENCY_RESET; + drvdata->pushes = 0; printk(KERN_WARNING "SWITCHED TO EMERGENCY RESET MODE!\n" "Push %d times the Reset button to force" @@ -141,51 +158,167 @@ break; case EMERGENCY_RESET: /* force a hard reset if the user insists ... */ - if (++priv->pushes >= RSW_EMERGENCY_PUSHES) { - spin_unlock_irqrestore(&priv->lock, flags); - gcn_rsw_emergency_reset(); + if (++drvdata->pushes >= RSW_EMERGENCY_PUSHES) { + spin_unlock_irqrestore(&drvdata->lock, flags); + rsw_emergency_restart(); return IRQ_HANDLED; } else { - printk(KERN_INFO - "%d/%d\n", - priv->pushes, + printk(KERN_INFO "%d/%d\n", drvdata->pushes, RSW_EMERGENCY_PUSHES); } break; } - spin_unlock_irqrestore(&priv->lock, flags); + spin_unlock_irqrestore(&drvdata->lock, flags); return IRQ_HANDLED; } -/** - * +/* + * Initializes the driver. */ -static int gcn_rsw_init(void) +static int rsw_init(struct rsw_drvdata *drvdata, struct resource *mem, int irq) { - int err; + int retval; - spin_lock_init(&gcn_rsw_private.lock); + drvdata->io_base = ioremap(mem->start, mem->end - mem->start + 1); + drvdata->irq = irq; - err = request_irq(RSW_IRQ, gcn_rsw_handler, 0, - DRV_MODULE_NAME, - (void *)&gcn_rsw_private); - if (err) { - rsw_printk(KERN_ERR, "request of irq%d failed\n", RSW_IRQ); + spin_lock_init(&drvdata->lock); + drvdata->state = IDLE; + drvdata->timeout = RSW_NORMAL_TIMEOUT; + + retval = request_irq(drvdata->irq, rsw_handler, 0, + DRV_MODULE_NAME, drvdata); + if (retval) { + drv_printk(KERN_ERR, "request of IRQ %d failed\n", + drvdata->irq); } + return retval; +} - return err; +/* + * Deinitializes the driver. + */ +static void rsw_exit(struct rsw_drvdata *drvdata) +{ + free_irq(drvdata->irq, drvdata); + if (drvdata->io_base) { + iounmap(drvdata->io_base); + drvdata->io_base = NULL; + } } -/** +/* + * Common probe function for a reset button device. + */ +static int rsw_do_probe(struct device *dev, struct resource *mem, int irq) +{ + struct rsw_drvdata *drvdata; + int retval; + + drvdata = kzalloc(sizeof(*drvdata), GFP_KERNEL); + if (!drvdata) { + drv_printk(KERN_ERR, "failed to allocate rsw_drvdata\n"); + return -ENOMEM; + } + dev_set_drvdata(dev, drvdata); + drvdata->dev = dev; + + retval = rsw_init(drvdata, mem, irq); + if (retval) { + dev_set_drvdata(dev, NULL); + kfree(drvdata); + } + return retval; +} + +/* + * Common remove function for a reset button device. + */ +static int rsw_do_remove(struct device *dev) +{ + struct rsw_drvdata *drvdata = dev_get_drvdata(dev); + + if (drvdata) { + rsw_exit(drvdata); + dev_set_drvdata(dev, NULL); + kfree(drvdata); + return 0; + } + return -ENODEV; +} + +/* + * OF platform driver hooks. * */ -static void gcn_rsw_exit(void) + +/* + * Driver model probe function. + */ +static int __init rsw_of_probe(struct of_device *odev, + const struct of_device_id *match) { - free_irq(RSW_IRQ, &gcn_rsw_private); + struct resource mem; + int retval; + + retval = of_address_to_resource(odev->node, 0, &mem); + if (retval) { + drv_printk(KERN_ERR, "no io memory range found\n"); + return -ENODEV; + } + + return rsw_do_probe(&odev->dev, + &mem, irq_of_parse_and_map(odev->node, 0)); } -module_init(gcn_rsw_init); -module_exit(gcn_rsw_exit); +/* + * Driver model remove function. + */ +static int __exit rsw_of_remove(struct of_device *odev) +{ + return rsw_do_remove(&odev->dev); +} + +static struct of_device_id rsw_of_match[] = { + {.compatible = "nintendo,rsw"}, + {}, +}; + +MODULE_DEVICE_TABLE(of, rsw_of_match); + +static struct of_platform_driver rsw_of_driver = { + .owner = THIS_MODULE, + .name = DRV_MODULE_NAME, + .match_table = rsw_of_match, + .probe = rsw_of_probe, + .remove = rsw_of_remove, +}; + +/* + * Module initialization function. + */ +static int rsw_init_module(void) +{ + drv_printk(KERN_INFO, "%s - version %s\n", DRV_DESCRIPTION, + rsw_driver_version); + + return of_register_platform_driver(&rsw_of_driver); +} + +/* + * Module deinitialization function. + */ +static void rsw_exit_module(void) +{ + of_unregister_platform_driver(&rsw_of_driver); +} + +module_init(rsw_init_module); +module_exit(rsw_exit_module); + +MODULE_DESCRIPTION(DRV_DESCRIPTION); +MODULE_AUTHOR(DRV_AUTHOR); +MODULE_LICENSE("GPL"); Index: starlet-ipc.c =================================================================== RCS file: /cvsroot/gc-linux/linux/arch/powerpc/platforms/embedded6xx/starlet-ipc.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- starlet-ipc.c 18 Mar 2008 18:57:17 -0000 1.1 +++ starlet-ipc.c 26 Mar 2008 20:14:58 -0000 1.2 @@ -15,8 +15,7 @@ #include <linux/kernel.h> #include <linux/module.h> #include <linux/init.h> -#include <linux/device.h> -#include <linux/platform_device.h> +#include <linux/of_platform.h> #include <linux/ioport.h> #include <linux/interrupt.h> #include <linux/dmapool.h> @@ -27,12 +26,6 @@ #include <asm/starlet.h> -#ifdef CONFIG_PPC_MERGE -#include <platforms/embedded6xx/gamecube.h> -#else -#include <platforms/gamecube.h> -#endif - #define DRV_MODULE_NAME "starlet-ipc" #define DRV_DESCRIPTION "Nintendo Wii starlet IPC driver" @@ -40,25 +33,9 @@ static char starlet_ipc_driver_version[] = "0.1-isobel"; +#define drv_printk(level, format, arg...) \ + printk(level DRV_MODULE_NAME ": " format , ## arg) -#define PFX DRV_MODULE_NAME ": " -#define ipc_printk(level, format, arg...) \ - printk(level PFX format , ## arg) - -#ifdef SD_DEBUG -# define DBG(fmt, args...) \ - printk(KERN_ERR "%s: " fmt, __FUNCTION__ , ## args) -#else -# define DBG(fmt, args...) -#endif - - -#define STARLET_IPC_BASE 0x0d000000 -#define STARLET_IPC_SIZE 0x40 - -#define STARLET_IPC_IRQ 14 - -#define STARLET_IPC_DMA_ALIGN 0x1f /* 32 bytes */ /* * Hardware registers @@ -90,7 +67,7 @@ struct starlet_ipc_request { - /* begin starlet hardware request format */ + /* begin starlet firmware request format */ u32 cmd; s32 result; union { @@ -111,7 +88,7 @@ } ioctl; u32 argv[5]; }; - /* end starlet hardware request format */ + /* end starlet firmware request format */ struct starlet_ipc_device *ipc_dev; struct list_head node; @@ -191,7 +168,7 @@ */ static void starlet_ipc_debug_print_request(struct starlet_ipc_request *req) { - DBG("cmd=%x, result=%d, fd=%x, dma_addr=%p\n", + pr_debug("cmd=%x, result=%d, fd=%x, dma_addr=%p\n", req->cmd, req->result, req->fd, (void *)req->dma_addr); } @@ -232,7 +209,7 @@ void __iomem *io_base = ipc_dev->io_base; unsigned long flags; - DBG("start_request\n"); + pr_debug("start_request\n"); starlet_ipc_debug_print_request(req); spin_lock_irqsave(&ipc_dev->list_lock, flags); @@ -257,7 +234,7 @@ ipc_dev->nr_outstanding--; spin_unlock_irqrestore(&ipc_dev->list_lock, flags); - DBG("complete_request\n"); + pr_debug("complete_request\n"); starlet_ipc_debug_print_request(req); if (req->done) @@ -317,7 +294,7 @@ struct list_head *pending = &ipc_dev->pending_list; unsigned long flags; - DBG("tx buf empty interrupt!\n"); + pr_debug("tx buf empty interrupt!\n"); spin_lock_irqsave(&ipc_dev->list_lock, flags); if (!list_empty(pending)) { @@ -344,14 +321,14 @@ struct starlet_ipc_request *req; unsigned long req_bus_addr; - DBG("rx buf full interrupt!\n"); + pr_debug("rx buf full interrupt!\n"); req_bus_addr = starlet_ipc_recvfrom(io_base); req = starlet_ipc_find_request_by_bus_addr(ipc_dev, req_bus_addr); if (req) { starlet_ipc_complete_request(req); } else { - ipc_printk(KERN_WARNING, "unknown request, bus=%p\n", + drv_printk(KERN_WARNING, "unknown request, bus=%p\n", (void *)req_bus_addr); } return IRQ_HANDLED; @@ -445,7 +422,7 @@ struct starlet_ipc_device *starlet_ipc_get_device(void) { if (!starlet_ipc_device_instance) - ipc_printk(KERN_ERR, "uninitialized device instance!\n"); + drv_printk(KERN_ERR, "uninitialized device instance!\n"); return starlet_ipc_device_instance; } EXPORT_SYMBOL_GPL(starlet_ipc_get_device); @@ -484,14 +461,14 @@ strcpy(buf_aligned_pathname, pathname); vaddr = buf_aligned_pathname; } - dma_addr = dma_map_single(&ipc_dev->pdev.dev, + dma_addr = dma_map_single(ipc_dev->dev, vaddr, len, DMA_TO_DEVICE); req->cmd = STARLET_IOS_OPEN; req->open.pathname = dma_addr; /* bus address */ req->open.mode = flags; retval = starlet_ipc_call_and_wait(req); if (use_private_buf) { - dma_unmap_single(&ipc_dev->pdev.dev, dma_addr, + dma_unmap_single(ipc_dev->dev, dma_addr, len, DMA_TO_DEVICE); mutex_unlock(&buf_aligned_pathname_lock); } @@ -527,9 +504,9 @@ /* * */ -int starlet_ios_ioctl(int fd, int request, - dma_addr_t ibuf, size_t ilen, - dma_addr_t obuf, size_t olen) +int starlet_ios_ioctl_dma(int fd, int request, + dma_addr_t ibuf, size_t ilen, + dma_addr_t obuf, size_t olen) { struct starlet_ipc_device *ipc_dev = starlet_ipc_get_device(); struct starlet_ipc_request *req; @@ -552,76 +529,84 @@ } return retval; } -EXPORT_SYMBOL_GPL(starlet_ios_ioctl); - -/* - * Platform driver interface. - * - */ /* * */ -static int starlet_ipc_init_irq(struct starlet_ipc_device *ipc_dev) +int starlet_ios_ioctl(int fd, int request, + void *ibuf, size_t ilen, + void *obuf, size_t olen) { + struct starlet_ipc_device *ipc_dev = starlet_ipc_get_device(); + dma_addr_t ibuf_ba, obuf_ba; int retval; - int irq = platform_get_irq(&ipc_dev->pdev, 0); - retval = request_irq(irq, starlet_ipc_handler, 0, DRV_MODULE_NAME, - ipc_dev); - if (retval) { - ipc_printk(KERN_ERR, "request of irq%d failed\n", irq); - } else { - /* ack and enable MBOX? and REPLY interrupts */ - out_be32(ipc_dev->io_base + STARLET_IPC_CSR, - STARLET_IPC_CSR_TBEIMASK | STARLET_IPC_CSR_RBFIMASK | - STARLET_IPC_CSR_TBEI | STARLET_IPC_CSR_RBFI); - } + BUG_ON(!IS_ALIGNED((unsigned long)ibuf, STARLET_IPC_DMA_ALIGN+1)); + BUG_ON(!IS_ALIGNED((unsigned long)obuf, STARLET_IPC_DMA_ALIGN+1)); + + ibuf_ba = dma_map_single(ipc_dev->dev, ibuf, ilen, + DMA_TO_DEVICE); + obuf_ba = dma_map_single(ipc_dev->dev, obuf, olen, + DMA_FROM_DEVICE); + retval = starlet_ios_ioctl_dma(fd, request, ibuf_ba, ilen, + obuf_ba, olen); + dma_unmap_single(ipc_dev->dev, ibuf_ba, ilen, DMA_TO_DEVICE); + dma_unmap_single(ipc_dev->dev, obuf_ba, olen, DMA_FROM_DEVICE); + return retval; } +EXPORT_SYMBOL_GPL(starlet_ios_ioctl); /* * + * */ -static void starlet_ipc_exit_irq(struct starlet_ipc_device *ipc_dev) + +/* + * + */ +static void starlet_ios_fixups(void) { - int irq = platform_get_irq(&ipc_dev->pdev, 0); + int fd; + static u32 buf[32/sizeof(u32)] + __attribute__ ((aligned(STARLET_IPC_DMA_ALIGN + 1))); - starlet_ipc_quiesce(ipc_dev); - free_irq(irq, ipc_dev); + /* try to close any open file descriptors, just in case */ + for(fd = 0; fd < 15; fd++) + starlet_ios_close(fd); + + /* stop dvd motor */ + fd = starlet_ios_open("/dev/di", 0); + if (fd >= 0) { + buf[0] = 0xe3000000; /* stop motor command */ + buf[1] = 0; + buf[2] = 0; + starlet_ios_ioctl(fd, buf[0], + buf, sizeof(buf), + buf, sizeof(buf)); + starlet_ios_close(fd); + } } + /* * */ -static int starlet_ipc_probe(struct platform_device *pdev) +static int starlet_ipc_init(struct starlet_ipc_device *ipc_dev, + struct resource *mem, int irq) { - struct starlet_ipc_device *ipc_dev = to_ipc_dev(pdev); - struct resource *mem; size_t size; int retval; - mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); - if (!mem) { - ipc_printk(KERN_ERR, "failed to determine io address range\n"); - return -ENODEV; - } - - memset(ipc_dev, 0, sizeof(*ipc_dev) - sizeof(ipc_dev->pdev)); - ipc_dev->io_base = ioremap(mem->start, mem->end - mem->start + 1); - if (!ipc_dev->io_base) { - ipc_printk(KERN_ERR, "ioremap from %p to %p failed\n", - (void *)mem->start, (void *)mem->end); - return -EINVAL; - } + ipc_dev->irq = irq; - size = max((size_t) 128, sizeof(struct starlet_ipc_request)); + size = max((size_t)64, sizeof(struct starlet_ipc_request)); ipc_dev->dma_pool = dma_pool_create(DRV_MODULE_NAME, - &ipc_dev->pdev.dev, + ipc_dev->dev, size, STARLET_IPC_DMA_ALIGN + 1, 0); if (!ipc_dev->dma_pool) { - ipc_printk(KERN_ERR, "dma_pool_create failed\n"); + drv_printk(KERN_ERR, "dma_pool_create failed\n"); iounmap(ipc_dev->io_base); return -ENOMEM; } @@ -631,58 +616,155 @@ starlet_ipc_device_instance = ipc_dev; - retval = starlet_ipc_init_irq(ipc_dev); + retval = request_irq(ipc_dev->irq, starlet_ipc_handler, 0, + DRV_MODULE_NAME, ipc_dev); if (retval) { + drv_printk(KERN_ERR, "request of IRQ %d failed\n", irq); starlet_ipc_device_instance = NULL; dma_pool_destroy(ipc_dev->dma_pool); iounmap(ipc_dev->io_base); return retval; } - return 0; + /* ack and enable MBOX? and REPLY interrupts */ + out_be32(ipc_dev->io_base + STARLET_IPC_CSR, + STARLET_IPC_CSR_TBEIMASK | STARLET_IPC_CSR_RBFIMASK | + STARLET_IPC_CSR_TBEI | STARLET_IPC_CSR_RBFI); + + starlet_ios_fixups(); + + return retval; } /* * */ -static int starlet_ipc_remove(struct platform_device *pdev) +static void starlet_ipc_exit(struct starlet_ipc_device *ipc_dev) { - struct starlet_ipc_device *ipc_dev = to_ipc_dev(pdev); + starlet_ipc_device_instance = NULL; + starlet_ipc_quiesce(ipc_dev); + free_irq(ipc_dev->irq, ipc_dev); + dma_pool_destroy(ipc_dev->dma_pool); iounmap(ipc_dev->io_base); - starlet_ipc_exit_irq(ipc_dev); + ipc_dev->io_base = NULL; +} - return 0; + +/* + * Device interface. + * + */ + +/* + * Common probe function for the given device. + */ +static int starlet_ipc_do_probe(struct device *dev, struct resource *mem, + int irq) +{ + struct starlet_ipc_device *ipc_dev; + int retval; + + ipc_dev = kzalloc(sizeof(*ipc_dev), GFP_KERNEL); + if (!ipc_dev) { + drv_printk(KERN_ERR, "failed to allocate ipc_dev\n"); + return -ENOMEM; + } + dev_set_drvdata(dev, ipc_dev); + ipc_dev->dev = dev; + + retval = starlet_ipc_init(ipc_dev, mem, irq); + if (retval) { + dev_set_drvdata(dev, NULL); + kfree(ipc_dev); + } + return retval; } -static struct platform_driver starlet_ipc_driver = { - .probe = starlet_ipc_probe, - .remove = starlet_ipc_remove, - .driver = { - .name = DRV_MODULE_NAME, - }, -}; +/* + * + */ +static int starlet_ipc_do_remove(struct device *dev) +{ + struct starlet_ipc_device *ipc_dev = dev_get_drvdata(dev); -static struct resource starlet_ipc_resources[] = { - [0] = { - .start = STARLET_IPC_BASE, - .end = STARLET_IPC_BASE + STARLET_IPC_SIZE - 1, - .flags = IORESOURCE_MEM, - }, - [1] = { - .start = STARLET_IPC_IRQ, - .end = STARLET_IPC_IRQ, - .flags = IORESOURCE_IRQ, - }, + if (ipc_dev) { + starlet_ipc_exit(ipc_dev); + dev_set_drvdata(dev, NULL); + kfree(ipc_dev); + return 0; + } + return -ENODEV; +} + +/* + * + */ +static int starlet_ipc_do_shutdown(struct device *dev) +{ + struct starlet_ipc_device *ipc_dev = dev_get_drvdata(dev); + + if (ipc_dev) { + starlet_ipc_quiesce(ipc_dev); + return 0; + } + return -ENODEV; +} + +/* + * OF Platform device interface. + * + */ + +/* + * + */ +static int starlet_ipc_of_probe(struct of_device *odev, + const struct of_device_id *dev_id) +{ + struct resource res; + int retval; + + retval = of_address_to_resource(odev->node, 0, &res); + if (retval) { + drv_printk(KERN_ERR, "no io memory range found\n"); + return -ENODEV; + } + + return starlet_ipc_do_probe(&odev->dev, &res, + irq_of_parse_and_map(odev->node, 0)); +} + +/* + * + */ +static int starlet_ipc_of_remove(struct of_device *odev) +{ + return starlet_ipc_do_remove(&odev->dev); +} + +/* + * + */ +static int starlet_ipc_of_shutdown(struct of_device *odev) +{ + return starlet_ipc_do_shutdown(&odev->dev); +} + +static struct of_device_id starlet_ipc_of_match[] = { + { .compatible = "nintendo,starlet-ipc" }, + { }, }; -static struct starlet_ipc_device starlet_ipc_device = { - .pdev = { - .name = DRV_MODULE_NAME, - .id = 0, - .num_resources = ARRAY_SIZE(starlet_ipc_resources), - .resource = starlet_ipc_resources, - }, +MODULE_DEVICE_TABLE(of, starlet_ipc_of_match); + +static struct of_platform_driver starlet_ipc_of_driver = { + .owner = THIS_MODULE, + .name = DRV_MODULE_NAME, + .match_table = starlet_ipc_of_match, + .probe = starlet_ipc_of_probe, + .remove = starlet_ipc_of_remove, + .shutdown = starlet_ipc_of_shutdown, }; /* @@ -693,30 +775,23 @@ /* * */ -static int __init starlet_ipc_init(void) +static int __init starlet_ipc_init_module(void) { - int retval; - - ipc_printk(KERN_INFO, "%s - version %s\n", DRV_DESCRIPTION, + drv_printk(KERN_INFO, "%s - version %s\n", DRV_DESCRIPTION, starlet_ipc_driver_version); - retval = platform_driver_register(&starlet_ipc_driver); - if (!retval) { - retval = platform_device_register(&starlet_ipc_device.pdev); - if (retval) - platform_driver_unregister(&starlet_ipc_driver); - } - return retval; + return of_register_platform_driver(&starlet_ipc_of_driver); } /* * */ -static void __exit starlet_ipc_exit(void) +static void __exit starlet_ipc_exit_module(void) { - platform_device_unregister(&starlet_ipc_device.pdev); - platform_driver_unregister(&starlet_ipc_driver); + of_unregister_platform_driver(&starlet_ipc_of_driver); } -module_init(starlet_ipc_init); -module_exit(starlet_ipc_exit); +module_init(starlet_ipc_init_module); +module_exit(starlet_ipc_exit_module); + + Index: starlet-stm.c =================================================================== RCS file: /cvsroot/gc-linux/linux/arch/powerpc/platforms/embedded6xx/starlet-stm.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- starlet-stm.c 18 Mar 2008 18:57:17 -0000 1.1 +++ starlet-stm.c 26 Mar 2008 20:14:58 -0000 1.2 @@ -38,23 +38,14 @@ */ static void starlet_stm_common_restart(int request, u32 value) { - struct starlet_ipc_device *ipc_dev = starlet_ipc_get_device(); - dma_addr_t dma_addr; - u32 *vaddr = starlet_stm_buf; + u32 *buf = starlet_stm_buf; size_t len = sizeof(starlet_stm_buf); int fd; - if (!ipc_dev) - return; - fd = starlet_ios_open(dev_stm_immediate, 0); if (fd >= 0) { - *vaddr = value; - dma_addr = dma_map_single(&ipc_dev->pdev.dev, - vaddr, len, DMA_BIDIRECTIONAL); - starlet_ios_ioctl(fd, request, dma_addr, len, dma_addr, len); - dma_unmap_single(&ipc_dev->pdev.dev, - dma_addr, len, DMA_BIDIRECTIONAL); + *buf = value; + starlet_ios_ioctl(fd, request, buf, len, buf, len); starlet_ios_close(fd); } } |