Lines Matching refs:ks
186 static inline __be16 create_spi_cmd(struct ks8995_switch *ks, int cmd, in create_spi_cmd() argument
192 result <<= ks->chip->addr_width + ks->chip->addr_shift; in create_spi_cmd()
194 result |= address << ks->chip->addr_shift; in create_spi_cmd()
199 static int ks8995_read(struct ks8995_switch *ks, char *buf, in ks8995_read() argument
207 cmd = create_spi_cmd(ks, KS8995_CMD_READ, offset); in ks8995_read()
220 mutex_lock(&ks->lock); in ks8995_read()
221 err = spi_sync(ks->spi, &m); in ks8995_read()
222 mutex_unlock(&ks->lock); in ks8995_read()
227 static int ks8995_write(struct ks8995_switch *ks, char *buf, in ks8995_write() argument
235 cmd = create_spi_cmd(ks, KS8995_CMD_WRITE, offset); in ks8995_write()
248 mutex_lock(&ks->lock); in ks8995_write()
249 err = spi_sync(ks->spi, &m); in ks8995_write()
250 mutex_unlock(&ks->lock); in ks8995_write()
255 static inline int ks8995_read_reg(struct ks8995_switch *ks, u8 addr, u8 *buf) in ks8995_read_reg() argument
257 return ks8995_read(ks, buf, addr, 1) != 1; in ks8995_read_reg()
260 static inline int ks8995_write_reg(struct ks8995_switch *ks, u8 addr, u8 val) in ks8995_write_reg() argument
264 return ks8995_write(ks, &buf, addr, 1) != 1; in ks8995_write_reg()
269 static int ks8995_stop(struct ks8995_switch *ks) in ks8995_stop() argument
271 return ks8995_write_reg(ks, KS8995_REG_ID1, 0); in ks8995_stop()
274 static int ks8995_start(struct ks8995_switch *ks) in ks8995_start() argument
276 return ks8995_write_reg(ks, KS8995_REG_ID1, 1); in ks8995_start()
279 static int ks8995_reset(struct ks8995_switch *ks) in ks8995_reset() argument
283 err = ks8995_stop(ks); in ks8995_reset()
289 return ks8995_start(ks); in ks8995_reset()
321 static int ks8995_get_revision(struct ks8995_switch *ks) in ks8995_get_revision() argument
327 err = ks8995_read_reg(ks, KS8995_REG_ID0, &id0); in ks8995_get_revision()
334 if (id0 != ks->chip->family_id) { in ks8995_get_revision()
335 dev_err(&ks->spi->dev, "chip family id mismatch: expected 0x%02x but 0x%02x read\n", in ks8995_get_revision()
336 ks->chip->family_id, id0); in ks8995_get_revision()
341 switch (ks->chip->family_id) { in ks8995_get_revision()
344 err = ks8995_read_reg(ks, KS8995_REG_ID1, &id1); in ks8995_get_revision()
352 (get_chip_id(id1) == ks->chip->chip_id)) { in ks8995_get_revision()
354 ks->revision_id = get_chip_rev(id1); in ks8995_get_revision()
357 err = ks8995_read_reg(ks, KS8995_REG_ID1, &ksz8864_id); in ks8995_get_revision()
364 (ks->chip->chip_id == KSZ8864_CHIP_ID)) { in ks8995_get_revision()
365 ks->revision_id = get_chip_rev(id1); in ks8995_get_revision()
369 dev_err(&ks->spi->dev, "unsupported chip id for KS8995 family: 0x%02x\n", in ks8995_get_revision()
376 err = ks8995_read_reg(ks, KS8995_REG_ID1, &id1); in ks8995_get_revision()
382 if (get_chip_id(id1) == ks->chip->chip_id) { in ks8995_get_revision()
383 ks->revision_id = get_chip_rev(id1); in ks8995_get_revision()
385 dev_err(&ks->spi->dev, "unsupported chip id for KSZ8795 family: 0x%02x\n", in ks8995_get_revision()
391 dev_err(&ks->spi->dev, "unsupported family id: 0x%02x\n", id0); in ks8995_get_revision()
405 static void ks8995_parse_dt(struct ks8995_switch *ks) in ks8995_parse_dt() argument
407 struct device_node *np = ks->spi->dev.of_node; in ks8995_parse_dt()
408 struct ks8995_pdata *pdata = ks->pdata; in ks8995_parse_dt()
430 struct ks8995_switch *ks; in ks8995_probe() local
439 ks = devm_kzalloc(&spi->dev, sizeof(*ks), GFP_KERNEL); in ks8995_probe()
440 if (!ks) in ks8995_probe()
443 mutex_init(&ks->lock); in ks8995_probe()
444 ks->spi = spi; in ks8995_probe()
445 ks->chip = &ks8995_chip[variant]; in ks8995_probe()
447 if (ks->spi->dev.of_node) { in ks8995_probe()
448 ks->pdata = devm_kzalloc(&spi->dev, sizeof(*ks->pdata), in ks8995_probe()
450 if (!ks->pdata) in ks8995_probe()
453 ks->pdata->reset_gpio = -1; in ks8995_probe()
455 ks8995_parse_dt(ks); in ks8995_probe()
458 if (!ks->pdata) in ks8995_probe()
459 ks->pdata = spi->dev.platform_data; in ks8995_probe()
462 if (ks->pdata && gpio_is_valid(ks->pdata->reset_gpio)) { in ks8995_probe()
465 flags = (ks->pdata->reset_gpio_flags == OF_GPIO_ACTIVE_LOW ? in ks8995_probe()
469 ks->pdata->reset_gpio, in ks8995_probe()
477 gpiod_set_value(gpio_to_desc(ks->pdata->reset_gpio), 0); in ks8995_probe()
480 spi_set_drvdata(spi, ks); in ks8995_probe()
490 err = ks8995_get_revision(ks); in ks8995_probe()
494 memcpy(&ks->regs_attr, &ks8995_registers_attr, sizeof(ks->regs_attr)); in ks8995_probe()
495 ks->regs_attr.size = ks->chip->regs_size; in ks8995_probe()
497 err = ks8995_reset(ks); in ks8995_probe()
501 sysfs_attr_init(&ks->regs_attr.attr); in ks8995_probe()
502 err = sysfs_create_bin_file(&spi->dev.kobj, &ks->regs_attr); in ks8995_probe()
510 ks->chip->name, ks->chip->chip_id, ks->revision_id); in ks8995_probe()
517 struct ks8995_switch *ks = spi_get_drvdata(spi); in ks8995_remove() local
519 sysfs_remove_bin_file(&spi->dev.kobj, &ks->regs_attr); in ks8995_remove()
522 if (ks->pdata && gpio_is_valid(ks->pdata->reset_gpio)) in ks8995_remove()
523 gpiod_set_value(gpio_to_desc(ks->pdata->reset_gpio), 1); in ks8995_remove()