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:
Shubhrajyoti Datta 2018-07-21 17:19:04 +05:30 committed by Greg Kroah-Hartman
parent 628c534ae7
commit da7bf20e77

View file

@ -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)