151 lines
3.7 KiB
C
151 lines
3.7 KiB
C
/*
|
|
* linux/arch/unicore32/kernel/puv3-nb0916.c
|
|
*
|
|
* Code specific to PKUnity SoC and UniCore ISA
|
|
*
|
|
* Maintained by GUAN Xue-tao <gxt@mprc.pku.edu.cn>
|
|
* Copyright (C) 2001-2010 Guan Xuetao
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 as
|
|
* published by the Free Software Foundation.
|
|
*/
|
|
|
|
#include <linux/init.h>
|
|
#include <linux/device.h>
|
|
#include <linux/platform_device.h>
|
|
#include <linux/mtd/physmap.h>
|
|
#include <linux/io.h>
|
|
#include <linux/reboot.h>
|
|
#include <linux/interrupt.h>
|
|
#include <linux/i2c.h>
|
|
#include <linux/pwm.h>
|
|
#include <linux/pwm_backlight.h>
|
|
#include <linux/gpio.h>
|
|
#include <linux/gpio_keys.h>
|
|
#include <linux/input.h>
|
|
|
|
#include <mach/hardware.h>
|
|
|
|
static struct physmap_flash_data physmap_flash_data = {
|
|
.width = 1,
|
|
};
|
|
|
|
static struct resource physmap_flash_resource = {
|
|
.start = 0xFFF80000,
|
|
.end = 0xFFFFFFFF,
|
|
.flags = IORESOURCE_MEM,
|
|
};
|
|
|
|
static struct resource puv3_i2c_resources[] = {
|
|
[0] = {
|
|
.start = io_v2p(PKUNITY_I2C_BASE),
|
|
.end = io_v2p(PKUNITY_I2C_BASE) + 0xff,
|
|
.flags = IORESOURCE_MEM,
|
|
},
|
|
[1] = {
|
|
.start = IRQ_I2C,
|
|
.end = IRQ_I2C,
|
|
.flags = IORESOURCE_IRQ,
|
|
}
|
|
};
|
|
|
|
static struct pwm_lookup nb0916_pwm_lookup[] = {
|
|
PWM_LOOKUP("PKUnity-v3-PWM", 0, "pwm-backlight", NULL, 70 * 1024,
|
|
PWM_POLARITY_NORMAL),
|
|
};
|
|
|
|
static struct platform_pwm_backlight_data nb0916_backlight_data = {
|
|
.max_brightness = 100,
|
|
.dft_brightness = 100,
|
|
.enable_gpio = -1,
|
|
};
|
|
|
|
static struct gpio_keys_button nb0916_gpio_keys[] = {
|
|
{
|
|
.type = EV_KEY,
|
|
.code = KEY_POWER,
|
|
.gpio = GPI_SOFF_REQ,
|
|
.desc = "Power Button",
|
|
.wakeup = 1,
|
|
.active_low = 1,
|
|
},
|
|
{
|
|
.type = EV_KEY,
|
|
.code = BTN_TOUCH,
|
|
.gpio = GPI_BTN_TOUCH,
|
|
.desc = "Touchpad Button",
|
|
.wakeup = 1,
|
|
.active_low = 1,
|
|
},
|
|
};
|
|
|
|
static struct gpio_keys_platform_data nb0916_gpio_button_data = {
|
|
.buttons = nb0916_gpio_keys,
|
|
.nbuttons = ARRAY_SIZE(nb0916_gpio_keys),
|
|
};
|
|
|
|
static irqreturn_t nb0916_lcdcaseoff_handler(int irq, void *dev_id)
|
|
{
|
|
if (gpio_get_value(GPI_LCD_CASE_OFF))
|
|
gpio_set_value(GPO_LCD_EN, 1);
|
|
else
|
|
gpio_set_value(GPO_LCD_EN, 0);
|
|
|
|
return IRQ_HANDLED;
|
|
}
|
|
|
|
static irqreturn_t nb0916_overheat_handler(int irq, void *dev_id)
|
|
{
|
|
machine_halt();
|
|
/* SYSTEM HALT, NO RETURN */
|
|
return IRQ_HANDLED;
|
|
}
|
|
|
|
static struct i2c_board_info __initdata puv3_i2c_devices[] = {
|
|
{ I2C_BOARD_INFO("lm75", I2C_TAR_THERMAL), },
|
|
{ I2C_BOARD_INFO("bq27200", I2C_TAR_PWIC), },
|
|
{ I2C_BOARD_INFO("24c02", I2C_TAR_EEPROM), },
|
|
};
|
|
|
|
int __init mach_nb0916_init(void)
|
|
{
|
|
i2c_register_board_info(0, puv3_i2c_devices,
|
|
ARRAY_SIZE(puv3_i2c_devices));
|
|
|
|
platform_device_register_simple("PKUnity-v3-I2C", -1,
|
|
puv3_i2c_resources, ARRAY_SIZE(puv3_i2c_resources));
|
|
|
|
pwm_add_table(nb0916_pwm_lookup, ARRAY_SIZE(nb0916_pwm_lookup));
|
|
|
|
platform_device_register_data(NULL, "pwm-backlight", -1,
|
|
&nb0916_backlight_data, sizeof(nb0916_backlight_data));
|
|
|
|
platform_device_register_data(NULL, "gpio-keys", -1,
|
|
&nb0916_gpio_button_data, sizeof(nb0916_gpio_button_data));
|
|
|
|
platform_device_register_resndata(NULL, "physmap-flash", -1,
|
|
&physmap_flash_resource, 1,
|
|
&physmap_flash_data, sizeof(physmap_flash_data));
|
|
|
|
if (request_irq(gpio_to_irq(GPI_LCD_CASE_OFF),
|
|
&nb0916_lcdcaseoff_handler,
|
|
IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
|
|
"NB0916 lcd case off", NULL) < 0) {
|
|
|
|
printk(KERN_DEBUG "LCD-Case-OFF IRQ %d not available\n",
|
|
gpio_to_irq(GPI_LCD_CASE_OFF));
|
|
}
|
|
|
|
if (request_irq(gpio_to_irq(GPI_OTP_INT), &nb0916_overheat_handler,
|
|
IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
|
|
"NB0916 overheating protection", NULL) < 0) {
|
|
|
|
printk(KERN_DEBUG "Overheating Protection IRQ %d not available\n",
|
|
gpio_to_irq(GPI_OTP_INT));
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
subsys_initcall_sync(mach_nb0916_init);
|