mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-04 08:08:54 +00:00
tty: serial: uartlite: Add structure for private data
Add struct uartlite_data, to store the private data of the Uartlite driver. Signed-off-by: Tanvi Desai <tanvi.desai@xilinx.com> Signed-off-by: Shubhrajyoti Datta <shubhrajyoti.datta@xilinx.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
628c534ae7
commit
da7bf20e77
1 changed files with 21 additions and 8 deletions
|
@ -54,6 +54,10 @@
|
||||||
#define ULITE_CONTROL_RST_RX 0x02
|
#define ULITE_CONTROL_RST_RX 0x02
|
||||||
#define ULITE_CONTROL_IE 0x10
|
#define ULITE_CONTROL_IE 0x10
|
||||||
|
|
||||||
|
struct uartlite_data {
|
||||||
|
const struct uartlite_reg_ops *reg_ops;
|
||||||
|
};
|
||||||
|
|
||||||
struct uartlite_reg_ops {
|
struct uartlite_reg_ops {
|
||||||
u32 (*in)(void __iomem *addr);
|
u32 (*in)(void __iomem *addr);
|
||||||
void (*out)(u32 val, void __iomem *addr);
|
void (*out)(u32 val, void __iomem *addr);
|
||||||
|
@ -91,16 +95,16 @@ static const struct uartlite_reg_ops uartlite_le = {
|
||||||
|
|
||||||
static inline u32 uart_in32(u32 offset, struct uart_port *port)
|
static inline u32 uart_in32(u32 offset, struct uart_port *port)
|
||||||
{
|
{
|
||||||
const struct uartlite_reg_ops *reg_ops = port->private_data;
|
struct uartlite_data *pdata = port->private_data;
|
||||||
|
|
||||||
return reg_ops->in(port->membase + offset);
|
return pdata->reg_ops->in(port->membase + offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void uart_out32(u32 val, u32 offset, struct uart_port *port)
|
static inline void uart_out32(u32 val, u32 offset, struct uart_port *port)
|
||||||
{
|
{
|
||||||
const struct uartlite_reg_ops *reg_ops = port->private_data;
|
struct uartlite_data *pdata = port->private_data;
|
||||||
|
|
||||||
reg_ops->out(val, port->membase + offset);
|
pdata->reg_ops->out(val, port->membase + offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct uart_port ulite_ports[ULITE_NR_UARTS];
|
static struct uart_port ulite_ports[ULITE_NR_UARTS];
|
||||||
|
@ -325,6 +329,7 @@ static void ulite_release_port(struct uart_port *port)
|
||||||
|
|
||||||
static int ulite_request_port(struct uart_port *port)
|
static int ulite_request_port(struct uart_port *port)
|
||||||
{
|
{
|
||||||
|
struct uartlite_data *pdata = port->private_data;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
pr_debug("ulite console: port=%p; port->mapbase=%llx\n",
|
pr_debug("ulite console: port=%p; port->mapbase=%llx\n",
|
||||||
|
@ -342,13 +347,13 @@ static int ulite_request_port(struct uart_port *port)
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
}
|
}
|
||||||
|
|
||||||
port->private_data = (void *)&uartlite_be;
|
pdata->reg_ops = &uartlite_be;
|
||||||
ret = uart_in32(ULITE_CONTROL, port);
|
ret = uart_in32(ULITE_CONTROL, port);
|
||||||
uart_out32(ULITE_CONTROL_RST_TX, ULITE_CONTROL, port);
|
uart_out32(ULITE_CONTROL_RST_TX, ULITE_CONTROL, port);
|
||||||
ret = uart_in32(ULITE_STATUS, port);
|
ret = uart_in32(ULITE_STATUS, port);
|
||||||
/* Endianess detection */
|
/* Endianess detection */
|
||||||
if ((ret & ULITE_STATUS_TXEMPTY) != ULITE_STATUS_TXEMPTY)
|
if ((ret & ULITE_STATUS_TXEMPTY) != ULITE_STATUS_TXEMPTY)
|
||||||
port->private_data = (void *)&uartlite_le;
|
pdata->reg_ops = &uartlite_le;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -585,10 +590,12 @@ static struct uart_driver ulite_uart_driver = {
|
||||||
* @id: requested id number. Pass -1 for automatic port assignment
|
* @id: requested id number. Pass -1 for automatic port assignment
|
||||||
* @base: base address of uartlite registers
|
* @base: base address of uartlite registers
|
||||||
* @irq: irq number for uartlite
|
* @irq: irq number for uartlite
|
||||||
|
* @pdata: private data for uartlite
|
||||||
*
|
*
|
||||||
* Returns: 0 on success, <0 otherwise
|
* Returns: 0 on success, <0 otherwise
|
||||||
*/
|
*/
|
||||||
static int ulite_assign(struct device *dev, int id, u32 base, int irq)
|
static int ulite_assign(struct device *dev, int id, u32 base, int irq,
|
||||||
|
struct uartlite_data *pdata)
|
||||||
{
|
{
|
||||||
struct uart_port *port;
|
struct uart_port *port;
|
||||||
int rc;
|
int rc;
|
||||||
|
@ -625,6 +632,7 @@ static int ulite_assign(struct device *dev, int id, u32 base, int irq)
|
||||||
port->dev = dev;
|
port->dev = dev;
|
||||||
port->type = PORT_UNKNOWN;
|
port->type = PORT_UNKNOWN;
|
||||||
port->line = id;
|
port->line = id;
|
||||||
|
port->private_data = pdata;
|
||||||
|
|
||||||
dev_set_drvdata(dev, port);
|
dev_set_drvdata(dev, port);
|
||||||
|
|
||||||
|
@ -675,6 +683,7 @@ MODULE_DEVICE_TABLE(of, ulite_of_match);
|
||||||
static int ulite_probe(struct platform_device *pdev)
|
static int ulite_probe(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
struct resource *res;
|
struct resource *res;
|
||||||
|
struct uartlite_data *pdata;
|
||||||
int irq;
|
int irq;
|
||||||
int id = pdev->id;
|
int id = pdev->id;
|
||||||
#ifdef CONFIG_OF
|
#ifdef CONFIG_OF
|
||||||
|
@ -684,6 +693,10 @@ static int ulite_probe(struct platform_device *pdev)
|
||||||
if (prop)
|
if (prop)
|
||||||
id = be32_to_cpup(prop);
|
id = be32_to_cpup(prop);
|
||||||
#endif
|
#endif
|
||||||
|
pdata = devm_kzalloc(&pdev->dev, sizeof(struct uartlite_data),
|
||||||
|
GFP_KERNEL);
|
||||||
|
if (!pdata)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||||
if (!res)
|
if (!res)
|
||||||
|
@ -693,7 +706,7 @@ static int ulite_probe(struct platform_device *pdev)
|
||||||
if (irq <= 0)
|
if (irq <= 0)
|
||||||
return -ENXIO;
|
return -ENXIO;
|
||||||
|
|
||||||
return ulite_assign(&pdev->dev, id, res->start, irq);
|
return ulite_assign(&pdev->dev, id, res->start, irq, pdata);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ulite_remove(struct platform_device *pdev)
|
static int ulite_remove(struct platform_device *pdev)
|
||||||
|
|
Loading…
Reference in a new issue