Lines Matching refs:ks
181 * @ks: pointer to switch instance
191 static inline __be16 create_spi_cmd(struct ks8995_switch *ks, int cmd,
197 result <<= ks->chip->addr_width + ks->chip->addr_shift;
199 result |= address << ks->chip->addr_shift;
204 static int ks8995_read(struct ks8995_switch *ks, char *buf,
212 cmd = create_spi_cmd(ks, KS8995_CMD_READ, offset);
225 mutex_lock(&ks->lock);
226 err = spi_sync(ks->spi, &m);
227 mutex_unlock(&ks->lock);
232 static int ks8995_write(struct ks8995_switch *ks, char *buf,
240 cmd = create_spi_cmd(ks, KS8995_CMD_WRITE, offset);
253 mutex_lock(&ks->lock);
254 err = spi_sync(ks->spi, &m);
255 mutex_unlock(&ks->lock);
260 static inline int ks8995_read_reg(struct ks8995_switch *ks, u8 addr, u8 *buf)
262 return ks8995_read(ks, buf, addr, 1) != 1;
265 static inline int ks8995_write_reg(struct ks8995_switch *ks, u8 addr, u8 val)
269 return ks8995_write(ks, &buf, addr, 1) != 1;
274 static int ks8995_stop(struct ks8995_switch *ks)
276 return ks8995_write_reg(ks, KS8995_REG_ID1, 0);
279 static int ks8995_start(struct ks8995_switch *ks)
281 return ks8995_write_reg(ks, KS8995_REG_ID1, 1);
284 static int ks8995_reset(struct ks8995_switch *ks)
288 err = ks8995_stop(ks);
294 return ks8995_start(ks);
322 * @ks: pointer to switch instance
326 static int ks8995_get_revision(struct ks8995_switch *ks)
332 err = ks8995_read_reg(ks, KS8995_REG_ID0, &id0);
339 if (id0 != ks->chip->family_id) {
340 dev_err(&ks->spi->dev, "chip family id mismatch: expected 0x%02x but 0x%02x read\n",
341 ks->chip->family_id, id0);
346 switch (ks->chip->family_id) {
349 err = ks8995_read_reg(ks, KS8995_REG_ID1, &id1);
357 (get_chip_id(id1) == ks->chip->chip_id)) {
359 ks->revision_id = get_chip_rev(id1);
362 err = ks8995_read_reg(ks, KS8995_REG_ID1, &ksz8864_id);
369 (ks->chip->chip_id == KSZ8864_CHIP_ID)) {
370 ks->revision_id = get_chip_rev(id1);
374 dev_err(&ks->spi->dev, "unsupported chip id for KS8995 family: 0x%02x\n",
381 err = ks8995_read_reg(ks, KS8995_REG_ID1, &id1);
387 if (get_chip_id(id1) == ks->chip->chip_id) {
388 ks->revision_id = get_chip_rev(id1);
390 dev_err(&ks->spi->dev, "unsupported chip id for KSZ8795 family: 0x%02x\n",
396 dev_err(&ks->spi->dev, "unsupported family id: 0x%02x\n", id0);
405 * @ks: pointer to switch instance
410 static void ks8995_parse_dt(struct ks8995_switch *ks)
412 struct device_node *np = ks->spi->dev.of_node;
413 struct ks8995_pdata *pdata = ks->pdata;
435 struct ks8995_switch *ks;
444 ks = devm_kzalloc(&spi->dev, sizeof(*ks), GFP_KERNEL);
445 if (!ks)
448 mutex_init(&ks->lock);
449 ks->spi = spi;
450 ks->chip = &ks8995_chip[variant];
452 if (ks->spi->dev.of_node) {
453 ks->pdata = devm_kzalloc(&spi->dev, sizeof(*ks->pdata),
455 if (!ks->pdata)
458 ks->pdata->reset_gpio = -1;
460 ks8995_parse_dt(ks);
463 if (!ks->pdata)
464 ks->pdata = spi->dev.platform_data;
467 if (ks->pdata && gpio_is_valid(ks->pdata->reset_gpio)) {
470 flags = (ks->pdata->reset_gpio_flags == OF_GPIO_ACTIVE_LOW ?
474 ks->pdata->reset_gpio,
482 gpiod_set_value(gpio_to_desc(ks->pdata->reset_gpio), 0);
485 spi_set_drvdata(spi, ks);
495 err = ks8995_get_revision(ks);
499 memcpy(&ks->regs_attr, &ks8995_registers_attr, sizeof(ks->regs_attr));
500 ks->regs_attr.size = ks->chip->regs_size;
502 err = ks8995_reset(ks);
506 sysfs_attr_init(&ks->regs_attr.attr);
507 err = sysfs_create_bin_file(&spi->dev.kobj, &ks->regs_attr);
515 ks->chip->name, ks->chip->chip_id, ks->revision_id);
522 struct ks8995_switch *ks = spi_get_drvdata(spi);
524 sysfs_remove_bin_file(&spi->dev.kobj, &ks->regs_attr);
527 if (ks->pdata && gpio_is_valid(ks->pdata->reset_gpio))
528 gpiod_set_value(gpio_to_desc(ks->pdata->reset_gpio), 1);