示例#1
0
static void
bcm947xx_reboot_handler(void)
{
#ifndef BCMDBG
	int wombo_reset;
#endif /* BCMDBG */

	/* Reset the PCI(e) interfaces */
	if (CHIPID(sih->chip) == BCM4706_CHIP_ID)
		hndpci_deinit(sih);

	if (lanports_enable) {
		uint lp = 1 << lanports_enable;

		si_gpioout(sih, lp, 0, GPIO_DRV_PRIORITY);
		si_gpioouten(sih, lp, lp, GPIO_DRV_PRIORITY);
		bcm_mdelay(1);
	}

#ifndef BCMDBG
	/* gpio 0 is also valid wombo_reset */
	if ((wombo_reset = getgpiopin(NULL, "wombo_reset", GPIO_PIN_NOTDEFINED)) !=
	    GPIO_PIN_NOTDEFINED) {
		int reset = 1 << wombo_reset;

		si_gpioout(sih, reset, 0, GPIO_DRV_PRIORITY);
		si_gpioouten(sih, reset, reset, GPIO_DRV_PRIORITY);
		bcm_mdelay(10);
	}
#endif /* BCMDBG */
}
示例#2
0
文件: setup.c 项目: Einheri/wl500g
void __init
brcm_setup(void)
{
	char *value;

	/* Get global SB handle */
	sih = si_kattach(SI_OSH);

	/* Initialize clocks and interrupts */
	si_mips_init(sih, SBMIPS_VIRTIRQ_BASE);

	if (BCM330X(current_cpu_data.processor_id) &&
		(read_c0_diag() & BRCM_PFC_AVAIL)) {
		/* 
		 * Now that the sih is inited set the  proper PFC value 
		 */	
		printk("Setting the PFC to its default value\n");
		enable_pfc(PFC_AUTO);
	}


#ifdef CONFIG_SERIAL_CORE
	/* Initialize UARTs */
	serial_setup(sih);
#endif /* CONFIG_SERIAL_CORE */

	/* Override default command line arguments */
	value = nvram_get("kernel_args");
	if (value && strlen(value) && strncmp(value, "empty", 5))
		strncpy(arcs_cmdline, value, sizeof(arcs_cmdline));


	if ((lanports_enable = getgpiopin(NULL, "lanports_enable", GPIO_PIN_NOTDEFINED)) ==
		GPIO_PIN_NOTDEFINED)
		lanports_enable = 0;

	/* wombo reset */
	if ((wombo_reset = getgpiopin(NULL, "wombo_reset", GPIO_PIN_NOTDEFINED)) !=
	    GPIO_PIN_NOTDEFINED) {
		int reset = 1 << wombo_reset;

		printk("wombo_reset set to gpio %d\n", wombo_reset);

		si_gpioout(sih, reset, 0, GPIO_DRV_PRIORITY);
		si_gpioouten(sih, reset, reset, GPIO_DRV_PRIORITY);
		bcm_mdelay(10);

		si_gpioout(sih, reset, reset, GPIO_DRV_PRIORITY);
		bcm_mdelay(20);
	}

	/* Generic setup */
	_machine_restart = bcm947xx_machine_restart;
	_machine_halt = bcm947xx_machine_halt;
	pm_power_off = bcm947xx_machine_halt;

}
示例#3
0
/* Advance clock(s) */
static void
adm_adclk(adm_info_t *adm, int clocks)
{
	int i;
	for (i = 0; i < clocks; i ++) {
		/* Clock high */
		si_gpioout(adm->sih, adm->eesk, adm->eesk, GPIO_DRV_PRIORITY);
		OSL_DELAY(EECK_EDGE_TIME);
		/* Clock low */
		si_gpioout(adm->sih, adm->eesk, 0, GPIO_DRV_PRIORITY);
		OSL_DELAY(EECK_EDGE_TIME);
	}
}
示例#4
0
文件: gpio.c 项目: cilynx/dd-wrt
int gpio_kernel_api(unsigned int cmd, unsigned int mask, unsigned int val)
{

	if (gpio_init_flag != 1) {
		if (gpio_init() != 0)
			return -EFAULT;
	}
	
	switch (cmd) {
		case 0:
			si_gpioout(gpio_sih, mask, val, GPIO_HI_PRIORITY);
			break;
		case 1:
			si_gpioouten(gpio_sih, mask, val, GPIO_HI_PRIORITY);
			break;
		case 3:
			si_gpioreserve(gpio_sih, mask, GPIO_HI_PRIORITY);
			break;
		default:
			printk("Unknown gpio_kenerl_api command\n");
			break;
	}

	return 0;
}
static void led_control(uint32 gpio, uint32 value)
{
	uint32 mask = 1 << gpio;
	uint32 gpio_value;

	if (sih == NULL)
	{
		xprintf("si attach failed\n");
		return;
	}

	if (value)
	{
		gpio_value = 1 << gpio;
	}
	else
	{
		gpio_value = 0 << gpio;
	}

	/*
	 * output mode
	 */
	si_gpioouten(sih, mask, mask, GPIO_DRV_PRIORITY);

	si_gpioout(sih, mask, gpio_value, GPIO_DRV_PRIORITY);
}
示例#6
0
文件: gpio.c 项目: cilynx/dd-wrt
static ssize_t
gpio_write(struct file *file, const char *buf, size_t count, loff_t *ppos)
{
	u32 val;

	if (get_user(val, (u32 *) buf))
		return -EFAULT;

	switch (MINOR(file->f_dentry->d_inode->i_rdev)) {
	case 0:
		return -EACCES;
	case 1:
		si_gpioout(gpio_sih, ~0, val, GPIO_APP_PRIORITY);
		break;
	case 2:
		si_gpioouten(gpio_sih, ~0, val, GPIO_APP_PRIORITY);
		break;
	case 3:
		si_gpiocontrol(gpio_sih, ~0, val, GPIO_APP_PRIORITY);
		break;
	default:
		return -ENODEV;
	}

	return sizeof(val);
}
示例#7
0
/* for driver-call usage */
uint32
_gpio_ctrl(unsigned int cmd, uint32 mask, uint32 val)
{
        struct gpio_ioctl gpioioc;
        unsigned long flags;

        gpioioc.mask = mask;
        gpioioc.val = val;

        switch (cmd) {
                case GPIO_IOC_RESERVE:
                        gpioioc.val = si_gpioreserve(gpio_sih, gpioioc.mask, GPIO_APP_PRIORITY);
                        break;
                case GPIO_IOC_RELEASE:
                        gpioioc.val = si_gpiorelease(gpio_sih, gpioioc.mask, GPIO_APP_PRIORITY);
                        break;
                case GPIO_IOC_OUT:
                        gpioioc.val = si_gpioout(gpio_sih, gpioioc.mask, gpioioc.val,
                                                GPIO_APP_PRIORITY);
                        break;
                case GPIO_IOC_OUTEN:
                        gpioioc.val = si_gpioouten(gpio_sih, gpioioc.mask, gpioioc.val,
                                                GPIO_APP_PRIORITY);
                        break;
                case GPIO_IOC_IN:
                        gpioioc.val = si_gpioin(gpio_sih);
                        break;
                default:
                        break;
        }

        return gpioioc.val;
}
示例#8
0
文件: gpio.c 项目: cilynx/dd-wrt
static ssize_t
gpio_read(struct file *file, char *buf, size_t count, loff_t *ppos)
{
	u32 val;
	switch (MINOR(file->f_dentry->d_inode->i_rdev)) {
	case 0:
		val = si_gpioin(gpio_sih);
		break;
	case 1:
		val = si_gpioout(gpio_sih, 0, 0, GPIO_APP_PRIORITY);
		break;
	case 2:
		val = si_gpioouten(gpio_sih, 0, 0, GPIO_APP_PRIORITY);
		break;
	case 3:
		val = si_gpiocontrol(gpio_sih, 0, 0, GPIO_APP_PRIORITY);
		break;
	default:
		return -ENODEV;
	}

	if (put_user(val, (u32 *) buf))
		return -EFAULT;

	return sizeof(val);
}
示例#9
0
/* Enable outputs with specified value to the chip */
static void
adm_enout(adm_info_t *adm, uint32 pins, uint val)
{
	/* Prepare GPIO output value */
	si_gpioout(adm->sih, pins, val, GPIO_DRV_PRIORITY);
	/* Enable GPIO outputs */
	si_gpioouten(adm->sih, pins, pins, GPIO_DRV_PRIORITY);
	OSL_DELAY(EECK_EDGE_TIME);
}
示例#10
0
文件: gen_gpio.c 项目: janfj/dd-wrt
int gpio_direction_output(unsigned gpio, int value)
{
	int out, outen;

	outen = si_gpioouten(gpio_sih, (1<<gpio), (1<<gpio), GPIO_APP_PRIORITY);
	out = si_gpioout(gpio_sih, (1<<gpio), (value ? (1<<gpio) : 0), GPIO_APP_PRIORITY);
	DBG("%s: gpio %d, value %d - out 0x%x outen 0x%x\n", __FUNCTION__, gpio, value, out, outen);
	return 0;
}
示例#11
0
static long
gpio_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
#else
static int
gpio_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
{
#endif /* linux-2.6.22 */
	struct gpio_ioctl gpioioc;

	if (copy_from_user(&gpioioc, (struct gpio_ioctl *)arg, sizeof(struct gpio_ioctl)))
		return -EFAULT;

	switch (cmd) {
		case GPIO_IOC_RESERVE:
			gpioioc.val = si_gpioreserve(gpio_sih, gpioioc.mask, GPIO_APP_PRIORITY);
			break;
		case GPIO_IOC_RELEASE:
			/*
			 * releasing the gpio doesn't change the current
			 * value on the GPIO last write value
			 * persists till some one overwrites it
			 */
			gpioioc.val = si_gpiorelease(gpio_sih, gpioioc.mask, GPIO_APP_PRIORITY);
			break;
		case GPIO_IOC_OUT:
			gpioioc.val = si_gpioout(gpio_sih, gpioioc.mask, gpioioc.val,
			                         GPIO_APP_PRIORITY);
			break;
		case GPIO_IOC_OUTEN:
			gpioioc.val = si_gpioouten(gpio_sih, gpioioc.mask, gpioioc.val,
			                           GPIO_APP_PRIORITY);
			break;
		case GPIO_IOC_IN:
			gpioioc.val = si_gpioin(gpio_sih);
			break;
		default:
			break;
	}
	if (copy_to_user((struct gpio_ioctl *)arg, &gpioioc, sizeof(struct gpio_ioctl)))
		return -EFAULT;

	return 0;

}
static struct file_operations gpio_fops = {
	owner:		THIS_MODULE,
	open:		gpio_open,
	release:	gpio_release,
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 36)
	unlocked_ioctl:  gpio_ioctl
