diff options
54 files changed, 857 insertions, 742 deletions
diff --git a/arch/cris/Kconfig b/arch/cris/Kconfig index 887ef855be2a..aefe3b18a074 100644 --- a/arch/cris/Kconfig +++ b/arch/cris/Kconfig | |||
| @@ -24,7 +24,7 @@ config GENERIC_CMOS_UPDATE | |||
| 24 | def_bool y | 24 | def_bool y |
| 25 | 25 | ||
| 26 | config ARCH_USES_GETTIMEOFFSET | 26 | config ARCH_USES_GETTIMEOFFSET |
| 27 | def_bool y | 27 | def_bool n |
| 28 | 28 | ||
| 29 | config GENERIC_IOMAP | 29 | config GENERIC_IOMAP |
| 30 | bool | 30 | bool |
| @@ -128,16 +128,19 @@ choice | |||
| 128 | 128 | ||
| 129 | config ETRAX100LX | 129 | config ETRAX100LX |
| 130 | bool "ETRAX-100LX-v1" | 130 | bool "ETRAX-100LX-v1" |
| 131 | select ARCH_USES_GETTIMEOFFSET | ||
| 131 | help | 132 | help |
| 132 | Support version 1 of the ETRAX 100LX. | 133 | Support version 1 of the ETRAX 100LX. |
| 133 | 134 | ||
| 134 | config ETRAX100LX_V2 | 135 | config ETRAX100LX_V2 |
| 135 | bool "ETRAX-100LX-v2" | 136 | bool "ETRAX-100LX-v2" |
| 137 | select ARCH_USES_GETTIMEOFFSET | ||
| 136 | help | 138 | help |
| 137 | Support version 2 of the ETRAX 100LX. | 139 | Support version 2 of the ETRAX 100LX. |
| 138 | 140 | ||
| 139 | config SVINTO_SIM | 141 | config SVINTO_SIM |
| 140 | bool "ETRAX-100LX-for-xsim-simulator" | 142 | bool "ETRAX-100LX-for-xsim-simulator" |
| 143 | select ARCH_USES_GETTIMEOFFSET | ||
| 141 | help | 144 | help |
| 142 | Support the xsim ETRAX Simulator. | 145 | Support the xsim ETRAX Simulator. |
| 143 | 146 | ||
diff --git a/arch/cris/Kconfig.debug b/arch/cris/Kconfig.debug index 0a1d62a23614..0b9a630dc812 100644 --- a/arch/cris/Kconfig.debug +++ b/arch/cris/Kconfig.debug | |||
| @@ -32,4 +32,10 @@ config DEBUG_NMI_OOPS | |||
| 32 | If the system locks up without any debug information you can say Y | 32 | If the system locks up without any debug information you can say Y |
| 33 | here to make it possible to dump an OOPS with an external NMI. | 33 | here to make it possible to dump an OOPS with an external NMI. |
| 34 | 34 | ||
| 35 | config NO_SEGFAULT_TERMINATION | ||
| 36 | bool "Keep segfaulting processes" | ||
| 37 | help | ||
| 38 | Place segfaulting user mode processes on a wait queue instead of | ||
| 39 | delivering a terminating SIGSEGV to allow debugging with gdb. | ||
| 40 | |||
| 35 | endmenu | 41 | endmenu |
diff --git a/arch/cris/arch-v10/drivers/Kconfig b/arch/cris/arch-v10/drivers/Kconfig index 58f5864a6680..0d7221779923 100644 --- a/arch/cris/arch-v10/drivers/Kconfig +++ b/arch/cris/arch-v10/drivers/Kconfig | |||
| @@ -383,7 +383,7 @@ config ETRAX_RS485 | |||
| 383 | depends on ETRAX_SERIAL | 383 | depends on ETRAX_SERIAL |
| 384 | help | 384 | help |
| 385 | Enables support for RS-485 serial communication. For a primer on | 385 | Enables support for RS-485 serial communication. For a primer on |
| 386 | RS-485, see <http://www.hw.cz/english/docs/rs485/rs485.html>. | 386 | RS-485, see <http://en.wikipedia.org/wiki/Rs485> |
| 387 | 387 | ||
| 388 | config ETRAX_RS485_ON_PA | 388 | config ETRAX_RS485_ON_PA |
| 389 | bool "RS-485 mode on PA" | 389 | bool "RS-485 mode on PA" |
diff --git a/arch/cris/arch-v10/drivers/eeprom.c b/arch/cris/arch-v10/drivers/eeprom.c index c3405507a3d1..5047a33043bd 100644 --- a/arch/cris/arch-v10/drivers/eeprom.c +++ b/arch/cris/arch-v10/drivers/eeprom.c | |||
| @@ -28,7 +28,6 @@ | |||
| 28 | #include <linux/init.h> | 28 | #include <linux/init.h> |
| 29 | #include <linux/delay.h> | 29 | #include <linux/delay.h> |
| 30 | #include <linux/interrupt.h> | 30 | #include <linux/interrupt.h> |
| 31 | #include <linux/smp_lock.h> | ||
| 32 | #include <linux/wait.h> | 31 | #include <linux/wait.h> |
| 33 | #include <asm/uaccess.h> | 32 | #include <asm/uaccess.h> |
| 34 | #include "i2c.h" | 33 | #include "i2c.h" |
| @@ -376,7 +375,6 @@ int __init eeprom_init(void) | |||
| 376 | /* Opens the device. */ | 375 | /* Opens the device. */ |
| 377 | static int eeprom_open(struct inode * inode, struct file * file) | 376 | static int eeprom_open(struct inode * inode, struct file * file) |
| 378 | { | 377 | { |
| 379 | cycle_kernel_lock(); | ||
| 380 | if(iminor(inode) != EEPROM_MINOR_NR) | 378 | if(iminor(inode) != EEPROM_MINOR_NR) |
| 381 | return -ENXIO; | 379 | return -ENXIO; |
| 382 | if(imajor(inode) != EEPROM_MAJOR_NR) | 380 | if(imajor(inode) != EEPROM_MAJOR_NR) |
diff --git a/arch/cris/arch-v10/drivers/gpio.c b/arch/cris/arch-v10/drivers/gpio.c index 4b0f65fac8e8..a07b6d25b0c7 100644 --- a/arch/cris/arch-v10/drivers/gpio.c +++ b/arch/cris/arch-v10/drivers/gpio.c | |||
| @@ -16,7 +16,6 @@ | |||
| 16 | #include <linux/errno.h> | 16 | #include <linux/errno.h> |
| 17 | #include <linux/kernel.h> | 17 | #include <linux/kernel.h> |
| 18 | #include <linux/fs.h> | 18 | #include <linux/fs.h> |
| 19 | #include <linux/smp_lock.h> | ||
| 20 | #include <linux/string.h> | 19 | #include <linux/string.h> |
| 21 | #include <linux/poll.h> | 20 | #include <linux/poll.h> |
| 22 | #include <linux/init.h> | 21 | #include <linux/init.h> |
| @@ -46,8 +45,7 @@ static char gpio_name[] = "etrax gpio"; | |||
| 46 | static wait_queue_head_t *gpio_wq; | 45 | static wait_queue_head_t *gpio_wq; |
| 47 | #endif | 46 | #endif |
| 48 | 47 | ||
| 49 | static int gpio_ioctl(struct inode *inode, struct file *file, | 48 | static long gpio_ioctl(struct file *file, unsigned int cmd, unsigned long arg); |
| 50 | unsigned int cmd, unsigned long arg); | ||
| 51 | static ssize_t gpio_write(struct file *file, const char __user *buf, | 49 | static ssize_t gpio_write(struct file *file, const char __user *buf, |
| 52 | size_t count, loff_t *off); | 50 | size_t count, loff_t *off); |
| 53 | static int gpio_open(struct inode *inode, struct file *filp); | 51 | static int gpio_open(struct inode *inode, struct file *filp); |
| @@ -324,7 +322,6 @@ gpio_open(struct inode *inode, struct file *filp) | |||
| 324 | if (!priv) | 322 | if (!priv) |
| 325 | return -ENOMEM; | 323 | return -ENOMEM; |
| 326 | 324 | ||
| 327 | lock_kernel(); | ||
| 328 | priv->minor = p; | 325 | priv->minor = p; |
| 329 | 326 | ||
| 330 | /* initialize the io/alarm struct */ | 327 | /* initialize the io/alarm struct */ |
| @@ -359,7 +356,6 @@ gpio_open(struct inode *inode, struct file *filp) | |||
| 359 | alarmlist = priv; | 356 | alarmlist = priv; |
| 360 | spin_unlock_irqrestore(&gpio_lock, flags); | 357 | spin_unlock_irqrestore(&gpio_lock, flags); |
| 361 | 358 | ||
| 362 | unlock_kernel(); | ||
| 363 | return 0; | 359 | return 0; |
| 364 | } | 360 | } |
| 365 | 361 | ||
| @@ -504,9 +500,7 @@ unsigned long inline setget_output(struct gpio_private *priv, unsigned long arg) | |||
| 504 | static int | 500 | static int |
| 505 | gpio_leds_ioctl(unsigned int cmd, unsigned long arg); | 501 | gpio_leds_ioctl(unsigned int cmd, unsigned long arg); |
| 506 | 502 | ||
| 507 | static int | 503 | static long gpio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) |
| 508 | gpio_ioctl(struct inode *inode, struct file *file, | ||
| 509 | unsigned int cmd, unsigned long arg) | ||
| 510 | { | 504 | { |
| 511 | unsigned long flags; | 505 | unsigned long flags; |
| 512 | unsigned long val; | 506 | unsigned long val; |
| @@ -516,54 +510,65 @@ gpio_ioctl(struct inode *inode, struct file *file, | |||
| 516 | if (_IOC_TYPE(cmd) != ETRAXGPIO_IOCTYPE) | 510 | if (_IOC_TYPE(cmd) != ETRAXGPIO_IOCTYPE) |
| 517 | return -EINVAL; | 511 | return -EINVAL; |
| 518 | 512 | ||
| 519 | spin_lock_irqsave(&gpio_lock, flags); | ||
| 520 | |||
| 521 | switch (_IOC_NR(cmd)) { | 513 | switch (_IOC_NR(cmd)) { |
| 522 | case IO_READBITS: /* Use IO_READ_INBITS and IO_READ_OUTBITS instead */ | 514 | case IO_READBITS: /* Use IO_READ_INBITS and IO_READ_OUTBITS instead */ |
| 523 | // read the port | 515 | // read the port |
| 516 | spin_lock_irqsave(&gpio_lock, flags); | ||
| 524 | if (USE_PORTS(priv)) { | 517 | if (USE_PORTS(priv)) { |
| 525 | ret = *priv->port; | 518 | ret = *priv->port; |
| 526 | } else if (priv->minor == GPIO_MINOR_G) { | 519 | } else if (priv->minor == GPIO_MINOR_G) { |
| 527 | ret = (*R_PORT_G_DATA) & 0x7FFFFFFF; | 520 | ret = (*R_PORT_G_DATA) & 0x7FFFFFFF; |
| 528 | } | 521 | } |
| 522 | spin_unlock_irqrestore(&gpio_lock, flags); | ||
| 523 | |||
| 529 | break; | 524 | break; |
| 530 | case IO_SETBITS: | 525 | case IO_SETBITS: |
| 531 | // set changeable bits with a 1 in arg | 526 | // set changeable bits with a 1 in arg |
| 527 | spin_lock_irqsave(&gpio_lock, flags); | ||
| 528 | |||
| 532 | if (USE_PORTS(priv)) { | 529 | if (USE_PORTS(priv)) { |
| 533 | *priv->port = *priv->shadow |= | 530 | *priv->port = *priv->shadow |= |
| 534 | ((unsigned char)arg & priv->changeable_bits); | 531 | ((unsigned char)arg & priv->changeable_bits); |
| 535 | } else if (priv->minor == GPIO_MINOR_G) { | 532 | } else if (priv->minor == GPIO_MINOR_G) { |
| 536 | *R_PORT_G_DATA = port_g_data_shadow |= (arg & dir_g_out_bits); | 533 | *R_PORT_G_DATA = port_g_data_shadow |= (arg & dir_g_out_bits); |
| 537 | } | 534 | } |
| 535 | spin_unlock_irqrestore(&gpio_lock, flags); | ||
| 536 | |||
| 538 | break; | 537 | break; |
| 539 | case IO_CLRBITS: | 538 | case IO_CLRBITS: |
| 540 | // clear changeable bits with a 1 in arg | 539 | // clear changeable bits with a 1 in arg |
| 540 | spin_lock_irqsave(&gpio_lock, flags); | ||
| 541 | if (USE_PORTS(priv)) { | 541 | if (USE_PORTS(priv)) { |
| 542 | *priv->port = *priv->shadow &= | 542 | *priv->port = *priv->shadow &= |
| 543 | ~((unsigned char)arg & priv->changeable_bits); | 543 | ~((unsigned char)arg & priv->changeable_bits); |
| 544 | } else if (priv->minor == GPIO_MINOR_G) { | 544 | } else if (priv->minor == GPIO_MINOR_G) { |
| 545 | *R_PORT_G_DATA = port_g_data_shadow &= ~((unsigned long)arg & dir_g_out_bits); | 545 | *R_PORT_G_DATA = port_g_data_shadow &= ~((unsigned long)arg & dir_g_out_bits); |
| 546 | } | 546 | } |
| 547 | spin_unlock_irqrestore(&gpio_lock, flags); | ||
| 547 | break; | 548 | break; |
| 548 | case IO_HIGHALARM: | 549 | case IO_HIGHALARM: |
| 549 | // set alarm when bits with 1 in arg go high | 550 | // set alarm when bits with 1 in arg go high |
| 551 | spin_lock_irqsave(&gpio_lock, flags); | ||
| 550 | priv->highalarm |= arg; | 552 | priv->highalarm |= arg; |
| 551 | gpio_some_alarms = 1; | 553 | gpio_some_alarms = 1; |
| 554 | spin_unlock_irqrestore(&gpio_lock, flags); | ||
| 552 | break; | 555 | break; |
| 553 | case IO_LOWALARM: | 556 | case IO_LOWALARM: |
| 554 | // set alarm when bits with 1 in arg go low | 557 | // set alarm when bits with 1 in arg go low |
| 558 | spin_lock_irqsave(&gpio_lock, flags); | ||
| 555 | priv->lowalarm |= arg; | 559 | priv->lowalarm |= arg; |
| 556 | gpio_some_alarms = 1; | 560 | gpio_some_alarms = 1; |
| 561 | spin_unlock_irqrestore(&gpio_lock, flags); | ||
| 557 | break; | 562 | break; |
| 558 | case IO_CLRALARM: | 563 | case IO_CLRALARM: |
| 559 | // clear alarm for bits with 1 in arg | 564 | /* clear alarm for bits with 1 in arg */ |
| 565 | spin_lock_irqsave(&gpio_lock, flags); | ||
| 560 | priv->highalarm &= ~arg; | 566 | priv->highalarm &= ~arg; |
| 561 | priv->lowalarm &= ~arg; | 567 | priv->lowalarm &= ~arg; |
| 562 | { | 568 | { |
| 563 | /* Must update gpio_some_alarms */ | 569 | /* Must update gpio_some_alarms */ |
| 564 | struct gpio_private *p = alarmlist; | 570 | struct gpio_private *p = alarmlist; |
| 565 | int some_alarms; | 571 | int some_alarms; |
| 566 | spin_lock_irq(&gpio_lock); | ||
| 567 | p = alarmlist; | 572 | p = alarmlist; |
| 568 | some_alarms = 0; | 573 | some_alarms = 0; |
| 569 | while (p) { | 574 | while (p) { |
| @@ -574,11 +579,12 @@ gpio_ioctl(struct inode *inode, struct file *file, | |||
| 574 | p = p->next; | 579 | p = p->next; |
| 575 | } | 580 | } |
| 576 | gpio_some_alarms = some_alarms; | 581 | gpio_some_alarms = some_alarms; |
| 577 | spin_unlock_irq(&gpio_lock); | ||
| 578 | } | 582 | } |
| 583 | spin_unlock_irqrestore(&gpio_lock, flags); | ||
| 579 | break; | 584 | break; |
| 580 | case IO_READDIR: /* Use IO_SETGET_INPUT/OUTPUT instead! */ | 585 | case IO_READDIR: /* Use IO_SETGET_INPUT/OUTPUT instead! */ |
| 581 | /* Read direction 0=input 1=output */ | 586 | /* Read direction 0=input 1=output */ |
| 587 | spin_lock_irqsave(&gpio_lock, flags); | ||
| 582 | if (USE_PORTS(priv)) { | 588 | if (USE_PORTS(priv)) { |
| 583 | ret = *priv->dir_shadow; | 589 | ret = *priv->dir_shadow; |
| 584 | } else if (priv->minor == GPIO_MINOR_G) { | 590 | } else if (priv->minor == GPIO_MINOR_G) { |
| @@ -587,30 +593,40 @@ gpio_ioctl(struct inode *inode, struct file *file, | |||
| 587 | */ | 593 | */ |
| 588 | ret = (dir_g_shadow | dir_g_out_bits) & 0x7FFFFFFF; | 594 | ret = (dir_g_shadow | dir_g_out_bits) & 0x7FFFFFFF; |
| 589 | } | 595 | } |
| 596 | spin_unlock_irqrestore(&gpio_lock, flags); | ||
| 590 | break; | 597 | break; |
| 591 | case IO_SETINPUT: /* Use IO_SETGET_INPUT instead! */ | 598 | case IO_SETINPUT: /* Use IO_SETGET_INPUT instead! */ |
| 592 | /* Set direction 0=unchanged 1=input, | 599 | /* Set direction 0=unchanged 1=input, |
| 593 | * return mask with 1=input | 600 | * return mask with 1=input |
| 594 | */ | 601 | */ |
| 602 | spin_lock_irqsave(&gpio_lock, flags); | ||
| 595 | ret = setget_input(priv, arg) & 0x7FFFFFFF; | 603 | ret = setget_input(priv, arg) & 0x7FFFFFFF; |
| 604 | spin_unlock_irqrestore(&gpio_lock, flags); | ||
| 596 | break; | 605 | break; |
| 597 | case IO_SETOUTPUT: /* Use IO_SETGET_OUTPUT instead! */ | 606 | case IO_SETOUTPUT: /* Use IO_SETGET_OUTPUT instead! */ |
| 598 | /* Set direction 0=unchanged 1=output, | 607 | /* Set direction 0=unchanged 1=output, |
| 599 | * return mask with 1=output | 608 | * return mask with 1=output |
| 600 | */ | 609 | */ |
| 610 | spin_lock_irqsave(&gpio_lock, flags); | ||
| 601 | ret = setget_output(priv, arg) & 0x7FFFFFFF; | 611 | ret = setget_output(priv, arg) & 0x7FFFFFFF; |
| 612 | spin_unlock_irqrestore(&gpio_lock, flags); | ||
| 602 | break; | 613 | break; |
| 603 | case IO_SHUTDOWN: | 614 | case IO_SHUTDOWN: |
| 615 | spin_lock_irqsave(&gpio_lock, flags); | ||
| 604 | SOFT_SHUTDOWN(); | 616 | SOFT_SHUTDOWN(); |
| 617 | spin_unlock_irqrestore(&gpio_lock, flags); | ||
| 605 | break; | 618 | break; |
| 606 | case IO_GET_PWR_BT: | 619 | case IO_GET_PWR_BT: |
| 620 | spin_lock_irqsave(&gpio_lock, flags); | ||
| 607 | #if defined (CONFIG_ETRAX_SOFT_SHUTDOWN) | 621 | #if defined (CONFIG_ETRAX_SOFT_SHUTDOWN) |
| 608 | ret = (*R_PORT_G_DATA & ( 1 << CONFIG_ETRAX_POWERBUTTON_BIT)); | 622 | ret = (*R_PORT_G_DATA & ( 1 << CONFIG_ETRAX_POWERBUTTON_BIT)); |
| 609 | #else | 623 | #else |
| 610 | ret = 0; | 624 | ret = 0; |
| 611 | #endif | 625 | #endif |
| 626 | spin_unlock_irqrestore(&gpio_lock, flags); | ||
| 612 | break; | 627 | break; |
| 613 | case IO_CFG_WRITE_MODE: | 628 | case IO_CFG_WRITE_MODE: |
| 629 | spin_lock_irqsave(&gpio_lock, flags); | ||
| 614 | priv->clk_mask = arg & 0xFF; | 630 | priv->clk_mask = arg & 0xFF; |
| 615 | priv->data_mask = (arg >> 8) & 0xFF; | 631 | priv->data_mask = (arg >> 8) & 0xFF; |
| 616 | priv->write_msb = (arg >> 16) & 0x01; | 632 | priv->write_msb = (arg >> 16) & 0x01; |
| @@ -626,28 +642,33 @@ gpio_ioctl(struct inode *inode, struct file *file, | |||
| 626 | priv->data_mask = 0; | 642 | priv->data_mask = 0; |
| 627 | ret = -EPERM; | 643 | ret = -EPERM; |
| 628 | } | 644 | } |
| 645 | spin_unlock_irqrestore(&gpio_lock, flags); | ||
| 629 | break; | 646 | break; |
| 630 | case IO_READ_INBITS: | 647 | case IO_READ_INBITS: |
| 631 | /* *arg is result of reading the input pins */ | 648 | /* *arg is result of reading the input pins */ |
| 649 | spin_lock_irqsave(&gpio_lock, flags); | ||
| 632 | if (USE_PORTS(priv)) { | 650 | if (USE_PORTS(priv)) { |
| 633 | val = *priv->port; | 651 | val = *priv->port; |
| 634 | } else if (priv->minor == GPIO_MINOR_G) { | 652 | } else if (priv->minor == GPIO_MINOR_G) { |
| 635 | val = *R_PORT_G_DATA; | 653 | val = *R_PORT_G_DATA; |
| 636 | } | 654 | } |
| 655 | spin_unlock_irqrestore(&gpio_lock, flags); | ||
| 637 | if (copy_to_user((void __user *)arg, &val, sizeof(val))) | 656 | if (copy_to_user((void __user *)arg, &val, sizeof(val))) |
| 638 | ret = -EFAULT; | 657 | ret = -EFAULT; |
| 639 | break; | 658 | break; |
| 640 | case IO_READ_OUTBITS: | 659 | case IO_READ_OUTBITS: |
| 641 | /* *arg is result of reading the output shadow */ | 660 | /* *arg is result of reading the output shadow */ |
| 661 | spin_lock_irqsave(&gpio_lock, flags); | ||
| 642 | if (USE_PORTS(priv)) { | 662 | if (USE_PORTS(priv)) { |
| 643 | val = *priv->shadow; | 663 | val = *priv->shadow; |
| 644 | } else if (priv->minor == GPIO_MINOR_G) { | 664 | } else if (priv->minor == GPIO_MINOR_G) { |
| 645 | val = port_g_data_shadow; | 665 | val = port_g_data_shadow; |
| 646 | } | 666 | } |
| 667 | spin_unlock_irqrestore(&gpio_lock, flags); | ||
| 647 | if (copy_to_user((void __user *)arg, &val, sizeof(val))) | 668 | if (copy_to_user((void __user *)arg, &val, sizeof(val))) |
| 648 | ret = -EFAULT; | 669 | ret = -EFAULT; |
| 649 | break; | 670 | break; |
| 650 | case IO_SETGET_INPUT: | 671 | case IO_SETGET_INPUT: |
| 651 | /* bits set in *arg is set to input, | 672 | /* bits set in *arg is set to input, |
| 652 | * *arg updated with current input pins. | 673 | * *arg updated with current input pins. |
| 653 | */ | 674 | */ |
| @@ -656,7 +677,9 @@ gpio_ioctl(struct inode *inode, struct file *file, | |||
| 656 | ret = -EFAULT; | 677 | ret = -EFAULT; |
| 657 | break; | 678 | break; |
| 658 | } | 679 | } |
| 680 | spin_lock_irqsave(&gpio_lock, flags); | ||
| 659 | val = setget_input(priv, val); | 681 | val = setget_input(priv, val); |
| 682 | spin_unlock_irqrestore(&gpio_lock, flags); | ||
| 660 | if (copy_to_user((void __user *)arg, &val, sizeof(val))) | 683 | if (copy_to_user((void __user *)arg, &val, sizeof(val))) |
| 661 | ret = -EFAULT; | 684 | ret = -EFAULT; |
| 662 | break; | 685 | break; |
| @@ -668,18 +691,21 @@ gpio_ioctl(struct inode *inode, struct file *file, | |||
| 668 | ret = -EFAULT; | 691 | ret = -EFAULT; |
| 669 | break; | 692 | break; |
| 670 | } | 693 | } |
| 694 | spin_lock_irqsave(&gpio_lock, flags); | ||
| 671 | val = setget_output(priv, val); | 695 | val = setget_output(priv, val); |
| 696 | spin_unlock_irqrestore(&gpio_lock, flags); | ||
| 672 | if (copy_to_user((void __user *)arg, &val, sizeof(val))) | 697 | if (copy_to_user((void __user *)arg, &val, sizeof(val))) |
| 673 | ret = -EFAULT; | 698 | ret = -EFAULT; |
| 674 | break; | 699 | break; |
| 675 | default: | 700 | default: |
| 701 | spin_lock_irqsave(&gpio_lock, flags); | ||
| 676 | if (priv->minor == GPIO_MINOR_LEDS) | 702 | if (priv->minor == GPIO_MINOR_LEDS) |
| 677 | ret = gpio_leds_ioctl(cmd, arg); | 703 | ret = gpio_leds_ioctl(cmd, arg); |
| 678 | else | 704 | else |
| 679 | ret = -EINVAL; | 705 | ret = -EINVAL; |
| 706 | spin_unlock_irqrestore(&gpio_lock, flags); | ||
| 680 | } /* switch */ | 707 | } /* switch */ |
| 681 | 708 | ||
| 682 | spin_unlock_irqrestore(&gpio_lock, flags); | ||
| 683 | return ret; | 709 | return ret; |
| 684 | } | 710 | } |
| 685 | 711 | ||
| @@ -713,12 +739,12 @@ gpio_leds_ioctl(unsigned int cmd, unsigned long arg) | |||
| 713 | } | 739 | } |
| 714 | 740 | ||
| 715 | static const struct file_operations gpio_fops = { | 741 | static const struct file_operations gpio_fops = { |
| 716 | .owner = THIS_MODULE, | 742 | .owner = THIS_MODULE, |
| 717 | .poll = gpio_poll, | 743 | .poll = gpio_poll, |
| 718 | .ioctl = gpio_ioctl, | 744 | .unlocked_ioctl = gpio_ioctl, |
| 719 | .write = gpio_write, | 745 | .write = gpio_write, |
| 720 | .open = gpio_open, | 746 | .open = gpio_open, |
| 721 | .release = gpio_release, | 747 | .release = gpio_release, |
| 722 | }; | 748 | }; |
| 723 | 749 | ||
| 724 | static void ioif_watcher(const unsigned int gpio_in_available, | 750 | static void ioif_watcher(const unsigned int gpio_in_available, |
diff --git a/arch/cris/arch-v10/drivers/i2c.c b/arch/cris/arch-v10/drivers/i2c.c index a8737a8eb229..77a941813819 100644 --- a/arch/cris/arch-v10/drivers/i2c.c +++ b/arch/cris/arch-v10/drivers/i2c.c | |||
| @@ -14,7 +14,6 @@ | |||
| 14 | 14 | ||
| 15 | #include <linux/module.h> | 15 | #include <linux/module.h> |
| 16 | #include <linux/sched.h> | 16 | #include <linux/sched.h> |
| 17 | #include <linux/smp_lock.h> | ||
| 18 | #include <linux/errno.h> | 17 | #include <linux/errno.h> |
| 19 | #include <linux/kernel.h> | 18 | #include <linux/kernel.h> |
| 20 | #include <linux/fs.h> | 19 | #include <linux/fs.h> |
| @@ -60,8 +59,8 @@ static const char i2c_name[] = "i2c"; | |||
| 60 | 59 | ||
| 61 | #define SDABIT CONFIG_ETRAX_I2C_DATA_PORT | 60 | #define SDABIT CONFIG_ETRAX_I2C_DATA_PORT |
| 62 | #define SCLBIT CONFIG_ETRAX_I2C_CLK_PORT | 61 | #define SCLBIT CONFIG_ETRAX_I2C_CLK_PORT |
| 63 | #define i2c_enable() | 62 | #define i2c_enable() |
| 64 | #define i2c_disable() | 63 | #define i2c_disable() |
| 65 | 64 | ||
| 66 | /* enable or disable output-enable, to select output or input on the i2c bus */ | 65 | /* enable or disable output-enable, to select output or input on the i2c bus */ |
| 67 | 66 | ||
| @@ -91,7 +90,7 @@ static const char i2c_name[] = "i2c"; | |||
| 91 | 90 | ||
| 92 | #define i2c_dir_out() \ | 91 | #define i2c_dir_out() \ |
| 93 | *R_PORT_PB_I2C = (port_pb_i2c_shadow &= ~IO_MASK(R_PORT_PB_I2C, i2c_oe_)); \ | 92 | *R_PORT_PB_I2C = (port_pb_i2c_shadow &= ~IO_MASK(R_PORT_PB_I2C, i2c_oe_)); \ |
| 94 | REG_SHADOW_SET(R_PORT_PB_DIR, port_pb_dir_shadow, 0, 1); | 93 | REG_SHADOW_SET(R_PORT_PB_DIR, port_pb_dir_shadow, 0, 1); |
| 95 | #define i2c_dir_in() \ | 94 | #define i2c_dir_in() \ |
| 96 | *R_PORT_PB_I2C = (port_pb_i2c_shadow |= IO_MASK(R_PORT_PB_I2C, i2c_oe_)); \ | 95 | *R_PORT_PB_I2C = (port_pb_i2c_shadow |= IO_MASK(R_PORT_PB_I2C, i2c_oe_)); \ |
| 97 | REG_SHADOW_SET(R_PORT_PB_DIR, port_pb_dir_shadow, 0, 0); | 96 | REG_SHADOW_SET(R_PORT_PB_DIR, port_pb_dir_shadow, 0, 0); |
| @@ -189,7 +188,7 @@ i2c_outbyte(unsigned char x) | |||
| 189 | } else { | 188 | } else { |
| 190 | i2c_data(I2C_DATA_LOW); | 189 | i2c_data(I2C_DATA_LOW); |
| 191 | } | 190 | } |
| 192 | 191 | ||
| 193 | i2c_delay(CLOCK_LOW_TIME/2); | 192 | i2c_delay(CLOCK_LOW_TIME/2); |
| 194 | i2c_clk(I2C_CLOCK_HIGH); | 193 | i2c_clk(I2C_CLOCK_HIGH); |
| 195 | i2c_delay(CLOCK_HIGH_TIME); | 194 | i2c_delay(CLOCK_HIGH_TIME); |
| @@ -416,7 +415,7 @@ i2c_sendnack(void) | |||
| 416 | *# | 415 | *# |
| 417 | *#--------------------------------------------------------------------------*/ | 416 | *#--------------------------------------------------------------------------*/ |
| 418 | int | 417 | int |
| 419 | i2c_writereg(unsigned char theSlave, unsigned char theReg, | 418 | i2c_writereg(unsigned char theSlave, unsigned char theReg, |
| 420 | unsigned char theValue) | 419 | unsigned char theValue) |
| 421 | { | 420 | { |
| 422 | int error, cntr = 3; | 421 | int error, cntr = 3; |
| @@ -468,7 +467,7 @@ i2c_writereg(unsigned char theSlave, unsigned char theReg, | |||
| 468 | * enable interrupt again | 467 | * enable interrupt again |
| 469 | */ | 468 | */ |
| 470 | local_irq_restore(flags); | 469 | local_irq_restore(flags); |
| 471 | 470 | ||
| 472 | } while(error && cntr--); | 471 | } while(error && cntr--); |
| 473 | 472 | ||
| 474 | i2c_delay(CLOCK_LOW_TIME); | 473 | i2c_delay(CLOCK_LOW_TIME); |
| @@ -504,7 +503,7 @@ i2c_readreg(unsigned char theSlave, unsigned char theReg) | |||
| 504 | * generate start condition | 503 | * generate start condition |
| 505 | */ | 504 | */ |
| 506 | i2c_start(); | 505 | i2c_start(); |
| 507 | 506 | ||
| 508 | /* | 507 | /* |
| 509 | * send slave address | 508 | * send slave address |
| 510 | */ | 509 | */ |
| @@ -555,7 +554,7 @@ i2c_readreg(unsigned char theSlave, unsigned char theReg) | |||
| 555 | * enable interrupt again | 554 | * enable interrupt again |
| 556 | */ | 555 | */ |
| 557 | local_irq_restore(flags); | 556 | local_irq_restore(flags); |
| 558 | 557 | ||
| 559 | } while(error && cntr--); | 558 | } while(error && cntr--); |
| 560 | 559 | ||
| 561 | spin_unlock(&i2c_lock); | 560 | spin_unlock(&i2c_lock); |
| @@ -566,7 +565,6 @@ i2c_readreg(unsigned char theSlave, unsigned char theReg) | |||
| 566 | static int | 565 | static int |
| 567 | i2c_open(struct inode *inode, struct file *filp) | 566 | i2c_open(struct inode *inode, struct file *filp) |
| 568 | { | 567 | { |
| 569 | cycle_kernel_lock(); | ||
| 570 | return 0; | 568 | return 0; |
| 571 | } | 569 | } |
| 572 | 570 | ||
| @@ -579,9 +577,7 @@ i2c_release(struct inode *inode, struct file *filp) | |||
| 579 | /* Main device API. ioctl's to write or read to/from i2c registers. | 577 | /* Main device API. ioctl's to write or read to/from i2c registers. |
| 580 | */ | 578 | */ |
| 581 | 579 | ||
| 582 | static int | 580 | static long i2c_ioctl(struct file *file, unsigned int cmd, unsigned long arg) |
| 583 | i2c_ioctl(struct inode *inode, struct file *file, | ||
| 584 | unsigned int cmd, unsigned long arg) | ||
| 585 | { | 581 | { |
| 586 | if(_IOC_TYPE(cmd) != ETRAXI2C_IOCTYPE) { | 582 | if(_IOC_TYPE(cmd) != ETRAXI2C_IOCTYPE) { |
| 587 | return -EINVAL; | 583 | return -EINVAL; |
| @@ -590,7 +586,7 @@ i2c_ioctl(struct inode *inode, struct file *file, | |||
| 590 | switch (_IOC_NR(cmd)) { | 586 | switch (_IOC_NR(cmd)) { |
| 591 | case I2C_WRITEREG: | 587 | case I2C_WRITEREG: |
| 592 | /* write to an i2c slave */ | 588 | /* write to an i2c slave */ |
| 593 | D(printk("i2cw %d %d %d\n", | 589 | D(printk(KERN_DEBUG "i2cw %d %d %d\n", |
| 594 | I2C_ARGSLAVE(arg), | 590 | I2C_ARGSLAVE(arg), |
| 595 | I2C_ARGREG(arg), | 591 | I2C_ARGREG(arg), |
| 596 | I2C_ARGVALUE(arg))); | 592 | I2C_ARGVALUE(arg))); |
| @@ -602,26 +598,25 @@ i2c_ioctl(struct inode *inode, struct file *file, | |||
| 602 | { | 598 | { |
| 603 | unsigned char val; | 599 | unsigned char val; |
| 604 | /* read from an i2c slave */ | 600 | /* read from an i2c slave */ |
| 605 | D(printk("i2cr %d %d ", | 601 | D(printk(KERN_DEBUG "i2cr %d %d ", |
| 606 | I2C_ARGSLAVE(arg), | 602 | I2C_ARGSLAVE(arg), |
| 607 | I2C_ARGREG(arg))); | 603 | I2C_ARGREG(arg))); |
| 608 | val = i2c_readreg(I2C_ARGSLAVE(arg), I2C_ARGREG(arg)); | 604 | val = i2c_readreg(I2C_ARGSLAVE(arg), I2C_ARGREG(arg)); |
| 609 | D(printk("= %d\n", val)); | 605 | D(printk(KERN_DEBUG "= %d\n", val)); |
| 610 | return val; | 606 | return val; |
| 611 | } | 607 | } |
| 612 | default: | 608 | default: |
| 613 | return -EINVAL; | 609 | return -EINVAL; |
| 614 | 610 | ||
| 615 | } | 611 | } |
| 616 | |||
| 617 | return 0; | 612 | return 0; |
| 618 | } | 613 | } |
| 619 | 614 | ||
| 620 | static const struct file_operations i2c_fops = { | 615 | static const struct file_operations i2c_fops = { |
| 621 | .owner = THIS_MODULE, | 616 | .owner = THIS_MODULE, |
| 622 | .ioctl = i2c_ioctl, | 617 | .unlocked_ioctl = i2c_ioctl, |
| 623 | .open = i2c_open, | 618 | .open = i2c_open, |
| 624 | .release = i2c_release, | 619 | .release = i2c_release, |
| 625 | }; | 620 | }; |
| 626 | 621 | ||
| 627 | int __init | 622 | int __init |
diff --git a/arch/cris/arch-v10/drivers/i2c.h b/arch/cris/arch-v10/drivers/i2c.h index 4ee91426bd40..e36c96276478 100644 --- a/arch/cris/arch-v10/drivers/i2c.h +++ b/arch/cris/arch-v10/drivers/i2c.h | |||
| @@ -1,5 +1,4 @@ | |||
| 1 | /* $Id: i2c.h,v 1.3 2004/05/28 09:26:59 starvik Exp $ */ | 1 | /* i2c.h */ |
| 2 | |||
| 3 | int i2c_init(void); | 2 | int i2c_init(void); |
| 4 | 3 | ||
| 5 | /* High level I2C actions */ | 4 | /* High level I2C actions */ |
diff --git a/arch/cris/arch-v10/drivers/sync_serial.c b/arch/cris/arch-v10/drivers/sync_serial.c index 109dcd826d17..ee2dd4323daf 100644 --- a/arch/cris/arch-v10/drivers/sync_serial.c +++ b/arch/cris/arch-v10/drivers/sync_serial.c | |||
| @@ -157,7 +157,7 @@ static int sync_serial_open(struct inode *inode, struct file *file); | |||
| 157 | static int sync_serial_release(struct inode *inode, struct file *file); | 157 | static int sync_serial_release(struct inode *inode, struct file *file); |
| 158 | static unsigned int sync_serial_poll(struct file *filp, poll_table *wait); | 158 | static unsigned int sync_serial_poll(struct file *filp, poll_table *wait); |
| 159 | 159 | ||
| 160 | static int sync_serial_ioctl(struct inode *inode, struct file *file, | 160 | static int sync_serial_ioctl(struct file *file, |
| 161 | unsigned int cmd, unsigned long arg); | 161 | unsigned int cmd, unsigned long arg); |
| 162 | static ssize_t sync_serial_write(struct file *file, const char *buf, | 162 | static ssize_t sync_serial_write(struct file *file, const char *buf, |
| 163 | size_t count, loff_t *ppos); | 163 | size_t count, loff_t *ppos); |
| @@ -244,13 +244,13 @@ static unsigned sync_serial_prescale_shadow; | |||
| 244 | #define NUMBER_OF_PORTS 2 | 244 | #define NUMBER_OF_PORTS 2 |
| 245 | 245 | ||
| 246 | static const struct file_operations sync_serial_fops = { | 246 | static const struct file_operations sync_serial_fops = { |
| 247 | .owner = THIS_MODULE, | 247 | .owner = THIS_MODULE, |
| 248 | .write = sync_serial_write, | 248 | .write = sync_serial_write, |
| 249 | .read = sync_serial_read, | 249 | .read = sync_serial_read, |
| 250 | .poll = sync_serial_poll, | 250 | .poll = sync_serial_poll, |
| 251 | .ioctl = sync_serial_ioctl, | 251 | .unlocked_ioctl = sync_serial_ioctl, |
| 252 | .open = sync_serial_open, | 252 | .open = sync_serial_open, |
| 253 | .release = sync_serial_release | 253 | .release = sync_serial_release |
| 254 | }; | 254 | }; |
| 255 | 255 | ||
| 256 | static int __init etrax_sync_serial_init(void) | 256 | static int __init etrax_sync_serial_init(void) |
| @@ -678,7 +678,7 @@ static unsigned int sync_serial_poll(struct file *file, poll_table *wait) | |||
| 678 | return mask; | 678 | return mask; |
| 679 | } | 679 | } |
| 680 | 680 | ||
| 681 | static int sync_serial_ioctl(struct inode *inode, struct file *file, | 681 | static int sync_serial_ioctl_unlocked(struct file *file, |
| 682 | unsigned int cmd, unsigned long arg) | 682 | unsigned int cmd, unsigned long arg) |
| 683 | { | 683 | { |
| 684 | int return_val = 0; | 684 | int return_val = 0; |
| @@ -956,6 +956,18 @@ static int sync_serial_ioctl(struct inode *inode, struct file *file, | |||
| 956 | return return_val; | 956 | return return_val; |
| 957 | } | 957 | } |
| 958 | 958 | ||
| 959 | static long sync_serial_ioctl(struct file *file, | ||
| 960 | unsigned int cmd, unsigned long arg) | ||
| 961 | { | ||
| 962 | long ret; | ||
| 963 | |||
| 964 | lock_kernel(); | ||
| 965 | ret = sync_serial_ioctl_unlocked(file, cmd, arg); | ||
| 966 | unlock_kernel(); | ||
| 967 | |||
| 968 | return ret; | ||
| 969 | } | ||
| 970 | |||
| 959 | 971 | ||
| 960 | static ssize_t sync_serial_write(struct file *file, const char *buf, | 972 | static ssize_t sync_serial_write(struct file *file, const char *buf, |
| 961 | size_t count, loff_t *ppos) | 973 | size_t count, loff_t *ppos) |
diff --git a/arch/cris/arch-v10/kernel/fasttimer.c b/arch/cris/arch-v10/kernel/fasttimer.c index 5ff08a8695e9..8a8196ee8ce8 100644 --- a/arch/cris/arch-v10/kernel/fasttimer.c +++ b/arch/cris/arch-v10/kernel/fasttimer.c | |||
| @@ -467,11 +467,7 @@ timer1_handler(int irq, void *dev_id) | |||
| 467 | 467 | ||
| 468 | static void wake_up_func(unsigned long data) | 468 | static void wake_up_func(unsigned long data) |
| 469 | { | 469 | { |
| 470 | #ifdef DECLARE_WAITQUEUE | 470 | wait_queue_head_t *sleep_wait_p = (wait_queue_head_t *)data; |
| 471 | wait_queue_head_t *sleep_wait_p = (wait_queue_head_t*)data; | ||
| 472 | #else | ||
| 473 | struct wait_queue **sleep_wait_p = (struct wait_queue **)data; | ||
| 474 | #endif | ||
| 475 | wake_up(sleep_wait_p); | 471 | wake_up(sleep_wait_p); |
| 476 | } | 472 | } |
| 477 | 473 | ||
diff --git a/arch/cris/arch-v10/kernel/head.S b/arch/cris/arch-v10/kernel/head.S index fc4577102933..a1f2014b4e3b 100644 --- a/arch/cris/arch-v10/kernel/head.S +++ b/arch/cris/arch-v10/kernel/head.S | |||
| @@ -280,7 +280,7 @@ _no_romfs_in_flash: | |||
| 280 | ;; the "rom fs" we'll possibly use in 2.4 if not JFFS (which does | 280 | ;; the "rom fs" we'll possibly use in 2.4 if not JFFS (which does |
| 281 | ;; not need this mechanism anyway) | 281 | ;; not need this mechanism anyway) |
| 282 | 282 | ||
| 283 | move.d __vmlinux_end, $r0; the image will be after the vmlinux end address | 283 | move.d __init_end, $r0; the image will be after the end of init |
| 284 | move.d [$r0], $r1 ; cramfs assumes same endian on host/target | 284 | move.d [$r0], $r1 ; cramfs assumes same endian on host/target |
| 285 | cmp.d CRAMFS_MAGIC, $r1; magic value in cramfs superblock | 285 | cmp.d CRAMFS_MAGIC, $r1; magic value in cramfs superblock |
| 286 | bne 2f | 286 | bne 2f |
diff --git a/arch/cris/arch-v10/kernel/time.c b/arch/cris/arch-v10/kernel/time.c index 30adae594aef..00eb36f8debf 100644 --- a/arch/cris/arch-v10/kernel/time.c +++ b/arch/cris/arch-v10/kernel/time.c | |||
| @@ -61,66 +61,16 @@ unsigned long get_ns_in_jiffie(void) | |||
| 61 | 61 | ||
| 62 | unsigned long do_slow_gettimeoffset(void) | 62 | unsigned long do_slow_gettimeoffset(void) |
| 63 | { | 63 | { |
| 64 | unsigned long count, t1; | 64 | unsigned long count; |
| 65 | unsigned long usec_count = 0; | ||
| 66 | unsigned short presc_count; | ||
| 67 | |||
| 68 | static unsigned long count_p = TIMER0_DIV;/* for the first call after boot */ | ||
| 69 | static unsigned long jiffies_p = 0; | ||
| 70 | |||
| 71 | /* | ||
| 72 | * cache volatile jiffies temporarily; we have IRQs turned off. | ||
| 73 | */ | ||
| 74 | unsigned long jiffies_t; | ||
| 75 | 65 | ||
| 76 | /* The timer interrupt comes from Etrax timer 0. In order to get | 66 | /* The timer interrupt comes from Etrax timer 0. In order to get |
| 77 | * better precision, we check the current value. It might have | 67 | * better precision, we check the current value. It might have |
| 78 | * underflowed already though. | 68 | * underflowed already though. |
| 79 | */ | 69 | */ |
| 80 | |||
| 81 | #ifndef CONFIG_SVINTO_SIM | ||
| 82 | /* Not available in the xsim simulator. */ | ||
| 83 | count = *R_TIMER0_DATA; | 70 | count = *R_TIMER0_DATA; |
| 84 | presc_count = *R_TIM_PRESC_STATUS; | ||
| 85 | /* presc_count might be wrapped */ | ||
| 86 | t1 = *R_TIMER0_DATA; | ||
| 87 | if (count != t1){ | ||
| 88 | /* it wrapped, read prescaler again... */ | ||
| 89 | presc_count = *R_TIM_PRESC_STATUS; | ||
| 90 | count = t1; | ||
| 91 | } | ||
| 92 | #else | ||
| 93 | count = 0; | ||
| 94 | presc_count = 0; | ||
| 95 | #endif | ||
| 96 | |||
| 97 | jiffies_t = jiffies; | ||
| 98 | 71 | ||
| 99 | /* | ||
| 100 | * avoiding timer inconsistencies (they are rare, but they happen)... | ||
| 101 | * there are one problem that must be avoided here: | ||
| 102 | * 1. the timer counter underflows | ||
| 103 | */ | ||
| 104 | if( jiffies_t == jiffies_p ) { | ||
| 105 | if( count > count_p ) { | ||
| 106 | /* Timer wrapped, use new count and prescale | ||
| 107 | * increase the time corresponding to one jiffie | ||
| 108 | */ | ||
| 109 | usec_count = 1000000/HZ; | ||
| 110 | } | ||
| 111 | } else | ||
| 112 | jiffies_p = jiffies_t; | ||
| 113 | count_p = count; | ||
| 114 | if (presc_count >= PRESCALE_VALUE/2 ){ | ||
| 115 | presc_count = PRESCALE_VALUE - presc_count + PRESCALE_VALUE/2; | ||
| 116 | } else { | ||
| 117 | presc_count = PRESCALE_VALUE - presc_count - PRESCALE_VALUE/2; | ||
| 118 | } | ||
| 119 | /* Convert timer value to usec */ | 72 | /* Convert timer value to usec */ |
| 120 | usec_count += ( (TIMER0_DIV - count) * (1000000/HZ)/TIMER0_DIV ) + | 73 | return (TIMER0_DIV - count) * ((NSEC_PER_SEC/1000)/HZ)/TIMER0_DIV; |
| 121 | (( (presc_count) * (1000000000/PRESCALE_FREQ))/1000); | ||
| 122 | |||
| 123 | return usec_count; | ||
| 124 | } | 74 | } |
| 125 | 75 | ||
| 126 | /* Excerpt from the Etrax100 HSDD about the built-in watchdog: | 76 | /* Excerpt from the Etrax100 HSDD about the built-in watchdog: |
diff --git a/arch/cris/arch-v32/drivers/cryptocop.c b/arch/cris/arch-v32/drivers/cryptocop.c index b70fb34939d9..b07646a30509 100644 --- a/arch/cris/arch-v32/drivers/cryptocop.c +++ b/arch/cris/arch-v32/drivers/cryptocop.c | |||
| @@ -11,7 +11,6 @@ | |||
| 11 | #include <linux/string.h> | 11 | #include <linux/string.h> |
| 12 | #include <linux/fs.h> | 12 | #include <linux/fs.h> |
| 13 | #include <linux/mm.h> | 13 | #include <linux/mm.h> |
| 14 | #include <linux/smp_lock.h> | ||
| 15 | #include <linux/spinlock.h> | 14 | #include <linux/spinlock.h> |
| 16 | #include <linux/stddef.h> | 15 | #include <linux/stddef.h> |
| 17 | 16 | ||
| @@ -217,7 +216,7 @@ static int cryptocop_open(struct inode *, struct file *); | |||
| 217 | 216 | ||
| 218 | static int cryptocop_release(struct inode *, struct file *); | 217 | static int cryptocop_release(struct inode *, struct file *); |
| 219 | 218 | ||
| 220 | static int cryptocop_ioctl(struct inode *inode, struct file *file, | 219 | static long cryptocop_ioctl(struct file *file, |
| 221 | unsigned int cmd, unsigned long arg); | 220 | unsigned int cmd, unsigned long arg); |
| 222 | 221 | ||
| 223 | static void cryptocop_start_job(void); | 222 | static void cryptocop_start_job(void); |
| @@ -279,10 +278,10 @@ static void print_user_dma_lists(struct cryptocop_dma_list_operation *dma_op); | |||
| 279 | 278 | ||
| 280 | 279 | ||
| 281 | const struct file_operations cryptocop_fops = { | 280 | const struct file_operations cryptocop_fops = { |
| 282 | .owner = THIS_MODULE, | 281 | .owner = THIS_MODULE, |
| 283 | .open = cryptocop_open, | 282 | .open = cryptocop_open, |
| 284 | .release = cryptocop_release, | 283 | .release = cryptocop_release, |
| 285 | .ioctl = cryptocop_ioctl | 284 | .unlocked_ioctl = cryptocop_ioctl |
| 286 | }; | 285 | }; |
| 287 | 286 | ||
| 288 | 287 | ||
| @@ -2307,7 +2306,6 @@ static int cryptocop_open(struct inode *inode, struct file *filp) | |||
| 2307 | { | 2306 | { |
| 2308 | int p = iminor(inode); | 2307 | int p = iminor(inode); |
| 2309 | 2308 | ||
| 2310 | cycle_kernel_lock(); | ||
| 2311 | if (p != CRYPTOCOP_MINOR) return -EINVAL; | 2309 | if (p != CRYPTOCOP_MINOR) return -EINVAL; |
| 2312 | 2310 | ||
| 2313 | filp->private_data = NULL; | 2311 | filp->private_data = NULL; |
| @@ -3102,7 +3100,8 @@ static int cryptocop_ioctl_create_session(struct inode *inode, struct file *filp | |||
| 3102 | return 0; | 3100 | return 0; |
| 3103 | } | 3101 | } |
| 3104 | 3102 | ||
| 3105 | static int cryptocop_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg) | 3103 | static long cryptocop_ioctl_unlocked(struct inode *inode, |
| 3104 | struct file *filp, unsigned int cmd, unsigned long arg) | ||
| 3106 | { | 3105 | { |
| 3107 | int err = 0; | 3106 | int err = 0; |
| 3108 | if (_IOC_TYPE(cmd) != ETRAXCRYPTOCOP_IOCTYPE) { | 3107 | if (_IOC_TYPE(cmd) != ETRAXCRYPTOCOP_IOCTYPE) { |
| @@ -3134,6 +3133,19 @@ static int cryptocop_ioctl(struct inode *inode, struct file *filp, unsigned int | |||
| 3134 | return 0; | 3133 | return 0; |
| 3135 | } | 3134 | } |
| 3136 | 3135 | ||
| 3136 | static long | ||
| 3137 | cryptocop_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) | ||
| 3138 | { | ||
| 3139 | struct inode *inode = file->f_path.dentry->d_inode; | ||
| 3140 | long ret; | ||
| 3141 | |||
| 3142 | lock_kernel(); | ||
| 3143 | ret = cryptocop_ioctl_unlocked(inode, filp, cmd, arg); | ||
| 3144 | unlock_kernel(); | ||
| 3145 | |||
| 3146 | return ret; | ||
| 3147 | } | ||
| 3148 | |||
| 3137 | 3149 | ||
| 3138 | #ifdef LDEBUG | 3150 | #ifdef LDEBUG |
| 3139 | static void print_dma_descriptors(struct cryptocop_int_operation *iop) | 3151 | static void print_dma_descriptors(struct cryptocop_int_operation *iop) |
diff --git a/arch/cris/arch-v32/drivers/i2c.c b/arch/cris/arch-v32/drivers/i2c.c index 2fd6a740d895..5a3e900c9a78 100644 --- a/arch/cris/arch-v32/drivers/i2c.c +++ b/arch/cris/arch-v32/drivers/i2c.c | |||
| @@ -32,7 +32,7 @@ | |||
| 32 | #include <linux/fs.h> | 32 | #include <linux/fs.h> |
| 33 | #include <linux/string.h> | 33 | #include <linux/string.h> |
| 34 | #include <linux/init.h> | 34 | #include <linux/init.h> |
| 35 | #include <linux/smp_lock.h> | 35 | #include <linux/mutex.h> |
| 36 | 36 | ||
| 37 | #include <asm/etraxi2c.h> | 37 | #include <asm/etraxi2c.h> |
| 38 | 38 | ||
| @@ -47,6 +47,7 @@ | |||
| 47 | #define D(x) | 47 | #define D(x) |
| 48 | 48 | ||
| 49 | #define I2C_MAJOR 123 /* LOCAL/EXPERIMENTAL */ | 49 | #define I2C_MAJOR 123 /* LOCAL/EXPERIMENTAL */ |
| 50 | static DEFINE_MUTEX(i2c_mutex); | ||
| 50 | static const char i2c_name[] = "i2c"; | 51 | static const char i2c_name[] = "i2c"; |
| 51 | 52 | ||
| 52 | #define CLOCK_LOW_TIME 8 | 53 | #define CLOCK_LOW_TIME 8 |
| @@ -636,7 +637,6 @@ i2c_readreg(unsigned char theSlave, unsigned char theReg) | |||
| 636 | static int | 637 | static int |
| 637 | i2c_open(struct inode *inode, struct file *filp) | 638 | i2c_open(struct inode *inode, struct file *filp) |
| 638 | { | 639 | { |
| 639 | cycle_kernel_lock(); | ||
| 640 | return 0; | 640 | return 0; |
| 641 | } | 641 | } |
| 642 | 642 | ||
| @@ -665,11 +665,11 @@ i2c_ioctl(struct file *file, unsigned int cmd, unsigned long arg) | |||
| 665 | I2C_ARGREG(arg), | 665 | I2C_ARGREG(arg), |
| 666 | I2C_ARGVALUE(arg))); | 666 | I2C_ARGVALUE(arg))); |
| 667 | 667 | ||
| 668 | lock_kernel(); | 668 | mutex_lock(&i2c_mutex); |
| 669 | ret = i2c_writereg(I2C_ARGSLAVE(arg), | 669 | ret = i2c_writereg(I2C_ARGSLAVE(arg), |
| 670 | I2C_ARGREG(arg), | 670 | I2C_ARGREG(arg), |
| 671 | I2C_ARGVALUE(arg)); | 671 | I2C_ARGVALUE(arg)); |
| 672 | unlock_kernel(); | 672 | mutex_unlock(&i2c_mutex); |
| 673 | return ret; | 673 | return ret; |
| 674 | 674 | ||
| 675 | case I2C_READREG: | 675 | case I2C_READREG: |
| @@ -679,9 +679,9 @@ i2c_ioctl(struct file *file, unsigned int cmd, unsigned long arg) | |||
| 679 | D(printk("i2cr %d %d ", | 679 | D(printk("i2cr %d %d ", |
| 680 | I2C_ARGSLAVE(arg), | 680 | I2C_ARGSLAVE(arg), |
| 681 | I2C_ARGREG(arg))); | 681 | I2C_ARGREG(arg))); |
| 682 | lock_kernel(); | 682 | mutex_lock(&i2c_mutex); |
| 683 | val = i2c_readreg(I2C_ARGSLAVE(arg), I2C_ARGREG(arg)); | 683 | val = i2c_readreg(I2C_ARGSLAVE(arg), I2C_ARGREG(arg)); |
| 684 | unlock_kernel(); | 684 | mutex_unlock(&i2c_mutex); |
| 685 | D(printk("= %d\n", val)); | 685 | D(printk("= %d\n", val)); |
| 686 | return val; | 686 | return val; |
| 687 | } | 687 | } |
diff --git a/arch/cris/arch-v32/drivers/mach-a3/gpio.c b/arch/cris/arch-v32/drivers/mach-a3/gpio.c index 97357cfd17bb..2dcd27adbad4 100644 --- a/arch/cris/arch-v32/drivers/mach-a3/gpio.c +++ b/arch/cris/arch-v32/drivers/mach-a3/gpio.c | |||
| @@ -72,8 +72,7 @@ static char gpio_name[] = "etrax gpio"; | |||
| 72 | static int virtual_gpio_ioctl(struct file *file, unsigned int cmd, | 72 | static int virtual_gpio_ioctl(struct file *file, unsigned int cmd, |
| 73 | unsigned long arg); | 73 | unsigned long arg); |
| 74 | #endif | 74 | #endif |
| 75 | static int gpio_ioctl(struct inode *inode, struct file *file, | 75 | static long gpio_ioctl(struct file *file, unsigned int cmd, unsigned long arg); |
| 76 | unsigned int cmd, unsigned long arg); | ||
| 77 | static ssize_t gpio_write(struct file *file, const char __user *buf, | 76 | static ssize_t gpio_write(struct file *file, const char __user *buf, |
| 78 | size_t count, loff_t *off); | 77 | size_t count, loff_t *off); |
| 79 | static int gpio_open(struct inode *inode, struct file *filp); | 78 | static int gpio_open(struct inode *inode, struct file *filp); |
| @@ -521,7 +520,7 @@ static inline unsigned long setget_output(struct gpio_private *priv, | |||
| 521 | return dir_shadow; | 520 | return dir_shadow; |
| 522 | } /* setget_output */ | 521 | } /* setget_output */ |
| 523 | 522 | ||
| 524 | static int gpio_ioctl(struct inode *inode, struct file *file, | 523 | static long gpio_ioctl_unlocked(struct file *file, |
| 525 | unsigned int cmd, unsigned long arg) | 524 | unsigned int cmd, unsigned long arg) |
| 526 | { | 525 | { |
| 527 | unsigned long flags; | 526 | unsigned long flags; |
| @@ -664,6 +663,17 @@ static int gpio_ioctl(struct inode *inode, struct file *file, | |||
| 664 | return 0; | 663 | return 0; |
| 665 | } | 664 | } |
| 666 | 665 | ||
| 666 | static long gpio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) | ||
| 667 | { | ||
| 668 | long ret; | ||
| 669 | |||
| 670 | lock_kernel(); | ||
| 671 | ret = gpio_ioctl_unlocked(file, cmd, arg); | ||
| 672 | unlock_kernel(); | ||
| 673 | |||
| 674 | return ret; | ||
| 675 | } | ||
| 676 | |||
| 667 | #ifdef CONFIG_ETRAX_VIRTUAL_GPIO | 677 | #ifdef CONFIG_ETRAX_VIRTUAL_GPIO |
| 668 | static int virtual_gpio_ioctl(struct file *file, unsigned int cmd, | 678 | static int virtual_gpio_ioctl(struct file *file, unsigned int cmd, |
| 669 | unsigned long arg) | 679 | unsigned long arg) |
| @@ -877,12 +887,12 @@ static int gpio_pwm_ioctl(struct gpio_private *priv, unsigned int cmd, | |||
| 877 | } | 887 | } |
| 878 | 888 | ||
| 879 | static const struct file_operations gpio_fops = { | 889 | static const struct file_operations gpio_fops = { |
| 880 | .owner = THIS_MODULE, | 890 | .owner = THIS_MODULE, |
| 881 | .poll = gpio_poll, | 891 | .poll = gpio_poll, |
| 882 | .ioctl = gpio_ioctl, | 892 | .unlocked_ioctl = gpio_ioctl, |
| 883 | .write = gpio_write, | 893 | .write = gpio_write, |
| 884 | .open = gpio_open, | 894 | .open = gpio_open, |
| 885 | .release = gpio_release, | 895 | .release = gpio_release, |
| 886 | }; | 896 | }; |
| 887 | 897 | ||
| 888 | #ifdef CONFIG_ETRAX_VIRTUAL_GPIO | 898 | #ifdef CONFIG_ETRAX_VIRTUAL_GPIO |
diff --git a/arch/cris/arch-v32/drivers/mach-fs/gpio.c b/arch/cris/arch-v32/drivers/mach-fs/gpio.c index d89ab80498ed..5ec8a7d4e7d7 100644 --- a/arch/cris/arch-v32/drivers/mach-fs/gpio.c +++ b/arch/cris/arch-v32/drivers/mach-fs/gpio.c | |||
| @@ -74,8 +74,7 @@ static wait_queue_head_t *gpio_wq; | |||
| 74 | static int virtual_gpio_ioctl(struct file *file, unsigned int cmd, | 74 | static int virtual_gpio_ioctl(struct file *file, unsigned int cmd, |
| 75 | unsigned long arg); | 75 | unsigned long arg); |
| 76 | #endif | 76 | #endif |
| 77 | static int gpio_ioctl(struct inode *inode, struct file *file, | 77 | static long gpio_ioctl(struct file *file, unsigned int cmd, unsigned long arg); |
| 78 | unsigned int cmd, unsigned long arg); | ||
| 79 | static ssize_t gpio_write(struct file *file, const char *buf, size_t count, | 78 | static ssize_t gpio_write(struct file *file, const char *buf, size_t count, |
| 80 | loff_t *off); | 79 | loff_t *off); |
| 81 | static int gpio_open(struct inode *inode, struct file *filp); | 80 | static int gpio_open(struct inode *inode, struct file *filp); |
| @@ -185,7 +184,7 @@ static volatile unsigned long *dir_oe[NUM_PORTS] = { | |||
| 185 | static unsigned int gpio_poll(struct file *file, struct poll_table_struct *wait) | 184 | static unsigned int gpio_poll(struct file *file, struct poll_table_struct *wait) |
| 186 | { | 185 | { |
| 187 | unsigned int mask = 0; | 186 | unsigned int mask = 0; |
| 188 | struct gpio_private *priv = (struct gpio_private *)file->private_data; | 187 | struct gpio_private *priv = file->private_data; |
| 189 | unsigned long data; | 188 | unsigned long data; |
| 190 | poll_wait(file, &priv->alarm_wq, wait); | 189 | poll_wait(file, &priv->alarm_wq, wait); |
| 191 | if (priv->minor == GPIO_MINOR_A) { | 190 | if (priv->minor == GPIO_MINOR_A) { |
| @@ -353,7 +352,7 @@ gpio_pa_interrupt(int irq, void *dev_id) | |||
| 353 | static ssize_t gpio_write(struct file *file, const char *buf, size_t count, | 352 | static ssize_t gpio_write(struct file *file, const char *buf, size_t count, |
| 354 | loff_t *off) | 353 | loff_t *off) |
| 355 | { | 354 | { |
| 356 | struct gpio_private *priv = (struct gpio_private *)file->private_data; | 355 | struct gpio_private *priv = file->private_data; |
| 357 | unsigned char data, clk_mask, data_mask, write_msb; | 356 | unsigned char data, clk_mask, data_mask, write_msb; |
| 358 | unsigned long flags; | 357 | unsigned long flags; |
| 359 | unsigned long shadow; | 358 | unsigned long shadow; |
| @@ -468,7 +467,7 @@ gpio_release(struct inode *inode, struct file *filp) | |||
| 468 | 467 | ||
| 469 | spin_lock_irq(&alarm_lock); | 468 | spin_lock_irq(&alarm_lock); |
| 470 | p = alarmlist; | 469 | p = alarmlist; |
| 471 | todel = (struct gpio_private *)filp->private_data; | 470 | todel = filp->private_data; |
| 472 | 471 | ||
| 473 | if (p == todel) { | 472 | if (p == todel) { |
| 474 | alarmlist = todel->next; | 473 | alarmlist = todel->next; |
| @@ -557,17 +556,15 @@ inline unsigned long setget_output(struct gpio_private *priv, unsigned long arg) | |||
| 557 | return dir_shadow; | 556 | return dir_shadow; |
| 558 | } /* setget_output */ | 557 | } /* setget_output */ |
| 559 | 558 | ||
| 560 | static int | 559 | static int gpio_leds_ioctl(unsigned int cmd, unsigned long arg); |
| 561 | gpio_leds_ioctl(unsigned int cmd, unsigned long arg); | ||
| 562 | 560 | ||
| 563 | static int | 561 | static int |
| 564 | gpio_ioctl(struct inode *inode, struct file *file, | 562 | gpio_ioctl_unlocked(struct file *file, unsigned int cmd, unsigned long arg) |
| 565 | unsigned int cmd, unsigned long arg) | ||
| 566 | { | 563 | { |
| 567 | unsigned long flags; | 564 | unsigned long flags; |
| 568 | unsigned long val; | 565 | unsigned long val; |
| 569 | unsigned long shadow; | 566 | unsigned long shadow; |
| 570 | struct gpio_private *priv = (struct gpio_private *)file->private_data; | 567 | struct gpio_private *priv = file->private_data; |
| 571 | if (_IOC_TYPE(cmd) != ETRAXGPIO_IOCTYPE) | 568 | if (_IOC_TYPE(cmd) != ETRAXGPIO_IOCTYPE) |
| 572 | return -EINVAL; | 569 | return -EINVAL; |
| 573 | 570 | ||
| @@ -707,6 +704,17 @@ gpio_ioctl(struct inode *inode, struct file *file, | |||
| 707 | return 0; | 704 | return 0; |
| 708 | } | 705 | } |
| 709 | 706 | ||
| 707 | static long gpio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) | ||
| 708 | { | ||
| 709 | long ret; | ||
| 710 | |||
| 711 | lock_kernel(); | ||
| 712 | ret = gpio_ioctl_unlocked(file, cmd, arg); | ||
| 713 | unlock_kernel(); | ||
| 714 | |||
| 715 | return ret; | ||
| 716 | } | ||
| 717 | |||
| 710 | #ifdef CONFIG_ETRAX_VIRTUAL_GPIO | 718 | #ifdef CONFIG_ETRAX_VIRTUAL_GPIO |
| 711 | static int | 719 | static int |
| 712 | virtual_gpio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) | 720 | virtual_gpio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) |
| @@ -714,7 +722,7 @@ virtual_gpio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) | |||
| 714 | unsigned long flags; | 722 | unsigned long flags; |
| 715 | unsigned short val; | 723 | unsigned short val; |
| 716 | unsigned short shadow; | 724 | unsigned short shadow; |
| 717 | struct gpio_private *priv = (struct gpio_private *)file->private_data; | 725 | struct gpio_private *priv = file->private_data; |
| 718 | 726 | ||
| 719 | switch (_IOC_NR(cmd)) { | 727 | switch (_IOC_NR(cmd)) { |
| 720 | case IO_SETBITS: | 728 | case IO_SETBITS: |
| @@ -856,12 +864,12 @@ gpio_leds_ioctl(unsigned int cmd, unsigned long arg) | |||
| 856 | } | 864 | } |
| 857 | 865 | ||
| 858 | static const struct file_operations gpio_fops = { | 866 | static const struct file_operations gpio_fops = { |
| 859 | .owner = THIS_MODULE, | 867 | .owner = THIS_MODULE, |
| 860 | .poll = gpio_poll, | 868 | .poll = gpio_poll, |
| 861 | .ioctl = gpio_ioctl, | 869 | .unlocked_ioctl = gpio_ioctl, |
| 862 | .write = gpio_write, | 870 | .write = gpio_write, |
| 863 | .open = gpio_open, | 871 | .open = gpio_open, |
| 864 | .release = gpio_release, | 872 | .release = gpio_release, |
| 865 | }; | 873 | }; |
| 866 | 874 | ||
| 867 | #ifdef CONFIG_ETRAX_VIRTUAL_GPIO | 875 | #ifdef CONFIG_ETRAX_VIRTUAL_GPIO |
diff --git a/arch/cris/arch-v32/drivers/sync_serial.c b/arch/cris/arch-v32/drivers/sync_serial.c index 4889f196ecd6..ca248f3adb80 100644 --- a/arch/cris/arch-v32/drivers/sync_serial.c +++ b/arch/cris/arch-v32/drivers/sync_serial.c | |||
| @@ -153,7 +153,7 @@ static int sync_serial_open(struct inode *, struct file*); | |||
| 153 | static int sync_serial_release(struct inode*, struct file*); | 153 | static int sync_serial_release(struct inode*, struct file*); |
| 154 | static unsigned int sync_serial_poll(struct file *filp, poll_table *wait); | 154 | static unsigned int sync_serial_poll(struct file *filp, poll_table *wait); |
| 155 | 155 | ||
| 156 | static int sync_serial_ioctl(struct inode*, struct file*, | 156 | static int sync_serial_ioctl(struct file *, |
| 157 | unsigned int cmd, unsigned long arg); | 157 | unsigned int cmd, unsigned long arg); |
| 158 | static ssize_t sync_serial_write(struct file * file, const char * buf, | 158 | static ssize_t sync_serial_write(struct file * file, const char * buf, |
| 159 | size_t count, loff_t *ppos); | 159 | size_t count, loff_t *ppos); |
| @@ -241,13 +241,13 @@ static struct sync_port ports[]= | |||
| 241 | #define NBR_PORTS ARRAY_SIZE(ports) | 241 | #define NBR_PORTS ARRAY_SIZE(ports) |
| 242 | 242 | ||
| 243 | static const struct file_operations sync_serial_fops = { | 243 | static const struct file_operations sync_serial_fops = { |
| 244 | .owner = THIS_MODULE, | 244 | .owner = THIS_MODULE, |
| 245 | .write = sync_serial_write, | 245 | .write = sync_serial_write, |
| 246 | .read = sync_serial_read, | 246 | .read = sync_serial_read, |
| 247 | .poll = sync_serial_poll, | 247 | .poll = sync_serial_poll, |
| 248 | .ioctl = sync_serial_ioctl, | 248 | .unlocked_ioctl = sync_serial_ioctl, |
| 249 | .open = sync_serial_open, | 249 | .open = sync_serial_open, |
| 250 | .release = sync_serial_release | 250 | .release = sync_serial_release |
| 251 | }; | 251 | }; |
| 252 | 252 | ||
| 253 | static int __init etrax_sync_serial_init(void) | 253 | static int __init etrax_sync_serial_init(void) |
| @@ -650,7 +650,7 @@ static unsigned int sync_serial_poll(struct file *file, poll_table *wait) | |||
| 650 | return mask; | 650 | return mask; |
| 651 | } | 651 | } |
| 652 | 652 | ||
| 653 | static int sync_serial_ioctl(struct inode *inode, struct file *file, | 653 | static int sync_serial_ioctl(struct file *file, |
| 654 | unsigned int cmd, unsigned long arg) | 654 | unsigned int cmd, unsigned long arg) |
| 655 | { | 655 | { |
| 656 | int return_val = 0; | 656 | int return_val = 0; |
| @@ -961,6 +961,18 @@ static int sync_serial_ioctl(struct inode *inode, struct file *file, | |||
| 961 | return return_val; | 961 | return return_val; |
| 962 | } | 962 | } |
| 963 | 963 | ||
| 964 | static long sync_serial_ioctl(struct file *file, | ||
| 965 | unsigned int cmd, unsigned long arg) | ||
| 966 | { | ||
| 967 | long ret; | ||
| 968 | |||
| 969 | lock_kernel(); | ||
| 970 | ret = sync_serial_ioctl_unlocked(file, cmd, arg); | ||
| 971 | unlock_kernel(); | ||
| 972 | |||
| 973 | return ret; | ||
| 974 | } | ||
| 975 | |||
| 964 | /* NOTE: sync_serial_write does not support concurrency */ | 976 | /* NOTE: sync_serial_write does not support concurrency */ |
| 965 | static ssize_t sync_serial_write(struct file *file, const char *buf, | 977 | static ssize_t sync_serial_write(struct file *file, const char *buf, |
| 966 | size_t count, loff_t *ppos) | 978 | size_t count, loff_t *ppos) |
diff --git a/arch/cris/arch-v32/kernel/cacheflush.S b/arch/cris/arch-v32/kernel/cacheflush.S index 956e8fb82f01..6fc3d95d7029 100644 --- a/arch/cris/arch-v32/kernel/cacheflush.S +++ b/arch/cris/arch-v32/kernel/cacheflush.S | |||
| @@ -1,4 +1,5 @@ | |||
| 1 | .global cris_flush_cache_range | 1 | .global cris_flush_cache_range |
| 2 | .type cris_flush_cache_range, @function | ||
| 2 | cris_flush_cache_range: | 3 | cris_flush_cache_range: |
| 3 | move.d 1024, $r12 | 4 | move.d 1024, $r12 |
| 4 | cmp.d $r11, $r12 | 5 | cmp.d $r11, $r12 |
| @@ -80,8 +81,10 @@ cris_flush_1KB: | |||
| 80 | addq 32, $r10 | 81 | addq 32, $r10 |
| 81 | ba cris_flush_cache_range | 82 | ba cris_flush_cache_range |
| 82 | sub.d $r12, $r11 | 83 | sub.d $r12, $r11 |
| 84 | .size cris_flush_cache_range, . - cris_flush_cache_range | ||
| 83 | 85 | ||
| 84 | .global cris_flush_cache | 86 | .global cris_flush_cache |
| 87 | .type cris_flush_cache, @function | ||
| 85 | cris_flush_cache: | 88 | cris_flush_cache: |
| 86 | moveq 0, $r10 | 89 | moveq 0, $r10 |
| 87 | cris_flush_line: | 90 | cris_flush_line: |
| @@ -92,3 +95,5 @@ cris_flush_line: | |||
| 92 | fidxd [$r10] | 95 | fidxd [$r10] |
| 93 | ret | 96 | ret |
| 94 | nop | 97 | nop |
| 98 | .size cris_flush_cache, . - cris_flush_cache | ||
| 99 | |||
diff --git a/arch/cris/arch-v32/kernel/entry.S b/arch/cris/arch-v32/kernel/entry.S index 1f39861eac8c..0ecb50b8f0d9 100644 --- a/arch/cris/arch-v32/kernel/entry.S +++ b/arch/cris/arch-v32/kernel/entry.S | |||
| @@ -76,12 +76,15 @@ _need_resched: | |||
| 76 | 76 | ||
| 77 | ; Called at exit from fork. schedule_tail must be called to drop | 77 | ; Called at exit from fork. schedule_tail must be called to drop |
| 78 | ; spinlock if CONFIG_PREEMPT. | 78 | ; spinlock if CONFIG_PREEMPT. |
| 79 | .type ret_from_fork,@function | ||
| 79 | ret_from_fork: | 80 | ret_from_fork: |
| 80 | jsr schedule_tail | 81 | jsr schedule_tail |
| 81 | nop | 82 | nop |
| 82 | ba ret_from_sys_call | 83 | ba ret_from_sys_call |
| 83 | nop | 84 | nop |
| 85 | .size ret_from_fork, . - ret_from_fork | ||
| 84 | 86 | ||
| 87 | .type ret_from_intr,@function | ||
| 85 | ret_from_intr: | 88 | ret_from_intr: |
| 86 | ;; Check for resched if preemptive kernel, or if we're going back to | 89 | ;; Check for resched if preemptive kernel, or if we're going back to |
| 87 | ;; user-mode. This test matches the user_regs(regs) macro. Don't simply | 90 | ;; user-mode. This test matches the user_regs(regs) macro. Don't simply |
| @@ -91,9 +94,10 @@ ret_from_intr: | |||
| 91 | move.d [$acr], $r0 | 94 | move.d [$acr], $r0 |
| 92 | btstq 16, $r0 ; User-mode flag. | 95 | btstq 16, $r0 ; User-mode flag. |
| 93 | bpl _resume_kernel | 96 | bpl _resume_kernel |
| 97 | .size ret_from_intr, . - ret_from_intr + 2 ; +2 includes the dslot. | ||
| 94 | 98 | ||
| 95 | ; Note that di below is in delay slot. | 99 | ; Note that di below is in delay slot. |
| 96 | 100 | .type _resume_userspace,@function | |
| 97 | _resume_userspace: | 101 | _resume_userspace: |
| 98 | di ; So need_resched and sigpending don't change. | 102 | di ; So need_resched and sigpending don't change. |
| 99 | 103 | ||
| @@ -107,6 +111,7 @@ _resume_userspace: | |||
| 107 | nop | 111 | nop |
| 108 | ba _Rexit | 112 | ba _Rexit |
| 109 | nop | 113 | nop |
| 114 | .size _resume_userspace, . - _resume_userspace | ||
| 110 | 115 | ||
| 111 | ;; The system_call is called by a BREAK instruction, which looks pretty | 116 | ;; The system_call is called by a BREAK instruction, which looks pretty |
| 112 | ;; much like any other exception. | 117 | ;; much like any other exception. |
| @@ -122,30 +127,28 @@ _resume_userspace: | |||
| 122 | ;; non-used instructions. Only the non-common cases cause the outlined code | 127 | ;; non-used instructions. Only the non-common cases cause the outlined code |
| 123 | ;; to run.. | 128 | ;; to run.. |
| 124 | 129 | ||
| 130 | .type system_call,@function | ||
| 125 | system_call: | 131 | system_call: |
| 126 | ;; Stack-frame similar to the irq heads, which is reversed in | 132 | ;; Stack-frame similar to the irq heads, which is reversed in |
| 127 | ;; ret_from_sys_call. | 133 | ;; ret_from_sys_call. |
| 128 | subq 12, $sp ; Skip EXS, EDA. | ||
| 129 | move $erp, [$sp] | ||
| 130 | subq 4, $sp | ||
| 131 | move $srp, [$sp] | ||
| 132 | subq 4, $sp | ||
| 133 | move $ccs, [$sp] | ||
| 134 | subq 4, $sp | ||
| 135 | ei ; Allow IRQs while handling system call | ||
| 136 | move $spc, [$sp] | ||
| 137 | subq 4, $sp | ||
| 138 | move $mof, [$sp] | ||
| 139 | subq 4, $sp | ||
| 140 | move $srs, [$sp] | ||
| 141 | subq 4, $sp | ||
| 142 | move.d $acr, [$sp] | ||
| 143 | subq 14*4, $sp ; Make room for R0-R13. | ||
| 144 | movem $r13, [$sp] ; Push R0-R13 | ||
| 145 | subq 4, $sp | ||
| 146 | move.d $r10, [$sp] ; Push orig_r10. | ||
| 147 | 134 | ||
| 148 | ; Set S-bit when kernel debugging to keep hardware breakpoints active. | 135 | sub.d 92, $sp ; Skip EXS and EDA. |
| 136 | movem $r13, [$sp] | ||
| 137 | move.d $sp, $r8 | ||
| 138 | addq 14*4, $r8 | ||
| 139 | move.d $acr, $r0 | ||
| 140 | move $srs, $r1 | ||
| 141 | move $mof, $r2 | ||
| 142 | move $spc, $r3 | ||
| 143 | move $ccs, $r4 | ||
| 144 | move $srp, $r5 | ||
| 145 | move $erp, $r6 | ||
| 146 | subq 4, $sp | ||
| 147 | movem $r6, [$r8] | ||
| 148 | ei ; Enable interrupts while processing syscalls. | ||
| 149 | move.d $r10, [$sp] | ||
| 150 | |||
| 151 | ; Set S-bit when kernel debugging to keep hardware breakpoints active. | ||
| 149 | #ifdef CONFIG_ETRAX_KGDB | 152 | #ifdef CONFIG_ETRAX_KGDB |
| 150 | move $ccs, $r0 | 153 | move $ccs, $r0 |
| 151 | or.d (1<<9), $r0 | 154 | or.d (1<<9), $r0 |
| @@ -217,7 +220,9 @@ ret_from_sys_call: | |||
| 217 | and.d _TIF_ALLWORK_MASK, $r1 | 220 | and.d _TIF_ALLWORK_MASK, $r1 |
| 218 | bne _syscall_exit_work | 221 | bne _syscall_exit_work |
| 219 | nop | 222 | nop |
| 223 | .size system_call, . - system_call | ||
| 220 | 224 | ||
| 225 | .type _Rexit,@function | ||
| 221 | _Rexit: | 226 | _Rexit: |
| 222 | ;; This epilogue MUST match the prologues in multiple_interrupt, irq.h | 227 | ;; This epilogue MUST match the prologues in multiple_interrupt, irq.h |
| 223 | ;; and ptregs.h. | 228 | ;; and ptregs.h. |
| @@ -234,10 +239,12 @@ _Rexit: | |||
| 234 | addq 8, $sp ; Skip EXS, EDA. | 239 | addq 8, $sp ; Skip EXS, EDA. |
| 235 | jump $erp | 240 | jump $erp |
| 236 | rfe ; Restore condition code stack in delay-slot. | 241 | rfe ; Restore condition code stack in delay-slot. |
| 242 | .size _Rexit, . - _Rexit | ||
| 237 | 243 | ||
| 238 | ;; We get here after doing a syscall if extra work might need to be done | 244 | ;; We get here after doing a syscall if extra work might need to be done |
| 239 | ;; perform syscall exit tracing if needed. | 245 | ;; perform syscall exit tracing if needed. |
| 240 | 246 | ||
| 247 | .type _syscall_exit_work,@function | ||
| 241 | _syscall_exit_work: | 248 | _syscall_exit_work: |
| 242 | ;; R0 contains current at this point and irq's are disabled. | 249 | ;; R0 contains current at this point and irq's are disabled. |
| 243 | 250 | ||
| @@ -253,14 +260,18 @@ _syscall_exit_work: | |||
| 253 | move.d $r1, $r9 | 260 | move.d $r1, $r9 |
| 254 | ba _resume_userspace | 261 | ba _resume_userspace |
| 255 | nop | 262 | nop |
| 263 | .size _syscall_exit_work, . - _syscall_exit_work | ||
| 256 | 264 | ||
| 265 | .type _work_pending,@function | ||
| 257 | _work_pending: | 266 | _work_pending: |
| 258 | addoq +TI_flags, $r0, $acr | 267 | addoq +TI_flags, $r0, $acr |
| 259 | move.d [$acr], $r10 | 268 | move.d [$acr], $r10 |
| 260 | btstq TIF_NEED_RESCHED, $r10 ; Need resched? | 269 | btstq TIF_NEED_RESCHED, $r10 ; Need resched? |
| 261 | bpl _work_notifysig ; No, must be signal/notify. | 270 | bpl _work_notifysig ; No, must be signal/notify. |
| 262 | nop | 271 | nop |
| 272 | .size _work_pending, . - _work_pending | ||
| 263 | 273 | ||
| 274 | .type _work_resched,@function | ||
| 264 | _work_resched: | 275 | _work_resched: |
| 265 | move.d $r9, $r1 ; Preserve R9. | 276 | move.d $r9, $r1 ; Preserve R9. |
| 266 | jsr schedule | 277 | jsr schedule |
| @@ -276,7 +287,9 @@ _work_resched: | |||
| 276 | btstq TIF_NEED_RESCHED, $r1 | 287 | btstq TIF_NEED_RESCHED, $r1 |
| 277 | bmi _work_resched ; current->work.need_resched. | 288 | bmi _work_resched ; current->work.need_resched. |
| 278 | nop | 289 | nop |
| 290 | .size _work_resched, . - _work_resched | ||
| 279 | 291 | ||
| 292 | .type _work_notifysig,@function | ||
| 280 | _work_notifysig: | 293 | _work_notifysig: |
| 281 | ;; Deal with pending signals and notify-resume requests. | 294 | ;; Deal with pending signals and notify-resume requests. |
| 282 | 295 | ||
| @@ -288,6 +301,7 @@ _work_notifysig: | |||
| 288 | 301 | ||
| 289 | ba _Rexit | 302 | ba _Rexit |
| 290 | nop | 303 | nop |
| 304 | .size _work_notifysig, . - _work_notifysig | ||
| 291 | 305 | ||
| 292 | ;; We get here as a sidetrack when we've entered a syscall with the | 306 | ;; We get here as a sidetrack when we've entered a syscall with the |
| 293 | ;; trace-bit set. We need to call do_syscall_trace and then continue | 307 | ;; trace-bit set. We need to call do_syscall_trace and then continue |
| @@ -329,41 +343,43 @@ _syscall_trace_entry: | |||
| 329 | ;; | 343 | ;; |
| 330 | ;; Returns old current in R10. | 344 | ;; Returns old current in R10. |
| 331 | 345 | ||
| 346 | .type resume,@function | ||
| 332 | resume: | 347 | resume: |
| 333 | subq 4, $sp | 348 | subq 4, $sp ; Make space for srp. |
| 334 | move $srp, [$sp] ; Keep old/new PC on the stack. | 349 | |
| 335 | add.d $r12, $r10 ; R10 = current tasks tss. | 350 | add.d $r12, $r10 ; R10 = current tasks tss. |
| 336 | addoq +THREAD_ccs, $r10, $acr | 351 | addoq +THREAD_ccs, $r10, $acr |
| 352 | move $srp, [$sp] ; Keep old/new PC on the stack. | ||
| 337 | move $ccs, [$acr] ; Save IRQ enable state. | 353 | move $ccs, [$acr] ; Save IRQ enable state. |
| 338 | di | 354 | di |
| 339 | 355 | ||
| 340 | addoq +THREAD_usp, $r10, $acr | 356 | addoq +THREAD_usp, $r10, $acr |
| 357 | subq 10*4, $sp ; Make room for R9. | ||
| 341 | move $usp, [$acr] ; Save user-mode stackpointer. | 358 | move $usp, [$acr] ; Save user-mode stackpointer. |
| 342 | 359 | ||
| 343 | ;; See copy_thread for the reason why register R9 is saved. | 360 | ;; See copy_thread for the reason why register R9 is saved. |
| 344 | subq 10*4, $sp | ||
| 345 | movem $r9, [$sp] ; Save non-scratch registers and R9. | 361 | movem $r9, [$sp] ; Save non-scratch registers and R9. |
| 346 | 362 | ||
| 347 | addoq +THREAD_ksp, $r10, $acr | 363 | addoq +THREAD_ksp, $r10, $acr |
| 364 | move.d $sp, $r10 ; Return last running task in R10. | ||
| 348 | move.d $sp, [$acr] ; Save kernel SP for old task. | 365 | move.d $sp, [$acr] ; Save kernel SP for old task. |
| 349 | 366 | ||
| 350 | move.d $sp, $r10 ; Return last running task in R10. | ||
| 351 | and.d -8192, $r10 ; Get thread_info from stackpointer. | 367 | and.d -8192, $r10 ; Get thread_info from stackpointer. |
| 352 | addoq +TI_task, $r10, $acr | 368 | addoq +TI_task, $r10, $acr |
| 353 | move.d [$acr], $r10 ; Get task. | ||
| 354 | add.d $r12, $r11 ; Find the new tasks tss. | 369 | add.d $r12, $r11 ; Find the new tasks tss. |
| 370 | move.d [$acr], $r10 ; Get task. | ||
| 355 | addoq +THREAD_ksp, $r11, $acr | 371 | addoq +THREAD_ksp, $r11, $acr |
| 356 | move.d [$acr], $sp ; Switch to new stackframe. | 372 | move.d [$acr], $sp ; Switch to new stackframe. |
| 373 | addoq +THREAD_usp, $r11, $acr | ||
| 357 | movem [$sp+], $r9 ; Restore non-scratch registers and R9. | 374 | movem [$sp+], $r9 ; Restore non-scratch registers and R9. |
| 358 | 375 | ||
| 359 | addoq +THREAD_usp, $r11, $acr | ||
| 360 | move [$acr], $usp ; Restore user-mode stackpointer. | 376 | move [$acr], $usp ; Restore user-mode stackpointer. |
| 361 | 377 | ||
| 362 | addoq +THREAD_ccs, $r11, $acr | 378 | addoq +THREAD_ccs, $r11, $acr |
| 379 | move.d [$sp+], $r11 | ||
| 380 | jump $r11 ; Restore PC. | ||
| 363 | move [$acr], $ccs ; Restore IRQ enable status. | 381 | move [$acr], $ccs ; Restore IRQ enable status. |
| 364 | move.d [$sp+], $acr | 382 | .size resume, . - resume |
| 365 | jump $acr ; Restore PC. | ||
| 366 | nop | ||
| 367 | 383 | ||
| 368 | nmi_interrupt: | 384 | nmi_interrupt: |
| 369 | 385 | ||
| @@ -426,6 +442,7 @@ spurious_interrupt: | |||
| 426 | ;; time. Jump to the first set interrupt bit in a priotiry fashion. The | 442 | ;; time. Jump to the first set interrupt bit in a priotiry fashion. The |
| 427 | ;; hardware will call the unserved interrupts after the handler | 443 | ;; hardware will call the unserved interrupts after the handler |
| 428 | ;; finishes. | 444 | ;; finishes. |
| 445 | .type multiple_interrupt, @function | ||
| 429 | multiple_interrupt: | 446 | multiple_interrupt: |
| 430 | ;; This prologue MUST match the one in irq.h and the struct in ptregs.h! | 447 | ;; This prologue MUST match the one in irq.h and the struct in ptregs.h! |
| 431 | subq 12, $sp ; Skip EXS, EDA. | 448 | subq 12, $sp ; Skip EXS, EDA. |
| @@ -458,6 +475,7 @@ multiple_interrupt: | |||
| 458 | move.d $sp, $r10 | 475 | move.d $sp, $r10 |
| 459 | jump ret_from_intr | 476 | jump ret_from_intr |
| 460 | nop | 477 | nop |
| 478 | .size multiple_interrupt, . - multiple_interrupt | ||
| 461 | 479 | ||
| 462 | do_sigtrap: | 480 | do_sigtrap: |
| 463 | ;; Sigtraps the process that executed the BREAK instruction. Creates a | 481 | ;; Sigtraps the process that executed the BREAK instruction. Creates a |
| @@ -514,11 +532,13 @@ _ugdb_handle_exception: | |||
| 514 | move.d [$sp+], $r0 ; Restore R0 in delay slot. | 532 | move.d [$sp+], $r0 ; Restore R0 in delay slot. |
| 515 | 533 | ||
| 516 | .global kernel_execve | 534 | .global kernel_execve |
| 535 | .type kernel_execve,@function | ||
| 517 | kernel_execve: | 536 | kernel_execve: |
| 518 | move.d __NR_execve, $r9 | 537 | move.d __NR_execve, $r9 |
| 519 | break 13 | 538 | break 13 |
| 520 | ret | 539 | ret |
| 521 | nop | 540 | nop |
| 541 | .size kernel_execve, . - kernel_execve | ||
| 522 | 542 | ||
| 523 | .data | 543 | .data |
| 524 | 544 | ||
diff --git a/arch/cris/arch-v32/kernel/head.S b/arch/cris/arch-v32/kernel/head.S index 76266f80a5f1..5d502b9ab56d 100644 --- a/arch/cris/arch-v32/kernel/head.S +++ b/arch/cris/arch-v32/kernel/head.S | |||
| @@ -69,7 +69,13 @@ secondary_cpu_entry: /* Entry point for secondary CPUs */ | |||
| 69 | ;; | 69 | ;; |
| 70 | ;; Note; 3 cycles is needed for a bank-select to take effect. Further; | 70 | ;; Note; 3 cycles is needed for a bank-select to take effect. Further; |
| 71 | ;; bank 1 is the instruction MMU, bank 2 is the data MMU. | 71 | ;; bank 1 is the instruction MMU, bank 2 is the data MMU. |
| 72 | #ifndef CONFIG_ETRAX_VCS_SIM | 72 | |
| 73 | #ifdef CONFIG_CRIS_MACH_ARTPEC3 | ||
| 74 | move.d REG_FIELD(mmu, rw_mm_kbase_hi, base_e, 8) \ | ||
| 75 | | REG_FIELD(mmu, rw_mm_kbase_hi, base_c, 4) \ | ||
| 76 | | REG_FIELD(mmu, rw_mm_kbase_hi, base_d, 5) \ | ||
| 77 | | REG_FIELD(mmu, rw_mm_kbase_hi, base_b, 0xb), $r0 | ||
| 78 | #elif !defined(CONFIG_ETRAX_VCS_SIM) | ||
| 73 | move.d REG_FIELD(mmu, rw_mm_kbase_hi, base_e, 8) \ | 79 | move.d REG_FIELD(mmu, rw_mm_kbase_hi, base_e, 8) \ |
| 74 | | REG_FIELD(mmu, rw_mm_kbase_hi, base_c, 4) \ | 80 | | REG_FIELD(mmu, rw_mm_kbase_hi, base_c, 4) \ |
| 75 | | REG_FIELD(mmu, rw_mm_kbase_hi, base_b, 0xb), $r0 | 81 | | REG_FIELD(mmu, rw_mm_kbase_hi, base_b, 0xb), $r0 |
| @@ -88,7 +94,39 @@ secondary_cpu_entry: /* Entry point for secondary CPUs */ | |||
| 88 | 94 | ||
| 89 | ;; Enable certain page protections and setup linear mapping | 95 | ;; Enable certain page protections and setup linear mapping |
| 90 | ;; for f,e,c,b,4,0. | 96 | ;; for f,e,c,b,4,0. |
| 91 | #ifndef CONFIG_ETRAX_VCS_SIM | 97 | |
| 98 | ;; ARTPEC-3: | ||
| 99 | ;; c,d used for linear kernel mapping, up to 512 MB | ||
| 100 | ;; e used for vmalloc | ||
| 101 | ;; f unused, but page mapped to get page faults | ||
| 102 | |||
| 103 | ;; ETRAX FS: | ||
| 104 | ;; c used for linear kernel mapping, up to 256 MB | ||
| 105 | ;; d used for vmalloc | ||
| 106 | ;; e,f used for memory-mapped NOR flash | ||
| 107 | |||
| 108 | #ifdef CONFIG_CRIS_MACH_ARTPEC3 | ||
| 109 | move.d REG_STATE(mmu, rw_mm_cfg, we, on) \ | ||
| 110 | | REG_STATE(mmu, rw_mm_cfg, acc, on) \ | ||
| 111 | | REG_STATE(mmu, rw_mm_cfg, ex, on) \ | ||
| 112 | | REG_STATE(mmu, rw_mm_cfg, inv, on) \ | ||
| 113 | | REG_STATE(mmu, rw_mm_cfg, seg_f, page) \ | ||
| 114 | | REG_STATE(mmu, rw_mm_cfg, seg_e, page) \ | ||
| 115 | | REG_STATE(mmu, rw_mm_cfg, seg_d, linear) \ | ||
| 116 | | REG_STATE(mmu, rw_mm_cfg, seg_c, linear) \ | ||
| 117 | | REG_STATE(mmu, rw_mm_cfg, seg_b, linear) \ | ||
| 118 | | REG_STATE(mmu, rw_mm_cfg, seg_a, page) \ | ||
| 119 | | REG_STATE(mmu, rw_mm_cfg, seg_9, page) \ | ||
| 120 | | REG_STATE(mmu, rw_mm_cfg, seg_8, page) \ | ||
| 121 | | REG_STATE(mmu, rw_mm_cfg, seg_7, page) \ | ||
| 122 | | REG_STATE(mmu, rw_mm_cfg, seg_6, page) \ | ||
| 123 | | REG_STATE(mmu, rw_mm_cfg, seg_5, page) \ | ||
| 124 | | REG_STATE(mmu, rw_mm_cfg, seg_4, linear) \ | ||
| 125 | | REG_STATE(mmu, rw_mm_cfg, seg_3, page) \ | ||
| 126 | | REG_STATE(mmu, rw_mm_cfg, seg_2, page) \ | ||
| 127 | | REG_STATE(mmu, rw_mm_cfg, seg_1, page) \ | ||
| 128 | | REG_STATE(mmu, rw_mm_cfg, seg_0, linear), $r2 | ||
| 129 | #elif !defined(CONFIG_ETRAX_VCS_SIM) | ||
| 92 | move.d REG_STATE(mmu, rw_mm_cfg, we, on) \ | 130 | move.d REG_STATE(mmu, rw_mm_cfg, we, on) \ |
| 93 | | REG_STATE(mmu, rw_mm_cfg, acc, on) \ | 131 | | REG_STATE(mmu, rw_mm_cfg, acc, on) \ |
| 94 | | REG_STATE(mmu, rw_mm_cfg, ex, on) \ | 132 | | REG_STATE(mmu, rw_mm_cfg, ex, on) \ |
| @@ -329,7 +367,7 @@ _no_romfs_in_flash: | |||
| 329 | ;; For jffs2, a jhead is prepended which contains with magic and length. | 367 | ;; For jffs2, a jhead is prepended which contains with magic and length. |
| 330 | ;; The jhead is not part of the jffs2 partition however. | 368 | ;; The jhead is not part of the jffs2 partition however. |
| 331 | #ifndef CONFIG_ETRAXFS_SIM | 369 | #ifndef CONFIG_ETRAXFS_SIM |
| 332 | move.d __vmlinux_end, $r0 | 370 | move.d __bss_start, $r0 |
| 333 | #else | 371 | #else |
| 334 | move.d __end, $r0 | 372 | move.d __end, $r0 |
| 335 | #endif | 373 | #endif |
diff --git a/arch/cris/arch-v32/kernel/irq.c b/arch/cris/arch-v32/kernel/irq.c index 0b1febe44aa3..2ed48ae3d313 100644 --- a/arch/cris/arch-v32/kernel/irq.c +++ b/arch/cris/arch-v32/kernel/irq.c | |||
| @@ -97,7 +97,11 @@ extern void breakh_BUG(void); | |||
| 97 | /* | 97 | /* |
| 98 | * Build the IRQ handler stubs using macros from irq.h. | 98 | * Build the IRQ handler stubs using macros from irq.h. |
| 99 | */ | 99 | */ |
| 100 | #ifdef CONFIG_CRIS_MACH_ARTPEC3 | ||
| 101 | BUILD_TIMER_IRQ(0x31, 0) | ||
| 102 | #else | ||
| 100 | BUILD_IRQ(0x31) | 103 | BUILD_IRQ(0x31) |
| 104 | #endif | ||
| 101 | BUILD_IRQ(0x32) | 105 | BUILD_IRQ(0x32) |
| 102 | BUILD_IRQ(0x33) | 106 | BUILD_IRQ(0x33) |
| 103 | BUILD_IRQ(0x34) | 107 | BUILD_IRQ(0x34) |
| @@ -123,7 +127,11 @@ BUILD_IRQ(0x47) | |||
| 123 | BUILD_IRQ(0x48) | 127 | BUILD_IRQ(0x48) |
| 124 | BUILD_IRQ(0x49) | 128 | BUILD_IRQ(0x49) |
| 125 | BUILD_IRQ(0x4a) | 129 | BUILD_IRQ(0x4a) |
| 130 | #ifdef CONFIG_ETRAXFS | ||
| 131 | BUILD_TIMER_IRQ(0x4b, 0) | ||
| 132 | #else | ||
| 126 | BUILD_IRQ(0x4b) | 133 | BUILD_IRQ(0x4b) |
| 134 | #endif | ||
| 127 | BUILD_IRQ(0x4c) | 135 | BUILD_IRQ(0x4c) |
| 128 | BUILD_IRQ(0x4d) | 136 | BUILD_IRQ(0x4d) |
| 129 | BUILD_IRQ(0x4e) | 137 | BUILD_IRQ(0x4e) |
| @@ -199,25 +207,20 @@ block_irq(int irq, int cpu) | |||
| 199 | unsigned long flags; | 207 | unsigned long flags; |
| 200 | 208 | ||
| 201 | spin_lock_irqsave(&irq_lock, flags); | 209 | spin_lock_irqsave(&irq_lock, flags); |
| 202 | if (irq - FIRST_IRQ < 32) | 210 | /* Remember, 1 let thru, 0 block. */ |
| 211 | if (irq - FIRST_IRQ < 32) { | ||
| 203 | intr_mask = REG_RD_INT_VECT(intr_vect, irq_regs[cpu], | 212 | intr_mask = REG_RD_INT_VECT(intr_vect, irq_regs[cpu], |
| 204 | rw_mask, 0); | 213 | rw_mask, 0); |
| 205 | else | ||
| 206 | intr_mask = REG_RD_INT_VECT(intr_vect, irq_regs[cpu], | ||
| 207 | rw_mask, 1); | ||
| 208 | |||
| 209 | /* Remember; 1 let thru, 0 block. */ | ||
| 210 | if (irq - FIRST_IRQ < 32) | ||
| 211 | intr_mask &= ~(1 << (irq - FIRST_IRQ)); | 214 | intr_mask &= ~(1 << (irq - FIRST_IRQ)); |
| 212 | else | ||
| 213 | intr_mask &= ~(1 << (irq - FIRST_IRQ - 32)); | ||
| 214 | |||
| 215 | if (irq - FIRST_IRQ < 32) | ||
| 216 | REG_WR_INT_VECT(intr_vect, irq_regs[cpu], rw_mask, | 215 | REG_WR_INT_VECT(intr_vect, irq_regs[cpu], rw_mask, |
| 217 | 0, intr_mask); | 216 | 0, intr_mask); |
| 218 | else | 217 | } else { |
| 218 | intr_mask = REG_RD_INT_VECT(intr_vect, irq_regs[cpu], | ||
| 219 | rw_mask, 1); | ||
| 220 | intr_mask &= ~(1 << (irq - FIRST_IRQ - 32)); | ||
| 219 | REG_WR_INT_VECT(intr_vect, irq_regs[cpu], rw_mask, | 221 | REG_WR_INT_VECT(intr_vect, irq_regs[cpu], rw_mask, |
| 220 | 1, intr_mask); | 222 | 1, intr_mask); |
| 223 | } | ||
| 221 | spin_unlock_irqrestore(&irq_lock, flags); | 224 | spin_unlock_irqrestore(&irq_lock, flags); |
| 222 | } | 225 | } |
| 223 | 226 | ||
| @@ -228,26 +231,20 @@ unblock_irq(int irq, int cpu) | |||
| 228 | unsigned long flags; | 231 | unsigned long flags; |
| 229 | 232 | ||
| 230 | spin_lock_irqsave(&irq_lock, flags); | 233 | spin_lock_irqsave(&irq_lock, flags); |
| 231 | if (irq - FIRST_IRQ < 32) | 234 | /* Remember, 1 let thru, 0 block. */ |
| 235 | if (irq - FIRST_IRQ < 32) { | ||
| 232 | intr_mask = REG_RD_INT_VECT(intr_vect, irq_regs[cpu], | 236 | intr_mask = REG_RD_INT_VECT(intr_vect, irq_regs[cpu], |
| 233 | rw_mask, 0); | 237 | rw_mask, 0); |
| 234 | else | ||
| 235 | intr_mask = REG_RD_INT_VECT(intr_vect, irq_regs[cpu], | ||
| 236 | rw_mask, 1); | ||
| 237 | |||
| 238 | /* Remember; 1 let thru, 0 block. */ | ||
| 239 | if (irq - FIRST_IRQ < 32) | ||
| 240 | intr_mask |= (1 << (irq - FIRST_IRQ)); | 238 | intr_mask |= (1 << (irq - FIRST_IRQ)); |
| 241 | else | ||
| 242 | intr_mask |= (1 << (irq - FIRST_IRQ - 32)); | ||
| 243 | |||
| 244 | if (irq - FIRST_IRQ < 32) | ||
| 245 | REG_WR_INT_VECT(intr_vect, irq_regs[cpu], rw_mask, | 239 | REG_WR_INT_VECT(intr_vect, irq_regs[cpu], rw_mask, |
| 246 | 0, intr_mask); | 240 | 0, intr_mask); |
| 247 | else | 241 | } else { |
| 242 | intr_mask = REG_RD_INT_VECT(intr_vect, irq_regs[cpu], | ||
| 243 | rw_mask, 1); | ||
| 244 | intr_mask |= (1 << (irq - FIRST_IRQ - 32)); | ||
| 248 | REG_WR_INT_VECT(intr_vect, irq_regs[cpu], rw_mask, | 245 | REG_WR_INT_VECT(intr_vect, irq_regs[cpu], rw_mask, |
| 249 | 1, intr_mask); | 246 | 1, intr_mask); |
| 250 | 247 | } | |
| 251 | spin_unlock_irqrestore(&irq_lock, flags); | 248 | spin_unlock_irqrestore(&irq_lock, flags); |
| 252 | } | 249 | } |
| 253 | 250 | ||
diff --git a/arch/cris/arch-v32/kernel/kgdb.c b/arch/cris/arch-v32/kernel/kgdb.c index c981fd663323..6b653323d796 100644 --- a/arch/cris/arch-v32/kernel/kgdb.c +++ b/arch/cris/arch-v32/kernel/kgdb.c | |||
| @@ -174,10 +174,10 @@ | |||
| 174 | #include <asm/ptrace.h> | 174 | #include <asm/ptrace.h> |
| 175 | 175 | ||
| 176 | #include <asm/irq.h> | 176 | #include <asm/irq.h> |
| 177 | #include <arch/hwregs/reg_map.h> | 177 | #include <hwregs/reg_map.h> |
| 178 | #include <arch/hwregs/reg_rdwr.h> | 178 | #include <hwregs/reg_rdwr.h> |
| 179 | #include <arch/hwregs/intr_vect_defs.h> | 179 | #include <hwregs/intr_vect_defs.h> |
| 180 | #include <arch/hwregs/ser_defs.h> | 180 | #include <hwregs/ser_defs.h> |
| 181 | 181 | ||
| 182 | /* From entry.S. */ | 182 | /* From entry.S. */ |
| 183 | extern void gdb_handle_exception(void); | 183 | extern void gdb_handle_exception(void); |
| @@ -988,26 +988,26 @@ stub_is_stopped(int sigval) | |||
| 988 | } | 988 | } |
| 989 | /* Only send PC, frame and stack pointer. */ | 989 | /* Only send PC, frame and stack pointer. */ |
| 990 | read_register(PC, ®_cont); | 990 | read_register(PC, ®_cont); |
| 991 | ptr = pack_hex_byte(PC); | 991 | ptr = pack_hex_byte(ptr, PC); |
| 992 | *ptr++ = ':'; | 992 | *ptr++ = ':'; |
| 993 | ptr = mem2hex(ptr, (unsigned char *)®_cont, register_size[PC]); | 993 | ptr = mem2hex(ptr, (unsigned char *)®_cont, register_size[PC]); |
| 994 | *ptr++ = ';'; | 994 | *ptr++ = ';'; |
| 995 | 995 | ||
| 996 | read_register(R8, ®_cont); | 996 | read_register(R8, ®_cont); |
| 997 | ptr = pack_hex_byte(R8); | 997 | ptr = pack_hex_byte(ptr, R8); |
| 998 | *ptr++ = ':'; | 998 | *ptr++ = ':'; |
| 999 | ptr = mem2hex(ptr, (unsigned char *)®_cont, register_size[R8]); | 999 | ptr = mem2hex(ptr, (unsigned char *)®_cont, register_size[R8]); |
| 1000 | *ptr++ = ';'; | 1000 | *ptr++ = ';'; |
| 1001 | 1001 | ||
| 1002 | read_register(SP, ®_cont); | 1002 | read_register(SP, ®_cont); |
| 1003 | ptr = pack_hex_byte(SP); | 1003 | ptr = pack_hex_byte(ptr, SP); |
| 1004 | *ptr++ = ':'; | 1004 | *ptr++ = ':'; |
| 1005 | ptr = mem2hex(ptr, (unsigned char *)®_cont, register_size[SP]); | 1005 | ptr = mem2hex(ptr, (unsigned char *)®_cont, register_size[SP]); |
| 1006 | *ptr++ = ';'; | 1006 | *ptr++ = ';'; |
| 1007 | 1007 | ||
| 1008 | /* Send ERP as well; this will save us an entire register fetch in some cases. */ | 1008 | /* Send ERP as well; this will save us an entire register fetch in some cases. */ |
| 1009 | read_register(ERP, ®_cont); | 1009 | read_register(ERP, ®_cont); |
| 1010 | ptr = pack_hex_byte(ERP); | 1010 | ptr = pack_hex_byte(ptr, ERP); |
| 1011 | *ptr++ = ':'; | 1011 | *ptr++ = ':'; |
| 1012 | ptr = mem2hex(ptr, (unsigned char *)®_cont, register_size[ERP]); | 1012 | ptr = mem2hex(ptr, (unsigned char *)®_cont, register_size[ERP]); |
| 1013 | *ptr++ = ';'; | 1013 | *ptr++ = ';'; |
diff --git a/arch/cris/arch-v32/kernel/kgdb_asm.S b/arch/cris/arch-v32/kernel/kgdb_asm.S index eba93e7e4aad..f3a47605902a 100644 --- a/arch/cris/arch-v32/kernel/kgdb_asm.S +++ b/arch/cris/arch-v32/kernel/kgdb_asm.S | |||
| @@ -5,7 +5,7 @@ | |||
| 5 | * port exceptions for kernel debugging purposes. | 5 | * port exceptions for kernel debugging purposes. |
| 6 | */ | 6 | */ |
| 7 | 7 | ||
| 8 | #include <arch/hwregs/intr_vect.h> | 8 | #include <hwregs/intr_vect.h> |
| 9 | 9 | ||
| 10 | ;; Exported functions. | 10 | ;; Exported functions. |
| 11 | .globl kgdb_handle_exception | 11 | .globl kgdb_handle_exception |
diff --git a/arch/cris/arch-v32/kernel/pinmux.c b/arch/cris/arch-v32/kernel/pinmux.c deleted file mode 100644 index f6f3637a4194..000000000000 --- a/arch/cris/arch-v32/kernel/pinmux.c +++ /dev/null | |||
| @@ -1,229 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * Allocator for I/O pins. All pins are allocated to GPIO at bootup. | ||
| 3 | * Unassigned pins and GPIO pins can be allocated to a fixed interface | ||
| 4 | * or the I/O processor instead. | ||
| 5 | * | ||
| 6 | * Copyright (c) 2004 Axis Communications AB. | ||
| 7 | */ | ||
| 8 | |||
| 9 | #include <linux/init.h> | ||
| 10 | #include <linux/errno.h> | ||
| 11 | #include <linux/kernel.h> | ||
| 12 | #include <linux/string.h> | ||
| 13 | #include <linux/spinlock.h> | ||
| 14 | #include <arch/hwregs/reg_map.h> | ||
| 15 | #include <arch/hwregs/reg_rdwr.h> | ||
| 16 | #include <arch/pinmux.h> | ||
| 17 | #include <arch/hwregs/pinmux_defs.h> | ||
| 18 | |||
| 19 | #undef DEBUG | ||
| 20 | |||
| 21 | #define PORT_PINS 18 | ||
| 22 | #define PORTS 4 | ||
| 23 | |||
| 24 | static char pins[PORTS][PORT_PINS]; | ||
| 25 | static DEFINE_SPINLOCK(pinmux_lock); | ||
| 26 | |||
| 27 | static void crisv32_pinmux_set(int port); | ||
| 28 | |||
| 29 | int | ||
| 30 | crisv32_pinmux_init(void) | ||
| 31 | { | ||
| 32 | static int initialized = 0; | ||
| 33 | |||
| 34 | if (!initialized) { | ||
| 35 | reg_pinmux_rw_pa pa = REG_RD(pinmux, regi_pinmux, rw_pa); | ||
| 36 | initialized = 1; | ||
| 37 | pa.pa0 = pa.pa1 = pa.pa2 = pa.pa3 = | ||
| 38 | pa.pa4 = pa.pa5 = pa.pa6 = pa.pa7 = regk_pinmux_yes; | ||
| 39 | REG_WR(pinmux, regi_pinmux, rw_pa, pa); | ||
| 40 | crisv32_pinmux_alloc(PORT_B, 0, PORT_PINS - 1, pinmux_gpio); | ||
| 41 | crisv32_pinmux_alloc(PORT_C, 0, PORT_PINS - 1, pinmux_gpio); | ||
| 42 | crisv32_pinmux_alloc(PORT_D, 0, PORT_PINS - 1, pinmux_gpio); | ||
| 43 | crisv32_pinmux_alloc(PORT_E, 0, PORT_PINS - 1, pinmux_gpio); | ||
| 44 | } | ||
| 45 | |||
| 46 | return 0; | ||
| 47 | } | ||
| 48 | |||
| 49 | int | ||
| 50 | crisv32_pinmux_alloc(int port, int first_pin, int last_pin, enum pin_mode mode) | ||
| 51 | { | ||
| 52 | int i; | ||
| 53 | unsigned long flags; | ||
| 54 | |||
| 55 | crisv32_pinmux_init(); | ||
| 56 | |||
| 57 | if (port > PORTS || port < 0) | ||
| 58 | return -EINVAL; | ||
| 59 | |||
| 60 | spin_lock_irqsave(&pinmux_lock, flags); | ||
| 61 | |||
| 62 | for (i = first_pin; i <= last_pin; i++) | ||
| 63 | { | ||
| 64 | if ((pins[port][i] != pinmux_none) && (pins[port][i] != pinmux_gpio) && | ||
| 65 | (pins[port][i] != mode)) | ||
| 66 | { | ||
| 67 | spin_unlock_irqrestore(&pinmux_lock, flags); | ||
| 68 | #ifdef DEBUG | ||
| 69 | panic("Pinmux alloc failed!\n"); | ||
| 70 | #endif | ||
| 71 | return -EPERM; | ||
| 72 | } | ||
| 73 | } | ||
| 74 | |||
| 75 | for (i = first_pin; i <= last_pin; i++) | ||
| 76 | pins[port][i] = mode; | ||
| 77 | |||
| 78 | crisv32_pinmux_set(port); | ||
| 79 | |||
| 80 | spin_unlock_irqrestore(&pinmux_lock, flags); | ||
| 81 | |||
| 82 | return 0; | ||
| 83 | } | ||
| 84 | |||
| 85 | int | ||
| 86 | crisv32_pinmux_alloc_fixed(enum fixed_function function) | ||
| 87 | { | ||
| 88 | int ret = -EINVAL; | ||
| 89 | char saved[sizeof pins]; | ||
| 90 | unsigned long flags; | ||
| 91 | |||
| 92 | spin_lock_irqsave(&pinmux_lock, flags); | ||
| 93 | |||
| 94 | /* Save internal data for recovery */ | ||
| 95 | memcpy(saved, pins, sizeof pins); | ||
| 96 | |||
| 97 | reg_pinmux_rw_hwprot hwprot = REG_RD(pinmux, regi_pinmux, rw_hwprot); | ||
| 98 | |||
| 99 | switch(function) | ||
| 100 | { | ||
| 101 | case pinmux_ser1: | ||
| 102 | ret = crisv32_pinmux_alloc(PORT_C, 4, 7, pinmux_fixed); | ||
| 103 | hwprot.ser1 = regk_pinmux_yes; | ||
| 104 | break; | ||
| 105 | case pinmux_ser2: | ||
| 106 | ret = crisv32_pinmux_alloc(PORT_C, 8, 11, pinmux_fixed); | ||
| 107 | hwprot.ser2 = regk_pinmux_yes; | ||
| 108 | break; | ||
| 109 | case pinmux_ser3: | ||
| 110 | ret = crisv32_pinmux_alloc(PORT_C, 12, 15, pinmux_fixed); | ||
| 111 | hwprot.ser3 = regk_pinmux_yes; | ||
| 112 | break; | ||
| 113 | case pinmux_sser0: | ||
| 114 | ret = crisv32_pinmux_alloc(PORT_C, 0, 3, pinmux_fixed); | ||
| 115 | ret |= crisv32_pinmux_alloc(PORT_C, 16, 16, pinmux_fixed); | ||
| 116 | hwprot.sser0 = regk_pinmux_yes; | ||
| 117 | break; | ||
| 118 | case pinmux_sser1: | ||
| 119 | ret = crisv32_pinmux_alloc(PORT_D, 0, 4, pinmux_fixed); | ||
| 120 | hwprot.sser1 = regk_pinmux_yes; | ||
| 121 | break; | ||
| 122 | case pinmux_ata0: | ||
| 123 | ret = crisv32_pinmux_alloc(PORT_D, 5, 7, pinmux_fixed); | ||
| 124 | ret |= crisv32_pinmux_alloc(PORT_D, 15, 17, pinmux_fixed); | ||
| 125 | hwprot.ata0 = regk_pinmux_yes; | ||
| 126 | break; | ||
| 127 | case pinmux_ata1: | ||
| 128 | ret = crisv32_pinmux_alloc(PORT_D, 0, 4, pinmux_fixed); | ||
| 129 | ret |= crisv32_pinmux_alloc(PORT_E, 17, 17, pinmux_fixed); | ||
| 130 | hwprot.ata1 = regk_pinmux_yes; | ||
| 131 | break; | ||
| 132 | case pinmux_ata2: | ||
| 133 | ret = crisv32_pinmux_alloc(PORT_C, 11, 15, pinmux_fixed); | ||
| 134 | ret |= crisv32_pinmux_alloc(PORT_E, 3, 3, pinmux_fixed); | ||
| 135 | hwprot.ata2 = regk_pinmux_yes; | ||
| 136 | break; | ||
| 137 | case pinmux_ata3: | ||
| 138 | ret = crisv32_pinmux_alloc(PORT_C, 8, 10, pinmux_fixed); | ||
| 139 | ret |= crisv32_pinmux_alloc(PORT_C, 0, 2, pinmux_fixed); | ||
| 140 | hwprot.ata2 = regk_pinmux_yes; | ||
| 141 | break; | ||
| 142 | case pinmux_ata: | ||
| 143 | ret = crisv32_pinmux_alloc(PORT_B, 0, 15, pinmux_fixed); | ||
| 144 | ret |= crisv32_pinmux_alloc(PORT_D, 8, 15, pinmux_fixed); | ||
| 145 | hwprot.ata = regk_pinmux_yes; | ||
| 146 | break; | ||
| 147 | case pinmux_eth1: | ||
| 148 | ret = crisv32_pinmux_alloc(PORT_E, 0, 17, pinmux_fixed); | ||
| 149 | hwprot.eth1 = regk_pinmux_yes; | ||
| 150 | hwprot.eth1_mgm = regk_pinmux_yes; | ||
| 151 | break; | ||
| 152 | case pinmux_timer: | ||
| 153 | ret = crisv32_pinmux_alloc(PORT_C, 16, 16, pinmux_fixed); | ||
| 154 | hwprot.timer = regk_pinmux_yes; | ||
| 155 | spin_unlock_irqrestore(&pinmux_lock, flags); | ||
| 156 | return ret; | ||
| 157 | } | ||
| 158 | |||
| 159 | if (!ret) | ||
| 160 | REG_WR(pinmux, regi_pinmux, rw_hwprot, hwprot); | ||
| 161 | else | ||
| 162 | memcpy(pins, saved, sizeof pins); | ||
| 163 | |||
| 164 | spin_unlock_irqrestore(&pinmux_lock, flags); | ||
| 165 | |||
| 166 | return ret; | ||
| 167 | } | ||
| 168 | |||
| 169 | void | ||
| 170 | crisv32_pinmux_set(int port) | ||
| 171 | { | ||
| 172 | int i; | ||
| 173 | int gpio_val = 0; | ||
| 174 | int iop_val = 0; | ||
| 175 | |||
| 176 | for (i = 0; i < PORT_PINS; i++) | ||
| 177 | { | ||
| 178 | if (pins[port][i] == pinmux_gpio) | ||
| 179 | gpio_val |= (1 << i); | ||
| 180 | else if (pins[port][i] == pinmux_iop) | ||
| 181 | iop_val |= (1 << i); | ||
| 182 | } | ||
| 183 | |||
| 184 | REG_WRITE(int, regi_pinmux + REG_RD_ADDR_pinmux_rw_pb_gio + 8*port, gpio_val); | ||
| 185 | REG_WRITE(int, regi_pinmux + REG_RD_ADDR_pinmux_rw_pb_iop + 8*port, iop_val); | ||
| 186 | |||
| 187 | #ifdef DEBUG | ||
| 188 | crisv32_pinmux_dump(); | ||
| 189 | #endif | ||
| 190 | } | ||
| 191 | |||
| 192 | int | ||
| 193 | crisv32_pinmux_dealloc(int port, int first_pin, int last_pin) | ||
| 194 | { | ||
| 195 | int i; | ||
| 196 | unsigned long flags; | ||
| 197 | |||
| 198 | crisv32_pinmux_init(); | ||
| 199 | |||
| 200 | if (port > PORTS || port < 0) | ||
| 201 | return -EINVAL; | ||
| 202 | |||
| 203 | spin_lock_irqsave(&pinmux_lock, flags); | ||
| 204 | |||
| 205 | for (i = first_pin; i <= last_pin; i++) | ||
| 206 | pins[port][i] = pinmux_none; | ||
| 207 | |||
| 208 | crisv32_pinmux_set(port); | ||
| 209 | spin_unlock_irqrestore(&pinmux_lock, flags); | ||
| 210 | |||
| 211 | return 0; | ||
| 212 | } | ||
| 213 | |||
| 214 | void | ||
| 215 | crisv32_pinmux_dump(void) | ||
| 216 | { | ||
| 217 | int i, j; | ||
| 218 | |||
| 219 | crisv32_pinmux_init(); | ||
| 220 | |||
| 221 | for (i = 0; i < PORTS; i++) | ||
| 222 | { | ||
| 223 | printk("Port %c\n", 'B'+i); | ||
| 224 | for (j = 0; j < PORT_PINS; j++) | ||
| 225 | printk(" Pin %d = %d\n", j, pins[i][j]); | ||
| 226 | } | ||
| 227 | } | ||
| 228 | |||
| 229 | __initcall(crisv32_pinmux_init); | ||
diff --git a/arch/cris/arch-v32/kernel/setup.c b/arch/cris/arch-v32/kernel/setup.c index 72e9e8331f63..61e10ae65296 100644 --- a/arch/cris/arch-v32/kernel/setup.c +++ b/arch/cris/arch-v32/kernel/setup.c | |||
| @@ -9,6 +9,9 @@ | |||
| 9 | #include <linux/delay.h> | 9 | #include <linux/delay.h> |
| 10 | #include <linux/param.h> | 10 | #include <linux/param.h> |
| 11 | 11 | ||
| 12 | #include <linux/i2c.h> | ||
| 13 | #include <linux/platform_device.h> | ||
| 14 | |||
| 12 | #ifdef CONFIG_PROC_FS | 15 | #ifdef CONFIG_PROC_FS |
| 13 | 16 | ||
| 14 | #define HAS_FPU 0x0001 | 17 | #define HAS_FPU 0x0001 |
| @@ -43,14 +46,15 @@ static struct cpu_info cpinfo[] = { | |||
| 43 | 46 | ||
| 44 | {"ETRAX 100LX v2", 11, 8, HAS_ETHERNET100 | HAS_SCSI | HAS_ATA | HAS_USB | 47 | {"ETRAX 100LX v2", 11, 8, HAS_ETHERNET100 | HAS_SCSI | HAS_ATA | HAS_USB |
| 45 | | HAS_MMU}, | 48 | | HAS_MMU}, |
| 46 | 49 | #ifdef CONFIG_ETRAXFS | |
| 47 | {"ETRAX FS", 32, 32, HAS_ETHERNET100 | HAS_ATA | HAS_MMU}, | 50 | {"ETRAX FS", 32, 32, HAS_ETHERNET100 | HAS_ATA | HAS_MMU}, |
| 48 | 51 | #else | |
| 52 | {"ARTPEC-3", 32, 32, HAS_ETHERNET100 | HAS_MMU}, | ||
| 53 | #endif | ||
| 49 | {"Unknown", 0, 0, 0} | 54 | {"Unknown", 0, 0, 0} |
| 50 | }; | 55 | }; |
| 51 | 56 | ||
| 52 | int | 57 | int show_cpuinfo(struct seq_file *m, void *v) |
| 53 | show_cpuinfo(struct seq_file *m, void *v) | ||
| 54 | { | 58 | { |
| 55 | int i; | 59 | int i; |
| 56 | int cpu = (int)v - 1; | 60 | int cpu = (int)v - 1; |
| @@ -107,9 +111,63 @@ show_cpuinfo(struct seq_file *m, void *v) | |||
| 107 | 111 | ||
| 108 | #endif /* CONFIG_PROC_FS */ | 112 | #endif /* CONFIG_PROC_FS */ |
| 109 | 113 | ||
| 110 | void | 114 | void show_etrax_copyright(void) |
| 111 | show_etrax_copyright(void) | 115 | { |
| 116 | #ifdef CONFIG_ETRAXFS | ||
| 117 | printk(KERN_INFO "Linux/CRISv32 port on ETRAX FS " | ||
| 118 | "(C) 2003, 2004 Axis Communications AB\n"); | ||
| 119 | #else | ||
| 120 | printk(KERN_INFO "Linux/CRISv32 port on ARTPEC-3 " | ||
| 121 | "(C) 2003-2009 Axis Communications AB\n"); | ||
| 122 | #endif | ||
| 123 | } | ||
| 124 | |||
| 125 | static struct i2c_board_info __initdata i2c_info[] = { | ||
| 126 | {I2C_BOARD_INFO("camblock", 0x43)}, | ||
| 127 | {I2C_BOARD_INFO("tmp100", 0x48)}, | ||
| 128 | {I2C_BOARD_INFO("tmp100", 0x4A)}, | ||
| 129 | {I2C_BOARD_INFO("tmp100", 0x4C)}, | ||
| 130 | {I2C_BOARD_INFO("tmp100", 0x4D)}, | ||
| 131 | {I2C_BOARD_INFO("tmp100", 0x4E)}, | ||
| 132 | #ifdef CONFIG_RTC_DRV_PCF8563 | ||
| 133 | {I2C_BOARD_INFO("pcf8563", 0x51)}, | ||
| 134 | #endif | ||
| 135 | #ifdef CONFIG_ETRAX_VIRTUAL_GPIO | ||
| 136 | {I2C_BOARD_INFO("vgpio", 0x20)}, | ||
| 137 | {I2C_BOARD_INFO("vgpio", 0x21)}, | ||
| 138 | #endif | ||
| 139 | {I2C_BOARD_INFO("pca9536", 0x41)}, | ||
| 140 | {I2C_BOARD_INFO("fnp300", 0x40)}, | ||
| 141 | {I2C_BOARD_INFO("fnp300", 0x42)}, | ||
| 142 | {I2C_BOARD_INFO("adc101", 0x54)}, | ||
| 143 | }; | ||
| 144 | |||
| 145 | static struct i2c_board_info __initdata i2c_info2[] = { | ||
| 146 | {I2C_BOARD_INFO("camblock", 0x43)}, | ||
| 147 | {I2C_BOARD_INFO("tmp100", 0x48)}, | ||
| 148 | {I2C_BOARD_INFO("tmp100", 0x4A)}, | ||
| 149 | {I2C_BOARD_INFO("tmp100", 0x4C)}, | ||
| 150 | {I2C_BOARD_INFO("tmp100", 0x4D)}, | ||
| 151 | {I2C_BOARD_INFO("tmp100", 0x4E)}, | ||
| 152 | #ifdef CONFIG_ETRAX_VIRTUAL_GPIO | ||
| 153 | {I2C_BOARD_INFO("vgpio", 0x20)}, | ||
| 154 | {I2C_BOARD_INFO("vgpio", 0x21)}, | ||
| 155 | #endif | ||
| 156 | {I2C_BOARD_INFO("pca9536", 0x41)}, | ||
| 157 | {I2C_BOARD_INFO("fnp300", 0x40)}, | ||
| 158 | {I2C_BOARD_INFO("fnp300", 0x42)}, | ||
| 159 | {I2C_BOARD_INFO("adc101", 0x54)}, | ||
| 160 | }; | ||
| 161 | |||
| 162 | static struct i2c_board_info __initdata i2c_info3[] = { | ||
| 163 | {I2C_BOARD_INFO("adc101", 0x54)}, | ||
| 164 | }; | ||
| 165 | |||
| 166 | static int __init etrax_init(void) | ||
| 112 | { | 167 | { |
| 113 | printk(KERN_INFO | 168 | i2c_register_board_info(0, i2c_info, ARRAY_SIZE(i2c_info)); |
| 114 | "Linux/CRISv32 port on ETRAX FS (C) 2003, 2004 Axis Communications AB\n"); | 169 | i2c_register_board_info(1, i2c_info2, ARRAY_SIZE(i2c_info2)); |
| 170 | i2c_register_board_info(2, i2c_info3, ARRAY_SIZE(i2c_info3)); | ||
| 171 | return 0; | ||
| 115 | } | 172 | } |
| 173 | arch_initcall(etrax_init); | ||
diff --git a/arch/cris/arch-v32/kernel/signal.c b/arch/cris/arch-v32/kernel/signal.c index 0b7e3f143281..b3a05ae56214 100644 --- a/arch/cris/arch-v32/kernel/signal.c +++ b/arch/cris/arch-v32/kernel/signal.c | |||
| @@ -587,7 +587,7 @@ do_signal(int canrestart, struct pt_regs *regs) | |||
| 587 | } | 587 | } |
| 588 | 588 | ||
| 589 | if (regs->r10 == -ERESTART_RESTARTBLOCK){ | 589 | if (regs->r10 == -ERESTART_RESTARTBLOCK){ |
| 590 | regs->r10 = __NR_restart_syscall; | 590 | regs->r9 = __NR_restart_syscall; |
| 591 | regs->erp -= 2; | 591 | regs->erp -= 2; |
| 592 | } | 592 | } |
| 593 | } | 593 | } |
diff --git a/arch/cris/arch-v32/kernel/time.c b/arch/cris/arch-v32/kernel/time.c index 1ee0e1010228..a545211e999d 100644 --- a/arch/cris/arch-v32/kernel/time.c +++ b/arch/cris/arch-v32/kernel/time.c | |||
| @@ -1,13 +1,13 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * linux/arch/cris/arch-v32/kernel/time.c | 2 | * linux/arch/cris/arch-v32/kernel/time.c |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2003-2007 Axis Communications AB | 4 | * Copyright (C) 2003-2010 Axis Communications AB |
| 5 | * | 5 | * |
| 6 | */ | 6 | */ |
| 7 | 7 | ||
| 8 | #include <linux/timex.h> | 8 | #include <linux/timex.h> |
| 9 | #include <linux/time.h> | 9 | #include <linux/time.h> |
| 10 | #include <linux/jiffies.h> | 10 | #include <linux/clocksource.h> |
| 11 | #include <linux/interrupt.h> | 11 | #include <linux/interrupt.h> |
| 12 | #include <linux/swap.h> | 12 | #include <linux/swap.h> |
| 13 | #include <linux/sched.h> | 13 | #include <linux/sched.h> |
| @@ -36,6 +36,30 @@ | |||
| 36 | /* Number of 763 counts before watchdog bites */ | 36 | /* Number of 763 counts before watchdog bites */ |
| 37 | #define ETRAX_WD_CNT ((2*ETRAX_WD_HZ)/HZ + 1) | 37 | #define ETRAX_WD_CNT ((2*ETRAX_WD_HZ)/HZ + 1) |
| 38 | 38 | ||
| 39 | /* Register the continuos readonly timer available in FS and ARTPEC-3. */ | ||
| 40 | static cycle_t read_cont_rotime(struct clocksource *cs) | ||
| 41 | { | ||
| 42 | return (u32)REG_RD(timer, regi_timer0, r_time); | ||
| 43 | } | ||
| 44 | |||
| 45 | static struct clocksource cont_rotime = { | ||
| 46 | .name = "crisv32_rotime", | ||
| 47 | .rating = 300, | ||
| 48 | .read = read_cont_rotime, | ||
| 49 | .mask = CLOCKSOURCE_MASK(32), | ||
| 50 | .shift = 10, | ||
| 51 | .flags = CLOCK_SOURCE_IS_CONTINUOUS, | ||
| 52 | }; | ||
| 53 | |||
| 54 | static int __init etrax_init_cont_rotime(void) | ||
| 55 | { | ||
| 56 | cont_rotime.mult = clocksource_khz2mult(100000, cont_rotime.shift); | ||
| 57 | clocksource_register(&cont_rotime); | ||
| 58 | return 0; | ||
| 59 | } | ||
| 60 | arch_initcall(etrax_init_cont_rotime); | ||
| 61 | |||
| 62 | |||
| 39 | unsigned long timer_regs[NR_CPUS] = | 63 | unsigned long timer_regs[NR_CPUS] = |
| 40 | { | 64 | { |
| 41 | regi_timer0, | 65 | regi_timer0, |
| @@ -67,43 +91,6 @@ unsigned long get_ns_in_jiffie(void) | |||
| 67 | return ns; | 91 | return ns; |
| 68 | } | 92 | } |
| 69 | 93 | ||
| 70 | unsigned long do_slow_gettimeoffset(void) | ||
| 71 | { | ||
| 72 | unsigned long count; | ||
| 73 | unsigned long usec_count = 0; | ||
| 74 | |||
| 75 | /* For the first call after boot */ | ||
| 76 | static unsigned long count_p = TIMER0_DIV; | ||
| 77 | static unsigned long jiffies_p = 0; | ||
| 78 | |||
| 79 | /* Cache volatile jiffies temporarily; we have IRQs turned off. */ | ||
| 80 | unsigned long jiffies_t; | ||
| 81 | |||
| 82 | /* The timer interrupt comes from Etrax timer 0. In order to get | ||
| 83 | * better precision, we check the current value. It might have | ||
| 84 | * underflowed already though. */ | ||
| 85 | count = REG_RD(timer, regi_timer0, r_tmr0_data); | ||
| 86 | jiffies_t = jiffies; | ||
| 87 | |||
| 88 | /* Avoiding timer inconsistencies (they are rare, but they happen) | ||
| 89 | * There is one problem that must be avoided here: | ||
| 90 | * 1. the timer counter underflows | ||
| 91 | */ | ||
| 92 | if( jiffies_t == jiffies_p ) { | ||
| 93 | if( count > count_p ) { | ||
| 94 | /* Timer wrapped, use new count and prescale. | ||
| 95 | * Increase the time corresponding to one jiffy. | ||
| 96 | */ | ||
| 97 | usec_count = 1000000/HZ; | ||
| 98 | } | ||
| 99 | } else | ||
| 100 | jiffies_p = jiffies_t; | ||
| 101 | count_p = count; | ||
| 102 | /* Convert timer value to usec */ | ||
| 103 | /* 100 MHz timer, divide by 100 to get usec */ | ||
| 104 | usec_count += (TIMER0_DIV - count) / 100; | ||
| 105 | return usec_count; | ||
| 106 | } | ||
| 107 | 94 | ||
| 108 | /* From timer MDS describing the hardware watchdog: | 95 | /* From timer MDS describing the hardware watchdog: |
| 109 | * 4.3.1 Watchdog Operation | 96 | * 4.3.1 Watchdog Operation |
| @@ -126,8 +113,7 @@ static short int watchdog_key = 42; /* arbitrary 7 bit number */ | |||
| 126 | * is used though, so set this really low. */ | 113 | * is used though, so set this really low. */ |
| 127 | #define WATCHDOG_MIN_FREE_PAGES 8 | 114 | #define WATCHDOG_MIN_FREE_PAGES 8 |
| 128 | 115 | ||
| 129 | void | 116 | void reset_watchdog(void) |
| 130 | reset_watchdog(void) | ||
| 131 | { | 117 | { |
| 132 | #if defined(CONFIG_ETRAX_WATCHDOG) | 118 | #if defined(CONFIG_ETRAX_WATCHDOG) |
| 133 | reg_timer_rw_wd_ctrl wd_ctrl = { 0 }; | 119 | reg_timer_rw_wd_ctrl wd_ctrl = { 0 }; |
| @@ -147,8 +133,7 @@ reset_watchdog(void) | |||
| 147 | 133 | ||
| 148 | /* stop the watchdog - we still need the correct key */ | 134 | /* stop the watchdog - we still need the correct key */ |
| 149 | 135 | ||
| 150 | void | 136 | void stop_watchdog(void) |
| 151 | stop_watchdog(void) | ||
| 152 | { | 137 | { |
| 153 | #if defined(CONFIG_ETRAX_WATCHDOG) | 138 | #if defined(CONFIG_ETRAX_WATCHDOG) |
| 154 | reg_timer_rw_wd_ctrl wd_ctrl = { 0 }; | 139 | reg_timer_rw_wd_ctrl wd_ctrl = { 0 }; |
| @@ -162,8 +147,7 @@ stop_watchdog(void) | |||
| 162 | 147 | ||
| 163 | extern void show_registers(struct pt_regs *regs); | 148 | extern void show_registers(struct pt_regs *regs); |
| 164 | 149 | ||
| 165 | void | 150 | void handle_watchdog_bite(struct pt_regs *regs) |
| 166 | handle_watchdog_bite(struct pt_regs* regs) | ||
| 167 | { | 151 | { |
| 168 | #if defined(CONFIG_ETRAX_WATCHDOG) | 152 | #if defined(CONFIG_ETRAX_WATCHDOG) |
| 169 | extern int cause_of_death; | 153 | extern int cause_of_death; |
| @@ -203,8 +187,7 @@ handle_watchdog_bite(struct pt_regs* regs) | |||
| 203 | */ | 187 | */ |
| 204 | extern void cris_do_profile(struct pt_regs *regs); | 188 | extern void cris_do_profile(struct pt_regs *regs); |
| 205 | 189 | ||
| 206 | static inline irqreturn_t | 190 | static inline irqreturn_t timer_interrupt(int irq, void *dev_id) |
| 207 | timer_interrupt(int irq, void *dev_id) | ||
| 208 | { | 191 | { |
| 209 | struct pt_regs *regs = get_irq_regs(); | 192 | struct pt_regs *regs = get_irq_regs(); |
| 210 | int cpu = smp_processor_id(); | 193 | int cpu = smp_processor_id(); |
| @@ -233,7 +216,9 @@ timer_interrupt(int irq, void *dev_id) | |||
| 233 | return IRQ_HANDLED; | 216 | return IRQ_HANDLED; |
| 234 | 217 | ||
| 235 | /* Call the real timer interrupt handler */ | 218 | /* Call the real timer interrupt handler */ |
| 219 | write_seqlock(&xtime_lock); | ||
| 236 | do_timer(1); | 220 | do_timer(1); |
| 221 | write_sequnlock(&xtime_lock); | ||
| 237 | return IRQ_HANDLED; | 222 | return IRQ_HANDLED; |
| 238 | } | 223 | } |
| 239 | 224 | ||
| @@ -246,8 +231,7 @@ static struct irqaction irq_timer = { | |||
| 246 | .name = "timer" | 231 | .name = "timer" |
| 247 | }; | 232 | }; |
| 248 | 233 | ||
| 249 | void __init | 234 | void __init cris_timer_init(void) |
| 250 | cris_timer_init(void) | ||
| 251 | { | 235 | { |
| 252 | int cpu = smp_processor_id(); | 236 | int cpu = smp_processor_id(); |
| 253 | reg_timer_rw_tmr0_ctrl tmr0_ctrl = { 0 }; | 237 | reg_timer_rw_tmr0_ctrl tmr0_ctrl = { 0 }; |
| @@ -273,8 +257,7 @@ cris_timer_init(void) | |||
| 273 | REG_WR(timer, timer_regs[cpu], rw_intr_mask, timer_intr_mask); | 257 | REG_WR(timer, timer_regs[cpu], rw_intr_mask, timer_intr_mask); |
| 274 | } | 258 | } |
| 275 | 259 | ||
| 276 | void __init | 260 | void __init time_init(void) |
| 277 | time_init(void) | ||
| 278 | { | 261 | { |
| 279 | reg_intr_vect_rw_mask intr_mask; | 262 | reg_intr_vect_rw_mask intr_mask; |
| 280 | 263 | ||
diff --git a/arch/cris/arch-v32/kernel/traps.c b/arch/cris/arch-v32/kernel/traps.c index 9003e382cada..8bbe09c93132 100644 --- a/arch/cris/arch-v32/kernel/traps.c +++ b/arch/cris/arch-v32/kernel/traps.c | |||
| @@ -9,8 +9,7 @@ | |||
| 9 | #include <hwregs/intr_vect_defs.h> | 9 | #include <hwregs/intr_vect_defs.h> |
| 10 | #include <asm/irq.h> | 10 | #include <asm/irq.h> |
| 11 | 11 | ||
| 12 | void | 12 | void show_registers(struct pt_regs *regs) |
| 13 | show_registers(struct pt_regs *regs) | ||
| 14 | { | 13 | { |
| 15 | /* | 14 | /* |
| 16 | * It's possible to use either the USP register or current->thread.usp. | 15 | * It's possible to use either the USP register or current->thread.usp. |
| @@ -101,8 +100,7 @@ bad_value: | |||
| 101 | } | 100 | } |
| 102 | } | 101 | } |
| 103 | 102 | ||
| 104 | void | 103 | void arch_enable_nmi(void) |
| 105 | arch_enable_nmi(void) | ||
| 106 | { | 104 | { |
| 107 | unsigned long flags; | 105 | unsigned long flags; |
| 108 | 106 | ||
diff --git a/arch/cris/arch-v32/lib/checksum.S b/arch/cris/arch-v32/lib/checksum.S index 87f3fd71ab10..4a72a94a49ad 100644 --- a/arch/cris/arch-v32/lib/checksum.S +++ b/arch/cris/arch-v32/lib/checksum.S | |||
| @@ -6,6 +6,7 @@ | |||
| 6 | */ | 6 | */ |
| 7 | 7 | ||
| 8 | .globl csum_partial | 8 | .globl csum_partial |
| 9 | .type csum_partial,@function | ||
| 9 | csum_partial: | 10 | csum_partial: |
| 10 | 11 | ||
| 11 | ;; r10 - src | 12 | ;; r10 - src |
| @@ -83,3 +84,5 @@ _do_byte: | |||
| 83 | addu.b [$r10],$r12 | 84 | addu.b [$r10],$r12 |
| 84 | ret | 85 | ret |
| 85 | move.d $r12,$r10 | 86 | move.d $r12,$r10 |
| 87 | |||
| 88 | .size csum_partial, .-csum_partial | ||
diff --git a/arch/cris/arch-v32/lib/checksumcopy.S b/arch/cris/arch-v32/lib/checksumcopy.S index 21aabe91489b..54e209f18b06 100644 --- a/arch/cris/arch-v32/lib/checksumcopy.S +++ b/arch/cris/arch-v32/lib/checksumcopy.S | |||
| @@ -9,6 +9,7 @@ | |||
| 9 | */ | 9 | */ |
| 10 | 10 | ||
| 11 | .globl csum_partial_copy_nocheck | 11 | .globl csum_partial_copy_nocheck |
| 12 | .type csum_partial_copy_nocheck,@function | ||
| 12 | csum_partial_copy_nocheck: | 13 | csum_partial_copy_nocheck: |
| 13 | 14 | ||
| 14 | ;; r10 - src | 15 | ;; r10 - src |
| @@ -89,3 +90,5 @@ _do_byte: | |||
| 89 | move.b $r9,[$r11] | 90 | move.b $r9,[$r11] |
| 90 | ret | 91 | ret |
| 91 | move.d $r13,$r10 | 92 | move.d $r13,$r10 |
| 93 | |||
| 94 | .size csum_partial_copy_nocheck, . - csum_partial_copy_nocheck | ||
diff --git a/arch/cris/arch-v32/lib/spinlock.S b/arch/cris/arch-v32/lib/spinlock.S index 79087ef59a1c..fe610b9d775f 100644 --- a/arch/cris/arch-v32/lib/spinlock.S +++ b/arch/cris/arch-v32/lib/spinlock.S | |||
| @@ -6,7 +6,9 @@ | |||
| 6 | 6 | ||
| 7 | 7 | ||
| 8 | .global cris_spin_lock | 8 | .global cris_spin_lock |
| 9 | .type cris_spin_lock,@function | ||
| 9 | .global cris_spin_trylock | 10 | .global cris_spin_trylock |
| 11 | .type cris_spin_trylock,@function | ||
| 10 | 12 | ||
| 11 | .text | 13 | .text |
| 12 | 14 | ||
| @@ -22,6 +24,8 @@ cris_spin_lock: | |||
| 22 | ret | 24 | ret |
| 23 | nop | 25 | nop |
| 24 | 26 | ||
| 27 | .size cris_spin_lock, . - cris_spin_lock | ||
| 28 | |||
| 25 | cris_spin_trylock: | 29 | cris_spin_trylock: |
| 26 | clearf p | 30 | clearf p |
| 27 | 1: move.b [$r10], $r11 | 31 | 1: move.b [$r10], $r11 |
| @@ -31,3 +35,6 @@ cris_spin_trylock: | |||
| 31 | clearf p | 35 | clearf p |
| 32 | ret | 36 | ret |
| 33 | movu.b $r11,$r10 | 37 | movu.b $r11,$r10 |
| 38 | |||
| 39 | .size cris_spin_trylock, . - cris_spin_trylock | ||
| 40 | |||
diff --git a/arch/cris/arch-v32/mach-a3/Kconfig b/arch/cris/arch-v32/mach-a3/Kconfig index a4df06d5997a..7796aafc711e 100644 --- a/arch/cris/arch-v32/mach-a3/Kconfig +++ b/arch/cris/arch-v32/mach-a3/Kconfig | |||
| @@ -33,6 +33,10 @@ config ETRAX_DDR2_CONFIG | |||
| 33 | hex "DDR2 config" | 33 | hex "DDR2 config" |
| 34 | default "0" | 34 | default "0" |
| 35 | 35 | ||
| 36 | config ETRAX_DDR2_LATENCY | ||
| 37 | hex "DDR2 latency" | ||
| 38 | default "0" | ||
| 39 | |||
| 36 | config ETRAX_PIO_CE0_CFG | 40 | config ETRAX_PIO_CE0_CFG |
| 37 | hex "PIO CE0 configuration" | 41 | hex "PIO CE0 configuration" |
| 38 | default "0" | 42 | default "0" |
diff --git a/arch/cris/arch-v32/mach-a3/dram_init.S b/arch/cris/arch-v32/mach-a3/dram_init.S index 94d6b41cb299..ec8648be32d3 100644 --- a/arch/cris/arch-v32/mach-a3/dram_init.S +++ b/arch/cris/arch-v32/mach-a3/dram_init.S | |||
| @@ -24,11 +24,21 @@ | |||
| 24 | 24 | ||
| 25 | ;; Refer to ddr2 MDS for initialization sequence | 25 | ;; Refer to ddr2 MDS for initialization sequence |
| 26 | 26 | ||
| 27 | ; 2. Wait 200us | ||
| 28 | move.d 10000, $r2 | ||
| 29 | 1: bne 1b | ||
| 30 | subq 1, $r2 | ||
| 31 | |||
| 27 | ; Start clock | 32 | ; Start clock |
| 28 | move.d REG_ADDR(ddr2, regi_ddr2_ctrl, rw_phy_cfg), $r0 | 33 | move.d REG_ADDR(ddr2, regi_ddr2_ctrl, rw_phy_cfg), $r0 |
| 29 | move.d REG_STATE(ddr2, rw_phy_cfg, en, yes), $r1 | 34 | move.d REG_STATE(ddr2, rw_phy_cfg, en, yes), $r1 |
| 30 | move.d $r1, [$r0] | 35 | move.d $r1, [$r0] |
| 31 | 36 | ||
| 37 | ; 2. Wait 200us | ||
| 38 | move.d 10000, $r2 | ||
| 39 | 1: bne 1b | ||
| 40 | subq 1, $r2 | ||
| 41 | |||
| 32 | ; Reset phy and start calibration | 42 | ; Reset phy and start calibration |
| 33 | move.d REG_ADDR(ddr2, regi_ddr2_ctrl, rw_phy_ctrl), $r0 | 43 | move.d REG_ADDR(ddr2, regi_ddr2_ctrl, rw_phy_ctrl), $r0 |
| 34 | move.d REG_STATE(ddr2, rw_phy_ctrl, rst, yes) | \ | 44 | move.d REG_STATE(ddr2, rw_phy_ctrl, rst, yes) | \ |
| @@ -52,6 +62,10 @@ do_cmd: | |||
| 52 | lslq 16, $r1 | 62 | lslq 16, $r1 |
| 53 | or.d $r3, $r1 | 63 | or.d $r3, $r1 |
| 54 | move.d $r1, [$r0] | 64 | move.d $r1, [$r0] |
| 65 | ; 2. Wait 200us | ||
| 66 | move.d 10000, $r4 | ||
| 67 | 1: bne 1b | ||
| 68 | subq 1, $r4 | ||
| 55 | cmp.d sdram_commands_end, $r2 | 69 | cmp.d sdram_commands_end, $r2 |
| 56 | blo command_loop | 70 | blo command_loop |
| 57 | nop | 71 | nop |
| @@ -63,7 +77,7 @@ do_cmd: | |||
| 63 | 77 | ||
| 64 | ; Set latency | 78 | ; Set latency |
| 65 | move.d REG_ADDR(ddr2, regi_ddr2_ctrl, rw_latency), $r0 | 79 | move.d REG_ADDR(ddr2, regi_ddr2_ctrl, rw_latency), $r0 |
| 66 | move.d 0x13, $r1 | 80 | move.d CONFIG_ETRAX_DDR2_LATENCY, $r1 |
| 67 | move.d $r1, [$r0] | 81 | move.d $r1, [$r0] |
| 68 | 82 | ||
| 69 | ; Set configuration | 83 | ; Set configuration |
diff --git a/arch/cris/arch-v32/mach-a3/hw_settings.S b/arch/cris/arch-v32/mach-a3/hw_settings.S index 258a6329cd4a..0145725a1ce5 100644 --- a/arch/cris/arch-v32/mach-a3/hw_settings.S +++ b/arch/cris/arch-v32/mach-a3/hw_settings.S | |||
| @@ -31,6 +31,8 @@ | |||
| 31 | ; Register values | 31 | ; Register values |
| 32 | .dword REG_ADDR(ddr2, regi_ddr2_ctrl, rw_cfg) | 32 | .dword REG_ADDR(ddr2, regi_ddr2_ctrl, rw_cfg) |
| 33 | .dword CONFIG_ETRAX_DDR2_CONFIG | 33 | .dword CONFIG_ETRAX_DDR2_CONFIG |
| 34 | .dword REG_ADDR(ddr2, regi_ddr2_ctrl, rw_latency) | ||
| 35 | .dword CONFIG_ETRAX_DDR2_LATENCY | ||
| 34 | .dword REG_ADDR(ddr2, regi_ddr2_ctrl, rw_timing) | 36 | .dword REG_ADDR(ddr2, regi_ddr2_ctrl, rw_timing) |
| 35 | .dword CONFIG_ETRAX_DDR2_TIMING | 37 | .dword CONFIG_ETRAX_DDR2_TIMING |
| 36 | .dword CONFIG_ETRAX_DDR2_MRS | 38 | .dword CONFIG_ETRAX_DDR2_MRS |
diff --git a/arch/cris/arch-v32/mm/init.c b/arch/cris/arch-v32/mm/init.c index caeb921a92ea..0768bc409ca8 100644 --- a/arch/cris/arch-v32/mm/init.c +++ b/arch/cris/arch-v32/mm/init.c | |||
| @@ -27,8 +27,7 @@ extern void tlb_init(void); | |||
| 27 | * at kseg_4 thus the ksegs are set up again. Also clear the TLB and do various | 27 | * at kseg_4 thus the ksegs are set up again. Also clear the TLB and do various |
| 28 | * other paging stuff. | 28 | * other paging stuff. |
| 29 | */ | 29 | */ |
| 30 | void __init | 30 | void __init cris_mmu_init(void) |
| 31 | cris_mmu_init(void) | ||
| 32 | { | 31 | { |
| 33 | unsigned long mmu_config; | 32 | unsigned long mmu_config; |
| 34 | unsigned long mmu_kbase_hi; | 33 | unsigned long mmu_kbase_hi; |
| @@ -55,14 +54,23 @@ cris_mmu_init(void) | |||
| 55 | /* Initialise the TLB. Function found in tlb.c. */ | 54 | /* Initialise the TLB. Function found in tlb.c. */ |
| 56 | tlb_init(); | 55 | tlb_init(); |
| 57 | 56 | ||
| 58 | /* Enable exceptions and initialize the kernel segments. */ | 57 | /* |
| 58 | * Enable exceptions and initialize the kernel segments. | ||
| 59 | * See head.S for differences between ARTPEC-3 and ETRAX FS. | ||
| 60 | */ | ||
| 59 | mmu_config = ( REG_STATE(mmu, rw_mm_cfg, we, on) | | 61 | mmu_config = ( REG_STATE(mmu, rw_mm_cfg, we, on) | |
| 60 | REG_STATE(mmu, rw_mm_cfg, acc, on) | | 62 | REG_STATE(mmu, rw_mm_cfg, acc, on) | |
| 61 | REG_STATE(mmu, rw_mm_cfg, ex, on) | | 63 | REG_STATE(mmu, rw_mm_cfg, ex, on) | |
| 62 | REG_STATE(mmu, rw_mm_cfg, inv, on) | | 64 | REG_STATE(mmu, rw_mm_cfg, inv, on) | |
| 65 | #ifdef CONFIG_CRIS_MACH_ARTPEC3 | ||
| 66 | REG_STATE(mmu, rw_mm_cfg, seg_f, page) | | ||
| 67 | REG_STATE(mmu, rw_mm_cfg, seg_e, page) | | ||
| 68 | REG_STATE(mmu, rw_mm_cfg, seg_d, linear) | | ||
| 69 | #else | ||
| 63 | REG_STATE(mmu, rw_mm_cfg, seg_f, linear) | | 70 | REG_STATE(mmu, rw_mm_cfg, seg_f, linear) | |
| 64 | REG_STATE(mmu, rw_mm_cfg, seg_e, linear) | | 71 | REG_STATE(mmu, rw_mm_cfg, seg_e, linear) | |
| 65 | REG_STATE(mmu, rw_mm_cfg, seg_d, page) | | 72 | REG_STATE(mmu, rw_mm_cfg, seg_d, page) | |
| 73 | #endif | ||
| 66 | REG_STATE(mmu, rw_mm_cfg, seg_c, linear) | | 74 | REG_STATE(mmu, rw_mm_cfg, seg_c, linear) | |
| 67 | REG_STATE(mmu, rw_mm_cfg, seg_b, linear) | | 75 | REG_STATE(mmu, rw_mm_cfg, seg_b, linear) | |
| 68 | #ifndef CONFIG_ETRAX_VCS_SIM | 76 | #ifndef CONFIG_ETRAX_VCS_SIM |
| @@ -81,9 +89,15 @@ cris_mmu_init(void) | |||
| 81 | REG_STATE(mmu, rw_mm_cfg, seg_1, page) | | 89 | REG_STATE(mmu, rw_mm_cfg, seg_1, page) | |
| 82 | REG_STATE(mmu, rw_mm_cfg, seg_0, page)); | 90 | REG_STATE(mmu, rw_mm_cfg, seg_0, page)); |
| 83 | 91 | ||
| 92 | /* See head.S for differences between ARTPEC-3 and ETRAX FS. */ | ||
| 84 | mmu_kbase_hi = ( REG_FIELD(mmu, rw_mm_kbase_hi, base_f, 0x0) | | 93 | mmu_kbase_hi = ( REG_FIELD(mmu, rw_mm_kbase_hi, base_f, 0x0) | |
| 94 | #ifdef CONFIG_CRIS_MACH_ARTPEC3 | ||
| 95 | REG_FIELD(mmu, rw_mm_kbase_hi, base_e, 0x0) | | ||
| 96 | REG_FIELD(mmu, rw_mm_kbase_hi, base_d, 0x5) | | ||
| 97 | #else | ||
| 85 | REG_FIELD(mmu, rw_mm_kbase_hi, base_e, 0x8) | | 98 | REG_FIELD(mmu, rw_mm_kbase_hi, base_e, 0x8) | |
| 86 | REG_FIELD(mmu, rw_mm_kbase_hi, base_d, 0x0) | | 99 | REG_FIELD(mmu, rw_mm_kbase_hi, base_d, 0x0) | |
| 100 | #endif | ||
| 87 | REG_FIELD(mmu, rw_mm_kbase_hi, base_c, 0x4) | | 101 | REG_FIELD(mmu, rw_mm_kbase_hi, base_c, 0x4) | |
| 88 | REG_FIELD(mmu, rw_mm_kbase_hi, base_b, 0xb) | | 102 | REG_FIELD(mmu, rw_mm_kbase_hi, base_b, 0xb) | |
| 89 | #ifndef CONFIG_ETRAX_VCS_SIM | 103 | #ifndef CONFIG_ETRAX_VCS_SIM |
| @@ -129,8 +143,7 @@ cris_mmu_init(void) | |||
| 129 | SUPP_REG_WR(RW_GC_CFG, 0xf); /* IMMU, DMMU, ICache, DCache on */ | 143 | SUPP_REG_WR(RW_GC_CFG, 0xf); /* IMMU, DMMU, ICache, DCache on */ |
| 130 | } | 144 | } |
| 131 | 145 | ||
| 132 | void __init | 146 | void __init paging_init(void) |
| 133 | paging_init(void) | ||
| 134 | { | 147 | { |
| 135 | int i; | 148 | int i; |
| 136 | unsigned long zones_size[MAX_NR_ZONES]; | 149 | unsigned long zones_size[MAX_NR_ZONES]; |
diff --git a/arch/cris/arch-v32/mm/mmu.S b/arch/cris/arch-v32/mm/mmu.S index f125d912e140..72727c1d8e60 100644 --- a/arch/cris/arch-v32/mm/mmu.S +++ b/arch/cris/arch-v32/mm/mmu.S | |||
| @@ -38,6 +38,7 @@ | |||
| 38 | ; to handle the fault. | 38 | ; to handle the fault. |
| 39 | .macro MMU_BUS_FAULT_HANDLER handler, mmu, we, ex | 39 | .macro MMU_BUS_FAULT_HANDLER handler, mmu, we, ex |
| 40 | .globl \handler | 40 | .globl \handler |
| 41 | .type \handler,"function" | ||
| 41 | \handler: | 42 | \handler: |
| 42 | SAVE_ALL | 43 | SAVE_ALL |
| 43 | move \mmu, $srs ; Select MMU support register bank | 44 | move \mmu, $srs ; Select MMU support register bank |
| @@ -52,6 +53,7 @@ | |||
| 52 | nop | 53 | nop |
| 53 | ba ret_from_intr | 54 | ba ret_from_intr |
| 54 | nop | 55 | nop |
| 56 | .size \handler, . - \handler | ||
| 55 | .endm | 57 | .endm |
| 56 | 58 | ||
| 57 | ; Refill handler. Three cases may occur: | 59 | ; Refill handler. Three cases may occur: |
| @@ -84,6 +86,7 @@ | |||
| 84 | 2: .dword 0 ; last_refill_cause | 86 | 2: .dword 0 ; last_refill_cause |
| 85 | .text | 87 | .text |
| 86 | .globl \handler | 88 | .globl \handler |
| 89 | .type \handler, "function" | ||
| 87 | \handler: | 90 | \handler: |
| 88 | subq 4, $sp | 91 | subq 4, $sp |
| 89 | ; (The pipeline stalls for one cycle; $sp used as address in the next cycle.) | 92 | ; (The pipeline stalls for one cycle; $sp used as address in the next cycle.) |
| @@ -196,6 +199,7 @@ | |||
| 196 | ; Return | 199 | ; Return |
| 197 | ba ret_from_intr | 200 | ba ret_from_intr |
| 198 | nop | 201 | nop |
| 202 | .size \handler, . - \handler | ||
| 199 | .endm | 203 | .endm |
| 200 | 204 | ||
| 201 | ; This is the MMU bus fault handlers. | 205 | ; This is the MMU bus fault handlers. |
diff --git a/arch/cris/boot/Makefile b/arch/cris/boot/Makefile index 144f3afa0119..6e3b509fd7fc 100644 --- a/arch/cris/boot/Makefile +++ b/arch/cris/boot/Makefile | |||
| @@ -3,7 +3,7 @@ | |||
| 3 | # | 3 | # |
| 4 | 4 | ||
| 5 | objcopyflags-$(CONFIG_ETRAX_ARCH_V10) += -R .note -R .comment | 5 | objcopyflags-$(CONFIG_ETRAX_ARCH_V10) += -R .note -R .comment |
| 6 | objcopyflags-$(CONFIG_ETRAX_ARCH_V32) += --remove-section=.bss | 6 | objcopyflags-$(CONFIG_ETRAX_ARCH_V32) += --remove-section=.bss --remove-section=.note.gnu.build-id |
| 7 | 7 | ||
| 8 | OBJCOPYFLAGS = -O binary $(objcopyflags-y) | 8 | OBJCOPYFLAGS = -O binary $(objcopyflags-y) |
| 9 | 9 | ||
diff --git a/arch/cris/boot/compressed/misc.c b/arch/cris/boot/compressed/misc.c index 47bc190ba6d4..548d886b03d3 100644 --- a/arch/cris/boot/compressed/misc.c +++ b/arch/cris/boot/compressed/misc.c | |||
| @@ -106,7 +106,7 @@ static unsigned outcnt = 0; /* bytes in output buffer */ | |||
| 106 | 106 | ||
| 107 | static void flush_window(void); | 107 | static void flush_window(void); |
| 108 | static void error(char *m); | 108 | static void error(char *m); |
| 109 | static void puts(const char *); | 109 | static void aputs(const char *s); |
| 110 | 110 | ||
| 111 | extern char *input_data; /* lives in head.S */ | 111 | extern char *input_data; /* lives in head.S */ |
| 112 | 112 | ||
| @@ -137,52 +137,37 @@ static inline void serout(const char *s, reg_scope_instances regi_ser) | |||
| 137 | 137 | ||
| 138 | REG_WR(ser, regi_ser, rw_dout, dout); | 138 | REG_WR(ser, regi_ser, rw_dout, dout); |
| 139 | } | 139 | } |
| 140 | #define SEROUT(S, N) \ | ||
| 141 | do { \ | ||
| 142 | serout(S, regi_ser ## N); \ | ||
| 143 | s++; \ | ||
| 144 | } while (0) | ||
| 145 | #else | ||
| 146 | #define SEROUT(S, N) do { \ | ||
| 147 | while (!(*R_SERIAL ## N ## _STATUS & (1 << 5))) \ | ||
| 148 | ; \ | ||
| 149 | *R_SERIAL ## N ## _TR_DATA = *s++; \ | ||
| 150 | } while (0) | ||
| 140 | #endif | 151 | #endif |
| 141 | 152 | ||
| 142 | static void puts(const char *s) | 153 | static void aputs(const char *s) |
| 143 | { | 154 | { |
| 144 | #ifndef CONFIG_ETRAX_DEBUG_PORT_NULL | 155 | #ifndef CONFIG_ETRAX_DEBUG_PORT_NULL |
| 145 | while (*s) { | 156 | while (*s) { |
| 146 | #ifdef CONFIG_ETRAX_DEBUG_PORT0 | 157 | #ifdef CONFIG_ETRAX_DEBUG_PORT0 |
| 147 | #ifdef CONFIG_ETRAX_ARCH_V32 | 158 | SEROUT(s, 0); |
| 148 | serout(s, regi_ser0); | ||
| 149 | #else | ||
| 150 | while (!(*R_SERIAL0_STATUS & (1 << 5))) | ||
| 151 | ; | ||
| 152 | *R_SERIAL0_TR_DATA = *s++; | ||
| 153 | #endif | ||
| 154 | #endif | 159 | #endif |
| 155 | #ifdef CONFIG_ETRAX_DEBUG_PORT1 | 160 | #ifdef CONFIG_ETRAX_DEBUG_PORT1 |
| 156 | #ifdef CONFIG_ETRAX_ARCH_V32 | 161 | SEROUT(s, 1); |
| 157 | serout(s, regi_ser1); | ||
| 158 | #else | ||
| 159 | while (!(*R_SERIAL1_STATUS & (1 << 5))) | ||
| 160 | ; | ||
| 161 | *R_SERIAL1_TR_DATA = *s++; | ||
| 162 | #endif | ||
| 163 | #endif | 162 | #endif |
| 164 | #ifdef CONFIG_ETRAX_DEBUG_PORT2 | 163 | #ifdef CONFIG_ETRAX_DEBUG_PORT2 |
| 165 | #ifdef CONFIG_ETRAX_ARCH_V32 | 164 | SEROUT(s, 2); |
| 166 | serout(s, regi_ser2); | ||
| 167 | #else | ||
| 168 | while (!(*R_SERIAL2_STATUS & (1 << 5))) | ||
| 169 | ; | ||
| 170 | *R_SERIAL2_TR_DATA = *s++; | ||
| 171 | #endif | ||
| 172 | #endif | 165 | #endif |
| 173 | #ifdef CONFIG_ETRAX_DEBUG_PORT3 | 166 | #ifdef CONFIG_ETRAX_DEBUG_PORT3 |
| 174 | #ifdef CONFIG_ETRAX_ARCH_V32 | 167 | SEROUT(s, 3); |
| 175 | serout(s, regi_ser3); | ||
| 176 | #else | ||
| 177 | while (!(*R_SERIAL3_STATUS & (1 << 5))) | ||
| 178 | ; | ||
| 179 | *R_SERIAL3_TR_DATA = *s++; | ||
| 180 | #endif | 168 | #endif |
| 181 | #endif | ||
| 182 | *s++; | ||
| 183 | } | 169 | } |
| 184 | /* CONFIG_ETRAX_DEBUG_PORT_NULL */ | 170 | #endif /* CONFIG_ETRAX_DEBUG_PORT_NULL */ |
| 185 | #endif | ||
| 186 | } | 171 | } |
| 187 | 172 | ||
| 188 | void *memset(void *s, int c, size_t n) | 173 | void *memset(void *s, int c, size_t n) |
| @@ -233,9 +218,9 @@ static void flush_window(void) | |||
| 233 | 218 | ||
| 234 | static void error(char *x) | 219 | static void error(char *x) |
| 235 | { | 220 | { |
| 236 | puts("\n\n"); | 221 | aputs("\n\n"); |
| 237 | puts(x); | 222 | aputs(x); |
| 238 | puts("\n\n -- System halted\n"); | 223 | aputs("\n\n -- System halted\n"); |
| 239 | 224 | ||
| 240 | while(1); /* Halt */ | 225 | while(1); /* Halt */ |
| 241 | } | 226 | } |
| @@ -378,14 +363,14 @@ void decompress_kernel(void) | |||
| 378 | __asm__ volatile ("move $vr,%0" : "=rm" (revision)); | 363 | __asm__ volatile ("move $vr,%0" : "=rm" (revision)); |
| 379 | if (revision < compile_rev) { | 364 | if (revision < compile_rev) { |
| 380 | #ifdef CONFIG_ETRAX_ARCH_V32 | 365 | #ifdef CONFIG_ETRAX_ARCH_V32 |
| 381 | puts("You need an ETRAX FS to run Linux 2.6/crisv32\n"); | 366 | aputs("You need at least ETRAX FS to run Linux 2.6/crisv32\n"); |
| 382 | #else | 367 | #else |
| 383 | puts("You need an ETRAX 100LX to run linux 2.6\n"); | 368 | aputs("You need an ETRAX 100LX to run linux 2.6/crisv10\n"); |
| 384 | #endif | 369 | #endif |
| 385 | while(1); | 370 | while(1); |
| 386 | } | 371 | } |
| 387 | 372 | ||
| 388 | puts("Uncompressing Linux...\n"); | 373 | aputs("Uncompressing Linux...\n"); |
| 389 | gunzip(); | 374 | gunzip(); |
| 390 | puts("Done. Now booting the kernel\n"); | 375 | aputs("Done. Now booting the kernel\n"); |
| 391 | } | 376 | } |
diff --git a/arch/cris/include/arch-v32/arch/cache.h b/arch/cris/include/arch-v32/arch/cache.h index dfc73050e6b4..1de779f4f240 100644 --- a/arch/cris/include/arch-v32/arch/cache.h +++ b/arch/cris/include/arch-v32/arch/cache.h | |||
| @@ -7,6 +7,8 @@ | |||
| 7 | #define L1_CACHE_BYTES 32 | 7 | #define L1_CACHE_BYTES 32 |
| 8 | #define L1_CACHE_SHIFT 5 | 8 | #define L1_CACHE_SHIFT 5 |
| 9 | 9 | ||
| 10 | #define __read_mostly __attribute__((__section__(".data.read_mostly"))) | ||
| 11 | |||
| 10 | void flush_dma_list(dma_descr_data *descr); | 12 | void flush_dma_list(dma_descr_data *descr); |
| 11 | void flush_dma_descr(dma_descr_data *descr, int flush_buf); | 13 | void flush_dma_descr(dma_descr_data *descr, int flush_buf); |
| 12 | 14 | ||
diff --git a/arch/cris/include/arch-v32/arch/dma.h b/arch/cris/include/arch-v32/arch/dma.h index 3674081389fd..61906153a9af 100644 --- a/arch/cris/include/arch-v32/arch/dma.h +++ b/arch/cris/include/arch-v32/arch/dma.h | |||
| @@ -1,79 +1 @@ | |||
| 1 | #ifndef _ASM_ARCH_CRIS_DMA_H | #include "mach/dma.h" | |
| 2 | #define _ASM_ARCH_CRIS_DMA_H | ||
| 3 | |||
| 4 | /* Defines for using and allocating dma channels. */ | ||
| 5 | |||
| 6 | #define MAX_DMA_CHANNELS 10 | ||
| 7 | |||
| 8 | #define NETWORK_ETH0_TX_DMA_NBR 0 /* Ethernet 0 out. */ | ||
| 9 | #define NETWORK_ETH0 RX_DMA_NBR 1 /* Ethernet 0 in. */ | ||
| 10 | |||
| 11 | #define IO_PROC_DMA0_TX_DMA_NBR 2 /* IO processor DMA0 out. */ | ||
| 12 | #define IO_PROC_DMA0_RX_DMA_NBR 3 /* IO processor DMA0 in. */ | ||
| 13 | |||
| 14 | #define ATA_TX_DMA_NBR 2 /* ATA interface out. */ | ||
| 15 | #define ATA_RX_DMA_NBR 3 /* ATA interface in. */ | ||
| 16 | |||
| 17 | #define ASYNC_SER2_TX_DMA_NBR 2 /* Asynchronous serial port 2 out. */ | ||
| 18 | #define ASYNC_SER2_RX_DMA_NBR 3 /* Asynchronous serial port 2 in. */ | ||
| 19 | |||
| 20 | #define IO_PROC_DMA1_TX_DMA_NBR 4 /* IO processor DMA1 out. */ | ||
| 21 | #define IO_PROC_DMA1_RX_DMA_NBR 5 /* IO processor DMA1 in. */ | ||
| 22 | |||
| 23 | #define ASYNC_SER1_TX_DMA_NBR 4 /* Asynchronous serial port 1 out. */ | ||
| 24 | #define ASYNC_SER1_RX_DMA_NBR 5 /* Asynchronous serial port 1 in. */ | ||
| 25 | |||
| 26 | #define SYNC_SER0_TX_DMA_NBR 4 /* Synchronous serial port 0 out. */ | ||
| 27 | #define SYNC_SER0_RX_DMA_NBR 5 /* Synchronous serial port 0 in. */ | ||
| 28 | |||
| 29 | #define EXTDMA0_TX_DMA_NBR 6 /* External DMA 0 out. */ | ||
| 30 | #define EXTDMA1_RX_DMA_NBR 7 /* External DMA 1 in. */ | ||
| 31 | |||
| 32 | #define ASYNC_SER0_TX_DMA_NBR 6 /* Asynchronous serial port 0 out. */ | ||
| 33 | #define ASYNC_SER0_RX_DMA_NBR 7 /* Asynchronous serial port 0 in. */ | ||
| 34 | |||
| 35 | #define SYNC_SER1_TX_DMA_NBR 6 /* Synchronous serial port 1 out. */ | ||
| 36 | #define SYNC_SER1_RX_DMA_NBR 7 /* Synchronous serial port 1 in. */ | ||
| 37 | |||
| 38 | #define NETWORK_ETH1_TX_DMA_NBR 6 /* Ethernet 1 out. */ | ||
| 39 | #define NETWORK_ETH1_RX_DMA_NBR 7 /* Ethernet 1 in. */ | ||
| 40 | |||
| 41 | #define EXTDMA2_TX_DMA_NBR 8 /* External DMA 2 out. */ | ||
| 42 | #define EXTDMA3_RX_DMA_NBR 9 /* External DMA 3 in. */ | ||
| 43 | |||
| 44 | #define STRCOP_TX_DMA_NBR 8 /* Stream co-processor out. */ | ||
| 45 | #define STRCOP_RX_DMA_NBR 9 /* Stream co-processor in. */ | ||
| 46 | |||
| 47 | #define ASYNC_SER3_TX_DMA_NBR 8 /* Asynchronous serial port 3 out. */ | ||
| 48 | #define ASYNC_SER3_RX_DMA_NBR 9 /* Asynchronous serial port 3 in. */ | ||
| 49 | |||
| 50 | enum dma_owner | ||
| 51 | { | ||
| 52 | dma_eth0, | ||
| 53 | dma_eth1, | ||
| 54 | dma_iop0, | ||
| 55 | dma_iop1, | ||
| 56 | dma_ser0, | ||
| 57 | dma_ser1, | ||
| 58 | dma_ser2, | ||
| 59 | dma_ser3, | ||
| 60 | dma_sser0, | ||
| 61 | dma_sser1, | ||
| 62 | dma_ata, | ||
| 63 | dma_strp, | ||
| 64 | dma_ext0, | ||
| 65 | dma_ext1, | ||
| 66 | dma_ext2, | ||
| 67 | dma_ext3 | ||
| 68 | }; | ||
| 69 | |||
| 70 | int crisv32_request_dma(unsigned int dmanr, const char * device_id, | ||
| 71 | unsigned options, unsigned bandwidth, enum dma_owner owner); | ||
| 72 | void crisv32_free_dma(unsigned int dmanr); | ||
| 73 | |||
| 74 | /* Masks used by crisv32_request_dma options: */ | ||
| 75 | #define DMA_VERBOSE_ON_ERROR 1 | ||
| 76 | #define DMA_PANIC_ON_ERROR (2|DMA_VERBOSE_ON_ERROR) | ||
| 77 | #define DMA_INT_MEM 4 | ||
| 78 | |||
| 79 | #endif /* _ASM_ARCH_CRIS_DMA_H */ | ||
diff --git a/arch/cris/include/arch-v32/arch/io.h b/arch/cris/include/arch-v32/arch/io.h index 72024452cea9..adc5484351bf 100644 --- a/arch/cris/include/arch-v32/arch/io.h +++ b/arch/cris/include/arch-v32/arch/io.h | |||
| @@ -46,10 +46,12 @@ static inline void crisv32_io_set(struct crisv32_iopin *iopin, int val) | |||
| 46 | unsigned long flags; | 46 | unsigned long flags; |
| 47 | spin_lock_irqsave(&iopin->port->lock, flags); | 47 | spin_lock_irqsave(&iopin->port->lock, flags); |
| 48 | 48 | ||
| 49 | if (val) | 49 | if (iopin->port->data) { |
| 50 | *iopin->port->data |= iopin->bit; | 50 | if (val) |
| 51 | else | 51 | *iopin->port->data |= iopin->bit; |
| 52 | *iopin->port->data &= ~iopin->bit; | 52 | else |
| 53 | *iopin->port->data &= ~iopin->bit; | ||
| 54 | } | ||
| 53 | 55 | ||
| 54 | spin_unlock_irqrestore(&iopin->port->lock, flags); | 56 | spin_unlock_irqrestore(&iopin->port->lock, flags); |
| 55 | } | 57 | } |
| @@ -60,10 +62,12 @@ static inline void crisv32_io_set_dir(struct crisv32_iopin* iopin, | |||
| 60 | unsigned long flags; | 62 | unsigned long flags; |
| 61 | spin_lock_irqsave(&iopin->port->lock, flags); | 63 | spin_lock_irqsave(&iopin->port->lock, flags); |
| 62 | 64 | ||
| 63 | if (dir == crisv32_io_dir_in) | 65 | if (iopin->port->oe) { |
| 64 | *iopin->port->oe &= ~iopin->bit; | 66 | if (dir == crisv32_io_dir_in) |
| 65 | else | 67 | *iopin->port->oe &= ~iopin->bit; |
| 66 | *iopin->port->oe |= iopin->bit; | 68 | else |
| 69 | *iopin->port->oe |= iopin->bit; | ||
| 70 | } | ||
| 67 | 71 | ||
| 68 | spin_unlock_irqrestore(&iopin->port->lock, flags); | 72 | spin_unlock_irqrestore(&iopin->port->lock, flags); |
| 69 | } | 73 | } |
diff --git a/arch/cris/include/arch-v32/arch/memmap.h b/arch/cris/include/arch-v32/arch/memmap.h index d29df5644d3e..81985c0a6789 100644 --- a/arch/cris/include/arch-v32/arch/memmap.h +++ b/arch/cris/include/arch-v32/arch/memmap.h | |||
| @@ -1,24 +1 @@ | |||
| 1 | #ifndef _ASM_ARCH_MEMMAP_H | #include <mach/memmap.h> | |
| 2 | #define _ASM_ARCH_MEMMAP_H | ||
| 3 | |||
| 4 | #define MEM_CSE0_START (0x00000000) | ||
| 5 | #define MEM_CSE0_SIZE (0x04000000) | ||
| 6 | #define MEM_CSE1_START (0x04000000) | ||
| 7 | #define MEM_CSE1_SIZE (0x04000000) | ||
| 8 | #define MEM_CSR0_START (0x08000000) | ||
| 9 | #define MEM_CSR1_START (0x0c000000) | ||
| 10 | #define MEM_CSP0_START (0x10000000) | ||
| 11 | #define MEM_CSP1_START (0x14000000) | ||
| 12 | #define MEM_CSP2_START (0x18000000) | ||
| 13 | #define MEM_CSP3_START (0x1c000000) | ||
| 14 | #define MEM_CSP4_START (0x20000000) | ||
| 15 | #define MEM_CSP5_START (0x24000000) | ||
| 16 | #define MEM_CSP6_START (0x28000000) | ||
| 17 | #define MEM_CSP7_START (0x2c000000) | ||
| 18 | #define MEM_INTMEM_START (0x38000000) | ||
| 19 | #define MEM_INTMEM_SIZE (0x00020000) | ||
| 20 | #define MEM_DRAM_START (0x40000000) | ||
| 21 | |||
| 22 | #define MEM_NON_CACHEABLE (0x80000000) | ||
| 23 | |||
| 24 | #endif | ||
diff --git a/arch/cris/include/arch-v32/arch/pgtable.h b/arch/cris/include/arch-v32/arch/pgtable.h index 08cb7ff7e4e7..c1051a8da33d 100644 --- a/arch/cris/include/arch-v32/arch/pgtable.h +++ b/arch/cris/include/arch-v32/arch/pgtable.h | |||
| @@ -2,8 +2,16 @@ | |||
| 2 | #define _ASM_CRIS_ARCH_PGTABLE_H | 2 | #define _ASM_CRIS_ARCH_PGTABLE_H |
| 3 | 3 | ||
| 4 | /* Define the kernels virtual memory area. */ | 4 | /* Define the kernels virtual memory area. */ |
| 5 | |||
| 6 | /* See head.S for differences between ARTPEC-3 and ETRAX FS. */ | ||
| 7 | #ifdef CONFIG_CRIS_MACH_ARTPEC3 | ||
| 8 | #define VMALLOC_START KSEG_E | ||
| 9 | #define VMALLOC_END KSEG_F | ||
| 10 | #else | ||
| 5 | #define VMALLOC_START KSEG_D | 11 | #define VMALLOC_START KSEG_D |
| 6 | #define VMALLOC_END KSEG_E | 12 | #define VMALLOC_END KSEG_E |
| 13 | #endif | ||
| 14 | |||
| 7 | #define VMALLOC_VMADDR(x) ((unsigned long)(x)) | 15 | #define VMALLOC_VMADDR(x) ((unsigned long)(x)) |
| 8 | 16 | ||
| 9 | #endif /* _ASM_CRIS_ARCH_PGTABLE_H */ | 17 | #endif /* _ASM_CRIS_ARCH_PGTABLE_H */ |
diff --git a/arch/cris/include/arch-v32/arch/uaccess.h b/arch/cris/include/arch-v32/arch/uaccess.h index 6b207f1b6622..3196019706cb 100644 --- a/arch/cris/include/arch-v32/arch/uaccess.h +++ b/arch/cris/include/arch-v32/arch/uaccess.h | |||
| @@ -122,14 +122,14 @@ __do_strncpy_from_user(char *dst, const char *src, long count) | |||
| 122 | __asm__ __volatile__ ( | 122 | __asm__ __volatile__ ( |
| 123 | " move.d %3,%0\n" | 123 | " move.d %3,%0\n" |
| 124 | "5: move.b [%2+],$acr\n" | 124 | "5: move.b [%2+],$acr\n" |
| 125 | "1: beq 2f\n" | 125 | "1: beq 6f\n" |
| 126 | " move.b $acr,[%1+]\n" | 126 | " move.b $acr,[%1+]\n" |
| 127 | 127 | ||
| 128 | " subq 1,%0\n" | 128 | " subq 1,%0\n" |
| 129 | "2: bne 1b\n" | 129 | "2: bne 1b\n" |
| 130 | " move.b [%2+],$acr\n" | 130 | " move.b [%2+],$acr\n" |
| 131 | 131 | ||
| 132 | " sub.d %3,%0\n" | 132 | "6: sub.d %3,%0\n" |
| 133 | " neg.d %0,%0\n" | 133 | " neg.d %0,%0\n" |
| 134 | "3:\n" | 134 | "3:\n" |
| 135 | " .section .fixup,\"ax\"\n" | 135 | " .section .fixup,\"ax\"\n" |
| @@ -140,8 +140,7 @@ __do_strncpy_from_user(char *dst, const char *src, long count) | |||
| 140 | /* The address for a fault at the first move is trivial. | 140 | /* The address for a fault at the first move is trivial. |
| 141 | The address for a fault at the second move is that of | 141 | The address for a fault at the second move is that of |
| 142 | the preceding branch insn, since the move insn is in | 142 | the preceding branch insn, since the move insn is in |
| 143 | its delay-slot. That address is also a branch | 143 | its delay-slot. Just so you don't get confused... */ |
| 144 | target. Just so you don't get confused... */ | ||
| 145 | " .previous\n" | 144 | " .previous\n" |
| 146 | " .section __ex_table,\"a\"\n" | 145 | " .section __ex_table,\"a\"\n" |
| 147 | " .dword 5b,4b\n" | 146 | " .dword 5b,4b\n" |
diff --git a/arch/cris/include/arch-v32/mach-a3/mach/dma.h b/arch/cris/include/arch-v32/mach-a3/mach/dma.h index 9e8eb13b601d..f01dca1ad108 100644 --- a/arch/cris/include/arch-v32/mach-a3/mach/dma.h +++ b/arch/cris/include/arch-v32/mach-a3/mach/dma.h | |||
| @@ -5,6 +5,33 @@ | |||
| 5 | 5 | ||
| 6 | #define MAX_DMA_CHANNELS 12 /* 8 and 10 not used. */ | 6 | #define MAX_DMA_CHANNELS 12 /* 8 and 10 not used. */ |
| 7 | 7 | ||
| 8 | #define NETWORK_ETH_TX_DMA_NBR 0 /* Ethernet 0 out. */ | ||
| 9 | #define NETWORK_ETH_RX_DMA_NBR 1 /* Ethernet 0 in. */ | ||
| 10 | |||
| 11 | #define IO_PROC_DMA_TX_DMA_NBR 4 /* IO processor DMA0 out. */ | ||
| 12 | #define IO_PROC_DMA_RX_DMA_NBR 5 /* IO processor DMA0 in. */ | ||
| 13 | |||
| 14 | #define ASYNC_SER3_TX_DMA_NBR 2 /* Asynchronous serial port 3 out. */ | ||
| 15 | #define ASYNC_SER3_RX_DMA_NBR 3 /* Asynchronous serial port 3 in. */ | ||
| 16 | |||
| 17 | #define ASYNC_SER2_TX_DMA_NBR 6 /* Asynchronous serial port 2 out. */ | ||
| 18 | #define ASYNC_SER2_RX_DMA_NBR 7 /* Asynchronous serial port 2 in. */ | ||
| 19 | |||
| 20 | #define ASYNC_SER1_TX_DMA_NBR 4 /* Asynchronous serial port 1 out. */ | ||
| 21 | #define ASYNC_SER1_RX_DMA_NBR 5 /* Asynchronous serial port 1 in. */ | ||
| 22 | |||
| 23 | #define SYNC_SER_TX_DMA_NBR 6 /* Synchronous serial port 0 out. */ | ||
| 24 | #define SYNC_SER_RX_DMA_NBR 7 /* Synchronous serial port 0 in. */ | ||
| 25 | |||
| 26 | #define ASYNC_SER0_TX_DMA_NBR 0 /* Asynchronous serial port 0 out. */ | ||
| 27 | #define ASYNC_SER0_RX_DMA_NBR 1 /* Asynchronous serial port 0 in. */ | ||
| 28 | |||
| 29 | #define STRCOP_TX_DMA_NBR 2 /* Stream co-processor out. */ | ||
| 30 | #define STRCOP_RX_DMA_NBR 3 /* Stream co-processor in. */ | ||
| 31 | |||
| 32 | #define dma_eth0 dma_eth | ||
| 33 | #define dma_eth1 dma_eth | ||
| 34 | |||
| 8 | enum dma_owner { | 35 | enum dma_owner { |
| 9 | dma_eth, | 36 | dma_eth, |
| 10 | dma_ser0, | 37 | dma_ser0, |
diff --git a/arch/cris/include/arch-v32/mach-a3/mach/startup.inc b/arch/cris/include/arch-v32/mach-a3/mach/startup.inc index 2f23e5e16f4a..2d52bcc96ed5 100644 --- a/arch/cris/include/arch-v32/mach-a3/mach/startup.inc +++ b/arch/cris/include/arch-v32/mach-a3/mach/startup.inc | |||
| @@ -1,9 +1,19 @@ | |||
| 1 | #ifndef STARTUP_INC_INCLUDED | ||
| 2 | #define STARTUP_INC_INCLUDED | ||
| 3 | |||
| 1 | #include <hwregs/asm/reg_map_asm.h> | 4 | #include <hwregs/asm/reg_map_asm.h> |
| 2 | #include <hwregs/asm/gio_defs_asm.h> | 5 | #include <hwregs/asm/gio_defs_asm.h> |
| 3 | #include <hwregs/asm/pio_defs_asm.h> | 6 | #include <hwregs/asm/pio_defs_asm.h> |
| 4 | #include <hwregs/asm/clkgen_defs_asm.h> | 7 | #include <hwregs/asm/clkgen_defs_asm.h> |
| 5 | #include <hwregs/asm/pinmux_defs_asm.h> | 8 | #include <hwregs/asm/pinmux_defs_asm.h> |
| 6 | 9 | ||
| 10 | .macro GIO_SET_P BITS, OUTREG | ||
| 11 | bmi 1f ; btstq: bit -> N flag | ||
| 12 | nop | ||
| 13 | or.d \BITS, \OUTREG | ||
| 14 | 1: | ||
| 15 | .endm | ||
| 16 | |||
| 7 | .macro GIO_INIT | 17 | .macro GIO_INIT |
| 8 | move.d CONFIG_ETRAX_DEF_GIO_PA_OUT, $r0 | 18 | move.d CONFIG_ETRAX_DEF_GIO_PA_OUT, $r0 |
| 9 | move.d REG_ADDR(gio, regi_gio, rw_pa_dout), $r1 | 19 | move.d REG_ADDR(gio, regi_gio, rw_pa_dout), $r1 |
| @@ -32,10 +42,23 @@ | |||
| 32 | move.d 0xFFFFFFFF, $r0 | 42 | move.d 0xFFFFFFFF, $r0 |
| 33 | move.d REG_ADDR(pinmux, regi_pinmux, rw_gio_pa), $r1 | 43 | move.d REG_ADDR(pinmux, regi_pinmux, rw_gio_pa), $r1 |
| 34 | move.d $r0, [$r1] | 44 | move.d $r0, [$r1] |
| 35 | move.d REG_ADDR(pinmux, regi_pinmux, rw_gio_pb), $r1 | ||
| 36 | move.d $r0, [$r1] | ||
| 37 | move.d REG_ADDR(pinmux, regi_pinmux, rw_gio_pc), $r1 | 45 | move.d REG_ADDR(pinmux, regi_pinmux, rw_gio_pc), $r1 |
| 38 | move.d $r0, [$r1] | 46 | move.d $r0, [$r1] |
| 47 | |||
| 48 | ;; If eth_mdio, eth, geth bits are set in hwprot, don't | ||
| 49 | ;; set them to gpio, as this means they have been configured | ||
| 50 | ;; earlier and shouldn't be changed. | ||
| 51 | move.d 0xFC000000, $r2 ; pins 25..0 are eth_mdio, eth, geth | ||
| 52 | move.d REG_ADDR(pinmux, regi_pinmux, rw_hwprot), $r1 | ||
| 53 | move.d [$r1], $r0 | ||
| 54 | btstq REG_BIT(pinmux, rw_hwprot, eth), $r0 | ||
| 55 | GIO_SET_P 0x00FFFF00, $r2 ;; pins 8..23 are eth | ||
| 56 | btstq REG_BIT(pinmux, rw_hwprot, eth_mdio), $r0 | ||
| 57 | GIO_SET_P 0x03000000, $r2 ;; pins 24..25 are eth_mdio | ||
| 58 | btstq REG_BIT(pinmux, rw_hwprot, geth), $r0 | ||
| 59 | GIO_SET_P 0x000000FF, $r2 ;; pins 0..7 are geth | ||
| 60 | move.d REG_ADDR(pinmux, regi_pinmux, rw_gio_pb), $r1 | ||
| 61 | move.d $r2, [$r1] | ||
| 39 | .endm | 62 | .endm |
| 40 | 63 | ||
| 41 | .macro START_CLOCKS | 64 | .macro START_CLOCKS |
| @@ -58,3 +81,4 @@ | |||
| 58 | move.d CONFIG_ETRAX_PIO_CE2_CFG, $r1 | 81 | move.d CONFIG_ETRAX_PIO_CE2_CFG, $r1 |
| 59 | move.d $r1, [$r0] | 82 | move.d $r1, [$r0] |
| 60 | .endm | 83 | .endm |
| 84 | #endif | ||
diff --git a/arch/cris/include/arch-v32/mach-fs/mach/dma.h b/arch/cris/include/arch-v32/mach-fs/mach/dma.h new file mode 100644 index 000000000000..a8c59292586a --- /dev/null +++ b/arch/cris/include/arch-v32/mach-fs/mach/dma.h | |||
| @@ -0,0 +1,79 @@ | |||
| 1 | #ifndef _ASM_ARCH_CRIS_DMA_H | ||
| 2 | #define _ASM_ARCH_CRIS_DMA_H | ||
| 3 | |||
| 4 | /* Defines for using and allocating dma channels. */ | ||
| 5 | |||
| 6 | #define MAX_DMA_CHANNELS 10 | ||
| 7 | |||
| 8 | #define NETWORK_ETH0_TX_DMA_NBR 0 /* Ethernet 0 out. */ | ||
| 9 | #define NETWORK_ETH0 RX_DMA_NBR 1 /* Ethernet 0 in. */ | ||
| 10 | |||
| 11 | #define IO_PROC_DMA0_TX_DMA_NBR 2 /* IO processor DMA0 out. */ | ||
| 12 | #define IO_PROC_DMA0_RX_DMA_NBR 3 /* IO processor DMA0 in. */ | ||
| 13 | |||
| 14 | #define ATA_TX_DMA_NBR 2 /* ATA interface out. */ | ||
| 15 | #define ATA_RX_DMA_NBR 3 /* ATA interface in. */ | ||
| 16 | |||
| 17 | #define ASYNC_SER2_TX_DMA_NBR 2 /* Asynchronous serial port 2 out. */ | ||
| 18 | #define ASYNC_SER2_RX_DMA_NBR 3 /* Asynchronous serial port 2 in. */ | ||
| 19 | |||
| 20 | #define IO_PROC_DMA1_TX_DMA_NBR 4 /* IO processor DMA1 out. */ | ||
| 21 | #define IO_PROC_DMA1_RX_DMA_NBR 5 /* IO processor DMA1 in. */ | ||
| 22 | |||
| 23 | #define ASYNC_SER1_TX_DMA_NBR 4 /* Asynchronous serial port 1 out. */ | ||
| 24 | #define ASYNC_SER1_RX_DMA_NBR 5 /* Asynchronous serial port 1 in. */ | ||
| 25 | |||
| 26 | #define SYNC_SER0_TX_DMA_NBR 4 /* Synchronous serial port 0 out. */ | ||
| 27 | #define SYNC_SER0_RX_DMA_NBR 5 /* Synchronous serial port 0 in. */ | ||
| 28 | |||
| 29 | #define EXTDMA0_TX_DMA_NBR 6 /* External DMA 0 out. */ | ||
| 30 | #define EXTDMA1_RX_DMA_NBR 7 /* External DMA 1 in. */ | ||
| 31 | |||
| 32 | #define ASYNC_SER0_TX_DMA_NBR 6 /* Asynchronous serial port 0 out. */ | ||
| 33 | #define ASYNC_SER0_RX_DMA_NBR 7 /* Asynchronous serial port 0 in. */ | ||
| 34 | |||
| 35 | #define SYNC_SER1_TX_DMA_NBR 6 /* Synchronous serial port 1 out. */ | ||
| 36 | #define SYNC_SER1_RX_DMA_NBR 7 /* Synchronous serial port 1 in. */ | ||
| 37 | |||
| 38 | #define NETWORK_ETH1_TX_DMA_NBR 6 /* Ethernet 1 out. */ | ||
| 39 | #define NETWORK_ETH1_RX_DMA_NBR 7 /* Ethernet 1 in. */ | ||
| 40 | |||
| 41 | #define EXTDMA2_TX_DMA_NBR 8 /* External DMA 2 out. */ | ||
| 42 | #define EXTDMA3_RX_DMA_NBR 9 /* External DMA 3 in. */ | ||
| 43 | |||
| 44 | #define STRCOP_TX_DMA_NBR 8 /* Stream co-processor out. */ | ||
| 45 | #define STRCOP_RX_DMA_NBR 9 /* Stream co-processor in. */ | ||
| 46 | |||
| 47 | #define ASYNC_SER3_TX_DMA_NBR 8 /* Asynchronous serial port 3 out. */ | ||
| 48 | #define ASYNC_SER3_RX_DMA_NBR 9 /* Asynchronous serial port 3 in. */ | ||
| 49 | |||
| 50 | enum dma_owner { | ||
| 51 | dma_eth0, | ||
| 52 | dma_eth1, | ||
| 53 | dma_iop0, | ||
| 54 | dma_iop1, | ||
| 55 | dma_ser0, | ||
| 56 | dma_ser1, | ||
| 57 | dma_ser2, | ||
| 58 | dma_ser3, | ||
| 59 | dma_sser0, | ||
| 60 | dma_sser1, | ||
| 61 | dma_ata, | ||
| 62 | dma_strp, | ||
| 63 | dma_ext0, | ||
| 64 | dma_ext1, | ||
| 65 | dma_ext2, | ||
| 66 | dma_ext3 | ||
| 67 | }; | ||
| 68 | |||
| 69 | int crisv32_request_dma(unsigned int dmanr, const char *device_id, | ||
| 70 | unsigned options, unsigned bandwidth, | ||
| 71 | enum dma_owner owner); | ||
| 72 | void crisv32_free_dma(unsigned int dmanr); | ||
| 73 | |||
| 74 | /* Masks used by crisv32_request_dma options: */ | ||
| 75 | #define DMA_VERBOSE_ON_ERROR 1 | ||
| 76 | #define DMA_PANIC_ON_ERROR (2|DMA_VERBOSE_ON_ERROR) | ||
| 77 | #define DMA_INT_MEM 4 | ||
| 78 | |||
| 79 | #endif /* _ASM_ARCH_CRIS_DMA_H */ | ||
diff --git a/arch/cris/include/arch-v32/mach-fs/mach/memmap.h b/arch/cris/include/arch-v32/mach-fs/mach/memmap.h new file mode 100644 index 000000000000..d29df5644d3e --- /dev/null +++ b/arch/cris/include/arch-v32/mach-fs/mach/memmap.h | |||
| @@ -0,0 +1,24 @@ | |||
| 1 | #ifndef _ASM_ARCH_MEMMAP_H | ||
| 2 | #define _ASM_ARCH_MEMMAP_H | ||
| 3 | |||
| 4 | #define MEM_CSE0_START (0x00000000) | ||
| 5 | #define MEM_CSE0_SIZE (0x04000000) | ||
| 6 | #define MEM_CSE1_START (0x04000000) | ||
| 7 | #define MEM_CSE1_SIZE (0x04000000) | ||
| 8 | #define MEM_CSR0_START (0x08000000) | ||
| 9 | #define MEM_CSR1_START (0x0c000000) | ||
| 10 | #define MEM_CSP0_START (0x10000000) | ||
| 11 | #define MEM_CSP1_START (0x14000000) | ||
| 12 | #define MEM_CSP2_START (0x18000000) | ||
| 13 | #define MEM_CSP3_START (0x1c000000) | ||
| 14 | #define MEM_CSP4_START (0x20000000) | ||
| 15 | #define MEM_CSP5_START (0x24000000) | ||
| 16 | #define MEM_CSP6_START (0x28000000) | ||
| 17 | #define MEM_CSP7_START (0x2c000000) | ||
| 18 | #define MEM_INTMEM_START (0x38000000) | ||
| 19 | #define MEM_INTMEM_SIZE (0x00020000) | ||
| 20 | #define MEM_DRAM_START (0x40000000) | ||
| 21 | |||
| 22 | #define MEM_NON_CACHEABLE (0x80000000) | ||
| 23 | |||
| 24 | #endif | ||
diff --git a/arch/cris/include/arch-v32/mach-fs/mach/startup.inc b/arch/cris/include/arch-v32/mach-fs/mach/startup.inc index 4a10ccbd6cc1..dd1abbdcbc7a 100644 --- a/arch/cris/include/arch-v32/mach-fs/mach/startup.inc +++ b/arch/cris/include/arch-v32/mach-fs/mach/startup.inc | |||
| @@ -1,3 +1,6 @@ | |||
| 1 | #ifndef STARTUP_INC_INCLUDED | ||
| 2 | #define STARTUP_INC_INCLUDED | ||
| 3 | |||
| 1 | #include <hwregs/asm/reg_map_asm.h> | 4 | #include <hwregs/asm/reg_map_asm.h> |
| 2 | #include <hwregs/asm/bif_core_defs_asm.h> | 5 | #include <hwregs/asm/bif_core_defs_asm.h> |
| 3 | #include <hwregs/asm/gio_defs_asm.h> | 6 | #include <hwregs/asm/gio_defs_asm.h> |
| @@ -75,3 +78,5 @@ | |||
| 75 | move.d $r10, [$r11] | 78 | move.d $r10, [$r11] |
| 76 | #endif | 79 | #endif |
| 77 | .endm | 80 | .endm |
| 81 | |||
| 82 | #endif | ||
diff --git a/arch/cris/include/asm/etraxgpio.h b/arch/cris/include/asm/etraxgpio.h index 38f1c8e1770c..d474818a537e 100644 --- a/arch/cris/include/asm/etraxgpio.h +++ b/arch/cris/include/asm/etraxgpio.h | |||
| @@ -21,31 +21,35 @@ | |||
| 21 | * /dev/leds minor 2, Access to leds depending on kernelconfig | 21 | * /dev/leds minor 2, Access to leds depending on kernelconfig |
| 22 | * | 22 | * |
| 23 | * For ARTPEC-3 (CONFIG_CRIS_MACH_ARTPEC3): | 23 | * For ARTPEC-3 (CONFIG_CRIS_MACH_ARTPEC3): |
| 24 | * /dev/gpioa minor 0, 8 bit GPIO, each bit can change direction | 24 | * /dev/gpioa minor 0, 32 bit GPIO, each bit can change direction |
| 25 | * /dev/gpiob minor 1, 18 bit GPIO, each bit can change direction | 25 | * /dev/gpiob minor 1, 32 bit GPIO, each bit can change direction |
| 26 | * /dev/gpioc minor 3, 18 bit GPIO, each bit can change direction | 26 | * /dev/gpioc minor 3, 16 bit GPIO, each bit can change direction |
| 27 | * /dev/gpiod minor 4, 18 bit GPIO, each bit can change direction | 27 | * /dev/gpiod minor 4, 32 bit GPIO, input only |
| 28 | * /dev/leds minor 2, Access to leds depending on kernelconfig | 28 | * /dev/leds minor 2, Access to leds depending on kernelconfig |
| 29 | * /dev/pwm0 minor 16, PWM channel 0 on PA30 | 29 | * /dev/pwm0 minor 16, PWM channel 0 on PA30 |
| 30 | * /dev/pwm1 minor 17, PWM channel 1 on PA31 | 30 | * /dev/pwm1 minor 17, PWM channel 1 on PA31 |
| 31 | * /dev/pwm2 minor 18, PWM channel 2 on PB26 | 31 | * /dev/pwm2 minor 18, PWM channel 2 on PB26 |
| 32 | * /dev/ppwm minor 19, PPWM channel | ||
| 32 | * | 33 | * |
| 33 | */ | 34 | */ |
| 34 | #ifndef _ASM_ETRAXGPIO_H | 35 | #ifndef _ASM_ETRAXGPIO_H |
| 35 | #define _ASM_ETRAXGPIO_H | 36 | #define _ASM_ETRAXGPIO_H |
| 36 | 37 | ||
| 38 | #define GPIO_MINOR_FIRST 0 | ||
| 39 | |||
| 40 | #define ETRAXGPIO_IOCTYPE 43 | ||
| 41 | |||
| 37 | /* etraxgpio _IOC_TYPE, bits 8 to 15 in ioctl cmd */ | 42 | /* etraxgpio _IOC_TYPE, bits 8 to 15 in ioctl cmd */ |
| 38 | #ifdef CONFIG_ETRAX_ARCH_V10 | 43 | #ifdef CONFIG_ETRAX_ARCH_V10 |
| 39 | #define ETRAXGPIO_IOCTYPE 43 | ||
| 40 | #define GPIO_MINOR_A 0 | 44 | #define GPIO_MINOR_A 0 |
| 41 | #define GPIO_MINOR_B 1 | 45 | #define GPIO_MINOR_B 1 |
| 42 | #define GPIO_MINOR_LEDS 2 | 46 | #define GPIO_MINOR_LEDS 2 |
| 43 | #define GPIO_MINOR_G 3 | 47 | #define GPIO_MINOR_G 3 |
| 44 | #define GPIO_MINOR_LAST 3 | 48 | #define GPIO_MINOR_LAST 3 |
| 49 | #define GPIO_MINOR_LAST_REAL GPIO_MINOR_LAST | ||
| 45 | #endif | 50 | #endif |
| 46 | 51 | ||
| 47 | #ifdef CONFIG_ETRAXFS | 52 | #ifdef CONFIG_ETRAXFS |
| 48 | #define ETRAXGPIO_IOCTYPE 43 | ||
| 49 | #define GPIO_MINOR_A 0 | 53 | #define GPIO_MINOR_A 0 |
| 50 | #define GPIO_MINOR_B 1 | 54 | #define GPIO_MINOR_B 1 |
| 51 | #define GPIO_MINOR_LEDS 2 | 55 | #define GPIO_MINOR_LEDS 2 |
| @@ -58,10 +62,10 @@ | |||
| 58 | #else | 62 | #else |
| 59 | #define GPIO_MINOR_LAST 5 | 63 | #define GPIO_MINOR_LAST 5 |
| 60 | #endif | 64 | #endif |
| 65 | #define GPIO_MINOR_LAST_REAL GPIO_MINOR_LAST | ||
| 61 | #endif | 66 | #endif |
| 62 | 67 | ||
| 63 | #ifdef CONFIG_CRIS_MACH_ARTPEC3 | 68 | #ifdef CONFIG_CRIS_MACH_ARTPEC3 |
| 64 | #define ETRAXGPIO_IOCTYPE 43 | ||
| 65 | #define GPIO_MINOR_A 0 | 69 | #define GPIO_MINOR_A 0 |
| 66 | #define GPIO_MINOR_B 1 | 70 | #define GPIO_MINOR_B 1 |
| 67 | #define GPIO_MINOR_LEDS 2 | 71 | #define GPIO_MINOR_LEDS 2 |
| @@ -73,12 +77,17 @@ | |||
| 73 | #else | 77 | #else |
| 74 | #define GPIO_MINOR_LAST 4 | 78 | #define GPIO_MINOR_LAST 4 |
| 75 | #endif | 79 | #endif |
| 76 | #define GPIO_MINOR_PWM0 16 | 80 | #define GPIO_MINOR_FIRST_PWM 16 |
| 77 | #define GPIO_MINOR_PWM1 17 | 81 | #define GPIO_MINOR_PWM0 (GPIO_MINOR_FIRST_PWM+0) |
| 78 | #define GPIO_MINOR_PWM2 18 | 82 | #define GPIO_MINOR_PWM1 (GPIO_MINOR_FIRST_PWM+1) |
| 79 | #define GPIO_MINOR_LAST_PWM GPIO_MINOR_PWM2 | 83 | #define GPIO_MINOR_PWM2 (GPIO_MINOR_FIRST_PWM+2) |
| 84 | #define GPIO_MINOR_PPWM (GPIO_MINOR_FIRST_PWM+3) | ||
| 85 | #define GPIO_MINOR_LAST_PWM GPIO_MINOR_PPWM | ||
| 86 | #define GPIO_MINOR_LAST_REAL GPIO_MINOR_LAST_PWM | ||
| 80 | #endif | 87 | #endif |
| 81 | 88 | ||
| 89 | |||
| 90 | |||
| 82 | /* supported ioctl _IOC_NR's */ | 91 | /* supported ioctl _IOC_NR's */ |
| 83 | 92 | ||
| 84 | #define IO_READBITS 0x1 /* read and return current port bits (obsolete) */ | 93 | #define IO_READBITS 0x1 /* read and return current port bits (obsolete) */ |
| @@ -125,12 +134,10 @@ | |||
| 125 | */ | 134 | */ |
| 126 | #define IO_READ_INBITS 0x10 /* *arg is result of reading the input pins */ | 135 | #define IO_READ_INBITS 0x10 /* *arg is result of reading the input pins */ |
| 127 | #define IO_READ_OUTBITS 0x11 /* *arg is result of reading the output shadow */ | 136 | #define IO_READ_OUTBITS 0x11 /* *arg is result of reading the output shadow */ |
| 128 | #define IO_SETGET_INPUT 0x12 /* bits set in *arg is set to input, | 137 | #define IO_SETGET_INPUT 0x12 /* bits set in *arg is set to input, */ |
| 129 | * *arg updated with current input pins. | 138 | /* *arg updated with current input pins. */ |
| 130 | */ | 139 | #define IO_SETGET_OUTPUT 0x13 /* bits set in *arg is set to output, */ |
| 131 | #define IO_SETGET_OUTPUT 0x13 /* bits set in *arg is set to output, | 140 | /* *arg updated with current output pins. */ |
| 132 | * *arg updated with current output pins. | ||
| 133 | */ | ||
| 134 | 141 | ||
| 135 | /* The following ioctl's are applicable to the PWM channels only */ | 142 | /* The following ioctl's are applicable to the PWM channels only */ |
| 136 | 143 | ||
| @@ -140,7 +147,8 @@ enum io_pwm_mode { | |||
| 140 | PWM_OFF = 0, /* disabled, deallocated */ | 147 | PWM_OFF = 0, /* disabled, deallocated */ |
| 141 | PWM_STANDARD = 1, /* 390 kHz, duty cycle 0..255/256 */ | 148 | PWM_STANDARD = 1, /* 390 kHz, duty cycle 0..255/256 */ |
| 142 | PWM_FAST = 2, /* variable freq, w/ 10ns active pulse len */ | 149 | PWM_FAST = 2, /* variable freq, w/ 10ns active pulse len */ |
| 143 | PWM_VARFREQ = 3 /* individually configurable high/low periods */ | 150 | PWM_VARFREQ = 3, /* individually configurable high/low periods */ |
| 151 | PWM_SOFT = 4 /* software generated */ | ||
| 144 | }; | 152 | }; |
| 145 | 153 | ||
| 146 | struct io_pwm_set_mode { | 154 | struct io_pwm_set_mode { |
| @@ -176,4 +184,56 @@ struct io_pwm_set_duty { | |||
| 176 | int duty; /* 0..255 */ | 184 | int duty; /* 0..255 */ |
| 177 | }; | 185 | }; |
| 178 | 186 | ||
| 187 | /* Returns information about the latest PWM pulse. | ||
| 188 | * lo: Length of the latest low period, in units of 10ns. | ||
| 189 | * hi: Length of the latest high period, in units of 10ns. | ||
| 190 | * cnt: Time since last detected edge, in units of 10ns. | ||
| 191 | * | ||
| 192 | * The input source to PWM is decied by IO_PWM_SET_INPUT_SRC. | ||
| 193 | * | ||
| 194 | * NOTE: All PWM devices is connected to the same input source. | ||
| 195 | */ | ||
| 196 | #define IO_PWM_GET_PERIOD 0x23 | ||
| 197 | |||
| 198 | struct io_pwm_get_period { | ||
| 199 | unsigned int lo; | ||
| 200 | unsigned int hi; | ||
| 201 | unsigned int cnt; | ||
| 202 | }; | ||
| 203 | |||
| 204 | /* Sets the input source for the PWM input. For the src value see the | ||
| 205 | * register description for gio:rw_pwm_in_cfg. | ||
| 206 | * | ||
| 207 | * NOTE: All PWM devices is connected to the same input source. | ||
| 208 | */ | ||
| 209 | #define IO_PWM_SET_INPUT_SRC 0x24 | ||
| 210 | struct io_pwm_set_input_src { | ||
| 211 | unsigned int src; /* 0..7 */ | ||
| 212 | }; | ||
| 213 | |||
| 214 | /* Sets the duty cycles in steps of 1/256, 0 = 0%, 255 = 100% duty cycle */ | ||
| 215 | #define IO_PPWM_SET_DUTY 0x25 | ||
| 216 | |||
| 217 | struct io_ppwm_set_duty { | ||
| 218 | int duty; /* 0..255 */ | ||
| 219 | }; | ||
| 220 | |||
| 221 | /* Configuraton struct for the IO_PWMCLK_SET_CONFIG ioctl to configure | ||
| 222 | * PWM capable gpio pins: | ||
| 223 | */ | ||
| 224 | #define IO_PWMCLK_SETGET_CONFIG 0x26 | ||
| 225 | struct gpio_pwmclk_conf { | ||
| 226 | unsigned int gpiopin; /* The pin number based on the opened device */ | ||
| 227 | unsigned int baseclk; /* The base clock to use, or sw will select one close*/ | ||
| 228 | unsigned int low; /* The number of low periods of the baseclk */ | ||
| 229 | unsigned int high; /* The number of high periods of the baseclk */ | ||
| 230 | }; | ||
| 231 | |||
| 232 | /* Examples: | ||
| 233 | * To get a symmetric 12 MHz clock without knowing anything about the hardware: | ||
| 234 | * baseclk = 12000000, low = 0, high = 0 | ||
| 235 | * To just get info of current setting: | ||
| 236 | * baseclk = 0, low = 0, high = 0, the values will be updated by driver. | ||
| 237 | */ | ||
| 238 | |||
| 179 | #endif | 239 | #endif |
diff --git a/arch/cris/include/asm/sync_serial.h b/arch/cris/include/asm/sync_serial.h index d87c24df2b38..7f827fea30e7 100644 --- a/arch/cris/include/asm/sync_serial.h +++ b/arch/cris/include/asm/sync_serial.h | |||
| @@ -19,6 +19,7 @@ | |||
| 19 | #define SSP_OPOLARITY _IOR('S', 4, unsigned int) | 19 | #define SSP_OPOLARITY _IOR('S', 4, unsigned int) |
| 20 | #define SSP_SPI _IOR('S', 5, unsigned int) | 20 | #define SSP_SPI _IOR('S', 5, unsigned int) |
| 21 | #define SSP_INBUFCHUNK _IOR('S', 6, unsigned int) | 21 | #define SSP_INBUFCHUNK _IOR('S', 6, unsigned int) |
| 22 | #define SSP_INPUT _IOR('S', 7, unsigned int) | ||
| 22 | 23 | ||
| 23 | /* Values for SSP_SPEED */ | 24 | /* Values for SSP_SPEED */ |
| 24 | #define SSP150 0 | 25 | #define SSP150 0 |
| @@ -37,6 +38,7 @@ | |||
| 37 | #define SSP921600 13 | 38 | #define SSP921600 13 |
| 38 | #define SSP3125000 14 | 39 | #define SSP3125000 14 |
| 39 | #define CODEC 15 | 40 | #define CODEC 15 |
| 41 | #define CODEC_f32768 16 | ||
| 40 | 42 | ||
| 41 | #define FREQ_4MHz 0 | 43 | #define FREQ_4MHz 0 |
| 42 | #define FREQ_2MHz 1 | 44 | #define FREQ_2MHz 1 |
| @@ -46,9 +48,14 @@ | |||
| 46 | #define FREQ_128kHz 5 | 48 | #define FREQ_128kHz 5 |
| 47 | #define FREQ_64kHz 6 | 49 | #define FREQ_64kHz 6 |
| 48 | #define FREQ_32kHz 7 | 50 | #define FREQ_32kHz 7 |
| 51 | /* FREQ_* with values where bit (value & 0x10) is set are */ | ||
| 52 | /* used for CODEC_f32768 */ | ||
| 53 | #define FREQ_4096kHz 16 /* CODEC_f32768 */ | ||
| 49 | 54 | ||
| 50 | /* Used by application to set CODEC divider, word rate and frame rate */ | 55 | /* Used by application to set CODEC divider, word rate and frame rate */ |
| 51 | #define CODEC_VAL(freq, clk_per_sync, sync_per_frame) (CODEC | (freq << 8) | (clk_per_sync << 16) | (sync_per_frame << 28)) | 56 | #define CODEC_VAL(freq, clk_per_sync, sync_per_frame) \ |
| 57 | ((CODEC + ((freq & 0x10) >> 4)) | (freq << 8) | \ | ||
| 58 | (clk_per_sync << 16) | (sync_per_frame << 28)) | ||
| 52 | 59 | ||
| 53 | /* Used by driver to extract speed */ | 60 | /* Used by driver to extract speed */ |
| 54 | #define GET_SPEED(x) (x & 0xff) | 61 | #define GET_SPEED(x) (x & 0xff) |
| @@ -68,6 +75,7 @@ | |||
| 68 | #define NORMAL_SYNC 1 | 75 | #define NORMAL_SYNC 1 |
| 69 | #define EARLY_SYNC 2 | 76 | #define EARLY_SYNC 2 |
| 70 | #define SECOND_WORD_SYNC 0x40000 | 77 | #define SECOND_WORD_SYNC 0x40000 |
| 78 | #define LATE_SYNC 0x80000 | ||
| 71 | 79 | ||
| 72 | #define BIT_SYNC 4 | 80 | #define BIT_SYNC 4 |
| 73 | #define WORD_SYNC 8 | 81 | #define WORD_SYNC 8 |
| @@ -104,4 +112,21 @@ | |||
| 104 | /* Values for SSP_INBUFCHUNK */ | 112 | /* Values for SSP_INBUFCHUNK */ |
| 105 | /* plain integer with the size of DMA chunks */ | 113 | /* plain integer with the size of DMA chunks */ |
| 106 | 114 | ||
| 115 | /* To ensure that the timestamps are aligned with the data being read | ||
| 116 | * the read length MUST be a multiple of the length of the DMA buffers. | ||
| 117 | * | ||
| 118 | * Use a multiple of SSP_INPUT_CHUNK_SIZE defined below. | ||
| 119 | */ | ||
| 120 | #define SSP_INPUT_CHUNK_SIZE 256 | ||
| 121 | |||
| 122 | /* Request struct to pass through the ioctl interface to read | ||
| 123 | * data with timestamps. | ||
| 124 | */ | ||
| 125 | struct ssp_request { | ||
| 126 | char __user *buf; /* Where to put the data. */ | ||
| 127 | size_t len; /* Size of buf. MUST be a multiple of */ | ||
| 128 | /* SSP_INPUT_CHUNK_SIZE! */ | ||
| 129 | struct timespec ts; /* The time the data was sampled. */ | ||
| 130 | }; | ||
| 131 | |||
| 107 | #endif | 132 | #endif |
diff --git a/arch/cris/kernel/profile.c b/arch/cris/kernel/profile.c index b917549a7d94..195ec5fa0dd2 100644 --- a/arch/cris/kernel/profile.c +++ b/arch/cris/kernel/profile.c | |||
| @@ -9,12 +9,11 @@ | |||
| 9 | 9 | ||
| 10 | #define SAMPLE_BUFFER_SIZE 8192 | 10 | #define SAMPLE_BUFFER_SIZE 8192 |
| 11 | 11 | ||
| 12 | static char* sample_buffer; | 12 | static char *sample_buffer; |
| 13 | static char* sample_buffer_pos; | 13 | static char *sample_buffer_pos; |
| 14 | static int prof_running = 0; | 14 | static int prof_running = 0; |
| 15 | 15 | ||
| 16 | void | 16 | void cris_profile_sample(struct pt_regs *regs) |
| 17 | cris_profile_sample(struct pt_regs* regs) | ||
| 18 | { | 17 | { |
| 19 | if (!prof_running) | 18 | if (!prof_running) |
| 20 | return; | 19 | return; |
| @@ -24,7 +23,7 @@ cris_profile_sample(struct pt_regs* regs) | |||
| 24 | else | 23 | else |
| 25 | *(unsigned int*)sample_buffer_pos = 0; | 24 | *(unsigned int*)sample_buffer_pos = 0; |
| 26 | 25 | ||
| 27 | *(unsigned int*)(sample_buffer_pos + 4) = instruction_pointer(regs); | 26 | *(unsigned int *)(sample_buffer_pos + 4) = instruction_pointer(regs); |
| 28 | sample_buffer_pos += 8; | 27 | sample_buffer_pos += 8; |
| 29 | 28 | ||
| 30 | if (sample_buffer_pos == sample_buffer + SAMPLE_BUFFER_SIZE) | 29 | if (sample_buffer_pos == sample_buffer + SAMPLE_BUFFER_SIZE) |
| @@ -54,6 +53,7 @@ write_cris_profile(struct file *file, const char __user *buf, | |||
| 54 | { | 53 | { |
| 55 | sample_buffer_pos = sample_buffer; | 54 | sample_buffer_pos = sample_buffer; |
| 56 | memset(sample_buffer, 0, SAMPLE_BUFFER_SIZE); | 55 | memset(sample_buffer, 0, SAMPLE_BUFFER_SIZE); |
| 56 | return count < SAMPLE_BUFFER_SIZE ? count : SAMPLE_BUFFER_SIZE; | ||
| 57 | } | 57 | } |
| 58 | 58 | ||
| 59 | static const struct file_operations cris_proc_profile_operations = { | 59 | static const struct file_operations cris_proc_profile_operations = { |
| @@ -61,8 +61,7 @@ static const struct file_operations cris_proc_profile_operations = { | |||
| 61 | .write = write_cris_profile, | 61 | .write = write_cris_profile, |
| 62 | }; | 62 | }; |
| 63 | 63 | ||
| 64 | static int | 64 | static int __init init_cris_profile(void) |
| 65 | __init init_cris_profile(void) | ||
| 66 | { | 65 | { |
| 67 | struct proc_dir_entry *entry; | 66 | struct proc_dir_entry *entry; |
| 68 | 67 | ||
| @@ -82,5 +81,5 @@ __init init_cris_profile(void) | |||
| 82 | 81 | ||
| 83 | return 0; | 82 | return 0; |
| 84 | } | 83 | } |
| 85 | |||
| 86 | __initcall(init_cris_profile); | 84 | __initcall(init_cris_profile); |
| 85 | |||
diff --git a/arch/cris/kernel/time.c b/arch/cris/kernel/time.c index c72730d20ef6..b5096430ce1c 100644 --- a/arch/cris/kernel/time.c +++ b/arch/cris/kernel/time.c | |||
| @@ -39,13 +39,16 @@ int have_rtc; /* used to remember if we have an RTC or not */; | |||
| 39 | extern unsigned long loops_per_jiffy; /* init/main.c */ | 39 | extern unsigned long loops_per_jiffy; /* init/main.c */ |
| 40 | unsigned long loops_per_usec; | 40 | unsigned long loops_per_usec; |
| 41 | 41 | ||
| 42 | |||
| 43 | #ifdef CONFIG_ARCH_USES_GETTIMEOFFSET | ||
| 42 | extern unsigned long do_slow_gettimeoffset(void); | 44 | extern unsigned long do_slow_gettimeoffset(void); |
| 43 | static unsigned long (*do_gettimeoffset)(void) = do_slow_gettimeoffset; | 45 | static unsigned long (*do_gettimeoffset)(void) = do_slow_gettimeoffset; |
| 44 | 46 | ||
| 45 | u32 arch_gettimeoffset(void) | 47 | u32 arch_gettimeoffset(void) |
| 46 | { | 48 | { |
| 47 | return do_gettimeoffset() * 1000; | 49 | return do_gettimeoffset() * 1000; |
| 48 | } | 50 | } |
| 51 | #endif | ||
| 49 | 52 | ||
| 50 | /* | 53 | /* |
| 51 | * BUG: This routine does not handle hour overflow properly; it just | 54 | * BUG: This routine does not handle hour overflow properly; it just |
| @@ -151,7 +154,7 @@ cris_do_profile(struct pt_regs* regs) | |||
| 151 | 154 | ||
| 152 | unsigned long long sched_clock(void) | 155 | unsigned long long sched_clock(void) |
| 153 | { | 156 | { |
| 154 | return (unsigned long long)jiffies * (1000000000 / HZ) + | 157 | return (unsigned long long)jiffies * (NSEC_PER_SEC / HZ) + |
| 155 | get_ns_in_jiffie(); | 158 | get_ns_in_jiffie(); |
| 156 | } | 159 | } |
| 157 | 160 | ||
diff --git a/arch/cris/kernel/vmlinux.lds.S b/arch/cris/kernel/vmlinux.lds.S index d49d17d2a14f..442218980db0 100644 --- a/arch/cris/kernel/vmlinux.lds.S +++ b/arch/cris/kernel/vmlinux.lds.S | |||
| @@ -58,6 +58,8 @@ SECTIONS | |||
| 58 | ___data_start = . ; | 58 | ___data_start = . ; |
| 59 | __Sdata = . ; | 59 | __Sdata = . ; |
| 60 | .data : { /* Data */ | 60 | .data : { /* Data */ |
| 61 | CACHELINE_ALIGNED_DATA(32) | ||
| 62 | READ_MOSTLY_DATA(32) | ||
| 61 | DATA_DATA | 63 | DATA_DATA |
| 62 | } | 64 | } |
| 63 | __edata = . ; /* End of data section. */ | 65 | __edata = . ; /* End of data section. */ |
| @@ -84,6 +86,16 @@ SECTIONS | |||
| 84 | } | 86 | } |
| 85 | SECURITY_INIT | 87 | SECURITY_INIT |
| 86 | 88 | ||
| 89 | /* .exit.text is discarded at runtime, not link time, | ||
| 90 | * to deal with references from __bug_table | ||
| 91 | */ | ||
| 92 | .exit.text : { | ||
| 93 | EXIT_TEXT | ||
| 94 | } | ||
| 95 | .exit.data : { | ||
| 96 | EXIT_DATA | ||
| 97 | } | ||
| 98 | |||
| 87 | #ifdef CONFIG_ETRAX_ARCH_V10 | 99 | #ifdef CONFIG_ETRAX_ARCH_V10 |
| 88 | #ifdef CONFIG_BLK_DEV_INITRD | 100 | #ifdef CONFIG_BLK_DEV_INITRD |
| 89 | .init.ramfs : { | 101 | .init.ramfs : { |
| @@ -112,7 +124,7 @@ SECTIONS | |||
| 112 | __init_end = .; | 124 | __init_end = .; |
| 113 | 125 | ||
| 114 | __data_end = . ; /* Move to _edata ? */ | 126 | __data_end = . ; /* Move to _edata ? */ |
| 115 | BSS_SECTION(0, 0, 0) | 127 | BSS_SECTION(1, 1, 1) |
| 116 | 128 | ||
| 117 | . = ALIGN (0x20); | 129 | . = ALIGN (0x20); |
| 118 | _end = .; | 130 | _end = .; |
diff --git a/arch/cris/mm/fault.c b/arch/cris/mm/fault.c index 380df1a73a6e..9dcac8ec8fa0 100644 --- a/arch/cris/mm/fault.c +++ b/arch/cris/mm/fault.c | |||
| @@ -1,19 +1,18 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * linux/arch/cris/mm/fault.c | 2 | * arch/cris/mm/fault.c |
| 3 | * | ||
| 4 | * Copyright (C) 2000-2006 Axis Communications AB | ||
| 5 | * | ||
| 6 | * Authors: Bjorn Wesen | ||
| 7 | * | 3 | * |
| 4 | * Copyright (C) 2000-2010 Axis Communications AB | ||
| 8 | */ | 5 | */ |
| 9 | 6 | ||
| 10 | #include <linux/mm.h> | 7 | #include <linux/mm.h> |
| 11 | #include <linux/interrupt.h> | 8 | #include <linux/interrupt.h> |
| 12 | #include <linux/module.h> | 9 | #include <linux/module.h> |
| 10 | #include <linux/wait.h> | ||
| 13 | #include <asm/uaccess.h> | 11 | #include <asm/uaccess.h> |
| 14 | 12 | ||
| 15 | extern int find_fixup_code(struct pt_regs *); | 13 | extern int find_fixup_code(struct pt_regs *); |
| 16 | extern void die_if_kernel(const char *, struct pt_regs *, long); | 14 | extern void die_if_kernel(const char *, struct pt_regs *, long); |
| 15 | extern void show_registers(struct pt_regs *regs); | ||
| 17 | 16 | ||
| 18 | /* debug of low-level TLB reload */ | 17 | /* debug of low-level TLB reload */ |
| 19 | #undef DEBUG | 18 | #undef DEBUG |
| @@ -108,11 +107,11 @@ do_page_fault(unsigned long address, struct pt_regs *regs, | |||
| 108 | info.si_code = SEGV_MAPERR; | 107 | info.si_code = SEGV_MAPERR; |
| 109 | 108 | ||
| 110 | /* | 109 | /* |
| 111 | * If we're in an interrupt or have no user | 110 | * If we're in an interrupt or "atomic" operation or have no |
| 112 | * context, we must not take the fault.. | 111 | * user context, we must not take the fault. |
| 113 | */ | 112 | */ |
| 114 | 113 | ||
| 115 | if (in_interrupt() || !mm) | 114 | if (in_atomic() || !mm) |
| 116 | goto no_context; | 115 | goto no_context; |
| 117 | 116 | ||
| 118 | down_read(&mm->mmap_sem); | 117 | down_read(&mm->mmap_sem); |
| @@ -193,14 +192,25 @@ do_page_fault(unsigned long address, struct pt_regs *regs, | |||
| 193 | /* User mode accesses just cause a SIGSEGV */ | 192 | /* User mode accesses just cause a SIGSEGV */ |
| 194 | 193 | ||
| 195 | if (user_mode(regs)) { | 194 | if (user_mode(regs)) { |
| 195 | printk(KERN_NOTICE "%s (pid %d) segfaults for page " | ||
| 196 | "address %08lx at pc %08lx\n", | ||
| 197 | tsk->comm, tsk->pid, | ||
| 198 | address, instruction_pointer(regs)); | ||
| 199 | |||
| 200 | /* With DPG on, we've already dumped registers above. */ | ||
| 201 | DPG(if (0)) | ||
| 202 | show_registers(regs); | ||
| 203 | |||
| 204 | #ifdef CONFIG_NO_SEGFAULT_TERMINATION | ||
| 205 | DECLARE_WAIT_QUEUE_HEAD(wq); | ||
| 206 | wait_event_interruptible(wq, 0 == 1); | ||
| 207 | #else | ||
| 196 | info.si_signo = SIGSEGV; | 208 | info.si_signo = SIGSEGV; |
| 197 | info.si_errno = 0; | 209 | info.si_errno = 0; |
| 198 | /* info.si_code has been set above */ | 210 | /* info.si_code has been set above */ |
| 199 | info.si_addr = (void *)address; | 211 | info.si_addr = (void *)address; |
| 200 | force_sig_info(SIGSEGV, &info, tsk); | 212 | force_sig_info(SIGSEGV, &info, tsk); |
| 201 | printk(KERN_NOTICE "%s (pid %d) segfaults for page " | 213 | #endif |
| 202 | "address %08lx at pc %08lx\n", | ||
| 203 | tsk->comm, tsk->pid, address, instruction_pointer(regs)); | ||
| 204 | return; | 214 | return; |
| 205 | } | 215 | } |
| 206 | 216 | ||
| @@ -245,10 +255,10 @@ do_page_fault(unsigned long address, struct pt_regs *regs, | |||
| 245 | 255 | ||
| 246 | out_of_memory: | 256 | out_of_memory: |
| 247 | up_read(&mm->mmap_sem); | 257 | up_read(&mm->mmap_sem); |
| 248 | printk("VM: killing process %s\n", tsk->comm); | 258 | if (!user_mode(regs)) |
| 249 | if (user_mode(regs)) | 259 | goto no_context; |
| 250 | do_exit(SIGKILL); | 260 | pagefault_out_of_memory(); |
| 251 | goto no_context; | 261 | return; |
| 252 | 262 | ||
| 253 | do_sigbus: | 263 | do_sigbus: |
| 254 | up_read(&mm->mmap_sem); | 264 | up_read(&mm->mmap_sem); |
| @@ -334,8 +344,11 @@ int | |||
| 334 | find_fixup_code(struct pt_regs *regs) | 344 | find_fixup_code(struct pt_regs *regs) |
| 335 | { | 345 | { |
| 336 | const struct exception_table_entry *fixup; | 346 | const struct exception_table_entry *fixup; |
| 347 | /* in case of delay slot fault (v32) */ | ||
| 348 | unsigned long ip = (instruction_pointer(regs) & ~0x1); | ||
| 337 | 349 | ||
| 338 | if ((fixup = search_exception_tables(instruction_pointer(regs))) != 0) { | 350 | fixup = search_exception_tables(ip); |
| 351 | if (fixup != 0) { | ||
| 339 | /* Adjust the instruction pointer in the stackframe. */ | 352 | /* Adjust the instruction pointer in the stackframe. */ |
| 340 | instruction_pointer(regs) = fixup->fixup; | 353 | instruction_pointer(regs) = fixup->fixup; |
| 341 | arch_fixup(regs); | 354 | arch_fixup(regs); |
