m68k: Dispatch nvram_ops calls to Atari or Mac functions

A multi-platform kernel binary has to decide at run-time how to dispatch
the arch_nvram_ops calls. Add a platform-independent arch_nvram_ops
struct for this, to replace the atari-specific one.

Enable CONFIG_HAVE_ARCH_NVRAM_OPS for Macs.

Acked-by: Geert Uytterhoeven <geert@linux-m68k.org>
Tested-by: Stan Johnson <userm57@yahoo.com>
Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Finn Thain 2019-01-15 15:18:56 +11:00 committed by Greg Kroah-Hartman
parent 458c77f3de
commit d3b41b6bb4
6 changed files with 108 additions and 17 deletions

View File

@ -27,6 +27,7 @@ config MAC
bool "Macintosh support" bool "Macintosh support"
depends on MMU depends on MMU
select MMU_MOTOROLA if MMU select MMU_MOTOROLA if MMU
select HAVE_ARCH_NVRAM_OPS
help help
This option enables support for the Apple Macintosh series of This option enables support for the Apple Macintosh series of
computers (yes, there is experimental support now, at least for part computers (yes, there is experimental support now, at least for part

View File

@ -74,7 +74,7 @@ static void __nvram_set_checksum(void)
__nvram_write_byte(sum, ATARI_CKS_LOC + 1); __nvram_write_byte(sum, ATARI_CKS_LOC + 1);
} }
static long atari_nvram_set_checksum(void) long atari_nvram_set_checksum(void)
{ {
spin_lock_irq(&rtc_lock); spin_lock_irq(&rtc_lock);
__nvram_set_checksum(); __nvram_set_checksum();
@ -82,7 +82,7 @@ static long atari_nvram_set_checksum(void)
return 0; return 0;
} }
static long atari_nvram_initialize(void) long atari_nvram_initialize(void)
{ {
loff_t i; loff_t i;
@ -94,7 +94,7 @@ static long atari_nvram_initialize(void)
return 0; return 0;
} }
static ssize_t atari_nvram_read(char *buf, size_t count, loff_t *ppos) ssize_t atari_nvram_read(char *buf, size_t count, loff_t *ppos)
{ {
char *p = buf; char *p = buf;
loff_t i; loff_t i;
@ -112,7 +112,7 @@ static ssize_t atari_nvram_read(char *buf, size_t count, loff_t *ppos)
return p - buf; return p - buf;
} }
static ssize_t atari_nvram_write(char *buf, size_t count, loff_t *ppos) ssize_t atari_nvram_write(char *buf, size_t count, loff_t *ppos)
{ {
char *p = buf; char *p = buf;
loff_t i; loff_t i;
@ -131,22 +131,11 @@ static ssize_t atari_nvram_write(char *buf, size_t count, loff_t *ppos)
return p - buf; return p - buf;
} }
static ssize_t atari_nvram_get_size(void) ssize_t atari_nvram_get_size(void)
{ {
if (!MACH_IS_ATARI)
return -ENODEV;
return NVRAM_BYTES; return NVRAM_BYTES;
} }
const struct nvram_ops arch_nvram_ops = {
.read = atari_nvram_read,
.write = atari_nvram_write,
.get_size = atari_nvram_get_size,
.set_checksum = atari_nvram_set_checksum,
.initialize = atari_nvram_initialize,
};
EXPORT_SYMBOL(arch_nvram_ops);
#ifdef CONFIG_PROC_FS #ifdef CONFIG_PROC_FS
static struct { static struct {
unsigned char val; unsigned char val;

View File

@ -33,6 +33,12 @@ extern int atari_dont_touch_floppy_select;
extern int atari_SCC_reset_done; extern int atari_SCC_reset_done;
extern ssize_t atari_nvram_read(char *, size_t, loff_t *);
extern ssize_t atari_nvram_write(char *, size_t, loff_t *);
extern ssize_t atari_nvram_get_size(void);
extern long atari_nvram_set_checksum(void);
extern long atari_nvram_initialize(void);
/* convenience macros for testing machine type */ /* convenience macros for testing machine type */
#define MACH_IS_ST ((atari_mch_cookie >> 16) == ATARI_MCH_ST) #define MACH_IS_ST ((atari_mch_cookie >> 16) == ATARI_MCH_ST)
#define MACH_IS_STE ((atari_mch_cookie >> 16) == ATARI_MCH_STE && \ #define MACH_IS_STE ((atari_mch_cookie >> 16) == ATARI_MCH_STE && \

View File

@ -19,6 +19,10 @@ extern void mac_init_IRQ(void);
extern void mac_irq_enable(struct irq_data *data); extern void mac_irq_enable(struct irq_data *data);
extern void mac_irq_disable(struct irq_data *data); extern void mac_irq_disable(struct irq_data *data);
extern unsigned char mac_pram_read_byte(int);
extern void mac_pram_write_byte(unsigned char, int);
extern ssize_t mac_pram_get_size(void);
/* /*
* Macintosh Table * Macintosh Table
*/ */

View File

@ -24,6 +24,7 @@
#include <linux/proc_fs.h> #include <linux/proc_fs.h>
#include <linux/seq_file.h> #include <linux/seq_file.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/nvram.h>
#include <linux/initrd.h> #include <linux/initrd.h>
#include <asm/bootinfo.h> #include <asm/bootinfo.h>
@ -37,13 +38,14 @@
#ifdef CONFIG_AMIGA #ifdef CONFIG_AMIGA
#include <asm/amigahw.h> #include <asm/amigahw.h>
#endif #endif
#ifdef CONFIG_ATARI
#include <asm/atarihw.h> #include <asm/atarihw.h>
#ifdef CONFIG_ATARI
#include <asm/atari_stram.h> #include <asm/atari_stram.h>
#endif #endif
#ifdef CONFIG_SUN3X #ifdef CONFIG_SUN3X
#include <asm/dvma.h> #include <asm/dvma.h>
#endif #endif
#include <asm/macintosh.h>
#include <asm/natfeat.h> #include <asm/natfeat.h>
#if !FPSTATESIZE || !NR_IRQS #if !FPSTATESIZE || !NR_IRQS
@ -547,3 +549,81 @@ static int __init adb_probe_sync_enable (char *str) {
__setup("adb_sync", adb_probe_sync_enable); __setup("adb_sync", adb_probe_sync_enable);
#endif /* CONFIG_ADB */ #endif /* CONFIG_ADB */
#if IS_ENABLED(CONFIG_NVRAM)
#ifdef CONFIG_MAC
static unsigned char m68k_nvram_read_byte(int addr)
{
if (MACH_IS_MAC)
return mac_pram_read_byte(addr);
return 0xff;
}
static void m68k_nvram_write_byte(unsigned char val, int addr)
{
if (MACH_IS_MAC)
mac_pram_write_byte(val, addr);
}
#endif /* CONFIG_MAC */
#ifdef CONFIG_ATARI
static ssize_t m68k_nvram_read(char *buf, size_t count, loff_t *ppos)
{
if (MACH_IS_ATARI)
return atari_nvram_read(buf, count, ppos);
else if (MACH_IS_MAC)
return nvram_read_bytes(buf, count, ppos);
return -EINVAL;
}
static ssize_t m68k_nvram_write(char *buf, size_t count, loff_t *ppos)
{
if (MACH_IS_ATARI)
return atari_nvram_write(buf, count, ppos);
else if (MACH_IS_MAC)
return nvram_write_bytes(buf, count, ppos);
return -EINVAL;
}
static long m68k_nvram_set_checksum(void)
{
if (MACH_IS_ATARI)
return atari_nvram_set_checksum();
return -EINVAL;
}
static long m68k_nvram_initialize(void)
{
if (MACH_IS_ATARI)
return atari_nvram_initialize();
return -EINVAL;
}
#endif /* CONFIG_ATARI */
static ssize_t m68k_nvram_get_size(void)
{
if (MACH_IS_ATARI)
return atari_nvram_get_size();
else if (MACH_IS_MAC)
return mac_pram_get_size();
return -ENODEV;
}
/* Atari device drivers call .read (to get checksum validation) whereas
* Mac and PowerMac device drivers just use .read_byte.
*/
const struct nvram_ops arch_nvram_ops = {
#ifdef CONFIG_MAC
.read_byte = m68k_nvram_read_byte,
.write_byte = m68k_nvram_write_byte,
#endif
#ifdef CONFIG_ATARI
.read = m68k_nvram_read,
.write = m68k_nvram_write,
.set_checksum = m68k_nvram_set_checksum,
.initialize = m68k_nvram_initialize,
#endif
.get_size = m68k_nvram_get_size,
};
EXPORT_SYMBOL(arch_nvram_ops);
#endif /* CONFIG_NVRAM */

View File

@ -36,6 +36,7 @@
static void (*rom_reset)(void); static void (*rom_reset)(void);
#if IS_ENABLED(CONFIG_NVRAM)
#ifdef CONFIG_ADB_CUDA #ifdef CONFIG_ADB_CUDA
static unsigned char cuda_pram_read_byte(int offset) static unsigned char cuda_pram_read_byte(int offset)
{ {
@ -84,6 +85,7 @@ static void pmu_pram_write_byte(unsigned char data, int offset)
pmu_wait_complete(&req); pmu_wait_complete(&req);
} }
#endif /* CONFIG_ADB_PMU */ #endif /* CONFIG_ADB_PMU */
#endif /* CONFIG_NVRAM */
/* /*
* VIA PRAM/RTC access routines * VIA PRAM/RTC access routines
@ -205,6 +207,7 @@ static void via_rtc_command(int command, __u8 *data)
local_irq_restore(flags); local_irq_restore(flags);
} }
#if IS_ENABLED(CONFIG_NVRAM)
static unsigned char via_pram_read_byte(int offset) static unsigned char via_pram_read_byte(int offset)
{ {
unsigned char temp; unsigned char temp;
@ -227,6 +230,7 @@ static void via_pram_write_byte(unsigned char data, int offset)
temp = 0x55 | RTC_FLG_WRITE_PROTECT; temp = 0x55 | RTC_FLG_WRITE_PROTECT;
via_rtc_command(RTC_CMD_WRITE(RTC_REG_WRITE_PROTECT), &temp); via_rtc_command(RTC_CMD_WRITE(RTC_REG_WRITE_PROTECT), &temp);
} }
#endif /* CONFIG_NVRAM */
/* /*
* Return the current time in seconds since January 1, 1904. * Return the current time in seconds since January 1, 1904.
@ -372,6 +376,7 @@ static void cuda_shutdown(void)
*------------------------------------------------------------------- *-------------------------------------------------------------------
*/ */
#if IS_ENABLED(CONFIG_NVRAM)
unsigned char mac_pram_read_byte(int addr) unsigned char mac_pram_read_byte(int addr)
{ {
switch (macintosh_config->adb_type) { switch (macintosh_config->adb_type) {
@ -417,6 +422,12 @@ void mac_pram_write_byte(unsigned char val, int addr)
} }
} }
ssize_t mac_pram_get_size(void)
{
return 256;
}
#endif /* CONFIG_NVRAM */
void mac_poweroff(void) void mac_poweroff(void)
{ {
if (oss_present) { if (oss_present) {