amba: consolidate PrimeCell magic
Subsystems (6)
PATCH v4 1/1 amba: consolidate PrimeCell magic
From: Linus Walleij <[email protected]>
Since two drivers use the PrimeCell scheme without using the amba_bus driver logic, let's break the magic lookups out as static inlines in the <linux/amba/bus.h> header so we get some consolidation anyway. Delete the primecell ID check in common/pl330.c since it is only used from the amba_bus driver in drivers/dma, which is already doing the same check when probing in drivers/amba/bus.c.
---
Changes V3->v4:
- Fix up sparse warning due to inelegant cast to (u32) in vic.c, we cast to (unsigned long) and sparse is happy.
--- arch/arm/common/pl330.c | 40 +++------------------------------------- arch/arm/common/vic.c | 15 ++++++++------- drivers/amba/bus.c | 19 +++---------------- drivers/dma/ste_dma40.c | 14 ++++---------- drivers/mtd/nand/fsmc_nand.c | 10 +++------- include/linux/amba/bus.h | 26 ++++++++++++++++++++++++++ 6 files changed, 47 insertions(+), 77 deletions(-)
arch/arm/common/pl330.c +3 -37
@@ -27,6 +27,7 @@#include <linux/delay.h> #include <linux/interrupt.h> #include <linux/dma-mapping.h> +#include <linux/amba/bus.h> #include <asm/hardware/pl330.h>
@@ -111,9 +112,6 @@#define CR4 0xe10#define CRD 0xe14 -#define PERIPH_ID 0xfe0 -#define PCELL_ID 0xff0 -#define CR0_PERIPH_REQ_SET (1 << 0)#define CR0_BOOT_EN_SET (1 << 1)#define CR0_BOOT_MAN_NS (1 << 2)
@@ -142,14 +140,6 @@#define CRD_DATA_BUFF_SHIFT 20#define CRD_DATA_BUFF_MASK 0x3ff -#define PART 0x330 -#define DESIGNER 0x41 -#define REVISION 0x0 -#define INTEG_CFG 0x0 -#define PERIPH_ID_VAL ((PART << 0) | (DESIGNER << 12)) - -#define PCELL_ID_VAL 0xb105f00d -#define PL330_STATE_STOPPED (1 << 0)#define PL330_STATE_EXECUTING (1 << 1)#define PL330_STATE_WFE (1 << 2)
@@ -372,19 +362,6 @@ static inline bool _manager_ns(struct pl330_thread *thrd)return (pl330->pinfo->pcfg.mode &DMAC_MODE_NS ) ? true : false; } -static inline u32 get_id (struct pl330_info *pi,u32 off) -{ -void __iomem *regs = pi->base; -u32 id =0 ; - - id |= (readb (regs + off +0x0 ) <<0 ); - id |= (readb (regs + off +0x4 ) <<8 ); - id |= (readb (regs + off +0x8 ) <<16 ); - id |= (readb (regs + off +0xc ) <<24 ); - -return id; -} -static inline u32 _emit_ADDH (unsigned dry_run,u8 buf[],enum pl330_dst da,u16 val) {
@@ -1747,8 +1724,8 @@ static void read_dmac_config(struct pl330_info *pi) pi->pcfg.irq_ns =readl (regs +CR3 ); - pi->pcfg.periph_id =get_id (pi,PERIPH_ID ); - pi->pcfg.pcell_id =get_id (pi,PCELL_ID ); + pi->pcfg.periph_id =amba_get_pid (pi->base,PCELL_SIZE ); + pi->pcfg.pcell_id =amba_get_cid (pi->base,PCELL_SIZE ); }static inline void _reset_thread (struct pl330_thread *thrd)
@@ -1838,7 +1815,6 @@ static int dmac_alloc_resources(struct pl330_dmac *pl330)int pl330_add (struct pl330_info *pi) {struct pl330_dmac *pl330; -void __iomem *regs;int i, ret;if (!pi || !pi->dev)
@@ -1855,16 +1831,6 @@ int pl330_add(struct pl330_info *pi)if (pi->dmac_reset) pi->dmac_reset (pi); - regs = pi->base; - -/* Check if we can handle this DMAC */ -if ((get_id (pi,PERIPH_ID ) &0xfffff ) !=PERIPH_ID_VAL - ||get_id (pi,PCELL_ID ) !=PCELL_ID_VAL ) { -dev_err (pi->dev,"PERIPH_ID 0x%x, PCELL_ID 0x%x !\n" , -get_id (pi,PERIPH_ID ),get_id (pi,PCELL_ID )); -return -EINVAL ; - } -/* Read the configuration of the DMAC */ read_dmac_config (pi);
arch/arm/common/vic.c +8 -7
@@ -341,16 +341,17 @@ static void __init vic_init_st(void __iomem *base, unsigned int irq_start,void __init vic_init (void __iomem *base,unsigned int irq_start,u32 vic_sources,u32 resume_sources) { -unsigned int i;u32 cellid =0 ;enum amba_vendor vendor; -/* Identify which VIC cell this one is, by reading the ID */ -for (i =0 ; i <4 ; i++) { -u32 addr = ((u32 )base &PAGE_MASK ) +0xfe0 + (i *4 ); - cellid |= (readl (addr) &0xff ) << (8 * i); - } - vendor = (cellid >>12 ) &0xff ; +/* +* Identify which VIC cell this one is, by reading the ID - some +* implementations have two VICs in the same page but only one set +* of ID registers at the end, so we need to adjust the base to +* reference the page offset. All VIC:s are size 4K. +*/ + cellid =amba_get_pid ((void __iomem *)((unsigned long )base &PAGE_MASK ),SZ_4K ); + vendor =AMBA_MANF_BITS (cellid);printk (KERN_INFO "VIC @%p: id 0x%08x, vendor 0x%02x\n" , base, cellid, vendor);
drivers/amba/bus.c +3 -16
@@ -579,7 +579,7 @@ int amba_device_register(struct amba_device *dev, struct resource *parent) {u32 size;void __iomem *tmp; -int i, ret; +int ret;device_initialize (&dev->dev);
@@ -620,24 +620,11 @@ int amba_device_register(struct amba_device *dev, struct resource *parent) ret =amba_get_enable_pclk (dev);if (ret ==0 ) { -u32 pid, cid; - -/* -* Read pid and cid based on size of resource -* they are located at end of region -*/ -for (pid =0 , i =0 ; i <4 ; i++) - pid |= (readl (tmp + size -0x20 +4 * i) &255 ) << - (i *8 ); -for (cid =0 , i =0 ; i <4 ; i++) - cid |= (readl (tmp + size -0x10 +4 * i) &255 ) << - (i *8 ); +if (amba_get_cid (tmp, size) ==AMBA_CID ) + dev->periphid =amba_get_pid (tmp, size);amba_put_disable_pclk (dev); -if (cid ==AMBA_CID ) - dev->periphid = pid; -if (!dev->periphid) ret = -ENODEV ; }
drivers/dma/ste_dma40.c +4 -10
@@ -2569,7 +2569,6 @@ static struct d40_base * __init d40_hw_detect_init(struct platform_device *pdev)int num_phy_chans;int i;u32 pid; -u32 cid;u8 rev; clk =clk_get (&pdev->dev,NULL );
@@ -2594,18 +2593,13 @@ static struct d40_base * __init d40_hw_detect_init(struct platform_device *pdev)if (!virtbase) goto failure; -/* This is just a regular AMBA PrimeCell ID actually */ -for (pid =0 , i =0 ; i <4 ; i++) - pid |= (readl (virtbase +resource_size (res) -0x20 +4 * i) - &255 ) << (i *8 ); -for (cid =0 , i =0 ; i <4 ; i++) - cid |= (readl (virtbase +resource_size (res) -0x10 +4 * i) - &255 ) << (i *8 ); - -if (cid !=AMBA_CID ) { +/* Device ID use the AMBA PrimeCell scheme */ +if (amba_get_cid (virtbase,resource_size (res)) !=AMBA_CID ) {d40_err (&pdev->dev,"Unknown hardware! No PrimeCell ID\n" ); goto failure; } + + pid =amba_get_pid (virtbase,resource_size (res));if (AMBA_MANF_BITS (pid) !=AMBA_VENDOR_ST ) { d40_err(&pdev->dev, "Unknown designer! Got %x wanted %x\n", AMBA_MANF_BITS(pid),
drivers/mtd/nand/fsmc_nand.c +3 -7
@@ -541,8 +541,6 @@ static int __init fsmc_nand_probe(struct platform_device *pdev)struct fsmc_regs *regs;struct resource *res;int ret =0 ; -u32 pid; -int i;if (!pdata) {dev_err (&pdev->dev,"platform data is NULL\n" );
@@ -636,13 +634,11 @@ static int __init fsmc_nand_probe(struct platform_device *pdev)* This device ID is actually a common AMBA ID as used on the * AMBA PrimeCell bus. However it is not a PrimeCell. */ -for (pid =0 , i =0 ; i <4 ; i++) - pid |= (readl (host->regs_va +resource_size (res) -0x20 +4 * i) &255 ) << (i *8 ); - host->pid = pid; + host->pid =amba_get_pid (host->regs_va,resource_size (res));dev_info (&pdev->dev,"FSMC device partno %03x, manufacturer %02x, " "revision %02x, config %02x\n" , -AMBA_PART_BITS (pid),AMBA_MANF_BITS (pid), -AMBA_REV_BITS (pid),AMBA_CONFIG_BITS (pid)); +AMBA_PART_BITS (host->pid),AMBA_MANF_BITS (host->pid), +AMBA_REV_BITS (host->pid),AMBA_CONFIG_BITS (host->pid)); host->bank = pdata->bank; host->select_chip = pdata->select_bank;
include/linux/amba/bus.h +26 -0
@@ -19,6 +19,7 @@#include <linux/err.h> #include <linux/resource.h> #include <linux/regulator/consumer.h> +#include <linux/io.h> #define AMBA_NR_IRQS 2#define AMBA_CID 0xb105f00d
@@ -94,4 +95,29 @@ void amba_release_regions(struct amba_device *);#define amba_manf (d) AMBA_MANF_BITS((d)->periphid)#define amba_part (d) AMBA_PART_BITS((d)->periphid) +/* +* Inlines to extract the PID and CID for a certain PrimeCell. These are at +* offset -0x20 and -0x10 from the end of the I/O region respectively. +*/ +static inline u32 amba_get_magic (void __iomem *base,u32 size,u8 offset) +{ +u32 magic; +int i; + +for (magic =0 , i =0 ; i <4 ; i++) + magic |= (readl (base + size - offset +4 * i) &255 ) + << (i *8 ); +return magic; +} + +static inline u32 amba_get_pid (void __iomem *base,u32 size) +{ +return amba_get_magic (base, size,0x20 ); +} + +static inline u32 amba_get_cid (void __iomem *base,u32 size) +{ +return amba_get_magic (base, size,0x10 ); +} +#endif
Signature · 1 line
1.7.3.2
PATCH v4 1/1 amba: consolidate PrimeCell magic
Quoted 10 lines · Linus WALLEIJ
From: Linus Walleij <[email protected]>
Since two drivers use the PrimeCell scheme without using the
amba_busdriver logic, let's break the magic lookups out as static inlines in the <linux/amba/bus.h> header so we get some consolidation anyway. Delete the primecell ID check incommon/pl330.csince it is only used from theamba_busdriver indrivers/dma, which is already doing the same check when probing indrivers/amba/bus.c.
Quoted 6 lines
Cc Kukjin Kim <[email protected]>Cc Viresh Kumar <[email protected]>Acked-by Jassi Brar <[email protected]>Acked-by Boojin Kim <[email protected]>Signed-off-by Linus Walleij <[email protected]>
Good One!!
Signature · 1 line
viresh
PATCH v4 1/1 amba: consolidate PrimeCell magic
In reply to Linus WalleijQuoted 15 lines · Linus Walleij
Since two drivers use the PrimeCell scheme without using the
amba_busdriver logic, let's break the magic lookups out as static inlines in the <linux/amba/bus.h> header so we get some consolidation anyway. Delete the primecell ID check incommon/pl330.csince it is only used from theamba_busdriver indrivers/dma, which is already doing the same check when probing indrivers/amba/bus.c.Cc Kukjin Kim <[email protected]>Cc Viresh Kumar <[email protected]>Acked-by Jassi Brar <[email protected]>Acked-by Boojin Kim <[email protected]>Signed-off-by Linus Walleij <[email protected]>
Quoted 4 lines
---
ChangesV3->v4:
- Fix up sparse warning due to inelegant cast to (u32) invic.c, we cast to (unsigned long) and sparse is happy.
Thanks!
One nit...
+ /*
+ * Identify which VIC cell this one is, by reading the ID - some
+ * implementations have two VICs in the same page but only one set
+ * of ID registers at the end, so we need to adjust the base to
+ * reference the page offset. All VIC:s are size 4K.
^
Is this supposed to be VIC's
Regards,
Hartley
PATCH v4 1/1 amba: consolidate PrimeCell magic
In reply to Linus WalleijQuoted 11 lines · Linus Walleij
From: Linus Walleij <[email protected]>
Since two drivers use the PrimeCell scheme without using the
amba_busdriver logic, let's break the magic lookups out as static inlines in the <linux/amba/bus.h> header so we get some consolidation anyway. Delete the primecell ID check incommon/pl330.csince it is only used from theamba_busdriver indrivers/dma, which is already doing the same check when probing indrivers/amba/bus.c.
Quoted 1 line
Cc Kukjin Kim <[email protected]>
Quoted 5 lines
Cc Viresh Kumar <[email protected]>Acked-by Jassi Brar <[email protected]>Acked-by Boojin Kim <[email protected]>Signed-off-by Linus Walleij <[email protected]>
Thanks.
Best regards,
Kgene.
--
Kukjin Kim <[email protected]>, Senior Engineer, SW Solution Development Team, Samsung Electronics Co., Ltd.