Lines Matching refs:ks

175  * @ks: pointer to switch instance
185 static inline __be16 create_spi_cmd(struct ks8995_switch *ks, int cmd,
191 result <<= ks->chip->addr_width + ks->chip->addr_shift;
193 result |= address << ks->chip->addr_shift;
198 static int ks8995_read(struct ks8995_switch *ks, char *buf,
206 cmd = create_spi_cmd(ks, KS8995_CMD_READ, offset);
219 mutex_lock(&ks->lock);
220 err = spi_sync(ks->spi, &m);
221 mutex_unlock(&ks->lock);
226 static int ks8995_write(struct ks8995_switch *ks, char *buf,
234 cmd = create_spi_cmd(ks, KS8995_CMD_WRITE, offset);
247 mutex_lock(&ks->lock);
248 err = spi_sync(ks->spi, &m);
249 mutex_unlock(&ks->lock);
254 static inline int ks8995_read_reg(struct ks8995_switch *ks, u8 addr, u8 *buf)
256 return ks8995_read(ks, buf, addr, 1) != 1;
259 static inline int ks8995_write_reg(struct ks8995_switch *ks, u8 addr, u8 val)
263 return ks8995_write(ks, &buf, addr, 1) != 1;
268 static int ks8995_stop(struct ks8995_switch *ks)
270 return ks8995_write_reg(ks, KS8995_REG_ID1, 0);
273 static int ks8995_start(struct ks8995_switch *ks)
275 return ks8995_write_reg(ks, KS8995_REG_ID1, 1);
278 static int ks8995_reset(struct ks8995_switch *ks)
282 err = ks8995_stop(ks);
288 return ks8995_start(ks);
316 * @ks: pointer to switch instance
320 static int ks8995_get_revision(struct ks8995_switch *ks)
326 err = ks8995_read_reg(ks, KS8995_REG_ID0, &id0);
333 if (id0 != ks->chip->family_id) {
334 dev_err(&ks->spi->dev, "chip family id mismatch: expected 0x%02x but 0x%02x read\n",
335 ks->chip->family_id, id0);
340 switch (ks->chip->family_id) {
343 err = ks8995_read_reg(ks, KS8995_REG_ID1, &id1);
351 (get_chip_id(id1) == ks->chip->chip_id)) {
353 ks->revision_id = get_chip_rev(id1);
356 err = ks8995_read_reg(ks, KS8995_REG_ID1, &ksz8864_id);
363 (ks->chip->chip_id == KSZ8864_CHIP_ID)) {
364 ks->revision_id = get_chip_rev(id1);
368 dev_err(&ks->spi->dev, "unsupported chip id for KS8995 family: 0x%02x\n",
375 err = ks8995_read_reg(ks, KS8995_REG_ID1, &id1);
381 if (get_chip_id(id1) == ks->chip->chip_id) {
382 ks->revision_id = get_chip_rev(id1);
384 dev_err(&ks->spi->dev, "unsupported chip id for KSZ8795 family: 0x%02x\n",
390 dev_err(&ks->spi->dev, "unsupported family id: 0x%02x\n", id0);
411 struct ks8995_switch *ks;
420 ks = devm_kzalloc(&spi->dev, sizeof(*ks), GFP_KERNEL);
421 if (!ks)
424 mutex_init(&ks->lock);
425 ks->spi = spi;
426 ks->chip = &ks8995_chip[variant];
428 ks->reset_gpio = devm_gpiod_get_optional(&spi->dev, "reset",
430 err = PTR_ERR_OR_ZERO(ks->reset_gpio);
437 err = gpiod_set_consumer_name(ks->reset_gpio, "switch-reset");
443 gpiod_set_value_cansleep(ks->reset_gpio, 0);
445 spi_set_drvdata(spi, ks);
455 err = ks8995_get_revision(ks);
459 memcpy(&ks->regs_attr, &ks8995_registers_attr, sizeof(ks->regs_attr));
460 ks->regs_attr.size = ks->chip->regs_size;
462 err = ks8995_reset(ks);
466 sysfs_attr_init(&ks->regs_attr.attr);
467 err = sysfs_create_bin_file(&spi->dev.kobj, &ks->regs_attr);
475 ks->chip->name, ks->chip->chip_id, ks->revision_id);
482 struct ks8995_switch *ks = spi_get_drvdata(spi);
484 sysfs_remove_bin_file(&spi->dev.kobj, &ks->regs_attr);
487 gpiod_set_value_cansleep(ks->reset_gpio, 1);