source: trunk/target/linux/adm5120/patches-2.6.32/400-revert-mips-machine-update.patch @ 21673

Last change on this file since 21673 was 21673, checked in by juhosg, 6 years ago

generic: merge mips multi machine update to generic patches for 2.6.32

File size: 6.3 KB
  • arch/mips/include/asm/mips_machine.h

    a b  
    11/* 
    2  *  Copyright (C) 2008-2010 Gabor Juhos <juhosg@openwrt.org> 
     2 *  Copyright (C) 2008-2009 Gabor Juhos <juhosg@openwrt.org> 
    33 * 
    44 *  This program is free software; you can redistribute it and/or modify it 
    55 *  under the terms of the GNU General Public License version 2 as published 
     
    1313#include <linux/init.h> 
    1414#include <linux/list.h> 
    1515 
    16 #include <asm/bootinfo.h> 
    17  
    1816struct mips_machine { 
    1917        unsigned long           mach_type; 
    20         const char              *mach_id; 
    21         const char              *mach_name; 
    2218        void                    (*mach_setup)(void); 
     19        char                    *mach_name; 
     20        struct list_head        list; 
    2321}; 
    2422 
    25 #define MIPS_MACHINE(_type, _id, _name, _setup)                 \ 
    26 static const char machine_name_##_type[] __initconst            \ 
    27                         __aligned(1) = _name;                   \ 
    28 static const char machine_id_##_type[] __initconst              \ 
    29                         __aligned(1) = _id;                     \ 
    30 static struct mips_machine machine_##_type                      \ 
    31                 __used __section(.mips.machines.init) =         \ 
     23void mips_machine_register(struct mips_machine *) __init; 
     24void mips_machine_setup(unsigned long machtype) __init; 
     25void mips_machine_set_name(char *name) __init; 
     26 
     27extern char *mips_machine_name; 
     28 
     29#define MIPS_MACHINE(_type, _name, _setup)                      \ 
     30static char machine_name_##_type[] __initdata = _name;          \ 
     31static struct mips_machine machine_##_type __initdata =         \ 
    3232{                                                               \ 
    3333        .mach_type      = _type,                                \ 
    34         .mach_id        = machine_id_##_type,                   \ 
    3534        .mach_name      = machine_name_##_type,                 \ 
    3635        .mach_setup     = _setup,                               \ 
    37 }; 
    38  
    39 extern long __mips_machines_start; 
    40 extern long __mips_machines_end; 
    41  
    42 #ifdef CONFIG_MIPS_MACHINE 
    43 int  mips_machtype_setup(char *id) __init; 
    44 void mips_machine_setup(void) __init; 
    45 void mips_set_machine_name(const char *name) __init; 
    46 char *mips_get_machine_name(void); 
    47 #else 
    48 static inline int mips_machtype_setup(char *id) { return 1; } 
    49 static inline void mips_machine_setup(void) { } 
    50 static inline void mips_set_machine_name(const char *name) { } 
    51 static inline char *mips_get_machine_name(void) { return NULL; } 
    52 #endif /* CONFIG_MIPS_MACHINE */ 
     36};                                                              \ 
     37                                                                \ 
     38static int __init register_machine_##_type(void)                \ 
     39{                                                               \ 
     40        mips_machine_register(&machine_##_type);                \ 
     41        return 0;                                               \ 
     42}                                                               \ 
     43                                                                \ 
     44pure_initcall(register_machine_##_type) 
    5345 
    5446#endif /* __ASM_MIPS_MACHINE_H */ 
     47 
  • arch/mips/kernel/mips_machine.c

    a b  
    11/* 
    2  *  Copyright (C) 2008-2010 Gabor Juhos <juhosg@openwrt.org> 
     2 *  Copyright (C) 2008-2009 Gabor Juhos <juhosg@openwrt.org> 
    33 * 
    44 *  This program is free software; you can redistribute it and/or modify it 
    55 *  under the terms of the GNU General Public License version 2 as published 
     
    77 * 
    88 */ 
    99#include <linux/mm.h> 
    10 #include <linux/string.h> 
    11 #include <linux/slab.h> 
    1210 
    1311#include <asm/mips_machine.h> 
     12#include <asm/bootinfo.h> 
    1413 
    15 static struct mips_machine *mips_machine __initdata; 
    16 static char *mips_machine_name = "Unknown"; 
     14static struct list_head mips_machines __initdata = 
     15                LIST_HEAD_INIT(mips_machines); 
    1716 
    18 #define for_each_machine(mach) \ 
    19         for ((mach) = (struct mips_machine *)&__mips_machines_start; \ 
    20              (mach) && \ 
    21              (unsigned long)(mach) < (unsigned long)&__mips_machines_end; \ 
    22              (mach)++) 
     17char *mips_machine_name = "Unknown"; 
    2318 
    24 __init void mips_set_machine_name(const char *name) 
     19static struct mips_machine * __init mips_machine_find(unsigned long machtype) 
    2520{ 
    26         char *p; 
     21        struct list_head *this; 
    2722 
    28         if (name == NULL) 
    29                 return; 
     23        list_for_each(this, &mips_machines) { 
     24                struct mips_machine *mach; 
    3025 
    31         p = kstrdup(name, GFP_KERNEL); 
    32         if (!p) 
    33                 pr_err("MIPS: no memory for machine_name\n"); 
     26                mach = list_entry(this, struct mips_machine, list); 
     27                if (mach->mach_type == machtype) 
     28                        return mach; 
     29        } 
    3430 
    35         mips_machine_name = p; 
     31        return NULL; 
    3632} 
    3733 
    38 char *mips_get_machine_name(void) 
     34void __init mips_machine_register(struct mips_machine *mach) 
    3935{ 
    40         return mips_machine_name; 
     36        list_add_tail(&mach->list, &mips_machines); 
    4137} 
    4238 
    43 __init int mips_machtype_setup(char *id) 
     39void __init mips_machine_set_name(char *name) 
    4440{ 
    45         struct mips_machine *mach; 
     41        unsigned int len; 
     42        char *p; 
    4643 
    47         for_each_machine(mach) { 
    48                 if (mach->mach_id == NULL) 
    49                         continue; 
    50  
    51                 if (strcmp(mach->mach_id, id) == 0) { 
    52                         mips_machine = mach; 
    53                         break; 
    54                 } 
    55         } 
     44        if (name == NULL) 
     45                return; 
    5646 
    57         if (!mips_machine) { 
    58                 pr_err("MIPS: no machine found for id '%s', supported machines:\n", 
    59                        id); 
    60                 pr_err("%32s %s\n", "id", "name"); 
    61                 for_each_machine(mach) 
    62                         pr_err("%32s %s\n", mach->mach_id, mach->mach_name); 
    63                 return 1; 
     47        len = strlen(name); 
     48        p = kmalloc(len + 1, GFP_KERNEL); 
     49        if (p) { 
     50                strncpy(p, name, len); 
     51                p[len] = '\0'; 
     52                mips_machine_name = p; 
     53        } else { 
     54                printk(KERN_WARNING "MIPS: no memory for machine_name\n"); 
    6455        } 
    65  
    66         mips_machtype = mips_machine->mach_type; 
    67  
    68         return 0; 
    6956} 
    7057 
    71 __setup("machtype=", mips_machtype_setup); 
    72  
    73 __init void mips_machine_setup(void) 
     58void __init mips_machine_setup(unsigned long machtype) 
    7459{ 
    75         if (!mips_machine) 
     60        struct mips_machine *mach; 
     61 
     62        mach = mips_machine_find(machtype); 
     63        if (!mach) { 
     64                printk(KERN_ALERT "MIPS: no machine registered for " 
     65                        "machtype %lu\n", machtype); 
    7666                return; 
     67        } 
    7768 
    78         mips_set_machine_name(mips_machine->mach_name); 
    79         pr_info("MIPS: machine is %s\n", mips_machine_name); 
     69        mips_machine_set_name(mach->mach_name); 
     70        printk(KERN_INFO "MIPS: machine is %s\n", mips_machine_name); 
    8071 
    81         if (mips_machine->mach_setup) 
    82                 mips_machine->mach_setup(); 
     72        if (mach->mach_setup) 
     73                mach->mach_setup(); 
    8374} 
  • arch/mips/kernel/proc.c

    a b static int show_cpuinfo(struct seq_file  
    3434         */ 
    3535        if (n == 0) { 
    3636                seq_printf(m, "system type\t\t: %s\n", get_system_type()); 
    37                 if (mips_get_machine_name()) 
    38                         seq_printf(m, "machine\t\t\t: %s\n", 
    39                                    mips_get_machine_name()); 
     37#ifdef CONFIG_MIPS_MACHINE 
     38                seq_printf(m, "machine\t\t\t: %s\n", mips_machine_name); 
     39#endif 
    4040        } 
    4141 
    4242        seq_printf(m, "processor\t\t: %ld\n", n); 
  • arch/mips/kernel/vmlinux.lds.S

    a b SECTIONS 
    9797        INIT_TEXT_SECTION(PAGE_SIZE) 
    9898        INIT_DATA_SECTION(16) 
    9999 
    100         . = ALIGN(4); 
    101         .mips.machines.init : AT(ADDR(.mips.machines.init) - LOAD_OFFSET) { 
    102                 __mips_machines_start = .; 
    103                 *(.mips.machines.init) 
    104                 __mips_machines_end = .; 
    105         } 
    106  
    107100        /* .exit.text is discarded at runtime, not link time, to deal with 
    108101         * references from .rodata 
    109102         */ 
Note: See TracBrowser for help on using the repository browser.