#else
	ioctl:		gpio_ioctl
#endif
};
示例#12
0
文件: setup.c 项目: Einheri/wl500g
static void
bcm947xx_reboot_handler(void)
{
	if (lanports_enable) {
		uint lp = 1 << lanports_enable;

		si_gpioout(sih, lp, 0, GPIO_DRV_PRIORITY);
		si_gpioouten(sih, lp, lp, GPIO_DRV_PRIORITY);
		bcm_mdelay(1);
	}

	/* gpio 0 is also valid wombo_reset */
	if (wombo_reset != GPIO_PIN_NOTDEFINED) {
		int reset = 1 << wombo_reset;

		si_gpioout(sih, reset, 0, GPIO_DRV_PRIORITY);
		si_gpioouten(sih, reset, reset, GPIO_DRV_PRIORITY);
		bcm_mdelay(10);
	}
}
void leds_on(void)
{
	uint32 mask = 1 << LED_WLAN2G_GPIO_PIN | 1 << LED_WLAN5G_GPIO_PIN | 1 << LED_INTERNET_GPIO_PIN | 1 << LED_SYS_GPIO_PIN;

	if (sih == NULL)
	{
		xprintf("si attach failed\n");
		return;
	}

	/*
	 * leds on
	 */
	si_gpioout(sih, mask, mask, GPIO_DRV_PRIORITY);	
}
示例#14
0
static void
bcm947xx_reboot_handler(void)
{
	/* Reset the PCI(e) interfaces */
	if (CHIPID(sih->chip) == BCM4706_CHIP_ID)
		hndpci_deinit(sih);

	if (lanports_enable) {
		uint lp = 1 << lanports_enable;

		si_gpioout(sih, lp, 0, GPIO_DRV_PRIORITY);
		si_gpioouten(sih, lp, lp, GPIO_DRV_PRIORITY);
		bcm_mdelay(1);
	}

	/* gpio 0 is also valid wombo_reset */
	if (wombo_reset != GPIO_PIN_NOTDEFINED) {
		int reset = 1 << wombo_reset;

		si_gpioout(sih, reset, 0, GPIO_DRV_PRIORITY);
		si_gpioouten(sih, reset, reset, GPIO_DRV_PRIORITY);
		bcm_mdelay(10);
	}
}
示例#15
0
/* Write a bit stream to the chip */
static void
adm_write(adm_info_t *adm, int cs, uint8 *buf, uint bits)
{
	uint i, len = (bits + 7) / 8;
	uint8 mask;

	/* CS high/low */
	if (cs)
		si_gpioout(adm->sih, adm->eecs, adm->eecs, GPIO_DRV_PRIORITY);
	else
		si_gpioout(adm->sih, adm->eecs, 0, GPIO_DRV_PRIORITY);
	OSL_DELAY(EECK_EDGE_TIME);

	/* Byte assemble from MSB to LSB */
	for (i = 0; i < len; i++) {
		/* Bit bang from MSB to LSB */
		for (mask = 0x80; mask && bits > 0; mask >>= 1, bits --) {
			/* Clock low */
			si_gpioout(adm->sih, adm->eesk, 0, GPIO_DRV_PRIORITY);
			OSL_DELAY(EECK_EDGE_TIME);

			/* Output on rising edge */
			if (mask & buf[i])
				si_gpioout(adm->sih, adm->eedi, adm->eedi, GPIO_DRV_PRIORITY);
			else
				si_gpioout(adm->sih, adm->eedi, 0, GPIO_DRV_PRIORITY);
			OSL_DELAY(EEDI_SETUP_TIME);

			/* Clock high */
			si_gpioout(adm->sih, adm->eesk, adm->eesk, GPIO_DRV_PRIORITY);
			OSL_DELAY(EECK_EDGE_TIME);
		}
	}

	/* Clock low */
	si_gpioout(adm->sih, adm->eesk, 0, GPIO_DRV_PRIORITY);
	OSL_DELAY(EECK_EDGE_TIME);

	/* CS low */
	if (cs)
		si_gpioout(adm->sih, adm->eecs, 0, GPIO_DRV_PRIORITY);
}
void leds_off(void)
{
	/*
	 * keep system led on
	 */
	uint32 mask = 1 << LED_WLAN2G_GPIO_PIN | 1 << LED_WLAN5G_GPIO_PIN | 1 << LED_INTERNET_GPIO_PIN;

	if (sih == NULL)
	{
		xprintf("si attach failed\n");
		return;
	}

	/*
	 * leds off
	 */
	si_gpioout(sih, mask, ~mask, GPIO_DRV_PRIORITY);	
}
示例#17
0
void
board_power_init(si_t *sih)
{
        uint origidx;
        chipcregs_t *cc;
        int gpio;

        /* Drive gpio pin to HIGH to enable on-board switching regulator for COMA mode */
        origidx = si_coreidx(sih);
        if ((cc = (chipcregs_t *)si_setcore(sih, CC_CORE_ID, 0)) != NULL) {
                gpio = getgpiopin(NULL, "coma_swreg", GPIO_PIN_NOTDEFINED);
                if (gpio != GPIO_PIN_NOTDEFINED) {
                        gpio = 1 << gpio;
                        si_gpioout(sih, gpio, gpio, GPIO_DRV_PRIORITY);
                        si_gpioouten(sih, gpio, gpio, GPIO_DRV_PRIORITY);
                }
        }
        si_setcoreidx(sih, origidx);
}
示例#18
0
static int
gpio_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
{
	struct gpio_ioctl gpioioc;

	if (copy_from_user(&gpioioc, (struct gpio_ioctl *)arg, sizeof(struct gpio_ioctl)))
		return -EFAULT;

	switch (cmd) {
		case GPIO_IOC_RESERVE:
			gpioioc.val = si_gpioreserve(gpio_sih, gpioioc.mask, GPIO_APP_PRIORITY);
			break;
		case GPIO_IOC_RELEASE:
			/*
			 * releasing the gpio doesn't change the current
			 * value on the GPIO last write value
			 * persists till some one overwrites it
			 */
			gpioioc.val = si_gpiorelease(gpio_sih, gpioioc.mask, GPIO_APP_PRIORITY);
			break;
		case GPIO_IOC_OUT:
			gpioioc.val = si_gpioout(gpio_sih, gpioioc.mask, gpioioc.val,
			                         GPIO_APP_PRIORITY);
			break;
		case GPIO_IOC_OUTEN:
			gpioioc.val = si_gpioouten(gpio_sih, gpioioc.mask, gpioioc.val,
			                           GPIO_APP_PRIORITY);
			break;
		case GPIO_IOC_IN:
			gpioioc.val = si_gpioin(gpio_sih);
			break;
		default:
			break;
	}
	if (copy_to_user((struct gpio_ioctl *)arg, &gpioioc, sizeof(struct gpio_ioctl)))
		return -EFAULT;

	return 0;

}
示例#19
0
文件: gen_gpio.c 项目: janfj/dd-wrt
void gpio_set_value(unsigned int gpio, int value)
{
	si_gpioout(gpio_sih, (1<<gpio), (value ? (1<<gpio) : 0), GPIO_APP_PRIORITY);
	return;
}
示例#20
0
void
board_pinmux_init(si_t *sih)
{
	uint origidx;
	chipcommonbregs_t *chipcb;

	origidx = si_coreidx(sih);
	chipcb = si_setcore(sih, NS_CCB_CORE_ID, 0);
	if (chipcb != NULL) {
		/* Default select the mux pins for GPIO */
		W_REG(osh, &chipcb->cru_gpio_control0, 0x1fffff);
	}
	si_setcoreidx(sih, origidx);

	si_gpioouten(sih, PWR_LED_GPIO, PWR_LED_GPIO, GPIO_DRV_PRIORITY);
	si_gpioouten(sih, USB_LED_GPIO, USB_LED_GPIO, GPIO_DRV_PRIORITY);
#ifdef RTAC68U
	si_gpioouten(sih, TURBO_LED_GPIO, TURBO_LED_GPIO, GPIO_DRV_PRIORITY);
#endif
#ifndef RTN18U
	si_gpioouten(sih, WL5G_LED_GPIO, WL5G_LED_GPIO, GPIO_DRV_PRIORITY);
	si_gpioouten(sih, USB3_LED_GPIO, USB3_LED_GPIO, GPIO_DRV_PRIORITY);
#endif
#ifndef RTAC68U
	si_gpioouten(sih, WAN_LED_GPIO, WAN_LED_GPIO, GPIO_DRV_PRIORITY);
	si_gpioouten(sih, LAN_LED_GPIO, LAN_LED_GPIO, GPIO_DRV_PRIORITY);
#endif
#ifndef RTN18U				// for RT-AC56U & RT-AC68U
	si_gpioouten(sih, USB_PWR1_GPIO, USB_PWR1_GPIO, GPIO_DRV_PRIORITY);
#ifndef RTAC68U
	si_gpioouten(sih, USB_PWR2_GPIO, USB_PWR2_GPIO, GPIO_DRV_PRIORITY);
#endif
#endif
#ifdef RTN18U				// RT-N18U
	si_gpioouten(sih, USB_PWR1_GPIO, USB_PWR1_GPIO, GPIO_DRV_PRIORITY);
	si_gpioouten(sih, WL2G_LED_GPIO, WL2G_LED_GPIO, GPIO_DRV_PRIORITY);
	si_gpioouten(sih, USB3_LED_GPIO, USB3_LED_GPIO, GPIO_DRV_PRIORITY);
#endif

	si_gpioout(sih, PWR_LED_GPIO, 0, GPIO_DRV_PRIORITY);
	si_gpioout(sih, USB_LED_GPIO, USB_LED_GPIO, GPIO_DRV_PRIORITY);
#ifdef RTAC68U
	si_gpioout(sih, TURBO_LED_GPIO, 0, GPIO_DRV_PRIORITY);
#endif
#ifndef RTN18U				// for RT-AC56U & RT-AC68U to enable USB power
	si_gpioout(sih, WL5G_LED_GPIO, WL5G_LED_GPIO, GPIO_DRV_PRIORITY);
	si_gpioout(sih, USB3_LED_GPIO, USB3_LED_GPIO, GPIO_DRV_PRIORITY);
#endif
#ifndef RTAC68U
	si_gpioout(sih, WAN_LED_GPIO, WAN_LED_GPIO, GPIO_DRV_PRIORITY);
	si_gpioout(sih, LAN_LED_GPIO, LAN_LED_GPIO, GPIO_DRV_PRIORITY);
#endif
#ifndef RTN18U				// for RT-AC56U & RT-AC68U to enable USB power
	si_gpioout(sih, USB_PWR1_GPIO, USB_PWR1_GPIO, GPIO_DRV_PRIORITY);
#ifndef RTAC68U
	si_gpioout(sih, USB_PWR2_GPIO, USB_PWR2_GPIO, GPIO_DRV_PRIORITY);
#endif
#endif
#ifdef RTN18U				// RT-N18U
	/* enable USB power */
	si_gpioout(sih, USB_PWR1_GPIO, USB_PWR1_GPIO, GPIO_DRV_PRIORITY);

	/* power on LEDs */
	si_gpioout(sih, PWR_LED_GPIO, PWR_LED_GPIO, GPIO_DRV_PRIORITY);
	si_gpioout(sih, WL2G_LED_GPIO, WL2G_LED_GPIO, GPIO_DRV_PRIORITY);
	si_gpioout(sih, WAN_LED_GPIO, WAN_LED_GPIO, GPIO_DRV_PRIORITY);
	si_gpioout(sih, LAN_LED_GPIO, LAN_LED_GPIO, GPIO_DRV_PRIORITY);
	si_gpioout(sih, USB_LED_GPIO, USB_LED_GPIO, GPIO_DRV_PRIORITY);
	si_gpioout(sih, USB3_LED_GPIO, USB3_LED_GPIO, GPIO_DRV_PRIORITY);
#endif
}
示例#21
0
文件: bcmgpio.c 项目: AllardJ/Tomato
static int
bcmgpio_ioctl(int gpioreg, unsigned int mask , unsigned int val)
{
#if defined(__ECOS)
	int value;
	switch (gpioreg) {
		case BCMGPIO_REG_IN:
			value = si_gpioin(gpio_sih);
			break;
		case BCMGPIO_REG_OUT:
			value = si_gpioout(gpio_sih, mask, val,GPIO_APP_PRIORITY);
			break;
		case BCMGPIO_REG_OUTEN:
			value = si_gpioouten(gpio_sih, mask, val,GPIO_APP_PRIORITY);
			break;
		case BCMGPIO_REG_RESERVE:
			value = si_gpioreserve(gpio_sih, mask, GPIO_APP_PRIORITY);
			break;
		case BCMGPIO_REG_RELEASE:
			/* 
 			* releasing the gpio doesn't change the current 
			* value on the GPIO last write value 
 			* persists till some one overwrites it
			*/
			value = si_gpiorelease(gpio_sih, mask, GPIO_APP_PRIORITY);
			break;
		default:
			GPIO_ERROR ("invalid gpioreg %d\n", gpioreg);
			value = -1;
			break;
	}
	return value;
#else
	struct gpio_ioctl gpio;
	int type;

	gpio.val = val;
	gpio.mask = mask;

	switch (gpioreg) {
		case BCMGPIO_REG_IN:
			type = GPIO_IOC_IN; 
			break;
		case BCMGPIO_REG_OUT:
			type = GPIO_IOC_OUT; 
			break;
		case BCMGPIO_REG_OUTEN:
			type = GPIO_IOC_OUTEN; 
			break;
		case BCMGPIO_REG_RESERVE:
			type = GPIO_IOC_RESERVE; 
			break;
		case BCMGPIO_REG_RELEASE:
			type = GPIO_IOC_RELEASE; 
			break;
		default:
			GPIO_ERROR ("invalid gpioreg %d\n", gpioreg);
			return -1;
	}
	if (ioctl(bcmgpio_fd, type, &gpio) < 0) {
		GPIO_ERROR ("invalid gpioreg %d\n", gpioreg);
		return -1;
	}
	return (gpio.val);
#endif
}
示例#22
0
文件: gpio.c 项目: cilynx/dd-wrt
static int __init
gpio_init(void)
{
	int i;

	if (!(gpio_sih = si_kattach(SI_OSH)))
		return -ENODEV;

	si_gpiosetcore(gpio_sih);

	if ((gpio_major = register_chrdev(127, "gpio", &gpio_fops)) < 0)
	{
		return gpio_major;
	}

//	devfs_mk_cdev(MKDEV(gpio_major, 0), S_IFCHR | S_IRUGO | S_IWUGO, "gpio");

//	devfs_mk_dir("gpio");
	gpio_class = class_create(THIS_MODULE, "gpio");

	for (i = 0; i < ARRAYSIZE(gpio_file); i++) {
//		register_chrdev(MKDEV(127, i), gpio_file[i].name, &gpio_fops);
		class_device_create(gpio_class, NULL, MKDEV(127, i), NULL, gpio_file[i].name);
//		printk("gpio dev %d created\n",dev);
//		devfs_mk_cdev(MKDEV(127, i), S_IFCHR | S_IRUGO | S_IWUGO, gpio_file[i].name);
		
	}
gpio_init_flag=1;
int gpios = 0;

if (iswrt350n)
{
	printk(KERN_EMERG "WRT350N GPIO Init\n");
	/* For WRT350N USB LED control */
	si_gpioreserve(gpio_sih, 0x400, GPIO_HI_PRIORITY);
	si_gpioouten(gpio_sih, 0x400, 0x400, GPIO_HI_PRIORITY);
	si_gpioreserve(gpio_sih, 0x800, GPIO_HI_PRIORITY);
	si_gpioouten(gpio_sih, 0x800, 0x800, GPIO_HI_PRIORITY);

	//if (nvram_match("disabled_5397", "1")) {
//		printk("5397 switch GPIO-Reset \n");
	//}
		
	USB_SET_LED(USB_DISCONNECT); //2005-02-24 by kanki for USB LED

}
if (iswrt350n)
{
		
		si_gpioreserve(gpio_sih, 0x4, GPIO_HI_PRIORITY);
		si_gpioouten(gpio_sih, 0x4, 0x4, GPIO_HI_PRIORITY);
		si_gpioout(gpio_sih, 0x4, 0x4, GPIO_HI_PRIORITY);
}

uint boardnum = bcm_strtoul( nvram_safe_get( "boardnum" ), NULL, 0 );

gpios = 1<<0 | 1<<1 | 1<<2 | 1<<3 | 1<<4 | 1<<5 | 1<<6 | 1<<7 | 1<<8 | 1<<9 | 1<<10 | 1<<11;

if ((boardnum == 1 || boardnum == 3500)
	    && nvram_match("boardtype", "0x04CF")
	    && (nvram_match("boardrev", "0x1213") || nvram_match("boardrev", "02")))
{
		printk(KERN_EMERG "WNR3500V2 GPIO Init\n");
		gpios = 1 << 1 | 1 << 2 | 1 << 3 | 1 << 7;
}

if ((boardnum == 42 || boardnum == 66)
		&& nvram_match("boardtype", "0x04EF")
		&& (nvram_match("boardrev", "0x1304") || nvram_match("boardrev", "0x1305") || nvram_match("boardrev", "0x1307")))
{
		printk(KERN_EMERG "WRT320N/E2000 GPIO Init\n");
		gpios = 1 << 2 | 1 << 3 | 1 << 4;
}

if (boardnum == 42 && ((nvram_match("boot_hw_model", "WRT160N") && nvram_match("boot_hw_ver", "3.0")) 
		|| (nvram_match("boot_hw_model", "M10") && nvram_match("boot_hw_ver", "1.0")) 
		|| (nvram_match("boot_hw_model", "E100") && nvram_match("boot_hw_ver", "1.0")) ) )
{
		printk(KERN_EMERG "WRT160Nv3/M10/E1000 GPIO Init\n");
		gpios = 1 << 1 | 1 << 2 | 1 << 4;
}

if (boardnum == 42 && ((nvram_match("boot_hw_model", "WRT310N") && nvram_match("boot_hw_ver", "2.0"))
		|| (nvram_match("boot_hw_model", "M20") && nvram_match("boot_hw_ver", "1.0")) ) )
{
		printk(KERN_EMERG "WRT310Nv2/M20 GPIO Init\n");
		gpios = 1 << 1 | 1 << 2 | 1 << 4;
}

if (nvram_match("boardnum", "00") && nvram_match("boardrev", "0x11")
		&& nvram_match("boardtype", "0x048e")
		&& (nvram_match("melco_id", "32093") || nvram_match("melco_id", "32064")))
{
		printk(KERN_EMERG "WHR-G125 / WHR-HP-G125 GPIO Init\n");
		gpios = 1 << 1 | 1 << 6 | 1 << 7;
}

if (nvram_match("boardnum", "00") && nvram_match("boardrev", "0x13")
	    && nvram_match("boardtype", "0x467"))
{
		printk(KERN_EMERG "WHR-G54S / WHR-HP-G54 GPIO Init\n");
		gpios = 1 << 1 | 1 << 6 | 1 << 7;
}

if (nvram_match("boardtype", "0x04cf") && (nvram_match("boot_hw_model", "WRT610N")
	|| nvram_match("boot_hw_model", "E300")))
{
		printk(KERN_EMERG "WRT610Nv2/E3000 GPIO Init\n");
		gpios = 1 << 0 | 1 << 3 | 1 << 5 | 1 << 7;
}

if (boardnum == 42 && nvram_match("boardrev", "0x10")
	    && (nvram_match("boardtype", "0x0467")
	    	|| nvram_match("boardtype", "0x0708")
	    	|| nvram_match("boardtype", "0x0101")))
{
		printk(KERN_EMERG "WRT54G/GS/GL/TM GPIO Init\n");
		gpios = 1 << 1 | 1 << 2 | 1 << 3 | 1 << 4 | 1 << 7;
}

if (boardnum == 45 && nvram_match("boardrev", "0x1402")
		&& nvram_match("boardtype", "0x04EC"))
{
		printk(KERN_EMERG "RT-N10 GPIO Init\n");
		gpios = 1 << 1;
}

if (boardnum == 45 && nvram_match("boardrev", "0x1102")
		&& nvram_match("boardtype", "0x0550"))
{
		printk(KERN_EMERG "RT-N10U GPIO Init\n");
		gpios = 1 << 5;
}

if (boardnum == 45 && nvram_match("boardrev", "0x1153")
		&& nvram_match("boardtype", "0x058e"))
{
		printk(KERN_EMERG "RT-N10+ D1 GPIO INIT\n");
		gpios = 1 << 6 | 1 << 7 | 1 << 21 | 1 << 20;
}

if (boardnum == 1 && nvram_match("boardtype", "0xE4CD")
		&& nvram_match("boardrev", "0x1700"))
{
		printk(KERN_EMERG "WNR2000v2 GPIO Init\n");
		gpios = 1 << 2 | 1 << 6 | 1 << 7 | 1 << 8;
}

if (boardnum == 45 && nvram_match("boardrev", "0x1201")
	    && nvram_match("boardtype", "0x04CD"))
{
		printk(KERN_EMERG "RT-N12 GPIO Init\n");
		gpios = 1 << 0 | 1 << 2;
}

if (boardnum == 45 && nvram_match("boardrev", "0x1218")
		&& nvram_match("boardtype", "0x04cf"))
{
		printk(KERN_EMERG "RT-N16 GPIO Init\n");
		gpios = 1 << 1;
}

if (boardnum == 1 && nvram_match("boardrev", "0x23")
		&& nvram_match("boardtype", "0x0472"))
{
		if (nvram_match("cardbus", "1")) {
		printk(KERN_EMERG "WNR324v2 GPIO Init\n");
		gpios = 1 << 2 | 1 << 3 | 1 << 7;
		} else {
		printk(KERN_EMERG "WNDR3300 GPIO Init\n");
		gpios = 1 << 5 | 1 << 7;
		}
}

if (nvram_match("boardnum", "00") && nvram_match("boardtype", "0x0101")
		&& nvram_match("boardrev", "0x10"))
{
		printk(KERN_EMERG "WBR2-G54(S) GPIO Init\n");
		gpios = 1 << 1 | 1 << 6;
}

if (nvram_match("boardtype", "0xd4cf")
		&& nvram_match("boardrev", "0x1204"))
{
		printk(KERN_EMERG "F7D4301v1 GPIO Init\n");
		gpios = 1 << 10 | 1 << 11 | 1 << 13;
}

if (nvram_match("boardtype", "0xa4cf") 
		&& (nvram_match("boardrev", "0x1100") || nvram_match("boardrev", "0x1102")))
{
		printk(KERN_EMERG "F7D3301v1/3302v1/4302v1  - F5D8235v3 GPIO Init\n");
		gpios = 1 << 10 | 1 << 11 | 1 << 13;
}

if (nvram_match("boot_hw_model", "E1000")
		&& (nvram_match("boot_hw_ver", "2.0") || nvram_match("boot_hw_ver", "2.1")))
{
		printk(KERN_EMERG "E1000v2/v21 GPIO Init\n");
		gpios = 1 << 6 | 1 << 7 | 1 << 8;
}

if (nvram_match("boot_hw_model", "E4200")
		&& nvram_match("boot_hw_ver", "1.0"))
{
		printk(KERN_EMERG "E4200 GPIO Init\n");
		gpios = 1 << 3 | 1 << 5;
}

if (nvram_match("boardnum", "01") && nvram_match("boardtype", "0xb4cf")
	    && nvram_match("boardrev", "0x1100"))
{
		printk(KERN_EMERG "WNDR3400 GPIO Init\n");
		gpios = 1 << 0 | 1 << 1 | 1 << 2 | 1 << 3 | 1 << 7;
}

if (nvram_match("boardnum", "01") && nvram_match("boardtype", "0xF52C")
	    && nvram_match("boardrev", "0x1101"))
{
		printk(KERN_EMERG "WNDR4000 GPIO Init\n");
		gpios = 1 << 0 | 1 << 6 | 1 << 7;
}

/*if (iswrt300n11)
{
	printk(KERN_EMERG "WRT300N v1.1 GPIO Init\n");
		int reset = 1 << 8;
		sb_gpioout(gpio_sbh, reset, 0, GPIO_DRV_PRIORITY);
		sb_gpioouten(gpio_sbh, reset, reset, GPIO_DRV_PRIORITY);
		bcm_mdelay(50);
		sb_gpioout(gpio_sbh, reset, reset, GPIO_DRV_PRIORITY);
		bcm_mdelay(20);	
}*/
	
	for (i = 0; i < 16; i++)
	{
		if (gpios&1) {
			si_gpioreserve(gpio_sih, 1 << i, GPIO_APP_PRIORITY);
		}
		gpios>>=1;
	}

	return 0;
}