Commit 968e75fc authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/geert/linux-m68k

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/geert/linux-m68k:
  m68k/math-emu: Remove unnecessary code
  m68k/math-emu: Remove commented out old code
  m68k: Kill warning in setup_arch() when compiling for Sun3
  m68k/atari: Prefix GPIO_{IN,OUT} with CODEC_
  sparc: iounmap() and *_free_coherent() - Use lookup_resource()
  m68k/atari: Reserve some ST-RAM early on for device buffer use
  m68k/amiga: Chip RAM - Use lookup_resource()
  resources: Add lookup_resource()
  sparc: _sparc_find_resource() should check for exact matches
  m68k/amiga: Chip RAM - Offset resource end by CHIP_PHYSADDR
  m68k/amiga: Chip RAM - Use resource_size() to fix off-by-one error
  m68k/amiga: Chip RAM - Change chipavail to an atomic_t
  m68k/amiga: Chip RAM - Always allocate from the start of memory
  m68k/amiga: Chip RAM - Convert from printk() to pr_*()
  m68k/amiga: Chip RAM - Use tabs for indentation
parents a00ed25c d3690f8b
...@@ -372,12 +372,6 @@ config AMIGA_PCMCIA ...@@ -372,12 +372,6 @@ config AMIGA_PCMCIA
Include support in the kernel for pcmcia on Amiga 1200 and Amiga Include support in the kernel for pcmcia on Amiga 1200 and Amiga
600. If you intend to use pcmcia cards say Y; otherwise say N. 600. If you intend to use pcmcia cards say Y; otherwise say N.
config STRAM_PROC
bool "ST-RAM statistics in /proc"
depends on ATARI
help
Say Y here to report ST-RAM usage statistics in /proc/stram.
config HEARTBEAT config HEARTBEAT
bool "Use power LED as a heartbeat" if AMIGA || APOLLO || ATARI || MAC ||Q40 bool "Use power LED as a heartbeat" if AMIGA || APOLLO || ATARI || MAC ||Q40
default y if !AMIGA && !APOLLO && !ATARI && !MAC && !Q40 && HP300 default y if !AMIGA && !APOLLO && !ATARI && !MAC && !Q40 && HP300
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
#include <linux/string.h> #include <linux/string.h>
#include <linux/module.h> #include <linux/module.h>
#include <asm/atomic.h>
#include <asm/page.h> #include <asm/page.h>
#include <asm/amigahw.h> #include <asm/amigahw.h>
...@@ -25,7 +26,7 @@ EXPORT_SYMBOL(amiga_chip_size); ...@@ -25,7 +26,7 @@ EXPORT_SYMBOL(amiga_chip_size);
static struct resource chipram_res = { static struct resource chipram_res = {
.name = "Chip RAM", .start = CHIP_PHYSADDR .name = "Chip RAM", .start = CHIP_PHYSADDR
}; };
static unsigned long chipavail; static atomic_t chipavail;
void __init amiga_chip_init(void) void __init amiga_chip_init(void)
...@@ -33,101 +34,90 @@ void __init amiga_chip_init(void) ...@@ -33,101 +34,90 @@ void __init amiga_chip_init(void)
if (!AMIGAHW_PRESENT(CHIP_RAM)) if (!AMIGAHW_PRESENT(CHIP_RAM))
return; return;
chipram_res.end = amiga_chip_size-1; chipram_res.end = CHIP_PHYSADDR + amiga_chip_size - 1;
request_resource(&iomem_resource, &chipram_res); request_resource(&iomem_resource, &chipram_res);
chipavail = amiga_chip_size; atomic_set(&chipavail, amiga_chip_size);
} }
void *amiga_chip_alloc(unsigned long size, const char *name) void *amiga_chip_alloc(unsigned long size, const char *name)
{ {
struct resource *res; struct resource *res;
void *p;
/* round up */
size = PAGE_ALIGN(size);
#ifdef DEBUG
printk("amiga_chip_alloc: allocate %ld bytes\n", size);
#endif
res = kzalloc(sizeof(struct resource), GFP_KERNEL); res = kzalloc(sizeof(struct resource), GFP_KERNEL);
if (!res) if (!res)
return NULL; return NULL;
res->name = name;
if (allocate_resource(&chipram_res, res, size, 0, UINT_MAX, PAGE_SIZE, NULL, NULL) < 0) { res->name = name;
p = amiga_chip_alloc_res(size, res);
if (!p) {
kfree(res); kfree(res);
return NULL; return NULL;
} }
chipavail -= size;
#ifdef DEBUG return p;
printk("amiga_chip_alloc: returning %lx\n", res->start);
#endif
return (void *)ZTWO_VADDR(res->start);
} }
EXPORT_SYMBOL(amiga_chip_alloc); EXPORT_SYMBOL(amiga_chip_alloc);
/* /*
* Warning: * Warning:
* amiga_chip_alloc_res is meant only for drivers that need to allocate * amiga_chip_alloc_res is meant only for drivers that need to
* Chip RAM before kmalloc() is functional. As a consequence, those * allocate Chip RAM before kmalloc() is functional. As a consequence,
* drivers must not free that Chip RAM afterwards. * those drivers must not free that Chip RAM afterwards.
*/ */
void * __init amiga_chip_alloc_res(unsigned long size, struct resource *res) void *amiga_chip_alloc_res(unsigned long size, struct resource *res)
{ {
unsigned long start; int error;
/* round up */ /* round up */
size = PAGE_ALIGN(size); size = PAGE_ALIGN(size);
/* dmesg into chipmem prefers memory at the safe end */
start = CHIP_PHYSADDR + chipavail - size; pr_debug("amiga_chip_alloc_res: allocate %lu bytes\n", size);
error = allocate_resource(&chipram_res, res, size, 0, UINT_MAX,
#ifdef DEBUG PAGE_SIZE, NULL, NULL);
printk("amiga_chip_alloc_res: allocate %ld bytes\n", size); if (error < 0) {
#endif pr_err("amiga_chip_alloc_res: allocate_resource() failed %d!\n",
if (allocate_resource(&chipram_res, res, size, start, UINT_MAX, PAGE_SIZE, NULL, NULL) < 0) { error);
printk("amiga_chip_alloc_res: first alloc failed!\n");
if (allocate_resource(&chipram_res, res, size, 0, UINT_MAX, PAGE_SIZE, NULL, NULL) < 0)
return NULL; return NULL;
} }
chipavail -= size;
#ifdef DEBUG atomic_sub(size, &chipavail);
printk("amiga_chip_alloc_res: returning %lx\n", res->start); pr_debug("amiga_chip_alloc_res: returning %pR\n", res);
#endif
return (void *)ZTWO_VADDR(res->start); return (void *)ZTWO_VADDR(res->start);
} }
void amiga_chip_free(void *ptr) void amiga_chip_free(void *ptr)
{ {
unsigned long start = ZTWO_PADDR(ptr); unsigned long start = ZTWO_PADDR(ptr);
struct resource **p, *res; struct resource *res;
unsigned long size; unsigned long size;
for (p = &chipram_res.child; (res = *p); p = &res->sibling) { res = lookup_resource(&chipram_res, start);
if (res->start != start) if (!res) {
continue; pr_err("amiga_chip_free: trying to free nonexistent region at "
*p = res->sibling; "%p\n", ptr);
size = res->end-start;
#ifdef DEBUG
printk("amiga_chip_free: free %ld bytes at %p\n", size, ptr);
#endif
chipavail += size;
kfree(res);
return; return;
} }
printk("amiga_chip_free: trying to free nonexistent region at %p\n", ptr);
size = resource_size(res);
pr_debug("amiga_chip_free: free %lu bytes at %p\n", size, ptr);
atomic_add(size, &chipavail);
release_resource(res);
kfree(res);
} }
EXPORT_SYMBOL(amiga_chip_free); EXPORT_SYMBOL(amiga_chip_free);
unsigned long amiga_chip_avail(void) unsigned long amiga_chip_avail(void)
{ {
#ifdef DEBUG unsigned long n = atomic_read(&chipavail);
printk("amiga_chip_avail : %ld bytes\n", chipavail);
#endif pr_debug("amiga_chip_avail : %lu bytes\n", n);
return chipavail; return n;
} }
EXPORT_SYMBOL(amiga_chip_avail); EXPORT_SYMBOL(amiga_chip_avail);
This diff is collapsed.
...@@ -6,12 +6,11 @@ ...@@ -6,12 +6,11 @@
*/ */
/* public interface */ /* public interface */
void *atari_stram_alloc(long size, const char *owner); void *atari_stram_alloc(unsigned long size, const char *owner);
void atari_stram_free(void *); void atari_stram_free(void *);
/* functions called internally by other parts of the kernel */ /* functions called internally by other parts of the kernel */
void atari_stram_init(void); void atari_stram_init(void);
void atari_stram_reserve_pages(void *start_mem); void atari_stram_reserve_pages(void *start_mem);
void atari_stram_mem_init_hook (void);
#endif /*_M68K_ATARI_STRAM_H */ #endif /*_M68K_ATARI_STRAM_H */
...@@ -399,8 +399,8 @@ struct CODEC ...@@ -399,8 +399,8 @@ struct CODEC
#define CODEC_OVERFLOW_LEFT 2 #define CODEC_OVERFLOW_LEFT 2
u_char unused2, unused3, unused4, unused5; u_char unused2, unused3, unused4, unused5;
u_char gpio_directions; u_char gpio_directions;
#define GPIO_IN 0 #define CODEC_GPIO_IN 0
#define GPIO_OUT 1 #define CODEC_GPIO_OUT 1
u_char unused6; u_char unused6;
u_char gpio_data; u_char gpio_data;
}; };
......
...@@ -216,7 +216,9 @@ static void __init m68k_parse_bootinfo(const struct bi_record *record) ...@@ -216,7 +216,9 @@ static void __init m68k_parse_bootinfo(const struct bi_record *record)
void __init setup_arch(char **cmdline_p) void __init setup_arch(char **cmdline_p)
{ {
#ifndef CONFIG_SUN3
int i; int i;
#endif
/* The bootinfo is located right after the kernel bss */ /* The bootinfo is located right after the kernel bss */
m68k_parse_bootinfo((const struct bi_record *)_end); m68k_parse_bootinfo((const struct bi_record *)_end);
......
...@@ -105,9 +105,6 @@ fp_fetoxm1(struct fp_ext *dest, struct fp_ext *src) ...@@ -105,9 +105,6 @@ fp_fetoxm1(struct fp_ext *dest, struct fp_ext *src)
fp_monadic_check(dest, src); fp_monadic_check(dest, src);
if (IS_ZERO(dest))
return dest;
return dest; return dest;
} }
......
This diff is collapsed.
...@@ -83,11 +83,6 @@ void __init mem_init(void) ...@@ -83,11 +83,6 @@ void __init mem_init(void)
int initpages = 0; int initpages = 0;
int i; int i;
#ifdef CONFIG_ATARI
if (MACH_IS_ATARI)
atari_stram_mem_init_hook();
#endif
/* this will put all memory onto the freelists */ /* this will put all memory onto the freelists */
totalram_pages = num_physpages = 0; totalram_pages = num_physpages = 0;
for_each_online_pgdat(pgdat) { for_each_online_pgdat(pgdat) {
......
...@@ -65,9 +65,6 @@ static inline void dma_make_coherent(unsigned long pa, unsigned long len) ...@@ -65,9 +65,6 @@ static inline void dma_make_coherent(unsigned long pa, unsigned long len)
} }
#endif #endif
static struct resource *_sparc_find_resource(struct resource *r,
unsigned long);
static void __iomem *_sparc_ioremap(struct resource *res, u32 bus, u32 pa, int sz); static void __iomem *_sparc_ioremap(struct resource *res, u32 bus, u32 pa, int sz);
static void __iomem *_sparc_alloc_io(unsigned int busno, unsigned long phys, static void __iomem *_sparc_alloc_io(unsigned int busno, unsigned long phys,
unsigned long size, char *name); unsigned long size, char *name);
...@@ -143,7 +140,11 @@ void iounmap(volatile void __iomem *virtual) ...@@ -143,7 +140,11 @@ void iounmap(volatile void __iomem *virtual)
unsigned long vaddr = (unsigned long) virtual & PAGE_MASK; unsigned long vaddr = (unsigned long) virtual & PAGE_MASK;
struct resource *res; struct resource *res;
if ((res = _sparc_find_resource(&sparc_iomap, vaddr)) == NULL) { /*
* XXX Too slow. Can have 8192 DVMA pages on sun4m in the worst case.
* This probably warrants some sort of hashing.
*/
if ((res = lookup_resource(&sparc_iomap, vaddr)) == NULL) {
printk("free_io/iounmap: cannot free %lx\n", vaddr); printk("free_io/iounmap: cannot free %lx\n", vaddr);
return; return;
} }
...@@ -319,7 +320,7 @@ static void sbus_free_coherent(struct device *dev, size_t n, void *p, ...@@ -319,7 +320,7 @@ static void sbus_free_coherent(struct device *dev, size_t n, void *p,
struct resource *res; struct resource *res;
struct page *pgv; struct page *pgv;
if ((res = _sparc_find_resource(&_sparc_dvma, if ((res = lookup_resource(&_sparc_dvma,
(unsigned long)p)) == NULL) { (unsigned long)p)) == NULL) {
printk("sbus_free_consistent: cannot free %p\n", p); printk("sbus_free_consistent: cannot free %p\n", p);
return; return;
...@@ -492,7 +493,7 @@ static void pci32_free_coherent(struct device *dev, size_t n, void *p, ...@@ -492,7 +493,7 @@ static void pci32_free_coherent(struct device *dev, size_t n, void *p,
{ {
struct resource *res; struct resource *res;
if ((res = _sparc_find_resource(&_sparc_dvma, if ((res = lookup_resource(&_sparc_dvma,
(unsigned long)p)) == NULL) { (unsigned long)p)) == NULL) {
printk("pci_free_consistent: cannot free %p\n", p); printk("pci_free_consistent: cannot free %p\n", p);
return; return;
...@@ -715,25 +716,6 @@ static const struct file_operations sparc_io_proc_fops = { ...@@ -715,25 +716,6 @@ static const struct file_operations sparc_io_proc_fops = {
}; };
#endif /* CONFIG_PROC_FS */ #endif /* CONFIG_PROC_FS */
/*
* This is a version of find_resource and it belongs to kernel/resource.c.
* Until we have agreement with Linus and Martin, it lingers here.
*
* XXX Too slow. Can have 8192 DVMA pages on sun4m in the worst case.
* This probably warrants some sort of hashing.
*/
static struct resource *_sparc_find_resource(struct resource *root,
unsigned long hit)
{
struct resource *tmp;
for (tmp = root->child; tmp != 0; tmp = tmp->sibling) {
if (tmp->start <= hit && tmp->end >= hit)
return tmp;
}
return NULL;
}
static void register_proc_sparc_ioport(void) static void register_proc_sparc_ioport(void)
{ {
#ifdef CONFIG_PROC_FS #ifdef CONFIG_PROC_FS
......
...@@ -162,6 +162,7 @@ extern int allocate_resource(struct resource *root, struct resource *new, ...@@ -162,6 +162,7 @@ extern int allocate_resource(struct resource *root, struct resource *new,
resource_size_t, resource_size_t,
resource_size_t), resource_size_t),
void *alignf_data); void *alignf_data);
struct resource *lookup_resource(struct resource *root, resource_size_t start);
int adjust_resource(struct resource *res, resource_size_t start, int adjust_resource(struct resource *res, resource_size_t start,
resource_size_t size); resource_size_t size);
resource_size_t resource_alignment(struct resource *res); resource_size_t resource_alignment(struct resource *res);
......
...@@ -553,6 +553,27 @@ int allocate_resource(struct resource *root, struct resource *new, ...@@ -553,6 +553,27 @@ int allocate_resource(struct resource *root, struct resource *new,
EXPORT_SYMBOL(allocate_resource); EXPORT_SYMBOL(allocate_resource);
/**
* lookup_resource - find an existing resource by a resource start address
* @root: root resource descriptor
* @start: resource start address
*
* Returns a pointer to the resource if found, NULL otherwise
*/
struct resource *lookup_resource(struct resource *root, resource_size_t start)
{
struct resource *res;
read_lock(&resource_lock);
for (res = root->child; res; res = res->sibling) {
if (res->start == start)
break;
}
read_unlock(&resource_lock);
return res;
}
/* /*
* Insert a resource into the resource tree. If successful, return NULL, * Insert a resource into the resource tree. If successful, return NULL,
* otherwise return the conflicting resource (compare to __request_resource()) * otherwise return the conflicting resource (compare to __request_resource())
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment