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