1 // SPDX-License-Identifier: (GPL-2.0 OR MIT)
3 * Microsemi Ocelot Switch driver
5 * Copyright (c) 2017 Microsemi Corporation
8 #include <linux/kernel.h>
9 #include <linux/platform_device.h>
13 u32
__ocelot_read_ix(struct ocelot
*ocelot
, u32 reg
, u32 offset
)
15 u16 target
= reg
>> TARGET_OFFSET
;
20 regmap_read(ocelot
->targets
[target
],
21 ocelot
->map
[target
][reg
& REG_MASK
] + offset
, &val
);
24 EXPORT_SYMBOL(__ocelot_read_ix
);
26 void __ocelot_write_ix(struct ocelot
*ocelot
, u32 val
, u32 reg
, u32 offset
)
28 u16 target
= reg
>> TARGET_OFFSET
;
32 regmap_write(ocelot
->targets
[target
],
33 ocelot
->map
[target
][reg
& REG_MASK
] + offset
, val
);
35 EXPORT_SYMBOL(__ocelot_write_ix
);
37 void __ocelot_rmw_ix(struct ocelot
*ocelot
, u32 val
, u32 mask
, u32 reg
,
40 u16 target
= reg
>> TARGET_OFFSET
;
44 regmap_update_bits(ocelot
->targets
[target
],
45 ocelot
->map
[target
][reg
& REG_MASK
] + offset
,
48 EXPORT_SYMBOL(__ocelot_rmw_ix
);
50 u32
ocelot_port_readl(struct ocelot_port
*port
, u32 reg
)
52 struct ocelot
*ocelot
= port
->ocelot
;
53 u16 target
= reg
>> TARGET_OFFSET
;
58 regmap_read(port
->target
, ocelot
->map
[target
][reg
& REG_MASK
], &val
);
61 EXPORT_SYMBOL(ocelot_port_readl
);
63 void ocelot_port_writel(struct ocelot_port
*port
, u32 val
, u32 reg
)
65 struct ocelot
*ocelot
= port
->ocelot
;
66 u16 target
= reg
>> TARGET_OFFSET
;
70 regmap_write(port
->target
, ocelot
->map
[target
][reg
& REG_MASK
], val
);
72 EXPORT_SYMBOL(ocelot_port_writel
);
74 u32
__ocelot_target_read_ix(struct ocelot
*ocelot
, enum ocelot_target target
,
79 regmap_read(ocelot
->targets
[target
],
80 ocelot
->map
[target
][reg
] + offset
, &val
);
84 void __ocelot_target_write_ix(struct ocelot
*ocelot
, enum ocelot_target target
,
85 u32 val
, u32 reg
, u32 offset
)
87 regmap_write(ocelot
->targets
[target
],
88 ocelot
->map
[target
][reg
] + offset
, val
);
91 int ocelot_regfields_init(struct ocelot
*ocelot
,
92 const struct reg_field
*const regfields
)
97 for (i
= 0; i
< REGFIELD_MAX
; i
++) {
98 struct reg_field regfield
= {};
99 u32 reg
= regfields
[i
].reg
;
104 target
= regfields
[i
].reg
>> TARGET_OFFSET
;
106 regfield
.reg
= ocelot
->map
[target
][reg
& REG_MASK
];
107 regfield
.lsb
= regfields
[i
].lsb
;
108 regfield
.msb
= regfields
[i
].msb
;
109 regfield
.id_size
= regfields
[i
].id_size
;
110 regfield
.id_offset
= regfields
[i
].id_offset
;
112 ocelot
->regfields
[i
] =
113 devm_regmap_field_alloc(ocelot
->dev
,
114 ocelot
->targets
[target
],
117 if (IS_ERR(ocelot
->regfields
[i
]))
118 return PTR_ERR(ocelot
->regfields
[i
]);
123 EXPORT_SYMBOL(ocelot_regfields_init
);
125 static struct regmap_config ocelot_regmap_config
= {
131 struct regmap
*ocelot_regmap_init(struct ocelot
*ocelot
, struct resource
*res
)
135 regs
= devm_ioremap_resource(ocelot
->dev
, res
);
137 return ERR_CAST(regs
);
139 ocelot_regmap_config
.name
= res
->name
;
141 return devm_regmap_init_mmio(ocelot
->dev
, regs
, &ocelot_regmap_config
);
143 EXPORT_SYMBOL(ocelot_regmap_init
);