cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

geos.c (2973B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * System Specific setup for Traverse Technologies GEOS.
      4 * At the moment this means setup of GPIO control of LEDs.
      5 *
      6 * Copyright (C) 2008 Constantin Baranov <const@mimas.ru>
      7 * Copyright (C) 2011 Ed Wildgoose <kernel@wildgooses.com>
      8 *                and Philip Prindeville <philipp@redfish-solutions.com>
      9 *
     10 * TODO: There are large similarities with leds-net5501.c
     11 * by Alessandro Zummo <a.zummo@towertech.it>
     12 * In the future leds-net5501.c should be migrated over to platform
     13 */
     14
     15#include <linux/kernel.h>
     16#include <linux/init.h>
     17#include <linux/io.h>
     18#include <linux/string.h>
     19#include <linux/leds.h>
     20#include <linux/platform_device.h>
     21#include <linux/input.h>
     22#include <linux/gpio_keys.h>
     23#include <linux/gpio/machine.h>
     24#include <linux/dmi.h>
     25
     26#include <asm/geode.h>
     27
     28static struct gpio_keys_button geos_gpio_buttons[] = {
     29	{
     30		.code = KEY_RESTART,
     31		.gpio = 3,
     32		.active_low = 1,
     33		.desc = "Reset button",
     34		.type = EV_KEY,
     35		.wakeup = 0,
     36		.debounce_interval = 100,
     37		.can_disable = 0,
     38	}
     39};
     40static struct gpio_keys_platform_data geos_buttons_data = {
     41	.buttons = geos_gpio_buttons,
     42	.nbuttons = ARRAY_SIZE(geos_gpio_buttons),
     43	.poll_interval = 20,
     44};
     45
     46static struct platform_device geos_buttons_dev = {
     47	.name = "gpio-keys-polled",
     48	.id = 1,
     49	.dev = {
     50		.platform_data = &geos_buttons_data,
     51	}
     52};
     53
     54static struct gpio_led geos_leds[] = {
     55	{
     56		.name = "geos:1",
     57		.default_trigger = "default-on",
     58	},
     59	{
     60		.name = "geos:2",
     61		.default_trigger = "default-off",
     62	},
     63	{
     64		.name = "geos:3",
     65		.default_trigger = "default-off",
     66	},
     67};
     68
     69static struct gpio_led_platform_data geos_leds_data = {
     70	.num_leds = ARRAY_SIZE(geos_leds),
     71	.leds = geos_leds,
     72};
     73
     74static struct gpiod_lookup_table geos_leds_gpio_table = {
     75	.dev_id = "leds-gpio",
     76	.table = {
     77		/* The Geode GPIOs should be on the CS5535 companion chip */
     78		GPIO_LOOKUP_IDX("cs5535-gpio", 6, NULL, 0, GPIO_ACTIVE_LOW),
     79		GPIO_LOOKUP_IDX("cs5535-gpio", 25, NULL, 1, GPIO_ACTIVE_LOW),
     80		GPIO_LOOKUP_IDX("cs5535-gpio", 27, NULL, 2, GPIO_ACTIVE_LOW),
     81		{ }
     82	},
     83};
     84
     85static struct platform_device geos_leds_dev = {
     86	.name = "leds-gpio",
     87	.id = -1,
     88	.dev.platform_data = &geos_leds_data,
     89};
     90
     91static struct platform_device *geos_devs[] __initdata = {
     92	&geos_buttons_dev,
     93	&geos_leds_dev,
     94};
     95
     96static void __init register_geos(void)
     97{
     98	/* Setup LED control through leds-gpio driver */
     99	gpiod_add_lookup_table(&geos_leds_gpio_table);
    100	platform_add_devices(geos_devs, ARRAY_SIZE(geos_devs));
    101}
    102
    103static int __init geos_init(void)
    104{
    105	const char *vendor, *product;
    106
    107	if (!is_geode())
    108		return 0;
    109
    110	vendor = dmi_get_system_info(DMI_SYS_VENDOR);
    111	if (!vendor || strcmp(vendor, "Traverse Technologies"))
    112		return 0;
    113
    114	product = dmi_get_system_info(DMI_PRODUCT_NAME);
    115	if (!product || strcmp(product, "Geos"))
    116		return 0;
    117
    118	printk(KERN_INFO "%s: system is recognized as \"%s %s\"\n",
    119	       KBUILD_MODNAME, vendor, product);
    120
    121	register_geos();
    122
    123	return 0;
    124}
    125device_initcall(geos_init);