Skip to content

Commit

Permalink
[POWERPC] of_serial: add port type checking
Browse files Browse the repository at this point in the history
Currently, of_serial driver supports only 8250 compatible ports, but
prepares that others can easily be added.  Yet unregister routine
assumes port is 8250.  This corrects unregister routine to check
port type.

Signed-off-by: Kou Ishizaki <[email protected]>
Acked-by: Arnd Bergmann <[email protected]>
Signed-off-by: Paul Mackerras <[email protected]>
  • Loading branch information
kouishizaki authored and paulusmack committed Jul 10, 2007
1 parent 1558f9b commit e34b9c9
Showing 1 changed file with 24 additions and 3 deletions.
27 changes: 24 additions & 3 deletions drivers/serial/of_serial.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,11 @@
#include <asm/of_platform.h>
#include <asm/prom.h>

struct of_serial_info {
int type;
int line;
};

/*
* Fill a struct uart_port for a given device node
*/
Expand Down Expand Up @@ -62,13 +67,18 @@ static int __devinit of_platform_serial_setup(struct of_device *ofdev,
static int __devinit of_platform_serial_probe(struct of_device *ofdev,
const struct of_device_id *id)
{
struct of_serial_info *info;
struct uart_port port;
int port_type;
int ret;

if (of_find_property(ofdev->node, "used-by-rtas", NULL))
return -EBUSY;

info = kmalloc(sizeof(*info), GFP_KERNEL);
if (info == NULL)
return -ENOMEM;

port_type = (unsigned long)id->data;
ret = of_platform_serial_setup(ofdev, port_type, &port);
if (ret)
Expand All @@ -88,9 +98,12 @@ static int __devinit of_platform_serial_probe(struct of_device *ofdev,
if (ret < 0)
goto out;

ofdev->dev.driver_data = (void *)(unsigned long)ret;
info->type = port_type;
info->line = ret;
ofdev->dev.driver_data = info;
return 0;
out:
kfree(info);
irq_dispose_mapping(port.irq);
return ret;
}
Expand All @@ -100,8 +113,16 @@ static int __devinit of_platform_serial_probe(struct of_device *ofdev,
*/
static int of_platform_serial_remove(struct of_device *ofdev)
{
int line = (unsigned long)ofdev->dev.driver_data;
serial8250_unregister_port(line);
struct of_serial_info *info = ofdev->dev.driver_data;
switch (info->type) {
case PORT_8250 ... PORT_MAX_8250:
serial8250_unregister_port(info->line);
break;
default:
/* need to add code for these */
break;
}
kfree(info);
return 0;
}

Expand Down

0 comments on commit e34b9c9

Please sign in to comment.