Skip to content
/ linux Public
forked from torvalds/linux

Commit

Permalink
ARM: 8836/1: drivers: amba: Update component matching to use the Core…
Browse files Browse the repository at this point in the history
…Sight UCI values.

The patches provide an update of amba_device and matching code to handle
the additional registers required for the Class 0x9 (CoreSight) UCI.

The *data pointer in the amba_id is used by the driver to provide extended
ID register values for matching.

CoreSight components where PID/CID pair is currently sufficient for
unique identification need not provide this additional information.

Signed-off-by: Mike Leach <[email protected]>
Reviewed-by: Mathieu Poirier <[email protected]>
Reviewed-by: Suzuki K Poulose <[email protected]>
Tested-by: Sai Prakash Ranjan <[email protected]>
Signed-off-by: Russell King <[email protected]>
  • Loading branch information
mikel-armbb authored and Russell King committed Feb 26, 2019
1 parent e85fa28 commit 4a2910f
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 8 deletions.
45 changes: 37 additions & 8 deletions drivers/amba/bus.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,19 +26,36 @@

#define to_amba_driver(d) container_of(d, struct amba_driver, drv)

static const struct amba_id *
amba_lookup(const struct amba_id *table, struct amba_device *dev)
/* called on periphid match and class 0x9 coresight device. */
static int
amba_cs_uci_id_match(const struct amba_id *table, struct amba_device *dev)
{
int ret = 0;
struct amba_cs_uci_id *uci;

uci = table->data;

/* no table data or zero mask - return match on periphid */
if (!uci || (uci->devarch_mask == 0))
return 1;

/* test against read devtype and masked devarch value */
ret = (dev->uci.devtype == uci->devtype) &&
((dev->uci.devarch & uci->devarch_mask) == uci->devarch);
return ret;
}

static const struct amba_id *
amba_lookup(const struct amba_id *table, struct amba_device *dev)
{
while (table->mask) {
ret = (dev->periphid & table->mask) == table->id;
if (ret)
break;
if (((dev->periphid & table->mask) == table->id) &&
((dev->cid != CORESIGHT_CID) ||
(amba_cs_uci_id_match(table, dev))))
return table;
table++;
}

return ret ? table : NULL;
return NULL;
}

static int amba_match(struct device *dev, struct device_driver *drv)
Expand Down Expand Up @@ -399,10 +416,22 @@ static int amba_device_try_add(struct amba_device *dev, struct resource *parent)
cid |= (readl(tmp + size - 0x10 + 4 * i) & 255) <<
(i * 8);

if (cid == CORESIGHT_CID) {
/* set the base to the start of the last 4k block */
void __iomem *csbase = tmp + size - 4096;

dev->uci.devarch =
readl(csbase + UCI_REG_DEVARCH_OFFSET);
dev->uci.devtype =
readl(csbase + UCI_REG_DEVTYPE_OFFSET) & 0xff;
}

amba_put_disable_pclk(dev);

if (cid == AMBA_CID || cid == CORESIGHT_CID)
if (cid == AMBA_CID || cid == CORESIGHT_CID) {
dev->periphid = pid;
dev->cid = cid;
}

if (!dev->periphid)
ret = -ENODEV;
Expand Down
6 changes: 6 additions & 0 deletions include/linux/amba/bus.h
Original file line number Diff line number Diff line change
Expand Up @@ -58,13 +58,19 @@ struct amba_cs_uci_id {
void *data;
};

/* define offsets for registers used by UCI */
#define UCI_REG_DEVTYPE_OFFSET 0xFCC
#define UCI_REG_DEVARCH_OFFSET 0xFBC

struct clk;

struct amba_device {
struct device dev;
struct resource res;
struct clk *pclk;
unsigned int periphid;
unsigned int cid;
struct amba_cs_uci_id uci;
unsigned int irq[AMBA_NR_IRQS];
char *driver_override;
};
Expand Down

0 comments on commit 4a2910f

Please sign in to comment.