#include <linux/array_size.h>
#include <linux/bits.h>
+#include <linux/bitops.h>
#include <linux/clk.h>
#include <linux/device.h>
#include <linux/mdio.h>
#define MIIC_ESID_CODE 0x4
#define MIIC_MODCTRL 0x8
-#define MIIC_MODCTRL_SW_MODE GENMASK(4, 0)
#define MIIC_CONVCTRL(port) (0x100 + (port) * 4)
* @index_to_string_count: Number of entries in the index_to_string array
* @miic_port_start: MIIC port start number
* @miic_port_max: Maximum MIIC supported
+ * @sw_mode_mask: Switch mode mask
*/
struct miic_of_data {
struct modctrl_match *match_table;
u8 index_to_string_count;
u8 miic_port_start;
u8 miic_port_max;
+ u8 sw_mode_mask;
};
/**
static int miic_init_hw(struct miic *miic, u32 cfg_mode)
{
+ u8 sw_mode_mask = miic->of_data->sw_mode_mask;
int port;
/* Unlock write access to accessory registers (cf datasheet). If this
miic_reg_writel(miic, MIIC_PRCMD, 0xFFFE);
miic_reg_writel(miic, MIIC_PRCMD, 0x0001);
+ /* TODO: Replace with FIELD_PREP() when compile-time constant
+ * restriction is lifted. Currently __ffs() returns 0 for sw_mode_mask.
+ */
miic_reg_writel(miic, MIIC_MODCTRL,
- FIELD_PREP(MIIC_MODCTRL_SW_MODE, cfg_mode));
+ ((cfg_mode << __ffs(sw_mode_mask)) & sw_mode_mask));
for (port = 0; port < miic->of_data->miic_port_max; port++) {
miic_converter_enable(miic, port, 0);
.index_to_string_count = ARRAY_SIZE(index_to_string),
.miic_port_start = 1,
.miic_port_max = 5,
+ .sw_mode_mask = GENMASK(4, 0),
};
static const struct of_device_id miic_of_mtable[] = {