summaryrefslogtreecommitdiff
path: root/sys/arch/mac68k/dev/pm_direct.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/arch/mac68k/dev/pm_direct.c')
-rw-r--r--sys/arch/mac68k/dev/pm_direct.c806
1 files changed, 432 insertions, 374 deletions
diff --git a/sys/arch/mac68k/dev/pm_direct.c b/sys/arch/mac68k/dev/pm_direct.c
index 49158ade649..d35df8189b4 100644
--- a/sys/arch/mac68k/dev/pm_direct.c
+++ b/sys/arch/mac68k/dev/pm_direct.c
@@ -1,5 +1,5 @@
-/* $OpenBSD: pm_direct.c,v 1.8 2005/02/11 20:09:30 martin Exp $ */
-/* $NetBSD: pm_direct.c,v 1.4 1998/02/23 03:11:26 scottr Exp $ */
+/* $OpenBSD: pm_direct.c,v 1.9 2006/01/04 20:39:05 miod Exp $ */
+/* $NetBSD: pm_direct.c,v 1.25 2005/10/28 21:54:52 christos Exp $ */
/*
* Copyright (C) 1997 Takashi Hamada
@@ -15,7 +15,7 @@
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
- * This product includes software developed by Takashi HAMADA
+ * This product includes software developed by Takashi Hamada
* 4. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
@@ -30,29 +30,30 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
+/* From: pm_direct.c 1.3 03/18/98 Takashi Hamada */
+#ifdef DEBUG
+#ifndef ADB_DEBUG
+#define ADB_DEBUG
+#endif
+#endif
-/* #define PM_DEBUG 1 */
/* #define PM_GRAB_SI 1 */
-#include <sys/types.h>
-#include <sys/cdefs.h>
+#include <sys/param.h>
#include <sys/systm.h>
-#include <sys/time.h>
-#include <machine/adbsys.h>
#include <machine/cpu.h>
-#include <machine/param.h>
#include <machine/viareg.h>
-#include <arch/mac68k/mac68k/macrom.h>
-#include <arch/mac68k/dev/adbvar.h>
-
-#include "pm_direct.h"
+#include <mac68k/dev/adbvar.h>
+#include <mac68k/dev/pm_direct.h>
/* hardware dependent values */
extern u_short ADBDelay;
extern u_int32_t HwCfgFlags3;
+extern struct mac68k_machine_S mac68k_machine;
+
/* define the types of the Power Manager */
#define PM_HW_UNKNOWN 0x00 /* don't know */
@@ -66,10 +67,10 @@ extern u_int32_t HwCfgFlags3;
#define PM_VIA_CLR_INTR() via_reg(VIA1, vIFR) = 0x90
#define PM_SET_STATE_ACKON() via_reg(VIA2, vBufB) |= 0x04
#define PM_SET_STATE_ACKOFF() via_reg(VIA2, vBufB) &= ~0x04
-#define PM_IS_ON ( 0x02 == (via_reg(VIA2, vBufB) & 0x02) )
-#define PM_IS_OFF ( 0x00 == (via_reg(VIA2, vBufB) & 0x02) )
+#define PM_IS_ON (0x02 == (via_reg(VIA2, vBufB) & 0x02))
+#define PM_IS_OFF (0x00 == (via_reg(VIA2, vBufB) & 0x02))
-/*
+/*
* Variables for internal use
*/
int pmHardware = PM_HW_UNKNOWN;
@@ -80,42 +81,74 @@ u_int pm_counter = 0; /* clock count */
/* these values shows that number of data returned after 'send' cmd is sent */
char pm_send_cmd_type[] = {
- 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
- 0x01,0x01,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0xff,0xff,0xff,0xff,0xff,0x00,
- 0xff,0x00,0x02,0x01,0x01,0xff,0xff,0xff, 0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
- 0x04,0x14,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x02,0xff,0xff,0xff,0xff,0xff,
- 0x01,0x01,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,
- 0x01,0x00,0x02,0x02,0xff,0x01,0x03,0x01, 0x00,0x01,0x00,0x00,0x00,0xff,0xff,0xff,
- 0x02,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,
- 0x01,0x01,0x01,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0xff,0xff,0xff,0xff,0x04,0x04,
- 0x04,0xff,0x00,0xff,0xff,0xff,0xff,0xff, 0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
- 0x01,0x02,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,
- 0x02,0x02,0x02,0x04,0xff,0x00,0xff,0xff, 0x01,0x01,0x03,0x02,0xff,0xff,0xff,0xff,
- 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
- 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
- 0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x01,0x01,0xff,0xff,0x00,0x00,0xff,0xff,
- 0xff,0x04,0x00,0xff,0xff,0xff,0xff,0xff, 0x03,0xff,0x00,0xff,0x00,0xff,0xff,0x00,
- 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0x01, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+ 0xff, 0x00, 0x02, 0x01, 0x01, 0xff, 0xff, 0xff,
+ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0x04, 0x14, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0x01, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0x01, 0x00, 0x02, 0x02, 0xff, 0x01, 0x03, 0x01,
+ 0x00, 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
+ 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
+ 0x01, 0x01, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x04, 0x04,
+ 0x04, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0x01, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0x02, 0x02, 0x02, 0x04, 0xff, 0x00, 0xff, 0xff,
+ 0x01, 0x01, 0x03, 0x02, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0x01, 0x01, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff,
+ 0xff, 0x04, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0x03, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x00,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
};
/* these values shows that number of data returned after 'receive' cmd is sent */
char pm_receive_cmd_type[] = {
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x02,0xff,0xff,0xff,0xff,0xff,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x05,0x15,0xff,0xff,0xff,0xff,0xff,0xff,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x02,0xff,0xff,0xff,0xff,0xff,0xff,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x03,0x03,0xff,0xff,0xff,0xff,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x04,0x04,0x03,0x09,0xff,0xff,0xff,0xff,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x01,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x06,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x02,0xff,0xff,0xff,0xff,0xff,0xff,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x00,0x00,0xff,0xff,0xff,0xff,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x02,0xff,0xff,0x02,0xff,0xff,0xff,
- 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00, 0xff,0xff,0x02,0xff,0xff,0xff,0xff,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x02, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x05, 0x15, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x02, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x02, 0x00, 0x03, 0x03, 0xff, 0xff, 0xff, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x04, 0x04, 0x03, 0x09, 0xff, 0xff, 0xff, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x06, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x02, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x02, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x02, 0x02, 0xff, 0xff, 0x02, 0xff, 0xff, 0xff,
+ 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xff, 0xff, 0x02, 0xff, 0xff, 0xff, 0xff, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
};
@@ -124,75 +157,78 @@ char pm_receive_cmd_type[] = {
*/
/* for debugging */
-#ifdef PM_DEBUG
-void pm_printerr( char *, int, int, char * );
+#ifdef ADB_DEBUG
+void pm_printerr(const char *, int, int, char *);
#endif
-int pm_wait_busy(int);
-int pm_wait_free(int);
+int pm_wait_busy(int);
+int pm_wait_free(int);
/* these functions are for the PB1XX series */
-int pm_receive_pm1(u_char *);
-int pm_send_pm1(u_char,int);
-int pm_pmgrop_pm1(PMData *);
-void pm_intr_pm1(void);
+int pm_receive_pm1(u_char *);
+int pm_send_pm1(u_char, int);
+int pm_pmgrop_pm1(PMData *);
+int pm_intr_pm1(void *);
/* these functions are for the PB Duo series and the PB 5XX series */
-int pm_receive_pm2(u_char *);
-int pm_send_pm2(u_char);
-int pm_pmgrop_pm2(PMData *);
-void pm_intr_pm2(void);
+int pm_receive_pm2(u_char *);
+int pm_send_pm2(u_char);
+int pm_pmgrop_pm2(PMData *);
+int pm_intr_pm2(void *);
/* this function is MRG-Based (for testing) */
-int pm_pmgrop_mrg(PMData *);
+int pm_pmgrop_mrg(PMData *);
/* these functions are called from adb_direct.c */
-void pm_setup_adb(void);
-void pm_check_adb_devices(int);
-void pm_intr(void);
-int pm_adb_op(u_char *, void *, void *, int);
+void pm_setup_adb(void);
+void pm_check_adb_devices(int);
+void pm_intr(void *);
+int pm_adb_op(u_char *, void *, void *, int);
+void pm_hw_setup(void);
-/* these functions also use the valiables of adb_direct.c */
-void pm_adb_get_TALK_result(PMData *);
-void pm_adb_get_ADB_data(PMData *);
-void pm_adb_poll_next_device_pm1(PMData *);
+/* these functions also use the variables of adb_direct.c */
+void pm_adb_get_TALK_result(PMData *);
+void pm_adb_get_ADB_data(PMData *);
+void pm_adb_poll_next_device_pm1(PMData *);
/*
- * These valiables are in adb_direct.c.
+ * These variables are in adb_direct.c.
*/
extern u_char *adbBuffer; /* pointer to user data area */
-#define MAX_ADB_MSG_LENGTH 20
-extern u_char adbInputBuffer[MAX_ADB_MSG_LENGTH]; /* data input buffer */
extern void *adbCompRout; /* pointer to the completion routine */
extern void *adbCompData; /* pointer to the completion routine data */
extern int adbWaiting; /* waiting for return data from the device */
extern int adbWaitingCmd; /* ADB command we are waiting for */
extern int adbStarting; /* doing ADB reinit, so do "polling" differently */
-/*
- * Define the external functions
- */
-extern void adb_comp_exec(void); /* from adb_direct.c */
-
+#define ADB_MAX_MSG_LENGTH 16
+#define ADB_MAX_HDR_LENGTH 8
+struct adbCommand {
+ u_char header[ADB_MAX_HDR_LENGTH]; /* not used yet */
+ u_char data[ADB_MAX_MSG_LENGTH]; /* packet data only */
+ u_char *saveBuf; /* where to save result */
+ u_char *compRout; /* completion routine pointer */
+ u_char *compData; /* completion routine data pointer */
+ u_int cmd; /* the original command for this data */
+ u_int unsol; /* 1 if packet was unsolicited */
+ u_int ack_only; /* 1 for no special processing */
+};
+extern void adb_pass_up(struct adbCommand *);
-#ifdef PM_DEBUG
+#ifdef ADB_DEBUG
/*
* This function dumps contents of the PMData
*/
void
-pm_printerr(ttl, rval, num, data)
- char *ttl;
- int rval;
- int num;
- char *data;
+pm_printerr(const char *ttl, int rval, int num, char *data)
{
int i;
- printf( "pm: %s:%04x %02x ", ttl, rval, num );
- for( i=0; i<num; i++ )
- printf( "%02x ", data[i] );
- printf( "\n" );
+ printf("pm: %s:%04x %02x ", ttl, rval, num);
+ for (i = 0; i < num; i++)
+ printf("%02x ", data[i]);
+ printf("\n");
}
#endif
@@ -207,7 +243,6 @@ pm_setup_adb(void)
switch (mac68k_machine.machineid) {
case MACH_MACPB140:
case MACH_MACPB145:
- case MACH_MACPB150:
case MACH_MACPB160:
case MACH_MACPB165:
case MACH_MACPB165C:
@@ -216,6 +251,7 @@ pm_setup_adb(void)
case MACH_MACPB180C:
pmHardware = PM_HW_PB1XX;
break;
+ case MACH_MACPB150:
case MACH_MACPB210:
case MACH_MACPB230:
case MACH_MACPB250:
@@ -223,6 +259,8 @@ pm_setup_adb(void)
case MACH_MACPB280:
case MACH_MACPB280C:
case MACH_MACPB500:
+ case MACH_MACPB190:
+ case MACH_MACPB190CS:
pmHardware = PM_HW_PB5XX;
break;
default:
@@ -235,8 +273,7 @@ pm_setup_adb(void)
* Check the existent ADB devices
*/
void
-pm_check_adb_devices(id)
- int id;
+pm_check_adb_devices(int id)
{
u_short ed = 0x1;
@@ -249,17 +286,16 @@ pm_check_adb_devices(id)
* Wait until PM IC is busy
*/
int
-pm_wait_busy(delay)
- int delay;
+pm_wait_busy(int xdelay)
{
- while(PM_IS_ON) {
+ while (PM_IS_ON) {
#ifdef PM_GRAB_SI
- (void)intr_dispatch(0x70);
+ (void)intr_dispatch(0x70); /* grab any serial interrupts */
#endif
- if ((--delay) < 0)
- return( 1 ); /* timeout */
+ if ((--xdelay) < 0)
+ return 1; /* timeout */
}
- return( 0 );
+ return 0;
}
@@ -267,17 +303,16 @@ pm_wait_busy(delay)
* Wait until PM IC is free
*/
int
-pm_wait_free(delay)
- int delay;
+pm_wait_free(int xdelay)
{
- while(PM_IS_OFF) {
+ while (PM_IS_OFF) {
#ifdef PM_GRAB_SI
- (void)intr_dispatch(0x70);
+ (void)intr_dispatch(0x70); /* grab any serial interrupts */
#endif
- if ((--delay) < 0)
- return( 0 ); /* timeout */
+ if ((--xdelay) < 0)
+ return 0; /* timeout */
}
- return( 1 );
+ return 1;
}
@@ -290,23 +325,22 @@ pm_wait_free(delay)
* Receive data from PM for the PB1XX series
*/
int
-pm_receive_pm1(data)
- u_char *data;
+pm_receive_pm1(u_char *data)
{
int rval = 0xffffcd34;
via_reg(VIA2, vDirA) = 0x00;
- switch( 1 ) {
+ switch (1) {
default:
- if (pm_wait_busy( 0x40 ) != 0)
+ if (pm_wait_busy(0x40) != 0)
break; /* timeout */
PM_SET_STATE_ACKOFF();
*data = via_reg(VIA2, 0x200);
rval = 0xffffcd33;
- if (pm_wait_free( 0x40 ) == 0)
+ if (pm_wait_free(0x40) == 0)
break; /* timeout */
rval = 0x00;
@@ -316,7 +350,7 @@ pm_receive_pm1(data)
PM_SET_STATE_ACKON();
via_reg(VIA2, vDirA) = 0x00;
- return( rval );
+ return rval;
}
@@ -325,32 +359,32 @@ pm_receive_pm1(data)
* Send data to PM for the PB1XX series
*/
int
-pm_send_pm1(data, delay)
- u_char data;
- int delay;
+pm_send_pm1(u_char data, int timo)
{
- int rval;
+ int rval;
via_reg(VIA2, vDirA) = 0xff;
via_reg(VIA2, 0x200) = data;
PM_SET_STATE_ACKOFF();
- if (pm_wait_busy( 0x400 ) != 0) {
+#if 0
+ if (pm_wait_busy(0x400) == 0) {
+#else
+ if (pm_wait_busy(timo) == 0) {
+#endif
PM_SET_STATE_ACKON();
- via_reg(VIA2, vDirA) = 0x00;
-
- return( 0xffffcd36 );
+ if (pm_wait_free(0x40) != 0)
+ rval = 0x0;
+ else
+ rval = 0xffffcd35;
+ } else {
+ rval = 0xffffcd36;
}
- rval = 0x0;
- PM_SET_STATE_ACKON();
- if (pm_wait_free( 0x40 ) == 0)
- rval = 0xffffcd35;
-
PM_SET_STATE_ACKON();
via_reg(VIA2, vDirA) = 0x00;
- return( rval );
+ return rval;
}
@@ -358,17 +392,16 @@ pm_send_pm1(data, delay)
* My PMgrOp routine for the PB1XX series
*/
int
-pm_pmgrop_pm1(pmdata)
- PMData *pmdata;
+pm_pmgrop_pm1(PMData *pmdata)
{
- int i;
- int s = 0x81815963;
- u_char via1_vIER, via1_vDirA;
- int rval = 0;
- int num_pm_data = 0;
- u_char pm_cmd;
- u_char pm_data;
- u_char *pm_buf;
+ int i;
+ int s = 0x81815963;
+ u_char via1_vIER, via1_vDirA;
+ int rval = 0;
+ int num_pm_data = 0;
+ u_char pm_cmd;
+ u_char pm_data;
+ u_char *pm_buf;
/* disable all inetrrupts but PM */
via1_vIER = via_reg(VIA1, vIER);
@@ -376,50 +409,51 @@ pm_pmgrop_pm1(pmdata)
via1_vDirA = via_reg(VIA1, vDirA);
- switch( pmdata->command ) {
+ switch (pmdata->command) {
default:
- for( i=0; i<7; i++ ) {
+ for (i = 0; i < 7; i++) {
via_reg(VIA2, vDirA) = 0x00;
/* wait until PM is free */
- if (pm_wait_free( ADBDelay ) == 0) { /* timeout */
+ if (pm_wait_free(ADBDelay) == 0) { /* timeout */
via_reg(VIA2, vDirA) = 0x00;
/* restore formar value */
via_reg(VIA1, vDirA) = via1_vDirA;
via_reg(VIA1, vIER) = via1_vIER;
- return( 0xffffcd38 );
+ return 0xffffcd38;
}
- switch( mac68k_machine.machineid ) {
+ switch (mac68k_machine.machineid) {
case MACH_MACPB160:
case MACH_MACPB165:
case MACH_MACPB165C:
+ case MACH_MACPB170:
case MACH_MACPB180:
case MACH_MACPB180C:
{
- int delay = ADBDelay * 16;
+ int xdelay = ADBDelay * 16;
via_reg(VIA2, vDirA) = 0x00;
- while((via_reg(VIA2, 0x200) == 0x7f) && (delay >= 0))
- delay--;
+ while ((via_reg(VIA2, 0x200) == 0x7f) && (xdelay >= 0))
+ xdelay--;
- if (delay < 0) { /* timeout */
+ if (xdelay < 0) { /* timeout */
via_reg(VIA2, vDirA) = 0x00;
/* restore formar value */
via_reg(VIA1, vIER) = via1_vIER;
- return( 0xffffcd38 );
+ return 0xffffcd38;
}
}
} /* end switch */
- s=splhigh();
+ s = splhigh();
via1_vDirA = via_reg(VIA1, vDirA);
via_reg(VIA1, vDirA) &= 0x7f;
pm_cmd = (u_char)(pmdata->command & 0xff);
- if ((rval = pm_send_pm1( pm_cmd, ADBDelay*8 )) == 0) /* succeeded to send PM command */
- break;
+ if ((rval = pm_send_pm1(pm_cmd, ADBDelay * 8)) == 0)
+ break; /* send command succeeded */
via_reg(VIA1, vDirA) = via1_vDirA;
splx(s);
@@ -431,50 +465,51 @@ pm_pmgrop_pm1(pmdata)
/* restore formar value */
via_reg(VIA1, vDirA) = via1_vDirA;
via_reg(VIA1, vIER) = via1_vIER;
- return( 0xffffcd38 );
+ if (s != 0x81815963)
+ splx(s);
+ return 0xffffcd38;
}
/* send # of PM data */
num_pm_data = pmdata->num_data;
- if ((rval = pm_send_pm1( (u_char)(num_pm_data & 0xff), ADBDelay*8 )) != 0)
+ if ((rval = pm_send_pm1((u_char)(num_pm_data & 0xff), ADBDelay * 8)) != 0)
break; /* timeout */
/* send PM data */
pm_buf = (u_char *)pmdata->s_buf;
- for( i=0; i<num_pm_data; i++ )
- if((rval = pm_send_pm1( pm_buf[i], ADBDelay*8 )) != 0)
- break; /* timeout */
+ for (i = 0; i < num_pm_data; i++)
+ if ((rval = pm_send_pm1(pm_buf[i], ADBDelay * 8)) != 0)
+ break; /* timeout */
if ((i != num_pm_data) && (num_pm_data != 0))
- break; /* timeout */
+ break; /* timeout */
/* Will PM IC return data? */
if ((pm_cmd & 0x08) == 0) {
rval = 0;
- break; /* no returned data */
+ break; /* no returned data */
}
rval = 0xffffcd37;
- if (pm_wait_busy( ADBDelay ) != 0) {
+ if (pm_wait_busy(ADBDelay) != 0)
break; /* timeout */
- }
/* receive PM command */
- if ((rval = pm_receive_pm1( &pm_data )) != 0)
+ if ((rval = pm_receive_pm1(&pm_data)) != 0)
break;
pmdata->command = pm_data;
/* receive number of PM data */
- if ((rval = pm_receive_pm1( &pm_data )) != 0)
- break; /* timeout */
+ if ((rval = pm_receive_pm1(&pm_data)) != 0)
+ break; /* timeout */
num_pm_data = pm_data;
pmdata->num_data = num_pm_data;
/* receive PM data */
pm_buf = (u_char *)pmdata->r_buf;
- for( i=0; i<num_pm_data; i++ ) {
- if ((rval = pm_receive_pm1( &pm_data )) != 0)
- break; /* timeout */
+ for (i = 0; i < num_pm_data; i++) {
+ if ((rval = pm_receive_pm1(&pm_data)) != 0)
+ break; /* timeout */
pm_buf[i] = pm_data;
}
@@ -489,19 +524,19 @@ pm_pmgrop_pm1(pmdata)
if (s != 0x81815963)
splx(s);
- return( rval );
+ return rval;
}
/*
- * My PM interrupt routine for PB100-series
+ * My PM interrupt routine for PB1XX series
*/
-void
-pm_intr_pm1(void)
+int
+pm_intr_pm1(void *arg)
{
- int s;
- int rval;
- PMData pmdata;
+ int s;
+ int rval;
+ PMData pmdata;
s = splhigh();
@@ -513,30 +548,37 @@ pm_intr_pm1(void)
pmdata.data[0] = pmdata.data[1] = 0;
pmdata.s_buf = &pmdata.data[2];
pmdata.r_buf = &pmdata.data[2];
- rval = pm_pmgrop_pm1( &pmdata );
+ rval = pm_pmgrop_pm1(&pmdata);
if (rval != 0) {
-#ifdef PM_DEBUG
- printf( "pm: PM is not ready. error code=%08x\n", rval );
+#ifdef ADB_DEBUG
+ if (adb_debug)
+ printf("pm: PM is not ready. error code=%08x\n", rval);
#endif
splx(s);
- return;
}
if ((pmdata.data[2] & 0x10) == 0x10) {
- if ((pmdata.data[2] & 0x0f) == 0) { /* ADB data that were requested by TALK command */
+ if ((pmdata.data[2] & 0x0f) == 0) {
+ /* ADB data that were requested by TALK command */
pm_adb_get_TALK_result(&pmdata);
- } else if ((pmdata.data[2] & 0x08) == 0x8) { /* PM is requesting to poll */
+ } else if ((pmdata.data[2] & 0x08) == 0x8) {
+ /* PM is requesting to poll */
pm_adb_poll_next_device_pm1(&pmdata);
- } else if ((pmdata.data[2] & 0x04) == 0x4) { /* ADB device event */
+ } else if ((pmdata.data[2] & 0x04) == 0x4) {
+ /* ADB device event */
pm_adb_get_ADB_data(&pmdata);
}
} else {
-#ifdef PM_DEBUG
- pm_printerr( "driver does not supported this event.", rval, pmdata.num_data, pmdata.data );
+#ifdef ADB_DEBUG
+ if (adb_debug)
+ pm_printerr("driver does not supported this event.",
+ rval, pmdata.num_data, pmdata.data);
#endif
}
splx(s);
+
+ return (1);
}
@@ -549,15 +591,14 @@ pm_intr_pm1(void)
* Receive data from PM for the PB Duo series and the PB 5XX series
*/
int
-pm_receive_pm2(data)
- u_char *data;
+pm_receive_pm2(u_char *data)
{
- int i;
- int rval;
+ int i;
+ int rval;
rval = 0xffffcd34;
- switch( 1 ) {
+ switch (1) {
default:
/* set VIA SR to input mode */
via_reg(VIA1, vACR) |= 0x0c;
@@ -582,7 +623,7 @@ pm_receive_pm2(data)
PM_SET_STATE_ACKON();
via_reg(VIA1, vACR) |= 0x1c;
- return( rval );
+ return rval;
}
@@ -591,33 +632,28 @@ pm_receive_pm2(data)
* Send data to PM for the PB Duo series and the PB 5XX series
*/
int
-pm_send_pm2(data)
- u_char data;
+pm_send_pm2(u_char data)
{
- int rval;
+ int rval;
via_reg(VIA1, vACR) |= 0x1c;
PM_SR() = data;
PM_SET_STATE_ACKOFF();
- rval = 0xffffcd36;
- if (pm_wait_busy((int)ADBDelay*32) != 0) {
+ if (pm_wait_busy((int)ADBDelay*32) == 0) {
PM_SET_STATE_ACKON();
-
- via_reg(VIA1, vACR) |= 0x1c;
-
- return( rval );
+ if (pm_wait_free((int)ADBDelay*32) != 0)
+ rval = 0;
+ else
+ rval = 0xffffcd35;
+ } else {
+ rval = 0xffffcd36;
}
PM_SET_STATE_ACKON();
- rval = 0xffffcd35;
- if (pm_wait_free((int)ADBDelay*32) != 0)
- rval = 0;
-
- PM_SET_STATE_ACKON();
via_reg(VIA1, vACR) |= 0x1c;
- return( rval );
+ return rval;
}
@@ -626,20 +662,19 @@ pm_send_pm2(data)
* My PMgrOp routine for the PB Duo series and the PB 5XX series
*/
int
-pm_pmgrop_pm2(pmdata)
- PMData *pmdata;
+pm_pmgrop_pm2(PMData *pmdata)
{
- int i;
- int s;
- u_char via1_vIER;
- int rval = 0;
- int num_pm_data = 0;
- u_char pm_cmd;
- short pm_num_rx_data;
- u_char pm_data;
- u_char *pm_buf;
-
- s=splhigh();
+ int i;
+ int s;
+ u_char via1_vIER;
+ int rval = 0;
+ int num_pm_data = 0;
+ u_char pm_cmd;
+ short pm_num_rx_data;
+ u_char pm_data;
+ u_char *pm_buf;
+
+ s = splhigh();
/* disable all inetrrupts but PM */
via1_vIER = 0x10;
@@ -648,47 +683,49 @@ pm_pmgrop_pm2(pmdata)
if (via1_vIER != 0x0)
via1_vIER |= 0x80;
- switch( pmdata->command ) {
+ switch (pmdata->command) {
default:
/* wait until PM is free */
pm_cmd = (u_char)(pmdata->command & 0xff);
rval = 0xcd38;
- if (pm_wait_free( ADBDelay * 4 ) == 0)
+ if (pm_wait_free(ADBDelay * 4) == 0)
break; /* timeout */
- if (HwCfgFlags3 & 0x00200000) { /* PB 160, PB 165(c), PB 180(c) ? */
- int delay = ADBDelay * 16;
+ if (HwCfgFlags3 & 0x00200000) {
+ /* PB 160, PB 165(c), PB 180(c)? */
+ int xdelay = ADBDelay * 16;
via_reg(VIA2, vDirA) = 0x00;
- while((via_reg(VIA2, 0x200) == 0x07) && (delay >= 0))
- delay--;
+ while ((via_reg(VIA2, 0x200) == 0x07) &&
+ (xdelay >= 0))
+ xdelay--;
- if (delay < 0) {
+ if (xdelay < 0) {
rval = 0xffffcd38;
break; /* timeout */
}
}
/* send PM command */
- if ((rval = pm_send_pm2( (u_char)(pm_cmd & 0xff) )))
+ if ((rval = pm_send_pm2((u_char)(pm_cmd & 0xff))))
break; /* timeout */
/* send number of PM data */
num_pm_data = pmdata->num_data;
if (HwCfgFlags3 & 0x00020000) { /* PB Duo, PB 5XX */
if (pm_send_cmd_type[pm_cmd] < 0) {
- if ((rval = pm_send_pm2( (u_char)(num_pm_data & 0xff) )) != 0)
+ if ((rval = pm_send_pm2((u_char)(num_pm_data & 0xff))) != 0)
break; /* timeout */
pmdata->command = 0;
}
} else { /* PB 1XX series ? */
- if ((rval = pm_send_pm2( (u_char)(num_pm_data & 0xff) )) != 0)
+ if ((rval = pm_send_pm2((u_char)(num_pm_data & 0xff))) != 0)
break; /* timeout */
}
/* send PM data */
pm_buf = (u_char *)pmdata->s_buf;
- for( i=0; i<num_pm_data; i++ )
- if((rval = pm_send_pm2( pm_buf[i] )) != 0)
+ for (i = 0 ; i < num_pm_data; i++)
+ if ((rval = pm_send_pm2(pm_buf[i])) != 0)
break; /* timeout */
if (i != num_pm_data)
break; /* timeout */
@@ -707,13 +744,13 @@ pm_pmgrop_pm2(pmdata)
if (HwCfgFlags3 & 0x00020000) { /* PB Duo, PB 5XX */
pm_num_rx_data--;
if (pm_num_rx_data == 0)
- if ((rval = pm_receive_pm2( &pm_data )) != 0) {
+ if ((rval = pm_receive_pm2(&pm_data)) != 0) {
rval = 0xffffcd37;
break;
}
pmdata->command = pm_data;
} else { /* PB 1XX series ? */
- if ((rval = pm_receive_pm2( &pm_data )) != 0) {
+ if ((rval = pm_receive_pm2(&pm_data)) != 0) {
rval = 0xffffcd37;
break;
}
@@ -723,14 +760,14 @@ pm_pmgrop_pm2(pmdata)
/* receive number of PM data */
if (HwCfgFlags3 & 0x00020000) { /* PB Duo, PB 5XX */
if (pm_num_rx_data < 0) {
- if ((rval = pm_receive_pm2( &pm_data )) != 0)
+ if ((rval = pm_receive_pm2(&pm_data)) != 0)
break; /* timeout */
num_pm_data = pm_data;
} else
num_pm_data = pm_num_rx_data;
pmdata->num_data = num_pm_data;
} else { /* PB 1XX serias ? */
- if ((rval = pm_receive_pm2( &pm_data )) != 0)
+ if ((rval = pm_receive_pm2(&pm_data)) != 0)
break; /* timeout */
num_pm_data = pm_data;
pmdata->num_data = num_pm_data;
@@ -738,8 +775,8 @@ pm_pmgrop_pm2(pmdata)
/* receive PM data */
pm_buf = (u_char *)pmdata->r_buf;
- for( i=0; i<num_pm_data; i++ ) {
- if ((rval = pm_receive_pm2( &pm_data )) != 0)
+ for (i = 0; i < num_pm_data; i++) {
+ if ((rval = pm_receive_pm2(&pm_data)) != 0)
break; /* timeout */
pm_buf[i] = pm_data;
}
@@ -751,61 +788,56 @@ pm_pmgrop_pm2(pmdata)
via_reg(VIA1, vIER) = via1_vIER;
splx(s);
- return( rval );
+ return rval;
}
/*
* My PM interrupt routine for the PB Duo series and the PB 5XX series
*/
-void
-pm_intr_pm2(void)
+int
+pm_intr_pm2(void *arg)
{
- int s;
- int rval;
- PMData pmdata;
+ int s;
+ int rval;
+ PMData pmdata;
s = splhigh();
- PM_VIA_CLR_INTR(); /* clear VIA1 interrupt */
- /* ask PM what happend */
+ PM_VIA_CLR_INTR(); /* clear VIA1 interrupt */
+ /* ask PM what happend */
pmdata.command = 0x78;
pmdata.num_data = 0;
pmdata.s_buf = &pmdata.data[2];
pmdata.r_buf = &pmdata.data[2];
- rval = pm_pmgrop_pm2( &pmdata );
+ rval = pm_pmgrop_pm2(&pmdata);
if (rval != 0) {
-#ifdef PM_DEBUG
- printf( "pm: PM is not ready. error code: %08x\n", rval );
+#ifdef ADB_DEBUG
+ if (adb_debug)
+ printf("pm: PM is not ready. error code: %08x\n", rval);
#endif
splx(s);
- return;
}
- switch( (u_int)(pmdata.data[2] & 0xff) ) {
- case 0x00: /* 1 sec interrupt? */
- {
+ switch ((u_int)(pmdata.data[2] & 0xff)) {
+ case 0x00: /* 1 sec interrupt? */
break;
- }
- case 0x80: /* 1 sec interrupt? */
- {
+ case 0x80: /* 1 sec interrupt? */
pm_counter++;
break;
- }
- case 0x08: /* Brightness/Contrast button on LCD panel */
- {
+ case 0x08: /* Brightness/Contrast button on LCD panel */
/* get brightness and contrast of the LCD */
pm_LCD_brightness = (u_int)pmdata.data[3] & 0xff;
pm_LCD_contrast = (u_int)pmdata.data[4] & 0xff;
/*
- pm_printerr( "#08", rval, pmdata.num_data, pmdata.data );
+ pm_printerr("#08", rval, pmdata.num_data, pmdata.data);
pmdata.command = 0x33;
pmdata.num_data = 1;
pmdata.s_buf = pmdata.data;
pmdata.r_buf = pmdata.data;
pmdata.data[0] = pm_LCD_contrast;
- rval = pm_pmgrop_pm2( &pmdata );
- pm_printerr( "#33", rval, pmdata.num_data, pmdata.data );
+ rval = pm_pmgrop_pm2(&pmdata);
+ pm_printerr("#33", rval, pmdata.num_data, pmdata.data);
*/
/* this is an experimental code */
pmdata.command = 0x41;
@@ -813,33 +845,35 @@ pm_intr_pm2(void)
pmdata.s_buf = pmdata.data;
pmdata.r_buf = pmdata.data;
pm_LCD_brightness = 0x7f - pm_LCD_brightness / 2;
- if (pm_LCD_brightness < 0x25) pm_LCD_brightness = 0x25;
- if (pm_LCD_brightness > 0x5a) pm_LCD_brightness = 0x7f;
+ if (pm_LCD_brightness < 0x25)
+ pm_LCD_brightness = 0x25;
+ if (pm_LCD_brightness > 0x5a)
+ pm_LCD_brightness = 0x7f;
pmdata.data[0] = pm_LCD_brightness;
- rval = pm_pmgrop_pm2( &pmdata );
+ rval = pm_pmgrop_pm2(&pmdata);
break;
- }
- /* ADB data that were requested by TALK command */
- case 0x10:
+ case 0x10: /* ADB data that were requested by TALK command */
case 0x14:
pm_adb_get_TALK_result(&pmdata);
break;
- /* ADB device event */
- case 0x16:
+ case 0x16: /* ADB device event */
case 0x18:
case 0x1e:
pm_adb_get_ADB_data(&pmdata);
break;
default:
- {
-#ifdef PM_DEBUG
- pm_printerr( "driver does not supported this event.", pmdata.data[2], pmdata.num_data, pmdata.data );
+#ifdef ADB_DEBUG
+ if (adb_debug)
+ pm_printerr("driver does not supported this event.",
+ pmdata.data[2], pmdata.num_data,
+ pmdata.data);
#endif
- }
break;
}
splx(s);
+
+ return (1);
}
@@ -847,18 +881,17 @@ pm_intr_pm2(void)
* MRG-based PMgrOp routine
*/
int
-pm_pmgrop_mrg(pmdata)
- PMData *pmdata;
+pm_pmgrop_mrg(PMData *pmdata)
{
u_int32_t rval=0;
- asm("
- movl %1, a0
- .word 0xa085
- movl d0, %0"
+ __asm __volatile(
+ " movl %1,a0 \n"
+ " .word 0xa085 \n"
+ " movl d0,%0"
: "=g" (rval)
: "g" (pmdata)
- : "a0", "d0" );
+ : "a0","d0");
return rval;
}
@@ -868,23 +901,18 @@ pm_pmgrop_mrg(pmdata)
* My PMgrOp routine
*/
int
-pmgrop(pmdata)
- PMData *pmdata;
+pmgrop(PMData *pmdata)
{
- switch( pmHardware ) {
+ switch (pmHardware) {
case PM_HW_PB1XX:
- {
- return( pm_pmgrop_pm1(pmdata) );
+ return (pm_pmgrop_pm1(pmdata));
break;
- }
case PM_HW_PB5XX:
- {
- return( pm_pmgrop_pm2(pmdata) );
+ return (pm_pmgrop_pm2(pmdata));
break;
- }
default:
-/* return( pmgrop_mrg(pmdata) ); */
- return( -1 );
+ /* return (pmgrop_mrg(pmdata)); */
+ return 1;
}
}
@@ -893,44 +921,54 @@ pmgrop(pmdata)
* My PM interrupt routine
*/
void
-pm_intr(void)
+pm_intr(void *arg)
{
- switch( pmHardware ) {
+ switch (pmHardware) {
case PM_HW_PB1XX:
- {
- pm_intr_pm1();
+ pm_intr_pm1(arg);
break;
- }
case PM_HW_PB5XX:
- {
- pm_intr_pm2();
+ pm_intr_pm2(arg);
break;
- }
default:
break;
}
}
+void
+pm_hw_setup(void)
+{
+ switch (pmHardware) {
+ case PM_HW_PB1XX:
+ via1_register_irq(4, pm_intr_pm1, NULL, NULL);
+ PM_VIA_CLR_INTR();
+ break;
+ case PM_HW_PB5XX:
+ via1_register_irq(4, pm_intr_pm2, NULL, NULL);
+ PM_VIA_CLR_INTR();
+ break;
+ default:
+ break;
+ }
+}
+
/*
* Synchronous ADBOp routine for the Power Manager
*/
int
-pm_adb_op(buffer, compRout, data, command)
- u_char *buffer;
- void *compRout;
- void *data;
- int command;
+pm_adb_op(u_char *buffer, void *compRout, void *data, int command)
{
- int i,len;
- int s;
- int rval;
- int delay;
- PMData pmdata;
+ int i;
+ int s;
+ int rval;
+ int xdelay;
+ PMData pmdata;
+ struct adbCommand packet;
if (adbWaiting == 1)
- return( -1 );
+ return 1;
s = splhigh();
via_reg(VIA1, vIER) = 0x10;
@@ -955,46 +993,72 @@ pm_adb_op(buffer, compRout, data, command)
if ((command & 0xc) == 0x8) { /* if the command is LISTEN, copy ADB data to PM buffer */
if ((buffer != (u_char *)0) && (buffer[0] <= 24)) {
pmdata.data[2] = buffer[0]; /* number of data */
- for( i=0; i<buffer[0]; i++ )
+ for (i = 0; i < buffer[0]; i++)
pmdata.data[3 + i] = buffer[1 + i];
} else
pmdata.data[2] = 0;
} else
pmdata.data[2] = 0;
- rval = pmgrop( &pmdata );
- if (rval != 0)
- return( -1 );
+ if ((command & 0xc) != 0xc) { /* if the command is not TALK */
+ /* set up stuff fNULLor adb_pass_up */
+ packet.data[0] = 1 + pmdata.data[2];
+ packet.data[1] = command;
+ for (i = 0; i < pmdata.data[2]; i++)
+ packet.data[i+2] = pmdata.data[i+3];
+ packet.saveBuf = adbBuffer;
+ packet.compRout = adbCompRout;
+ packet.compData = adbCompData;
+ packet.cmd = command;
+ packet.unsol = 0;
+ packet.ack_only = 1;
+ adb_polling = 1;
+ adb_pass_up(&packet);
+ adb_polling = 0;
+ }
- if (adbWaiting == 0) {
- adbWaiting = 1;
- adbWaitingCmd = command;
+ rval = pmgrop(&pmdata);
+ if (rval != 0) {
+ splx(s);
+ return 1;
}
+ adbWaiting = 1;
+ adbWaitingCmd = command;
+
PM_VIA_INTR_ENABLE();
- /* wait until the PM interrupt is occurred */
- delay = 0x80000;
- while(adbWaiting == 1) {
- if ((via_reg(VIA1, vIFR) & 0x10) == 0x10)
- pm_intr();
+ /* wait until the PM interrupt has occurred */
+ xdelay = 0x80000;
+ while (adbWaiting == 1) {
+ switch (mac68k_machine.machineid) {
+ case MACH_MACPB150:
+ case MACH_MACPB210:
+ case MACH_MACPB230: /* daishi tested with Duo230 */
+ case MACH_MACPB250:
+ case MACH_MACPB270:
+ case MACH_MACPB280:
+ case MACH_MACPB280C:
+ case MACH_MACPB190:
+ case MACH_MACPB190CS:
+ pm_intr((void *)0);
+ break;
+ default:
+ if ((via_reg(VIA1, vIFR) & 0x10) == 0x10)
+ pm_intr((void *)0);
+ break;
+ }
#ifdef PM_GRAB_SI
- (void)intr_dispatch(0x70);
+ (void)intr_dispatch(0x70); /* grab any serial interrupts */
#endif
- if ((--delay) < 0)
- return( -1 );
- }
-
- if (buffer != (u_char *)0) {
- len = adbInputBuffer[3];
- for (i=0; i<=len; i++)
- buffer[i] = adbInputBuffer[3 + i];
- if (len < 0)
- buffer[0] = 0;
+ if ((--xdelay) < 0) {
+ splx(s);
+ return 1;
+ }
}
- /* this command enables the interrupt by operating ADB devices */
- if (HwCfgFlags3 & 0x00020000) { /* PB Duo series, PB 500 series */
+ /* this command enables the interrupt by operating ADB devices */
+ if (HwCfgFlags3 & 0x00020000) { /* PB Duo series, PB 5XX series */
pmdata.command = 0x20;
pmdata.num_data = 4;
pmdata.s_buf = pmdata.data;
@@ -1003,7 +1067,7 @@ pm_adb_op(buffer, compRout, data, command)
pmdata.data[1] = 0x86; /* magic spell for awaking the PM */
pmdata.data[2] = 0x00;
pmdata.data[3] = 0x0c; /* each bit may express the existent ADB device */
- } else { /* PB 100-series */
+ } else { /* PB 1XX series */
pmdata.command = 0x20;
pmdata.num_data = 3;
pmdata.s_buf = pmdata.data;
@@ -1012,64 +1076,60 @@ pm_adb_op(buffer, compRout, data, command)
pmdata.data[1] = 0x04;
pmdata.data[2] = 0x00;
}
- rval = pmgrop( &pmdata );
+ rval = pmgrop(&pmdata);
splx(s);
- return( rval );
+ return rval;
}
void
-pm_adb_get_TALK_result(pmdata)
- PMData *pmdata;
+pm_adb_get_TALK_result(PMData *pmdata)
{
int i;
- int rx_pm_adb_cmd;
-
- rx_pm_adb_cmd = (u_int)pmdata->data[3] & 0xff;
-
- pmdata->data[2] &= 0xf;
- pmdata->data[1] = pmdata->data[3];
- pmdata->data[3] = pmdata->num_data - 2;
-
- adbInputBuffer[0] = pmdata->num_data + 1;
- for( i=1; i<pmdata->num_data+2; i++ )
- adbInputBuffer[i] = pmdata->data[i];
-
- if ((adbWaiting == 1) && (rx_pm_adb_cmd == adbWaitingCmd)) {
- if (adbStarting == 0)
- adb_complete( &pmdata->data[3] , (long)0, adbWaitingCmd );
- adbWaitingCmd = 0x0;
-
- adbWaiting = 0;
- adb_comp_exec();
- adbBuffer = (long)0;
- adbCompRout = (long)0;
- adbCompData = (long)0;
- }
+ struct adbCommand packet;
+
+ /* set up data for adb_pass_up */
+ packet.data[0] = pmdata->num_data-1;
+ packet.data[1] = pmdata->data[3];
+ for (i = 0; i <packet.data[0]-1; i++)
+ packet.data[i+2] = pmdata->data[i+4];
+
+ packet.saveBuf = adbBuffer;
+ packet.compRout = adbCompRout;
+ packet.compData = adbCompData;
+ packet.unsol = 0;
+ packet.ack_only = 0;
+ adb_polling = 1;
+ adb_pass_up(&packet);
+ adb_polling = 0;
+
+ adbWaiting = 0;
+ adbBuffer = (long)0;
+ adbCompRout = (long)0;
+ adbCompData = (long)0;
}
void
-pm_adb_get_ADB_data(pmdata)
- PMData *pmdata;
+pm_adb_get_ADB_data(PMData *pmdata)
{
int i;
-
- i = (u_int)pmdata->data[3] & 0xff;
- pmdata->data[2] &= 0xf;
- pmdata->data[1] = pmdata->data[3];
- pmdata->data[3] = pmdata->num_data - 2;
-
- adbInputBuffer[0] = pmdata->num_data + 1;
- if (adbStarting == 0)
- adb_complete( &pmdata->data[3] , (long)0, i );
+ struct adbCommand packet;
+
+ /* set up data for adb_pass_up */
+ packet.data[0] = pmdata->num_data-1; /* number of raw data */
+ packet.data[1] = pmdata->data[3]; /* ADB command */
+ for (i = 0; i <packet.data[0]-1; i++)
+ packet.data[i+2] = pmdata->data[i+4];
+ packet.unsol = 1;
+ packet.ack_only = 0;
+ adb_pass_up(&packet);
}
void
-pm_adb_poll_next_device_pm1(pmdata)
- PMData *pmdata;
+pm_adb_poll_next_device_pm1(PMData *pmdata)
{
int i;
int ndid;
@@ -1078,8 +1138,8 @@ pm_adb_poll_next_device_pm1(pmdata)
PMData tmp_pmdata;
/* find another existent ADB device to poll */
- for( i=1; i<16; i++ ) {
- ndid = (((pmdata->data[3] & 0xf0) >> 4) + i) & 0xf;
+ for (i = 1; i < 16; i++) {
+ ndid = (ADB_CMDADDR(pmdata->data[3]) + i) & 0xf;
bendid <<= ndid;
if ((pm_existent_ADB_devices & bendid) != 0)
break;
@@ -1093,7 +1153,5 @@ pm_adb_poll_next_device_pm1(pmdata)
tmp_pmdata.data[0] = (u_char)(ndid << 4) | 0xc;
tmp_pmdata.data[1] = 0x04; /* magic spell for awaking the PM */
tmp_pmdata.data[2] = 0x00;
- rval = pmgrop( &tmp_pmdata );
+ rval = pmgrop(&tmp_pmdata);
}
-
-