Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
060c83fa
Commit
060c83fa
authored
Sep 27, 2013
by
Linus Walleij
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'ixp4-cleanup' into devel
parents
44d94e8d
098e30f6
Changes
9
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
160 additions
and
117 deletions
+160
-117
arch/arm/mach-ixp4xx/common.c
arch/arm/mach-ixp4xx/common.c
+38
-11
arch/arm/mach-ixp4xx/dsmg600-setup.c
arch/arm/mach-ixp4xx/dsmg600-setup.c
+38
-27
arch/arm/mach-ixp4xx/include/mach/platform.h
arch/arm/mach-ixp4xx/include/mach/platform.h
+0
-39
arch/arm/mach-ixp4xx/ixdp425-setup.c
arch/arm/mach-ixp4xx/ixdp425-setup.c
+5
-3
arch/arm/mach-ixp4xx/nas100d-setup.c
arch/arm/mach-ixp4xx/nas100d-setup.c
+30
-19
arch/arm/mach-ixp4xx/nslu2-setup.c
arch/arm/mach-ixp4xx/nslu2-setup.c
+12
-5
drivers/input/misc/ixp4xx-beeper.c
drivers/input/misc/ixp4xx-beeper.c
+16
-9
drivers/ptp/ptp_ixp46x.c
drivers/ptp/ptp_ixp46x.c
+8
-1
drivers/staging/media/lirc/lirc_serial.c
drivers/staging/media/lirc/lirc_serial.c
+13
-3
No files found.
arch/arm/mach-ixp4xx/common.c
View file @
060c83fa
...
...
@@ -81,6 +81,44 @@ void __init ixp4xx_map_io(void)
iotable_init
(
ixp4xx_io_desc
,
ARRAY_SIZE
(
ixp4xx_io_desc
));
}
/*
* GPIO-functions
*/
/*
* The following converted to the real HW bits the gpio_line_config
*/
/* GPIO pin types */
#define IXP4XX_GPIO_OUT 0x1
#define IXP4XX_GPIO_IN 0x2
/* GPIO signal types */
#define IXP4XX_GPIO_LOW 0
#define IXP4XX_GPIO_HIGH 1
/* GPIO Clocks */
#define IXP4XX_GPIO_CLK_0 14
#define IXP4XX_GPIO_CLK_1 15
static
void
gpio_line_config
(
u8
line
,
u32
direction
)
{
if
(
direction
==
IXP4XX_GPIO_IN
)
*
IXP4XX_GPIO_GPOER
|=
(
1
<<
line
);
else
*
IXP4XX_GPIO_GPOER
&=
~
(
1
<<
line
);
}
static
void
gpio_line_get
(
u8
line
,
int
*
value
)
{
*
value
=
(
*
IXP4XX_GPIO_GPINR
>>
line
)
&
0x1
;
}
static
void
gpio_line_set
(
u8
line
,
int
value
)
{
if
(
value
==
IXP4XX_GPIO_HIGH
)
*
IXP4XX_GPIO_GPOUTR
|=
(
1
<<
line
);
else
if
(
value
==
IXP4XX_GPIO_LOW
)
*
IXP4XX_GPIO_GPOUTR
&=
~
(
1
<<
line
);
}
/*************************************************************************
* IXP4xx chipset IRQ handling
...
...
@@ -117,17 +155,6 @@ static int ixp4xx_gpio_to_irq(struct gpio_chip *chip, unsigned gpio)
return
-
EINVAL
;
}
int
irq_to_gpio
(
unsigned
int
irq
)
{
int
gpio
=
(
irq
<
32
)
?
irq2gpio
[
irq
]
:
-
EINVAL
;
if
(
gpio
==
-
1
)
return
-
EINVAL
;
return
gpio
;
}
EXPORT_SYMBOL
(
irq_to_gpio
);
static
int
ixp4xx_set_irq_type
(
struct
irq_data
*
d
,
unsigned
int
type
)
{
int
line
=
irq2gpio
[
d
->
irq
];
...
...
arch/arm/mach-ixp4xx/dsmg600-setup.c
View file @
060c83fa
...
...
@@ -26,6 +26,7 @@
#include <linux/reboot.h>
#include <linux/i2c.h>
#include <linux/i2c-gpio.h>
#include <linux/gpio.h>
#include <mach/hardware.h>
...
...
@@ -161,11 +162,8 @@ static struct platform_device *dsmg600_devices[] __initdata = {
static
void
dsmg600_power_off
(
void
)
{
/* enable the pwr cntl gpio */
gpio_line_config
(
DSMG600_PO_GPIO
,
IXP4XX_GPIO_OUT
);
/* poweroff */
gpio_line_set
(
DSMG600_PO_GPIO
,
IXP4XX_GPIO_HIGH
);
/* enable the pwr cntl and drive it high */
gpio_direction_output
(
DSMG600_PO_GPIO
,
1
);
}
/* This is used to make sure the power-button pusher is serious. The button
...
...
@@ -202,7 +200,7 @@ static void dsmg600_power_handler(unsigned long data)
ctrl_alt_del
();
/* Change the state of the power LED to "blink" */
gpio_
line_set
(
DSMG600_LED_PWR_GPIO
,
IXP4XX_GPIO_LOW
);
gpio_
set_value
(
DSMG600_LED_PWR_GPIO
,
0
);
}
else
{
power_button_countdown
=
PBUTTON_HOLDDOWN_COUNT
;
}
...
...
@@ -228,6 +226,40 @@ static void __init dsmg600_timer_init(void)
ixp4xx_timer_init
();
}
static
int
__init
dsmg600_gpio_init
(
void
)
{
if
(
!
machine_is_dsmg600
())
return
0
;
gpio_request
(
DSMG600_RB_GPIO
,
"reset button"
);
if
(
request_irq
(
gpio_to_irq
(
DSMG600_RB_GPIO
),
&
dsmg600_reset_handler
,
IRQF_DISABLED
|
IRQF_TRIGGER_LOW
,
"DSM-G600 reset button"
,
NULL
)
<
0
)
{
printk
(
KERN_DEBUG
"Reset Button IRQ %d not available
\n
"
,
gpio_to_irq
(
DSMG600_RB_GPIO
));
}
/*
* The power button on the D-Link DSM-G600 is on GPIO 15, but
* it cannot handle interrupts on that GPIO line. So we'll
* have to poll it with a kernel timer.
*/
/* Make sure that the power button GPIO is set up as an input */
gpio_request
(
DSMG600_PB_GPIO
,
"power button"
);
gpio_direction_input
(
DSMG600_PB_GPIO
);
/* Request poweroff GPIO line */
gpio_request
(
DSMG600_PO_GPIO
,
"power off button"
);
/* Set the initial value for the power button IRQ handler */
power_button_countdown
=
PBUTTON_HOLDDOWN_COUNT
;
mod_timer
(
&
dsmg600_power_timer
,
jiffies
+
msecs_to_jiffies
(
500
));
return
0
;
}
device_initcall
(
dsmg600_gpio_init
);
static
void
__init
dsmg600_init
(
void
)
{
ixp4xx_sys_init
();
...
...
@@ -251,27 +283,6 @@ static void __init dsmg600_init(void)
platform_add_devices
(
dsmg600_devices
,
ARRAY_SIZE
(
dsmg600_devices
));
pm_power_off
=
dsmg600_power_off
;
if
(
request_irq
(
gpio_to_irq
(
DSMG600_RB_GPIO
),
&
dsmg600_reset_handler
,
IRQF_DISABLED
|
IRQF_TRIGGER_LOW
,
"DSM-G600 reset button"
,
NULL
)
<
0
)
{
printk
(
KERN_DEBUG
"Reset Button IRQ %d not available
\n
"
,
gpio_to_irq
(
DSMG600_RB_GPIO
));
}
/* The power button on the D-Link DSM-G600 is on GPIO 15, but
* it cannot handle interrupts on that GPIO line. So we'll
* have to poll it with a kernel timer.
*/
/* Make sure that the power button GPIO is set up as an input */
gpio_line_config
(
DSMG600_PB_GPIO
,
IXP4XX_GPIO_IN
);
/* Set the initial value for the power button IRQ handler */
power_button_countdown
=
PBUTTON_HOLDDOWN_COUNT
;
mod_timer
(
&
dsmg600_power_timer
,
jiffies
+
msecs_to_jiffies
(
500
));
}
MACHINE_START
(
DSMG600
,
"D-Link DSM-G600 RevA"
)
...
...
arch/arm/mach-ixp4xx/include/mach/platform.h
View file @
060c83fa
...
...
@@ -131,44 +131,5 @@ struct pci_sys_data;
extern
int
ixp4xx_setup
(
int
nr
,
struct
pci_sys_data
*
sys
);
extern
struct
pci_ops
ixp4xx_ops
;
/*
* GPIO-functions
*/
/*
* The following converted to the real HW bits the gpio_line_config
*/
/* GPIO pin types */
#define IXP4XX_GPIO_OUT 0x1
#define IXP4XX_GPIO_IN 0x2
/* GPIO signal types */
#define IXP4XX_GPIO_LOW 0
#define IXP4XX_GPIO_HIGH 1
/* GPIO Clocks */
#define IXP4XX_GPIO_CLK_0 14
#define IXP4XX_GPIO_CLK_1 15
static
inline
void
gpio_line_config
(
u8
line
,
u32
direction
)
{
if
(
direction
==
IXP4XX_GPIO_IN
)
*
IXP4XX_GPIO_GPOER
|=
(
1
<<
line
);
else
*
IXP4XX_GPIO_GPOER
&=
~
(
1
<<
line
);
}
static
inline
void
gpio_line_get
(
u8
line
,
int
*
value
)
{
*
value
=
(
*
IXP4XX_GPIO_GPINR
>>
line
)
&
0x1
;
}
static
inline
void
gpio_line_set
(
u8
line
,
int
value
)
{
if
(
value
==
IXP4XX_GPIO_HIGH
)
*
IXP4XX_GPIO_GPOUTR
|=
(
1
<<
line
);
else
if
(
value
==
IXP4XX_GPIO_LOW
)
*
IXP4XX_GPIO_GPOUTR
&=
~
(
1
<<
line
);
}
#endif // __ASSEMBLY__
arch/arm/mach-ixp4xx/ixdp425-setup.c
View file @
060c83fa
...
...
@@ -20,6 +20,7 @@
#include <linux/mtd/nand.h>
#include <linux/mtd/partitions.h>
#include <linux/delay.h>
#include <linux/gpio.h>
#include <asm/types.h>
#include <asm/setup.h>
#include <asm/memory.h>
...
...
@@ -80,10 +81,10 @@ ixdp425_flash_nand_cmd_ctrl(struct mtd_info *mtd, int cmd, unsigned int ctrl)
if
(
ctrl
&
NAND_CTRL_CHANGE
)
{
if
(
ctrl
&
NAND_NCE
)
{
gpio_
line_set
(
IXDP425_NAND_NCE_PIN
,
IXP4XX_GPIO_LOW
);
gpio_
set_value
(
IXDP425_NAND_NCE_PIN
,
0
);
udelay
(
5
);
}
else
gpio_
line_set
(
IXDP425_NAND_NCE_PIN
,
IXP4XX_GPIO_HIGH
);
gpio_
set_value
(
IXDP425_NAND_NCE_PIN
,
1
);
offset
=
(
ctrl
&
NAND_CLE
)
?
IXDP425_NAND_CMD_BYTE
:
0
;
offset
|=
(
ctrl
&
NAND_ALE
)
?
IXDP425_NAND_ADDR_BYTE
:
0
;
...
...
@@ -227,7 +228,8 @@ static void __init ixdp425_init(void)
ixdp425_flash_nand_resource
.
start
=
IXP4XX_EXP_BUS_BASE
(
3
),
ixdp425_flash_nand_resource
.
end
=
IXP4XX_EXP_BUS_BASE
(
3
)
+
0x10
-
1
;
gpio_line_config
(
IXDP425_NAND_NCE_PIN
,
IXP4XX_GPIO_OUT
);
gpio_request
(
IXDP425_NAND_NCE_PIN
,
"NAND NCE pin"
);
gpio_direction_output
(
IXDP425_NAND_NCE_PIN
,
0
);
/* Configure expansion bus for NAND Flash */
*
IXP4XX_EXP_CS3
=
IXP4XX_EXP_BUS_CS_EN
|
...
...
arch/arm/mach-ixp4xx/nas100d-setup.c
View file @
060c83fa
...
...
@@ -184,11 +184,8 @@ static void nas100d_power_off(void)
{
/* This causes the box to drop the power and go dead. */
/* enable the pwr cntl gpio */
gpio_line_config
(
NAS100D_PO_GPIO
,
IXP4XX_GPIO_OUT
);
/* do the deed */
gpio_line_set
(
NAS100D_PO_GPIO
,
IXP4XX_GPIO_HIGH
);
/* enable the pwr cntl gpio and assert power off */
gpio_direction_output
(
NAS100D_PO_GPIO
,
1
);
}
/* This is used to make sure the power-button pusher is serious. The button
...
...
@@ -225,7 +222,7 @@ static void nas100d_power_handler(unsigned long data)
ctrl_alt_del
();
/* Change the state of the power LED to "blink" */
gpio_
line_set
(
NAS100D_LED_PWR_GPIO
,
IXP4XX_GPIO_LOW
);
gpio_
set_value
(
NAS100D_LED_PWR_GPIO
,
0
);
}
else
{
power_button_countdown
=
PBUTTON_HOLDDOWN_COUNT
;
}
...
...
@@ -242,6 +239,33 @@ static irqreturn_t nas100d_reset_handler(int irq, void *dev_id)
return
IRQ_HANDLED
;
}
static
int
__init
nas100d_gpio_init
(
void
)
{
if
(
!
machine_is_nas100d
())
return
0
;
/*
* The power button on the Iomega NAS100d is on GPIO 14, but
* it cannot handle interrupts on that GPIO line. So we'll
* have to poll it with a kernel timer.
*/
/* Request the power off GPIO */
gpio_request
(
NAS100D_PO_GPIO
,
"power off"
);
/* Make sure that the power button GPIO is set up as an input */
gpio_request
(
NAS100D_PB_GPIO
,
"power button"
);
gpio_direction_input
(
NAS100D_PB_GPIO
);
/* Set the initial value for the power button IRQ handler */
power_button_countdown
=
PBUTTON_HOLDDOWN_COUNT
;
mod_timer
(
&
nas100d_power_timer
,
jiffies
+
msecs_to_jiffies
(
500
));
return
0
;
}
device_initcall
(
nas100d_gpio_init
);
static
void
__init
nas100d_init
(
void
)
{
uint8_t
__iomem
*
f
;
...
...
@@ -278,19 +302,6 @@ static void __init nas100d_init(void)
gpio_to_irq
(
NAS100D_RB_GPIO
));
}
/* The power button on the Iomega NAS100d is on GPIO 14, but
* it cannot handle interrupts on that GPIO line. So we'll
* have to poll it with a kernel timer.
*/
/* Make sure that the power button GPIO is set up as an input */
gpio_line_config
(
NAS100D_PB_GPIO
,
IXP4XX_GPIO_IN
);
/* Set the initial value for the power button IRQ handler */
power_button_countdown
=
PBUTTON_HOLDDOWN_COUNT
;
mod_timer
(
&
nas100d_power_timer
,
jiffies
+
msecs_to_jiffies
(
500
));
/*
* Map in a portion of the flash and read the MAC address.
* Since it is stored in BE in the flash itself, we need to
...
...
arch/arm/mach-ixp4xx/nslu2-setup.c
View file @
060c83fa
...
...
@@ -197,11 +197,8 @@ static void nslu2_power_off(void)
{
/* This causes the box to drop the power and go dead. */
/* enable the pwr cntl gpio */
gpio_line_config
(
NSLU2_PO_GPIO
,
IXP4XX_GPIO_OUT
);
/* do the deed */
gpio_line_set
(
NSLU2_PO_GPIO
,
IXP4XX_GPIO_HIGH
);
/* enable the pwr cntl gpio and assert power off */
gpio_direction_output
(
NSLU2_PO_GPIO
,
1
);
}
static
irqreturn_t
nslu2_power_handler
(
int
irq
,
void
*
dev_id
)
...
...
@@ -223,6 +220,16 @@ static irqreturn_t nslu2_reset_handler(int irq, void *dev_id)
return
IRQ_HANDLED
;
}
static
int
__init
nslu2_gpio_init
(
void
)
{
if
(
!
machine_is_nslu2
())
return
0
;
/* Request the power off GPIO */
return
gpio_request
(
NSLU2_PO_GPIO
,
"power off"
);
}
device_initcall
(
nslu2_gpio_init
);
static
void
__init
nslu2_timer_init
(
void
)
{
/* The xtal on this machine is non-standard. */
...
...
drivers/input/misc/ixp4xx-beeper.c
View file @
060c83fa
...
...
@@ -20,6 +20,7 @@
#include <linux/delay.h>
#include <linux/platform_device.h>
#include <linux/interrupt.h>
#include <linux/gpio.h>
#include <mach/hardware.h>
MODULE_AUTHOR
(
"Alessandro Zummo <a.zummo@towertech.it>"
);
...
...
@@ -35,15 +36,12 @@ static void ixp4xx_spkr_control(unsigned int pin, unsigned int count)
spin_lock_irqsave
(
&
beep_lock
,
flags
);
if
(
count
)
{
gpio_line_config
(
pin
,
IXP4XX_GPIO_OUT
);
gpio_line_set
(
pin
,
IXP4XX_GPIO_LOW
);
if
(
count
)
{
gpio_direction_output
(
pin
,
0
);
*
IXP4XX_OSRT2
=
(
count
&
~
IXP4XX_OST_RELOAD_MASK
)
|
IXP4XX_OST_ENABLE
;
}
else
{
gpio_line_config
(
pin
,
IXP4XX_GPIO_IN
);
gpio_line_set
(
pin
,
IXP4XX_GPIO_HIGH
);
gpio_direction_output
(
pin
,
1
);
gpio_direction_input
(
pin
);
*
IXP4XX_OSRT2
=
0
;
}
...
...
@@ -78,11 +76,13 @@ static int ixp4xx_spkr_event(struct input_dev *dev, unsigned int type, unsigned
static
irqreturn_t
ixp4xx_spkr_interrupt
(
int
irq
,
void
*
dev_id
)
{
unsigned
int
pin
=
(
unsigned
int
)
dev_id
;
/* clear interrupt */
*
IXP4XX_OSST
=
IXP4XX_OSST_TIMER_2_PEND
;
/* flip the beeper output */
*
IXP4XX_GPIO_GPOUTR
^=
(
1
<<
(
unsigned
int
)
dev_id
);
gpio_set_value
(
pin
,
!
gpio_get_value
(
pin
)
);
return
IRQ_HANDLED
;
}
...
...
@@ -110,11 +110,15 @@ static int ixp4xx_spkr_probe(struct platform_device *dev)
input_dev
->
sndbit
[
0
]
=
BIT_MASK
(
SND_BELL
)
|
BIT_MASK
(
SND_TONE
);
input_dev
->
event
=
ixp4xx_spkr_event
;
err
=
gpio_request
(
dev
->
id
,
"ixp4-beeper"
);
if
(
err
)
goto
err_free_device
;
err
=
request_irq
(
IRQ_IXP4XX_TIMER2
,
&
ixp4xx_spkr_interrupt
,
IRQF_NO_SUSPEND
,
"ixp4xx-beeper"
,
(
void
*
)
dev
->
id
);
if
(
err
)
goto
err_free_
device
;
goto
err_free_
gpio
;
err
=
input_register_device
(
input_dev
);
if
(
err
)
...
...
@@ -126,6 +130,8 @@ static int ixp4xx_spkr_probe(struct platform_device *dev)
err_free_irq:
free_irq
(
IRQ_IXP4XX_TIMER2
,
(
void
*
)
dev
->
id
);
err_free_gpio:
gpio_free
(
dev
->
id
);
err_free_device:
input_free_device
(
input_dev
);
...
...
@@ -144,6 +150,7 @@ static int ixp4xx_spkr_remove(struct platform_device *dev)
ixp4xx_spkr_control
(
pin
,
0
);
free_irq
(
IRQ_IXP4XX_TIMER2
,
(
void
*
)
dev
->
id
);
gpio_free
(
dev
->
id
);
return
0
;
}
...
...
drivers/ptp/ptp_ixp46x.c
View file @
060c83fa
...
...
@@ -259,8 +259,15 @@ static struct ixp_clock ixp_clock;
static
int
setup_interrupt
(
int
gpio
)
{
int
irq
;
int
err
;
gpio_line_config
(
gpio
,
IXP4XX_GPIO_IN
);
err
=
gpio_request
(
gpio
,
"ixp4-ptp"
);
if
(
err
)
return
err
;
err
=
gpio_direction_input
(
gpio
);
if
(
err
)
return
err
;
irq
=
gpio_to_irq
(
gpio
);
...
...
drivers/staging/media/lirc/lirc_serial.c
View file @
060c83fa
...
...
@@ -67,7 +67,7 @@
#include <linux/delay.h>
#include <linux/poll.h>
#include <linux/platform_device.h>
#include <linux/gpio.h>
#include <linux/io.h>
#include <linux/irq.h>
#include <linux/fcntl.h>
...
...
@@ -321,7 +321,7 @@ static void on(void)
* status LED and ground
*/
if
(
type
==
LIRC_NSLU2
)
{
gpio_
line_set
(
NSLU2_LED_GRN
,
IXP4XX_GPIO_LOW
);
gpio_
set_value
(
NSLU2_LED_GRN
,
0
);
return
;
}
#endif
...
...
@@ -335,7 +335,7 @@ static void off(void)
{
#ifdef CONFIG_LIRC_SERIAL_NSLU2
if
(
type
==
LIRC_NSLU2
)
{
gpio_
line_set
(
NSLU2_LED_GRN
,
IXP4XX_GPIO_HIGH
);
gpio_
set_value
(
NSLU2_LED_GRN
,
1
);
return
;
}
#endif
...
...
@@ -839,6 +839,16 @@ static int lirc_serial_probe(struct platform_device *dev)
{
int
i
,
nlow
,
nhigh
,
result
;
#ifdef CONFIG_LIRC_SERIAL_NSLU2
/* This GPIO is used for a LED on the NSLU2 */
result
=
devm_gpio_request
(
dev
,
NSLU2_LED_GRN
,
"lirc-serial"
);
if
(
result
)
return
result
;
result
=
gpio_direction_output
(
NSLU2_LED_GRN
,
0
);
if
(
result
)
return
result
;
#endif
result
=
request_irq
(
irq
,
irq_handler
,
(
share_irq
?
IRQF_SHARED
:
0
),
LIRC_DRIVER_NAME
,
(
void
*
)
&
hardware
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment