114e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen/* 214e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen * Soekris board support code 314e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen * 414e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen * Copyright (C) 2008-2009 Tower Technologies 514e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen * Written by Alessandro Zummo <a.zummo@towertech.it> 614e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen * 714e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen * This program is free software; you can redistribute it and/or modify 814e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen * it under the terms of the GNU General Public License version 2 914e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen * as published by the Free Software Foundation. 1014e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen */ 1114e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen 1214e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen#include <linux/kernel.h> 1314e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen#include <linux/init.h> 1414e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen#include <linux/io.h> 1514e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen#include <linux/string.h> 1614e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen#include <linux/leds.h> 1714e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen#include <linux/platform_device.h> 1814e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen#include <linux/gpio.h> 1954f4dedb5368fff81b722b551e2f15a75175d7b7Paul Gortmaker#include <linux/module.h> 2014e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen 2114e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen#include <asm/geode.h> 2214e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen 239517f925f2eb9ffca78b3f0f9389fc675bcb572cUwe Kleine-Königstatic const struct gpio_led net5501_leds[] = { 2414e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen { 2514e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen .name = "error", 2614e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen .gpio = 6, 2714e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen .default_trigger = "default-on", 2814e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen }, 2914e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen}; 3014e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen 3114e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersenstatic struct gpio_led_platform_data net5501_leds_data = { 3214e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen .num_leds = ARRAY_SIZE(net5501_leds), 3314e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen .leds = net5501_leds, 3414e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen}; 3514e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen 3614e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersenstatic struct platform_device net5501_leds_dev = { 3714e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen .name = "leds-gpio", 3814e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen .id = -1, 3914e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen .dev.platform_data = &net5501_leds_data, 4014e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen}; 4114e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen 4214e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersenstatic void __init init_net5501(void) 4314e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen{ 4414e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen platform_device_register(&net5501_leds_dev); 4514e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen} 4614e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen 4714e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersenstruct soekris_board { 4814e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen u16 offset; 4914e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen char *sig; 5014e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen u8 len; 5114e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen void (*init)(void); 5214e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen}; 5314e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen 5414e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersenstatic struct soekris_board __initdata boards[] = { 5514e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen { 0xb7b, "net5501", 7, init_net5501 }, /* net5501 v1.33/1.33c */ 5614e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen { 0xb1f, "net5501", 7, init_net5501 }, /* net5501 v1.32i */ 5714e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen}; 5814e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen 5914e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersenstatic int __init soekris_init(void) 6014e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen{ 6114e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen int i; 6214e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen unsigned char *rombase, *bios; 6314e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen 6414e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen if (!is_geode()) 6514e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen return 0; 6614e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen 6714e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen rombase = ioremap(0xffff0000, 0xffff); 6814e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen if (!rombase) { 6914e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen printk(KERN_INFO "Soekris net5501 LED driver failed to get rombase"); 7014e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen return 0; 7114e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen } 7214e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen 7314e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen bios = rombase + 0x20; /* null terminated */ 7414e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen 7514e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen if (strncmp(bios, "comBIOS", 7)) 7614e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen goto unmap; 7714e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen 7814e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen for (i = 0; i < ARRAY_SIZE(boards); i++) { 7914e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen unsigned char *model = rombase + boards[i].offset; 8014e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen 8114e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen if (strncmp(model, boards[i].sig, boards[i].len) == 0) { 8214e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen printk(KERN_INFO "Soekris %s: %s\n", model, bios); 8314e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen 8414e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen if (boards[i].init) 8514e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen boards[i].init(); 8614e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen break; 8714e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen } 8814e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen } 8914e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen 9014e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersenunmap: 9114e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen iounmap(rombase); 9214e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen return 0; 9314e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen} 9414e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersen 9514e40f644b020d473415342461b7c62e3bb5e312Bjarke Istrup Pedersenarch_initcall(soekris_init); 9665f75ace23863063aac374d1bdb302d103e89ec3Randy Dunlap 9765f75ace23863063aac374d1bdb302d103e89ec3Randy DunlapMODULE_LICENSE("GPL"); 98