Skip to content

Commit

Permalink
m68k/mac: Fix PRAM accessors
Browse files Browse the repository at this point in the history
PMU-based m68k Macs pre-date PowerMac-style NVRAM. Use the appropriate
PMU commands. Also implement the missing XPRAM accessors for VIA-based
Macs.

Acked-by: Geert Uytterhoeven <[email protected]>
Tested-by: Stan Johnson <[email protected]>
Signed-off-by: Finn Thain <[email protected]>
Signed-off-by: Greg Kroah-Hartman <[email protected]>
  • Loading branch information
Finn Thain authored and gregkh committed Jan 22, 2019
1 parent a71fa0e commit aefcb74
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 10 deletions.
43 changes: 33 additions & 10 deletions arch/m68k/mac/misc.c
Original file line number Diff line number Diff line change
Expand Up @@ -66,23 +66,22 @@ static unsigned char pmu_pram_read_byte(int offset)
{
struct adb_request req;

if (pmu_request(&req, NULL, 3, PMU_READ_NVRAM,
(offset >> 8) & 0xFF, offset & 0xFF) < 0)
if (pmu_request(&req, NULL, 3, PMU_READ_XPRAM,
offset & 0xFF, 1) < 0)
return 0;
while (!req.complete)
pmu_poll();
return req.reply[3];
pmu_wait_complete(&req);

return req.reply[0];
}

static void pmu_pram_write_byte(unsigned char data, int offset)
{
struct adb_request req;

if (pmu_request(&req, NULL, 4, PMU_WRITE_NVRAM,
(offset >> 8) & 0xFF, offset & 0xFF, data) < 0)
if (pmu_request(&req, NULL, 4, PMU_WRITE_XPRAM,
offset & 0xFF, 1, data) < 0)
return;
while (!req.complete)
pmu_poll();
pmu_wait_complete(&req);
}
#endif /* CONFIG_ADB_PMU */

Expand Down Expand Up @@ -151,6 +150,16 @@ static void via_rtc_send(__u8 data)
#define RTC_REG_SECONDS_3 3
#define RTC_REG_WRITE_PROTECT 13

/*
* Inside Mac has no information about two-byte RTC commands but
* the MAME/MESS source code has the essentials.
*/

#define RTC_REG_XPRAM 14
#define RTC_CMD_XPRAM_READ (RTC_CMD_READ(RTC_REG_XPRAM) << 8)
#define RTC_CMD_XPRAM_WRITE (RTC_CMD_WRITE(RTC_REG_XPRAM) << 8)
#define RTC_CMD_XPRAM_ARG(a) (((a & 0xE0) << 3) | ((a & 0x1F) << 2))

/*
* Execute a VIA PRAM/RTC command. For read commands
* data should point to a one-byte buffer for the
Expand Down Expand Up @@ -198,11 +207,25 @@ static void via_rtc_command(int command, __u8 *data)

static unsigned char via_pram_read_byte(int offset)
{
return 0;
unsigned char temp;

via_rtc_command(RTC_CMD_XPRAM_READ | RTC_CMD_XPRAM_ARG(offset), &temp);

return temp;
}

static void via_pram_write_byte(unsigned char data, int offset)
{
unsigned char temp;

temp = 0x55;
via_rtc_command(RTC_CMD_WRITE(RTC_REG_WRITE_PROTECT), &temp);

temp = data;
via_rtc_command(RTC_CMD_XPRAM_WRITE | RTC_CMD_XPRAM_ARG(offset), &temp);

temp = 0x55 | RTC_FLG_WRITE_PROTECT;
via_rtc_command(RTC_CMD_WRITE(RTC_REG_WRITE_PROTECT), &temp);
}

/*
Expand Down
2 changes: 2 additions & 0 deletions include/uapi/linux/pmu.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,9 @@
#define PMU_POWER_CTRL 0x11 /* control power of some devices */
#define PMU_ADB_CMD 0x20 /* send ADB packet */
#define PMU_ADB_POLL_OFF 0x21 /* disable ADB auto-poll */
#define PMU_WRITE_XPRAM 0x32 /* write eXtended Parameter RAM */
#define PMU_WRITE_NVRAM 0x33 /* write non-volatile RAM */
#define PMU_READ_XPRAM 0x3a /* read eXtended Parameter RAM */
#define PMU_READ_NVRAM 0x3b /* read non-volatile RAM */
#define PMU_SET_RTC 0x30 /* set real-time clock */
#define PMU_READ_RTC 0x38 /* read real-time clock */
Expand Down

0 comments on commit aefcb74

Please sign in to comment.