PageRenderTime 21ms CodeModel.GetById 12ms app.highlight 5ms RepoModel.GetById 2ms app.codeStats 0ms

/arch/arm/mach-pxa/reset.c

https://github.com/AICP/kernel_asus_grouper
C | 102 lines | 68 code | 17 blank | 17 comment | 6 complexity | 7fd4362e318679d728132c3fe4bdde8a MD5 | raw file
  1/*
  2 * This program is free software; you can redistribute it and/or modify
  3 * it under the terms of the GNU General Public License version 2 as
  4 * published by the Free Software Foundation.
  5 */
  6#include <linux/kernel.h>
  7#include <linux/module.h>
  8#include <linux/delay.h>
  9#include <linux/gpio.h>
 10#include <linux/io.h>
 11#include <asm/proc-fns.h>
 12
 13#include <mach/regs-ost.h>
 14#include <mach/reset.h>
 15
 16unsigned int reset_status;
 17EXPORT_SYMBOL(reset_status);
 18
 19static void do_hw_reset(void);
 20
 21static int reset_gpio = -1;
 22
 23int init_gpio_reset(int gpio, int output, int level)
 24{
 25	int rc;
 26
 27	rc = gpio_request(gpio, "reset generator");
 28	if (rc) {
 29		printk(KERN_ERR "Can't request reset_gpio\n");
 30		goto out;
 31	}
 32
 33	if (output)
 34		rc = gpio_direction_output(gpio, level);
 35	else
 36		rc = gpio_direction_input(gpio);
 37	if (rc) {
 38		printk(KERN_ERR "Can't configure reset_gpio\n");
 39		gpio_free(gpio);
 40		goto out;
 41	}
 42
 43out:
 44	if (!rc)
 45		reset_gpio = gpio;
 46
 47	return rc;
 48}
 49
 50/*
 51 * Trigger GPIO reset.
 52 * This covers various types of logic connecting gpio pin
 53 * to RESET pins (nRESET or GPIO_RESET):
 54 */
 55static void do_gpio_reset(void)
 56{
 57	BUG_ON(reset_gpio == -1);
 58
 59	/* drive it low */
 60	gpio_direction_output(reset_gpio, 0);
 61	mdelay(2);
 62	/* rising edge or drive high */
 63	gpio_set_value(reset_gpio, 1);
 64	mdelay(2);
 65	/* falling edge */
 66	gpio_set_value(reset_gpio, 0);
 67
 68	/* give it some time */
 69	mdelay(10);
 70
 71	WARN_ON(1);
 72	/* fallback */
 73	do_hw_reset();
 74}
 75
 76static void do_hw_reset(void)
 77{
 78	/* Initialize the watchdog and let it fire */
 79	OWER = OWER_WME;
 80	OSSR = OSSR_M3;
 81	OSMR3 = OSCR + 368640;	/* ... in 100 ms */
 82}
 83
 84void arch_reset(char mode, const char *cmd)
 85{
 86	clear_reset_status(RESET_STATUS_ALL);
 87
 88	switch (mode) {
 89	case 's':
 90		/* Jump into ROM at address 0 */
 91		cpu_reset(0);
 92		break;
 93	case 'g':
 94		do_gpio_reset();
 95		break;
 96	case 'h':
 97	default:
 98		do_hw_reset();
 99		break;
100	}
101}
102